一 簡單查詢
簡單的TransactSQL查詢只包括選擇列表FROM子句和WHERE子句它們分別說明所查詢列查詢的表或視圖以及搜索條件等
例如下面的語句查詢testtable表中姓名為張三的nickname字段和email字段
SELECT nicknameemail
FROM testtable
WHERE name=張三
(一) 選擇列表
選擇列表(select_list)指出所查詢列它可以是一組列名列表星號表達式變量(包括局部變量和全局變量)等構成
選擇所有列
例如下面語句顯示testtable表中所有列的數據
SELECT *
FROM testtable
選擇部分列並指定它們的顯示次序
查詢結果集合中數據的排列順序與選擇列表中所指定的列名排列順序相同
例如
SELECT nicknameemail
FROM testtable
更改列標題
在選擇列表中可重新指定列標題定義格式為
列標題=列名
列名 列標題
如果指定的列標題不是標准的標識符格式時應使用引號定界符例如下列語句使用漢字顯示列標題
SELECT 昵稱=nickname電子郵件=email
FROM testtable
刪除重復行
SELECT語句中使用ALL或DISTINCT選項來顯示表中符合條件的所有行或刪除其中重復的數據行默認為ALL使用DISTINCT選項時對於所有重復的數據行在SELECT返回的結果集合中只保留一行
限制返回的行數
使用TOP n [PERCENT]選項限制返回的數據行數TOP n說明返回n行而TOP n PERCENT時說明n是表示一百分數指定返回的行數等於總行數的百分之幾
例如
SELECT TOP *FROM testtable SELECT TOP PERCENT * FROM testtable
(二) FROM子句
FROM子句指定SELECT語句查詢及與查詢相關的表或視圖在FROM子句中最多可指定個表或視圖它們之間用逗號分隔
在FROM子句同時指定多個表或視圖時如果選擇列表中存在同名列這時應使用對象名限定這些列所屬的表或視圖例如在usertable和citytable表中同時存在cityid列在查詢兩個表中的cityid時應使用下面語句格式加以限定
SELECT usernamecitytablecityid
FROM usertablecitytable
WHERE usertablecityid=citytablecityid
在FROM子句中可用以下兩種格式為表或視圖指定別名
表名 as 別名
表名 別名
例如上面語句可用表的別名格式表示為
SELECT usernamebcityid
FROM usertable acitytable b
WHERE acityid=bcityid
SELECT不僅能從表或視圖中檢索數據它還能夠從其它查詢語句所返回的結果集合中查詢數據
例如
SELECT aau_fname+aau_lname
FROM authors atitleauthor ta
(SELECT title_idtitle
FROM titles
WHERE ytd_sales>
) AS t
WHERE aau_id=taau_id
AND tatitle_id=ttitle_id
此例中將SELECT返回的結果集合給予一別名t然後再從中檢索數據
(三) 使用WHERE子句設置查詢條件
WHERE子句設置查詢條件過濾掉不需要的數據行例如下面語句查詢年齡大於的數據
SELECT *
FROM usertable
WHERE age>
WHERE子句可包括各種條件運算符
比較運算符(大小比較)>>==<<=<>!>!<
范圍運算符(表達式值是否在指定的范圍)BETWEEN…AND…
NOT BETWEEN…AND…
列表運算符(判斷表達式是否為列表中的指定項)IN (項項……)
NOT IN (項項……)
模式匹配符(判斷值是否與指定的字符通配格式相符):LIKENOT LIKE
空值判斷符(判斷表達式是否為空)IS NULLNOT IS NULL
邏輯運算符(用於多條件的邏輯連接)NOTANDOR
范圍運算符例age BETWEEN AND 相當於age>= AND age<=
列表運算符例country IN (GermanyChina)
模式匹配符例常用於模糊查找它判斷列值是否與指定的字符串格式相匹配可用於charvarchartextntextdatetime和smalldatetime等類型查詢
可使用以下通配字符
百分號%可匹配任意類型和長度的字符如果是中文請使用兩個百分號即%%
下劃線_匹配單個任意字符它常用來限制表達式的字符長度
方括號[]指定一個字符字符串或范圍要求所匹配對象為它們中的任一個[^]其取值也[] 相同但它要求所匹配對象為指定字符以外的任一個字符
例如
限制以Publishing結尾使用LIKE %Publishing
限制以A開頭LIKE [A]%
限制以A開頭外LIKE [^A]%
空值判斷符例WHERE age IS NULL
邏輯運算符優先級為NOTANDOR
(四)查詢結果排序
使用ORDER BY子句對查詢返回的結果按一列或多列排序ORDER BY子句的語法格式為
ORDER BY {column_name [ASC|DESC]} […n]
其中ASC表示升序為默認值DESC為降序ORDER BY不能按ntexttext和image數據類型進行排序
例如
SELECT *
FROM usertable
ORDER BY age descuserid ASC
另外可以根據表達式進行排序
二 聯合查詢
UNION運算符可以將兩個或兩個以上上SELECT語句的查詢結果集合合並成一個結果集合顯示即執行聯合查詢UNION的語法格式為
select_statement
UNION [ALL] selectstatement
[UNION [ALL] selectstatement][…n]
其中selectstatement為待聯合的SELECT查詢語句
ALL選項表示將所有行合並到結果集合中不指定該項時被聯合查詢結果集合中的重復行將只保留一行
聯合查詢時查詢結果的列標題為第一個查詢語句的列標題因此要定義列標題必須在第一個查詢語句中定義要對聯合查詢結果排序時也必須使用第一查詢語句中的列名列標題或者列序號
在使用UNION 運算符時應保證每個聯合查詢語句的選擇列表中有相同數量的表達式並且每個查詢選擇表達式應具有相同的數據類型或是可以自動將它們轉換為相同的數據類型在自動轉換時對於數值類型系統將低精度的數據類型轉換為高精度的數據類型
在包括多個查詢的UNION語句中其執行順序是自左至右使用括號可以改變這一執行順序例如
查詢 UNION (查詢 UNION 查詢)
三連接查詢
通過連接運算符可以實現多個表查詢連接是關系數據庫模型的主要特點也是它區別於其它類型數據庫管理系統的一個標志
在關系數據庫管理系統中表建立時各數據之間的關系不必確定常把一個實體的所有信息存放在一個表中當檢索數據時通過連接操作查詢出存放在多個表中的不同實體的信息連接操作給用戶帶來很大的靈活性他們可以在任何時候增加新的數據類型為不同實體創建新的表爾後通過連接進行查詢
連接可以在SELECT 語句的FROM子句或WHERE子句中建立似是而非在FROM子句中指出連接時有助於將連接操作與WHERE子句中的搜索條件區分開來所以在TransactSQL中推薦使用這種方法
SQL標准所定義的FROM子句的連接語法格式為
FROM join_table join_type join_table
[ON (join_condition)]
其中join_table指出參與連接操作的表名連接可以對同一個表操作也可以對多表操作對同一個表操作的連接又稱做自連接
join_type 指出連接類型可分為三種內連接外連接和交叉連接內連接(INNER JOIN)使用比較運算符進行表間某(些)列數據的比較操作並列出這些表中與連接條件相匹配的數據行根據所使用的比較方式不同內連接又分為等值連接自然連接和不等連接三種外連接分為左外連接(LEFT OUTER JOIN或LEFT JOIN)右外連接(RIGHT OUTER JOIN或RIGHT JOIN)和全外連接(FULL OUTER JOIN或FULL JOIN)三種與內連接不同的是外連接不只列出與連接條件相匹配的行而是列出左表(左外連接時)右表(右外連接時)或兩個表(全外連接時)中所有符合搜索條件的數據行
交叉連接(CROSS JOIN)沒有WHERE 子句它返回連接表中所有數據行的笛卡爾積其結果集合中的數據行數等於第一個表中符合查詢條件的數據行數乘以第二個表中符合查詢條件的數據行數
連接操作中的ON (join_condition) 子句指出連接條件它由被連接表中的列和比較運算符邏輯運算符等構成
無論哪種連接都不能對textntext和image數據類型列進行直接連接但可以對這三種列進行間接連接例如
SELECT ppub_idppub_idppr_info
FROM pub_info AS p INNER JOIN pub_info AS p
ON DATALENGTH(ppr_info)=DATALENGTH(ppr_info)
(一)內連接
內連接查詢操作列出與連接條件匹配的數據行它使用比較運算符比較被連接列的列值內連接分三種
等值連接在連接條件中使用等於號(=)運算符比較被連接列的列值其查詢結果中列出被連接表中的所有列包括其中的重復列
不等連接 在連接條件使用除等於運算符以外的其它比較運算符比較被連接的列的列值這些運算符包括>>=<=<!>!<和<>
自然連接在連接條件中使用等於(=)運算符比較被連接列的列值但它使用選擇列表指出查詢結果集合中所包括的列並刪除連接表中的重復列
例下面使用等值連接列出authors和publishers表中位於同一城市的作者和出版社
SELECT *
FROM authors AS a INNER JOIN publishers AS p
ON acity=pcity
又如使用自然連接在選擇列表中刪除authors 和publishers 表中重復列(city和state)
SELECT a*ppub_idppub_namepcountry
FROM authors AS a INNER JOIN publishers AS p
ON acity=pcity
(二)外連接
內連接時返回查詢結果集合中的僅是符合查詢條件( WHERE 搜索條件或 HAVING 條件)和連接條件的行而采用外連接時它返回到查詢結果集合中的不僅包含符合連接條件的行而且還包括左表(左外連接時)右表(右外連接時)或兩個邊接表(全外連接)中的所有數據行如下面使用左外連接將論壇內容和作者信息連接起來
SELECT a*b* FROM luntan LEFT JOIN usertable as b
ON ausername=busername
下面使用全外連接將city表中的所有作者以及user表中的所有作者以及他們所在的城市
SELECT a*b*
FROM city as a FULL OUTER JOIN user as b
ON ausername=busername
(三)交叉連接
交叉連接不帶WHERE 子句它返回被連接的兩個表所有數據行的笛卡爾積返回到結果集合中的數據行數等於第一個表中符合查詢條件的數據行數乘以第二個表中符合查詢條件的數據行數例titles表中有類圖書而publishers表中有家出版社則下列交叉連接檢索到的記錄數將等
於*=行
SELECT typepub_name
FROM titles CROSS JOIN publishers
ORDER BY type
From:http://tw.wingwit.com/Article/program/SQL/201311/16231.html