先建个表
最好的学习编程方式就是实践,这里有建表语句和插入数据语句,可以在数据库执行一遍。下面的例子都是以这个表为主。
#部门表
create table `tb_dept` (
`id` int(11) not null auto_increment,
`name` varchar(30) default null,
`storey` varchar(40) default null,
primary key(`id`)
) engine = innodb auto_increment=1 default charset=utf8;
#员工表
create table `tb_emp` (
`id` int(11) not null auto_increment,
`name` varchar(30) default null,
`dept_id` int(11) default null,
primary key(`id`),
key `idx_dept_id`(`dept_id`)
#, constraint `fk_dept_id` foregign key(`dept_id`) references `tb_dept` (`id`)
) engine = innodb auto_increment=1 default charset=utf8;
#部门数据
insert into `tb_dept`(`id`, `name`, `storey`) values('1', 'RD', '11');
insert into `tb_dept`(`id`, `name`, `storey`) values('2', 'HR', '12');
insert into `tb_dept`(`id`, `name`, `storey`) values('3', 'MK', '13');
insert into `tb_dept`(`id`, `name`, `storey`) values('4', 'MIS', '14');
insert into `tb_dept`(`id`, `name`, `storey`) values('5', 'FD', '15');
#员工数据
insert into `tb_emp`(`name`, `dept_id`) values('z3', 1);
insert into `tb_emp`(`name`, `dept_id`) values('z4', 1);
insert into `tb_emp`(`name`, `dept_id`) values('z5', 1);
insert into `tb_emp`(`name`, `dept_id`) values('w5', 2);
insert into `tb_emp`(`name`, `dept_id`) values('w6', 2);
insert into `tb_emp`(`name`, `dept_id`) values('s7', 3);
insert into `tb_emp`(`name`, `dept_id`) values('s8', 4);
三种join
join查询就是将两张表用一个字段链接起来,组成一张表,然后对这张表进行查询。
比如下面两个表,一个是员工表(左),一个是职位表(右),他们就可以用职位id来链接,两表取得相同的id,左表dept_id和右表id相等的是一条数据。
但是这样就会存在也许左边的表有的数据右边表找不到又或者右边表的数据左边表找不到的情况,所以就衍生出了三种查询:inner join 、left join 、 right join
inner join
就是取交集,会取两个表都存在的行
select * from tb_emp inner join tb_dept on tb_emp.dept_id = tb_dept.id;
left join
以左边的表为主,取所有左表的数据,当右表数据不存在的时候补null
select * from tb_emp left join tb_dept on tb_emp.dept_id = tb_dept.id ;
right join
以右边的表为主,取所有右表的数据,当左表数据不存在的时候补null
select * from tb_emp right join tb_dept on tb_emp.dept_id = tb_dept.id;
与子查询的区别
或许你觉得子查询也可以解决上述问题,那么它和子查询有什么区别呢?
1、子查询与join查询思路不一样
- 子查询是通过先查一条数据,再根据这条数据去其他表中查询
- join查询是根据某个字段拼接成一个表,然后在这张表中直接查询
2、子查询和join查询性能不一样
- 相对而言,join查询比子查询效率要高。因为在MySQL中进行子查询要建立一张临时表,在查询后要删除临时表,这样的操作非常影响效率。