![數(shù)據(jù)庫SQL ServerSQLite教程課件:關(guān)系數(shù)據(jù)庫語言 SQL( 下 )_第1頁](http://file4.renrendoc.com/view10/M01/2D/15/wKhkGWXDhNqAGvRMAAEptn49ONo579.jpg)
![數(shù)據(jù)庫SQL ServerSQLite教程課件:關(guān)系數(shù)據(jù)庫語言 SQL( 下 )_第2頁](http://file4.renrendoc.com/view10/M01/2D/15/wKhkGWXDhNqAGvRMAAEptn49ONo5792.jpg)
![數(shù)據(jù)庫SQL ServerSQLite教程課件:關(guān)系數(shù)據(jù)庫語言 SQL( 下 )_第3頁](http://file4.renrendoc.com/view10/M01/2D/15/wKhkGWXDhNqAGvRMAAEptn49ONo5793.jpg)
![數(shù)據(jù)庫SQL ServerSQLite教程課件:關(guān)系數(shù)據(jù)庫語言 SQL( 下 )_第4頁](http://file4.renrendoc.com/view10/M01/2D/15/wKhkGWXDhNqAGvRMAAEptn49ONo5794.jpg)
![數(shù)據(jù)庫SQL ServerSQLite教程課件:關(guān)系數(shù)據(jù)庫語言 SQL( 下 )_第5頁](http://file4.renrendoc.com/view10/M01/2D/15/wKhkGWXDhNqAGvRMAAEptn49ONo5795.jpg)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
關(guān)系數(shù)據(jù)庫語言SQL(下)5.1數(shù)據(jù)操作語言(DML)5.2數(shù)據(jù)查詢語言(DQL)5.3數(shù)據(jù)控制語言(DCL)
5.1數(shù)據(jù)操作語言(DML)
5.1.1數(shù)據(jù)插入1.命令方式插入數(shù)據(jù)SQL使用insert語句為數(shù)據(jù)表添加記錄。insert語句通常有兩種形式:一種是一次插入一條記錄,另一種是一次插入多條記錄,即使用子查詢批量插入。
參數(shù)說明:
·insertinto是插入語句的命令關(guān)鍵詞,其中into可以省略。tablename指定要向其中插入數(shù)據(jù)的表的名稱。columnlist是列列表,用來指定要向其中插入數(shù)據(jù)的列,列和列之間用逗號分開。
·values用于引出要插入的數(shù)據(jù),columnvalue是數(shù)據(jù)表達式列表,數(shù)據(jù)項之間需要用逗號分開。
向表中插入數(shù)據(jù)應(yīng)注意以下幾點:
(1)數(shù)據(jù)表達式列表columnvalue中的數(shù)據(jù)值應(yīng)該與列列表columnlist中的列一一對應(yīng),數(shù)據(jù)類型也應(yīng)該兼容。
(2)必須為表中所有定義notnull的列提供值,對于定義為null的列既可以提供值也可以不提供值。
(3)如果表中存在標(biāo)識列,則不能向標(biāo)識列中插入數(shù)據(jù)。如果表中有計算列,則不能向計算列中插入值。
(4)因為主鍵所在列不允許有空值也不允許有重復(fù)值,所以插入數(shù)據(jù)時必須保證主鍵所在列中有值而且不能與該列中已經(jīng)存在的值重復(fù)。
(5)如果表中存在外鍵約束,則向表中插入數(shù)據(jù)時要注意避免違反參照完整性約束。
在接下來的例子中將向表books中插入數(shù)據(jù)。先分析一下books表的特點,表中包括6個列,即bookid、title、isbn、author、unitprice和categorycode。其中:bookid是主鍵、
int類型;title、isbn和author被定義成notnull、字符型;categorycode是一個外鍵,父表是categories,存放圖書的類別,categories表中已經(jīng)存在數(shù)據(jù),如圖5-1所示。
圖5-1categories表
⒉菜單方式插入數(shù)據(jù)
在SSMS中,除了用insert語句插入記錄,還可以使用菜單方式插入記錄。
例5-4向student表中插入記錄。其中有一個主鍵約束PK_s#、一個檢查約束CK_
student_email(默認格式:emaillike'%_@%_._%')。
操作步驟如下:
(1)在“對象資源管理器”中,展開“數(shù)據(jù)庫”節(jié)點和“表”節(jié)點,用鼠標(biāo)右鍵單擊student表,在彈出的快捷菜單中選擇“編輯前200行”,進入編輯界面,如圖5-2所示。
(2)依次輸入各行字段的值,單擊“保存”按鈕。圖5-2“編輯前200行”工作界面
5.1.2數(shù)據(jù)更新
SQL使用update語句更新或修改滿足規(guī)定條件的記錄。
說明:將符合where條件的記錄的一個或多個列修改為新值。若省略where,則全表更新。operator即運算符。
例5-5在數(shù)據(jù)庫studscore_ds1中,將表student中s#是2018010103的學(xué)生的age加1。代碼如下:
updatestudent
setage=age+1wheres#='2018010103'
說明:如果省略where條件,則所有記錄加1歲。
例5-6將學(xué)生John的性別改為“男”,年齡改為“23”。代碼如下:
updatestudent
setsex='男',age=23wheresname='John'
5.1.3數(shù)據(jù)刪除
SQL使用delete語句刪除數(shù)據(jù)庫表格中的行或記錄。
1.delete語句
語句格式如下:
deletefrom<表名>where<條件>
說明:將符合<條件>的記錄從表中刪除。
例5-7:在數(shù)據(jù)庫studscore_ds1中,將表student中學(xué)號s#為2018010101的學(xué)生刪除。
代碼如下:
deletefromstudentwheres#='2018010101'
說明:如果省略where條件,則刪除表中所有的記錄。
2.truncatetable命令
如果要刪除表中的所有數(shù)據(jù)記錄,則使用truncatetable命令比用delete命令快得多,這是因為delete命令除了刪除數(shù)據(jù)外,還會對刪除數(shù)據(jù)在事務(wù)處理日志中作出記錄,以便
刪除失敗時可以使用事務(wù)處理日志來恢復(fù)數(shù)據(jù)。而truncatetable命令的功能相當(dāng)于使用不帶where子句的delete命令。
語句格式如下:
truncatetabletable_name
例5-8刪除學(xué)生成績表studscoreinfo中的所有記錄。代碼如下:
truncatetablestudscoreinfo
需要指出的是,truncatetable命令不能用于有依賴關(guān)系的表,也不能激發(fā)觸發(fā)器。
5.1.4merge語句
1.功能
merge關(guān)鍵字是在SQLServer2008引入的DML關(guān)鍵字,它能將insert、update、delete簡單地并為一句。MSDN對merge的解釋是:根據(jù)與源表連接的結(jié)果,對目標(biāo)表執(zhí)行插入、更新或刪除操作。
merge的功能是:檢查原數(shù)據(jù)表記錄和目標(biāo)表記錄,如果記錄在原數(shù)據(jù)表和目標(biāo)表中均存在,則目標(biāo)表中的記錄將被原數(shù)據(jù)表中的記錄更新(執(zhí)行update操作);如果目標(biāo)表
中不存在的某些記錄在原數(shù)據(jù)表中存在,則原數(shù)據(jù)表的這些記錄將被插入到目標(biāo)表中(執(zhí)行insert操作)。
2.語法格式及示例
參數(shù)說明:
第一行merge子句:命名目標(biāo)表并給出別名。
第二行using子句:提供merge操作的數(shù)據(jù)源,并給出別名。
第三行on子句:指定合并的條件。
第四行whenmatchedthen子句:判斷條件符合則對目標(biāo)表更新或刪除。
第八行whennotmatchedthen子句:判斷條件不符合則執(zhí)行插入的操作。
5.2數(shù)據(jù)查詢語言(DQL)
5.2.1SQL簡單查詢1.查詢結(jié)構(gòu)1)查詢的語法格式
上述語法中共有7個子句,其中select和from子句是必不可少的。各子句的功能如下:
(1)select_list子句用于指定希望查看的列,中間用逗號分隔。
(2)intonew_table_name子句用于將檢索出來的結(jié)果集創(chuàng)建一個新的數(shù)據(jù)表。
(3)fromtable_list子句用于指定檢索數(shù)據(jù)的數(shù)據(jù)表的列表。
(4)where<條件>子句用于對數(shù)據(jù)行進行篩選,指定查詢的條件,是一個條件表達式,只有滿足條件的數(shù)據(jù)行才作為查詢的對象。
(5)groupby<分組列名表>子句用于指定要分組的列。
(6)having<條件>子句用于指定分組的條件。從結(jié)果集對記錄進行篩選,只有滿足條件表達式的組才作為查詢的對象。
(7)orderby<排序列名表>子句用于對查詢的結(jié)果排序。asc表示升序排序,desc表示降序排序。asc是默認選項。
2)select查詢的執(zhí)行過程
雖然select查詢的各個子句書寫的順序是select→from→where→groupby→having→orderby,但是在計算機中各個子句實際的執(zhí)行順序是from→where→group
by→having→select→orderby。也就是說首先確定從哪個或哪些表(或視圖)中查詢數(shù)據(jù),如有必要就篩選,如有必要就分組,還有必要再對分組進行篩選。接下來確定查詢結(jié)果,如有排序要求就對查詢結(jié)果進行排序。其過程如下:
(1)讀取from子句中基本表、視圖的數(shù)據(jù),執(zhí)行笛卡爾積操作。例如,從兩張表中取數(shù),對比記錄數(shù)、兩張表記錄數(shù)的乘積數(shù),理解笛卡爾積。
(2)選取滿足where子句中給出的條件表達式的元組。
(3)按照groupby子句中指定列的值進行分組,同時提取滿足having子句中組條件表達式的那些組。
(4)按照select子句中給出的列名或列表達式求值輸出。
(5)orderby子句對輸出的目標(biāo)表進行排序,按asc(升序)排列,或按desc(降序)排列。
3)使用select查詢應(yīng)注意的問題
(1)在數(shù)據(jù)庫系統(tǒng)中,可能存在對象名稱重復(fù)的現(xiàn)象。例如,兩個用戶同時定義了studinfo的表,在引用用戶ID為stud的用戶定義的studinfo表時,需要使用用戶ID限定
數(shù)據(jù)表的名稱。語法代碼如下:
select*fromstud.studinfo
(2)在使用select語句進行查詢時,需要引用的對象所在的數(shù)據(jù)庫不一定總是當(dāng)前的數(shù)據(jù)庫,在引用數(shù)據(jù)表時需要使用數(shù)據(jù)庫來限定數(shù)據(jù)表的名稱。語法代碼如下:
select*fromstudscore_ds1.dbo.studinfo
select*fromstudscore_ds1..studinfo
(3)在from子句中指定的數(shù)據(jù)表和視圖可能包含有相同的字段名稱,外鍵字段名稱很可能與相應(yīng)的主鍵字段名稱相同。因此,為避免字段引用時的歧義,必須使用數(shù)據(jù)表或視
圖名稱來限定字段名稱。語法代碼如下:
selectstudinfo.studno,studname,classinfo.classid,classname
fromstudinfo,classinfo
wherestudinfo.classid=classinfo.classid
2.查詢操作
1)select子句
select子句指定需要通過查詢返回的表的列。
參數(shù)說明:
(1)all:指明查詢結(jié)果中可以顯示值相同的列,all是系統(tǒng)默認的選項。
(2)select_list:指所要查詢的表的列的集合,多個列之間用逗號分開。
(3)*:通配符,返回所有對象的所有列。
(4)table_name|view_name|table_alias.*:限制通配符*的作用范圍,凡是帶*的項均返回其中所有的列。
(5)column_name:指定返回的列名。
(6)expression:表達式可能為列名常量、函數(shù)或它們的組合。此時應(yīng)給表達式指定一個別名,通常有3種方式:原列名as別名、原列名別名、別名=原列名。在一個查詢語
句中,也可以混合使用以上3種方式來定義別名。
(7)identitycol:返回identity列。如果from子句中有多個表含有identity列,則在identitycol選項前必須加上表名,如table.identitycol。
(8)rowguidcol:返回表的rowguidcol列,同identitycol選項。當(dāng)要指定多個rowguidcol列時,選項前要加上表名。
(9)column_alias:在返回的查詢結(jié)果中用此別名替代列的原名。column_alias可用于orderby子句,但不能用于where、groupby、having子句。
例5-13查詢學(xué)生信息表studinfo中不重復(fù)的性別記錄。查詢結(jié)果如圖5-3所示。代碼如下:
selectdistinctstudsexfromstudinfo
圖5-3distinct關(guān)鍵字
2)into子句
intonew_table_name子句用于將查詢的結(jié)果集創(chuàng)建一個新的表。新表的列由select子句中指定的列構(gòu)成,且查詢結(jié)果各列必須具有唯一的名稱。新表中的數(shù)據(jù)是由where子句
指定的,但如果select子句中指定了計算列,在新表中對應(yīng)的列則不是計算列,而是一個實際存儲在新表中的列,其中的數(shù)據(jù)由執(zhí)行select…into語句時計算得出。
例5-19查詢表studscoreinfo中courseid為a0101的記錄,并插入到新表stscore_1。代碼如下:
select*intostscore_1fromstudscoreinfowherecourseid='a0101'
3)from子句
from子句主要用來指定檢索數(shù)據(jù)的來源,指定數(shù)據(jù)來源的數(shù)據(jù)表和視圖的列表,該列表中的表名和視圖名之間用逗號分開。from子句不可省略。
語法格式如下:
from{<table_sourse>}[,...n]
例5-20使用表別名查詢表studinfo中的記錄。代碼如下:
selects.studno學(xué)號,s.studname姓名fromstudinfos
4)where子句
where子句用于對表中的數(shù)據(jù)記錄進行篩選,其中構(gòu)造篩選的條件表達式是重點。需要強調(diào)的是,在where子句中不能使用聚合函數(shù)及別名。
語法格式如下:
where<search_condition>
功能:限制結(jié)果集內(nèi)返回的行。
查詢的限制條件可以是比較運算符(=、<>、<、>、>=等)、范圍說明(betweenand和notbetweenand)、可選值列表(in、notin)、模式匹配(like、notlike)、是否為空值(is
null和isnotnull)、上述條件的邏輯組合(and、or、not)。分別介紹如下:
(1)使用比較查詢條件。比較查詢條件由表達式的雙方和比較運算符組成,系統(tǒng)根據(jù)查詢條件的真假來決定某一條記錄是否滿足查詢條件。只有滿足查詢條件的記錄才會出現(xiàn)
在最終結(jié)果集中。
例5-21查詢成績大于70的學(xué)生成績信息。代碼如下:
select*fromstudscoreinfowherestudscore>70
例5-22查詢1981年1月1日及以后出生的學(xué)生信息。代碼如下:
select*fromstudscoreinfowherestudbirthday>='1981/01/01'
(2)使用邏輯運算符。and連接兩個布爾表達式并當(dāng)兩個表達式都為true時返回“true”。or將兩個條件結(jié)合起來。not用于反轉(zhuǎn)查詢條件的結(jié)果。其優(yōu)先級順序是:括號最優(yōu)先,其次not>and>or。
例5-23查詢學(xué)生成績在60到70之間的所有記錄。代碼如下:
select*fromstudscoreinfowherestudscore>=60andstudscore<=70
例5-24查詢學(xué)生成績小于等于70或者大于等于90的所有記錄。代碼如下:
select*fromstudscoreinfowherestudscore<=70orstudscore>=90
(3)使用范圍查詢條件。內(nèi)含范圍條件(between…and)要求返回記錄某個字段的值在兩個指定值范圍內(nèi),同時包括這兩個指定的值。排除范圍條件(notbetween…and)則相反。
例5-25查詢學(xué)生成績在70到80之間的記錄。代碼如下:
select*fromstudscoreinfowherestudscorebetween70and80
(4)使用列表查詢條件。in關(guān)鍵字的格式為:in(列表值1,列表值2,…)。其功能是將返回所有與列表中的任意一個值匹配的記錄。
例5-26查詢課程代碼courseid為a0101、a0102的學(xué)生成績信息。代碼如下:
select*fromstudscoreinfowherecourseidin('a0101','a0102')
(5)使用模式查詢條件(like或notlike)。模式查詢條件常用來返回符合某種格式的所有記錄。模式匹配通配符是like,另外還需要使用模式通配符,如表5-1所示。
(6)使用空值判斷查詢??罩挡樵兂S糜诓樵兡骋蛔侄螢榭罩档挠涗?,可以使用“isnull”(是空值)或“isnotnull”(不是空值)關(guān)鍵字來指定查詢條件。
在表的某些列可能存在空值“null”。“null”不是一種值,表示一種未知或不確定的狀態(tài),它并不表示零、零長度的字符串或空白(字符值)。
例5-29在班級信息表classinfo中,查詢班級描述為空的班級情況。代碼如下:
select*fromclassinfowhereclassdescisnull
5)groupby子句
有時需要對表中的數(shù)據(jù)進行分組,然后對每個組單獨進行統(tǒng)計計算,此時需要使用groupby子句。在按照指定的條件進行分類計算時,可以使用聚合函數(shù)計算各組的數(shù)據(jù)。
語法格式如下:
groupby[all]group_by_expression[,...n]
其中:group_by_expression是對表執(zhí)行分組的表達式,也稱分組列。
常用的聚合函數(shù)及其含義如表5-2所示。
6)having子句
having子句用于指定分組搜索條件,是對分組之后的結(jié)果再次篩選。having子句必須和groupby子句一起使用,有having子句就必須有g(shù)roupby子句,但有g(shù)roupby子句可以沒有having子句。
having和where類似,其區(qū)別在于where子句在進行分組操作之前對查詢結(jié)果進行篩選,而having子句是對分組操作之后的結(jié)果再次篩選。作用的對象也不同,where子句作用于表和視圖,having子句作用于組。
7)orderby子句
orderby子句指定查詢結(jié)果的排序方式。其語法格式如下:
orderby{order_by_expression[asc|desc]}[,...n]
order_by_expression可以是表或視圖的列的名稱或別名。asc表示升序(默認);desc表示降序。
5.2.2SQL高級查詢
1.關(guān)聯(lián)表查詢
SQL簡單查詢是基于單個數(shù)據(jù)表來實現(xiàn)的。在數(shù)據(jù)庫中,各個表存放著不同的數(shù)據(jù),表和表之間存在著各種聯(lián)系,往往需要用多個表中的數(shù)據(jù)來組合查詢,補充所需要的信息。
所謂多表查詢是相對于單表查詢而言的,是指從多個關(guān)聯(lián)表中查詢數(shù)據(jù),通常采用等值多表查詢的方式,即在where子句中設(shè)置等值的條件來查詢多個數(shù)據(jù)表中關(guān)聯(lián)的數(shù)據(jù)。這種
查詢要求關(guān)聯(lián)的多個數(shù)據(jù)表的某些字段具有相同的屬性,即具有相同的數(shù)據(jù)類型和寬度。
1)雙表關(guān)聯(lián)查詢
在where子句中,可以將具有相等的字段值的兩張表連接起來,數(shù)據(jù)來源于兩張表。
例5-38查詢某班級學(xué)生的基本信息和成績信息,數(shù)據(jù)來源于表student和表sc,代碼如下:
select*fromstudent,scwherestudent.s#=sc.s#
查詢結(jié)果如圖5-4所示。圖5-4等值查詢
例5-39查詢某班級學(xué)生的基本信息和成績信息,包括s#、sname、age、c#、score等字段,數(shù)據(jù)來源于student表和sc表。代碼如下:
selectstudent.s#,sname,age,c#,scorefromstudent,scwherestudent.s#=sc.s#
例5-40使用別名、邏輯運算符查詢滿足復(fù)雜條件的記錄,結(jié)果如圖5-5所示。代碼如下:
selects.s#學(xué)號,sname姓名,c#課程代碼,score成績fromstudents,scwheres.s#=sc.s#andc#='001'圖5-5雙表別名查詢
2)多表關(guān)聯(lián)查詢
有時需要將多個表進行關(guān)聯(lián)查詢,才能比較完整地反映有關(guān)信息。超過兩個表的關(guān)聯(lián)查詢稱為多表查詢,返回多個表中與連接條件相互匹配的記錄,不返回不相匹配的記錄。
例5-41根據(jù)圖5-6所示的student、sc和course表,查詢學(xué)生的基本信息,包括個人基本情況、課程信息和成績。代碼如下:
selects.s#學(xué)號,sname姓名,sc.c#課程代碼,ame課程名稱,c.credit學(xué)分,score成績from
students,coursec,sc
wheres.s#=sc.s#andsc.c#=c.c#andsc.c#='001'圖5-6sc表(s#和c#是雙屬性主鍵,c#是外鍵)
查詢結(jié)果如圖5-7所示。圖5-7多表關(guān)聯(lián)查詢結(jié)果
3)關(guān)聯(lián)表使用聚合函數(shù)
在單表查詢中,可以使用聚合函數(shù)進行統(tǒng)計,但統(tǒng)計結(jié)果的信息不夠全面,需要使用多表查詢補齊相關(guān)信息。在多表關(guān)聯(lián)查詢中,仍可以使用聚合函數(shù)進行統(tǒng)計。
例5-42在student、sc等表中,查詢學(xué)生的學(xué)號、姓名、平均分等字段信息。代碼如下:
selects.s#,s.sname,avg(score)asavgscorefromstudents,scwheres.s#=sc.s#groupbys.s#,sname
例5-42中,兩表通過學(xué)號關(guān)聯(lián),因為兩表均有學(xué)號字段,所以為student表指定別名,以別名對學(xué)號字段進行限制。使用了groupby子句,只有g(shù)roupby后面的字段和聚合函數(shù)才能放在select子句后面,因此,除學(xué)號之外,姓名字段也必須放在groupby子句后面。
2.使用union連接
使用union運算符可以將兩個或多個select子句的結(jié)果組合成一個結(jié)果集。使用union組合的結(jié)果集都必須滿足三個條件:具有相同的結(jié)構(gòu),字段數(shù)目相同,結(jié)果集中相應(yīng)字段的數(shù)據(jù)類型必須兼容。同時還要注意以下幾點:
(1)union中每一個查詢所涉及的列必須具有相同的列數(shù)、相同的數(shù)據(jù)類型,并以相同的順序出現(xiàn)。
(2)最后結(jié)果集里的列名來自第一個select語句。
(3)若union中包含orderby子句,則將對最后的結(jié)果集排序。
(4)在合并結(jié)果集時,默認從最后的結(jié)果集中刪除重復(fù)的行,除非使用all關(guān)鍵字。
union運算符的語法格式如下:
select子句
union[all]
select子句
例5-43查詢成績在60~70分數(shù)段和90及以上區(qū)域的學(xué)生信息。代碼如下:
select*fromscwherescore>=60andscore<=70
unionall
select*fromscwherescore>=90
3.子查詢
1)子查詢的基本概念
在SQL中,當(dāng)一個查詢語句嵌套在另一個查詢的查詢條件之中時,該查詢稱為嵌套查詢,又稱為子查詢。在一個外層查詢中包含有另一個內(nèi)層查詢,其中外層查詢稱為主查
詢,內(nèi)層查詢稱為子查詢。
使用子查詢時應(yīng)注意以下幾點:
(1)子查詢的基本結(jié)構(gòu)和基本查詢一樣,其中select子句和from子句是必需的,而where子句、groupby子句和having子句是可選的。
(2)子查詢的select語句通常使用圓括號括起來。
(3)子查詢的select語句中通常只有一個列,不能使用compute子句。
(4)除非在子查詢中使用了top選項,否則子查詢中不能使用orderby子句。
(5)如果某個數(shù)據(jù)表只出現(xiàn)在子查詢中,而不出現(xiàn)在主查詢中,那么在數(shù)據(jù)列表中不能包含該數(shù)據(jù)表中的字段。
2)子查詢的使用
(1)使用in關(guān)鍵字。當(dāng)子查詢的結(jié)果不唯一時,可以在子查詢前使用運算符in。in關(guān)鍵字在大多數(shù)情況下應(yīng)用于嵌套查詢中,首先使用select語句選定一個范圍,然后將選定的范圍作為in關(guān)鍵字的符合條件的列表,從而得到最終的結(jié)果。
語法格式如下:
test_expression[not]in(subquery|expression[,...n])
參數(shù)說明:
①test_expression是任何有效的SQLServer表達式。
②subquery是包含某列結(jié)果集的子查詢。expression是一個表達式列表,用來測試是否匹配。
(2)使用比較運算符的子查詢。使用比較運算符的子查詢的結(jié)果必須是單值,即子查詢的結(jié)果為單行單列的值。
例5-47查詢ISBN為“978-7-1254-2487-1”的圖書的訂單號和訂貨數(shù)量。代碼如下:
(3)使用some/any關(guān)鍵字。some/any關(guān)鍵字完全等價。通過比較運算符將一個表達式的值或列值與子查詢返回的一列值中的每一個進行比較,如果哪行的比較結(jié)果為真,則滿
足條件立即返回該行。
語法格式如下:
scalar_expression{=|<>|!=|>|>=|!>|<=|!<}
{some|any}(subquery)
參數(shù)說明:
①scalar_expression:任何有效的SQLServer表達式。
②{=|<>|!=|>|>=|!>|<=|!<}:任何有效的比較運算符。
③{some|any}:指定應(yīng)進行比較。當(dāng)子查詢的結(jié)果為多值時,使用some|any表示匹配子查詢結(jié)果中的任意一個值即可。
④subquery:包含某列結(jié)果集的子查詢。所返回列的數(shù)據(jù)類型必須是與scalar_expression相同的數(shù)據(jù)類型。
(4)使用all關(guān)鍵字。all的子查詢是把列值與子查詢結(jié)果進行比較,但是它要求所有列的查詢結(jié)果都為真,否則不返回行。使用all表示匹配子查詢的所有值才可以。
語法格式如下:
scalar_expression{=|<>|!=|>|>=|!>|<=|!<}all(subquery)
其中參數(shù)subquery返回單列結(jié)果集的子查詢,是受限的select子句(不允許使用orderby子句、compute子句和into子句)。
例5-49查詢表books的圖書單價高于或等于表orderitems中orderid為2的最高單價的圖書信息。代碼如下:
select*frombookswhereunitprice>=all(selectpricefromorderitemswhereorderid=2)
或者使用單值比較,執(zhí)行結(jié)果與all一樣。代碼如下:
select*frombookswhereunitprice>=(selectmax(price)fromorderitemswhereorderid=2)
(5)使用exists關(guān)鍵字。使用exists關(guān)鍵字指定一個子查詢,檢測行的存在。exists搜索條件并不真正地使用子查詢的結(jié)果,它僅僅檢查子查詢是否返回了任何結(jié)果,因此
exists子查詢中的select子句可用任意列名或用*號。
關(guān)鍵字exists用來檢驗子查詢的結(jié)果是否為空。在使用exists的子查詢中,外層查詢要依次判斷exists運算是否為“true”。如果非空,則exists運算返回“true”;如果為空,
則exists運算返回“false”。
(6)在select子句中使用子查詢。
例5-52在表orderitems和表books中,查詢所有圖書的編號、書名、單價及訂單總量。代碼如下:
selectbookid,title,unitprice,(selectsum(quantity)fromorderitemsiwherei.bookid=b.bookid)as訂單總量frombooksb
(7)在insert語句中使用子查詢。使用insertinto…values語句一次向表中插入的記錄是有限的,可以將values子句替換為一個select語句,將select語句檢索到的數(shù)據(jù)(可能
若干條)插入到指定的表中。x
4.連接查詢
1)基本概念及分類
在關(guān)系數(shù)據(jù)庫管理系統(tǒng)中,表建立時各數(shù)據(jù)之間的關(guān)系不必確定,常把一個實體的所有信息存放在一個表中。當(dāng)檢索數(shù)據(jù)時,通過連接操作查詢出存放在多個表中的不同實體
的信息。連接操作給用戶帶來很大的靈活性,可以在任何時候增加新的數(shù)據(jù)類型,為不同實體創(chuàng)建新的表,然后通過連接進行查詢。
連接查詢主要包括內(nèi)連接查詢、外連接查詢和交叉連接查詢等。具體如下:
(1)內(nèi)連接是SQLServer缺省的連接方式,又分為等值連接、自然連接和不等連接三種。
(2)外連接的連接查詢結(jié)果集中既包含那些滿足條件的行,還包含其中某個表的全部行,有三種形式的外連接:左外連接、右外連接和全外連接。
(3)交叉連接即笛卡兒積,是指兩個關(guān)系中所有元組的所有組合。一般情況下,交叉連接查詢是沒有實際意義的。
2)連接查詢的應(yīng)用
(1)內(nèi)連接查詢。內(nèi)連接查詢(innerjoin…on…)使用比較運算符進行表間某(些)列數(shù)據(jù)的比較操作,并列出這些表中與連接條件相匹配的數(shù)據(jù)行。在內(nèi)連接查詢中,只有滿
足連接條件的元組才能出現(xiàn)在結(jié)果關(guān)系中。內(nèi)連接的3種連接方式如下:
①等值連接。在連接條件中使用等號(=)運算符比較被連接列的列值,其查詢結(jié)果中列出被連接表中的所有列,包括其中的重復(fù)列。
②非等值連接。在連接條件中使用除等號以外的其他比較運算符比較被連接的列的列值。這些運算符包括>、>=、<=、<、!>、!<和<>。
③自然連接。在連接條件中使用等于(=)運算符比較被連接列的列值,查詢所涉及的兩個關(guān)系模式有公共屬性,且公共屬性值相等,相同的公共屬性只在結(jié)果關(guān)系中出現(xiàn)一次。
內(nèi)連接查詢的語法格式如下:
selectselect_listfrom{<table_source><join_type><table_source>[,...n]on<search_condition>}
參數(shù)說明:
·<table_source>:參與連接操作的表名,可以是一張表,也可以是多張表。
·<join_type>=inner[outer]join
·on<search_condition>:連接操作中的on子句指出連接條件,它由被連接表中的列和比較運算符、邏輯運算符等構(gòu)成。
注意:無論哪種連接,都不能對text、ntext和image數(shù)據(jù)類型列進行直接連接。圖5-8內(nèi)連接查詢結(jié)果
(2)外連接查詢。外連接分為左連接、右連接和全連接三種。與內(nèi)連接不同的是,外連接不僅列出與連接條件相匹配的行,而還會列出左表(左外連接時)、右表或兩個表中
所有符合搜索條件的數(shù)據(jù)行。注意,此時以on給出搜索條件。
外連接查詢的語法格式如下:
selectselect_listfrom{<table_source><join_type><table_source>[,...n]on<search_condition>}
參數(shù)說明:<join_type>=left|right|full[outer]join
①左外連接。左外連接(leftouterjoin或leftjoin)的結(jié)果集包括leftjoin或leftouterjoin子句中指定的左表的所有行,而不僅僅是連接列所匹配的行。如果左表的某行在右表
中沒有匹配行,則在相關(guān)聯(lián)的結(jié)果集行中右表的所有選擇列表列均為空值。
例5-56在表student、sc中,查詢表student的所有學(xué)生的基本信息和成績信息。代碼如下:
selectstudent.s#,student.sname,student.classid,sc.c#,sc.score
fromstudentleftouterjoinsconstudent.s#=sc.s#
查詢結(jié)果如圖5-9所示。圖5-9左外連接查詢結(jié)果
②右外連接。右外連接(rightouterjoin…on…或rightjoin…on…)使用rightjoin或rightouterjoin子句,是左向外連接的反向連接,將返回右表的所有行。如果右表的某行
在左表中沒有匹配行,則將為左表返回空值。
例5-57在表student、sc中,查詢所有學(xué)生的基本信息和成績信息。代碼如下:
selectstudent.s#,student.sname,student.classid,sc.c#,sc.score
fromstudentrightouterjoinsconstudent.s#=sc.s#
從查詢結(jié)果看,只包括圖5-9的前12條記錄,也就是有成績的數(shù)據(jù)行。
③全連接。全連接(fullouterjoin…on…或fulljoin…on…)使用fulljoin或fullouterjoin子句返回左表和右表中的所有行。當(dāng)某行在另一個表中沒有匹配行時,則另一個表的選擇列表列包含空值。如果表之間有匹配行,則整個結(jié)果集行包含基表的數(shù)據(jù)值。
例5-58在表student、sc中,查詢出現(xiàn)在兩個表中的所有學(xué)生的基本信息和成績信息。代碼如下:
selectstudent.s#,student.sname,student.classid,sc.c#,sc.score
fromstudentfullouterjoinsconstudent.s#=sc.s#
(3)交叉連接查詢。交叉連接(crossjoin)沒有where子句,它返回連接表中所有數(shù)據(jù)行的笛卡爾積,是指兩個關(guān)系中所有元組的所有組合,其結(jié)果集合中的數(shù)據(jù)行數(shù)等于第一
個表中符合查詢條件的數(shù)據(jù)行數(shù)乘以第二個表中符合查詢條件的數(shù)據(jù)行數(shù)。
例5-59使用交叉連接查詢學(xué)生的基本信息和成績信息。代碼如下:
select*fromstudentcrossjoinsc
下面的語句,執(zhí)行結(jié)果同上。
select*fromstudent,sc
5.實用SQL語句的使用
1)使用computeby子句分類統(tǒng)計
compute子句是T-SQL中特有的一個子句,使用compute子句允許用戶同時觀察查詢所得的各列數(shù)據(jù)的細節(jié)以及綜合各列數(shù)據(jù)所產(chǎn)生的總和。通過compute子句既可以計算數(shù)據(jù)分類后的和,也可以計算所有數(shù)據(jù)的總和。
語法格式如下:
compute{{sum|avg|count|max|min}(expression)}[,...n][byexpression[,...n]]
參數(shù)說明:
(1)expression用于指定需要統(tǒng)計的列的名稱,此列必須包含于select列表中,且不能使用別名。該子句不能使用text、ntext、image數(shù)據(jù)類型。
(2)byexpression用于在查詢結(jié)果中生成分類統(tǒng)計的行。如果使用此選項,則必須同時使用orderby子句。expression對應(yīng)orderby子句的expression的子集或全集。
例5-60在表books中,查詢顯示所有圖書的編號、書名、單價和類別代碼,最后顯示所有圖書的總價。代碼如下:
selectbookid,title,unitprice,categorycodefrombooksorderbycategorycodecomputesum(unitprice)
查詢結(jié)果如圖5-10所示。在結(jié)果的最后添加了一行表示所有圖書單價之和。圖5-10compute子句查詢結(jié)果
例5-61在表books中,查詢顯示所有圖書的編號、書名、單價和類別代碼,并顯示每類圖書的總價和所有圖書的總價。代碼如下
selectbookid,title,unitprice,categorycodefrombooksorderbycategorycodecomputesum(unitprice)
bycategorycode
在compute子句中使用關(guān)鍵字by可以實現(xiàn)數(shù)據(jù)行分組后再對每個組分別進行統(tǒng)計的功能。查詢結(jié)果如圖5-11所示。圖5-11使用computeby查詢結(jié)果
2)使用關(guān)聯(lián)表統(tǒng)計
(1)在關(guān)聯(lián)表統(tǒng)計中使用計算列。
例5-62在表student、sc中,對學(xué)生的成績信息進行統(tǒng)計計算,代碼如下:
selectd.s#,d.sname,sum(score)assumscore,cast(avg(score)asnumeric(5,1))avgscore,max(score)as
maxscore,min(score)asminscore,coursecount=count(*)
fromstudentd,scswhered.s#=s.s#groupbyd.s#,d.sname
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度北京平面設(shè)計專員崗位勞動合同規(guī)范
- 二零二五年度智能辦公文件消毒與消毒劑供應(yīng)合同
- 2025年度辦公室移動空調(diào)租賃及智能化節(jié)能服務(wù)合同樣本
- 行業(yè)領(lǐng)先物流配送方案
- 企業(yè)借給個人借款合同
- 建設(shè)工程施工合同專用條款
- 委托平面設(shè)計合同
- 農(nóng)業(yè)生產(chǎn)資源循環(huán)利用方案
- 招投標(biāo)與合同管理試卷A
- 產(chǎn)品研發(fā)合同協(xié)議書
- 《民航服務(wù)溝通技巧》教案第15課民航服務(wù)人員下行溝通的技巧
- 中國人婚戀狀況調(diào)查報告公布
- 早產(chǎn)兒視網(wǎng)膜病變
- 矮小癥診治指南
- GB 10665-1997碳化鈣(電石)
- 《克雷洛夫寓言》專項測試題附答案
- 《中小學(xué)教育懲戒規(guī)則》重點內(nèi)容學(xué)習(xí)PPT課件(帶內(nèi)容)
- 海信rsag7.820.1646ip電源與背光電路圖fan7530、fan7602fan
- 板帶生產(chǎn)工藝5(熱連軋帶鋼生產(chǎn))課件
- 2022年同等學(xué)力英語考試真題及詳解
- 深度配煤摻燒方案
評論
0/150
提交評論