#創建部門表
CREATE TABLE dept(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(20)
);
INSERT INTO dept (NAME) VALUES (‘開發部’),(‘市場部’),(‘財務部’);
#創建員工表
CREATE TABLE emp(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(10),
gender CHAR(1),-- 性別
salary DOUBLE,
join_date DATE,-- 入職日期
dept_id INT,
FOREIGN KEY (dept_id) REFERENCES dept(id)-- 外鍵,關聯部門表(部門表的主鍵)
);
INSERT INTO emp (NAME,gender,salary,join_date,dept_id) VALUES (‘花千骨’,‘女’,7000,‘2020-02-09’,1);
INSERT INTO emp (NAME,gender,salary,join_date,dept_id) VALUES (‘白子畫’,‘男’,8000,‘2020-05-08’,2);
INSERT INTO emp (NAME,gender,salary,join_date,dept_id) VALUES (‘瀰漫天’,‘女’,9000,‘2020-1-30’,2);
INSERT INTO emp (NAME,gender,salary,join_date,dept_id) VALUES (‘糖寶’,‘女’,7500,‘2020-02-14’,3);
INSERT INTO emp (NAME,gender,salary,join_date,dept_id) VALUES (‘範閒’,‘男’,8500,‘2020-02-01’,1);
#查看部門表
SELECT * FROM dept;
#查看員工表
SELECT * FROM emp;
SELECT * FROM dept,emp;
SELECT * FROM emp,dept;
顯示兩表的笛卡兒積
那麼,如何消除不需要的數據?
多表查詢的分類:
1、內連接查詢:
- 隱式內連接:使用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.id
FROM emp t1,dept t2
WHERE t1.dept_id
= t2.id
- 顯式內連接
語法:
SELECT 字段列表 FROM 表名1 INNER JOIN 表名2 ON 條件(inner)可以省略
如:
SELECT * FROM emp INNER JOIN dept ON emp.dept_id
= dept.id
; - 注意:查詢哪些表,條件是什麼,展示字段有哪些
2、外連接查詢:
- 左外連接:
語法:
SELECT 字段列表 FROM 表1 LEFT OUTER JOIN 表2 ON 條件;(outer也可選)
如:
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 條件;(outer也可選)
如:
SELECT t1.*,t2.name
FROM emp t1 RIGHT JOIN dept t2 ON t1.dept_id
=t2.id
;
3、子查詢:
查詢中嵌套查詢,稱爲子查詢
– 查詢工資最高的員工信息
– 1、查詢最高的工資是多少 9000
SELECT MAX(salary) FROM emp;
– 2、查詢員工信息,並且工資等於最大值的
SELECT * FROM emp WHERE emp.salary
= 9000;
– 一步到位
SELECT * FROM emp WHERE emp.salary
= (SELECT MAX(salary) FROM emp);
子查詢的不同情況
-
子查詢的結果是單行單列的
子查詢可以作爲條件,使用運算符去判斷
– 查詢員工工資小於平均工資的人
SELECT * FROM emp WHERE emp.salary
< (SELECT AVG(salary) FROM emp); -
子查詢的結果是多行單列的
– 查詢財務部的所有員工信息
SELECT id FROM dept WHERE NAME = ‘財務部’;
SELECT * FROM emp WHERE dept_id = 3;
– 查詢財務部和市場部的所有員工信息
SELECT id FROM dept WHERE NAME = ‘財務部’ OR NAME = ‘市場部’;
SELECT * FROM emp WHERE dept_id = 3 OR dept_id = 2;
SELECT id FROM dept WHERE NAME IN (‘財務部’,‘市場部’);
SELECT * FROM emp WHERE dept_id IN (3,2);
– 子查詢
SELECT * FROM emp WHERE dept_id IN (SELECT id FROM dept WHERE NAME IN (‘財務部’,‘市場部’));
子查詢可作爲條件,使用運算符in來判斷 -
子查詢的結果是多行多列的
– 查詢員工入職日期是2020-02-09之後的員工信息和部門信息
SELECT * FROM emp WHERE emp.join_date
>‘2020-02-09’;
SELECT * FROM dept t1,(SELECT * FROM emp WHERE emp.join_date
>‘2020-02-09’) t2
WHERE t1.id
= t2.dept_id;
————————————
– 普通內連接也可實現
SELECT * FROM emp t1,dept t2 WHERE t1.dept_id
= t2.id
AND t1.join_date
> ‘2020-02-09’;
子查詢可作爲一張虛擬表