目錄
1 多表查詢
1.1 多表查詢概述
多表查詢就是從多個表中進行數據的查詢操作,語法:select 列名列表 from 表名的列表 where...
【準備數據】:創建兩張表並插入數據
# 創建部門表
CREATE TABLE dept(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(20)
);
INSERT INTO dept (NAME) VALUES ('開發部'),('市場部'),('財務部');
# 創建員工表
CREATE TABLE emp (`dept`
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('孫悟空','男',7200,'2013-02-24',1);
INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('豬八戒','男',3600,'2010-12-02',2);
INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('唐僧','男',9000,'2008-08-08',2);
INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('白骨精','女',5000,'2015-10-07',3);
INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('蜘蛛精','女',4500,'2011-03-14',1);
【查詢數據】:SELECT *FROM dept,emp;
從查詢結果中可以看到共計15條數據,這個查詢結果叫做笛卡爾積,如查詢2個表,每個表中的數據條數分別爲A,B,則查詢的結果條數就是A*B;但是看如下結果,很多也是無用的,甚至錯誤的(如部門編號),這時就要消除無用數據。
1.2 多表查詢的分類
1.2.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.name -- 部門表名稱
FROM
emp t1,
dept t2
WHERE
t1.`dept_id` = t2.`id`;
2)顯式內連接:
語法:select 字段列表 from 表名 [inner] join 表名2 on 條件(inner可選)
SELECT *FROM emp INNER JOIN dept ON emp.`dept_id`= dept.`id`;
SELECT *FROM emp JOIN dept ON emp.`dept_id`= dept.`id`;
3)內連接查詢注意事項:
- 從哪些表中查詢;
- 條件是什麼;
- 查詢哪些字段;
1.2.2 外連接查詢
1)左外連接:查詢的是左表所有的數據及其交集部分。
語法:select 字段列表 from 表1 left [outer] join 表2 on 條件
-- emp中手動添加了張三,部門爲null
-- 查詢所有員工信息,若員工有部門,則查詢部門名稱,沒有部門,則不顯示部門名稱
-- 下面查詢不能滿足需求
SELECT
t1.*,t2.`NAME`
FROM
emp t1,dept t2
WHERE
t1.`dept_id` = t2.`id`;
-- 使用左外連接查詢
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 條件
1.2.3 子查詢
【概念】:子查詢就是查詢中嵌套查詢,稱嵌套查詢爲子查詢。
【舉例】:查詢工資最高的員工信息
-- 查詢工資最高的員工信息
-- 1,查詢最高工資是多少
SELECT MAX(salary) FROM emp;
-- 2,查詢員工信息,且工資==最高的
SELECT *FROM emp WHERE emp.`salary` = 9000;
-- 如何用一條SQL語句實現?可以,使用子查詢
SELECT *FROM emp WHERE emp.`salary` = (SELECT MAX(salary) FROM emp);
【子查詢的不同情況】
1)子查詢的結果是單列的
- 子查詢可以作爲條件,使用運算符進行判斷(> >= < <= =),如上述的舉例,下例也是
-- 查詢員工工資小於平均工資的人
SELECT *FROM emp WHERE emp.`salary` < (SELECT AVG(salary) FROM emp);
2)子查詢的結果是多行單列的
- 子查詢可以作爲條件,使用運算符in來判斷
-- 查詢財務部、市場部所有的員工信息
SELECT id FROM dept WHERE NAME = '財務部' OR NAME = '市場部';
SELECT * FROM emp WHERE dept_id IN(2,3);
-- 查詢結果多行單列
SELECT * FROM emp WHERE dept_id IN(SELECT id FROM dept WHERE NAME = '財務部' OR NAME = '市場部');
3)子查詢的結果是多行多列的
- 子查詢可以作爲一張虛擬表
-- 查詢員工的入職日期是2011-11-10之後的員工信息及部門信息
使用普通內連接方法也可以實現:
SELECT *FROM emp WHERE emp.`join_date` > '2011-11-10';
SELECT *FROM dept t1,(SELECT *FROM emp WHERE emp.`join_date` > '2011-11-10') 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-10';
———————————————————————————————————————
本文爲博主原創文章,轉載請註明出處!
若本文對您有些許幫助,輕擡您發財的小手,關注/評論/點贊/收藏,就是對我最大的支持!
祝君升職加薪,鵬程萬里!