我报名参加金石计划1期挑战——瓜分10万奖池,这是我的第10篇文章
自连接
select 字段列表 from 表A 别名A join 表A 别名B on 条件 ...;
例:查询员工及其所属领导的名字
select a.name '员工', b.name '领导' from employee a, employee b where a.managerid = b.id;
注意:
- 自连接查询,可以是内连接查询,也可以是外连接查询
- 要取别名
联合查询
把多次查询的结果合并起来,形成一个新的查询结果集
select 字段列表 from 表A union select 字段列表 from 表B ... ;
例:将薪资低于5000的员工,和年龄大于50岁的员工全部查询出来
select * from employee where salary < 5000 union [all] select * from employee where age > 50;
注意:
- 对于联合查询的多张表的列数必须保持一致,字段类型也需要保持一致
- union all 关键字是将两张表的全部数据合并到一起,不会去除相同的用户
- union 关键字也是将两张表的全部数据合并到一起,但会去除相同的用户
子查询
sql语句中嵌套select语句,称为嵌套查询,又称子查询
子查询外部语句可以是insert/ update/ delete/ select的任何一个
select * from t1 where column1 = (select column1 from t2);
注意:
- 根据子查询的结果不同,分为:
-- 标量子查询(子查询结果为单个值)
-- 列子查询(子查询结果为一行)
-- 行子查询(子查询结果为一行)
-- 表子查询(子查询结果为多行多列)
- 根据子查询位置,分为:where之后,from之后,select之后
标量子查询
子查询返回的结果是单个值(数字,字符串,日期等),最简单的形式,这种子查询成为标量子查询
常用的操作符:= , <>(!=), >, >=, <, <=
例:查询“销售部”的所有员工信息
select * from employee where dept_id = (select id from dept where name = "销售部");
列子查询
子查询返回的结果是一列(可以是多行),这种子查询称为列子查询
常用操作符:
in => 在指定的集合范围之内,多选一, not in => 不在指定的集合范围之内,
any => 子查询返回列表中,有任意一个满足即可,
some => 与any等同,使用some的地方都可以使用any,
all => 子查询返回列表的所有值都必须满足
例:查询比财务部所有人工资都高的员工信息
select * from employee salary > all( select salary from employee where dept_id = ( select id from employee where name = "财务部" ) )
行子查询
子查询返回的结果是一行(可以是多列),这种子查询称为行子查询
常用操作符:=, <>(!=), in, not int
例:查询与“老王”的薪资级直属领导相同的员工信息
select * from employee where (salary, manageid) = ( select salary, manageid from employee where name = "老王" );
表子查询
子查询返回的结果是多行多列,这种子查询
常用的操作符:in
例:查询与“老刘”,“老李”的职位和薪资相同的员工信息
select * from employee where (job, salary) in ( select job, salary from employee where name = "老刘" or name = "老李" )