知識點(diǎn)、SQL語句學(xué)習(xí)及詳細(xì)總結(jié)_第1頁
知識點(diǎn)、SQL語句學(xué)習(xí)及詳細(xì)總結(jié)_第2頁
知識點(diǎn)、SQL語句學(xué)習(xí)及詳細(xì)總結(jié)_第3頁
知識點(diǎn)、SQL語句學(xué)習(xí)及詳細(xì)總結(jié)_第4頁
知識點(diǎn)、SQL語句學(xué)習(xí)及詳細(xì)總結(jié)_第5頁
已閱讀5頁,還剩70頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、知識點(diǎn)、sql 語句學(xué)習(xí)及詳細(xì)總 結(jié)一. 數(shù)據(jù)庫簡介和創(chuàng)建1. 系統(tǒng)數(shù)據(jù)庫在安裝好 sql server 后,系統(tǒng)會自動(dòng)安裝 5 個(gè)用于維護(hù)系統(tǒng)正常運(yùn)行的系 統(tǒng)數(shù)據(jù)庫:(1) master:記錄了 sql server 實(shí)例的所有系統(tǒng)級消息,包括實(shí)例范圍的 元數(shù)據(jù)(如登錄帳號)、端點(diǎn)、鏈接服務(wù)器和系統(tǒng)配置設(shè)置。(2) msdb:供 sql server 代理服務(wù)調(diào)度報(bào)警和作業(yè)以及記錄操作員的使 用,保存關(guān)于調(diào)度報(bào)警、作業(yè)、操作員等信息。(備份還原時(shí))(3) model:sql server 實(shí)例上創(chuàng)建的所有數(shù)據(jù)庫的模板。(4) tempdb:臨時(shí)數(shù)據(jù)庫,用于保存臨時(shí)對象或中間結(jié)果集,為數(shù)據(jù)庫的

2、排 列等操作提供一個(gè)臨時(shí)工作空間。(每次啟動(dòng)都會重新創(chuàng)建)(5) resource:一個(gè)只讀數(shù)據(jù)庫,包含了 sql server 的所有系統(tǒng)對象。 (隱藏的數(shù)據(jù)庫)2. 數(shù)據(jù)庫的組成2.1 數(shù)據(jù)文件(1)主要數(shù)據(jù)文件:擴(kuò)展名為 .mdf ,每個(gè)數(shù)據(jù)庫有且只能有一個(gè)。 (2)次要數(shù)據(jù)文件:擴(kuò)展名為 .ndf , 可以沒有或有多個(gè)。2.2 日志文件擴(kuò)展名為 .ldf ,用于存放恢復(fù)數(shù)據(jù)庫的所有日志信息。2.3 數(shù)據(jù)的存儲分配( 1 ) 數(shù) 據(jù) 文 件 和 日 志 文 件 的 默 認(rèn) 存 放 位 置 為 : filesmicrosoftprogramesqlservermssql.1mssqldat

3、a文件夾。(2)數(shù)據(jù)的存儲分配單位是數(shù)據(jù)頁。一頁表是一塊 8kb 的連續(xù)磁盤空間。 (3)頁是存儲數(shù)據(jù)的最小空間分配單位,頁的大小決定了數(shù)據(jù)庫表中一行數(shù)據(jù) 的最大大小。3. sql 語句 數(shù)據(jù)庫操作(1)創(chuàng)建數(shù)據(jù)庫create database database_name二. sql 基礎(chǔ)sql(structured query language ,結(jié)構(gòu)化查詢語言)是用戶操作關(guān)系數(shù)據(jù) 庫的通用語言。1. sql 功能概述2. 系統(tǒng)提供的數(shù)據(jù)類型 2.1 數(shù)值數(shù)據(jù)類型數(shù)據(jù)類型bittinyintsmallint說明bit 數(shù)據(jù)類型是整型,其值只能是 0、 1 或空值。這種數(shù)據(jù)類型用于存儲只 有兩

4、種可能值的數(shù)據(jù),如 yes 或 no、true 或 false 、on 或 off. (很省空間的一種數(shù)據(jù)類型, 如果能夠滿足需求應(yīng)該盡量多用。)tinyint 數(shù)據(jù)類型能存儲從 0 到 255 之間的整數(shù)。它在你只打算存儲有 限數(shù)目的數(shù)值時(shí)很有用。smallint 數(shù)據(jù)類型可以存儲從 - 2 的 15 次冪(-32768)到 2 的 15 次冪存儲空間1 字節(jié)1 字節(jié)2 字?jǐn)?shù)據(jù)類型說明存儲空間(32767)之間的整數(shù)。這種數(shù)據(jù)類型 節(jié) 對存儲一些常限定在特定范圍內(nèi)的 數(shù)值型數(shù)據(jù)非常有用。(如果 tinyint 類型太單調(diào)不能滿足您的需求,您 可以考慮用 smallint 類型,因?yàn)檫@ 個(gè)類型

5、相對也是比較安全的,不接 受惡意腳本內(nèi)容的嵌入。)int 數(shù)據(jù)類型可以存儲從 - 2 的 31次冪(-2147483648)到 2 的 31 次冪 4 個(gè)int (2147483 647)之間的整數(shù)。存儲到 字?jǐn)?shù)據(jù)庫的幾乎所有數(shù)值型的數(shù)據(jù)都 節(jié) 可以用這種數(shù)據(jù)類型numeric(p,s) 或數(shù)據(jù)類型能用來存儲從 -10 的 38 次 最 冪-1 到 10 的 38 次冪-1 的固定精度 多數(shù)據(jù)類型說明存儲空間decimal(p,s) 和范圍的數(shù)值型數(shù)據(jù)。使用這種數(shù) 17據(jù)類型時(shí),必須指定范圍和精度。 個(gè) 范圍是小數(shù)點(diǎn)左右所能存儲的數(shù)字 字 的總位數(shù)。精度是小數(shù)點(diǎn)右邊存儲 節(jié) 的數(shù)字的位數(shù)2.2

6、 普通編碼字符串類型數(shù)據(jù)類型說明存儲char 數(shù)據(jù)類型用來存儲指定長度的定長char(n)非統(tǒng)一編碼型的數(shù)據(jù) ,n 表示字符串的最 n 字 大長度,取值范圍為 18000 (若實(shí)際字 _符串控件小于 n,系統(tǒng)自動(dòng)在后面補(bǔ)空格)數(shù)據(jù)類型說明存儲varchar(n)可變長度的字符串類型 ,n 表示字符串的 最大長度,取值范圍為 18000。字符字節(jié)銷texttext 數(shù)據(jù)類型用來存儲大量的非統(tǒng)一編 碼型字符數(shù)據(jù)。這種數(shù)據(jù)類型最多可以有 231-1 或 20 億個(gè)字符.每個(gè)個(gè)字char 和 varchar 的區(qū)別:若某列數(shù)據(jù)類型為 varchar(20),存字符串”jone”時(shí),只占用 4 個(gè)字節(jié),

7、而 char (20)會在為填滿的空間中填寫空格。所以,varchar 類型比 char 類型更節(jié)省 空間,但它的開銷會大一些,處理速度也慢一些。因此,n 值比較?。ㄐ∮?4), 用 char 類型更好些。2.3 統(tǒng)一編碼字符串類型(unicode)數(shù)據(jù)類型說明存nchar(n)nchar 數(shù)據(jù)類型用來存儲定長統(tǒng)一編碼 字符型數(shù)據(jù)。統(tǒng)一編碼用雙字節(jié)結(jié)構(gòu)來2n_存儲每個(gè)字符,而不是用單字節(jié) (普通文數(shù)據(jù)類型說明存本中的情況)。它允許大量的擴(kuò)展字符。 此數(shù)據(jù)類型能存儲 4000 種字符,使用的 字節(jié)空間上增加了一倍 .nvarchar 數(shù)據(jù)類型用作變長的統(tǒng)一編字nvarchar(n) 碼字符型數(shù)據(jù)

8、。此數(shù)據(jù)類型能存儲 4000 字種字符,使用的字節(jié)空間增加了一倍 .銷ntext最多可存儲 2 的 30 次方-1 將近 10 億個(gè) 每 字符 個(gè)三. sql 數(shù)據(jù)操作語言1.數(shù)據(jù)查詢語句1.1 查詢語句的基本結(jié)構(gòu)select -需要哪些列from -來自哪張表 where group by having order by select 子句用于指定輸出的字段;from 子句用于指定數(shù)據(jù)的來源;where 子句用于指定數(shù)據(jù)的選擇條件;group by 子句用于對檢索到的記錄進(jìn)行分組;having 子句用于指定組的選擇條件;order by 子句用于對查詢的結(jié)果進(jìn)行排序;以上子句中, selec

9、t 子句和 from 子句是必需的,其它是可選的。1.2 單表查詢1.2.1 選擇表中若干列(1)查詢指定的列select 列名 from 表名1例子 :select sname,sno from student(2)查詢?nèi)苛衧elect * from 表名1例子 :select * from student(3)查詢經(jīng)過計(jì)算的列select 列名 from 表名1例 子 :select sname,year(getdata() -year(birthdate) from student 1.2.2 選擇表中的若干元祖(1)消除取值相同的行: distinctselect distinct

10、sno from 表名1例子 :select distinct sno from student(2)查詢滿足條件的元祖 查詢條件謂 詞比較=、=、=、!=、!、!確定范圍betweenand、 not查詢條件謂 詞確定集合字符匹配空值betweenandin 、not inlike 、not likeis null、is not null多重條件(邏輯謂詞) and、or a.比較大小例 子 :select sname from student whereyear(getdata() - year(birthdate) = 80 and grade = 90例子 :select sno,cn

11、o from sc where gradenot between 80 and 90此 查 詢 等 價(jià) 于 :select sno,cno from sc wheregrade 90c. 確定集合in 運(yùn)算符的含義:當(dāng)列中的值和集合中的某個(gè)常量值相等時(shí),結(jié)果為 true。 not in 運(yùn)算符的含義:當(dāng)列中的值和集合中的全部常量值都不相等時(shí),結(jié)果為 true。例子 :select sno from student where deptin (信息管理系,計(jì)算機(jī)系)此查詢等價(jià)于:select sno from student wheredept = 信息管理系 or dept = 計(jì)算機(jī)系 )例

12、子 :select sno from student where deptnot in (信息管理系,計(jì)算機(jī)系)此查詢等價(jià)于:select sno from student wheredept != 信息管理系 and dept != 計(jì)算機(jī) 系)d. 字符串匹配like 運(yùn)算符用于查找指定列中與匹配串匹配的元祖。 列名 not like 通配符_(下劃線)%(百分號)含義匹配任意一個(gè)字符匹配 0 個(gè)或多個(gè)字符匹配中的任意一個(gè)字符。如 abcd表示匹配 ab 任何一個(gè),若是連續(xù)的,可以用 - 表示,如a-d不匹配中的任意一個(gè)字符。如 abcd表示不匹通配符含義其中任何一個(gè),若是連續(xù)的,可以用

13、- 表示,如例子 :(查詢姓“張”的學(xué)生詳細(xì)信息 )select * from student where sname like 張%(查詢不姓“張”的學(xué)生詳細(xì)信息)select * from student where sname not like 張%(查詢姓“張”、“李”的學(xué)生詳細(xì)信息)select * from student where sname like 張李%(查詢名字的第二個(gè)字為 “小” 或 “大”的學(xué)生 詳細(xì)信息)select * from student where sname like _小大%e. 涉及空值的查詢空值(null)在數(shù)據(jù)庫中有特殊含義,表示當(dāng)前不確定或未

14、知的值。判斷是否 為 null 時(shí),不可用普通的比較運(yùn)算符,需用 is null例子 :select sno from student where gradeis null1.2.3 對查詢結(jié)果進(jìn)行排序?qū)⒉樵兘Y(jié)果按照指定的順序顯示。 asc 表示按列值升序排列(從上往下,值從 大到?。esc 表示按列值降序排列(從上往下,值從小到大)。默認(rèn)為 asc。order by asc|desc例子 :select sno,grade from sc order bygrade desc1.2.4 使用聚合函數(shù)統(tǒng)計(jì)數(shù)據(jù)聚合函數(shù)也稱為統(tǒng)計(jì)函數(shù)或集合函數(shù),作用是對一組值進(jìn)行計(jì)算并返回一個(gè)統(tǒng) 計(jì)結(jié)果。聚合

15、函數(shù)含義聚合函數(shù)count(*)count(distinct)含義統(tǒng)計(jì)表中元祖的個(gè)數(shù)統(tǒng)計(jì)本列的非空列值個(gè)數(shù)sum()計(jì)算列值的和值(必須是數(shù)值avg()計(jì)算列值的平均值(必須是數(shù)max()min()計(jì)算列值的最大值計(jì)算列值的最小值上述函數(shù)除 count(*) 外,其它函數(shù)在計(jì)算過程中均忽略 null 值 (統(tǒng)計(jì)學(xué)生總?cè)藬?shù))select count(*) from student(統(tǒng)計(jì)“001”學(xué)號學(xué)生的考試平均成績)select avg(grade) from sc where sno = 001(查詢“c001”號課程考試成績的最高分和最低 分)select max(grade) 最高分,m

16、in(grade) 最 低分 from sc where cno = c001聚合函數(shù)不能出現(xiàn)在 where 子句中!1.2.5 對數(shù)據(jù)進(jìn)行分組統(tǒng)計(jì)需要先對數(shù)據(jù)進(jìn)行分組,然后再對每個(gè)組進(jìn)行統(tǒng)計(jì)。分組子句 group by。在 一個(gè)查詢語句中,可以用多個(gè)列進(jìn)行分組。分組子句跟在 where 子句的后面:group by ,.nhaving (1)使用 group by 子句(統(tǒng)計(jì)每門課程的選課人數(shù),列出課程號和選課 人數(shù))select cno as 課程號, count(sno) as 選 課人數(shù) from sc group by cno(統(tǒng)計(jì)每個(gè)學(xué)生的選課門數(shù)和平均成績)select sno

17、學(xué)號, count(*)選課門數(shù),avg(grade) 平均成績 from sc group by sno帶 where 子句的分組(統(tǒng)計(jì)每個(gè)系的女生人數(shù))select dept, count(*) 女生人數(shù) from s tudent where sex = 女 group by dept(2)使用 having 子句having 子句用于對分組后的統(tǒng)計(jì)結(jié)果再進(jìn)行篩選,它的功能與 where 子句 類似,它用于組而不是單個(gè)記錄。在 having 子句中可以使用聚合函數(shù),但在 where 子句中不能,通常與 group 子句一起使用。(查詢選課門數(shù)超過 3 門的學(xué)生的學(xué)號和選課 門數(shù))sele

18、ct sno 學(xué)號, count(*)選課門數(shù),avg(grade) 平均成績 from sc group by sno h aving count(*) 3(3)where 、group by 、having 的作用及執(zhí)行順序where 子句用于篩選 from 子句中指定的數(shù)據(jù)所產(chǎn)生的行數(shù)據(jù)。 group by 子句用于對經(jīng) where 子句篩選后的結(jié)果數(shù)據(jù)進(jìn)行分組。 having 子句用于對分組后的統(tǒng)計(jì)結(jié)果再進(jìn)行篩選。可以分組操作之前應(yīng)用的篩選條件,在 where 子句中指定它們更有效,這樣 可以減少參與分組的數(shù)據(jù)行。在 having 子句中指定的篩選條件應(yīng)該是那些必 須在執(zhí)行分組操作之后

19、應(yīng)用的篩選條件。(查詢計(jì)算機(jī)系和信息管理系每個(gè)系的學(xué)生人 數(shù))第一種:select dept,count(*) from student grou p by dept having dept in(計(jì)算機(jī)系,信 息管理系)第二種:select dept,count(*) from student wher e dept in (計(jì)算機(jī)系,信息管理系)grou p by dept以上例子比較:第一種是按照系分組好了之后,只采取所有系中的兩個(gè)系,顯 然效率不高。而第二種是先進(jìn)行 where 篩選條件之后,再進(jìn)行 group by 計(jì) 算,顯示更好。1.3 多表連接查詢?nèi)粢粋€(gè)查詢同時(shí)涉及到兩張或以上

20、的表,則稱為連接查詢。1.3.1 內(nèi)連接使用內(nèi)連接時(shí),如果兩個(gè)表的相關(guān)字段滿足條件,則從兩個(gè)表中提取數(shù)據(jù)組成 新的記錄。from 表 1 inner join 表 2 on 1注意:連接條件中的連接字段必須是可比的,必須是語義相同的列。(查詢學(xué)生及選課的詳細(xì)信息)select * from student inner join sc on student.sno = sc.sno(查詢計(jì)算機(jī)系學(xué)生的選課情況,列出該學(xué)生的 名字、所修課程號、成績) -行選擇條件select sname,cno,grade from student in ner join sc on student.sno =

21、sc.sno wh ere dept = 計(jì)算機(jī)系(統(tǒng)計(jì)每個(gè)系的平均成績) -分組的多表 查詢select dept,avg(grade) as averagegrade from student s inner join sc on s.sno = sc.sno group by dept(統(tǒng)計(jì)計(jì)算機(jī)系每個(gè)學(xué)生的選課門數(shù)、平均成 績、最高成績、最低成績) -分組和行選 擇條件的多表連接查詢select sno,count(*),avg(grade),max(gr ade),min(grade) from student s join sc on s.sno = sc.sno where de

22、pt = 計(jì)算 機(jī)系 group by dept1.3.2 自連接自連接是一種特殊的內(nèi)連接,相互連接的表在物理上是一張表,但在邏輯上可 以看做是兩張表。from 表 1 as t1 join 表 1 as t21通過為表取別名的方法,可以讓物理上的一張表在邏輯上成為兩張表。(一定 要為表取別名?。ú樵兣c劉晨在同一個(gè)系學(xué)習(xí)的學(xué)生的姓名、所 在系)select s1.sname,s1.dept from student s 1 join student s2on s1.dept = s2.dept -同一個(gè)系的學(xué) 生where s2.sname = 劉晨 詢條件and s1.sname != 劉

23、晨-s2 表作為查-s1 表作為結(jié)果表,并從中去掉 劉晨本人信息1.3.3 外連接在內(nèi)連接操作中,只有滿足條件的元祖才能出現(xiàn)在查詢結(jié)果集中。外連接是只限制一張表中的數(shù)據(jù)必須滿足條件,而另一張表的數(shù)據(jù)可以不滿足 條件。from 表 1 left|right outer join 表 2 o n 1left outer join 稱為左外連接,含義是限制表 2 中的數(shù)據(jù)必須滿足條件, 但不管表 1 中的數(shù)據(jù)是否滿足條件,均輸出表 1 中的數(shù)據(jù)。left outer join 稱為右外連接,含義是限制表 1 中的數(shù)據(jù)必須滿足條件, 但不管表 2 中的數(shù)據(jù)是否滿足條件,均輸出表 2 中的數(shù)據(jù)。內(nèi)連接與

24、外連接的區(qū)別:內(nèi)連接:表 a 與表 b 進(jìn)行內(nèi)連接,則結(jié)果為兩個(gè)表中滿足條件的記錄集,即 c 部分。外連接:如果表 a 和表 b 進(jìn)行左外連接,則結(jié)果為 記錄集 a + 記錄集 c;如 果表 a 和表 b 進(jìn)行右外連接,則結(jié)果為 記錄集 b + 記錄集 c。(查詢沒有人選的選修課程名)select cname from course c left join sc on c.cno = sc.cno where sc.cno is n ull例子解析:如果存在部分課程為被人選擇,則必定在 course 表中有但在 sc 表 中沒有出現(xiàn),即在進(jìn)行外連接時(shí)沒人選的課程在與 sc 表構(gòu)成的連接結(jié)果集中

25、, 對應(yīng)的 sno、cno、grade 列必定為空,所以只需 *在連接后的結(jié)果中選出 *sc 表中 sno 或 cno 為空的元祖即可。(統(tǒng)計(jì)計(jì)算機(jī)系每個(gè)學(xué)生的選課門數(shù),包括沒選 課的學(xué)生)select s.sno as 學(xué)號,count(sc.cno) as 選課門數(shù) from student s left join sc on s.sno = sc.sno where dept = 計(jì)算機(jī)系 group by s.sno例子解析: 上述例子要求統(tǒng)計(jì)每個(gè)學(xué)生的 .,所以在 group by 分組時(shí),是 按照學(xué)生表中的學(xué)號來分。而對于聚合函數(shù) count,上述要求統(tǒng)計(jì)每個(gè)學(xué)生的 選課門數(shù),若寫

26、成 count(s.sno)或 count(*),則對沒選課的學(xué)生都返回1, 因?yàn)樵谕膺B接結(jié)果中, s.sno 不會是 null,而 count(*)函數(shù)本身也不考慮 null,它是直接對元祖?zhèn)€數(shù)進(jìn)行計(jì)數(shù)。注意:在對外連接的結(jié)果進(jìn)行分組、統(tǒng)計(jì)等操作時(shí),一定要注意分組依據(jù)列和 統(tǒng)計(jì)列的選擇。1.4 使用 top 限制結(jié)果集行數(shù)在使用 select 語句進(jìn)行查詢時(shí),有時(shí)只需要前幾行數(shù)據(jù)。top (expression) percent with ties1expression:指定返回行數(shù)的數(shù)值表達(dá)式。如果指定了 percent, expression 將隱式轉(zhuǎn)換成 float,否則是 bigin

27、tpercent:指定只返回結(jié)果集中前 expression% 行數(shù)據(jù)。with ties:指定從基本結(jié)果集中返回額外的數(shù)據(jù)行(只有在 select 子句中包含了 order by 子句時(shí),才能使用)。top 謂詞寫在 select 單詞的后面(如果有 distinct,則在 distinct 后面)。(查詢考試成績最高的 3 個(gè)成績。列出學(xué)號、課 程號、成績)select top 3 sno,cno,grade from sc ord er by grade desc若要包括并列第 3 名的成績:select top 3 sno,cno,grade with ties f rom sc or

28、der by grade desc2.數(shù)據(jù)更改功能2.1 插入數(shù)據(jù)insert into 表名(列名) values (值)(1)簡單插入語句insert into student values (001,陳 東,男,1996/6/23,信息管理系)(2)多行插入語句insert into sc values(001,c001,9 0),11001( ,c002,30),001( ,c005,null)(3)不按表順序插入語句按與表列順序不同的順序插入數(shù)據(jù)insert into student(sno,sname,sex,dep t) values (001,陳東,男,1996/6/2 3,信

29、息管理系)2.2 更新數(shù)據(jù)update 表名 set 列名 = 值(1)無條件更新update sc set grade = grade+10(2)有條件更新(將“c001”號課程的學(xué)分改成 5 分)update course set grade = 5 where cno = c001(將計(jì)算機(jī)系全體學(xué)生的成績加 5 分)update sc set grade = grade+5 from sc join student s on s.sno = sc.sno where dept = 計(jì)算機(jī)系2.3 刪除數(shù)據(jù)delete top (expression) percentfrom 表名(1)

30、無條件刪除delete from student(2)有條件刪除(刪除所有考試成績不合格的學(xué)生的選課記錄) delete from sc where grade = 90 then 優(yōu)when grade between 80 and 99 t hen 良when grade between 70 and 79 t hen 中when grade between 60 and 69 t hen 及格end as 成績fromsc on where cno = c0012. 子查詢?nèi)绻粋€(gè) select 語句嵌套在另一個(gè) select、insert、update 或 delete 語句中,則稱為

31、子查詢或內(nèi)層查詢;而包含子查詢的語句稱為主查詢。子查詢通常用于滿足下列需求之一:象把一個(gè)查詢分解成一系列的邏輯步驟提供一個(gè)列表作為 where 子句和 in、exists、 any、 all 的目標(biāo)對 提供由外層查詢中每一條記錄驅(qū)動(dòng)的查詢子查詢通常有幾種形式:where 列名 not in (子查詢 ) where 列名 比較運(yùn)算符 (子查詢) where exists(子查詢 )2.1 使用基于集合測試的嵌套子查詢使用嵌套子查詢進(jìn)行基于集合的測試時(shí),子查詢返回的是一個(gè)值列表,外層查 詢通過運(yùn)算符 in 或 not in,對子查詢返回的結(jié)果集進(jìn)行比較。select from .where no

32、t in (select from)包含這種子查詢形式的查詢語句是分步驟實(shí)現(xiàn)的,即先執(zhí)行子查詢,然后在子 查詢的結(jié)果基礎(chǔ)上執(zhí)行外層查詢(先內(nèi)后外)。子查詢返回的結(jié)果是一個(gè)集合, 外層查詢就是在這個(gè)集合上使用 in 運(yùn)算符進(jìn)行比較。(查詢與劉晨在同一系的學(xué)生)select sno,sname,dept from student whe re dept in(select dept from student where sn ame = 劉晨)(查詢選修了 java 課程學(xué)生的姓名)select sname from stduent where sno in (select sno from sc

33、 where cno in(select cno from course where c name = java)第二個(gè)例子也可以用了連接查詢來做:select sname from student s join sc on s.sno = sc.sno join course c on c.cno = sc.cno where cname = java上述的例子可以看出子查詢和連接查詢可以互通,但在某些情況下是不可以的: (統(tǒng)計(jì)選了 java 課程的學(xué)生的姓名和所在系)子查詢:select sno 學(xué)號,count(*) 選課門數(shù),avg(g rade) 平均成績from sc where

34、sno in(select sno from sc join course con c.cno = sc.cnowhere cname = java) group by sno這個(gè)查詢不能完全用連接查詢實(shí)現(xiàn),因?yàn)檫@個(gè)查詢的語義是要先找出選了java 課程的學(xué)生,然后再計(jì)算這些學(xué)生的選課門數(shù)和平均成績。連接查詢:select sno 學(xué)號,count(*) 選課門數(shù),avg(g rade) 平均成績from sc join course c on c.cno= sc.cno where cname = java oup by snogr以上查詢是錯(cuò)誤的,查出來學(xué)生的選課門數(shù)都是 1 ! 實(shí)際上這

35、個(gè) 1 指的是 java 這一門課程,其平均成績也是 java 成績?!咀⒁猓骸窟B接查詢和子查詢的區(qū)別:之所以這樣,是因?yàn)樵趫?zhí)行有連接操作的查詢時(shí),系統(tǒng)首先將所有被連 接的表連接成一張大表,這張大表中的數(shù)據(jù)全部滿足連接條件的數(shù)據(jù)。之 后再在這張連接后的大表上執(zhí)行 where 子句,然后是 group by 子句。執(zhí)行完 where 子句之后,連接的大表中的數(shù)據(jù)就只剩下 java 這一門課程的 情況了,顯然不符情況。對于含有嵌套的子查詢的查詢,是先執(zhí)行子查詢,然后在子查詢的結(jié)果 基礎(chǔ)上再執(zhí)行外層查詢?!咀⒁猓骸吭谧硬樵冎蟹穸ê驮谕獠樵冎蟹穸ǖ膮^(qū) 別 in 和 != 的搭配 相較于 not in

36、和 =的搭配是否相同?在子查詢中否定和在外查詢中否定的區(qū)別?(查詢沒選 c001 課程的學(xué)生的姓名和所在系)1.多表連接:select sname,dept from student s join sc on s.sno= sc。sno where cno != c001 2. 嵌套子查詢:1)在子查詢中否定select sname,dept from studentwhere sno not in(select sno from sc where cno = c001)2)在外層查詢中否定select sname,dept from studentwhere sno in(select sno from sc where cno != c001)這個(gè)例子,連接查詢是錯(cuò)誤的,嵌套子查詢中方法一在子查詢中的否定是錯(cuò)誤 的!嵌套子查詢中方法二在外

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論