MySql嵌套查詢+關聯查詢+多表查詢+對應案例 超詳細,一看就會!!!

最近學習MyBatis框架 用到多表查詢比較多,以前學的不是很好,今特意回來補上。嗚嗚嗚。

先看我的數據庫表

總共
4張表

  1. 老師職位表 tb_position
    在這裏插入圖片描述
  2. 學生表(爲了好辨認效果) tb_student
    在這裏插入圖片描述
  3. 老師表 (id 班級 老師名字 職位對應表) tb_teacher
    在這裏插入圖片描述
  4. 老師與學生的關係對應表,畢竟有多種關係 多對多 tb_stu_teach
    在這裏插入圖片描述

1. INNER JOIN 內連接

-- 把兩張表中 某列 相同值的給查詢出來
select stu.t_stu_name,tea.t_no,tea.t_name
from  tb_teacher tea 
INNER JOIN tb_student stu 
on stu.id = tea.id;

在這裏插入圖片描述

2 .LEFT JOIN 左查詢

-- 左查詢  
-- 以左邊的表的數據爲基準, 去匹配右邊的表的數據,如果匹配到就顯示,匹配不到就顯示爲null;
SELECT STU.T_STU_NAME,TEA.T_NAME
FROM tb_student STU
LEFT JOIN tb_teacher TEA
ON STU.id = TEA.id;

在這裏插入圖片描述

3. RIGHT JOIN 右查詢

-- 右查詢  
-- 以右邊的表的數據爲基準,去匹配左邊的表的數據,如果匹配到就顯示,匹配不到就顯示爲null;
SELECT STU.T_STU_NAME,TEA.T_NAME
FROM tb_teacher TEA   --所謂的左邊
RIGHT JOIN  tb_student STU  --所謂的右邊
ON STU.id = TEA.id;

在這裏插入圖片描述

4. UNION 全外連接

-- 把兩張表的字段都查出來,沒有對應的值就顯示null,
-- 注意:mysql是沒有全外連接的(mysql中沒有full outer join關鍵字),想要達到全外連接的效果,可以使用union關鍵字連接左外連接和右外連接; 
(兩個select 除了關鍵字不一樣  其他都得一樣,可以試試把查出來的值換一個 試試 哈哈哈)
SELECT STU.T_STU_NAME,TEA.T_NAME
FROM tb_student STU
LEFT JOIN tb_teacher TEA
ON STU.id = TEA.id
UNION
SELECT STU.T_STU_NAME,TEA.T_NAME
FROM tb_student STU
RIGHT JOIN  tb_teacher TEA
ON STU.id = TEA.id;

爲了看出不同 在教師表中添加了一行數據
在這裏插入圖片描述

5. LIMIT 分頁查詢

-- INDEX =(當前頁碼-1)*個數
 -- 下標從 INDEX 開始  查詢  X 條  我這裏  index是0,x是3 
SELECT * 
FROM tb_student
LIMIT 0,3;

在這裏插入圖片描述

6. ORDER BY 排序查詢

默認爲 升序 可以用關鍵字 DESC(降序) ASC(升序)

SELECT * 
FROM tb_teacher
ORDER BY position_id 
DESC;  -- 降序

在這裏插入圖片描述

SELECT * 
FROM tb_teacher
ORDER BY position_id 
ASC;  -- 升序

在這裏插入圖片描述

7. 聚合函數

在查詢數據時 可以將一列數據進行縱向的計算
在這裏插入圖片描述
用法 : 聚合函數查詢的語法 SELECT 聚合函數(列名) FROM 表名

-- 計算教師id平局值
SELECT AVG(ID) 
FROM tb_teacher; 

在這裏插入圖片描述
在這裏插入圖片描述

8.分組查詢

按照特定條件把數據進行分組,把每一組當做一個整體,分別對某一組數據進行計算。
分組查詢語法,字段列表只能是分組列、或者聚合函數

標準語句 SELECT 字段列表 FROM 表名 where 分組前條件 GROUP BY 分組列名 HAVING 分組後條件

  1. 對所有數據分組查詢
-- 按教師的職位分類 查詢 當前職業教師的個數
SELECT COUNT(*),
FROM tb_teacher 
GROUP BY position_id;

在這裏插入圖片描述
2. 分組前篩選


-- 分組前篩選 將id大於2的按教師的職位分類 查詢 當前職業教師的個數
SELECT COUNT(*)
FROM tb_teacher
WHERE  id>2
GROUP BY position_id;

在這裏插入圖片描述
在這裏插入圖片描述

3.分組後篩選

因爲 數據表建不適合演示這個 所以把用法貼在這

 SELECT 你要顯示的一些數據,比如平均數(COUNT(列名),列名
 FROM 表名 
 WHERE  分組條件  比如 分數大於60 。。等等等 
 GROUP BY   第二個分組條件  , 當然先執行上面那個  
 HAVING 通過查找出來的數據  通過一些條件在進行篩選  ;   z

【表達的有點繞】

9.嵌套查詢

  1. 子查詢:一般在子查詢中,程序先運行在嵌套在最內層的語句,再運行外層。因此在寫子查詢語句時,可以先測試下內層的子查詢語句是否輸出了想要的內容,再一層層往外測試,增加子查詢正確率。否則多層的嵌套使語句可讀性很低。
  2. 子查詢一般出現在FROM和WHERE子句中。
  3. 子查詢在主查詢前執行一次
  4. 主查詢使用子查詢的結果

1. IN 表示值是否存在子查詢結果集中

--  1. 先查詢出 我的教師表中的 id
--  2. 再根據子查詢的id ,尋找我學生表中對應的id
SELECT * 
FROM tb_student 
WHERE id 
IN (SELECT id FROM tb_teacher)

在這裏插入圖片描述

2. EXISTS 是表示子查詢是否返回結果,而不管返回的具體內容。

SELECT * 
FROM tb_student 
WHERE
EXISTS (SELECT * FROM tb_teacher WHERE id=2)
-- 我這裏的子查詢爲能查到結果  所以返回值如下
-- 要是我將子查詢條件設置爲  WHERE id=100  因爲我教師表中,沒有id爲100的,所以總的查詢結果爲null.

在這裏插入圖片描述
在這裏插入圖片描述

3.ALL表示子查詢結果中的所有。

all表示要大於子查詢結果中的所有,纔會返回true, not in 相當於“<>all”.

-- 1. 先查出教師表中  id<=2的  
-- 2.在查出學生表中的id > 教師表查出結果的數值 (每個值都會比較)
SELECT * 
FROM tb_student 
WHERE id>
All (SELECT id FROM tb_teacher WHERE id <=2)

在這裏插入圖片描述

4.ANY是表示子查詢結果中任意一個

any表示只要大於子查詢結果中的任一個,表達式就成立,=any表示等於子查詢中的任一個,相當於in.

SELECT * 
FROM tb_student 
WHERE id>
ANY (SELECT id FROM tb_teacher WHERE id <=2)

在這裏插入圖片描述

  1. in在子查詢不返回數據的時候,爲false,子查詢結果中有null的時候,null不會用於比較。
  2. any 同樣在子查詢不返回數據的時候,爲false,子查詢結果中有null的時候,null不會用於比較。
  3. all在子查詢不返回數據的時候,爲true,子查詢結果中有null的時候,不會返回數據。
  4. not in 或not exists來代替.
  5. not in 不等於<> any,相當於<>all,
  6. <>any是隻要不等於其中的任意一個,就成立

關於 IN,NOT IN,ANY和ALL使用時的陷進 可以看一下這篇帖子
https://blog.csdn.net/kkdelta/article/details/7468850

會繼續更新~~~

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