连表查询: 把不同表的数据通过连表查询整合在一起
在使用连表查询的时候字段名前面最好加上表名去进行操作,因为多张表中可能有重复的字段
连表时注意条件(left on 后面的条件)中的两个字段的数据类型要一致,不然查询速度会变慢
- 部门表
_files/Image.png)
# 创建表
create table department(
id int auto_increment primary key,
dname varchar(10)
) engine=innodb default charset=utf8;
# 插入数据
insert into department(dname) values ('技术部'),('人事部'),('前台'),('公关部');
- 排班表
_files/Image [1].png)
# 创建表
create table scheduling(
id int auto_increment primary key,
sname varchar(10)
) engine=innodb default charset=utf8;
# 插入数据
insert into scheduling(sname) values ('早班'),('晚班');
- 员工表
_files/Image [2].png)
# 员工表
create table employee(
id int auto_increment primary key,
name varchar(10),
age int,
did int,
sid int,
constraint fk_department_did foreign key (did) references department(id),
constraint fk_scheduling_did foreign key (sid) references scheduling(id)
) engine=innodb default charset=utf8;
# 插入数据
insert into employee ( name, age, did, sid )
values
( 'Kevin', 20, 2, 1 ), ( 'AGA', 29, 3, 2 ), ( 'Yeung', 25, 2, 1 ), ( 'Eric', 19, 1, 1 ), ( '凯文', 21, 2, 2 ), ( 'Jack', 24, 2, 2 ), ( 'Aimer', 35, 1, 1 ), ( 'Timmy', 26, 3, 2 )
1. 连表查询方法一
# select 表A名.字段名, 表B名.字段名 from 表A名, 表B名 where 条件
# 将员工属于哪一个部门的整合在一起显示,通过判断部门 id 是否相等
select employee.name, employee.age, department.dname from employee, department where employee.did = department.id;
_files/Image [3].png)
2. 连表查询方法二 -> 推荐使用
- left join -> 以左边表为准显示左边表的全部数据 -> 常用 -> left join 是 left outer join 的简写
# select 表A名.字段名, 表B名.字段名 from 表A名 left join 表B名 on 条件
select employee.name,employee.age,department.dname from employee left join department on employee.did = department.id;
_files/Image [4].png)
- right join -> 以右边表为准显示右边表的全部数据 -> 如果左边表没有关联这条数据的信息就会显示NULL(员工表没有一个员工是公关部的,那么使用 right join 显示以部门表为准的全部数据的时候公关部就会显示 NULL) -> right join 是 right outer join 的简写
# select 表A名.字段名, 表B名.字段名 from 表A名 right join 表B名 on 条件
select employee.name,employee.age,department.dname from employee right join department on employee.did = department.id;
_files/Image [5].png)
- inner join -> 连表后遇到 NULL 数据就会把这一行数据隐藏掉 -> 常用 -> innerjoin 是 innerouter join 的简写
# select 表A名.字段名, 表B名.字段名 from 表A名 inner join 表B名 on 条件
select employee.name,employee.age,department.dname from employee inner join department on employee.did = department.id;
_files/Image [6].png)
- 同时关联多张表
select
employee.name, employee.age, department.dname, scheduling.sname
from employee
left join department on employee.did = department.id
left join scheduling on employee.sid = scheduling.id;
_files/Image [7].png)
3. 连表查询方法三 -> 不常用了解就可以
- union -> 上线连表(把表B的数据追加到表A的下面)-> 注意: 上下连表的列数必须是一样的
select * from department union select * from scheduling;
_files/Image [8].png)
- union 自带去重
select * from department union select * from department;
_files/Image [9].png)
- union all 没有去重功能
select * from department union all select * from department;
_files/Image [10].png)
← 设置自增列的步长