SQL--多表查詢(mysql) 博客說明 文章所涉及的資料來自互聯網整理和個人總結,意在於個人學習和經驗彙總,如有什麼地方侵權,請聯繫本人刪除,謝謝! 笛卡爾積 有兩個集合A,B .取這兩個集合的所有組成情況。 要完成多表查詢,需要消除無用的數據 分類 內連接查詢 1. 從哪些表中查詢數據 2. ...
SQL--多表查詢(mysql)
博客說明
文章所涉及的資料來自互聯網整理和個人總結,意在於個人學習和經驗彙總,如有什麼地方侵權,請聯繫本人刪除,謝謝!
笛卡爾積
- 有兩個集合A,B .取這兩個集合的所有組成情況。
- 要完成多表查詢,需要消除無用的數據
分類
內連接查詢
1. 從哪些表中查詢數據
2. 條件是什麼
3. 查詢哪些欄位
-
隱式內連接:
使用where條件消除無用數據
-
例子:
* -- 查詢所有員工信息和對應的部門信息 SELECT * FROM emp,dept WHERE emp.`dept_id` = dept.`id`; -- 查詢員工表的名稱,性別。部門表的名稱 SELECT emp.name,emp.gender,dept.name FROM emp,dept WHERE emp.`dept_id` = dept.`id`; SELECT t1.name, -- 員工表的姓名 t1.gender,-- 員工表的性別 t2.name -- 部門表的名稱 FROM emp t1, dept t2 WHERE t1.`dept_id` = t2.`id`;
-
-
顯式內連接:
-
語法: select 欄位列表 from 表名1 [inner] join 表名2 on 條件
SELECT * FROM emp INNER JOIN dept ON emp.`dept_id` = dept.`id`; SELECT * FROM emp JOIN dept ON emp.`dept_id` = dept.`id`;
-
外鏈接查詢
-
左外連接:
語法:select 欄位列表 from 表1 left [outer] join 表2 on 條件;
查詢的是左表所有數據以及其交集部分。
-- 查詢所有員工信息,如果員工有部門,則查詢部門名稱,沒有部門,則不顯示部門名稱 SELECT t1.*,t2.`name` FROM emp t1 LEFT JOIN dept t2 ON t1.`dept_id` = t2.`id`;
-
右外連接:
語法:select 欄位列表 from 表1 right [outer] join 表2 on 條件;
查詢的是右表所有數據以及其交集部分。
SELECT * FROM dept t2 RIGHT JOIN emp t1 ON t1.`dept_id` = t2.`id`;
子查詢
-
概念:
查詢中嵌套查詢,稱嵌套查詢為子查詢
-- 查詢工資最高的員工信息 -- 1 查詢最高的工資是多少 9000 SELECT MAX(salary) FROM emp; -- 2 查詢員工信息,並且工資等於9000的 SELECT * FROM emp WHERE emp.`salary` = 9000; -- 一條sql就完成這個操作。子查詢 SELECT * FROM emp WHERE emp.`salary` = (SELECT MAX(salary) FROM emp);
-
子查詢不同情況
-
子查詢的結果是單行單列的:
-
子查詢可以作為條件,使用運算符去判斷。 運算符: > >= < <= =
-- 查詢員工工資小於平均工資的人 SELECT * FROM emp WHERE emp.salary < (SELECT AVG(salary) FROM emp);
-
-
子查詢的結果是多行單列的:
-
子查詢可以作為條件,使用運算符in來判斷
-- 查詢'財務部'和'市場部'所有的員工信息 SELECT id FROM dept WHERE NAME = '財務部' OR NAME = '市場部'; SELECT * FROM emp WHERE dept_id = 3 OR dept_id = 2; -- 子查詢 SELECT * FROM emp WHERE dept_id IN (SELECT id FROM dept WHERE NAME = '財務部' OR NAME = '市場部');
-
-
子查詢的結果是多行多列的:
-
子查詢可以作為一張虛擬表參與查詢
-- 查詢員工入職日期是2011-11-11日之後的員工信息和部門信息 -- 子查詢 SELECT * FROM dept t1 ,(SELECT * FROM emp WHERE emp.`join_date` > '2011-11-11') t2 WHERE t1.id = t2.dept_id; -- 普通內連接 SELECT * FROM emp t1,dept t2 WHERE t1.`dept_id` = t2.`id` AND t1.`join_date` > '2011-11-11'
-
-
感謝
黑馬程式員
以及勤勞的自己
關註公眾號: 歸子莫,獲取更多的資料,還有更長的學習計劃