子查詢重點難點
子查詢含義:
出現在其他語句中的select語句,稱爲子查詢或內查詢
外部的查詢語句,稱爲主查詢或外查詢
子查詢分類
一:按子查詢出現的位置分類
select 後面
僅僅支持標量子查詢
from 後面
支持表子查詢
where或having後面 重點
標量子查詢(單行) 重點
列子查詢(多行) 重點
行子查詢
exists 後面(相關主查詢)
表子查詢
按結果集的行列數不同分類
標量子查詢(結果集只有一行一列)
列子查詢(結果集只有一列多行)
行子查詢(結果集有一行多列)
表子查詢(結果集一般爲多行多列)
一:where或having後面
1:標量子查詢(單行子查詢)
2:列子查詢(多行子查詢)
3:行子查詢(多行多列)
**特點:**
1:子查詢放在小括號內
2:子查詢一般放在條件的右側
3:標量子查詢,一般搭配着多行操作符使用
<, > , <= , >=, = , <>
列子查詢,一般搭配着多行操作符使用
in , any/some, all
**4:子查詢的執行優先主查詢執行,主查詢的條件用到了子查詢的結果**
一:標量子查詢
誰的工資比Abel高
SELECT last_name FROM employees WHERE salary >( SELECT salary FROM employees WHERE last_name = 'Abel' );
返回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 );
查詢最低工資大於50號部門最低工資的部門id和其最低工資
SELECT
department_id,
min( salary )
FROM
employees
GROUP BY
department_id
HAVING
min( salary )> ( SELECT MIN( salary ) FROM employees WHERE department_id = 50 );
列子查詢(多行子查詢)
返回location_id是1400或1700的部門中的所有員工姓名
SELECT
last_name
FROM
employees
WHERE
department_id IN (
SELECT DISTINCT
department_id
FROM
departments
WHERE
location_id IN ( 1400, 1700 ));
返回其他工種中比job_id爲IT_PROG部門任意工資低的員工的姓名,Job_id以及salary
SELECT
last_name,
job_id,
salary
FROM
employees
WHERE
salary < ANY ( SELECT DISTINCT salary FROM employees WHERE job_id = 'IT_PROG' )
AND job_id <> 'IT_PROG';
返回其他工種中比job_id爲IT_PROG部門所有工資低的員工的姓名,Job_id以及salary
SELECT
last_name,
job_id,
salary
FROM
employees
WHERE
salary < ALL ( SELECT DISTINCT salary FROM employees WHERE job_id = 'IT_PROG' )
AND job_id <> 'IT_PROG';
行子查詢(結果集一行多列或多行多列)
## 查詢員工編號最小並且工資最高的員工信息
SELECT * FROM employees WHERE ( employee_id, salary )=( SELECT MIN( employee_id ), MAX( salary ) FROM employees );
二:select後面
查詢每個部門的員工個數 難點重點
SELECT d.*,( SELECT COUNT(*) FROM employees e WHERE e.department_id = d.department_id ) '員工個數'
FROM
departments d
GROUP BY
d.department_id;
查詢員工號=102的部門名 難點重點
SELECT
( SELECT d.department_name FROM employees e INNER JOIN departments d ON e.department_id = d.department_id WHERE e.employee_id = 102 ) '部門名';
三:from後面
注意:
將子查詢的結果充當一張表,要求必須起別名
案例:查詢每個部門的平均工資的工資等級 重點難點
SELECT
avg_temp.*,
j.grade_level
FROM
( SELECT avg( salary ) ag, department_id FROM employees GROUP BY department_id ) AS avg_temp
INNER JOIN job_grades j ON avg_temp.ag BETWEEN j.lowest_sal
AND j.highest_sal;
四:exists後面(相關子查詢)
語法:
exists(完整的查詢語句)
結果:1或0
案例:查詢有員工的部門名
#第一種方式使用in方式
SELECT
department_id,
department_name
FROM
departments
WHERE
department_id IN ( SELECT department_id FROM employees );
# 第二種使用exists方式
SELECT
department_id,
department_name
FROM
departments d
WHERE
EXISTS ( SELECT * FROM employees e WHERE e.department_id = d.department_id );
查詢沒有女朋友的男神信息
#第一種是用exists方式
SELECT
bo.*
FROM
boys bo
WHERE
NOT EXISTS ( SELECT boyfriend_id FROM beauty b WHERE bo.id = b.boyfriend_id );
#第二種使用in的方式
SELECT
bo.*
FROM
boys bo
WHERE
bo.id NOT IN ( SELECT boyfriend_id FROM beauty );
練習題:
查詢和zlotkey相同部門的員工姓名和工資
SELECT last_name, salary FROM employees e WHERE e.department_id =( SELECT department_id FROM employees WHERE last_name = 'zlotkey' );
查詢工資比公司平均工資高的員工的員工號,姓名和工資
SELECT employee_id, salary, last_name FROM employees WHERE salary >( SELECT AVG( salary ) FROM employees );
查詢各部門中工資比本部門平均工資高的員工的員工號,姓名,工資 重點難點
SELECT
employee_id,
last_name,
salary,
e.department_id
FROM
employees e
INNER JOIN ( SELECT avg( salary ) ag, department_id FROM employees GROUP BY department_id ) ag_temp ON e.department_id = ag_temp.department_id
WHERE
salary > ag_temp.ag;
查詢和姓名中含含字母u的員工在相同部門的員工的員工號和姓名
SELECT
employee_id,
last_name
FROM
employees
WHERE
department_id IN ( SELECT DISTINCT department_id FROM employees WHERE last_name LIKE '%u%' );
查詢在部門的location_id爲1700的部門工作的員工的員工號
SELECT
employee_id
FROM
employees
WHERE
department_id IN ( SELECT DISTINCT department_id FROM departments WHERE location_id = 1700 );
查詢管理者是k_ing的員工姓名和工資
SELECT
last_name,
salary
FROM
employees
WHERE
manager_id IN ( SELECT employee_id FROM employees WHERE last_name = 'k_ing' );
查詢工資最高的員工的姓名,要求first_name和last_name顯示一列,列名爲姓.名 重點 concat函數拼接字符串
SELECT CONCAT( first_name, last_name ) '姓.名' FROM employees WHERE salary =( SELECT MAX( salary ) FROM employees );
分頁查詢
應用場景:當顯示的數據,一頁顯示不全,需要分頁提交sql請求
語法分頁
select 查詢列表
from 表1 別名
【left,inner,right】 join 表2 別名
on 連接條件
where 篩選條件
group by 分組字段
having 分組後篩選
order by 排序的字段
limit offset,size
offset 要顯示條目的起始索引 (起始索引從0開始)
size 要顯示的條目個數
分頁特點:
1:limit語句放在查詢的最好
2:公式
要顯示的頁數page,每頁的條目數size
select 查詢列表
from 表
limit (page-1)*size,size;
案例:查詢前前五條員工信息
SELECT * FROM employees
LIMIT 0,5;
SELECT * FROM employees
LIMIT 5;
查詢第11條到第25條
SELECT * FROM employees
LIMIT 10,15;
查詢有獎金的員工信息,並且工資較高的前10名顯示出來
SELECT
*
FROM
employees
WHERE
commission_pct IS NOT NULL
ORDER BY
salary DESC
LIMIT 0,
10;
**
查詢語句設計到的所有關鍵字,以及sql執行的先後順序如圖
**