当前位置: 首页 > news >正文

多表查询-8-练习总结

多表查询-8-练习总结

  • 练习总结
    • 练习
      • 1. 查询员工的姓名、职位、部门信息
      • 2. 查询入职时间大于 5 年的员工姓名、职位、部门信息
      • 3. 查询所有员工的部门ID、部门名称
      • 4. 查询入职时间大于 5 年的员工, 及其归属的部门名称
      • 5. 查询所有员工的部门
      • 6. 查询 “技术研发部” 的所有员工信息以及工作地点
      • 7. 查询 “技术研发部” 的员工的平均工资
      • 8. 查询工资比 “周杰伦” 高的员工信息
      • 9. 查询工资比 “平均工资” 高的员工信息
      • 10. 查询低于本部门平均工资的员工信息
      • 11. 查询所有的部门信息, 并统计部门的员工人数
      • 12. 查询所有学生的选课情况, 展示出学生名称, 学号, 课程名称
    • 总结
      • 多表关系
      • 多表查询

练习总结

练习

1. 查询员工的姓名、职位、部门信息

select emp_name, position, dept_name
from emp_info as e,dept_info as d
where e.dept_id = d.dept_id;

查询员工的姓名、职位、部门信息

从结果上来看是没有问题的, 但是需要注意隐式连接可读性差; 若 emp_info.dept_id 允许 NULL, 会把这些 NULL 行过滤掉,逻辑等价于 INNER JOIN, 但代码风格不推荐, 可以尝试进行如下的修改

select e.emp_name, e.position, d.dept_name
from emp_info as ejoin dept_info as d on d.dept_id = e.dept_id;

2. 查询入职时间大于 5 年的员工姓名、职位、部门信息

select emp_name, position, dept_name
from emp_info as ejoin dept_info as d on e.dept_id = d.dept_id
where hire_date < date_sub(curdate(), interval 5 year);

查询入职时间大于 5 年的员工姓名、职位、部门信息

3. 查询所有员工的部门ID、部门名称

select emp_name, d.dept_id, dept_name
from emp_info as e,dept_info as d
where e.dept_id = d.dept_id;

查询所有员工的部门ID、部门名称

4. 查询入职时间大于 5 年的员工, 及其归属的部门名称

select emp_name, d.dept_id
from emp_info as e,dept_info as d
where e.dept_id = d.dept_idand hire_date < date_sub(curdate(), interval 5 year);

或者使用左外连接

select emp_name, d.dept_name
from emp_info as eleft join dept_info as d on e.dept_id = d.dept_id
where hire_date < date_sub(curdate(), interval 5 year);

当然, 最好的当然还是使用内连接的办法

select emp_name, d.dept_name
from emp_info as ejoin dept_info as d on e.dept_id = d.dept_idand hire_date < date_sub(curdate(), interval 5 year);

查询入职时间大于 5 年的员工, 及其归属的部门名称

5. 查询所有员工的部门

select e.emp_name, d.dept_name
from emp_info as eleft join dept_info as d on d.dept_id = e.dept_id

查询所有员工的部门

6. 查询 “技术研发部” 的所有员工信息以及工作地点

select emp_id,emp_name,gender,position,hire_date,salary,location
from emp_info as ejoin dept_info as d on d.dept_id = e.dept_id

查询 “技术研发部” 的所有员工信息以及工作地点

7. 查询 “技术研发部” 的员工的平均工资

select avg(salary)
from emp_info as ejoin dept_info d on d.dept_id = e.dept_id
where dept_name = '技术研发部';

查询 “技术研发部” 的员工的平均工资

8. 查询工资比 “周杰伦” 高的员工信息

select *
from emp_info
where salary > (select salary from emp_info where emp_name = '周杰伦');

查询工资比 “周杰伦” 高的员工信息

9. 查询工资比 “平均工资” 高的员工信息

select *
from emp_info
where salary > (select avg(salary) from emp_info);

查询工资比 “平均工资” 高的员工信息

10. 查询低于本部门平均工资的员工信息

这题的话, em, 比想象中可能会复杂一点, 子查询的结果应该是部门的id和各个部门的平均工资

select e.*
from emp_info einner join (select dept_id, avg(salary) as avg_salaryfrom emp_infogroup by dept_id) as d on e.dept_id = d.dept_id
where salary < d.avg_salary;

查询低于本部门平均工资的员工信息

11. 查询所有的部门信息, 并统计部门的员工人数

select d.*, count(*) as `部门的员工人数`
from dept_info as dleft join emp_info as e on e.dept_id = d.dept_id
group by d.dept_id;

查询所有的部门信息, 并统计部门的员工人数

12. 查询所有学生的选课情况, 展示出学生名称, 学号, 课程名称

我们之前做了三张表, 一张是学生表students用于记录学生个人信息, 一张是课程表subjects用于记录课程的信息, 一张是选课表grades用于记录学生的选课情况, 如下图所示

学生情况表

select student_name, student_no, subject_name
from (select student_name, student_no, subject_idfrom students as sleft join grades as g on s.student_id = g.student_id) as aleft join subjects as b on a.subject_id = b.subject_id;

查询所有学生的选课情况, 展示出学生名称, 学号, 课程名称

这个这个, 这个可能看起来就是比较复杂的一个查询, 所以我下面有一个看起来更为整洁的查询方式, 假设所有学生都有进行选课的话, 可以使用下面这一种方式进行三表连接

SELECT s.student_name,s.student_no,su.subject_name
FROM students AS sJOIN grades AS g ON g.student_id = s.student_idJOIN subjects AS su ON su.subject_id = g.subject_id;

但如果有的学生没有选课但是也需要进行显示的话, 则需要使用下面这种

SELECT s.student_name,s.student_no,su.subject_name
FROM students AS sLEFT JOIN grades AS g ON g.student_id = s.student_idLEFT JOIN subjects AS su ON su.subject_id = g.subject_id;

总结

多表关系

  1. 一对多: 在多的一方设置外键, 关联一的一方的主键
  2. 多对多: 建立中间表, 中间表包含两个外键, 关联两张表的主键
  3. 一对一: 用于表结构拆分, 在其中任何一方设置外键(UNIQUE), 关联另一方的主键

多表查询

  1. 内连接

    • 隐式: SELECT ... FROM 表 A, 表 B WHERE 条件 ...

    • 显式: SELECT ... FROM 表 A INNER JOIN 表 B ON 条件 ...

  2. 外连接

    • 左外: SELECT ... FROM 表 A LEFT JOIN 表 B ON 条件 ...

    • 右外: SELECT ... FROM 表 A RIGHT JOIN 表 B ON 条件 ...

  3. 自连接

    SELECT ... FROM 表A 别名1, 表B 别名2 WHERE 条件 ...
    
  4. 子查询

    • 标量子查询

    • 列子查询

    • 行子查询

    • 表子查询

http://www.dtcms.com/a/288163.html

相关文章:

  • 【LeetCode 热题 100】437. 路径总和 III——(解法一)递归递归!
  • 【Linux】mmap的介绍和使用
  • [硬件电路-36]:模拟电路的基本组成要素以及模拟信号处理
  • Python条件控制艺术:侦探破解犯罪谜题逻辑
  • 浏览器渲染原理——计算属性和布局过程常考内容
  • 如何实现一个定时任务
  • LibreTv在线观影项目部署开箱即用
  • 如何解决Flink CDC同步时间类型字段8小时时间差的问题,以MySQL为例
  • 相似度度量方法
  • 车载刷写框架 --- 关于私有节点刷写失败未报引起的反思
  • 暑期算法训练.4
  • 用虚拟机体验纯血鸿蒙所有机型!
  • 【成品设计】基于STM32的水资源监控系列项目
  • 几个好用的MCP分享
  • 使用 PlanetScope 卫星图像绘制水质参数:以莫干湖为例
  • 创建第二大脑--第五章 组织:以行动为导向
  • 使用Python进行文件拷贝的方法
  • NLP中情感分析如何结合知识图谱在跨文化领域提升观念分析和价值判断的准确性?
  • Dockerfile格式
  • windows wsl ubuntu 如何安装 open-jdk8
  • [硬件电路-39]:激光光路的光信号处理、模拟电路的电信号处理、数字电路的电信号处理、软件的信号处理,有哪些共通的操作、运算、变换?
  • BabyAGI 是一个用于自构建自主代理的实验框架
  • Java脚本API参数传递机制详解
  • 让Logo/文字“自己画自己”!✨
  • 一套完整的反向海淘代购系统是一项复杂的系统工程,需要整合电商、物流、支付、清关、仓储、用户服务等多个环节
  • Codeforces Round 1037(Div.3)
  • C++ 比较器(Comparator)超详细笔记
  • 轻松学习C++:基本语法解析
  • JAVA高级第六章 输入和输出处理(一)
  • Git仓库使用