mySql多表高級查詢總結

mySql多表查詢總結 (需要有一定的sql基礎)

  1. 簡單的多表查詢
    1.1. 多表查詢語法
select  字段1,字段2... from 表1,表2... [where 條件]

例子: 查詢人員和部門所有信息
select * from person, dept where person.did = dept.did;

  1. 多表鏈接查詢
    2.1. 多表連接查詢語法(重點)
SELECT 字段列表
    FROM 表1  INNER|LEFT|RIGHT JOIN  表2
ON 表1.字段 = 表2.字段;

2.2. 內連接 - 查詢人員和部門所有信息

select * from person inner join dept  on person.did = dept.did;

內連接查詢與多表聯合查詢的效果是一樣的.

2.3. 左外連接查詢 (左邊表中的數據優先全部顯示)
查詢人員和部門所有信息

select * from person left join  dept  on  person.did =dept.did;

效果:人員表中的數據全部都顯示,而 部門表中的數據符合條件的纔會顯示,不符合條件的會以 null 進行填充.

2.4. 右外連接查詢 (右邊表中的數據優先全部顯示)

#查詢人員和部門所有信息

select * from person right join  dept  on  person.did =dept.did;

2.5. 全連接查詢(顯示左右表中全部數據)

全連接查詢:是在內連接的基礎上增加 左右兩邊沒有顯示的數據
  注意: mysql並不支持全連接 full JOIN 關鍵字
  注意: 但是mysql 提供了 UNION 關鍵字.使用 UNION 可以間接實現 full JOIN 功能
查詢人員和部門的所有數據

SELECT * FROM person LEFT JOIN dept ON person.did = dept.did
UNION
SELECT * FROM person RIGHT JOIN dept ON person.did = dept.did;
  1. mysql 部分內置函數
    MAX(),MIN()
    查詢每個部門中最高工資和最低工資是多少,顯示部門名稱
select MAX(salary),MIN(salary),dept.dname from 
        person LEFT JOIN dept
            ON person.did = dept.did
 GROUP BY person.did;
  1. 子查詢(嵌套查詢): 查多次, 多個select

注意: 第一次的查詢結果可以作爲第二次的查詢的 條件 或者 表名 使用.

子查詢中可以包含:IN、NOT IN、ANY、ALL、EXISTS 和 NOT EXISTS等關鍵字. 還可以包含比較運算符:= 、 !=、> 、<等.
4.1. 可以把查詢到的結果用來當做表名使用

select * from (select * from person) as 表名;

ps:大家需要注意的是: 一條語句中可以有多個這樣的子查詢,在執行時,最裏層括號(sql語句) 具有優先執行權.
注意: as 後面的表名稱不能加引號(’’)
4.2.求最大工資那個人的姓名和薪水

select name, salary from person where salary=(select max(salary) from person);

將括號沒查詢到的結果作爲了一個查詢的判斷條件來使用
4.3. 求工資高於所有人員平均工資的人員

select name, salary from person where salary >(select avg(salary) from person);

4.4. 查詢平均年齡在20歲以上的部門名

SELECT * from dept where dept.did in (
    select dept_id from person GROUP BY dept_id HAVING avg(person.age) > 20
);

5. 關鍵字

all, any, some

例如

select * from person p where p.id > any (select id from department);

any() 括號中必須是查詢語句。

EXISTS

SELECT * FROM person WHERE EXISTS (SELECT * FROM department WHERE id = 1);

該語法可以理解爲:主查詢(外部查詢)會根據子查詢驗證結果(TRUE 或 FALSE)來決定主查詢是否得以執行。

當然,EXISTS關鍵字可以與其他的查詢條件一起使用,條件表達式與EXISTS關鍵字之間用AND或者OR來連接,如下:

SELECT * FROM person   WHERE id > 1 AND NOT EXISTS  (SELECT * FROM department WHERE id=1);

EXISTS (subquery) 只返回 TRUE 或 FALSE,因此子查詢中的 SELECT * 也可以是 SELECT 1 或其他,官方說法是實際執行時會忽略 SELECT 清單,因此沒有區別。
6. 臨時表查詢
查詢高於本部門平均工資的人員
分成兩步驟
第一步想查詢出本部門的平均工資

select avg(salary), det_id from person group by det_id

第二步驟
將第一步查詢出來的結果作爲一張臨時表來使用

select * from person p, (select avg(salary) as asalary, det_id from person group by det_id) temp where p.det_id = temp.det_id and p.salary > temp.asalary
  1. 判斷查詢
    判斷查詢就是mysql 裏的if關鍵字
    例如:
    根據工資高低,將人員劃分爲兩個級別,分別爲 高收入人羣和低收入人羣。顯示效果:姓名,年齡,性別,工資,級別
    select *,if(p.salary > 20, ‘高收入人羣’, ‘低收入人羣’) as ‘級別’ from person p;
    語法: IF(條件表達式,“結果爲true”,‘結果爲false’);
    在這裏插入圖片描述
    根據工資高低,統計每個部門人員收入情況,劃分爲 高高薪,高薪’,中薪,低薪 四個級別, 要求統計四個級別分別有多少人
select d.name '部門',
sum(case when p.salary >20 then 1 else 0 END) as '高高薪',
sum(case when p.salary between 15 and 20 then 1 else 0 END) as '高薪',
sum(case when p.salary between 10 and 14 then 1 else 0 END) as '中薪',
sum(case when p.salary < 10 then 1 else 0 END) as '低薪'
from person p, department d where p.det_id = d.id group by d.id;

在這裏插入圖片描述
注意: between and 中 小的數字要在前面大的數字要在後面
例如 between 1 and 2
而不是 between 2 and 1

case when

SELECT
    CASE WHEN STATE = '1' THEN '成功'
         WHEN STATE = '2' THEN '失敗'
         ELSE '其他' END 
FROM 表;
 
#語法二:
SELECT CASE age
           WHEN 23 THEN '23歲'
           WHEN 27 THEN '27歲'
           WHEN 30 THEN '30歲'
        ELSE '其他歲' END
FROM person;

引用 https://blog.csdn.net/aaronthon/article/details/81714428
中間加了一些自己的總結和心得以及自己的實例

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章