MySQL学习笔记(学习完之后的课后练习~)

简介: 学习笔记完毕之后的课后练习哦~

5.5、多表的课后练习

【题目】
# 1.显示所有员工的姓名,部门号和部门名称。
SELECT E.last_name,E.department_id,D.department_name
FROM employees E LEFT JOIN departments D
ON E.department_id = D.department_id;

# 2.查询90号部门员工的job_id和90号部门的location_id
SELECT E.job_id,D.location_id
FROM employees E JOIN departments D
ON E.department_id = D.department_id
WHERE D.department_id =90;

# 3.选择所有有奖金的员工的 last_name , department_name , location_id , city
SELECT E.last_name,E.commission_pct,D.department_name,D.location_id,L.city
FROM employees E LEFT JOIN departments D
ON E.department_id = D.department_id
LEFT JOIN locations L
ON D.location_id = L.location_id
WHERE E.commission_pct IS NOT NULL;

# 4.选择city在Toronto工作的员工的 last_name , job_id , department_id , department_name
SELECT E.last_name,E.job_id,D.department_id,D.department_name,L.city
FROM employees E JOIN departments D
ON E.department_id = D.department_id
JOIN locations L
ON D.location_id = L.location_id
WHERE L.city = 'Toronto';

# 5.查询员工所在的部门名称、部门地址、姓名、工作、工资,其中员工所在部门的部门名称为’Executive’
SELECT D.department_name,L.city,E.last_name,E.job_id,E.salary
FROM employees E JOIN departments D
ON E.department_id = D.department_id
JOIN locations L
ON D.location_id = L.location_id
WHERE D.department_name = 'Executive';

# 6.选择指定员工的姓名,员工号,以及他的管理者的姓名和员工号,结果类似于下面的格式
# employees Emp
# manager Mgr
# kochhar 101 king 100
SELECT EMP.last_name ,EMP.employee_id AS "ENP" ,MRG.last_name,MRG.employee_id AS "MRG"
FROM employees EMP LEFT JOIN employees MRG
ON EMP.employee_id = MRG.employee_id

# 7.查询哪些部门没有员工
SELECT D.department_id
FROM departments D LEFT JOIN employees E
ON D.department_id = E.department_id
WHERE E.department_id IS NULL;

# 8. 查询哪个城市没有部门
SELECT L.city,D.department_id
FROM locations L LEFT JOIN departments D
ON L.location_id = D.location_id
WHERE D.location_id IS NULL;

# 9. 查询部门名为 Sales 或 IT 的员工信息
SELECT D.department_name,E.last_name
FROM departments D LEFT JOIN employees E
ON D.department_id = E.department_id
WHERE D.department_name IN('Sales','IT');
#1.所有有门派的人员信息
#( A、B两表共有)
SELECT *
FROM t_dept A JOIN t_emp B
ON A.id = B.id;

#2.列出所有用户,并显示其机构信息
#(A的全集)
SELECT *
FROM t_emp A LEFT JOIN t_dept B
ON A.id = B.id;

#3.列出所有门派
#(B的全集)
SELECT *
FROM t_dept B;

#4.所有不入门派的人员
#(A的独有)
SELECT *
FROM t_emp A LEFT JOIN t_dept B
ON A.id = B.id
WHERE B.id IS NULL;

#5.所有没人入的门派
#(B的独有)
SELECT *
FROM t_dept B LEFT JOIN t_emp A
ON A.deptId = B.id
WHERE A.deptId IS NULL;

#6.列出所有人员和机构的对照关系
#(AB全有)
SELECT *
FROM t_dept B RIGHT JOIN t_emp A
ON A.id = B.id;

#7.列出所有没入派的人员和没人入的门派
#(A的独有+B的独有)
SELECT *
FROM t_emp A LEFT JOIN t_dept B
ON A.id = B.id
WHERE B.id IS NULL
UNION
SELECT *
FROM t_emp A RIGHT JOIN t_dept B
ON A.deptId = B.id
WHERE A.deptId IS NULL;

6、函数

  • 从实现功能的角度分为数值函数、字符串函数、日期函数、时间函数、流程控制函数、加密函数和解密函数
  • 函数又分为单行函数和多行函数

6.1数值函数

image-20220915104032704

  • 函数类型有很多,需要什么去百度就行,重心是五大聚合函数

6.2、聚合函数

6.2.1、常见的几个聚合函数

  • AVG / SUM (即平均数和总和):只适用于数值类型的字段(或变量)
SELECT AVG(salary)
FROM employees; #即平均工资

SELECT SUM(salary)
FROM employees; #即工资总和

SELECT AVG(last_name)
FROM employees; #这块写的是姓名的平均数,显然不合理,所以得出结论平均数和总和只能用于数值类型的字段
  • MAX / MIN (即最大值和最小值):适用于所有数据类型
SELECT MAX(salary)
FROM employees; #即最高工资

SELECT MIN(salary)
FROM employees; #即最低工资

SELECT MIN(last_name)
FROM employees #这块写的是让字符串之间相互比较可行,所以得出记录最大值和最小值适用于所有数据类型
  • COUNT 作用:计算指定字段在查询结构中出现的个数
#涉及到一个问题,如果要计算表中有多少条记录,如何实现?
#方式一:COUNT(*)
SELECT COUNT(*)
FROM employees;

#方式二:COUNT(1)
SELECT COUNT(1)
FROM employees;

#方式三:COUNT(具体字段) :但是不一定对!!因为计算指定字段出现的个数时,是不计算NULL值的,所有当表中数据有NULL值的时候就不精确
SELECT COUNT(salary)
FROM employees; #即查询表中有多少个字段的个数,跟表中数据并无关系

6.2.2、GROUP BY的使用

  • 从需求出发:查询各个部门的平均工资和最高工资
SELECT department_id,AVG(salary),sum(salary)
FROM employees
GROUP BY department_id; #即根据部门id来算平均工资,然后也查出了最高工资
  • 需求二:根据 job_id进行分组,查询出部门的最高工资
SELECT job_id,AVG(salary)
FROM employees
GROUP BY job_id;
  • 需求三:先根据部门id进行分组,再根据工种进行分组
SELECT department_id,job_id,AVG(salary)
FROM employees
GROUP BY department_id, job_id; #即用逗号隔开分组条件即可

6.2.3、HAVING的使用

  • 作用:用来过滤数据的
  • 同样从需求出发:查询各个部门中最高工资比10000高的部门信息
SELECT department_id,MAX(salary)
FROM employees
WHERE MAX(salary)>10000
GROUP BY department_id; #错误写法,由此得出结论,一旦过滤条件使用了函数或聚合函数,就不能用WHERE关键字去过滤数据

#正确写法如下:
SELECT department_id,MAX(salary)
FROM employees
GROUP BY department_id
HAVING MAX(salary)>10000; #HAVING必须声明在GROUP BY后面
  • 得出结论:开发中,使用HAVING的前提是SQL中使用了GROUP BY
  • 练习:查询部门id为10,20,30,40这四个部门中最高工资比10000高的部门信息
#写法一:推荐使用,因为执行方式高于方式二
SELECT department_id,MAX(salary)
FROM employees
WHERE department_id IN(10,20,30,40)
GROUP BY department_id
HAVING MAX(salary)>10000;

#写法二:
SELECT department_id,MAX(salary)
FROM employees
GROUP BY department_id
HAVING MAX(salary)>10000 AND department_id IN(10,20,30,40);
  • 结论:当过滤条件中有聚合函数时,则过滤条件必须声明在HAVING中
  • 当过滤条件中没有聚合函数时,则此过滤条件声明在WHERE中或HAVING中都可以,但是能使用最好使用在WHERE中

6.2.4、SQL92语法和SQL99语法的语法结构

image-20220915161344605

6.3、聚合函数的课后练习

#2、查询公司员工工资的最大值,最小值,平均值,总和
SELECT MAX(salary),MIN(salary),AVG(salary),SUM(salary)
FROM employees;

#3、查询各job_id的员工工资的最大值,最小值,平均值,总和
SELECT job_id,MAX(salary),MIN(salary),AVG(salary),SUM(salary)
FROM employees
GROUP BY job_id;

#4、选择具有各个job_id的员工人数
SELECT job_id,COUNT(*)
FROM employees
GROUP BY job_id;

#5、查询员工最高工资和最低工资的差距
SELECT MAX(salary)- MIN(salary) AS "DIFFERNCE"
FROM employees;

#6、查询各个管理者手下员工的最低工资,其中最低工资不能低于6000,没有管理者的员工不计算在内
SELECT manager_id,MIN(salary)
FROM employees
WHERE manager_id IS NOT NULL
GROUP BY manager_id
HAVING MIN(salary)>=6000;

#7、查询所有部门的名字,location_id,员工数量和平均工资,并按平均工资降序
SELECT department_name,location_id,COUNT(employee_id),AVG(salary) AS "AVG"
FROM departments D LEFT JOIN employees E
ON D.department_id = E.department_id
GROUP BY department_name, location_id
ORDER BY AVG DESC;

#8、查询每个工种、每个部门的部门名、工种名和最低工资
SELECT D.department_name,E.job_id,MIN(E.salary)
FROM departments D LEFT JOIN employees E
ON D.department_id = E.department_id
GROUP BY department_name,job_id;
相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
2月前
|
NoSQL 算法 Redis
【Docker】(3)学习Docker中 镜像与容器数据卷、映射关系!手把手带你安装 MySql主从同步 和 Redis三主三从集群!并且进行主从切换与扩容操作,还有分析 哈希分区 等知识点!
Union文件系统(UnionFS)是一种**分层、轻量级并且高性能的文件系统**,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem) Union 文件系统是 Docker 镜像的基础。 镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
485 5
|
3月前
|
关系型数据库 MySQL 数据管理
Mysql基础学习day03-作业
本内容包含数据库建表语句及多表查询示例,涵盖内连接、外连接、子查询及聚合统计,适用于员工与部门数据管理场景。
85 1
|
3月前
|
SQL 关系型数据库 MySQL
Mysql基础学习day01
本课程为MySQL基础学习第一天内容,涵盖MySQL概述、安装、SQL简介及其分类(DDL、DML、DQL、DCL)、数据库操作(查询、创建、使用、删除)及表操作(创建、约束、数据类型)。适合初学者入门学习数据库基本概念和操作方法。
191 6
|
3月前
|
SQL 关系型数据库 MySQL
Mysql基础学习day02-作业
本教程介绍了数据库表的创建与管理操作,包括创建员工表、插入测试数据、删除记录、更新数据以及多种查询操作,涵盖了SQL语句的基本使用方法,适合初学者学习数据库操作基础。
102 0
|
3月前
|
SQL 关系型数据库 MySQL
Mysql基础学习day03
本课程为MySQL基础学习第三天内容,主要讲解多表关系与多表查询。内容涵盖物理外键与逻辑外键的区别、一对多、一对一及多对多关系的实现方式,以及内连接、外连接、子查询等多表查询方法,并通过具体案例演示SQL语句的编写与应用。
116 0
|
3月前
|
SQL 关系型数据库 MySQL
Mysql基础学习day01-作业
本教程包含三个数据库表的创建练习:学生表(student)要求具备主键、自增长、非空、默认值及唯一约束;课程表(course)定义主键、非空唯一字段及数值精度限制;员工表(employee)包含自增主键、非空字段、默认值、唯一电话号及日期时间类型字段。每个表的结构设计均附有详细SQL代码示例。
88 0
|
3月前
|
SQL 关系型数据库 MySQL
Mysql基础学习day02
本课程为MySQL基础学习第二天内容,涵盖数据定义语言(DDL)的表查询、修改与删除操作,以及数据操作语言(DML)的增删改查功能。通过具体SQL语句与实例演示,帮助学习者掌握MySQL表结构操作及数据管理技巧。
155 0
|
11月前
|
存储 关系型数据库 MySQL
MySQL索引学习笔记
本文深入探讨了MySQL数据库中慢查询分析的关键概念和技术手段。
727 81
|
存储 SQL 关系型数据库
Mysql学习笔记(二):数据库命令行代码总结
这篇文章是关于MySQL数据库命令行操作的总结,包括登录、退出、查看时间与版本、数据库和数据表的基本操作(如创建、删除、查看)、数据的增删改查等。它还涉及了如何通过SQL语句进行条件查询、模糊查询、范围查询和限制查询,以及如何进行表结构的修改。这些内容对于初学者来说非常实用,是学习MySQL数据库管理的基础。
357 6
|
12月前
|
SQL 存储 关系型数据库
【MySQL基础篇】全面学习总结SQL语法、DataGrip安装教程
本文详细介绍了MySQL中的SQL语法,包括数据定义(DDL)、数据操作(DML)、数据查询(DQL)和数据控制(DCL)四个主要部分。内容涵盖了创建、修改和删除数据库、表以及表字段的操作,以及通过图形化工具DataGrip进行数据库管理和查询。此外,还讲解了数据的增、删、改、查操作,以及查询语句的条件、聚合函数、分组、排序和分页等知识点。
1055 56
【MySQL基础篇】全面学习总结SQL语法、DataGrip安装教程

推荐镜像

更多