通用SQL數據庫查詢語句範例(多表查詢)

一、 簡單查詢
  
簡單的Transact-SQL查詢只包括選擇列表、FROM子句和Where子句。它們分別說明所查詢列、查詢的表或視圖、以及搜索條件等。
  
例如,下面的語句查詢testtable表中姓名爲“張三”的nickname字段和email字段。

  
  Select nickname,email
  FROM testtable
  Where name='張三'


  
(一) 選擇列表
  
選擇列表(select_list)指出所查詢列,它可以是一組列名列表、星號、表達式、變量(包括局部變量和全局變量)等構成。
  
1、選擇所有列
  
例如,下面語句顯示testtable表中所有列的數據:

  
  Select *
  FROM testtable



2、選擇部分列並指定它們的顯示次序
  
查詢結果集合中數據的排列順序與選擇列表中所指定的列名排列順序相同。例如:

  
  Select nickname,email
  FROM testtable



3、更改列標題
  
在選擇列表中,可重新指定列標題。定義格式爲:
  
  列標題=列名
  列名 列標題
  
如果指定的列標題不是標準的標識符格式時,應使用引號定界符,例如,下列語句使用漢字顯示列標題:

  
  Select 暱稱=nickname,電子郵件=email
  FROM testtable


  
4、刪除重複行
  
Select語句中使用ALL或DISTINCT選項來顯示錶中符合條件的所有行或刪除其中重複的數據行,默認爲ALL。使用DISTINCT選項時,對於所有重複的數據行在Select返回的結果集合中只保留一行。
  
5、限制返回的行數
  
使用TOP n [PERCENT]選項限制返回的數據行數,TOP n說明返回n行,而TOP n PERCENT時,說明n是表示一百分數,指定返回的行數等於總行數的百分之幾。例如:

  
Select TOP 2 *FROM testtable Select TOP 20 PERCENT * FROM testtable




(二) FROM子句
  
FROM子句指定Select語句查詢及與查詢相關的表或視圖。在FROM子句中最多可指定256個表或視圖,它們之間用逗號分隔。
  
在FROM子句同時指定多個表或視圖時,如果選擇列表中存在同名列,這時應使用對象名限定這些列所屬的表或視圖。例如在usertable和citytable表中同時存在cityid列,在查詢兩個表中的cityid時應使用下面語句格式加以限定:

  
  Select username,citytable.cityid
  FROM usertable,citytable
  Where usertable.cityid=citytable.cityid



在FROM子句中可用以下兩種格式爲表或視圖指定別名:

  
  表名 as 別名
  表名 別名


  
例如上面語句可用表的別名格式表示爲:

  
  Select username,b.cityid
  FROM usertable a,citytable b
  Where a.cityid=b.cityid



Select不僅能從表或視圖中檢索數據,它還能夠從其它查詢語句所返回的結果集合中查詢數據。例如:

  
  Select a.au_fname+a.au_lname
  FROM authors a,titleauthor ta
  (Select title_id,title
  FROM titles
  Where ytd_sales>10000
  ) AS t
  Where a.au_id=ta.au_id
  AND ta.title_id=t.title_id



此例中,將Select返回的結果集合給予一別名t,然後再從中檢索數據。

(三) 使用Where子句設置查詢條件
  
Where子句設置查詢條件,過濾掉不需要的數據行。例如下面語句查詢年齡大於20的數據:

  
  Select *
  FROM usertable
  Where age>20



Where子句可包括各種條件運算符:
  
  比較運算符(大小比較):>、>=、=、<、<=、<>、!>、!<
  範圍運算符(表達式值是否在指定的範圍):BETWEEN…AND…
  NOT BETWEEN…AND…
  列表運算符(判斷表達式是否爲列表中的指定項):IN (項1,項2……)
  NOT IN (項1,項2……)
  模式匹配符(判斷值是否與指定的字符通配格式相符):LIKE、NOT LIKE
  空值判斷符(判斷表達式是否爲空):IS NULL、NOT IS NULL
  邏輯運算符(用於多條件的邏輯連接):NOT、AND、OR
  
1、範圍運算符例:age BETWEEN 10 AND 30相當於age>=10 AND age<=30
  
2、列表運算符例:country IN ('Germany','China')
  
3、模式匹配符例:常用於模糊查找,它判斷列值是否與指定的字符串格式相匹配。可用於char、varchar、text、ntext、datetime和smalldatetime等類型查詢。
  
可使用以下通配字符:
  
  百分號%:可匹配任意類型和長度的字符,如果是中文,請使用兩個百分號即%%。
  
  下劃線_:匹配單個任意字符,它常用來限制表達式的字符長度。
  
  方括號[]:指定一個字符、字符串或範圍,要求所匹配對象爲它們中的任一個。[^]:其取值也[] 相同,但它要求所匹配對象爲指定字符以外的任一個字符。
  
例如:
  
  限制以Publishing結尾,使用LIKE '%Publishing'
  
  限制以A開頭:LIKE '[A]%'
  
  限制以A開頭外:LIKE '[^A]%'
  
4、空值判斷符例Where age IS NULL
  
5、邏輯運算符:優先級爲NOT、AND、OR
  
(四)查詢結果排序
  
使用ORDER BY子句對查詢返回的結果按一列或多列排序。ORDER BY子句的語法格式爲:

  
  ORDER BY {column_name [ASC|DESC]} [,…n]


  
其中ASC表示升序,爲默認值,DESC爲降序。ORDER BY不能按ntext、text和image數據類型進行排序。例如:

  
  Select *
  FROM usertable
  ORDER BY age desc,userid ASC



另外,可以根據表達式進行排序。


二、 聯合查詢
  
UNION運算符可以將兩個或兩個以上上Select語句的查詢結果集合合併成一個結果集合顯示,即執行聯合查詢。UNION的語法格式爲:

  
  select_statement
  UNION [ALL] selectstatement
  [UNION [ALL] selectstatement][…n]



其中selectstatement爲待聯合的Select查詢語句。
  
ALL選項表示將所有行合併到結果集合中。不指定該項時,被聯合查詢結果集合中的重複行將只保留一行。
  
聯合查詢時,查詢結果的列標題爲第一個查詢語句的列標題。因此,要定義列標題必須在第一個查詢語句中定義。要對聯合查詢結果排序時,也必須使用第一查詢語句中的列名、列標題或者列序號。
  
在使用UNION 運算符時,應保證每個聯合查詢語句的選擇列表中有相同數量的表達式,並且每個查詢選擇表達式應具有相同的數據類型,或是可以自動將它們轉換爲相同的數據類型。在自動轉換時,對於數值類型,系統將低精度的數據類型轉換爲高精度的數據類型。
  
在包括多個查詢的UNION語句中,其執行順序是自左至右,使用括號可以改變這一執行順序。例如:
  
查詢1 UNION (查詢2 UNION 查詢3)

三、連接查詢
  
通過連接運算符可以實現多個表查詢。連接是關係數據庫模型的主要特點,也是它區別於其它類型數據庫管理系統的一個標誌。
  
在關係數據庫管理系統中,表建立時各數據之間的關係不必確定,常把一個實體的所有信息存放在一個表中。當檢索數據時,通過連接操作查詢出存放在多個表中的不同實體的信息。連接操作給用戶帶來很大的靈活性,他們可以在任何時候增加新的數據類型。爲不同實體創建新的表,爾後通過連接進行查詢。
  
連接可以在Select 語句的FROM子句或Where子句中建立,似是而非在FROM子句中指出連接時有助於將連接操作與Where子句中的搜索條件區分開來。所以,在Transact-SQL中推薦使用這種方法。
  
SQL-92標準所定義的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) 子句指出連接條件,它由被連接表中的列和比較運算符、邏輯運算符等構成。
  
無論哪種連接都不能對text、ntext和image數據類型列進行直接連接,但可以對這三種列進行間接連接。例如:

  
  Select p1.pub_id,p2.pub_id,p1.pr_info
  FROM pub_info AS p1 INNER JOIN pub_info AS p2
  ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info)


  

(一)內連接
  
內連接查詢操作列出與連接條件匹配的數據行,它使用比較運算符比較被連接列的列值。內連接分三種:
  
1、等值連接:在連接條件中使用等於號(=)運算符比較被連接列的列值,其查詢結果中列出被連接表中的所有列,包括其中的重複列。
  
2、不等連接: 在連接條件使用除等於運算符以外的其它比較運算符比較被連接的列的列值。這些運算符包括>、>=、<=、<、!>、!<和<>。
  
3、自然連接:在連接條件中使用等於(=)運算符比較被連接列的列值,但它使用選擇列表指出查詢結果集合中所包括的列,並刪除連接表中的重複列。
  
例,下面使用等值連接列出authors和publishers表中位於同一城市的作者和出版社:

  
  Select *
  FROM authors AS a INNER JOIN publishers AS p
  ON a.city=p.city



又如使用自然連接,在選擇列表中刪除authors 和publishers 表中重複列(city和state):

  
  Select a.*,p.pub_id,p.pub_name,p.country
  FROM authors AS a INNER JOIN publishers AS p
  ON a.city=p.city




(二)外連接
  
內連接時,返回查詢結果集合中的僅是符合查詢條件( Where 搜索條件或 HAVING 條件)和連接條件的行。而採用外連接時,它返回到查詢結果集合中的不僅包含符合連接條件的行,而且還包括左表(左外連接時)、右表(右外連接時)或兩個邊接表(全外連接)中的所有數據行。如下面使用左外連接將論壇內容和作者信息連接起來:

  
  Select a.*,b.* FROM luntan LEFT JOIN usertable as b
  ON a.username=b.username


  
下面使用全外連接將city表中的所有作者以及user表中的所有作者,以及他們所在的城市:

  
  Select a.*,b.*
  FROM city as a FULL OUTER JOIN user as b
  ON a.username=b.username



  
(三)交叉連接
  
交叉連接不帶Where 子句,它返回被連接的兩個表所有數據行的笛卡爾積,返回到結果集合中的數據行數等於第一個表中符合查詢條件的數據行數乘以第二個表中符合查詢條件的數據行數。例,titles表中有6類圖書,而publishers表中有8家出版社,則下列交叉連接檢索到的記錄數將等於6*8=48行。

  
  Select type,pub_name
  FROM titles CROSS JOIN publishers
  ORDER BY type

《數據庫的連接查詢》

連接的結果是從兩個或兩個以上的表的組合中挑選出符合連接條件的數據,如果數據無法滿足連接條件則將其丟棄。通常稱這種方

法爲內部連接(InnerJoin)。在內部連接中,參與連接的表的地位是平等的。與內部連接相對的方式稱爲外部連接(Outer Join)

。在外部連接中,參與連接的表有主從之分,以主表的每行數據去匹配從表的數據列,符合連接條件的數據將直接返回到結果集中

,對那些不符合連接條件的列,將被填上NULL 值後再返回到結果集中(對BIT 類型的列,由於BIT 數據類型不允許NULL 值,因此

將會被填上0 值再返回到結果中)。

     外部連接分爲左外部連接(Left Outer Join)和右外部連接(Right Outer Join)兩種。以主表所在的方向區分外部連接,主

表在左邊,則稱爲左外部連接,主表在右邊,則稱爲右外部連接。


通過連接運算符可以實現多個表查詢。連接是關係數據庫模型的主要特點,也是它區別於其它類型數據庫管理系統的一個標誌。

在關係數據庫管理系統中,表建立時各數據之間的關係不必確定,常把一個實體的所有信息存放在一個表中。當檢索數據時,通過

連接操作查詢出存放在多個表中的不同實體的信息。連接操作給用戶帶來很大的靈活性,他們可以在任何時候增加新的數據類型。

爲不同實體創建新的表,爾後通過連接進行查詢。

連接可以在Select 語句的FROM子句或Where子句中建立,似是而非在FROM子句中指出連接時有助於將連接操作與Where子句中的搜索

條件區分開來。所以,在Transact-SQL中推薦使用這種方法。

SQL-92標準所定義的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) 子句指出連接條件,它由被連接表中的列和比較運算符、邏輯運算符等構成。

無論哪種連接都不能對text、ntext和image數據類型列進行直接連接,但可以對這三種列進行間接連接


《數據庫多表連接查詢詳解》

通過連接運算符可以實現多個表查詢。連接是關係數據庫模型的主要特點,也是它區別於其它類型數據庫管理系統的一個標誌。

在關係數據庫管理系統中,表建立時各數據之間的關係不必確定,常把一個實體的所有信息存放在一個表中。當檢索數據時,通過連接操作查詢出存放在多個表中的不同實體的信息。連接操作給用戶帶來很大的靈活性,他們可以在任何時候增加新的數據類型。爲不同實體創建新的表,爾後通過連接進行查詢。

連接可以在Select 語句的FROM子句或Where子句中建立,似是而非在FROM子句中指出連接時有助於將連接操作與Where子句中的搜索條件區分開來。所以,在Transact-SQL中推薦使用這種方法。

SQL-92標準所定義的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) 子句指出連接條件,它由被連接表中的列和比較運算符、邏輯運算符等構成。
無論哪種連接都不能對text、ntext和image數據類型列進行直接連接,但可以對這三種列進行間接連接。

(一)內連接

內連接查詢操作列出與連接條件匹配的數據行,它使用比較運算符比較被連接列的列值。內連接分三種:

1、等值連接:在連接條件中使用等於號(=)運算符比較被連接列的列值,其查詢結果中列出被連接表中的所有列,包括其中的重複列。

2、不等連接: 在連接條件使用除等於運算符以外的其它比較運算符比較被連接的列的列值。這些運算符包括>、>=、<=、<、!>、!<和<>。

3、自然連接:在連接條件中使用等於(=)運算符比較被連接列的列值,但它使用選擇列表指出查詢結果集合中所包括的列,並刪除連接表中的重複列。

例,下面使用等值連接列出authors和publishers表中位於同一城市的作者和出版社:

Select *

FROM authors AS a INNER JOIN publishers AS p

ON a.city=p.city



又如使用自然連接,在選擇列表中刪除authors 和publishers 表中重複列(city和state):

Select a.*,p.pub_id,p.pub_name,p.country

FROM authors AS a INNER JOIN publishers AS p

ON a.city=p.city


(二)外連接

內連接時,返回查詢結果集合中的僅是符合查詢條件( Where 搜索條件或 HAVING 條件)和連接條件的行。而採用外連接時,它返回到查詢結果集合中的不僅包含符合連接條件的行,而且還包括左表(左外連接時)、右表(右外連接時)或兩個邊接表(全外連接)中的所有數據行。

外聯接可以是左向外聯接、右向外聯接或完整外部聯接。
在 FROM 子句中指定外聯接時,可以由下列幾組關鍵字中的一組指定:LEFT JOIN 或 LEFT OUTER JOIN;RIGHT JOIN 或 RIGHT OUTER JOIN;FULL JOIN 或 FULL OUTER JOIN。

(1)左向外聯接:左向外聯接的結果集包括 LEFT OUTER 子句中指定的左表的所有行,而不僅僅是聯接列所匹配的行。如果左表的某行在右表中沒有匹配行,則在相關聯的結果集行中右表的所有選擇列表列均爲空值。

(2)右向外聯接:右向外聯接是左向外聯接的反向聯接。將返回右表的所有行。如果右表的某行在左表中沒有匹配行,則將爲左表返回空值。

(3)完整外部聯接:完整外部聯接返回左表和右表中的所有行。當某行在另一個表中沒有匹配行時,則另一個表的選擇列表列包含空值。如果表之間有匹配行,則整個結果集行包含基表的數據值。

僅當至少有一個同屬於兩表的行符合聯接條件時,內聯接才返回行。內聯接消除與另一個表中的任何行不匹配的行。而外聯接會返回 FROM 子句中提到的至少一個表或視圖的所有行,只要這些行符合任何 Where 或 HAVING 搜索條件。將檢索通過左向外聯接引用的左表的所有行,以及通過右向外聯接引用的右表的所有行。完整外部聯接中兩個表的所有行都將返回。

如下面使用左外連接將論壇內容和作者信息連接起來:

Select a.*,b.* FROM luntan LEFT JOIN usertable as b

ON a.username=b.username



下面使用全外連接將city表中的所有作者以及user表中的所有作者,以及他們所在的城市:

Select a.*,b.*

FROM city as a FULL OUTER JOIN user as b

ON a.username=b.username


(三)交叉連接

交叉連接不帶Where 子句,它返回被連接的兩個表所有數據行的笛卡爾積,返回到結果集合中的數據行數等於第一個表中符合查詢條件的數據行數乘以第二個表中符合查詢條件的數據行數。

例,titles表中有6類圖書,而publishers表中有8家出版社,則下列交叉連接檢索到的記錄數將等

於6*8=48行。

Select type,pub_name

FROM titles CROSS JOIN publishers

orDER BY type  

 

 

 

http://www.wzms.net/u/144/archives/2007/2764.htm

發佈了56 篇原創文章 · 獲贊 14 · 訪問量 29萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章