高級查詢技術主要是涉及多個表的鏈接查詢技術嵌入SELECT語句的子查詢技術把多個查詢聯合起來的聯合技術等
連接查詢
需要同時從兩個或者連個以上的表中檢索數據鏈接就是允許同時從兩個表或者兩個以上的表中檢索數據指定這些表中的某個或者某些列作為連接條件在SQL Server中可以使用兩種連接語法的形式一種是ANSI鏈接語法形式這是連接條件出現在FROM子句中;另外一種SQL Server鏈接語法形式這是連接條件出現在WHERE條件中
ANSI鏈接
鏈接錯做可以同時查詢兩個或者多個表中的數據所生成的結果集包含多個表中的字段需要使用連個表中共同擁有的字段以連接多個表
進行連接操作時SQL一行一行地比較所指定的字段然後把比較後的結果和滿足條件的數據合並並生成新的記錄
有三種連接方式內連接外連接和交叉連接在一個SELECT語句中可以連接多個表;鏈接通過擴展SELECT語句的FROM字句增加了兩個關鍵字JOIN和ON
JOIN指定要了鏈接的表
ON指定這些表共同擁有的字段
在表的主鍵和外部鍵的基礎上指定連接條件
ANSI鏈接語法形式如下所示
SELECT table_namecolumn_name table_namecolumn_name……
FROM { table_name[ join_type] JOIN table_name ON search_conditions}
WHERE[ search_conditions]
其中[ join_type ]可以為如下三個關鍵字形式
INNER(內連接)鏈接查詢結果集中僅包含滿足條件的行內連接是SQL Server缺省的連接方式可以把INNER JOIN簡寫成 JOIN;
OUTER(外連接)鏈接查詢結果集中既包含哪些滿足條件的行還包含其中某個表的全部行有三種形式的外連接左外連接右外連接全外連接
例如已經選修了號課程的同學信息的示例該示例涉及到了學生表和選修課
SELECT 學生表
FROM 學生表 JOIN 選課表 ON 學生表學號 選課表學號
WHERE 選課表 課程號=
SQL Server鏈接
多表連接可以在FROM子句後直接指定多個表語義上表示從這幾個表的笛卡爾積中檢索數據可以用WHERE子句設定過濾條件
SQL Server鏈接語法形式如下
SELECT table_namecolumn_nametable_namecolumn_name……
FROM { table_nametable_name……}
WHERE table_namecolumn_name join_operator table_namecolumn_name
在此種語法形式中FROM子句列出了連接時所使用到的全部表名WHERE子句指定哪些行應該出現在結果集中即用WHERE子句設定過濾條件在WHERE子句中在兩個連接的列中使用鏈接運算符
例如檢索出至少已經有一門課程及格的同學的信息示例
SELECT DISTINCT 學生表 *
FROM 學生表 選課表
WHERE 學生表學號=選課表學號 AND 選課表成績=
子查詢
子查詢是一系列SELECT語句SELECT語句可以嵌套在其他許多語句中例如SELECTINSERTUPDATEDELETE等這些嵌套的SELECT語句就稱為子查詢子查詢可以把一個復雜的查詢分解成一系列的邏輯步驟這樣就可以用一個單個的語句解決一個復雜的查詢問題當一個查詢依賴於另一個查詢的結果時子查詢會很有用
使用子查詢時應注意
子查詢要用括號起來
只需要一個值或一系列的值就可以用子查詢代替一個表達式
子查詢中不能查詢包含數據類型是text或image的字段
子查詢中也可以再包含子查詢嵌套可以多至層
把子查詢用作派生的表
可以用子查詢產生一個派生的表用於代替FROM子句中的表派生表示FROM子句中子查詢的一個特殊用法用一個別名或用戶自定義的名字來引用這個派生表FROM子句中的子查詢將返回一個結果集這個結果集所形成的表將被外層SELECT語句使用
例如內層查詢用子查詢產生了一個派生的表外層查詢將使用內層查詢的結果集在功能上派生表本身就等同於一個完整的查詢
SLECT A *
FROM select 學號姓名年齡 from 學生表
Where 班級=‘GZ計’ as a
把子查詢用作表達式
在TSQL中所有使用表達式的地方都可以用子查詢來代替此時子查詢必須返回單個的值或某一個字段的值子查詢可以返回一系列的值來代替出現在WHERE子句中的IN關鍵字的表達式
例如查詢GZ計班同學的平均年齡以及每個同學年齡與平均年齡的差
SELECT avg(年齡) FROM 學生表 as 平均年齡
其計算結果作為選擇列表中的一個輸出列並作為算術表達式的一部分輸出
年齡(SELECT avg(年齡) FROM 學生表) as 年齡差
相關子查詢
相關子查詢可被用作動態表達式這個表達式的值相對於外層查詢的每一行而變化查詢處理器為外層查詢的每一個記錄計算子查詢的值一次一行而這個子查詢每次都會被作為一個表達式而被計算並返回給外層查詢相關子查詢是動態執行的子查詢和外層查詢間的一個非常有效的聯合
使用相關子查詢時內層子查詢被反復執行外層查詢有多少記錄內層查詢就被齒形多少次
例如查詢已選修課程號的且成績在分以上的同學的學號及姓名
SELECT 學號 姓名
FROM 學生表
WHERE <=( SELECT 成績
FROM 選課表
WHERE 學生表學號=選課表學號 AND 課程號=)
使用EXISTS和NOT EXISTS操作符
在相關子查詢中可以使用EXISTS和NOT EXISTS操作符判斷某個值是否在一系列的值中SQL Server處理帶有EXISTS和NOT EXISTS操作符的子查詢時
外層查詢測試子查詢返回的記錄是否存在
基於查詢所指定的條件子查詢返回TRUE或FALSE
子查詢不產生任何數據
例如同時選修了號課程和號課程的同學的信息
SELECT 學號姓名班級
FROM 學生表
WHERE EXISTS(SELECT * FROM 選課表
WHERE 學號=學生表學號 AND 課程號=)
AND EXISTS(SELECT * FROM 選課表
WHERE 學號=學生表學號 AND 課程號=)
① 找外層表“學生表”的第行根據其“學號”值處理內層查詢
② 用外層的“學號”與內層表“選課表”的“學號”比較由此決定外層條件的真假如果為真則此記錄為符合條件的結果反之則不輸出
③ 順序處理外層表“學生表”中的第行
檢索出每一門選修課都幾個的同學信息
SELECT * FROM 學生表 WHERE
NOT EXISTS( SELECT * FROM 選課表
WHERE 學生表學號=選課表學號 AND 成績<)
AND EXISTS( SELECT * FROM 選課表
WHERE 學生表學號=選課表學號)
使用TOP限制結果集
在使用SELECT語句進行查詢時有時我們希望列出前幾個結果而不是全部結果例如競賽時可能只取成績最高的前三名這時就需要使用TOP關鍵字來選取輸出的結果
使用TOP的格式為
SELECT TOP n[ percent] [with ties] 查詢列表
其中
n為非負整數
TOP n表示取查詢結果的前n行
TOP n percent表示取查詢結果的前n%行
With ties表示包括並列的結果
例如檢索出總分在前位的同學的學號及其總分
SELECT TOP WITH TIES 學號 SUM(成績) AS 總分
FROM 選課表
GROUP BY 學號
ORDER BY 總分 DESC
使用TOP時注意最好與ORDER BY子句一起使用因為這樣的前幾名才有意義但當使用WITH TIES時要求必須使用ORDER BY子句
合並多個結果集
可以將兩個或多個查詢的結果組合為一個結果集這就是合並多個屆國際的含義使用UNION可以實現合並多個查詢結果集的目的作用UNION的格式為
SELECT 語句
UNION
SELECT 語句
UNION [ALL]
……
SELECT 語句n
使用UNION應注意幾點
在默認情況下UNION運算符刪除全部空余如果使用ALL選項那麼空余行不刪除
所有查詢語句中的列數和列的順序必須相同
所有查詢語句中的對應列的數據類型必須兼容
如果在UNION語句中包含一個ORDER BY子句那麼整個結果集都要排序
在結果集中列名來自第個SELECT子句
例如對GZ計班和GZ計班學生的查詢結果合並為一個結果集
SELECT * FROM 學生表 WHERE 班級=‘GZ計’
UNION
SELECT * FROM 學生表 WHERE 班級=‘GZ計’
From:http://tw.wingwit.com/Article/program/MySQL/201311/29530.html