MySQL學習:多表查詢(帶實例)

#創建部門表
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、內連接查詢:

  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
    在這裏插入圖片描述
  2. 顯式內連接
    語法:
    SELECT 字段列表 FROM 表名1 INNER JOIN 表名2 ON 條件(inner)可以省略
    如:
    SELECT * FROM emp INNER JOIN dept ON emp.dept_id = dept.id;
  3. 注意:查詢哪些表,條件是什麼,展示字段有哪些

2、外連接查詢:

  1. 左外連接:
    語法:
    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;
    左外連接查詢的是左表所有數據及其交集部分。
    內連接查詢交集部分
    右外連接查詢的是右表所有數據及其交集部分。
    左右相對而言
  2. 右外連接:
    語法:
    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);

子查詢的不同情況

  1. 子查詢的結果是單行單列的
    子查詢可以作爲條件,使用運算符去判斷
    – 查詢員工工資小於平均工資的人
    SELECT * FROM emp WHERE emp.salary < (SELECT AVG(salary) FROM emp);

  2. 子查詢的結果是多行單列的
    – 查詢財務部的所有員工信息
    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來判斷

  3. 子查詢的結果是多行多列的
    – 查詢員工入職日期是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’;
    子查詢可作爲一張虛擬表

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