zl程序教程

您现在的位置是:首页 >  .Net

当前栏目

MySQL数据库:8、多表查询的方法与思路

2023-02-18 16:27:53 时间

一、多表查询思路

​ 指需要处理多张具有关系的表数据时,可以通过多表查询方法来加快数据的处理和查询时间

数据准备

创建部门表:

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;

image

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