天天看點

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 别名

  表名 别名

  

  (二) 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