SQL(四)

一、分组函数

-- MAX()  MIN()  AVG()  SUM()  COUNT()

SELECT MAX(salary), MIN(salary), AVG(salary), SUM(salary), COUNT(salary)
FROM employees;

SELECT MAX(last_name), MAX(LENGTH(last_name)), MIN(last_name), COUNT(last_name)
FROM employees;

SELECT COUNT(employee_id)
FROM employees;

SELECT COUNT(*)
FROM employees;

#组函数不计算空值
SELECT COUNT(commission_pct)
FROM employees;

SELECT SUM(commission_pct) / COUNT(*), AVG(commission_pct)
FROM employees;

SELECT AVG(salary)
FROM employees;

-- GROUP BY 分组(重点、难点)
-- 求出各个部门的平均工资
SELECT department_id, AVG(salary)
FROM employees
GROUP BY department_id;

-- 注意:出现在 select 子句中的非分组函数,一定出现在 group by 子句后
SELECT employee_id, department_id, AVG(salary)
FROM employees
GROUP BY department_id, employee_id; -- 多列分组

-- 求出各个部门中每个工种(job_id) 的平均工资
SELECT department_id, job_id, AVG(salary)
FROM employees
GROUP BY department_id, job_id;

-- 注意:where 子句中不能使用组函数,若需要过滤组函数 having
SELECT department_id, AVG(salary)
FROM employees
GROUP BY department_id
HAVING AVG(salary) >= 8000;

-- 部门最高工资比 10000 高的部门

SELECT department_id
FROM employees
GROUP BY department_id
HAVING MAX(salary) > 10000;

-- MYSQL 中组函数不能嵌套,在 Oracle 中组函数可以嵌套
SELECT MAX(AVG(salary))
FROM employees
GROUP BY department_id;

SELECT AVG(salary)
FROM employees
GROUP BY department_id;

SELECT MAX(avg_sal)
FROM (
SELECT AVG(salary) avg_sal
FROM employees
GROUP BY department_id

) emp

二、子查询

-- 谁的工资比 Abel 高?

SELECT salary
FROM employees
WHERE last_name = 'Abel';


SELECT *
FROM employees
WHERE salary > 11000;

-- 主查询(外查询)
SELECT *
FROM employees
WHERE salary > (
-- 子查询(内查询)
SELECT salary
FROM employees
WHERE last_name = 'Abel'
);

-- 题目:返回job_id与141号员工相同,salary比143号员工多的员工姓名,job_id 和工资
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
);

-- 题目:返回公司工资最少的员工的last_name,job_id和salary
SELECT last_name, job_id, salary
FROM employees
WHERE salary = (
SELECT MIN(salary)
FROM employees
);

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

SELECT department_id, MIN(salary)
FROM employees
GROUP BY department_id
HAVING MIN(salary) > (
SELECT MIN(salary)
FROM employees
WHERE department_id = 50
)

-- 非法使用子查询
SELECT employee_id, last_name
FROM   employees
WHERE  salary = (
SELECT MIN(salary)
        FROM employees
        GROUP BY department_id
);

-- 空值问题
SELECT last_name, job_id
FROM   employees
WHERE  job_id =
                (SELECT job_id
                 FROM   employees
                 WHERE  last_name = 'Haas');

-- 多行子查询
SELECT employee_id, last_name
FROM   employees
WHERE  salary IN (
SELECT MIN(salary)
        FROM employees
        GROUP BY department_id
);

-- 题目:返回其它部门中比job_id为‘IT_PROG’部门 任一 工资低的员工的员工号、姓名、job_id 以及salary

-- any : 若与值列表中任何一个条件满足,则结果为满足条件数据
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';


-- 题目:返回其它部门中比job_id为‘IT_PROG’部门 所有 工资低的员工的员工号、姓名、job_id 以及salary

-- all :若与值列表中所有条件都满足,则结果为满足条件数据
SELECT employee_id, last_name, job_id, salary
FROM employees
WHERE salary < ALL(
SELECT salary
FROM employees
WHERE job_id = 'IT_PROG'
) AND job_id <> 'IT_PROG';


42. 查询工资最低的员工信息: last_name, salary
SELECT last_name, salary
FROM employees 
WHERE salary = (
SELECT MIN(salary)
FROM employees
)

43. 查询平均工资最低的部门信息
SELECT *
FROM departments
WHERE department_id = (


SELECT department_id
FROM employees
GROUP BY department_id
HAVING AVG(salary) = (

SELECT MIN(avg_sal) 
FROM (
SELECT AVG(salary) avg_sal
FROM employees
GROUP BY department_id
) e

)


)

-- 查询平均工资最低的部门信息和 "该" 部门的平均工资
SELECT d.*, (SELECT AVG(salary) FROM employees WHERE department_id = d.department_id)
FROM departments d
WHERE department_id = (


SELECT department_id
FROM employees
GROUP BY department_id
HAVING AVG(salary) = (

SELECT MIN(avg_sal) 
FROM (
SELECT AVG(salary) avg_sal
FROM employees
GROUP BY department_id
) e

)


)


44. 查询平均工资最高的 job 信息
SELECT *
FROM jobs
WHERE job_id = (


SELECT job_id 
FROM employees
GROUP BY job_id
HAVING AVG(salary) = (


SELECT MAX(avg_sal)
FROM (
SELECT AVG(salary) avg_sal
FROM employees
GROUP BY job_id
) e

)


)

45. 查询平均工资高于公司平均工资的部门有哪些?

SELECT department_id
FROM employees
GROUP BY department_id
HAVING AVG(salary) > (
SELECT AVG(salary)
FROM employees
)


46. 查询出公司中所有 manager 的详细信息.
SELECT *
FROM employees
WHERE employee_id IN (
SELECT DISTINCT manager_id
FROM employees
)

47. 各个部门中 最高工资中最低的那个部门的 最低工资是多少

-- 1. 查询各个部门的最高工资
SELECT MAX(salary)
FROM employees
GROUP BY department_id

-- 2. 在 1 的基础上找出最高工资中“最低工资”
SELECT MIN(max_sal)
FROM (
SELECT MAX(salary) max_sal
FROM employees
GROUP BY department_id
) e

-- 3. 在 2 的基础上找出所在部门
SELECT department_id
FROM employees
GROUP BY department_id
HAVING MAX(salary) = (
SELECT MIN(max_sal)
FROM (
SELECT MAX(salary) max_sal
FROM employees
GROUP BY department_id
) e
)

-- 4. 在 3 的基础上找出最低工资
SELECT MIN(salary)
FROM employees
WHERE department_id = (


SELECT department_id
FROM employees
GROUP BY department_id
HAVING MAX(salary) = (
SELECT MIN(max_sal)
FROM (
SELECT MAX(salary) max_sal
FROM employees
GROUP BY department_id
) e
)

)

48. 查询平均工资最高的部门的 manager 的详细信息: last_name, department_id, email, salary
SELECT last_name, department_id, email, salary
FROM employees
WHERE employee_id IN (
SELECT manager_id
FROM employees
WHERE department_id = (

SELECT department_id
FROM employees
GROUP BY department_id
HAVING AVG(salary) = (

SELECT MAX(avg_sal)
FROM (
SELECT AVG(salary) avg_sal
FROM employees
GROUP BY department_id
) e

)

)
)

三、分组

①limit子句

      [1]格式:limit a,b

      [2]本质:a=查询结果显示起始位置(从零开始),b=显示多少条记录

      [3]注意:limit子句必须放在整个查询语句的最后!切记!

②使用limit子句实现分页

      [1]需求:根据页码pageNo和每页显示多少条记录pageSize,取回对应的数据

      [2]使用limit子句实现分页

               (1)pageSize可以直接用于参数b

               (2)将页码换算为参数a:a=(pageNo-1)*pageSize

               (3)结论:limit (pageNo-1)*pageSize,pageSize

 

#返回第一页数据

SELECT emp_id,emp_name,salary,birthday,telephone

FROM emps

LIMIT 0,5;

#返回第二页数据

SELECT emp_id,emp_name,salary,birthday,telephone

FROM emps

LIMIT 5,5;

#返回第三页数据

SELECT emp_id,emp_name,salary,birthday,telephone

FROM emps

LIMIT 10,5;



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值