前言

近期在补SQL的基础,特别整理了一下SQL的一些查询练习语句,边学边笔记,持续更新~

数据库

image.png

查询案例

1. 查询工资最低的员工信息: last_name, salary

  1. #①查询最低的工资
  2. SELECT MIN(salary)
  3. FROM employees
  4. #②查询last_name,salary,要求salary=①
  5. SELECT last_name,salary
  6. FROM employees
  7. WHERE salary=(
  8. SELECT MIN(salary)
  9. FROM employees
  10. );

2. 查询平均工资最低的部门信息

  1. #方式一:
  2. #①各部门的平均工资
  3. SELECT AVG(salary),department_id
  4. FROM employees
  5. GROUP BY department_id
  6. #②查询①结果上的最低平均工资
  7. SELECT MIN(ag)
  8. FROM (
  9. SELECT AVG(salary) ag,department_id
  10. FROM employees
  11. GROUP BY department_id
  12. ) ag_dep
  13. #③查询哪个部门的平均工资=②
  14. SELECT AVG(salary),department_id
  15. FROM employees
  16. GROUP BY department_id
  17. HAVING AVG(salary)=(
  18. SELECT MIN(ag)
  19. FROM (
  20. SELECT AVG(salary) ag,department_id
  21. FROM employees
  22. GROUP BY department_id
  23. ) ag_dep
  24. );
  25. #④查询部门信息
  26. SELECT d.*
  27. FROM departments d
  28. WHERE d.`department_id`=(
  29. SELECT department_id
  30. FROM employees
  31. GROUP BY department_id
  32. HAVING AVG(salary)=(
  33. SELECT MIN(ag)
  34. FROM (
  35. SELECT AVG(salary) ag,department_id
  36. FROM employees
  37. GROUP BY department_id
  38. ) ag_dep
  39. )
  40. );
  41. #方式二:
  42. #①各部门的平均工资
  43. SELECT AVG(salary),department_id
  44. FROM employees
  45. GROUP BY department_id
  46. #②求出最低平均工资的部门编号
  47. SELECT department_id
  48. FROM employees
  49. GROUP BY department_id
  50. ORDER BY AVG(salary)
  51. LIMIT 1;
  52. #③查询部门信息
  53. SELECT *
  54. FROM departments
  55. WHERE department_id=(
  56. SELECT department_id
  57. FROM employees
  58. GROUP BY department_id
  59. ORDER BY AVG(salary)
  60. LIMIT 1
  61. );

3. 查询平均工资最低的部门信息和该部门的平均工资

  1. #①各部门的平均工资
  2. SELECT AVG(salary),department_id
  3. FROM employees
  4. GROUP BY department_id
  5. #②求出最低平均工资的部门编号
  6. SELECT AVG(salary),department_id
  7. FROM employees
  8. GROUP BY department_id
  9. ORDER BY AVG(salary)
  10. LIMIT 1;
  11. #③查询部门信息
  12. SELECT d.*,ag
  13. FROM departments d
  14. JOIN (
  15. SELECT AVG(salary) ag,department_id
  16. FROM employees
  17. GROUP BY department_id
  18. ORDER BY AVG(salary)
  19. LIMIT 1
  20. ) ag_dep
  21. ON d.`department_id`=ag_dep.department_id;

4. 查询平均工资最高的 job 信息

  1. #①查询最高的job的平均工资
  2. SELECT AVG(salary),job_id
  3. FROM employees
  4. GROUP BY job_id
  5. ORDER BY AVG(salary) DESC
  6. LIMIT 1
  7. #②查询job信息
  8. SELECT *
  9. FROM jobs
  10. WHERE job_id=(
  11. SELECT job_id
  12. FROM employees
  13. GROUP BY job_id
  14. ORDER BY AVG(salary) DESC
  15. LIMIT 1
  16. );

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

  1. #①查询平均工资
  2. SELECT AVG(salary)
  3. FROM employees
  4. #②查询每个部门的平均工资
  5. SELECT AVG(salary),department_id
  6. FROM employees
  7. GROUP BY department_id
  8. #③筛选②结果集,满足平均工资>①
  9. SELECT AVG(salary),department_id
  10. FROM employees
  11. GROUP BY department_id
  12. HAVING AVG(salary)>(
  13. SELECT AVG(salary)
  14. FROM employees
  15. );

6. 查询出公司中所有 manager 的详细信息.

  1. #①查询所有manager的员工编号
  2. SELECT DISTINCT manager_id
  3. FROM employees
  4. #②查询详细信息,满足employee_id=①
  5. SELECT *
  6. FROM employees
  7. WHERE employee_id =ANY(
  8. SELECT DISTINCT manager_id
  9. FROM employees
  10. );

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

  1. #①查询各部门的最高工资中最低的部门编号
  2. SELECT department_id
  3. FROM employees
  4. GROUP BY department_id
  5. ORDER BY MAX(salary)
  6. LIMIT 1
  7. #②查询①结果的那个部门的最低工资
  8. SELECT MIN(salary) ,department_id
  9. FROM employees
  10. WHERE department_id=(
  11. SELECT department_id
  12. FROM employees
  13. GROUP BY department_id
  14. ORDER BY MAX(salary)
  15. LIMIT 1
  16. );

8. 查询平均工资最高的部门的 manager 的详细信息: last_name, department_id, email, salary

  1. #①查询平均工资最高的部门编号
  2. SELECT
  3. department_id
  4. FROM
  5. employees
  6. GROUP BY department_id
  7. ORDER BY AVG(salary) DESC
  8. LIMIT 1
  9. #②将employees和departments连接查询,筛选条件是①
  10. SELECT
  11. last_name, d.department_id, email, salary
  12. FROM
  13. employees e
  14. INNER JOIN departments d
  15. ON d.manager_id = e.employee_id
  16. WHERE d.department_id =
  17. (SELECT
  18. department_id
  19. FROM
  20. employees
  21. GROUP BY department_id
  22. ORDER BY AVG(salary) DESC
  23. LIMIT 1) ;


student数据库

image.png

查询练习

一、查询每个专业的学生人数SELECT majorid,COUNT(*)

  1. FROM student
  2. GROUP BY majorid;

二、查询参加考试的学生中,每个学生的平均分、最高分

  1. SELECT AVG(score),MAX(score),studentno
  2. FROM result
  3. GROUP BY studentno;

三、查询姓张的每个学生的最低分大于60的学号、姓名

  1. SELECT s.studentno,s.`studentname`,MIN(score)
  2. FROM student s
  3. JOIN result r
  4. ON s.`studentno`=r.`studentno`
  5. WHERE s.`studentname` LIKE '张%'
  6. GROUP BY s.`studentno`
  7. HAVING MIN(score)>60;

四、查询每个专业生日在“1988-1-1”后的学生姓名、专业名称

  1. SELECT m.`majorname`,s.`studentname`
  2. FROM student s
  3. JOIN major m
  4. ON m.`majorid`=s.`majorid`
  5. WHERE DATEDIFF(borndate,'1988-1-1')>0
  6. GROUP BY m.`majorid`;

五、查询每个专业的男生人数和女生人数分别是多少

  1. SELECT COUNT(*),sex,majorid
  2. FROM student
  3. GROUP BY sex,majorid;

六、查询专业和张翠山一样的学生的最低分

  1. #①查询张翠山的专业编号
  2. SELECT majorid
  3. FROM student
  4. WHERE studentname = '张翠山'
  5. #②查询编号=①的所有学生编号
  6. SELECT studentno
  7. FROM student
  8. WHERE majorid=(
  9. SELECT majorid
  10. FROM student
  11. WHERE studentname = '张翠山'
  12. )
  13. #②查询最低分
  14. SELECT MIN(score)
  15. FROM result
  16. WHERE studentno IN(
  17. SELECT studentno
  18. FROM student
  19. WHERE majorid=(
  20. SELECT majorid
  21. FROM student
  22. WHERE studentname = '张翠山'
  23. )
  24. )

七、查询大于60分的学生的姓名、密码、专业名

  1. SELECT studentname,loginpwd,majorname
  2. FROM student s
  3. JOIN major m ON s.majorid= m.majorid
  4. JOIN result r ON s.studentno=r.studentno
  5. WHERE r.score>60;

八、按邮箱位数分组,查询每组的学生个数

  1. SELECT COUNT(*),LENGTH(email)
  2. FROM student
  3. GROUP BY LENGTH(email);

九、查询学生名、专业名、分数

  1. SELECT studentname,score,majorname
  2. FROM student s
  3. JOIN major m ON s.majorid= m.majorid
  4. LEFT JOIN result r ON s.studentno=r.studentno

十、查询哪个专业没有学生,分别用左连接和右连接实现

  1. #左
  2. SELECT m.`majorid`,m.`majorname`,s.`studentno`
  3. FROM major m
  4. LEFT JOIN student s ON m.`majorid` = s.`majorid`
  5. WHERE s.`studentno` IS NULL;
  6. #右
  7. SELECT m.`majorid`,m.`majorname`,s.`studentno`
  8. FROM student s
  9. RIGHT JOIN major m ON m.`majorid` = s.`majorid`
  10. WHERE s.`studentno` IS NULL;

十一、查询没有成绩的学生人数

  1. SELECT COUNT(*)
  2. FROM student s
  3. LEFT JOIN result r ON s.`studentno` = r.`studentno`
  4. WHERE r.`id` IS NULL