Mysql的多表查询及表连接
目录
连接查询条件
-
查询的两张表如果出现同名的列,我们需要将表名标注到列名前面
-
如果是非同名的列,表名可加可不加 ,推荐加上为了书写方便,**可以给表添加别名,**一般情况下取首字母,特殊情况下取它所代表的含义,表的别名只在本次查询中生效
-
如果表与表进行关联查询的时候,如果不添加关联条件,查询的总记录数就是a*b = 笛卡尔积,数据匹配不正确
-
多表查询的时候必须要加条件
- 等值
- 非等值
有关联的表的连接
natural join
会自动选择列名相同并且类型相同的列
格式:表名 natural join 列名
代码展示:
sql
select * from sc natural join student;
运行结果:
using
指定等值连接的列
格式:表名 join 表名 using(同名同类型等值的列名)
代码展示:
sql
select * from sc join course using(cno);
运行结果:
on
可以指定两张表关联的条件,可以是非等值 的操作,添加约束
等值连接
表 join 表 on 表.列=表.列
代码展示:
sql
select * from course join teacher;
-- on 添加约束
select * from course join teacher on course.tno=teacher.tno;
运行结果:
非等值连接
不使用等于(=)操作符来比较字段,而是可能使用其他比较操作符
- 格式:表名 join 表名 on 非等值操作
表与表的外连接
左外连接
显示左面表所有的数据
- 列名 left join 列名 (on 判断)
代码展示:
sql
select * from course left join teacher on course.tno=teacher.tno;
运行结果:
右外连接
显示右面表所有的数据
- 列名 left join 列名 (on 判断)
代码展示:
sql
select * from course right join teacher on course.tno=teacher.tno;
运行结果:
表的自连接
格式:表名 as 表名1 inner join 表名 as 表名2 on 操作
代码展示:
sql
select * from student as a inner join student as b on a.sno=b.sno;
运行结果:
表的子连接
把一个SQL语句的查询结果当成另外一个SQL语句的查询条件
代码展示:
sql
select *from sc;
select * from sc where score>(select avg(score) from sc);
运行结果:
表的伪表查询
如果我们所需要的查询条件需要别的SQL语句提供,如果需要多个查询条件,这是就要将所有的查询结果当做伪表进行管理。
代码展示:
select course.cname,s2.sname from (select sc.cno,s1.sno,s1.sname from (select sno,sname from student) as s1,sc where s1.sno=sc.sno) as s2,course where course.cno=s2.cno;
运行结果: