SQL基础进阶知识 边角料(持续更新……)
强大的表连接
1、笛卡尔积
两个表每条记录一一组合,和A几几排列组合差不多
SELECT * FROM student; --3条
SELECT * FROM teacher; --4条
那么!SELECT * FROM student CROSS JOIN teacher; --12条
2、内连接inner join
学生表只有学生ID、学生姓名、老师ID;老师表有老师ID、老师姓名。问:如何同时查出学生ID、学生姓名、老师ID、老师姓名?
方法一:做了一个子查询
SELECT student_id,student_name,teacher_id,
(
SELECT teacher_name FROM tacher
WHERE teacher.teacher_id = student.teacher_id
)
FROM student;
方法二:用inner join
select * from student a INNER JOIN teacher b
ON a.teacher_id = b.teacher_id ;
(ON 不建议换成 WHERE,因为WHERE 是MYSQL专属写法,不通用)
简洁写法:inner join 直接换成逗号即可 ,,,,就是这个
那么,相反的,如何返回这两张表里,老师ID 不相同的记录?
答:直接把ON后面的 “ a.teacher_id = b.teacher_id ” 改成 “ a.teacher_id <> b.teacher_id ”
<> 是不等于的符号
2、全外连接 FULL OUTER JOIN
能够返回所有记录,哪怕 a.teacher_id 不等于 b.teacher_id,都返回
select * from student a FULL OUTER JOIN teacher b
ON a.teacher_id = b.teacher_id ;
(OUTER 可以省略)(MYSQL不支持 FULL OUTER JOIN)
3、左连接 left join;右连接 right join
其实就是,按照左边的还是右边的id去匹配
左连接就返回3条:因为只有三个学生,哪怕老师id没有对应的
右连接就返回4条:因为有四个老师
超级重要的一部分,如果理不清楚以下这部分,基本=不会用join!
1、连接表的执行步骤
Select * from student a LEFT JOIN teacher b ON a.teacher_id = b.teacher.id
WHERE a.score >90;
第一步:两个表做笛卡尔积
第二步:根据ON后的条件筛选笛卡尔积的结果
第三部:补充左表(LEFT JOIN)不满足链接条件的数值。(INNER JOIN无需此步骤)
第四步:根据WHERE后的条件,过滤第三步的结果
2、AND和WHERE的区别
1)INNER JOIN
先看两个SQL
返回的结果能一样吗?答:逻辑不一样,结果未必
AND是在ON的链接条件里; WHERE是过滤整个连接完成后的表
2)LEFT JOIN
还是同样的语句,只修改INNER JOIN为LEFT JOIN
返回的结果能一样吗?答:逻辑就完全不一样了
第一个返回和a表相同的条数;第二个返回的肯定<=a表的条数,因为被过滤了一部分