MySQL多表查询
链接查询
什么是链接查询
也可以叫跨表查询,需要关联多个表进行查询
什么是笛卡尔集
假设集合A={a,b},集合B={0,1,2},
则两个集合的笛卡尔集为 {(a,0),(a,1),(a,2),(b,0),(b,1),(b,2)}
可以拓展到多个集合的情况
同时查询两个表(使用一个SQL语句),出现的就是笛卡尔集结果
SELECT *FROM students,score;
解决方法
要保证我们当时建表的时候,关系的那个键保持一致
SELECT *
FROM students,score
WHERE students.id = score.sid;
内连接划分
内连接分为:等值连接,非等值连接,自然连接
内连接之等值连接
两个表同时出现的id号(值)才显示
1. 99写法
SELECT * FROM
students st,score sc
WHERE st.id = sc.sid;
2.内连接写法
SELECT * FROM students st INNER JOIN score sc ON st.id = sc.sid
注意:
多表联查约束主外键一样,只是写法改变了
ON后面只写主外键4. (对于结果)如果还有条件直接在后面写WHERE5. 多表联查后还有条件就直接写AND
左链接
两表满足条件相同的数据查出来,如果左边表当中有不相同的数据,也把左边表当中的数据查出来.(换句话说就是左边表数据全部查询出来,右边表只查询满足条件的)
--OUTER可以省略
SELECT *
FROM students st
LEFT OUTER JOIN score sc
ON st.id = sc.sid;
右链接
右连接会把右当中的数据全部查出,左表当中只查满足条件的数据
站在表的角度去看,使用左连接就会把左边的内容全部查出,右边查出满足条件的
使用右连接,就把右边表当中的数据全部查出,左边查出满足条件的
SELECT *
FROM students st
RIGHT OUTER JOIN score sc
ON st.id = sc.sid;
自然连接
连接查询会产生无用笛卡尔集,我们通常使用主外键关系等式来去除它.
而自然连接无需你去给出主外键等式,它会自动找到这一等式
也就是说不用去写条件
但是自然连接有一个要求
- 两张连接的表中列名称和类型完全一致的列作为条件
- 会去除相同的列
子连接
子查询
什么是子查询
- 一个select语句中包含另外一个完整的select语句
- 或者说两个以上select,那么就是子查询语句了
子查询出现的位置
1.where后,把select查询出的结果当做另外一个select的条件值
2.from后,把查询出的结果当作一个新表
例如:
先查出项羽所在的部门编号
SELECT deptno FROM emp WHERE ename = '项羽';
再根据编号查询同一部门的员工
SELECT ename FROM emp WHERE deptno = 20;
把第1条查出来的结果当第2条语句的条件
SELECT ename,deptno FROM emp
WHERE deptno = (SELECT deptno FROM emp WHERE ename = '项羽')