多表查询

本文介绍了数据库中多表查询的几种方法,包括笛卡尔积、内连接(INNER JOIN)、左连接(LEFT JOIN)、右连接(RIGHT JOIN)以及全连接(UNION)。通过实例演示了如何使用这些方法从emp和dep表中获取员工和部门的关联数据,强调了不同连接方式的特点和应用场景。同时,还提到了子查询和EXISTS关键字在查询中的应用。

场景:
两张表,一张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关键字后面查询出来的数据存在才会执行前面的查询语句,不存在则不执行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值