日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

SQL select 语法(转)

發(fā)布時間:2023/12/10 数据库 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SQL select 语法(转) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

?

SQL 里面最常用的命令是 SELECT 語句,用于檢索數(shù)據(jù)。語法是:

SELECT [ ALL | DISTINCT [ ON ( expression [, ...] ) ] ]* | expression [ AS output_name ] [, ...][ INTO [ TEMPORARY | TEMP ] [ TABLE ] new_table ][ FROM from_item [, ...] ][ WHERE condition ][ GROUP BY expression [, ...] ][ HAVING condition [, ...] ][ { UNION | INTERSECT | EXCEPT [ ALL ] } select ][ ORDER BY expression [ ASC | DESC | USING operator ] [, ...] ][ FOR UPDATE [ OF class_name [, ...] ] ][ LIMIT { count | ALL } [ { OFFSET | , } start ]]

現(xiàn)在我們將通過不同的例子演示 SELECT 語句復(fù)雜的語法。用于這些例子的表在 供應(yīng)商和部件數(shù)據(jù)庫 里定義。

1.4.1.1. 簡單的 Select

這里是一些使用 SELECT 語句的簡單例子:

Example 1-4. 帶有條件的簡單查詢

要從表 PART 里面把字段 PRICE 大于 10 的所有記錄找出來, 我們寫出下面查詢:

SELECT * FROM PARTWHERE PRICE > 10;然后得到表: PNO | PNAME | PRICE -----+---------+--------3 | Bolt | 154 | Cam | 25

在 SELECT語句里使用 "*" 將檢索出表中的所有屬性。 如果我們只希望從表 PART 中檢索出屬性 PNAME 和 PRICE, 我們使用下面的語句:

SELECT PNAME, PRICE FROM PARTWHERE PRICE > 10;這回我們的結(jié)果是: PNAME | PRICE--------+--------Bolt | 15Cam | 25請注意 SQL 的 SELECT 語句對應(yīng)關(guān)系演算里面的 "projection" (映射),而不是 "selection"(選擇)(參閱 關(guān)系演算 獲取詳細信息)。

WHERE 子句里的條件也可以用關(guān)鍵字 OR,AND,和 NOT 邏輯地連接起來:

SELECT PNAME, PRICE FROM PARTWHERE PNAME = 'Bolt' AND(PRICE = 0 OR PRICE <= 15);這樣將生成下面的結(jié)果: PNAME | PRICE --------+--------Bolt | 15

目標列表和 WHERE 子句里可以使用算術(shù)操作。例如, 如果我們想知道如果我們買兩個部件的話要多少錢, 我們可以用下面的查詢:

SELECT PNAME, PRICE * 2 AS DOUBLEFROM PARTWHERE PRICE * 2 < 50;這樣我們得到: PNAME | DOUBLE --------+---------Screw | 20Nut | 16Bolt | 30請注意在關(guān)鍵字 AS 后面的 DOUBLE 是第二個列的新名字。 這個技巧可以用于目標列表里的每個元素, 給它們賦予一個在結(jié)果列中顯示的新的標題。 這個新的標題通常稱為別名。這個別名不能在該查詢的其他地方使用。

1.4.1.2. Joins(連接)

下面的例子顯示了 SQL 里是如何實現(xiàn)連接的。

要在共同的屬性上連接三個表 SUPPLIER,PART 和 SELLS, 我們通常使用下面的語句:

SELECT S.SNAME, P.PNAMEFROM SUPPLIER S, PART P, SELLS SEWHERE S.SNO = SE.SNO ANDP.PNO = SE.PNO;而我們得到的結(jié)果是: SNAME | PNAME -------+-------Smith | ScrewSmith | NutJones | CamAdams | ScrewAdams | BoltBlake | NutBlake | BoltBlake | Cam

在 FROM 子句里,我們?yōu)槊總€關(guān)系使用了一個別名, 因為在這些關(guān)系間有著公共的命名屬性(SNO 和 PNO)。 現(xiàn)在我們可以區(qū)分不同表的公共命名屬性, 只需要簡單的用每個關(guān)系的別名加上個點做前綴就行了。 聯(lián)合是用與 一個內(nèi)部聯(lián)接 里顯示的同樣的方法計算的。首先算出笛卡兒積 SUPPLIER × PART × SELLS 。然后選出那些滿足 WHERE 子句里給出的條件的記錄 (也就是說,公共命名屬性的值必須相等)。 最后我們映射出除 S.SNAME 和 P.PNAME 外的所有屬性。

另外一個進行連接的方法是使用下面這樣的 SQL JOIN 語法:

select sname, pname from supplierJOIN sells USING (sno)JOIN part USING (pno);giving again: sname | pname -------+-------Smith | ScrewAdams | ScrewSmith | NutBlake | NutAdams | BoltBlake | BoltJones | CamBlake | Cam (8 rows)

一個用 JOIN 語法創(chuàng)建的連接表,是一個出現(xiàn)在 FROM 子句里的, 在任何 WHERE,GROUP BY 或 HAVING 子句之前的表引用列表項. 其它表引用,包括表名字或者其它 JOIN 子句,如果用逗號分隔的話, 可以包含在 FROM 子句里. 連接生成的表邏輯上和任何其它在 FROM 子句里列出的表都一樣.

SQL JOIN 有兩種主要類型,CROSS JOIN (無條件連接) 和條件連接.條件連接還可以根據(jù)聲明的 連接條件(ON,USING,或 NATURAL)和它 應(yīng)用的方式(INNER 或 OUTER 連接)進一步細分.

連接類型

CROSS JOIN

{ T1 } CROSS JOIN { T2 }

一個交叉連接(cross join)接收兩個分別有 N 行和 M 行 的表 T1 和 T2,然后返回一個包含交叉乘積 NxM 條記錄的 連接表. 對于 T1 的每行 R1,T2 的每行 R2 都與 R1 連接生成 連接的表行 JR,JR 包含所有 R1 和 R2 的字段. CROSS JOIN 實際上就是一個 INNER JOIN ON TRUE.

條件 JOIN

{ T1 } [ NATURAL ] [ INNER | { LEFT | RIGHT | FULL } [ OUTER ] ] JOIN { T2 } { ON search condition | USING ( join column list ) }

一個條件 JOIN 必須通過提供一個(并且只能有一個) NATURAL,ON,或者 USING 這樣的關(guān)鍵字來聲明它的 連接條件. ON 子句 接受一個 search condition, 它與一個 WHERE 子句相同.USING 子句接受一個用逗號分隔的 字段名列表,連接表中必須都有這些字段, 并且用那些字段連接這些表,生成的連接表包含每個共有字段 和兩個表的所有其它字段. NATURAL 是 USING 子句的縮寫,它列出兩個表中所有公共 的字段名字.使用 USING 和 NATURAL 的副作用是 每個連接的字段都只有一份拷貝出現(xiàn)在結(jié)果表中 (與前面定義的關(guān)系演算的 JOIN 相比較).

[ INNER ] JOIN

對于 T1 的每行 R1,連接成的表在 T2 里都有一行滿 足與 R1 一起的連接條件.

對于所有 JOIN 而言,INNER 和 OUTER 都是可選的.INNER 是缺省. LEFT,RIGHT,和 FULL 只用于 OUTER JOIN.

LEFT [ OUTER ] JOIN

首先,執(zhí)行一次 INNER JOIN. 然后,如果 T1 里有一行對任何 T2 的行都不滿足 連接條件,那么返回一個連接行,該行的 T2 的字段 為 null.

小技巧: 連接成的表無條件地包含 T1 里的所有行.

RIGHT [ OUTER ] JOIN

首先,執(zhí)行一次 INNER JOIN. 然后,如果 T2 里有一行對任何 T1 的行都不滿足 連接條件,那么返回一個連接行,該行的 T1 的字段 為 null.

小技巧: 連接成的表無條件地包含 T2 里的所有行.

FULL [ OUTER ] JOIN

首先,執(zhí)行一次 INNER JOIN. 然后,如果 T1 里有一行對任何 T2 的行都不滿足 連接條件,那么返回一個連接行,該行的 T1 的字段 為 null. 同樣,如果 T2 里有一行對任何 T1 的行都不滿足 連接條件,那么返回一個連接行,該行的 T2 的字段 為 null.

小技巧: 連接成的表無條件地擁有來自 T1 的每 一行和來自 T2 的每一行.

所有 類型的 JOIN 都可以鏈接在一起或者嵌套在一起, 這時 T1 和 T2 都可以是連接生成的表.我們可以使用圓括弧控制 JOIN 的順序,如果我們不主動控制,那么連接順序是從左到右.

1.4.1.3. 聚集操作符

SQL 提供以一些聚集操作符(如, AVG,COUNT,SUM,MIN,MAX),這些聚集操作符以一個表達式為參數(shù)。 只要是滿足 WHERE 子句的行,就會計算這個表達式, 然后聚集操作符對這個輸入數(shù)值的集合進行計算. 通常,一個聚集對整個 SELECT 語句計算的結(jié)果是 生成一個結(jié)果.但如果在一個查詢里面聲明了分組, 那么數(shù)據(jù)庫將對每個組進行一次獨立的計算,并且 聚集結(jié)果是按照各個組出現(xiàn)的(見下節(jié)).

Example 1-5. 聚集

果我們想知道表 PART 里面所有部件的平均價格,我們可以使用下面查詢:

SELECT AVG(PRICE) AS AVG_PRICEFROM PART;

結(jié)果是:

AVG_PRICE -----------14.5

如果我們想知道在表 PART 里面存儲了多少部件,我們可以使用語句:

SELECT COUNT(PNO)FROM PART;得到: COUNT -------4

1.4.1.4. 分組聚集

SQL 允許我們把一個表里面的記錄分成組。 然后上面描述的聚集操作符可以應(yīng)用于這些組上 (也就是說,聚集操作符的值不再是對所有聲明的列的值進行操作, 而是對一個組的所有值進行操作。這樣聚集函數(shù)是為每個組獨立地進行計算的。)

對記錄的分組是通過關(guān)鍵字 GROUP BY 實現(xiàn)的,GROUP BY 后面跟著一個定義組的構(gòu)成的屬性列表。 如果我們使用語句 GROUP BY A1, &tdot;, Ak 我們就把關(guān)系分成了組,這樣當(dāng)且僅當(dāng)兩條記錄在所有屬性 A1, &tdot;, Ak 上達成一致,它們才是同一組的。

Example 1-6. 聚集

如果我們想知道每個供應(yīng)商銷售多少個部件,我們可以這樣寫查詢:

SELECT S.SNO, S.SNAME, COUNT(SE.PNO)FROM SUPPLIER S, SELLS SEWHERE S.SNO = SE.SNOGROUP BY S.SNO, S.SNAME;得到: SNO | SNAME | COUNT -----+-------+-------1 | Smith | 22 | Jones | 13 | Adams | 24 | Blake | 3

然后我們看一看發(fā)生了什么事情。首先生成表 SUPPLIER 和 SELLS 的連接:

S.SNO | S.SNAME | SE.PNO -------+---------+--------1 | Smith | 11 | Smith | 22 | Jones | 43 | Adams | 13 | Adams | 34 | Blake | 24 | Blake | 34 | Blake | 4

然后我們把那些屬性 S.SNO 和 S.SNAME 相同的記錄放在組中:

S.SNO | S.SNAME | SE.PNO -------+---------+--------1 | Smith | 1| 2 --------------------------2 | Jones | 4 --------------------------3 | Adams | 1| 3 --------------------------4 | Blake | 2| 3| 4

在我們的例子里,我們有四個組并且現(xiàn)在我們可以對每個組應(yīng)用聚集操作符 COUNT,生成上面給出的查詢的最終結(jié)果。

請注意如果要讓一個使用 GROUP BY 和聚集操作符的查詢的結(jié)果有意義, 那么用于分組的屬性也必須出現(xiàn)在目標列表中。 所有沒有在 GROUP BY 子句里面出現(xiàn)的屬性都只能通過使用聚集函數(shù)來選擇。 否則就不會有唯一的數(shù)值與其它字段關(guān)聯(lián).

還要注意的是在聚集上聚集是沒有意義的,比如,AVG(MAX(sno)), 因為 SELECT 只做一個回合的分組和聚集.你可以獲得這樣的結(jié)果, 方法是使用臨時表或者在 FROM 子句中使用一個子 SELECT 做第一個層次的聚集.

1.4.1.5. Having

HAVING 子句運做起來非常象 WHERE 子句, 只用于對那些滿足 HAVING 子句里面給出的條件的組進行計算。 其實,WHERE 在分組和聚集之前過濾掉我們不需要的輸入行, 而 HAVING 在 GROUP 之后那些不需要的組. 因此,WHERE 無法使用一個聚集函數(shù)的結(jié)果. 而另一方面,我們也沒有理由寫一個不涉及聚集函數(shù)的 HAVING. 如果你的條件不包含聚集,那么你也可以把它寫在 WHERE 里面, 這樣就可以避免對那些你準備拋棄的行進行的聚集運算.

Example 1-7. Having

如果我們想知道那些銷售超過一個部件的供應(yīng)商,使用下面查詢:

SELECT S.SNO, S.SNAME, COUNT(SE.PNO)FROM SUPPLIER S, SELLS SEWHERE S.SNO = SE.SNOGROUP BY S.SNO, S.SNAMEHAVING COUNT(SE.PNO) > 1;and get: SNO | SNAME | COUNT -----+-------+-------1 | Smith | 23 | Adams | 24 | Blake | 3

1.4.1.6. 子查詢

在 WHERE 和 HAVING 子句里,允許在任何要產(chǎn)生數(shù)值的地方使用子查詢 (子選擇)。 這種情況下,該值必須首先來自對子查詢的計算。子查詢的使用擴展了 SQL 的表達能力。

Example 1-8. 子查詢

如果我們想知道所有比名為 'Screw' 的部件貴的部件,我們可以用下面的查詢:

SELECT * FROM PART WHERE PRICE > (SELECT PRICE FROM PARTWHERE PNAME='Screw');

結(jié)果是:

PNO | PNAME | PRICE -----+---------+--------3 | Bolt | 154 | Cam | 25

當(dāng)我們檢查上面的查詢時會發(fā)現(xiàn)出現(xiàn)了兩次 SELECT 關(guān)鍵字。 第一個在查詢的開頭 - 我們將稱之為外層 SELECT - 而另一個在 WHERE 子句里面,成為一個嵌入的查詢 - 我們將稱之為內(nèi)層 SELECT。 對外層 SELECT 的每條記錄都必須先計算內(nèi)層 SELECT。在完成所有計算之后, 我們得知名為 'Screw' 部件的記錄的價格, 然后我們就可以檢查那些價格更貴的記錄了。 (實際上,在本例中,內(nèi)層查詢只需要執(zhí)行一次, 因為它不依賴于外層查詢高等狀態(tài).)

如果我們想知道那些不銷售任何部件的供應(yīng)商 (比如說,我們想把這些供應(yīng)商從數(shù)據(jù)庫中刪除),我們用:

SELECT * FROM SUPPLIER SWHERE NOT EXISTS(SELECT * FROM SELLS SEWHERE SE.SNO = S.SNO);

在我們的例子里,結(jié)果列將是空的,因為每個供應(yīng)商至少銷售一個部件。 請注意我們在 WHERE 子句的內(nèi)層 SELECT 里使用了來自外層 SELECT 的 S.SNO。 正如前面所說的,子查詢?yōu)槊總€外層查詢計算一次,也就是說, S.SNO 的值總是從外層 SELECT 的實際記錄中取得的。

1.4.1.7. 在 FROM 里面的子查詢

一種有些特別的子查詢的用法是把它們放在 FROM 子句里. 這個特性很有用,因為這樣的子查詢可以輸出多列和多行, 而在表達式里使用的子查詢必須生成一個結(jié)果. FROM 里的子查詢還可以讓我們獲得多于一個回合的分組/聚集特性, 而不需要求助于臨時表.

Example 1-9. FROM 里面的子查詢

如果我們想知道在所有我們的供應(yīng)商中的最高平均部件價格的那家, 我們不能用 MAX(AVG(PRICE)),但我們可以這么寫:

SELECT MAX(subtable.avgprice)FROM (SELECT AVG(P.PRICE) AS avgpriceFROM SUPPLIER S, PART P, SELLS SEWHERE S.SNO = SE.SNO ANDP.PNO = SE.PNOGROUP BY S.SNO) subtable;這個子查詢?yōu)槊總€供應(yīng)商返回一行(因為它的 GROUP BY) 然后我們在外層查詢對所有行進行聚集.

1.4.1.8. Union, Intersect, Except(聯(lián)合,相交,相異)

這些操作符分別計算兩個子查詢產(chǎn)生的元組的聯(lián)合,相交和集合理論里的相異。

Example 1-10. Union, Intersect, Except

下面的例子是 UNION 的例子:

SELECT S.SNO, S.SNAME, S.CITYFROM SUPPLIER SWHERE S.SNAME = 'Jones' UNIONSELECT S.SNO, S.SNAME, S.CITYFROM SUPPLIER SWHERE S.SNAME = 'Adams'; 產(chǎn)生結(jié)果: SNO | SNAME | CITY -----+-------+--------2 | Jones | Paris3 | Adams | Vienna

下面是相交( INTERSECT)的例子:

SELECT S.SNO, S.SNAME, S.CITYFROM SUPPLIER SWHERE S.SNO > 1 INTERSECTSELECT S.SNO, S.SNAME, S.CITYFROM SUPPLIER SWHERE S.SNO < 3;產(chǎn)生結(jié)果: SNO | SNAME | CITY -----+-------+--------2 | Jones | Paris兩個查詢都會返回的元組是那條 SNO=2 的

最后是一個 EXCEPT 的例子:

SELECT S.SNO, S.SNAME, S.CITYFROM SUPPLIER SWHERE S.SNO > 1 EXCEPTSELECT S.SNO, S.SNAME, S.CITYFROM SUPPLIER SWHERE S.SNO > 3;結(jié)果是: SNO | SNAME | CITY -----+-------+--------2 | Jones | Paris3 | Adams | Vienna

原文:http://blog.csdn.net/meskgron/

轉(zhuǎn)載于:https://www.cnblogs.com/dagon007/archive/2005/03/26/125980.html

總結(jié)

以上是生活随笔為你收集整理的SQL select 语法(转)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。