目录
一、多表查询
二、自连接
三、子查询
1、单行子查询
2、多行子查询
3、多列子查询
4、在from后面使用子查询
四、合并查询
1、union
2、union all
五、内连接
六、外连接
1、左外连接
2、右外连接
一、多表查询
我们需要的数据往往会来自不同的表,所以我们需要从多个表中查询数据,如何做?
用 emp 和 dept 两张表来举个例子,emp --- 记录员工的相关信息,dept --- 记录部门的相关信息
- 查看每个员工和其所在部门的所有信息
为什么能这样查询?首先要明白下面这条语句的作用
select * from emp, depth;
显然,这条选择语句会让两个表的数据进行组合相乘(笛卡尔积),得到一张新的表,我们查询的本质依旧是在这张新表中查找数据,只不过where的筛选条件需要带上表名,因为它们的列名一样。
- 显示部门号为10的部门名,员工名和工资
二、自连接
- 显示员工的上级领导的编号和姓名及其下级(mgr是员工领导的编号--empno)
注意:需要给表先取别名,两张表的名字一样数据库无法分辨
三、子查询
1、单行子查询
- 显示Alice同一部门的员工
2、多行子查询
- in关键字:查询和10号部门的工作岗位相同的雇员的名字,岗位,工资,部门号,但是不包含10自己的
- all关键字:显示工资比部门30的所有员工的工资高的员工的姓名、工资和部门号
- any关键字:显示工资比部门30的任意员工的工资高的员工的姓名、工资和部门号(包含自己部门的员工)
3、多列子查询
单行子查询是指子查询只返回单列,单行数据;多行子查询是指返回单列多行数据,都是针对单列而言的,而多列子查询则是指查询返回多个列数据的子查询语句
- 查询和Alice的部门和岗位完全相同的所有雇员,不含Alice本人
4、在from后面使用子查询
子查询语句出现在from子句中。这里要用到数据查询的技巧,把一个子查询当做一个临时表使用
- 显示每个高于自己部门平均工资的员工的姓名、部门、工资、平均工资
四、合并查询
1、union
- 将工资大于 2500 或职位是 Manager 的人找出来
2、union all
- 将工资大于2500或职位是Manager的人找出来
注意:使用合并查询时,列数一定要相同。
五、内连接
select 字段 from 表 1 inner join 表 2 on 连接条件 and 其他条件;
- 查看每个员工和其所在部门的所有信息
等价于下面这种写法,只是上面的写法更加的清晰
六、外连接
1、左外连接
select 字段名 from 表名 1 left join 表名 2 on 连接条件;
- 查询所有学生的成绩,如果这个学生没有成绩,也要将学生的个人信息显示出来
2、右外连接
select 字段名 from 表名 1 right join 表名 2 on 连接条件;
- 对stu表和exam表联合查询,把所有的成绩都显示出来,即使这个成绩没有学生与它对应,也要显示出来