多表的查询(重要)
多表查询(去除重复的查询)之内连接
如果不用多表查询直接用SELECT * FROM dept,emp;查询还有很多少重复的数据。
- 前提条件:两个表有关联,通过外键关联。
- 普通内链接
- 关键字:**inner join **
- 语法:select * from 表 **inner join ** 表 on 条件
- 注意:
在inner join关键字之前写表1
在inner join关键字之后写表2
on的后面写条件:(表1是dept,表2是emp)dept.did = emp.dno
哪个表写在 inner join关键字 之前查询的时候就显示在表的前面,反之就是后面。 - 语句:select * from dept inner join emp on dept.did = emp.dno;
- 隐式内连接(用的最多的)
- 语法:select * from 表1,表2 where 表1.字段 = 表2.字段;
- 语句:select * from dept,emp where dept.did = emp.dno;
- 别名:select * from dept d,emp e where d.did = e.dno;
- 指定字段:select d.dname,e.ename,e.sal from dept d,emp e where d.did = e.dno;
多表查询之外连接
- 外连接分成左外连接和右外连接
- 左外连接
使用关键字 select * from 表1 left outer join 表2 on 条件;
outer关键字省略不写
select * from dept left outer join emp on dept.did=emp.dno;
select * from dept left join emp on dept.did=emp.dno; - 左外连接查询的是左表中所有的数据和2张表主外键关联的数据。
- 右外连接
使用关键字 select * from 表1 right outer join 表2 on 条件;
outer省略不写
select * from dept right outer join emp on dept.did=emp.dno;
select * from dept right join emp on dept.did=emp.dno; - 右外连接查询的是右表中有的数据和2张表主外键关联的数据。
- 左外连接
内连接与外连接的区别
先添加数据
注意:这里添加的数据,行政部和销售部是没有人的。冠希和柏芝也是没有部门的。
执行:SELECT * FROM emp,dept WHERE emp.dno=dept.did; —内连接
这里的内连接没有查询到添加的数据,冠希和柏芝。
执行:SELECT * FROM dept LEFT JOIN emp ON dept.did=emp.dno; —外连接
这里的外连接查询到了冠希和柏芝。
区别
内连接查询的是2张表交集的数据,外连接查询的是关联的数据。
子查询
- 子查询,嵌表查询,一个select语句不能查询出结果的,可以通过多个select语句查询结果。
- 练习
先找出前边练习用的stu表- 例子:查询出英语成绩大于英语平均分的同学
1. 先查询出英语的平均分**(select avg(english) from stu)**
2. 在编写select语句
- SELECT username,english FROM stu WHERE english>(SELECT AVG(english) FROM stu);
- 例子:查询出英语成绩大于英语平均分的同学