淺談mysql中子查詢
當一個查詢是另一個查詢的條件時,稱之為子查詢。子查詢可以使用幾個簡單命令構造功能強大的複合命令。子查詢最常用於SELECT-SQL命令的WHERE子句中。子查詢是一個 SELECT 語句,它巢狀在一個 SELECT、SELECT…INTO 語句、INSERT…INTO 語句、DELETE 語句、或 UPDATE 語句或巢狀在另一子查詢中。
需要用到的表:
account表
borrower表
branch表
customer表
depositor表
loan表
1.巢狀在where中
a.
操作:找出所有同時在本銀行中有賬號且有貸款的使用者名稱
SQL
SELECT DISTINCT
customer_name
FROM
borrower
WHERE
customer_name IN (
SELECT
customer_name
FROM
depositor
);
結果:
事實上這兩個表中的確同時又這三個使用者
這裡給出另外一種查詢方法:
SELECT DISTINCT
customer_name
FROM
borrower
WHERE
EXISTS (
SELECT
*
FROM
depositor
WHERE
depositor.customer_name = borrower.customer_name
);
查詢的結果當然是一樣的啦。
b.
要找出在”perryridge”支行同時有賬戶且還有貸款的使用者名稱:
首先我們得找出那個使用者在perryridge支行有賬戶
SQL
SELECT
customer_name
FROM
account,
depositor
WHERE
account.Account_number = depositor.account_number
AND Branch_name = 'perryridge';
hayes這個使用者滿足條件:
這裡博主要提醒各位一下在做這個查詢的時候一定要先將兩個表進行自然連線,然後才進行篩選
也就是必須現有
account.Account_number = depositor.account_number
才能有篩選條件
Branch_name = 'perryridge'
否則的話會產生這樣結果:不能拿到我們想要的結果
接下來就是找出哪些使用者在perryridge這個支行有貸款的
SQL:
SELECT
customer_name
FROM
borrower,
loan
WHERE
borrower.loan_number = loan.loan_number AND branch_name='perryridge';
結果:
好了,經過兩次查詢,我們可以看到滿足條件的是使用者名稱為Hayes的使用者。那麼我們應該如何一步到位拿到查詢結果呢?
SQL:
SELECT DISTINCT
customer_name
FROM
borrower,
loan
WHERE
borrower.loan_number = loan.loan_number
AND branch_name = 'Perryridge'
AND (branch_name, customer_name) IN (
SELECT
branch_name,
customer_name
FROM
depositor,
account
WHERE
depositor.account_number = account.account_number
);
看看查詢結果:
看這不是得到了查詢結果了嘛
細心的人肯定會注意到,這個子查詢並沒有指明支行名稱,這是為什麼呢?
因為查詢條件中是三個條件的交集!
2. 巢狀在From中
這種子查詢也叫做派生查詢(Derived Relations)
類似這樣的
需求:
找到平均帳戶餘額超過1200美元的分支機構的平均帳戶餘額
SELECT
branch_name,
avg_balance
FROM
(
SELECT
branch_name AS branch_name,
avg(balance) AS avg_balance
FROM
account
GROUP BY
branch_name
) AS branch_avg
WHERE
avg_balance > 500;
這個SQL語句的意思是:從account這個表中以branch_name來分組,計算每一個分行的平均資產,然後將查詢結果重新投影到一個虛擬表(表名叫做branch_avg(branch_name,avg_balance));
查詢結果:
博主現在所接觸到的子查詢就只有這兩大類了,希望對你有所幫助!