重点讲解一下连表查询,这个也是面试重点
直接连,错误示范
select * from student,class;

这种连接又被称为笛卡儿积,就是两两向交
后面要加上条件证明两表有相同的字段
select * from student,class where student.class_id = class.id;

有三种连接模式
- inner join
- left join
- right join
如果数据都能一一对应上的话,那么他们三个的输出结果没有任何区别
但是,数据有对不上的情况,那么他们三个就有区别了
例如
班级表
| id | 班级名称 |
|---|---|
| 1 | 三年一班 |
| 2 | 三年二班 |
| 3 | 三年三班 |
学生表
| id | name | class_id |
|---|---|---|
| 1 | wangwu | 1 |
| 2 | lisi | null |
| 3 | fengfeng | 2 |
| 4 | fang | 2 |
select * from student inner join class on student.class_id = class.id;
select * from class inner join student on student.class_id = class.id;
select * from student left join class on student.class_id = class.id;
select * from class left join student on student.class_id = class.id;
select * from student right join class on student.class_id = class.id;
select * from class right join student on student.class_id = class.id;
第一种情况,内连接,通过学生连班级,就只有1 3 4的学生和班级记录
第二种情况,内连接,通过班级连学生,和第一种情况是一样的
第三种情况,左连接,通过学生连班级,学生信息是完整显示出来了,学生2对应的班级信息全是null
第四种情况,左连接,通过班级连学生,班级信息完整显示出来了,但是班级3对应的学生信息是null
第五种情况,右连接,通过学生连班级,以班级表为基表,班级信息是完整显示出来了,但是班级3对应的学生信息是null
第六种情况,右连接,通过班级连学生,以学生表为基表,学生信息完整显示出来了,但是学生2对应的班级信息是null
不同的连接关系
他们的区别是:
返回不同
inner join会返回两表中一样的行
left join会返回左表的所有记录,哪怕它没有匹配到右表
数量不同
inner join小于等于左表和右表的记录数量
left join:left join的数量以左表中的记录数量相同。
记录属性不同
inner join不足的记录属性会被直接舍弃
left join不足的记录属性用NULL填充
left和right就是基表不同,操作不同