MySq(十六)经典案例

经典案例一:查询平均工资最低的部门信息

分析:

  1. 查询department_id根据每个部门的最低平均工资进行升序排序
  2. 利用limit显示第一条信息的department_id
  3. 通过department_id查询该部门的所有信息
/**1.按照部门进行分组,查询出每个部门的平均工资**/
SELECT AVG(salary) 平均工资
FROM employees
GROUP BY department_id
/**2.按照每个部门的平均工资升序排序;利用limit显示第一条信息的department_id
**/
SELECT department_id
FROM employees
GROUP BY department_id
ORDER BY AVG(salary)
LIMIT 1;
/**3.通过department_id查询该部门的所有信息**/
SELECT * 
FROM departments
WHERE department_id = (
	SELECT department_id
	FROM employees
	GROUP BY department_id
	ORDER BY AVG(salary)
	LIMIT 1
);

 经典案例二:查询平均工资最低的部门信息和该部门的平均工资

分析:

  1. 查询出每个部门的平均工资和department_id并且按照平均工资的升序排序
  2. 利用limit获取第一行数据即最低的平均工资和该部门对应的department_id(将此结果集作为表:avgSalary)
  3. 将表:avgSalary和department表进行连接查询
SELECT d.* ,最低平均工资 
FROM departments d
INNER JOIN (
	SELECT AVG(salary) 最低平均工资,department_id
	FROM employees
	GROUP BY department_id
    ORDER BY 最低平均工资 ASC
    LIMIT 1
) avgSalary
ON avgSalary.'department_id' = d.'department_id';

 经典案例三:查询平均工资最高的job信息

分析:

  1. 查询出job_id根据每个部门的平均工资进行降序排序
  2. 利用limit获取第一行数据,即最高平均工资的job_id
  3. 通过job_id获取该工种的所有信息
/**1,2**/
SELECT job_id
FROM employees
GROUP BY job_id
ORDER BY AVG(salary) DESC
LIMIT 1
/**3**/
SELECT * 
FROM job
WHERE job_id = (
	SELECT job_id
	FROM employees
	GROUP BY job_id
	ORDER BY AVG(salary) DESC
	LIMIT 1
);

 经典案例四:查询平均工资最高的job信息和对应的最高工资

分析:

  1. 查询每个工种的平均工资和job_id,降序排序
  2. Limit显示job_id,最高平均工资
  3. 获取该job_id的所有信息
/**1. 查询每个工种的平均工资和job_id,降序排序
	2. Limit显示job_id,和对应的最低工资
	将此结果集作为表:avgSalary
**/
SELECT AVG(salary),job_id
FROM employees
GROUP BY AVG(salary) ASC
LIMIT 1
/**将表:avgSalary和job表进行连接**/
SELECT * 
FROM job
INNER JOIN (
	SELECT AVG(salary),job_id
	FROM employees
	GROUP BY job_id
    ORDER BY AVG(salary) DESC
	LIMIT 1
) avgSalary
ON avgSalary.'job_id' = job.'job_id';

经典案例五:查询平均工资高于公司平均工资的部门有哪些

分析

  1. 查询公司的平均平均工资(条件1)
  2. 查询每个部门的平均工资(表avgSalary)
  3. 在表avgSalary的基础上筛选条件1
SELECT AVG(salary) 平均工资,department_id
FROM employees
GROUP BY department_id
HAVING 平均工资 > (
	SELECT AVG(salary)
    FROM employees
);

 

经典案例六:查询出公司中所有manager的详细信息

分析:

  1. 查询出employees表中所有manager_id(这里manager_id可能会重复,为了提高查询效率可以进行去重操作)(表1)
  2. 从employees表中筛选出emplooyee_id在表1中的所有信息
SELECT * 
FROM employees
WHERE employee_id IN (
	SELECT DISTINCT manager_id
	FROM employees
);

 经典案例七:查询各部门中最高工资中 最低那个部门 的最低工资是多少

分析:将每个部门的最高工资组成一个表1–>查询表1中最低工资的那个部门–>查询该部门中的最低工资

查询各部门中最高的工资和对应的department_id,并按照工资的升序排列
limit获取第一行即最高工资中最低工资和对应的department_id
根据该department_id获取该部门的最低工资

/**1和2**/
SELECT MAX(salary),department_id
FROM employees
GROUP BY department_id
ORDER BY MAX(salary) ASC
LIMIT 1
/**3**/
SELECT department_id,MIN(salary)
FROM employees
WHERE employee_id = (
	SELECT department_id
    FROM employees
    GROUP BY department_id
    ORDER BY MAX(salary) ASC
    LIMIT 1
);

 经典案例八:查询平均工资最高的部门的manager(领导)的详细信息:last_name、department_id、 email、salary

注:一个部门编号对应一个部门,一个部门对应一个manager_id;一个manager_id对应一个领导

分析:

  1. 查询平均工资最高的department_id;并按照平均工资的降序排序
  2. limit获取第一行即平均工资最高的department_id
  3. 将employees表和departments表进行连接,筛选条件是1,2
/**1和2**/
SELECT department_id
FROM employees
GROUP BY department_id DESC
ORDER BY AVG(salary)
LIMIT 1
/****/
SELECT last_name,e.department_id,email,salary
FROM employees e
INNER JOIN departments d
ON e.employee_id = d.manager_id	
WHERE d.department_id = (
	SELECT department_id
    FROM employees
    GROUP BY department_id 
    ORDER BY AVG(salary) DESC
    LIMIT 1
);

经典案例九:查询每个专业的男生人数和女生人数

表student

studntinfostudentNamemajoridsex
    

 

 

 

分析: 

SELECT major_id
    (SELECT COUNTN(*) FROM student GROUP BY majorid 
     WHERE sex = '男'AND majorid =s.majorid) 男,
    (SELECT COUNTN(*) FROM student GROUP BY majorid 
     WHERE sex = '女'AND majorid = s.majorid) 女,
FROM student s
GROUP majorid;

 经典案例十:查询专业和张翠山一样的学生的最低分

表student

studntinfostudentNamemajoridsex
    

 

 

 

表result

idstudentinfoscore
   

 

 

 

SELECT COUNT(*)
FROM student s
LEFT JOIN result r
ON s.studentinfo = r.studentinfo
WHERE r.id IS NULL;

 

本文原文地址:https://blog.youkuaiyun.com/qq_43952245/article/details/90546153

MySQL 中的 `EXTRACT()` 函数是一个非常强大的工具,用于从日期或时间表达式中提取特定的分。它支持多种时间单位的提取,包括年、月、日、小时、分钟、秒、微秒等。此外,它还可以提取更复杂的时间组合,例如 `DAY_MICROSECOND`,这意味着从日期的 `DAY` 分一直提取到 `MICROSECOND` 分 [^1]。 ### 基本语法 `EXTRACT(unit FROM date)` - `unit`:定义要提取的时间单位。 - `date`:一个合法的日期或日期时间表达式。 ### 支持的 `unit` 类型 以下是一些常用的 `unit` 值: - `YEAR`:年份 - `MONTH`:月份 - `DAY`:日 - `HOUR`:小时 - `MINUTE`:分钟 - `SECOND`:秒 - `MICROSECOND`:微秒 - `DAY_HOUR`:从日到小时 - `DAY_MINUTE`:从日到分钟 - `DAY_SECOND`:从日到秒 - `DAY_MICROSECOND`:从日到微秒 - `HOUR_MINUTE`:从小时到分钟 - `HOUR_SECOND`:从小时到秒 - `HOUR_MICROSECOND`:从小时到微秒 - `MINUTE_SECOND`:从分钟到秒 - `MINUTE_MICROSECOND`:从分钟到微秒 - `SECOND_MICROSECOND`:从秒到微秒 ### 示例用法 #### 1. 提取单个分 ```sql SELECT EXTRACT(YEAR FROM '2023-10-15') AS year; -- 结果: 2023 ``` ```sql SELECT EXTRACT(MONTH FROM '2023-10-15') AS month; -- 结果: 10 ``` ```sql SELECT EXTRACT(DAY FROM '2023-10-15') AS day; -- 结果: 15 ``` ```sql SELECT EXTRACT(HOUR FROM '2023-10-15 14:30:45') AS hour; -- 结果: 14 ``` ```sql SELECT EXTRACT(MINUTE FROM '2023-10-15 14:30:45') AS minute; -- 结果: 30 ``` ```sql SELECT EXTRACT(SECOND FROM '2023-10-15 14:30:45') AS second; -- 结果: 45 ``` ```sql SELECT EXTRACT(MICROSECOND FROM '2023-10-15 14:30:45.123456') AS microsecond; -- 结果: 123456 ``` #### 2. 提取组合分 ```sql SELECT EXTRACT(DAY_HOUR FROM '2023-10-15 14:30:45') AS day_hour; -- 结果: 1514 ``` ```sql SELECT EXTRACT(DAY_MINUTE FROM '2023-10-15 14:30:45') AS day_minute; -- 结果: 151430 ``` ```sql SELECT EXTRACT(HOUR_MINUTE FROM '2023-10-15 14:30:45') AS hour_minute; -- 结果: 1430 ``` ```sql SELECT EXTRACT(MINUTE_SECOND FROM '2023-10-15 14:30:45') AS minute_second; -- 结果: 3045 ``` ```sql SELECT EXTRACT(DAY_MICROSECOND FROM '2023-10-15 14:30:45.123456') AS day_microsecond; -- 结果: 15143045123456 ``` ### 注意事项 - `EXTRACT()` 函数返回的值是数字类型,而不是字符串。 - 如果输入的日期格式不正确,`EXTRACT()` 函数可能会返回错误或 `NULL`。 - `EXTRACT()` 函数不支持 `DATE()` 和 `TIME()` 的功能,因此如果需要提取完整的日期或时间分,可以使用 `DATE()` 或 `TIME()` 函数。 ### 总结 `EXTRACT()` 函数在 MySQL 中提供了灵活的方式来提取日期和时间的特定分。通过选择不同的 `unit` 值,可以轻松地从日期时间表达式中获取所需的信息。此外,它还支持复杂的组合时间单位,如 `DAY_MICROSECOND`,从而能够提取从日到微秒的所有信息 [^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值