???????????????????????????
?
一、
簡(jiǎn)單查詢
?
簡(jiǎn)單的
Transact-SQL
查詢只包括選擇列表、
FROM
子句和
WHERE
子句。它們分別說(shuō)明所查詢列、查詢的表或視圖、以及搜索條件等。
?
例如,下面的語(yǔ)句查詢
testtable
表中姓名為“張三”的
nickname
字段和
email
字段。
?
SELECT nickname,email
FROM testtable
WHERE name='
張三
'?
?
(
一
)
選擇列表
?
選擇列表
(select_list)
指出所查詢列,它可以是一組列名列表、星號(hào)、表達(dá)式、變量
(
包括局部變量和全局變量
)
等構(gòu)成。
?
1
、選擇所有列
?
例如,下面語(yǔ)句顯示
testtable
表中所有列的數(shù)據(jù):
?
SELECT *
FROM testtable?
?
2
、選擇部分列并指定它們的顯示次序
?
查詢結(jié)果集合中數(shù)據(jù)的排列順序與選擇列表中所指定的列名排列順序相同。
?
例如:
?
SELECT nickname,email
FROM testtable?
?
3
、更改列標(biāo)題
?
在選擇列表中,可重新指定列標(biāo)題。定義格式為:
?
列標(biāo)題
=
列名
列名
列標(biāo)題
?
如果指定的列標(biāo)題不是標(biāo)準(zhǔn)的標(biāo)識(shí)符格式時(shí),應(yīng)使用引號(hào)定界符,例如,下列語(yǔ)句使用漢字顯示列標(biāo)題:
?
SELECT
昵稱
=nickname,
電子郵件
=email
FROM testtable?
?
4
、刪除重復(fù)行
?
SELECT
語(yǔ)句中使用
ALL
或
DISTINCT
選項(xiàng)來(lái)顯示表中符合條件的所有行或刪除其中重復(fù)的數(shù)據(jù)行,默認(rèn)為
ALL
。使用
DISTINCT
選項(xiàng)時(shí),對(duì)于所有重復(fù)的數(shù)據(jù)行在
SELECT
返回的結(jié)果集合中只保留一行。
?
5
、限制返回的行數(shù)
?
使用
TOP n [PERCENT]
選項(xiàng)限制返回的數(shù)據(jù)行數(shù),
TOP n
說(shuō)明返回
n
行,而
TOP n PERCENT
時(shí),說(shuō)明
n
是表示一百分?jǐn)?shù),指定返回的行數(shù)等于總行數(shù)的百分之幾。
?
例如:
?
SELECT TOP 2 *FROM testtable SELECT TOP 20 PERCENT * FROM testtable
?
(
二
)FROM
子句
?
FROM
子句指定
SELECT
語(yǔ)句查詢及與查詢相關(guān)的表或視圖。在
FROM
子句中最多可指定
256
個(gè)表或視圖,它們之間用逗號(hào)分隔。
?
在
FROM
子句同時(shí)指定多個(gè)表或視圖時(shí),如果選擇列表中存在同名列,這時(shí)應(yīng)使用對(duì)象名限定這些列所屬的表或視圖。例如在
usertable
和
citytable
表中同時(shí)存在
cityid
列,在查詢兩個(gè)表中的
cityid
時(shí)應(yīng)使用下面語(yǔ)句格式加以限定:
?
SELECT username,citytable.cityid
FROM usertable,citytable
WHERE usertable.cityid=citytable.cityid?
?
在
FROM
子句中可用以下兩種格式為表或視圖指定別名:
?
表名
as
別名
表名
別名
?
(
二
) FROM
子句
?
FROM
子句指定
SELECT
語(yǔ)句查詢及與查詢相關(guān)的表或視圖。在
FROM
子句中最多可指定
256
個(gè)表或視圖,它們之間用逗號(hào)分隔。
?
在
FROM
子句同時(shí)指定多個(gè)表或視圖時(shí),如果選擇列表中存在同名列,這時(shí)應(yīng)使用對(duì)象名限定這些列所屬的表或視圖。例如在
usertable
和
citytable
表中同時(shí)存在
cityid
列,在查詢兩個(gè)表中的
cityid
時(shí)應(yīng)使用下面語(yǔ)句格式加以限定:
?
SELECT username,citytable.cityid
FROM usertable,citytable
WHERE usertable.cityid=citytable.cityid?
?
在
FROM
子句中可用以下兩種格式為表或視圖指定別名:
?
表名
as
別名
表名
別名
?
例如上面語(yǔ)句可用表的別名格式表示為:
?
SELECT username,b.cityid
FROM usertable a,citytable b
WHERE a.cityid=b.cityid?
?
SELECT
不僅能從表或視圖中檢索數(shù)據(jù),它還能夠從其它查詢語(yǔ)句所返回的結(jié)果集合中查詢數(shù)據(jù)。
?
例如:
?
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
返回的結(jié)果集合給予一別名
t
,然后再?gòu)闹袡z索數(shù)據(jù)。
?
(
三
)
使用
WHERE
子句設(shè)置查詢條件
?
WHERE
子句設(shè)置查詢條件,過(guò)濾掉不需要的數(shù)據(jù)行。例如下面語(yǔ)句查詢年齡大于
20
的數(shù)據(jù):
?
SELECT *
FROM usertable
WHERE age>20?
?
WHERE
子句可包括各種條件運(yùn)算符:
?
比較運(yùn)算符
(
大小比較
)
:
>
、
>=
、
=
、
<
、
<=
、
<>
、
!>
、
!<
范圍運(yùn)算符
(
表達(dá)式值是否在指定的范圍
)
:
BETWEEN
…
AND
…
NOT BETWEEN
…
AND
…
列表運(yùn)算符
(
判斷表達(dá)式是否為列表中的指定項(xiàng)
)
:
IN (
項(xiàng)
1,
項(xiàng)
2
……
)
NOT IN (
項(xiàng)
1,
項(xiàng)
2
……
)
模式匹配符
(
判斷值是否與指定的字符通配格式相符
):LIKE
、
NOT LIKE
空值判斷符
(
判斷表達(dá)式是否為空
)
:
IS NULL
、
NOT IS NULL
邏輯運(yùn)算符
(
用于多條件的邏輯連接
)
:
NOT
、
AND
、
OR
?
1
、范圍運(yùn)算符例:
age BETWEEN 10 AND 30
相當(dāng)于
age>=10 AND age<=30
?
2
、列表運(yùn)算符例:
country IN ('Germany','China')
?
3
、模式匹配符例:常用于模糊查找,它判斷列值是否與指定的字符串格式相匹配。可用于
char
、
varchar
、
text
、
ntext
、
datetime
和
smalldatetime
等類型查詢。
?
可使用以下通配字符:
?
百分號(hào)
%
:可匹配任意類型和長(zhǎng)度的字符,如果是中文,請(qǐng)使用兩個(gè)百分號(hào)即
%%
。
?
下劃線
_
:匹配單個(gè)任意字符,它常用來(lái)限制表達(dá)式的字符長(zhǎng)度。
?
方括號(hào)
[]
:指定一個(gè)字符、字符串或范圍,要求所匹配對(duì)象為它們中的任一個(gè)。
[^]
:其取值也
[]
相同,但它要求所匹配對(duì)象為指定字符以外的任一個(gè)字符。
?
例如:
?
限制以
Publishing
結(jié)尾,使用
LIKE '%Publishing'
?
限制以
A
開(kāi)頭:
LIKE '[A]%'
?
限制以
A
開(kāi)頭外:
LIKE '[^A]%'
?
4
、空值判斷符例
WHERE age IS NULL
?
5
、邏輯運(yùn)算符:優(yōu)先級(jí)為
NOT
、
AND
、
OR
?
(
四
)
查詢結(jié)果排序
?
使用
ORDER BY
子句對(duì)查詢返回的結(jié)果按一列或多列排序。
ORDER BY
子句的語(yǔ)法格式為:
?
ORDER BY {column_name [ASC|DESC]} [,
…
n]
?
其中
ASC
表示升序,為默認(rèn)值,
DESC
為降序。
ORDER BY
不能按
ntext
、
text
和
image
數(shù)據(jù)類型進(jìn)行排序。
?
例如:
?
SELECT *
FROM usertable
ORDER BY age desc,userid ASC?
?
另外,可以根據(jù)表達(dá)式進(jìn)行排序。
?
二、
聯(lián)合查詢
?
UNION
運(yùn)算符可以將兩個(gè)或兩個(gè)以上上
SELECT
語(yǔ)句的查詢結(jié)果集合合并成一個(gè)結(jié)果集合顯示,即執(zhí)行聯(lián)合查詢。
UNION
的語(yǔ)法格式為:
?
select_statement
UNION [ALL] selectstatement
[UNION [ALL] selectstatement][
…
n]?
?
其中
selectstatement
為待聯(lián)合的
SELECT
查詢語(yǔ)句。
?
ALL
選項(xiàng)表示將所有行合并到結(jié)果集合中。不指定該項(xiàng)時(shí),被聯(lián)合查詢結(jié)果集合中的重復(fù)行將只保留一行。
?
聯(lián)合查詢時(shí),查詢結(jié)果的列標(biāo)題為第一個(gè)查詢語(yǔ)句的列標(biāo)題。因此,要定義列標(biāo)題必須在第一個(gè)查詢語(yǔ)句中定義。要對(duì)聯(lián)合查詢結(jié)果排序時(shí),也必須使用第一查詢語(yǔ)句中的列名、列標(biāo)題或者列序號(hào)。
?
在使用
UNION
運(yùn)算符時(shí),應(yīng)保證每個(gè)聯(lián)合查詢語(yǔ)句的選擇列表中有相同數(shù)量的表達(dá)式,并且每個(gè)查詢選擇表達(dá)式應(yīng)具有相同的數(shù)據(jù)類型,或是可以自動(dòng)將它們轉(zhuǎn)換為相同的數(shù)據(jù)類型。在自動(dòng)轉(zhuǎn)換時(shí),對(duì)于數(shù)值類型,系統(tǒng)將低精度的數(shù)據(jù)類型轉(zhuǎn)換為高精度的數(shù)據(jù)類型。
?
在包括多個(gè)查詢的
UNION
語(yǔ)句中,其執(zhí)行順序是自左至右,使用括號(hào)可以改變這一執(zhí)行順序。例如:
?
查詢
1 UNION (
查詢
2 UNION
查詢
3)
?
三、連接查詢
?
通過(guò)連接運(yùn)算符可以實(shí)現(xiàn)多個(gè)表查詢。連接是關(guān)系數(shù)據(jù)庫(kù)模型的主要特點(diǎn),也是它區(qū)別于其它類型數(shù)據(jù)庫(kù)管理系統(tǒng)的一個(gè)標(biāo)志。
?
在關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)中,表建立時(shí)各數(shù)據(jù)之間的關(guān)系不必確定,常把一個(gè)實(shí)體的所有信息存放在一個(gè)表中。當(dāng)檢索數(shù)據(jù)時(shí),通過(guò)連接操作查詢出存放在多個(gè)表中的不同實(shí)體的信息。連接操作給用戶帶來(lái)很大的靈活性,他們可以在任何時(shí)候增加新的數(shù)據(jù)類型。為不同實(shí)體創(chuàng)建新的表,爾后通過(guò)連接進(jìn)行查詢。
?
連接可以在
SELECT
語(yǔ)句的
FROM
子句或
WHERE
子句中建立,似是而非在
FROM
子句中指出連接時(shí)有助于將連接操作與
WHERE
子句中的搜索條件區(qū)分開(kāi)來(lái)。所以,在
Transact-SQL
中推薦使用這種方法。
?
SQL-92
標(biāo)準(zhǔn)所定義的
FROM
子句的連接語(yǔ)法格式為:
?
FROM join_table join_type join_table
[ON (join_condition)]?
?
其中
join_table
指出參與連接操作的表名,連接可以對(duì)同一個(gè)表操作,也可以對(duì)多表操作,對(duì)同一個(gè)表操作的連接又稱做自連接。
?
join_type
指出連接類型,可分為三種:內(nèi)連接、外連接和交叉連接。內(nèi)連接
(INNER JOIN)
使用比較運(yùn)算符進(jìn)行表間某
(
些
)
列數(shù)據(jù)的比較操作,并列出這些表中與連接條件相匹配的數(shù)據(jù)行。根據(jù)所使用的比較方式不同,內(nèi)連接又分為等值連接、自然連接和不等連接三種。外連接分為左外連接
(LEFT OUTER JOIN
或
LEFT JOIN)
、右外連接
(RIGHT OUTER JOIN
或
RIGHT JOIN)
和全外連接
(FULL OUTER JOIN
或
FULL JOIN)
三種。與內(nèi)連接不同的是,外連接不只列出與連接條件相匹配的行,而是列出左表
(
左外連接時(shí)
)
、右表
(
右外連接時(shí)
)
或兩個(gè)表
(
全外連接時(shí)
)
中所有符合搜索條件的數(shù)據(jù)行。
?
交叉連接
(CROSS JOIN)
沒(méi)有
WHERE
子句,它返回連接表中所有數(shù)據(jù)行的笛卡爾積,其結(jié)果集合中的數(shù)據(jù)行數(shù)等于第一個(gè)表中符合查詢條件的數(shù)據(jù)行數(shù)乘以第二個(gè)表中符合查詢條件的數(shù)據(jù)行數(shù)。
?
連接操作中的
ON (join_condition)
子句指出連接條件,它由被連接表中的列和比較運(yùn)算符、邏輯運(yùn)算符等構(gòu)成。
?
無(wú)論哪種連接都不能對(duì)
text
、
ntext
和
image
數(shù)據(jù)類型列進(jìn)行直接連接,但可以對(duì)這三種列進(jìn)行間接連接。例如:
?
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)?
?
(
一
)
內(nèi)連接
?
內(nèi)連接查詢操作列出與連接條件匹配的數(shù)據(jù)行,它使用比較運(yùn)算符比較被連接列的列值。內(nèi)連接分三種:
?
1
、等值連接:在連接條件中使用等于號(hào)
(=)
運(yùn)算符比較被連接列的列值,其查詢結(jié)果中列出被連接表中的所有列,包括其中的重復(fù)列。
?
2
、不等連接:
在連接條件使用除等于運(yùn)算符以外的其它比較運(yùn)算符比較被連接的列的列值。這些運(yùn)算符包括
>
、
>=
、
<=
、
<
、
!>
、
!<
和
<>
。
?
3
、自然連接:在連接條件中使用等于
(=)
運(yùn)算符比較被連接列的列值,但它使用選擇列表指出查詢結(jié)果集合中所包括的列,并刪除連接表中的重復(fù)列。
?
例,下面使用等值連接列出
authors
和
publishers
表中位于同一城市的作者和出版社:
?
SELECT *
FROM authors AS a INNER JOIN publishers AS p
ON a.city=p.city
?
又如使用自然連接,在選擇列表中刪除
authors
和
publishers
表中重復(fù)列
(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?
?
(
二
)
外連接
?
內(nèi)連接時(shí),返回查詢結(jié)果集合中的僅是符合查詢條件
( WHERE
搜索條件或
HAVING
條件
)
和連接條件的行。而采用外連接時(shí),它返回到查詢結(jié)果集合中的不僅包含符合連接條件的行,而且還包括左表
(
左外連接時(shí)
)
、右表
(
右外連接時(shí)
)
或兩個(gè)邊接表
(
全外連接
)
中的所有數(shù)據(jù)行。如下面使用左外連接將論壇內(nèi)容和作者信息連接起來(lái):
?
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
子句,它返回被連接的兩個(gè)表所有數(shù)據(jù)行的笛卡爾積,返回到結(jié)果集合中的數(shù)據(jù)行數(shù)等于第一個(gè)表中符合查詢條件的數(shù)據(jù)行數(shù)乘以第二個(gè)表中符合查詢條件的數(shù)據(jù)行數(shù)。例,
titles
表中有
6
類圖書,而
publishers
表中有
8
家出版社,則下列交叉連接檢索到的記錄數(shù)將等
?
于
6*8=48
行。
?
SELECT type,pub_name
FROM titles CROSS JOIN publishers
ORDER BY type
[Post=0][/Post]?
?
?
?
-
作者:
biliang
訪問(wèn)統(tǒng)計(jì):
12
2005
年
07
月
2
日
,
星期六
23:00
加入博采
Trackback
你可以使用這個(gè)鏈接引用該篇文章
http://publishblog.blogchina.com/blog/tb.b?diaryID=2146575
回復(fù)
???
發(fā)布人:
?
郵箱:
?
主 頁(yè):
?
評(píng)論內(nèi)容:
???????????
?
??
?
2003-2004 BlogChina.COM All rights reserved
Powered by BlogDriver 2.1
|----------------------------------------------------------------------------------------|
版權(quán)聲明 版權(quán)所有 @zhyiwww
引用請(qǐng)注明來(lái)源 http://www.tkk7.com/zhyiwww
|----------------------------------------------------------------------------------------|
posted on 2006-06-02 19:02
zhyiwww 閱讀(310)
評(píng)論(0) 編輯 收藏 所屬分類:
database