MySQL-多表查询
wangjia 2024-03-15 mysql
# 一.多表查询
多表查询顾名思义就是从多张表中一次性的查询出我们想要的数据。 准备数据:
DROP TABLE IF EXISTS emp;
DROP TABLE IF EXISTS dept;
# 创建部门表
CREATE TABLE dept(
did INT PRIMARY KEY AUTO_INCREMENT,
dname VARCHAR(20)
);
# 创建员工表
CREATE TABLE emp (
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(10),
gender CHAR(1), -- 性别
salary DOUBLE, -- 工资
join_date DATE, -- 入职日期
dep_id INT,
FOREIGN KEY (dep_id) REFERENCES dept(did) -- 外键,关联部门表(部门表的主键)
);
-- 添加部门数据
INSERT INTO dept (dNAME) VALUES ('研发部'),('市场部'),('财务部'),('销售部');
-- 添加员工数据
INSERT INTO emp(NAME,gender,salary,join_date,dep_id) VALUES
('孙悟空','男',7200,'2013-02-24',1),
('猪八戒','男',3600,'2010-12-02',2),
('唐僧','男',9000,'2008-08-08',2),
('白骨精','女',5000,'2015-10-07',3),
('蜘蛛精','女',4500,'2011-03-14',1),
('小白龙','男',2500,'2011-02-14',null);
执行下面的多表查询语句
select * from emp , dept; -- 从emp和dept表中查询所有的字段数据
执行结果:
从上面的结果我们看到有一些无效数据,出现了笛卡尔积现象。所以我们要通过限制员工表中的 dep_id 字段的值和部门表 did 字段的值相等来消除这些无效的数据。
select * from emp , dept where emp.dep_id = dept.did;
执行结果:
# ###二.外连接查询
数据库外连接(Outer Join)是SQL查询中的一项重要技术,它允许在连接两个或多个表时返回所有记录,即使在匹配条件中没有关联记录也会显示结果。这种技术在处理数据完整性、数据分析和数据整合等方面具有重要作用。 1.外连接类型:左外连接,右外连接。 左外连接:相当于查询A表所有数据和交集部分数据。 右外连接:相当于查询B表所有数据和交集部分数据。
2.语法:
-- 左外连接
SELECT 字段列表 FROM 表1 LEFT [OUTER] JOIN 表2 ON 条件;
-- 右外连接
SELECT 字段列表 FROM 表1 RIGHT [OUTER] JOIN 表2 ON 条件;
3.示例
1.查询emp表所有数据和对应的部门信息(左外连接)
select * from emp left join dept on emp.dep_id = dept.did;
执行结果:
结果显示查询到了左表(emp)中所有的数据及两张表能关联的数据。
# 2.查询dept表所有数据和对应的员工信息(右外连接)
select * from emp right join dept on emp.dep_id = dept.did;
执行结果:
结果显示查询到了右表(dept)中所有的数据及两张表能关联的数据。
要查询出部门表中所有的数据,也可以通过左外连接实现,只需要将两个表的位置进行互换:
select * from dept left join emp on emp.dep_id = dept.did;
执行结果:

###三.自连接查询 一.概念 自连接的操作实质上是将一张表当作两张表来处理,通过设定连接条件,使得表中的行与其自身或其他行进行配对。在SQL查询语句中,通常会为表定义别名以区分“左表”和“右表”,即使它们实际上是同一张表。
示例: 需求:查询工资高于猪八戒的员工信息(此处可以查看<<子查询的文档>>,对比一下有什么不同,下面示例,使用自连接实现)
- 一.多表查询
- ###二.外连接查询
- 2.查询dept表所有数据和对应的员工信息(右外连接) select * from emp right join dept on emp.dep_id = dept.did; 执行结果: ! 结果显示查询到了右表(dept)中所有的数据及两张表能关联的数据。 要查询出部门表中所有的数据,也可以通过左外连接实现,只需要将两个表的位置进行互换: select * from dept left join emp on emp.dep_id = dept.did; 执行结果: 