版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1
SQL語言基礎SQL概述SQL(StructuredqueryLanguage,結構化查詢語言),功能包括查詢、操縱、定義、控制。功能豐富、語言簡潔、使用靈活,倍受歡迎。1974年由Boyce,Chamberlin提出,1975年在IBM公司的SystemR上首次實現(xiàn)。原型稱為SEQUEL(StructuredEnglishQUEryLanguage).1986年ANSISQL-86標準,是第一個SQL標準。1987年成為國際標準。1992年SQL-92標準(簡稱SQL2)。21999年SQL-99標準(簡稱SQL3)。增加了對對象關系模型的支持。目前僅部分實現(xiàn)。最流行的國際標準數據庫語言。主要特點:SQL是非結構化的語言,使用SQL查詢數據庫時,只需要告訴它做什么而不用告訴它如何去做。SQL本身不提供任何程序流程控制結構,而是通過PL/SQL提供SQL語言的過程化功能SQL提供相對固定的數據類型,一般不需要擴展SQL本身十分靈活,方便易學。3標準SQL只包含9種語句:數據查詢:select數據定義:create,drop,alter數據操縱:insert,update,delete數據控制:grant,revoke4數據定義語言(DDL),用于定義數據結構數據操縱語言(DML),用于檢索和修改數據結構數據控制語言(DCL),用于規(guī)定數據庫用戶的各種權限數據庫事務處理,用來保證數據庫的完整性SQL語言分類5SQL語言分類數據定義語言(DDL):用于定義數據結構能使用戶完成下列任務創(chuàng)建數據庫對象刪除數據庫對象更改數據庫對象6常用的DDL語句包括:CreateTable:創(chuàng)建數據庫表CreateIndex:創(chuàng)建數據庫表的索引DropTable:刪除數據庫表DropIndex:刪除數據庫表的索引Truncate:刪除表中所有行AlterTable:增加表列,重定義表列,更改存儲分配AlterTableADDCONSTRAINT:在已有的表上增加約束7數據操縱語言(DML):允許用戶對數據庫中的數據進行Insert,Update,Delete和Select等操作常用DML語句包括:Insert:增加數據行到表Delete:從表中刪除數據行Update:更改表中數據Select:從表中或視圖中檢索數據行8數據控制語言(DCL):用于規(guī)定數據庫用戶的各種權限常用的數據控制語句包括:GRANT:將權限或角色授予用戶或其它角色REVOKE:從用戶或數據庫角色回收權限SetRole:禁止或允許一個角色9數據庫事務控制:用來保證數據庫的完整性常用的事務處理語句包括:COMMITWORK:把當前事務所作的更改永久化(寫入磁盤)ROLLBACK:作廢上次提交以來的所有更改10事務:指作為單個邏輯工作單元執(zhí)行的一系列操作,而這些邏輯工作單元需要具有原子性,一致性,隔離性和持久性四個屬性。原子性:指事務必須是原子工作單元,即對于事務所進行數據修改,要么全都執(zhí)行,要么全都不執(zhí)行11一致性:指事務在完成時,必須使所有的數據都保持一致性狀態(tài),而且在相關數據庫中,所有規(guī)則都必須應用于事務的修改,以保持所有數據的完整性。事務結束時,所有的內部數據結構都必須是正確的。12隔離性:指由并發(fā)事務所做的修改必須與任何其他并發(fā)事務所做的修改相隔離。事務查看數據時數據所處的狀態(tài),要么是被另一并發(fā)事務修改之前的狀態(tài),要么是被另一事務修改之后的狀態(tài),即事務不會查看正在由另一個并發(fā)事務正在修改的數據。持久性:指事務完成之后,它對于系統(tǒng)的影響是永久性的,即使出現(xiàn)系統(tǒng)故障也是如此。13SQL語句的基本語法基本語法如下:每條SQL語句必須以分號結束每條SQL語句可以單獨寫成一行,也可以分成若干行SQL語句對大小寫不敏感,對于SQL語句的關鍵字(如Insert等),表名,列名等,可以大小寫混合;但對列的內容則是大小寫敏感的。14對象命名約定SQLServer用三段式名字標識對象:<數據庫名>.<所有者名>.<對象名>前兩者可以省略,系統(tǒng)自動有一個默認值。數據庫名的默認值是當前數據庫,所有者名的默認值是數據庫的所有者(dbo)例如:在pubs數據庫中的authors表的所有者是dbo,它可以在多個數據庫中按如下方法引用:pubs.dbo.authorsPubs.authors15別名:使用別名的主要目的是增加select語句的可讀性。可使用如下語句指派數據表的別名:數據表名稱as數據表別名16例如:usesampleSelecte.員工編號,e.員工姓名From員工數據表ase注意:如果為數據表指定了別名,則在相應的T-SQL語句中,對該數據表的所有顯式引用都必須使用別名,而不能使用數據表名。例如:Select員工數據表.員工編號,e.員工姓名From員工數據表ase17SELECT語句數據檢索是數據庫中最頻繁執(zhí)行的活動在SQL中,使用SELECT語句可以在需要的表單中檢索數據在進行檢索之前,必須知道需要的數據存儲在哪里
SELECT語句可以由多個查詢子句組成18SELECT語句SELECT語句可用于檢索:全部的行和列全部的行和特定的列限定范圍的行與一組值匹配的行根據未知值檢索的行隱藏有重復值的行根據多個搜索條件檢索的行19SELECT語句Select語句的基本結構如下:SELECT[ALL|DISTINCT]select_list[INTO[new_table_name]]FROM{table_name|view_name} [[,{table_name2|view_name2} [….,{table_name16|view_name16}]][WHEREsearch_conditions][GROUPBYgroup_by_list] [HAVINGsearch_conditions]
[ORDERBYorder_list[ASC|DESC]]20SELECT子句SELECT
子句指定需要通過查詢返回的表的列。其語法如下:SELECT[ALL|DISTINCT][TOPn]<select_list>各參數說明如下:其中,select_list表示需要檢索的字段的列表,字段名稱之間用逗號分隔。這個列表中既可以包含數據源表或視圖中的字段名稱,還可以包含其它表達式。如用*,則系統(tǒng)將返回數據表中的所有字段。21
ALL:指明查詢結果中可以顯示值相同的列ALL是系統(tǒng)默認的
DISTINCT:指明查詢結果中如果有值相同的列,則只顯示其中的一列。對DISTINCT
選項來說,Null值被認為是相同的值
TOPn[PERCENT]:指定返回查詢結果的前n行數據,如果PERCENT
關鍵字指定的話,則返回查詢結果的前百分之n行數據。22例如:例:查詢所有產品的編號名稱和成本selectp_id,p_name,costfromproducts運行結果如下p_idp_namecost----------------------------------10030001路由器20000.000010030002網卡100.0000……因數據太多故省略之23例:查詢數據庫表的全部列select*fromemployee運行結果如下emp_ide_namesexbirthdayjob_leveldept_idhire_datee_wage10010001張三11968-02-1400:00:00.000110011996-08-0200:00:00.0008000.000024例:查詢產品的編號、名稱、庫存數量和成本,并計算每種產品的總成本價值selectp_id,p_name,quantity,cost,cost*quantityassum_costfromproducts運行結果如下p_idp_namequantitycostsum_cost10030001路由器100020000.000020000000.000025INTO子句INTO
子句用于把查詢結果存放到一個新建的表中。SELECT...INTO
句式不能與COMPUTE
子句一起使用。其語法如下INTOnew_table參數new_table
指定了新建的表的名稱,新表的列由SELECT
子句中指定的列構成。新表中的數據行是由WHERE
子句指定的。但如果SELECT
子句中指定了計算列,在新表中對應的列則不是計算列,而是一個實際存儲在表中的列,其中的數據由執(zhí)行SELECT...INTO
語句時計算得出。26FROM子句FROM
子句指定需要進行數據查詢的表只要SELECT
子句中有要查詢的列就必須使用FROM
子句其語法如下FROM{<table_source>}[,...n]table_source:指明SELECT
語句要用到的表、視圖等數據源,該列表中的數據表名和視圖名之間使用逗號分隔。27From子句還可以指定數據表或視圖之間聯(lián)接的類型,這些類型將決定于on子句中指定的聯(lián)接條件。例如:Select員工數據表.員工編號,項目數據表.項目名稱From員工數據表joinon(員工數據表.員工編號=項目數據表.負責人)28T-SQL可以支持在from子句中指定除了數據表或視圖以外的其他對象,例如查詢結果集構成的派生表。這些派生表實際上是from子句中select語句的查詢結果集,這些結果集構成了外層select語句查詢時所用的數據表。29例如:SelectEmp.員工編號,emp.員工姓名,sp.部門名稱From員工數據表asemp,(select部門數據表.部門編號,部門數據表.部門名稱From部門數據表Where部門數據表.部門編號>2)asspWhereemp.部門編號=sp.部門編號首先使用select語句檢索高級部門,并用別名sp表示該派生表,然后從員工數據表和sp派生表中檢索數據。30Where子句Where
子句指定數據檢索的條件,以限制返回的數據行。Where子句中的查詢條件比較運算符:<、<=、>、>=、=、>、!=、!<、!>范圍說明:BetweenAandB、NotBetweenAandB可選值列表:IN、NOTIN模式匹配:LIKE,NOTLIKE是否空值:ISNULL、ISNOTNULL上述條件的邏輯組合:AND、OR、NOT31比較查詢條件:text、ntext和image數據類型不能與比較運算符組合成查詢條件。列表查詢條件:in關鍵字在大多數情況下應用于嵌套查詢(又稱為子查詢)中,通常首先使用select語句選定一個范圍,然后將選定的范圍作為in關鍵字的符號條件的列表,從而得出最終的結果集。32模式查詢條件:Like、NotLike通配符*——匹配任意字符串?——匹配任意一個字符大小寫敏感33Like關鍵字中的通配符及其含義通配符含義%由0個或更多字符組成的任意字符串_任意單個字符[]用于指定范圍,例如[a-f],表示a到f范圍內的任何單個字符[^]表示指定范圍,例如[^a-f],表示a到f范圍以外的任何單個字符34Like關鍵字舉例like格式檢索范圍Like‘Mc%’以Mc開頭的所有字符串Like‘%inger’以字母inger結尾的所有字符串Like‘_heryl’以字母heryl結尾的所有6個字母的名稱Like‘[M-Z]inger’以inger結尾、以從M到Z的任何單個字母開頭的所有字符串Like‘M[^c]%’以M開頭,且第二個字母不是c的所有字符串Like‘%en%’在任何位置包含字母en的所有字符串35空值判斷查詢條件:null值表示字段的數據值未知或不可用,它并不表示零(數字值或二進制值)、零長度的字符串或空白(字符值)36例如例:查詢工資介于2000元和3000元之間的員工姓名selecte_namefromemployeewheree_wagebetween2000and3000運行結果如下e_name--------------------王二伍將(2row(s)affected)37例:列出工資大于7000的員工所屬的部門編號selectdistinctdept_idfromemployeewheree_wage>7000運行結果如下dept_id-------10011005(2row(s)affected)38例:查詢在編號為1001和1002的部門中工作的員工姓名selecte_namefromemployeewheredept_idin(’1001’,’1002’)運行結果如下e_name--------------------張三李四39例:查找公司中所有姓王,且全名為兩個字的員工的姓名、所在部門編號selecte_name,dept_idfromemployeewheree_namelike’王__’/*注意這里使用了兩個下劃線_符號運行結果如下e_namedept_id---------------------------王二1001王朝1003(2row(s)affected)40如果用戶要查找的數據中本身就包含了通配符,如SQL_Mail,就需要使用轉義字符來區(qū)分通配符與實際存在的字符。其格式如下LIKE
字符匹配串ESCAPE轉義字符例:查找對象名稱為SQL_M
開頭,il結尾,中間有一個不確定字符的對象select*fromobjectswhereobject_namelike’SQL#_M_il’escape‘#’/*
這里使用了兩個下劃線_符號,前一個下劃線由于有逃逸字符在其前面作標識,因而被認為是實際存在的下劃線字符;后面一個下劃線沒有逃逸字符在其前面作標識,因此將它作為通配符
*/41使用[]來將通配符指定為普通字符。例如:Select*fromobjectWherecolumn1like‘%54[%]%’將返回所有包含54%的字符串42GROUPBY子句GROUPBY
子句指定查詢結果的分組條件。其語法如下:GROUPBY[ALL]group_by_expression[,...n][WITH{CUBE|ROLLUP}]各參數說明如下:group_by_expression:指明分組條件group_by_expression
通常是一個列名,但不能是列的別名。數據類型為TEXT、NTEXT、IMAGE或BIT
類型的列不能作為分組條件ALL:返回所有可能的查詢結果組合,即使此組合中沒有任何滿足WHERE
子句的數據。分組的統(tǒng)計列如果不滿足查詢條件,則將由NULL值構成其數據。ALL
選項不能與CUBE或ROLLUP
選項同時使用
43CUBE:除了返回由GROUPBY
子句指定的列外,還返回按組統(tǒng)計的行。返回的結果先按分組的第一個條件列排序顯示,再按第二個條件列排序顯示,以此類推。統(tǒng)計行包括了GROUPBY
子句指定的列的各種組合的數據統(tǒng)計
ROLLUP:與CUBE
不同的是,此選項對GROUPBY
子句中的列順序敏感,它只返回第一個分組條件指定的列的統(tǒng)計行,改變列的順序會使返回的結果的行數發(fā)生變化。44例如:例:查詢工作級別為2的員工姓名,查詢結果按部門分組selecte_name,dept_idfromemployeewherejob_level='2'groupbydept_id,e_name運行結果如下e_namedept_id---------------------------李四1001張龍1002王朝100345CUBE:除了返回由GROUPBY
子句指定的列外,還返回按組統(tǒng)計的行。返回的結果先按分組的第一個條件列排序顯示,再按第二個條件列排序顯示,以此類推。統(tǒng)計行包括了GROUPBY子句指定的列的各種組合的數據統(tǒng)計Select所屬部門,性別,AVG(工資)FROM員工數據表Groupby所屬部門,性別Withcube所屬部門性別平均工資項目部男2000項目部女3000項目部null2500項目部全體員工的平均工資檢驗部男1750檢驗部女1000檢驗部null1500檢驗部全體員工的平均工資錄入部男1000錄入部null1000辦公室女3000辦公室null3000nullnull1928所有員工的平均工資null男1625所有男性的平均工資null女2333所有女性的平均工資46ROLLUP:與CUBE
不同的是,此選項對GROUPBY
子句中的列順序敏感,它只返回第一個分組條件指定的列的統(tǒng)計行,改變列的順序會使返回的結果的行數發(fā)生變化。Select所屬部門,性別,AVG(工資)FROM員工數據表Groupby所屬部門,性別Withrollup所屬部門性別平均工資項目部男2000項目部女3000項目部null2500項目部全體員工的平均工資檢驗部男1750檢驗部女1000檢驗部null1500檢驗部全體員工的平均工資錄入部男1000錄入部null1000辦公室女3000辦公室null3000nullnull1928所有員工的平均工資null男1625null女233347若希望在查詢結果總僅包含按照性別分組后取得的平均值,則需要將groupby子句中的“所屬部門”和“性別”字段的位置調換。Select所屬部門,性別,AVG(工資)FROM員工數據表Groupby性別,所屬部門Withrollup所屬部門性別平均工資項目部男2000檢驗部男1750錄入部男l(wèi)1000null男1625所有男性的平均工資項目部女1000檢驗部女l1500錄入部女1000null女2333所有女性的平均工資nullnull1928所有員工的平均工資48HAVING子句HAVING
子句指定分組搜索條件。HAVING
子句通常與GROUPBY
子句一起使用。TEXT、NTEXT和IMAGE
數據類型不能用于HAVING
子句。其語法如下HAVING<search_condition>HAVING
子句與WHERE
子句很相似,其區(qū)別在于其作用的對象不同。WHERE
子句作用于表和視圖,HAVING
子句作用于組49例如:例:查詢有多個員工的工資不低于6000的部門編號selectdept_id,count(*)fromemployeewheree_wage>=6000groupbydept_idhavingcount(*)>1運行結果如下dept_id------------------1005210073(2row(s)affected)50ORDERBY子句ORDERBY
子句指定查詢結果的排序方式。其語法如下:ORDERBY{order_by_expression[ASC|DESC]}[,...n]各參數說明如下:
order_by_expression:指定排序的規(guī)則order_by_expression
可以是表或視圖的列的名稱或別名,如果SELECT語句中沒有使用DISTINCT
選項或UNION
操作符,那么ORDERBY
子句中可以包含selectlist中沒有出現(xiàn)的列名或別名。ORDERBY
子句中也不能使用TEXT、NTEXT和IMAGE
數據類型
ASC:指明查詢結果按升序排列這是系統(tǒng)默認值
DESC:指明查詢結果按降序排列51例如:例:查詢工作級別為2的員工姓名,查詢結果按工資排序selecte_namefromemployeewherejob_level=’2’orderbye_wage運行結果如下e_name--------------------王朝李四姜上52例:查詢由編號1003的部門生產的產品編號、名稱、成本、庫存數量,結果按產品的成本降序、庫存數量升序排列selectp_id,p_name,cost,quantityfromproductswheredept_id=’1003’orderbycostdesc,quantity運行結果如下p_idp_namecostquantity----------------------------------------10030001路由器20000.0000100010030005
中繼器10000.00002000053例:查詢工資最高的三名員工的姓名和工資selecttop3e_name,e_wagefromemployeeorderbye_wagedesc運行結果如下e_namee_wage-----------------------------------------張三8000.0000大師傅
7500.0000張龍7000.0000(3row(s)affected)54COMPUTE子句COMPUTE
子句在查詢結果的末尾生成一個匯總數據行,其語法如下:COMPUTE{{AVG|COUNT|MAX|MIN|SUM}(expression)}[,...n][BYexpression[,...n]]各參數說明如下:
AVG|COUNT|MAX|MIN|SUM:以上參數與對應的函數有相同的含義,這些函數均會忽略NULL值且DISTINCT選項不能在此使用
55expression:指定需要統(tǒng)計的列的名稱,此列必須包含于SELECT列表中,且不能用別名。COMPUTE子句中也不能使用TEXT、NTEXT和IMAGE
數據類型
BYexpression:在查詢結果中生成分類統(tǒng)計的行。如果使用此選項,則必須同時使用ORDERBY
子句。expression是對應的ORDERBY
子句中的order_by_expression的子集或全集56例如:Select員工姓名,所屬部門,工資From員工數據表Orderby所屬部門Coumputesum(工資)by所屬部門注意:在加入by關鍵字及其分組字段的同時必須將這個分組字段同時作為排序條件,否則查詢會出錯。57把一列中的值進行匯總運算,返回單值的函數五個預定義的聚合函數平均值:Avg總和:Sum最小值:Min最大值:Max計數:Count
Count(*)、Count(Distinct…)數值匯總函數58匯總函數忽略NullCount:count函數將忽略對象中的空值,而count(*)函數則將所有符合條件的記錄都計算在內Sum:忽略求和對象中的空值Avg:忽略求和對象中的空值Max/Min:忽略求和對象中的空值匯總函數——
Null59例如:例:查詢公司的員工總數selectcount(*)fromemployee運行結果如下21(1row(s)affected)60例:查詢各部門中的最高工資數額selectdept_id,max(e_wage)asmax_wage/*
使用as
字符來指定統(tǒng)計列的名稱
*/fromemployeegroupbydept_id運行結果如下dept_idmax_wage----------------------------10018000.000010027000.000010034500.000061例:查詢訂貨量大于庫存量的產品名稱selectp_name,quantity,sum(o_quantity)assum_orderfromproducts,orderswhereproducts.p_id=orders.p_idgroupbyproducts.p_id,p_name,quantityhavingquantity<sum(o_quantity)orderbyproducts.p_id運行結果如下p_namequantitysum_order------------------------------------光纖
1000019000調制解調器
1800023000(2row(s)affected)62Selectcount(*)from項目數據庫Where結束日期<=‘January1,2002’Selectcount(distinct負責人)From項目數據庫Where結束日期<=‘January1,2002’注意:使用count函數可以同時使用可選關鍵字distinct來去掉重復值,而使用count(*)函數則不可以63UNION子句UNION
操作符將兩個或兩個以上的查詢結果合并為一個結果集。它與使用連接查詢合并兩個表的列是不同的,使用UNION
操作符合并查詢結果需要遵循兩個基本規(guī)則:列的數目和順序在所有查詢中必須是一致的;數據類型必須兼容其語法如下:Select語句UNION[ALL]Select語句64注意:使用union子句獲得的結果集的字段名稱與union運算符之前的select語句結果集中的字段名相同,union運算符之后的select語句結果集的字段名將被忽略。在默認情況下,union運算符將從最終結果集中刪除重復的記錄。如果希望最終結果集保留所有的記錄,則必須使用all關鍵字。65在使用union運算符時,單獨的select語句中不能包含其自己的orderby或coumpute子句只能在最后一個select語句的后面使用一個orderby或compute子句,此時,該子句將適用于最終的組合結果集若需要對查詢結果進行分組以及在分組后對結果使用having子句進行過濾,則必須在單獨的select語句中指定groupby和having子句。66例如:例:查詢計算機系的學生或者年齡不大于19歲的學生,并按年齡倒排序。Select*fromdepartmentwheresdept=“計算機”;Union;Select*fromstudentwheresage<=19orderbysagedesc67聯(lián)接查詢通過使用聯(lián)接查詢,可以根據各個數據表之間的邏輯關系從兩個或多個數據表中檢索數據。定義數據表之間的關聯(lián)方式:1在數據表中指定用于聯(lián)接的字段。典型的聯(lián)接條件是在一個數據表中指定外鍵,同時在另一個數據表中指定與其關聯(lián)的主鍵。2在select語句中指定比較各字段值時要使用的邏輯運算符。聯(lián)接的類型:內連接外聯(lián)接:左向外聯(lián)接,右向外聯(lián)接,完整外聯(lián)接交叉聯(lián)接68內連接內聯(lián)接的格式為:數據表1innerjoin數據表2on聯(lián)接表達式指定返回兩個表中所有匹配的行。Inner是缺省的連接方式
例:select*from員工數據表Innerjoin項目數據表On員工數據表.員工編號=項目數據表.負責人69外聯(lián)接:左向外聯(lián)接,右向外聯(lián)接和完整外聯(lián)接。左向外聯(lián)接的格式為:數據表1leftjoin數據表2on聯(lián)接表達式或數據表1leftouterjoin數據表2on聯(lián)接表達式注意:返回結果集中將包括數據表1中所有的記錄,而不僅僅是聯(lián)接字段所匹配的記錄。如果數據表1的某條記錄在數據表2中沒有匹配的記錄,則結果集相應記錄的有關數據表2的所有字段將為空值。例如:select*from員工數據表leftjoin項目數據表On員工數據表.員工編號=項目數據表.負責人則:檢索員工數據表中的所有記錄,并將項目數據表中負責人字段可以匹配的記錄輸出到結果集。70右向外聯(lián)接的格式為:數據表1rightjoin數據表2on聯(lián)接表達式或數據表1rightouterjoin數據表2on聯(lián)接表達式注意:返回結果集中將包括數據表2中所有的記錄,而不僅僅是聯(lián)接字段所匹配的記錄。如果數據表2的某條記錄在數據表1中沒有匹配的記錄,則結果集相應記錄的有關數據表1的所有字段將為空值。例如:select*from員工數據表rightjoin項目數據表On員工數據表.員工編號=項目數據表.負責人則:檢索項目數據表中的所有記錄,并將員工數據表中員工編號字段可以匹配的記錄輸出到結果集。71完整外聯(lián)接格式如下:數據表1fulljoin數據表2on聯(lián)接表達式或:數據表1fullouterjoin數據表2on聯(lián)接表達式結果集將包含兩個數據表中的所有記錄,當某條記錄在另一個數據表中沒有匹配記錄時,則將另一個數據表的選擇列表字段指定為空值72交叉聯(lián)接格式為:數據表1crossjoin數據表2如果在select語句中沒有使用where子句,則交叉聯(lián)接將返回數據表1和數據表2中記錄的笛卡兒乘積,即交叉聯(lián)接返回數據表1中的所有記錄,以及數據表1中的每一條記錄與數據表2中的所有記錄的組合。例如:select*from員工數據表Crossjoin項目數據表將返回員工數據表中的所有記錄,以及員工數據表中的每條記錄與項目數據表中的所有記錄的組合。73嵌套查詢嵌套查詢是指在一個外層查詢中包含有另一個內層查詢。其中,外層查詢稱為主查詢,內層查詢稱為子查詢。SQL允許多層嵌套,由內而外地進行分析,子查詢的結果作為主查詢的查找條件可以用多個簡單查詢來構成復雜查詢,以增強SQL的查詢能力子查詢中一般不使用OrderBy子句,OrderBy子句只能對最終查詢結果進行排序74子查詢(Subquery)包含子查詢的格式通常采用如下格式:Where表達式[not]in(子查詢)Where表達式比較運算符[any|all]子查詢Where[not]exists(子查詢)75返回單值的子查詢,只返回一行一列主查詢與單值子查詢之間用比較運算符進行連接運算符:>、>=、=、<=、<、<>例:找出與95001同齡的學生
Select* FromStudent Wheresage=(Selectsage FromStudent Wheresno=‘95001’)子查詢——單值比較76例:查詢訂購了產品光纖的公司名稱selectf_namefromfirmswherefirm_idin(selectfirm_idfromorderswherep_id=(selectp_idfromproductswherep_name='光纖'))orderbyfirm_id77例:查詢選修‘C01’課程的學生的學號、姓名。Selectsno,snameFromStudentWheresnoIN(Selectsno
FromSC Wherecno=‘C01’ )子查詢——In78例:查詢有工資超過7000的員工的部門名稱,查詢結果按部門編號排序selectd_namefromdepartmentwheredept_idin(selectdept_idfromemployeewheree_wage>7000)orderbydept_id79例:
查詢選修了‘數據庫’的學生的學號和姓名Selectsno,snameFromStudentWheresnoIN (Selectsno
FromSC WherecnoIN (Selectcno
FromCourse Wherecname=‘數據庫’))
子查詢——In80多值比較:多行一列父查詢與多值子查詢之間的比較需用All來連接標量值s比子查詢返回集R中的每個都大時,s>AllR為TrueAll表示所有>all、<all、<=all、>=all、<>all<>all等價于notin例:找出年齡最小的學生
Select*FromStudentWheresage<all( SelectsageFromStudent)子查詢——多值比較all81父查詢與多值子查詢之間的比較需用Some/Any來連接標量值s比子查詢返回集R中的某一個都大時s>SomeR為True或
s>AnyR為TrueSome(早期用Any)表示某一個,只要有一個即返回真>some、<some、<=some、>=some、<>some=some等價于in、<>some不等價于notin子查詢——多值比較Some/Any82例:找出不是最小年齡的學生
Select*Fromstudent Wheresage>some(Selectsage FromStudent)子查詢——多值比較83Exists+子查詢用來判斷該子查詢是否返回元組當子查詢的結果集非空時,Exists為True當子查詢的結果集為空時,Exists為False不關心子查詢的具體內容,因此用Select*子查詢——存在判斷Exists84
例:列出選修了C01課程的學生的學號、姓名
Selectsno,sname FromStudent WhereExists(Select* FromSC WhereSC.sno=Student.snoAnd cno=‘C01’) 子查詢——Exists85
例:列出沒有選C01課程的學生的學號、姓名
Selectsno,sname
FromStudent WhereNotExists (Select* FromSC WhereSC.sno=Student.snoAnd
cno=‘C01’) 子查詢——NotExists86
例:列出得過100分的學生的學號、姓名
Selectsno,sname
FromStudent WhereExists (Select* FromSC WhereSC.sno=Student.snoAnd grade=100) 子查詢——Exists87如何提高select語句的效率使用exists關鍵字檢查結果集:不要用count(*)來檢查結果集中是否包含行。使用標準聯(lián)接代替嵌套查詢:在執(zhí)行嵌套查詢時,SQLServer將先執(zhí)行內部的子查詢,然后將查詢結果返回給外部查詢作為檢索的數據源,最后執(zhí)行外部的主查詢。而在執(zhí)行包含標準聯(lián)接的查詢時,SQLServer將要執(zhí)行的僅僅是一個查詢。有效避免整表掃描:使用索引;除了缺失索引外,可能導致整表掃描的另外一種常見的情況是在like子句的匹配條
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 產教融合人才培養(yǎng)共同體的構建目標
- 三角形-三角形的特性說課稿-2023-2024學年四年級下冊數學人教版
- 2025年幼兒園中班班務計劃開頭語模板
- 2025年皮膚科醫(yī)師工作計劃
- Unit 4 Plants around us Start to read and Reading time(說課稿)-2024-2025學年人教PEP版(2024)英語三年級上冊
- 2025年學校教師教學個人工作計劃
- 畢業(yè)活動主題策劃方案合集
- Unit 2 My week Part C(說課稿)-2024-2025學年人教PEP版英語五年級上冊
- Unit 2 My name(單元整體說課稿)-2024-2025學年科普版(2024)英語三年級上冊
- 從編碼到解碼(說課稿)2024-2025學年四年級上冊信息技術蘇科版
- 2024年06月上海廣發(fā)銀行上海分行社會招考(622)筆試歷年參考題庫附帶答案詳解
- TSG 51-2023 起重機械安全技術規(guī)程 含2024年第1號修改單
- 計算機科學導論
- 2024-2025學年六上科學期末綜合檢測卷(含答案)
- 圓管鋼立柱柱吊裝施工方案
- 河南省對口升學文秘類專業(yè)課試題卷
- 醫(yī)療器械經營質量管理體系文件(全套)
- 磷酸鐵鋰電池工商業(yè)儲能項目施工組織設計方案
- 建筑節(jié)能分部工程質量驗收報告(樣本)
- 泌尿外科護理疑難病例討論
- 英格索蘭空壓機操作規(guī)程
評論
0/150
提交評論