mysql(自连接和多表查询)

75 阅读2分钟

我报名参加金石计划1期挑战——瓜分10万奖池,这是我的第10篇文章

自连接

select 字段列表 fromA 别名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 = "老李" )