MySQL子查詢的使用詳解上篇

前言

子查詢指一個查詢語句嵌套在另一個查詢語句內部的查詢,這個特性從MySQL 4.1開始引入。

SQL 中子查詢的使用大大增強瞭 SELECT 查詢的能力,因為很多時候查詢需要從結果集中獲取數據,或者 需要從同一個表中先計算得出一個數據結果,然後與這個數據結果(可能是某個標量,也可能是某個集 合)進行比較。

需求分析與問題解決

#方式一:
SELECT salary
FROM employees
WHERE last_name = 'Abel';
SELECT last_name , salary
FROM employees
WHERE salary > 1 1 000 ;
#方式二:自連接
SELECT e2 .last_name , e2 . salary
FROM employees e1 , employees e2
WHERE e1.last_name = ' Abel '
AND e1. ` salary ` < e2. ` salary `
#方式三:子查詢
SELECT last_name,salary
FROM employees
WHERE salary > (
SELECT salary
FROM employees
WHERE last_name = 'Abel'
);

子查詢的基本使用

子查詢的基本語法結構

子查詢(內查詢)在主查詢之前一次執行完成。

子查詢的結果被主查詢(外查詢)使用 。

註意事項

子查詢要包含在括號內

將子查詢放在比較條件的右側

單行操作符對應單行子查詢,多行操作符對應多行子查詢

子查詢的分類

分類方式1:

我們按內查詢的結果返回一條還是多條記錄,將子查詢分為 單行子查詢 、 多行子查詢 。

分類方式2:

我們按內查詢是否被執行多次,將子查詢劃分為 相關(或關聯)子查詢 和 不相關(或非關聯)子查詢 。子查詢從數據表中查詢瞭數據結果,如果這個數據結果隻執行一次,然後這個數據結果作為主查詢的條件進行執行,那麼這樣的子查詢叫做不相關子查詢。

同樣,如果子查詢需要執行多次,即采用循環的方式,先從外部查詢開始,每次都傳入子查詢進行查詢,然後再將結果反饋給外部,這種嵌套的執行方式就稱為相關子查詢。

單行子查詢

代碼示例

題目:查詢工資大於149號員工工資的員工的信息

題目:返回job_id與141號員工相同,salary比143號員工多的員工姓名,job_id和工資

SELECT last_name, job_id, salary
FROM employees
WHERE job_id =
        (SELECT job_id
        FROM employees
        WHERE employee_id = 141)
AND salary >
        (SELECT salary
        FROM employees
        WHERE employee_id = 143);

題目:返回公司工資最少的員工的last_name,job_id和salary

SELECT last_name, job_id, salary
FROM employees
WHERE salary =
(SELECT MIN(salary)
FROM employees);

HAVING中的子查詢

顯式員工的employee_id,last_name和location。其中,若員工department_id與location_id為1800的department_id相同,則location為’Canada’,其餘則為’USA’。

SELECT employee_id, last_name,
(CASE department_id
WHEN
(SELECT department_id FROM departments
WHERE location_id = 1800)
THEN 'Canada' ELSE 'USA' END) location
FROM employees;

非法使用子查詢

SELECT employee_id, last_name
FROM employees
WHERE salary =
(SELECT MIN(salary)
FROM employees
GROUP BY department_id);

多行子查詢

也稱為集合比較子查詢

內查詢返回多行

使用多行比較操作符

多行比較操作符

代碼示例

題目:返回其它job_id中比job_id為‘IT_PROG’部門任一工資低的員工的員工號、姓名、job_id 以及salary

題目:返回其它job_id中比job_id為‘IT_PROG’部門所有工資都低的員工的員工號、姓名、job_id以及id

題目:查詢平均工資最低的部門id

SELECT department_id
FROM employees
GROUP BY department_id
HAVING AVG(salary) <= ALL (
        SELECT AVG(salary) avg_sal
        FROM employees
        GROUP BY department_id)
SELECT department_id
FROM employees
GROUP BY department_id
HAVING AVG(salary) = (
SELECT MIN(avg_sal)
FROM (
        SELECT AVG(salary) avg_sal
        FROM employees
        GROUP BY department_id
        ) dept_avg_sal
)

到此這篇關於MySQL子查詢的使用詳解上篇的文章就介紹到這瞭,更多相關MySQL子查詢內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: