???????????????????????????
?
一、
簡單查詢
?
簡單的
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
[Post=0][/Post]?
?
?
?
-
作者:
biliang
訪問統計:
12
2005
年
07
月
2
日
,
星期六
23:00
加入博采
Trackback
你可以使用這個鏈接引用該篇文章
http://publishblog.blogchina.com/blog/tb.b?diaryID=2146575
回復
???
發布人:
?
郵箱:
?
主 頁:
?
評論內容:
???????????
?
??
?
2003-2004 BlogChina.COM All rights reserved
Powered by BlogDriver 2.1
|----------------------------------------------------------------------------------------|
版權聲明 版權所有 @zhyiwww
引用請注明來源 http://www.tkk7.com/zhyiwww
|----------------------------------------------------------------------------------------|
posted on 2006-06-02 19:02
zhyiwww 閱讀(310)
評論(0) 編輯 收藏 所屬分類:
database