?? sql簡(jiǎn)單查詢和聯(lián)合查詢.txt
字號(hào):
在對(duì)跨多個(gè)表格的數(shù)據(jù)進(jìn)行組合時(shí),有時(shí)很難搞清楚要使用哪一個(gè)SQL句法。我將在這里對(duì)將多個(gè)表格中的查詢合并至單一聲明中的常用方式進(jìn)行闡述。
在這篇文章中的樣本查詢符合SQL92 ISO標(biāo)準(zhǔn)。不是所有的數(shù)據(jù)庫(kù)生產(chǎn)商都遵循這項(xiàng)標(biāo)準(zhǔn),而且很多廠商采取的提升措施會(huì)帶來(lái)一些意料不到的后果。如果你不確定你的數(shù)據(jù)庫(kù)是不是支持這些標(biāo)準(zhǔn),你可以參看生產(chǎn)廠商的有關(guān)資料。
SELECT
一個(gè)簡(jiǎn)單的SELECT聲明就是查詢多個(gè)表格的最基本的方式。你可以在FROM子句中調(diào)用多個(gè)表格來(lái)組合來(lái)自多個(gè)表格的結(jié)果。這里是一個(gè)它如何工作的實(shí)例:
SELECT table1.column1, table2.column2 FROM table1, table2 WHERE table1.column1 = table2.column1;
這個(gè)實(shí)例中,我使用點(diǎn)號(hào)(table1.column1)來(lái)指定專欄來(lái)自哪一個(gè)表格。如果所涉及的專欄只在一個(gè)參考的表格中出現(xiàn),你就不需要加入完整的名稱,但是加入完整名稱會(huì)對(duì)可讀性起到幫助。
在FROM子句中表格之間由逗號(hào)來(lái)分隔,你可以加入所需的任意多的表格,盡管一些數(shù)據(jù)庫(kù)有一個(gè)在引入正式的JOIN聲明之前他們可以有效地處理的內(nèi)容這方面的限制,這個(gè)將在下面談到。
這個(gè)句法是一個(gè)簡(jiǎn)單的INNER JOIN。一些數(shù)據(jù)庫(kù)將它看成與一個(gè)外部的JOIN是等同的。WHERE子句告知數(shù)據(jù)庫(kù)哪一個(gè)區(qū)域要做關(guān)聯(lián),而且它返回結(jié)果時(shí),就像列出的表格在給定的條件下組合成一個(gè)單獨(dú)的表格一樣。值得注意的是,你的比較條件并不需要與你作為結(jié)果組返回的專欄相同。在上面的例子中,table1.column1和table2.column1用來(lái)組合表格,但是返回的卻是table2.column2。
你可以在WHERE子句中使用AND關(guān)鍵字來(lái)將這個(gè)功能擴(kuò)展至多于兩個(gè)的表格。你還可以使用這樣的表格組合來(lái)限制你的結(jié)果而不用實(shí)際地從每個(gè)表格返回專欄。在下面的例子中,table3與table1匹配,但是我沒(méi)有從table3返回任何東西來(lái)顯示。我只是確保來(lái)自table1的有關(guān)專欄存在于table3之中。注意此例中table3需要在FROM子句中被引用。
SELECT table1.column1, table2.column2 FROM table1, table2, table3 WHERE table1.column1 = table2.column1 AND table1.column1 = table3.column1;
然而,要注意的是,這個(gè)查詢多個(gè)表格的方式是一個(gè)暗指的JOIN。你的數(shù)據(jù)庫(kù)可能對(duì)事物進(jìn)行不同的處理,這取決于它所使用的優(yōu)化引擎。而且,忽略對(duì)與WHERE子句的相關(guān)特性的定義將會(huì)給你帶來(lái)不愿看到的結(jié)果,例如從余下的查詢中返回與每一個(gè)可能的結(jié)果相關(guān)的專欄的rogue域,就像在CROSS JOIN之中一樣。
如果你習(xí)慣于你的數(shù)據(jù)庫(kù)處理這種類型的聲明的方式,且你只對(duì)兩個(gè)或是少數(shù)幾個(gè)表格進(jìn)行組合,一個(gè)簡(jiǎn)單的SELECT聲明就可以達(dá)到目的。
JOIN
JOIN的工作方式與SELECT聲明是相同的,它從不同的表格中返回一個(gè)帶有專欄的結(jié)果組。在暗含的JOIN之上使用外部JOIN的優(yōu)勢(shì)是對(duì)你的結(jié)果組的更好的控制,而且還可能在涉及很多個(gè)表格的情況下提升性能表現(xiàn)。
JOIN的類型有幾種:LEFT,RIGHT,F(xiàn)ULL OUTER,INNER和CROSS。你所使用的類型是由你想要看到的結(jié)果所決定的。例如,使用LEFT OUTER JOIN將會(huì)從列出的第一個(gè)表格中返回所有有關(guān)的行,而同時(shí)如果沒(méi)有信息與第一個(gè)表格相關(guān)的話將潛在地從所列出的第二個(gè)表格中加入行。
在這里INNER JOIN和暗含的JOIN是不同的,INNER JOIN將只返回那些在兩個(gè)表格中都有數(shù)據(jù)的行。
對(duì)第一個(gè)SELECT查詢使用如下JOIN聲明:
SELECT table1.column1, table2.column2 FROM table1 INNER JOIN table2
ON table1.column1 = table2.column1;
子查詢
子查詢,或叫子選擇聲明,是在一個(gè)查詢中將結(jié)果組作為資源使用的一個(gè)途徑。他經(jīng)常被用來(lái)對(duì)結(jié)果進(jìn)行限制或定義,而不是運(yùn)行多個(gè)查詢或操縱應(yīng)用軟件之中的數(shù)據(jù)。有了子查詢,你可以參考表格來(lái)決定數(shù)據(jù)的內(nèi)含,或是在一些情況下,返回一個(gè)專欄,而這個(gè)專欄是一個(gè)子選擇的結(jié)果。
下面的例子中使用了兩個(gè)表格。一個(gè)表格中包含了我想要返回的數(shù)據(jù),而另一個(gè)表格則給出一個(gè)比較點(diǎn)來(lái)確定什么數(shù)據(jù)是我確實(shí)感興趣的。
SELECT column1 FROM table1 WHERE EXISTS ( SELECT column1 FROM table2 WHERE table1.column1 = table2.column1 );
子查詢很重要的一個(gè)方面就是性能表現(xiàn)。便利性是有代價(jià)的,它取決于你所使用的表格和聲明的大小,數(shù)量和復(fù)雜性,還有你可能會(huì)允許你的應(yīng)用軟件做處理工作。每一個(gè)查詢?cè)诒恢鞑樵冏鳛橘Y源使用之前,都將被完整地單獨(dú)處理。如果可能的話,創(chuàng)造性地使用JOIN聲明可以以較少的滯后時(shí)間提供出相同的信息。
OIN聲明和子查詢
對(duì)于JOINS的更詳細(xì)的闡述和有關(guān)的理念,請(qǐng)參閱 掌握連接的一些概念。關(guān)于子查詢的更多內(nèi)容,請(qǐng)參閱使用SQL子選擇來(lái)合并查詢
簡(jiǎn)單查詢和聯(lián)合查詢兩方面介紹SQL查詢語(yǔ)句
一、簡(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 別名
表名 別名
例如上面語(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
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -