MySQL数据库:8、多表查询的方法与思路
一、多表查询思路
指需要处理多张具有关系的表数据时,可以通过多表查询方法来加快数据的处理和查询时间
数据准备
创建部门表:
create table dep(
id int primary key auto_increment,
name varchar(20)
);
创建员工信息表:
create table emp(
id int primary key auto_increment,
name varchar(20),
sex enum('male','female') not null default 'male',
age int,
dep_id int
);
插入数据:
insert into dep values
(200,'技术'),
(201,'人力资源'),
(202,'销售'),
(203,'运营'),
(205,'财务');
insert into emp(name,sex,age,dep_id) values
('jason','male',18,200),
('dragon','female',48,201),
('kevin','male',18,201),
('nick','male',28,202),
('owen','male',18,203),
('jerry','female',18,204);
1、笛卡尔积
- 介绍:
- 笛卡尔积是一种多表查询的方法名称,通过笛卡尔其可以对两张有对应关系的表格进行拼接(通过select 方法一次性读出两张表)
- 缺点:
- select 方法一次性读出了两张表,但是表的数据发生了错乱,字段发生了冲突,这种查询方式非常浪费资源,此种查询方式称为‘笛卡尔积’
1、1.代码实践
select * from emp,dep;
1、2.笛卡尔积进阶操作
- 介绍
- 通过对笛卡尔其将两张关系表进行连接时,可通过设置条件的方式来使数据进行匹配,通过此种方式可以节省笛卡尔积浪费的空间
- 缺点:
- 此种方式可以解决笛卡尔积浪费资源的问题,但是这种方法针对大数据的处理非常耗费时间
select * from emp,dep where emp.dep_id=dep.id;
2、连表操作
连表操作可以将两张有对应关系的表格进行拼接,为程序员在处理数据时提供了方便快捷的方法
通过学习了连表操作就可以连接N多张表
思路:将拼接之后的表格通过起别名的方式再去与另一张表格进行拼接,往复此操作就可以连接多张表格
2、1.内连接
-
关键词:inner jion
-
功能:可以拼接两张有对应关系表格的共有部分
SELECT * FROM emp INNER JOIN dep ON emp.dep_id=dep.id;
2、2.左连接
-
关键词:left jion
-
功能:可以拼接两张有对应关系的表格,关键词左边的表格为主表,若主从表中没有主表中对应的数据,则主表中该部分数据对应字段名下结果以Null填充
SELECT * FROM emp LEFT JOIN dep ON emp.dep_id=dep.id;
2、3.右连接
-
关键词:right jion
-
功能:可以拼接两张有对应关系的表格,关键词右边的表格为主表,若主从表中没有主表中对应的数据,则主表中该部分数据对应字段名下结果以Null填充
SELECT * FROM emp RIGHT JOIN dep ON emp.dep_id=dep.id;
2、4.全连接
-
关键词:union
-
功能:以左右表为基准 展示所有的数据 各自没有的全部NULL填充
select * from emp LEFT JOIN dep ON emp.dep_id=dep.id
UNION
SELECT * FROM emp RIGHT JOIN dep ON emp.dep_id=dep.id;
3、子查询
子查询的思路是将一条SQL语句用括号括起来当成另一条SQL语句的查询条件
很多时候表查询需要结合实际情况判断需要用那种,更多的时候其实是连表操作结合子操作进行使用
3、1.子查询代码实践
- 题目:求姓名jason的员工的部门名称
子查询类似于生活中解决问题的方式>>>:分布操作
推导流程
步骤1:先根据jason获取部门的编号
SELECT id FROM emp WHERE name='jason';
步骤2:在根据获取到部门编号去获取部门名称
SELECT name FROM dep WHERE id IN (SELECT dep_id FROM emp WHERE name='jason');