SQL復(fù)雜查詢

參考資料:
《SQL基礎(chǔ)教程》

復(fù)雜查詢

視圖

視圖和表

從SQL的角度來看蛾扇,視圖就是一張表,兩者的區(qū)別在于是否保存了實際的數(shù)據(jù)魏滚。

  1. 創(chuàng)建表時镀首,會通過INSERT語句將數(shù)據(jù)保存到數(shù)據(jù)庫中,而數(shù)據(jù)庫中的數(shù)據(jù)實際上會保存到計算機的存儲設(shè)備鼠次。
  2. 使用視圖時更哄,并不會將數(shù)據(jù)保存到任何地方,實際上視圖保存的是SELECT語句腥寇。從視圖讀取數(shù)據(jù)時成翩,視圖會在內(nèi)部執(zhí)行該SELECT語句并創(chuàng)建出一張臨時表。
視圖和表

總結(jié)成一句話:表中存儲的是實際數(shù)據(jù)赦役,視圖本質(zhì)上就是SELECT語句麻敌。

視圖的優(yōu)點

  1. 視圖無需保存數(shù)據(jù),節(jié)省存儲設(shè)備容量掂摔;
  2. 可以將頻繁使用的SELECT語句保存成視圖术羔,就不用每次都重新書寫了。

創(chuàng)建和使用視圖

創(chuàng)建視圖的CREATE VIEW語句

CREATE VIEW 視圖名稱 (<視圖列名1>, <視圖列名2>, ...)
AS
<SELECT語句>

注意:SELECT語句中列的排列順序和視圖中列的排列順序相同乙漓,SELECT語句中的第1列就是視圖中的第1列级历,以此類推。視圖的列名在視圖名稱之后的列表中定義叭披。

創(chuàng)建ProductSum視圖

CREATE VIEW ProductSum (product_type, cnt_product)
AS
SELECT product_type, COUNT(*)
FROM Product
GROUP BY product_type;

使用視圖

SELECT
    product_type,
    cnt_product
FROM ProductSum;

執(zhí)行結(jié)果:


FROM子句中使用視圖查詢的兩個步驟

  1. 創(chuàng)建視圖:執(zhí)行定義視圖的SELECT語句寥殖;
  2. 使用視圖:根據(jù)得到的結(jié)果,再執(zhí)行在FROM子句中使用視圖的SELECT語句。

當然嚼贡,我們還可以以視圖為基礎(chǔ)再創(chuàng)建視圖熏纯,因此,使用視圖的查詢通常需要執(zhí)行2條以上的SELECT語句粤策。但是樟澜,多重視圖會降低SQL的性能,因此希望大家使用單一視圖掐场。

視圖的限制

定義視圖時不能使用ORDER BY子句

為什么不能使用ORDER BY子句往扔?
因為視圖和表一樣贩猎,數(shù)據(jù)行都是沒有順序的熊户。

對視圖進行更新

SELECT語句中,視圖可以和表一樣使用吭服,那么嚷堡,更新語句(INSERTDELETE艇棕、UPDATE)呢蝌戒?
標準SQL中規(guī)定:如果定義視圖的SELECT語句能夠滿足某些條件,那么這個視圖就可以被更新沼琉。
幾個具有代表性的條件:

  1. SELECT子句中未使用DISTINCT
  2. FROM子句中只有一張表
  3. 未使用GROUP BY子句
  4. 未使用HAVING子句

刪除視圖

刪除視圖的DROP VIEW語句

DROP VIEW 視圖名稱

刪除視圖ProductSum

DROP VIEW ProductSum;

子查詢

子查詢和視圖

子查詢就是一次性的視圖(SELECT語句)北苟,子查詢在SELECT語句執(zhí)行完畢之后就會消失。

子查詢

-- 和上面使用ProductSum視圖實現(xiàn)相同功能的子查詢語句
SELECT
    product_type,
    cnt_product
FROM (
SELECT
    product_type,
    COUNT(*) AS cnt_product
FROM Product
GROUP BY product_type
) AS ProductSum;

執(zhí)行結(jié)果:


子查詢SELECT語句的執(zhí)行順序


由內(nèi)到外:

  1. 首先執(zhí)行FROM子句中的SELECT語句打瘪;
  2. 根據(jù)1的結(jié)果執(zhí)行外層的SELECT語句友鼻。

注意:子查詢的層數(shù)原則上沒有限制,可以無限嵌套下去闺骚,但是彩扔,隨著層數(shù)增加,SQL語句會變得越來越難讀懂僻爽,性能也會越來越差虫碉。因此,盡量避免使用多層嵌套的子查詢胸梆。

子查詢的名稱
原則上子查詢必須設(shè)定名稱敦捧,設(shè)定名稱是需要使用AS關(guān)鍵字,有時也可以省略碰镜。

標量子查詢

標量子查詢就是返回單一值的子查詢绞惦,必須而且只能返回表中某一行的某一列的值。

WHERE子句中使用標量子查詢

如何查詢出銷售單價高于平均銷售單價的商品洋措?
我們可能會想到以下錯誤的SQL語句

-- 在WHERE子句中不能使用聚合函數(shù)
SELECT
    product_id,
    product_name,
    sale_price
FROM Product
WHERE sale_price > AVG(sale_price);

雖然這樣的SELECT語句看上去能夠滿足我們的要求济蝉,但是由于在WHERE子句中不能使用聚合函數(shù),因此這樣的SELECT語句是錯誤的。
這時王滤,標量子查詢就可以發(fā)揮它的功效了贺嫂。

計算平均銷售單價的標量子查詢

SELECT AVG(sale_price)
FROM Product;

執(zhí)行結(jié)果:


選出銷售單價高于平均單價的商品

SELECT
    product_id,
    product_name,
    sale_price
FROM Product
WHERE sale_price > (SELECT AVG(sale_price)
                    FROM Product);

執(zhí)行結(jié)果:


標量子查詢的書寫位置

通常任何可以使用單一值的位置都可以使用標量子查詢,也就是說雁乡,能夠使用常數(shù)或者列名的地方第喳,無論是SELECT子句、GROUP BY子句踱稍、HAVING子句曲饱,還是ORDER BY子句,都可以使用珠月。

注意:如果子查詢返回了多行結(jié)果扩淀,那么它就不再是標量子查詢,而僅僅只是一個普通的子查詢啤挎,因此不能被用在需要單一輸入值的地方驻谆。

關(guān)聯(lián)子查詢

通過關(guān)聯(lián)子查詢按照商品種類對平均銷售單價進行比較

SELECT
    product_id,
    product_name,
    sale_price
FROM Product AS P1
WHERE sale_price > (SELECT AVG(sale_price)
                    FROM Product AS P2
                    WHERE P1.product_type = P2.product_type);

執(zhí)行結(jié)果:


這里起關(guān)鍵作用的就是在子查詢中添加WHERE子句的條件,該條件的意思就是庆聘,在同一商品種類中對各商品的銷售單價和平均單價進行比較胜臊。

我的博客即將同步至騰訊云+社區(qū),邀請大家一同入駐:
https://cloud.tencent.com/developer/support-plan?invite_code=1979ipzwsgq9u

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末伙判,一起剝皮案震驚了整個濱河市象对,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌宴抚,老刑警劉巖勒魔,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機崇呵,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進店門猿规,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了邮利?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長垃帅。 經(jīng)常有香客問我延届,道長,這世上最難降的妖魔是什么贸诚? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任方庭,我火速辦了婚禮厕吉,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘械念。我一直安慰自己头朱,他們只是感情好,可當我...
    茶點故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布龄减。 她就那樣靜靜地躺著项钮,像睡著了一般。 火紅的嫁衣襯著肌膚如雪希停。 梳的紋絲不亂的頭發(fā)上烁巫,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天,我揣著相機與錄音宠能,去河邊找鬼亚隙。 笑死,一個胖子當著我的面吹牛棍潘,可吹牛的內(nèi)容都是我干的恃鞋。 我是一名探鬼主播崖媚,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼亦歉,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了畅哑?” 一聲冷哼從身側(cè)響起肴楷,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎荠呐,沒想到半個月后赛蔫,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡泥张,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年呵恢,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片媚创。...
    茶點故事閱讀 40,144評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡渗钉,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出钞钙,到底是詐尸還是另有隱情鳄橘,我是刑警寧澤,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布芒炼,位于F島的核電站瘫怜,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏本刽。R本人自食惡果不足惜鲸湃,卻給世界環(huán)境...
    茶點故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一赠涮、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧暗挑,春花似錦世囊、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至晒衩,卻和暖如春嗤瞎,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背听系。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工贝奇, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人靠胜。 一個月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓掉瞳,卻偏偏與公主長得像,于是被迫代替她去往敵國和親浪漠。 傳聞我的和親對象是個殘疾皇子陕习,可洞房花燭夜當晚...
    茶點故事閱讀 45,092評論 2 355