1. 程式人生 > >08 mysql 子查詢,UNION 聯合查詢,limit分頁

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;

參考:小猴子視訊