access課件-結(jié)構(gòu)化查詢語言_第1頁
access課件-結(jié)構(gòu)化查詢語言_第2頁
access課件-結(jié)構(gòu)化查詢語言_第3頁
access課件-結(jié)構(gòu)化查詢語言_第4頁
access課件-結(jié)構(gòu)化查詢語言_第5頁
已閱讀5頁,還剩67頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

關(guān)系數(shù)據(jù)庫標(biāo)準(zhǔn)語言SQL夏翃首都醫(yī)科大學(xué)SQL簡介SQL(StructuredQueryLanguage)結(jié)構(gòu)化查詢語言,是一個國際標(biāo)準(zhǔn)。1989年正式采納,現(xiàn)是1992年標(biāo)準(zhǔn)SQL92。分三個級別:基本級、標(biāo)準(zhǔn)級、完全級。現(xiàn)所有的關(guān)系數(shù)據(jù)庫管理系統(tǒng)都支持SQL。P87SQL之初體會一個女程序員的征婚信息:

SELECT*FROM男人們

WHERE(未婚=trueor離異=true)and同性戀=falseand條件in(‘細(xì)心','溫柔','體貼','賢惠','會做家務(wù),

會做飯,會逛街買東西,會浪漫,活潑,

可愛,帥氣,紳士,大度,氣質(zhì),智慧','最好還能帶孩子')SQL之初體會SQL特點SQL是一體化的語言,包括數(shù)據(jù)定義、數(shù)據(jù)查詢、數(shù)據(jù)操縱和數(shù)據(jù)控制等,它可以完成與數(shù)據(jù)庫相關(guān)的全部工作。數(shù)據(jù)查詢是核心。SQL是一種高度非過程化的語言,只要告訴機(jī)器“做什么”即可。SQL語言非常簡潔。SQL語言可以直接以命令方式交互使用,可以嵌入到程序設(shè)計語言中以程序方式使用。數(shù)據(jù)查詢DQL(DataQueryLanguage):用SELECT命令實現(xiàn)。數(shù)據(jù)操作DML(DataManipulationLanguage):用INSERT,UPDATE,DELETE命令實現(xiàn)。數(shù)據(jù)定義DDL(DataDefinitionLanguage):用CREATE,ALTER,DROP命令實現(xiàn)。數(shù)據(jù)控制DCL(DataControlLanguage):用GRANT,REVOKE命令實現(xiàn)。SQL功能Select

<字段1>,<字段2>,….

From<表1>,<表2>,….

[

Where

<條件表達(dá)式1>[and|or<條件表達(dá)式2>…]]

[[inner|left|right]join<表2>[on<條件表達(dá)式>…]]

[

GroupBy<分組字段名1>[,<分組字段名2>…]][

Having<過濾條件表達(dá)式>]]

[

OrderBy<排序選項1>[Asc|Desc][,<排序選項2>[Asc|Desc]…]][

union

]

1、SQL的查詢功能Select

<字段1>,<字段2>,….From<表1>SELECTPID,姓名FROM

病人

Where<條件表達(dá)式1>[and<條件表達(dá)式2>…][inner|left|right]join<表2>[on<條件表達(dá)式>…]分組:就是將一組類似的記錄壓縮成一個結(jié)果記錄,這樣就可完成基于一組記錄的計算。分組在與某些累計功能聯(lián)合使用時效果最好,例如SUM(),COUNT(),AVG()等。Having:必須跟隨GROUPBY使用,它用來限定分組必須滿足的條件。[GroupBy<分組字段名1>[,<分組字段名2>…]][Having<過濾條件表達(dá)式>]][OrderBy<排序選項1>[Asc|Desc][,<排序選項2>[Asc|Desc]…]]排序決定了查詢輸出結(jié)果中記錄或行的先后順序[union

]把一個SELECT語句的最后查詢結(jié)果同另一個SELECT語句最后的查詢結(jié)果組合起來。SQL之初體會針對單個表。1、無條件查詢例1:從“醫(yī)生”表中檢索所有醫(yī)生的姓名。select姓名from醫(yī)生select姓名,

職稱from醫(yī)生例2:從“醫(yī)生”表中檢索所有醫(yī)生的所有數(shù)據(jù)。select*from醫(yī)生1.1SQL的簡單查詢*:顯示所有字段。多個字段名用英文逗號隔開2、有條件查詢例3:從“醫(yī)生”表中檢索所有掛號費高于10元的記錄。select*from醫(yī)生where掛號費>10例4:從“醫(yī)生”表中檢索所有掛號費高于10元的男醫(yī)生的記錄。select*from醫(yī)生where掛號費>10

and

性別=“男”2、有條件查詢Where子句必須遵循的規(guī)則檢索字符串必須用引號括起來SELECT

姓名,性別FROM

病人WHERE

性別='男'檢索日期數(shù)據(jù)必須用#前后括起來SELECT

姓名,性別,出生日期FROM

病人WHERE

出生日期>#2004/12/2#;多個條件組合,可用and或

or組合SELECT

姓名,性別,出生日期FROM

病人WHERE

性別="男"AND

出生日期>#2004/12/2#;2、有條件查詢Where子句必須遵循的規(guī)則多個條件組合,可用and或

or組合SELECT

姓名,性別,出生日期FROM

病人WHERE

性別="男"AND

出生日期>#2004/12/2#;查詢病史中含有“高血脂”的所有男病人的PID、姓名、聯(lián)系方式,出生日期和病史。=:指字段值與實例相等;>:大于“實例”中給出的值;>=:大于或等于“實例”欄給出的值;<:小于“實例”中給出的值;<=:小于或等于“實例”中給出的值;IsNull:指定字段必須包含Null值;Between:為輸出字段的值應(yīng)大于或等于“實例”欄中的最小值,而小于或等于“實例”欄中的最大值;LIKE

運算符檢驗一個包含字符串?dāng)?shù)據(jù)的字段值是否匹配某一指定模式。表3-2(P89)“條件”列表中包含如下幾項:LIKE

運算符檢驗一個包含字符串?dāng)?shù)據(jù)的字段值是否匹配某一指定模式。表3-2(P89)“條件”列表中包含如下幾項:IN(在…之中):即為輸出字段的值必須是“實例”欄中所給出值中的一個,在“實例”欄中給出的各值之間以逗號分隔?!胺瘛绷校河糜谥付?NOT.條件“邏輯”列:用于設(shè)置各聯(lián)接條件和篩選條件之間的邏輯關(guān)系(無、.AND.和.OR.)“大小寫”列:用于指定是否區(qū)分大小寫。例5:從“醫(yī)生”表中檢索所有掛號費在5元到10元范圍內(nèi)的記錄?!綽etween…and…】select*from醫(yī)生where掛號費>=5and掛號費<=10select*from醫(yī)生where掛號費between5and10例6:從“醫(yī)生”表中檢索所有姓李的記錄?!緇ike%】select*from醫(yī)生where

姓名like"李*"select*from醫(yī)生where

姓名like"*李*"select*from醫(yī)生where

姓名like"*李"以李開頭的含有李的以李結(jié)尾的*:通配符??纱?個或多個任何字。練中學(xué):1.對“KC”表檢索“課程名稱”字段中含“醫(yī)”的書,正確的命令是[]A)SELECT*FROMKCFOR課程名稱LIKE"*醫(yī)*"B)SELECT*FROMKCFOR課程名稱="*醫(yī)*"C)SELECT*FROMKCWHERE課程名稱LIKE"*醫(yī)*"D)SELECT*FROMKCWHERE課程名稱="*醫(yī)*"

C例7:從“醫(yī)生”表中檢索所有掛號費不在5元到10元范圍內(nèi)的記錄?!緉ot】select*from醫(yī)生where掛號費<5

or掛號費>10select*from醫(yī)生where掛號費not

between5and10select*from醫(yī)生where

not(掛號費>=5and掛號費<=10)select*from醫(yī)生where掛號費not

(between5and10)X—語法錯誤5<=X<=10X<5X>10例8:從“醫(yī)生”表中檢索所有掛號費不在5元到10元范圍內(nèi)的所有男醫(yī)生記錄。select*from醫(yī)生where性別=“男”and掛號費not

between5and10select*from醫(yī)生where掛號費not

between5and10and

性別=“男”練中學(xué):2.與下面命令等價的是[]SELECT*FROMXSQKWHERENOT(身高<1.5OR身高>1.8)

A)SELECT*FROMXSQKWHERE身高>1.5AND身高<1.8B)SELECT*FROMXSQKWHERENOT身高>1.5ORNOT身高<1.8C)SELECT*FROMXSQKWHERE身高<=1.5AND身高>=1.8D)SELECT*FROMXSQKWHERE身高>=1.5AND身高<=1.8E)SELECT*FROMXSQKWHERE身高BETWEEN1.5AND1.8F)SELECT*FROMXSQKWHERE身高notBETWEEN1.5AND1.8D,E1.51.8說明:升序(Asc)、降序(Desc),允許按一列或多列排序。缺省為升序。例9:對“醫(yī)生”表,按醫(yī)生的掛號費升序檢索出全部信息。select*from醫(yī)生orderby掛號費1.2SQL的排序查詢【orderby】例10:對“醫(yī)生”表,按醫(yī)生的掛號費升序,掛號費相同的按姓名降序檢索出全部信息。select*from醫(yī)生

orderby

掛號費,姓名desc【擴(kuò)展】select*from醫(yī)生orderby性別desc,掛號費,姓名desc1、count()Count(*):計算記錄個數(shù)。例11:Selectcount(*)from醫(yī)生Selectcount(*)as記錄個數(shù)

from醫(yī)生Selectcount(*)as人數(shù),血型FROM病人GROUPBY血型

orderby1desc1.3簡單的計算查詢2、sum(字段名),avg(字段名),max(字段名),min(字段名):求字段名所指定字段的….例12:求醫(yī)生的掛號費總和。selectsum(掛號費)from醫(yī)生selectsum(掛號費)as掛號費總和

from醫(yī)生2、sum(字段名),avg(字段名),max(字段名),min(字段名):求字段名所指定字段的….例13:統(tǒng)計男病人的平均年齡,列標(biāo)題為“男平均年齡"。selectavg(year(date())-year(出生日期))as男平均年齡from病人

where性別="男"2、sum(字段名),avg(字段名),max(字段名),min(字段名):求字段名所指定字段的….例14:求醫(yī)生的掛號費最貴的,最便宜的。Selectmax(掛號費),min(掛號費)from醫(yī)生思考:怎樣找出掛號費最貴的醫(yī)生?1:可以按一列或多列分組,還可以用having進(jìn)一步限定分組的條件。2:having不可以單獨使用。3:在查詢中先用where子句限定記錄,再進(jìn)行分組,最后用having子句進(jìn)一步限定分組。例15:求男醫(yī)生和女醫(yī)生的平均掛號費Select性別,avg(掛號費)from醫(yī)生

groupby性別select性別,avg(掛號費)from醫(yī)生1.4分組查詢【Groupby】X例16:求男大夫各個職稱的平均掛號費。select職稱,avg(掛號費)from醫(yī)生where性別=“男”groupby職稱聯(lián)接查詢:是一種基于多個表的查詢。所關(guān)聯(lián)的字段要數(shù)據(jù)類型一致且長度一樣。由關(guān)系R1和R2通過運算得到關(guān)系S

SelectR1.N1,N3fromR1,R2whereR1.N1=R2.N11.6聯(lián)接查詢例17:查找看過病的病人信息select*from病人,掛號where病人.PID=掛號.PID當(dāng)相關(guān)多表中含有相同的屬性名時,必須用表前綴直接指明屬性所屬的表。字段的數(shù)據(jù)類型要一致例18:查找看過病的病人和醫(yī)生以及掛號信息Select病人.姓名,醫(yī)生.姓名,掛號時間from病人,掛號,醫(yī)生where

病人.PID=掛號.PIDand醫(yī)生.DID=掛號.DID嵌套查詢:檢索的結(jié)果可能出自一個表,但相關(guān)條件卻涉及多個表。如,當(dāng)檢索X表的記錄時,它的條件依賴于相關(guān)Y表中的記錄屬性值。1、簡單嵌套查詢:外層依賴于內(nèi)層查詢的結(jié)果,內(nèi)層查詢與外層查詢無關(guān)。2、使用量詞和謂詞的查詢3、內(nèi)外層相關(guān)嵌套查詢:內(nèi)層的查詢條件需要外層查詢提供值,而外層查詢的條件需要內(nèi)層查詢的結(jié)果1.7嵌套查詢1、簡單嵌套查詢:外層依賴于內(nèi)層查詢的結(jié)果,內(nèi)層查詢與外層查詢無關(guān)。例19:找出和醫(yī)生“李斯”的職稱相同的記錄。Select*from醫(yī)生where職稱=

(select職稱from醫(yī)生where姓名=“李斯”)外層查詢塊:select*from醫(yī)生where職稱=“主任”內(nèi)層查詢塊主任例20:查找看過病的病人信息select*from病人,掛號where病人.PID=掛號.PIDselect姓名from病人wherePIDin(selectPIDfrom掛號)select姓名from病人whereexists(selectPIDfrom掛號where掛號.PID=病人.PID)內(nèi)層查詢塊In類似于集合運算中的“∈”例21:查找沒看過病的病人信息select姓名from病人wherePIDnot

in(selectPIDfrom掛號)select姓名from病人wherenot

exists(selectPIDfrom掛號where掛號.PID=病人.PID)2、使用量詞和謂詞的查詢:(1)量詞:any,allsomeAny=some:在進(jìn)行比較運算時,只要子查詢中有一行能使結(jié)果為真,則子查詢的結(jié)果就為真。All:要求子查詢中的所有行都能使結(jié)果為真,則子查詢的結(jié)果就為真。格式:<表達(dá)式><比較運算符>[any|all|some](子查詢)(2)謂詞:[not]exists:檢查子查詢中是否存在記錄格式:[not]exists(子查詢)例22:在病人表中檢索有看過病的病人信息。select*from病人wherePID=any

(select

PIDfrom掛號where掛號.PID=病人.PID)=ANY與IN等效

例22:在xsqk表中檢索有選課學(xué)生的信息。select*from病人wherePID=any

(select

PIDfrom掛號where掛號.PID=病人.PID)select*from病人wherePID=some

(select

PIDfrom掛號where掛號.PID=病人.PID)select*from病人wherePIDin

(select

PIDfrom掛號where掛號.PID=病人.PID)select*from病人whereexists

(select

PIDfrom掛號where掛號.PID=病人.PID)例23:檢索體重大于姓名為鄭有病患者的所有患者信息。Select*from病人where體重>any

(select體重from病人where姓名=“鄭有病”)內(nèi)層查詢塊外層查詢塊:select*from病人where體重>169說明:>ANY表示至少大于一個值,即大于最小值。因此,>ANY(1,2,3)表示大于1。例23:檢索體重大于姓名為鄭有病患者的所有患者信息。Select*from病人where體重>any

(select體重from病人where姓名=“鄭有病”)Select*from病人where體重>some

(select體重from病人where姓名=“鄭有病”)Select*from病人where體重>

(select體重from病人where姓名=“鄭有病”)例24:查找體重大于女性最胖的所有男患者的信息。Select*from病人where性別="男"and體重>all(select

體重

from病人where性別="女")內(nèi)層查詢塊外層查詢塊:select*from病人where性別="男"and

體重>60說明:>All表示大于每一個值,即大于最大值。因此,>All(1,2,3)表示大于3。例24:查找體重大于女性最胖的所有男患者的信息。Select*from病人where性別="男"and體重>all(select

體重

from病人where性別="女")Select*from病人where性別="男"and體重>all(selectmax(體重)

from病人where性別="女")例25:查找有比所有主任醫(yī)生治愈患者數(shù)少的醫(yī)生情況。Select姓名,職稱,治愈患者數(shù)from醫(yī)生where治愈患者數(shù)<all(select治愈患者數(shù)from醫(yī)生where職稱="主任")說明:<All表示小于每一個值,即小于最小值。因此,<All(1,2,3)表示小于1內(nèi)層查詢塊例25—思考1:查找有5條記錄,說明了什么?Select姓名,職稱,治愈患者數(shù)from醫(yī)生where治愈患者數(shù)<=all(select治愈患者數(shù)from醫(yī)生where職稱=“主任")說明:<All表示小于每一個值,即小于最小值。因此,<All(1,2,3)表示小于1例25—思考2:查找只有1條記錄,說明了什么?Select姓名,職稱,治愈患者數(shù)from醫(yī)生where治愈患者數(shù)<=all(select治愈患者數(shù)from醫(yī)生where職稱=“主治")說明:<All表示小于每一個值,即小于最小值。因此,<All(1,2,3)表示小于1例25—思考3:查找有比所有主任醫(yī)生治愈患者數(shù)少的醫(yī)生情況。Select姓名,職稱,治愈患者數(shù)from醫(yī)生where治愈患者數(shù)<any(select治愈患者數(shù)from醫(yī)生where職稱="主任")說明:<any表示小于任何一個值,即小于最大值。因此,<Any(1,2,3)表示小于3內(nèi)層查詢塊any=some>>any大于任何一個值,即大于最小值【>min()】>all大于所有的值,即大于最大值【>max()】==any【與in,exists等價】=all<<any小于任何一個值,即小于最大值【<max()】<all小于所有的值,即小于最小值【<min()】any,some,all,in對比練中學(xué):4.對XK查找大于課程編號“2055”最低成績的所有記錄[]

A)SELECT*FROMXKWHERE成績>(SELECT成績FROMXKWHERE課程編號=“2055")B)SELECT*FROMXKWHERE成績>all(SELECT成績FROMXKWHERE課程編號="2055")C)SELECT*FROMXKWHERE成績>any(SELECT成績FROMXKWHERE課程編號="2055")D)SELECT*FROMXKWHERE成績>some(SELECT成績FROMXKWHERE課程編號="2055")E)SELECT*FROMXKWHERE成績>(SELECTmax(成績)FROMXKWHERE課程編號="2055")F)SELECT*FROMXKWHERE成績>(SELECTmin(成績)FROMXKWHERE課程編號="2055")C,D,F3、內(nèi)外層相關(guān)嵌套查詢:內(nèi)層的查詢條件需要外層查詢提供值,而外層查詢的條件需要內(nèi)層查詢的結(jié)果。例26:列出相同血型體重最重的病人。Select*from病人bwhere體重in(selectmax(體重)from病人awhereb.血型=a.血型)內(nèi)層查詢塊1、內(nèi)層查詢利用血型確定該類血型患者的最大體重;2、外層查詢再根據(jù)b表的同一記錄的體重與該最大體重進(jìn)行比較。如相等,這該記錄被選擇。內(nèi)表:a外表:b對比:例26-2:列出相同血型體重最重的病人。Select*from病人bwhere體重in(selectmax(體重)from病人awhereb.血型=a.血型)Select血型,max(體重)as最大體重from病人groupby血型orderby2descjionon:連接組合兩個表中的字段記錄。多表關(guān)聯(lián):左表join

右表

on

左表.主鍵=右表.主鍵(1)innerjoinon連接組合兩個表中的字段記錄(2)leftjoinon連接組合兩個表中的字段記錄,并將包含了LEFTJOIN左邊表中的全部記錄(3)rightjoinon連接組合兩個表中的字段記錄,并將包含了RIGHTJOIN右邊表中的全部記錄1.8多表查詢(1)innerjoinon例27:查詢每個病人的掛號時間。Select病人.姓名,掛號時間FROM病人INNERJOIN掛號ON病人.PID=掛號.PID(1)innerjoinon例27:查詢每個病人所掛號的最早的時間。Select病人.姓名,Min(掛號.掛號時間)AS掛號時間FROM病人INNERJOIN掛號ON病人.PID=掛號.PIDGROUPBY病人.姓名(2)leftjoinon例28:查詢每個病人的掛號時間。Select病人.姓名,掛號時間FROM病人leftjoin掛號ON病人.PID=掛號.PID原始數(shù)據(jù)Innerjoinleftjoin(3)rightjoinon例29:查詢每個病人的掛號時間。Select病人.姓名,掛號時間FROM病人

rightjoin掛號ON病人.PID=掛號.PID原始數(shù)據(jù)Innerjoinrightjoin(3)rightjoinon例30:查詢每個病人的掛號時間。Select姓名,掛號時間FROM掛號

rightjoin病人ON病人.PID=掛號.PID原始數(shù)據(jù)Innerjoinrightjoin(多表)innerjoinon例31:查詢所有病人姓名,及其所掛號的醫(yī)生姓名及掛號時間。select病人.姓名,醫(yī)生.姓名,掛號.掛號時間from病人

innerjoin(醫(yī)生innerjoin掛號on醫(yī)生.DID=掛號.DID)on

病人.PID=掛號.PID(多表)innerjoinon例32:查詢不同血型病人的平均掛號費。Select血型,avg(掛號費)as平均掛號費from病人

innerjoin(醫(yī)生innerjoin掛號on醫(yī)生.DID=掛號.DID)on

病人.PID=掛號.PIDgroupby血型union:把一個SELECT語句的最后查詢結(jié)果同另一個SELECT語句最后的查詢結(jié)果組合起來。語句:左查詢union

右查詢UNION內(nèi)部的SELECT語句必須擁有相同數(shù)量的列(字段)。1.9聯(lián)合查詢union例33:查詢病人的姓名

溫馨提示

  • 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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論