多表查询,2021全网最好没有之一
- 开始准备:创建student数据库,book表,study表。用于下面实操
use student;
create table book(id int(3) PRIMARY key,book char(3));
create table study(name char(3),id int(3) PRIMARY key);
插入一定数据:
insert into book(id,book) values(1,"西游记"),(2,"水浒传"),(3,"红楼梦")
insert into study(id,name) values(1,"小米"),(2,"荒天帝"),(3,"段德")
- 定义:
经常使用多表查询。多表查询就是同时查询两个或两个以上的表(内查询也可以看成两个表)
在 MySQL 中,多表查询主要有 交叉连接,内连接,外连接,子查询
交叉查询
交叉连接,一般用来返回连接表的[迪卡尔积](笛卡尔乘积_百度百科 (baidu.com))
select *
from <name> cross join <name>
where
/*<name>表示表名*/
实例:
select *
from study CROSS join book
内连接
内连接使用inner join 关键字连接两张表
select *
from <name> <name> inner join <name> [on 语句]
实例:
select *
from study inner join book
where study.id =
#其实我们也可以用之前的知识来写
select *
from study,book
where study.id =
大家可以看到,这里生成了重复的列 在mysql中会自动在后面添加(1)
我们在编程时其实可以,
select study.name,book.*
from study inner join book
where study.id =
这样改变,去重
外连接
左外连接
左连接以左表为基础,显示左表中的所有记录:
显示的记录条数 = 左表中记录的条数
再用左表中的指定列,来和右表中的指定列比较。满足,则输出值;不满足,则输出 NULL
使用left outer join关键字 连接两个表,可简写为left join
select *
from <name> left join <name>
[on 语句]
实例:
当然我们这里所以都是刚好满足的所以我们添加一个数据
INSERT study(id,name) VALUES(10,"hh")
select study.name,book.*
from study LEFT JOIN book
on study.id =;
右外连接
右连接与左连接正好相反,右连接以右表为基础,显示右表中的所有记录:
显示的记录条数 = 右表中记录的条数
再用右表中的指定列,来和左表中的指定列比较。满足,则输出值;不满足,则输出 NULL。
使用right outer join,连接两个表,可以简写为right join
select *
from <name> right outer join<name> [on 语句]
实例:略
全连接
全连接类似于左连接和右连接的综合:
显示记录的条数 = 指定比较字段在两个表中的不同种类数
对于空余字段,则显示 NULL 。也就是说,它能返回两个表中所有的关联信息,以及所有没有被关联到的信息。
实例:
为了让结果跟明显,我们再添加两个数据
mysql是没有全外连接的(mysql中没有full outer join关键字),想要达到全外连接的效果,可以使用union关键字连接左外连接和右外连接
INSERT book(id,book) VALUES(88,"io"),(33,"hi")
select study.name,book.*
from study LEFT JOIN book
on study.id =
UNION
select study.name,book.*
from study RIGHT SJOIN book
on study.id =
嵌套查询(子查询)
子查询可以进行多层嵌套,经常出现在where语句中
select *
from <name>
where <字段> 操作符 (子查询)
实例:
查询,再study表中name=”荒天帝“ ,借的书
select book
from book
where id = (select id from study where name="荒天帝")
如有疑问,请留言