这是我参与8月更文挑战的第6天,活动详情查看:8月更文挑战
连接查询
-
连接查询是将多张表进行记录的连接,按照某个指定的条件进行数据的拼接
-
连接查询结果得到的记录数可能会有变化,字段数一定会增加
-
连接查询的意义:当用户查看数据的时候,需要显示的数据来自多张表
-
连接查询分类:内连接、外连接、自然连接、交叉连接
交叉连接
-
cross join:从一张表中循环取出每一条记录,每条记录都会去另外一张表进行匹配,因为没有匹配条件,所以匹配结果一定会保留,最终连接本身字段就会增加(保留),结果就是笛卡尔积,得到的数据没有什么意义
-
基本语法
- 左表 cross join 右表
- from 左表,右表 --就是多表查询
select * from my_pri1 cross join t2; select * from my_pri1,t2;
内连接
- inner join:从左表中取出每一条记录,去右表中与所有的记录进行匹配,匹配必须是某个条件,在左表中与右表中相同时,最终才会保留结果,否则不保留
- 基本语法
- 左表 [inner] join 右表 on 左表.字段 = 右表.字段
- on表示连接条件,条件子弹就是代表相同的业务含义,就是当 左表.字段 = 右表.字段时才会保留结果
select * from my_pri1 inner join t2 on my_pri1.pri_id = t2.id;
--简写,就是使用join,省略inner
select * from my_pri1 join t2 on my_pri1.pri_id = t2.id;
-- 使用别名
select * from my_pri1 as p join t2 as t on p.pri_id = t.id;
-- 省略 as
select * from my_pri1 p join t2 t on p.pri_id = t.id;
- 若是内连接不使用on之后的条件进行查询,就相当于交叉连接,得到的结果也是一个笛卡尔积
- 内连接可以使用where代替on关键字,但是where没有on效率高
select * from my_pri1 p join t2 t where p.pri_id = t.id;
外连接
-
outer join:以某张表为主(主表),取出主表中的每一条数据,然后每条记录与另外一张表(副表)进行连接,不管能不能匹配上条件,最终都会保留,能匹配,正确保留,不能正确匹配的,将副表的字段全部置空
-
外连接分类
- left join:左外连接(左连接),以左表为主表
- right join:右外连接(右连接),以右表为主表
-- 左连接 select * from my_pri1 p left join t2 t on p.pri_id = t.id; -- 右连接 select * from my_pri1 p right join t2 t on p.pri_id = t.id;- 虽然左连接和右连接有主表差异, 但是显示的结果: 左表的数据在左边,右表数据在右边.
- 左连接和右连接可以互转.
自然连接
-
natural join:自然连接就是自动匹配连接条件,系统以字段名字作为匹配模式,同名字段就作为条件,多个同名字段都作为条件
-
自然连接分类
- 自然内连接:左表 natural join 右表
- 自然连接自动使用同名字段作为连接条件,连接之后合并同名字段
select * from my_pri1 natural join t2;- 自然外连接: 左表 natural left/right join 右表
select * from my_pri1 natural left join t2;