1.多表联查连接分类
2. 内连接 inner join(等值连接,制定对应的等值条件)
3.自然连接 natural(不需要指定等值条件)
4.非等值连接:
5.等值连接
6.子查询
内连接、自然连接、外链接(左外连接、右外连接、全外连接(mysql不支持))、非等值连接
SELECT * FROM emp,dept;/*得到的数据是不对的*/
得到的数据叫做笛卡尔积:结果是两个表数据的乘积
使用内连接去查
SELECT * FROM emp INNER JOIN dept;
结果依然是笛卡尔积,是因为我们没有制定对应的等值条件
SELECT * FROM emp e INNER JOIN dept d WHERE e.deptno = d.deptno;
提示:一般来讲,我们不使用内连接,因为效率低。用外链接
标准写法:select * from 表1 别名1 inner join 表2 别名2 where 别名1.xxx = 别名2.xxx;
SELECT * FROM emp e INNER JOIN dept d WHERE e.deptno = d.deptno;
自动使用多表中所有相同字段(不但值相同,名字也要相同)进行连接(两表中有几个相同,就连接合并几个相同字段)
select * from A natural join B
注意:使用多表联查,不一定要有外键。
select * from B,B mm where B.成绩>mm.成绩
使用on关键字可以直接在其后书写链接条件,没有限制 ,想和那个字段连接都可以。
select * from A inner join B on A.成绩>B.学号
外链接(难点)
左外:select * from 表1 别名1 left [ outer ] join 表2 别名2 on 等值条件;
SELECT * FROM emp e LEFT OUTER JOIN dept d ON e.deptno = d.deptno;
左外的意思是:左表的记录无论是否满足条件,都会被查出来,而右表的记录只有满足条件的,才会被查出来。(左表中数据在右表中如果不存在,则右表的字段值为null)
/*右外 */
右外跟左外的机制刚好相反。
如何去判断主副表?(左外连接:左边的是主表,右外连接:右边的是主表)
SELECT * FROM table1 t1 RIGHT JOIN table2 t2 ON t1.id = t2.id;
注意:使用多表联查,不一定要有外键。
全外链接 full outer join
全连接:实现左外和右外连接的效果。
select * from A full outer join B on A.成绩=B.成绩 order by A.学号
子查询:查询中还有查询(数select的个数)
1、 出现的位置
A from前:作为字段存在的
B where后:作为条件存在的
/*查询出工资高于在30部门工作的所有员工的工资的员工信息*/
C from后:表(极为罕见)