SQL 语言基础课件_第1页
SQL 语言基础课件_第2页
SQL 语言基础课件_第3页
SQL 语言基础课件_第4页
SQL 语言基础课件_第5页
已阅读5页,还剩90页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1

SQL語言基礎SQL概述SQL(StructuredqueryLanguage,結構化查詢語言),功能包括查詢、操縱、定義、控制。功能豐富、語言簡潔、使用靈活,倍受歡迎。1974年由Boyce,Chamberlin提出,1975年在IBM公司的SystemR上首次實現。原型稱為SEQUEL(StructuredEnglishQUEryLanguage).1986年ANSISQL-86標準,是第一個SQL標準。1987年成為國際標準。1992年SQL-92標準(簡稱SQL2)。21999年SQL-99標準(簡稱SQL3)。增加了對對象關係模型的支持。目前僅部分實現。最流行的國際標準資料庫語言。主要特點:SQL是非結構化的語言,使用SQL查詢資料庫時,只需要告訴它做什麼而不用告訴它如何去做。SQL本身不提供任何程式流程控制結構,而是通過PL/SQL提供SQL語言的過程化功能SQL提供相對固定的數據類型,一般不需要擴展SQL本身十分靈活,方便易學。3標準SQL只包含9種語句:數據查詢:select數據定義:create,drop,alter數據操縱:insert,update,delete數據控制:grant,revoke4數據定義語言(DDL),用於定義數據結構數據操縱語言(DML),用於檢索和修改數據結構數據控制語言(DCL),用於規定資料庫用戶的各種許可權資料庫事務處理,用來保證資料庫的完整性SQL語言分類5SQL語言分類數據定義語言(DDL):用於定義數據結構能使用戶完成下列任務創建資料庫對象刪除資料庫對象更改資料庫對象6常用的DDL語句包括:CreateTable:創建資料庫表CreateIndex:創建資料庫表的索引DropTable:刪除資料庫表DropIndex:刪除資料庫表的索引Truncate:刪除表中所有行AlterTable:增加表列,重定義表列,更改存儲分配AlterTableADDCONSTRAINT:在已有的表上增加約束7數據操縱語言(DML):允許用戶對數據庫中的數據進行Insert,Update,Delete和Select等操作常用DML語句包括:Insert:增加數據行到表Delete:從表中刪除數據行Update:更改表中數據Select:從表中或視圖中檢索數據行8數據控制語言(DCL):用於規定資料庫用戶的各種許可權常用的數據控制語句包括:GRANT:將許可權或角色授予用戶或其他角色REVOKE:從用戶或資料庫角色回收許可權SetRole:禁止或允許一個角色9資料庫事務控制:用來保證資料庫的完整性常用的事務處理語句包括:COMMITWORK:把當前事務所作的更改永久化(寫入磁片)ROLLBACK:作廢上次提交以來的所有更改10事務:指作為單個邏輯工作單元執行的一系列操作,而這些邏輯工作單元需要具有原子性,一致性,隔離性和持久性四個屬性。原子性:指事務必須是原子工作單元,即對於事務所進行數據修改,要麼全都執行,要麼全都不執行11一致性:指事務在完成時,必須使所有的數據都保持一致性狀態,而且在相關資料庫中,所有規則都必須應用於事務的修改,以保持所有數據的完整性。事務結束時,所有的內部數據結構都必須是正確的。12隔離性:指由併發事務所做的修改必須與任何其他併發事務所做的修改相隔離。事務查看數據時數據所處的狀態,要麼是被另一併發事務修改之前的狀態,要麼是被另一事務修改之後的狀態,即事務不會查看正在由另一個併發事務正在修改的數據。持久性:指事務完成之後,它對於系統的影響是永久性的,即使出現系統故障也是如此。13SQL語句的基本語法基本語法如下:每條SQL語句必須以分號結束每條SQL語句可以單獨寫成一行,也可以分成若干行SQL語句對大小寫不敏感,對於SQL語句的關鍵字(如Insert等),表名,列名等,可以大小寫混合;但對列的內容則是大小寫敏感的。14對象命名約定SQLServer用三段式名字標識對象:<資料庫名>.<所有者名>.<對象名>前兩者可以省略,系統自動有一個默認值。資料庫名的默認值是當前資料庫,所有者名的默認值是資料庫的所有者(dbo)例如:在pubs資料庫中的authors表的所有者是dbo,它可以在多個數據庫中按如下方法引用:pubs.dbo.authorsPubs.authors15別名:使用別名的主要目的是增加select語句的可讀性。可使用如下語句指派數據表的別名:數據表名稱as數據表別名16例如:usesampleSelecte.員工編號,e.員工姓名From員工數據表ase注意:如果為數據表指定了別名,則在相應的T-SQL語句中,對該數據表的所有顯式引用都必須使用別名,而不能使用數據表名。例如:Select員工數據表.員工編號,e.員工姓名From員工數據表ase17SELECT語句數據檢索是資料庫中最頻繁執行的活動在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表示需要檢索的字段的列表,字段名稱之間用逗號分隔。這個列表中既可以包含數據源表或視圖中的字段名稱,還可以包含其他運算式。如用*,則系統將返回數據表中的所有字段。21ALL:指明查詢結果中可以顯示值相同的列ALL是系統默認的

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

子句中指定了計算列,在新表中對應的列則不是計算列,而是一個實際存儲在表中的列,其中的數據由執行SELECT...INTO

語句時計算得出。26FROM子句FROM

子句指定需要進行數據查詢的表只要SELECT

子句中有要查詢的列就必須使用FROM

子句其語法如下FROM{<table_source>}[,...n]table_source:指明SELECT

語句要用到的表、視圖等數據源,該列表中的數據表名和視圖名之間使用逗號分隔。27From子句還可以指定數據表或視圖之間聯接的類型,這些類型將決定於on子句中指定的聯接條件。例如: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,就需要使用轉義字元來區分通配符與實際存在的字元。其格式如下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

子句的數據。分組的統計列如果不滿足查詢條件,則將由NULL值構成其數據。ALL

選項不能與CUBE或ROLLUP

選項同時使用43CUBE:除了返回由GROUPBY

子句指定的列外,還返回按組統計的行。返回的結果先按分組的第一個條件列排序顯示,再按第二個條件列排序顯示,以此類推。統計行包括了GROUPBY

子句指定的列的各種組合的數據統計

ROLLUP:與CUBE

不同的是,此選項對GROUPBY

子句中的列順序敏感,它只返回第一個分組條件指定的列的統計行,改變列的順序會使返回的結果的行數發生變化。44例如:例:查詢工作級別為2的員工姓名,查詢結果按部門分組selecte_name,dept_idfromemployeewherejob_level='2'groupbydept_id,e_name運行結果如下e_namedept_id---------------------------李四1001張龍1002王朝100345CUBE:除了返回由GROUPBY

子句指定的列外,還返回按組統計的行。返回的結果先按分組的第一個條件列排序顯示,再按第二個條件列排序顯示,以此類推。統計行包括了GROUPBY子句指定的列的各種組合的數據統計Select所屬部門,性別,AVG(工資)FROM員工數據表Groupby所屬部門,性別Withcube所屬部門性別平均工資專案部男2000專案部女3000專案部null2500專案部全體員工的平均工資檢驗部男1750檢驗部女1000檢驗部null1500檢驗部全體員工的平均工資錄入部男1000錄入部null1000辦公室女3000辦公室null3000nullnull1928所有員工的平均工資null男1625所有男性的平均工資null女2333所有女性的平均工資46ROLLUP:與CUBE

不同的是,此選項對GROUPBY

子句中的列順序敏感,它只返回第一個分組條件指定的列的統計行,改變列的順序會使返回的結果的行數發生變化。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錄入部男l1000null男1625所有男性的平均工資專案部女1000檢驗部女l1500錄入部女1000null女2333所有女性的平均工資nullnull1928所有員工的平均工資48HAVING子句HAVING

子句指定分組搜索條件。HAVING

子句通常與GROUPBY

子句一起使用。TEXT、NTEXT和IMAGE

數據類型不能用於HAVING

子句。其語法如下HAVING<search_condition>HAVING

子句與WHERE

子句很相似,其區別在於其作用的對象不同。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:指定排序的規則order_by_expression

可以是表或視圖的列的名稱或別名,如果SELECT語句中沒有使用DISTINCT

選項或UNION

操作符,那麼ORDERBY

子句中可以包含selectlist中沒有出現的列名或別名。ORDERBY

子句中也不能使用TEXT、NTEXT和IMAGE

數據類型

ASC:指明查詢結果按昇冪排列這是系統默認值

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:指定需要統計的列的名稱,此列必須包含於SELECT列表中,且不能用別名。COMPUTE子句中也不能使用TEXT、NTEXT和IMAGE

數據類型

BYexpression:在查詢結果中生成分類統計的行。如果使用此選項,則必須同時使用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

字元來指定統計列的名稱

*/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

操作符合並查詢結果需要遵循兩個基本規則:列的數目和順序在所有查詢中必須是一致的;數據類型必須相容其語法如下: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聯接查詢通過使用聯接查詢,可以根據各個數據表之間的邏輯關係從兩個或多個數據表中檢索數據。定義數據表之間的關聯方式:1在數據表中指定用於聯接的字段。典型的聯接條件是在一個數據表中指定外鍵,同時在另一個數據表中指定與其關聯的主鍵。2在select語句中指定比較各字段值時要使用的邏輯運算符。聯接的類型:內連接外聯接:左向外聯接,右向外聯接,完整外聯接交叉聯接68內連接內聯接的格式為:數據表1innerjoin數據表2on聯接運算式指定返回兩個表中所有匹配的行。Inner是缺省的連接方式

例:select*from員工數據表Innerjoin專案數據表On員工數據表.員工編號=專案數據表.負責人69外聯接:左向外聯接,右向外聯接和完整外聯接。左向外聯接的格式為:數據表1leftjoin數據表2on聯接運算式或數據表1leftouterjoin數據表2on聯接運算式注意:返回結果集中將包括數據表1中所有的記錄,而不僅僅是聯接字段所匹配的記錄。如果數據表1的某條記錄在數據表2中沒有匹配的記錄,則結果集相應記錄的有關數據表2的所有字段將為空值。例如:select*from員工數據表leftjoin專案數據表On員工數據表.員工編號=專案數據表.負責人則:檢索員工數據表中的所有記錄,並將專案數據表中負責人字段可以匹配的記錄輸出到結果集。70右向外聯接的格式為:數據表1rightjoin數據表2on聯接運算式或數據表1rightouterjoin數據表2on聯接運算式注意:返回結果集中將包括數據表2中所有的記錄,而不僅僅是聯接字段所匹配的記錄。如果數據表2的某條記錄在數據表1中沒有匹配的記錄,則結果集相應記錄的有關數據表1的所有字段將為空值。例如:select*from員工數據表rightjoin專案數據表On員工數據表.員工編號=專案數據表.負責人則:檢索專案數據表中的所有記錄,並將員工數據表中員工編號字段可以匹配的記錄輸出到結果集。71完整外聯接格式如下:數據表1fulljoin數據表2on聯接運算式或:數據表1fullouterjoin數據表2on聯接運算式結果集將包含兩個數據表中的所有記錄,當某條記錄在另一個數據表中沒有匹配記錄時,則將另一個數據表的選擇列表字段指定為空值72交叉聯接格式為:數據表1crossjoin數據表2如果在select語句中沒有使用where子句,則交叉聯接將返回數據表1和數據表2中記錄的笛卡兒乘積,即交叉聯接返回數據表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(*)來檢查結果集中是否包含行。使用標準聯接代替嵌套查詢:在執行嵌套查詢時,SQLServer將先執行內部的子查詢,然後將查詢結果返回給外部查詢作為檢索的數據源,最後執行外部的主查詢。而在執行包含標準聯接的查詢時,SQLServer將要執行的僅僅是一個查詢。有效避免整表掃描:使用索引;除了缺失索引外,可能導致整表掃描的另外一種常見的情況是在like子句的匹

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论