先決條件
要遵循并完全理解本教程,您需要具備以下條件:
- 弧型
- SQL基礎(chǔ)知識(shí)
什么是子查詢(xún)?
子查詢(xún)是嵌套在另一個(gè) SQL 查詢(xún)中的 SQL 查詢(xún)。它們幫助查詢(xún)?yōu)閃HERE子句創(chuàng)建條件以過(guò)濾行并對(duì)它們執(zhí)行操作。子查詢(xún)可以使用SELECT,INSERT,UPDATE,和DELETE語(yǔ)句。
WHERE 子句中的子查詢(xún)示例
我們希望在交易金額大于 1,000 元的數(shù)據(jù)庫(kù)中獲取用戶(hù)。對(duì)于我們的示例,我們將有兩個(gè)表,分別是users和transactions存儲(chǔ)用戶(hù)和交易信息。
我們可以編寫(xiě)一個(gè)查詢(xún),從transactions表中提取金額超過(guò) 1,000 美元的所有行,然后將其用作另一個(gè)查詢(xún)的條件,該查詢(xún)將users根據(jù)第一個(gè)查詢(xún)的結(jié)果從表中提取行。
查詢(xún)將如下所示:
SELECT *
FROM users
WHERE id IN
(SELECT user_id
FROM transactions
WHERE amount > 1000);
子查詢(xún)的優(yōu)點(diǎn)
- 與連接相比,子查詢(xún)通過(guò)將它們構(gòu)建為獨(dú)立的部分來(lái)提高查詢(xún)可讀性。
- 易于理解和維護(hù)子查詢(xún)。
- 子查詢(xún)可以替代復(fù)雜的連接和聯(lián)合。
子查詢(xún)的缺點(diǎn)
- 子查詢(xún)不能在同一個(gè) SQL 語(yǔ)句中修改一個(gè)表并從同一個(gè)表中進(jìn)行選擇。
- 子查詢(xún)是一項(xiàng)開(kāi)銷(xiāo)很大的任務(wù),因此使用連接操作會(huì)更快。
運(yùn)行子查詢(xún)練習(xí)
我們將探索一些使用 Arctype 的示例,我們將在其中展示子查詢(xún)并了解它們是如何在應(yīng)用程序中構(gòu)建和使用的。
我們需要?jiǎng)?chuàng)建一個(gè)我們將在本教程中使用的數(shù)據(jù)庫(kù)。為方便起見(jiàn),我創(chuàng)建了一個(gè)包含 SQL 文件的GitHub Gist,用于構(gòu)建我們的數(shù)據(jù)庫(kù)模式并將虛擬數(shù)據(jù)插入其中。要使用它,我們需要執(zhí)行以下操作:
- 使用 Arctype 連接到我們的數(shù)據(jù)庫(kù)。
- 導(dǎo)航到 Arctype 中的查詢(xún)選項(xiàng)卡并創(chuàng)建一個(gè)新查詢(xún)。
- 粘貼并運(yùn)行Gist 中的create.sql 文件以創(chuàng)建模式。
- 再次導(dǎo)航到查詢(xún)選項(xiàng)卡以創(chuàng)建新查詢(xún)。
- 粘貼并運(yùn)行Gist 中的insert.sql 文件,用虛擬數(shù)據(jù)填充數(shù)據(jù)庫(kù)。
使用子查詢(xún)選擇數(shù)據(jù)
讓我們編寫(xiě)一個(gè)查詢(xún)來(lái)從BUYER表中引用的SKU_DATA表中選擇所有行。在 Arctype 中創(chuàng)建一個(gè)新查詢(xún)并執(zhí)行以下代碼:
SELECT *
FROM BUYER
WHERE BuyerName IN
(SELECT BUYER
FROM SKU_DATA);
在上面的代碼中,我們創(chuàng)建了一個(gè)內(nèi)部查詢(xún),該查詢(xún)BUYER從SKU_DATA表中選擇列,然后使用它作為條件從BUYER表中選擇具有相同BuyerName列值的行。
使用子查詢(xún)更新數(shù)據(jù)
讓我們編寫(xiě)一個(gè)查詢(xún),將2016 年銷(xiāo)售的所有商品Price的ORDER_ITEM表中列的值增加10%。在 Arctype 中創(chuàng)建一個(gè)新查詢(xún)并執(zhí)行以下代碼:
UPDATE ORDER_ITEM
SET Price=Price*1.1
WHERE SKU IN
(SELECT SKU
FROM CATALOG_SKU_2016);
在上面的代碼中,我們創(chuàng)建了一個(gè)內(nèi)部查詢(xún),它SKU從CATALOG_SKU_2016表中選擇列來(lái)過(guò)濾我們應(yīng)該在ORDER_ITEM表中更新的行。
使用子查詢(xún)刪除數(shù)據(jù)
我們將編寫(xiě)一個(gè)子查詢(xún),從INVENTORY存儲(chǔ)在小于 130,000 平方英尺的倉(cāng)庫(kù)中的表中刪除所有記錄。查詢(xún)將如下所示:
DELETE
FROM INVENTORY
WHERE WarehouseID IN
(SELECT WarehouseID
FROM WAREHOUSE
WHERE SquareFeet < 130000);
使用嵌套子查詢(xún)
也可以在另一個(gè)子查詢(xún)中包含子查詢(xún)。下面是一個(gè)例子:
SELECT *
FROM CATALOG_SKU_2017
WHERE SKU IN
(
SELECT SKU
FROM INVENTORY
WHERE WarehouseID IN
(
SELECT WarehouseID
FROM WAREHOUSE
WHERE SquareFeet > 130000
)
);
在此示例中,我們從CATALOG_SKU_2017存儲(chǔ)在平方英尺大于 130,000 的倉(cāng)庫(kù)中的表中選擇了所有行。
結(jié)論
在本文中,我們了解了子查詢(xún),這是一種在查詢(xún)中運(yùn)行查詢(xún)的方法。我們還了解了它們的工作原理、優(yōu)點(diǎn)和局限性,并使用 Arctype 運(yùn)行數(shù)據(jù)示例。