【Mysql数据库基础05】子查询 where、from、exists子查询、分页查询

where、from、exists子查询、分页查询

  • [1 where子查询](#1 where子查询)
    • [1.1 where后面的标量子查询](#1.1 where后面的标量子查询)
      • [1.1.1 having后的标量子查询](#1.1.1 having后的标量子查询)
    • [1.2 where后面的列子查询](#1.2 where后面的列子查询)
    • [1.3 where后面的行子查询(了解即可)](#1.3 where后面的行子查询(了解即可))
  • [2 from子查询](#2 from子查询)
  • [3 exists子查询(相关子查询)](#3 exists子查询(相关子查询))
  • [4 分页查询](#4 分页查询)
  • [5 联合查询](#5 联合查询)
  • [6 练习](#6 练习)

1 where子查询

1.1 where后面的标量子查询

1.谁的工资比Abel高?

sql 复制代码
select *
from employees
where salary > (
	select salary
	from employees
	where last_name = 'Abel'
);

2.返回job_id与141号员工相同,salary比143号员工多的员工姓名,job_id 和工资

sql 复制代码
select last_name,job_id,salary
from employees
where job_id = (
	select job_id
	from employees
	where employee_id = 141
)
and salary > (
	select salary
	from employees
	where employee_id = 143
);

3.返回公司工资最少的员工的last_name,job_id和salary

sql 复制代码
select last_name,job_id,salary
from employees
where salary = (
	select min(salary)
	from employees
);

1.1.1 having后的标量子查询

查询最低工资大于50号部门最低工资的部门id和其最低工资

可以拆分去考虑

1.查询50号部门最低工资

sql 复制代码
select min(salary)
from employees
where department_id = 50;

2.查询每个部门的最低工资

sql 复制代码
select department_id,min(salary)
from employees
group by department_id;

3.合并

sql 复制代码
select department_id,min(salary)
from employees
group by department_id
having min(salary) > (
	select min(salary)
	from employees
	where department_id = 50
);

1.2 where后面的列子查询

单列多行

IN/NOT IN 任意一个

ANY/SOME 某一个

ALL 所有

IN 等于 = ANY

1.返回location_id是1400或1700的部门中的所有员工姓名

sql 复制代码
select last_name
from employees 
where department_id in (
	select distinct department_id
	from departments
	where location_id in (1400,1700)
);

2.返回其它工种中比job_id为'IT_PROG'工种任一工资低的员工的,工号、姓名、job_id 以及salary

sql 复制代码
select employee_id,last_name,job_id,salary
from employees
where salary < any (
	select salary
	from employees
	where job_id = 'IT_PROG'
) and job_id <> 'IT_PROG';

1.3 where后面的行子查询(了解即可)

一行多列或者多行多列

查询员工编号最小并且工资最高的员工信息

sql 复制代码
select *
from employees
where (employee_id,salary) = (
	select min(employee_id),max(salary)
	from employees
);

2 from子查询

查询每个部门的平均工资的工资等级

sql 复制代码
select avg_dep.department_id,avg_dep.avg,g.grade_level
from job_grades g
inner join (
	select department_id,avg(salary) as avg
	from employees
	group by department_id
)as avg_dep
on avg_dep.avg between g.lowest_sal and g.highest_sal;

3 exists子查询(相关子查询)

只关心有没有这个值

查询有员工的部门名

sql 复制代码
select department_name
from departments d
where exists(
		select *
		from employees e
		where d.department_id = e.department_id
);

4 分页查询

limit offset,size

offset 要显示条目的索引

1.查询前五条的员工信息

sql 复制代码
select *
from employees
limit 0,5; #起始索引是0,一共显示5条

2.查询第11条~第25条的员工信息

sql 复制代码
select *
from employees
limit 10,15;

3.有奖金的员工信息,并且工资较高的前10名显示出来

sql 复制代码
select *
from employees
where commission_pct is not null
order by salary desc
limit 10;

5 联合查询

查询中国用户中男性的信息以及外国用户中年男性的用户信息

sql 复制代码
select * from t_ca where csex='男'
union
select * from t_ua where tGender = 'male';

联合查询的特点:

1.要求多条查询语句的查询列数是一致的

2.要求多条查询语句查询的每一列的类型和顺序最好一致

3.union会去重

不想去重的话,可以使用union all关键字

6 练习

1.查询和zlotkey相同部门的员工姓名和工资

sql 复制代码
select last_name,salary
from employees
where department_id = (
	select department_id
	from employees
	where last_name = 'Zlotkey'
);

2查询工资比公司平均工资高的员工的员工号,姓名和工资。

sql 复制代码
select employee_id,last_name,salary
from employees
where salary > (
	select avg(salary)
	from employees
);

3查询各部门中工资比本部门平均工资高的员工的员工号,姓名和工资

sql 复制代码
select employee_id,last_name,salary
from employees e
inner join (
	select department_id,avg(salary) as ag
	from employees
	group by department_id
) avg_dep
on avg_dep.department_id = e.department_id
where salary > avg_dep.ag;

4.查询管理者是king的员工姓名和工资

sql 复制代码
select last_name,salary
from employees
where manager_id in(
	select employee_id
	from employees
	where last_name = 'K_ing'
);

5.查询工资最高的员工的姓名,要求first_name和iast_name显示为一列,列名为 姓.名

sql 复制代码
select concat(first_name,last_name) as '姓.名'
from employees
where salary = (
	select max(salary)
	from employees
);
相关推荐
南城花随雪。12 分钟前
硬盘(HDD)与固态硬盘(SSD)详细解读
数据库
儿时可乖了13 分钟前
使用 Java 操作 SQLite 数据库
java·数据库·sqlite
懒是一种态度15 分钟前
Golang 调用 mongodb 的函数
数据库·mongodb·golang
天海华兮17 分钟前
mysql 去重 补全 取出重复 变量 函数 和存储过程
数据库·mysql
gma9991 小时前
Etcd 框架
数据库·etcd
爱吃青椒不爱吃西红柿‍️1 小时前
华为ASP与CSP是什么?
服务器·前端·数据库
Yz98762 小时前
hive的存储格式
大数据·数据库·数据仓库·hive·hadoop·数据库开发
武子康2 小时前
大数据-231 离线数仓 - DWS 层、ADS 层的创建 Hive 执行脚本
java·大数据·数据仓库·hive·hadoop·mysql
黑色叉腰丶大魔王2 小时前
《MySQL 数据库备份与恢复》
mysql
苏-言2 小时前
Spring IOC实战指南:从零到一的构建过程
java·数据库·spring