MySQL數據庫——多表查詢之內連接查詢、外連接查詢、子查詢

目錄

1 多表查詢

1.1 多表查詢概述

1.2 多表查詢的分類

1.2.1 內連接查詢

1.2.2 外連接查詢

1.2.3 子查詢


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';

———————————————————————————————————————

本文爲博主原創文章,轉載請註明出處!

若本文對您有些許幫助,輕擡您發財的小手,關注/評論/點贊/收藏,就是對我最大的支持!

祝君升職加薪,鵬程萬里!

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