08 mysql 子查詢,UNION 聯合查詢,limit分頁
01 子查詢
在某個查詢結果之上進行的查詢.叫做子查詢,即把一個查詢(又叫內部查詢)巢狀在另一個查詢(又叫外部查詢)當中。
select … (select)…【使用較少,瞭解即可】
from …(select)…
where …(select)…
select子表(要在小括號裡)可以放到from後面,也可以用在where子句中
啥意思呢,就是先select一些東西,會生成一張臨時表,這張臨時表可取別名(別名要放在select子表的括號外),再根據這張表來查詢,即可能使用到了這張表的欄位
例1 比如要查詢,語數英三門成績都及格(大於等於60分)的人
SELECT DISTINCT NAME FROM scores WHERE NAME NOT IN (SELECT NAME FROM scores WHERE score<60);
說明:先查詢有一門科目不及格的姓名,不在這些姓名中的就是三門及格的人,再使用distinct去重
例2 如果要查詢有一門成績小於60分的人,可以這樣查
SELECT DISTINCT newscore.name FROM (SELECT NAME FROM scores WHERE score<60 ) AS newscore;
-- 或者直接這樣寫
SELECT DISTINCT NAME FROM scores WHERE score<60;
例3 找出薪水比公司平均薪水高的員工,要求顯示員工名和薪水
SELECT employeename,salary FROM employee WHERE salary>(SELECT AVG(salary)FROM employee);
例4 找出每個部門的平均薪水,並且要求顯示平均薪水的薪水等級
SELECT newtab.departmentnumber, newtab.avgsalary, s.grade FROM salarygrade s JOIN (SELECT departmentnumber, AVG(salary) avgsalary FROM employee GROUP BY departmentnumber) AS newtab ON newtab.avgsalary BETWEEN s.lowsalary AND s.highsalary ;
2 union聯合查詢
UNION 操作符用於連線兩個以上的 SELECT 語句的結果組合到一個結果集合中。多個 SELECT 語句會刪除重複的資料.
將查詢的結果集合並,合併結果集時查詢的欄位的個數必須一致
UNION 語句:用於將不同表中相同列中查詢的資料展示出來;(不包括重複資料)
UNION ALL 語句:用於將不同表中相同列中查詢的資料展示出來;(包括重複資料)
對同一張表,查詢的欄位不同值的排序方式要求不同
例5 查詢出job為MANAGER和SALESMAN的員工
SELECT employeenumber,employeename,job FROM employee WHERE job='manager'
UNION
SELECT employeenumber,employeename,job FROM employee WHERE job='salesman';
例6 查詢員工編號,姓名,工作,工資,工作為'clerk','salesman','manager'的員工按工資升序排序,工作為'analyst''president'的員工,按工資降序排序
(SELECT employeenumber,employeename,job ,salary FROM employee WHERE job IN ('cleck','salesman','manager') ORDER BY salary LIMIT 999)
UNION
(SELECT employeenumber,employeename,job,salary FROM employee WHERE job IN('analyst','president') ORDER BY salary LIMIT 999);
說明:union聯合查詢時, order by不能直接使用,要對查詢語句加括號才能使用,要使orderby生效: 必須搭配limit
3 limit
limit的作用:獲取一表前幾條戒中間某幾行資料,主要用來分頁處理,limit關鍵字只在MySQL中起作用。
用法:limit 起始下標m,長度n
m:記錄開始的index,預設從 0 開始,表示第1條記錄;
n :指從第 m+1 條開始,取 n 條;
獲取前5個員工資訊
SELECT * FROM employee LIMIT 0,5;
-- 因為從第1條資料開始算,可以省略第一個引數即索引
SELECT * FROM employee LIMIT 5;
獲取工資前5的員工編號,員工姓名,工資
SELECT employeenumber,employeename,salary FROM employee ORDER BY salary desc LIMIT 0,5;
SELECT employeenumber,employeename,salary FROM employee ORDER BY salary DESC LIMIT 5;
-- 獲取工資排名在前5-10的員工編號,姓名,工資
SELECT employeenumber ,employeename,salary FROM employee ORDER BY salary DESC LIMIT 4,6;
參考:小猴子視訊