场景:
两张表,一张emp表内是员工数据,一张dep表是部门数据,emp表内pid字段关联dep表id字段。
insert into emp(name,post,salary) values
("gaga","tec",10000),
("xjj","sale",8000),
("mb","tec",9000),
("cjj","tec",9500),
("brownie","sale",6000),
("gagaga","manager",15000);
create table dep(id int primary key auto_increment,name char(10));
insert into dep(name) values("Market"),("Tec");
alter table emp add pid int;
update table emp pid = 2 where id = 1;
update table emp pid = 1 where id = 2;
update table emp pid = 2 where id = 3;
update table emp pid = 2 where id = 4;
update table emp pid = 1 where id = 5;
update table emp pid = 1 where id = 6;
alter table emp add foreign key(pid) references dep(id);
所谓多表查询就是将有关联的两张表的对应数据查询出来
方法一:笛卡尔积
因为mysql不知道哪些字段相关联,所以做了全关联,需要我们手动在全关联表内找出所需的数据
select * from dep,emp;-- 全连接表结果
select * from dep,emp where emp.pid = dep.id;-- 手动取出所需数据,注意字段前加表名的写法
select * from dep,emp where emp.pid = dep.id and dep.name = "Tec";
方法二:连表操作
连表查询的执行效率最高,因为只进行了一次磁盘操作
inner join内连接
select * from dep inner join emp on dep.id = emp.pid;
select * from dep inner join emp on dep.id = emp.pid where dep.name = "Tec";
inner join的特点是需要被关联字段一一对应,如果对应不上的话就不显示。
left join
左连接
select * from dep left join emp on dep.id = emp.pid;
select * from dep left join emp on dep.id = emp.pid where dep.name = "Tec";
左连接会以左边的表为主表,右边的表如果没有对应数据,会以null显示
right join
右连接
select * from dep right join emp on dep.id = emp.pid;
select * from dep right join emp on dep.id = emp.pid where dep.name = "Tec";
右连接会以join右边的表为主表,左边的表如果没有对应数据,会以null显示
union
全连接
select * from dep left join emp on dep.id = emp.pid
union
select * from dep right join emp on dep.id = emp.pid;
全连接会把左表和右表对应不上的数据全部显示出来。
子查询
将后面查询出的结果设为前面查询的条件
select name from emp where pid = (select id from dep where name = "Tec");
以关键字
in
select name from emp where pid in (select id from dep where name = "Tec" or name = "Market");
=,!=,>,<.>=,<=
条件内支持大小于运算
exists关键字
select * from emp where exists (select * from emp where id = 200);
exists关键字后面查询出来的数据存在才会执行前面的查询语句,不存在则不执行。
本文介绍了数据库中多表查询的几种方法,包括笛卡尔积、内连接(INNER JOIN)、左连接(LEFT JOIN)、右连接(RIGHT JOIN)以及全连接(UNION)。通过实例演示了如何使用这些方法从emp和dep表中获取员工和部门的关联数据,强调了不同连接方式的特点和应用场景。同时,还提到了子查询和EXISTS关键字在查询中的应用。

2997

被折叠的 条评论
为什么被折叠?



