连接查询
按功能分类:内连接(等值连接,非等值连接,自连接),外连接(左外连接,右外链接,全外连接),交叉连接
按年代分类:sql92标准(仅支持内连接),sql99标准(都支持,除了全外连接)
现在我们介绍sql99标准
语法:select 查询列表
from 表1 别名 连接类型
join 表2 别名
on 连接条件
【where 筛选条件】
【group by 分组】
【having 筛选条件】
【order by 排序列表】
注意:【】中的代表可以省略
连接类型关键字:
内连接 【inner】 ,
外连接【left(左外),right(右外),full(全外)】,
交叉连接【cross】概念:没有 WHERE 子句的交叉联接将产生连接所涉及的表的笛卡尔积。第一个表的行数乘以第二个表的行数等于笛卡尔积结果集的大小。
连接查询的特点
特点: 1:外连接的查询结果为主表中的所有记录,如果从表中有和它匹配的,则显示匹配值,如果没有则显示null值。
2:外连接查询结果=内连接结果+主表中有而从表中没有的记录
3:左外连接,left,join左边的是主表
4:右外连接,right,join右边的是主表
5:左外连接和右外连接交换两表顺序,可以实现同样效果
6:inner join 是比较运算符,只返回符合条件的行。
演示
1;演示左外连接和右外连接及内连接
在Navicat中新建两个表
表名:student
表名:course
在Navicat中点击New QUERY
输入: SELECT * FROM student RIGHT JOIN course ON course.id=student.id;
结果:
输入: SELECT * FROM student LEFT JOIN course ON course.id=student.id;
结果:
输入:SELECT * FROM student INNER JOIN course ON course.id=student.id;
结果:
以上三个结果满足连接查询特点的1,2,3,4,6
演示交叉连接
依然用到上面的两个表student ,course
输入: SELECT * FROM student CROSS JOIN course;
结果:
如果我们在此时给这条SQL加上WHERE子句的时候
比如 SELECT * FROM student CROSS JOIN course WHER course.id=student.id;
此时将返回符合条件的结果集,结果和inner join所示执行结果一样。
输入: SELECT * FROM student CROSS JOIN course WHER course.id=student.id;
结果:
提出问题
上面两表为一对一关系,那么如果表A和表B为一对多、多对一或多对多的时候,我们又该如何写连接SQL语句呢?
解决方法:
当两表为多对多关系的时候,我们需要建立一个中间表student_course,中间表至少要有两表的主键,当然还可以有别的内容。
如下演示
在前面两表student,course的基础上
在创建一个student_course表
输入:SELECT s.name,c.game FROM student_course sc RIGHT JOIN student s ON sc.sid=s.id RIGHT JOIN course c ON sc.cid=c.id;
结果: