最近學習MyBatis框架 用到多表查詢比較多,以前學的不是很好,今特意回來補上。嗚嗚嗚。
文章目錄
先看我的數據庫表
總共
4張表
- 老師職位表 tb_position
- 學生表(爲了好辨認效果) tb_student
- 老師表 (id 班級 老師名字 職位對應表) tb_teacher
- 老師與學生的關係對應表,畢竟有多種關係 多對多 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 分組後條件
- 對所有數據分組查詢
-- 按教師的職位分類 查詢 當前職業教師的個數
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.嵌套查詢
- 子查詢:一般在子查詢中,程序
先運行
在嵌套在最內層的語句,再運行
外層。因此在寫子查詢語句時,可以先測試下內層的子查詢語句是否輸出了想要的內容,再一層層往外測試,增加子查詢正確率。否則多層的嵌套使語句可讀性
很低。子查詢一般出現在FROM和WHERE子句中。
- 子查詢在主查詢前執行一次
- 主查詢使用子查詢的結果
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)
- in在子查詢不返回數據的時候,爲false,子查詢結果中有null的時候,null不會用於比較。
- any 同樣在子查詢不返回數據的時候,爲false,子查詢結果中有null的時候,null不會用於比較。
- all在子查詢不返回數據的時候,爲true,子查詢結果中有null的時候,不會返回數據。
- not in 或not exists來代替.
- not in 不等於<> any,相當於<>all,
- <>any是隻要不等於其中的任意一個,就成立
關於 IN,NOT IN,ANY和ALL使用時的陷進 可以看一下這篇帖子
https://blog.csdn.net/kkdelta/article/details/7468850
會繼續更新~~~