1. 程式人生 > >淺談mysql中子查詢

淺談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));

查詢結果:

這裡寫圖片描述

博主現在所接觸到的子查詢就只有這兩大類了,希望對你有所幫助!