MYSQL第二次作业

我想通过这次作业得到什么

1、通过作业来检测自己是否掌握知识点

2、通过每个示例分析得到相对应的知识点

数据准备

1.建表

mysql> create table worker(

department_id int(11) not null comment '部门号',

worker_id int(11) primary key not null comment '职工号',

worker_date date not null comment '工作时间',

wages float(8,2) not null comment '工资',

politics varchar(10) not null default '群众' comment '政治面貌',

name varchar(20) not null comment '姓名',

borth_date date not null comment '出生日期' );

2.插入数据

mysql> insert into worker values (101,1001,'2015-5-4',3500.00,'群众','张三','1990-7-1');

mysql> insert into worker values (101,1002,'2017-2-6',3200.00,'团员','李四','1997-2--8');

mysql> insert into worker values (102,1003,'2011-1-4',8500.00,'党员','王亮','1983-6-8');

mysql> insert into worker values (102,1004,'2016-10-10',5500.00,'群众','赵六','1994-9-5');

mysql> insert into worker values (102,1005,'2014-4-1',4800.00,'党员','钱七','1992-12-30');

mysql> insert into worker values (102,1006,'2017-5-5',4500.00,'党员','孙八','1996-92-2');

题目1:显示所有职工的基本信息

select * from worker;

select 的作用是查询

语法:select 字段名1,字段名2.... from 表1,表2 ....;

根据题目可得,需要worker表的所有信息。由于一个个敲表字段太过于繁琐

所以可以使用 * 来表示所有 可以理解为通配符

题目2:查询所有职工所属部门的部门号,不显示重复的部门号。

select distinct department_id from worker;

根据题目可得,需要所有职工所属部门的部门号,并且不重复显示

通过select的正常语法 会得到

无法得到我们想要的不重复,所以新的知识来了,distinct的作用是去重

需要注意的是:必须在 select 和 字段名中间加上distinct 也就是

1、select distinct 字段名1,字段名2.... from 表名1,表名2... 语法就是这样

2、如果 字段名有多个 则会对多个字段名去重

题目3:求出所有职工的人数。

select count(1) from worker;

count()是一个聚合函数

聚合函数的作用是:将一列数据作为一个整体,进行纵向计算。

可以理解为按行计数。

count()有三种统计方式

count(*):所有行进行统计,包括NULL行

count(1):所有行进行统计,包括NULL行

count(某字段):对某字段中非NULL进行统计

区别:count(1)的效率 > count(*)

注意:聚合函数一般放在字段名和having(之后会提到having)。

|---------|-----|
| 函数 | 功能 |
| count() | 统计 |
| max() | 最大值 |
| min() | 最小值 |
| avg() | 平均值 |
| sum() | 求和 |
[聚合函数]

题目4:列出最高工和最低工资

select max(wages),min(wages) from worker;

理解了前三题,这道题也是同样的道理,这里不在过多赘述

题目5:列出职工的平均工资和总工资

select avg(wages),sum(wages) from worker;

与第四题本质上是同理

题目6:创建一个只有职工号、姓名和参加工作的新表,名为工作日期表workdate(数据来源于worker表)

create table workdate select worker_id,name,worker_date from worker;

这是三种有关复制的SQL,记忆即可

复制表结构 create table 新表名 like 源表

复制表结构 + 数据 create table 新表名 select * from 源表

复制数据 insert into 表1 select * from 表2 ; 将表2数据复制到表1

题目7:显示所有党员的年龄

SELECT name, politics, TIMESTAMPDIFF(YEAR, borth_date, CURDATE()) AS age FROM worker WHERE politics = '党员';

这套题难点在于 如何显示年龄

介绍一个单行函数 TIMESTAMPDIFF(单位,时间1,时间2)

单位有 year、month、day、hour、minute、second

如果你要计算时间1和时间2相差多少年就用year,后面的单位也是一样

CURDATE()这个单行函数是返回当前的年月日

了解这些后 就能够写出这道题了

但还要区分一些细节

聚合函数和单行函数的区别:

聚合函数: 从多列中计算出一个值

单行函数:从一列中计算出一个值

CURDATE()和NOW()的区别

CURDATE()返回年月日

NOW()返回年月日时分秒

本例中使用now()也可以,但更推荐CURDATE()因为能对应上borth_day的年月日

AS 的作用是起别名 通常加在字段名和表名后

where 可以理解为从表中筛选你想要的数据

语法:select 字段名 from 表名 where 字段名 条件运算符、逻辑运算符

本例中:明确要求党员 我们就可以使用where politics(字段名)="党员"

注意:where 中不能使用 聚合函数

我明白一个例子不足以完全理解 但这是十分常用的查询内容的方法 之后还会频繁的遇到

题目8:列出工资在2000-5000之间的所有职工姓名

select name,wages from worker where wages between 2000 and 5000;

between .... and .... 表示一个区间并且还是闭区间 本题中 2000,5000

当然也有其他的表示方法

在数字情况下 where wages >=2000 and wages <=5000 等同于 where wages between 2000 and 5000

开区间的表示 where wages > 2000 and wages < 5000

题目9:列出所有孙姓和李姓的职工姓名

select name from worker where name like "李%" or name like "孙%";

这里需要注意 like 是模糊匹配 有两种匹配模式

%表示通配符

_ 表示长度

比如 本例 姓李的 使用 "李%" ,因为只要李开头后面是什么都可以

如果你想找只要三个字的 就可以使用 "___" 三个下划线

题目10:列出所有部门号为2和3且不是党员的职工号、姓名

select worker_id,name from worker where department_id in (2,3) and politics != '党 员';

in(...) 是条件运算符中的一个 括号内的内容并不是区间,而是具体的某一个值

本例 where department_id in(2,3) 意思为 筛选 部门号为2 或者3的部门

并不是 2到3的区间

题目11:将职工表worker中的职工按出生的先后顺序排序

select * from worker order by borth_date asc;

本例出现了一个新东西 order by 意为 排序查询 作用是 根据 某一列 来进行 升或降的排序

asc (ascend) 升序

desc (descent)降序

语法: order by 列名 asc/desc 默认升序

题目12:显示工资最高的前3名职工的职工号和姓名

select worker_id,name,wages from worker order by wages desc limit 3;

本例相当于在 order by 的基础上 又加上了一个新东西,分页查询

语法:limit 初始位置,记录数 # 从第几条记录开始显示,显示几条

limit 记录数 # 从第一条记录开始显示几条记录

limit 3 表示 从第一条开始往后记录三条 包括第一条

题目13:求出各部门党员的人数

select department_id ,count(1) from worker where politics='党员' group by department_id ;

group by:通过 某个相同的字段进行 分组 有点类似算法中的分治思想

语法:group by 字段名 having 分组后过滤的条件 (having 会在后面具体介绍)

group by 通常是结合聚合函数一起使用

在上图,通过class_id 进行分组,分成了5个组,我们就可以通过聚合函数的使用,分别将每

个组的数据进行处理,比如计算平均分,之后就得出每个组的平均分。

在本例,我们先将党员筛选出来,所以在分组之前先where politics="党员"。之后再使用分组查询来对各部门的党员进行统计。

为什么不能分组后在筛选呢?因为先分组后的内容 全是数字没有党员的内容。

题目14:统计各部门的工资和平均工资

select department_id,sum(wages),avg(wages) from worker group by department_id;

本例 将101,102分成两个组,然后通过两个聚合函数,对两组分别进行计算

其实知识点就是 聚合函数+group by

题目15:列出总人数大于等于4的部门号和总人数

select department_id,count(1) from worker group by department_id having count(1) >=4 ;

在本例解释 having与where的区别

在本例 先通过部门号将101和102 分成两个组,题目要求列出总人数大于4的部门号

所以 having count(1) > 4 这里是可以使用聚合函数的。

having与where的区别

where 不能使用 聚合函数进行条件过滤 而 having 可以

count(1) 统计行数据

相关推荐
yeccheng25 分钟前
MySQL 索引超详解:从底层 B+ 树到面试高频考点
java·开发语言·jvm·mysql·面试
Risehuxyc27 分钟前
Microsoft.Data.Sqlite体验
数据库·sqlite
骑着蜗牛撵大象32728 分钟前
MySQL 8.0 迁移后 SQL 变慢:执行计划里 3 类被忽略的成本差异
android·数据库·sql·mysql·优化器·执行计划
我叫张土豆1 小时前
Android 14+ 模拟器抓包实录:把 Burp CA 装成系统 CA,让 targetSdk≥34 的 App 乖乖解密
android
ZENERGY-众壹2 小时前
告警风暴怎么压?100MW 电站监控平台告警引擎架构复盘
数据库·架构·iot·电站监控
zhengfei6113 小时前
Go-fastdfs /reload 未授权访问: 有效PoC
数据库·sql
DevOpenClub3 小时前
高考教育信息问答 API:会话参数、资料引用与流式响应
java·数据库·高考
yuanyuan3343 小时前
2026枣庄带检测报告伸缩门品牌测评|本地服务
大数据·数据库·人工智能·伸缩门
wdyan2973 小时前
带着小白学习-微服务-5 实战:配置中心-数据库连接
数据库·学习·微服务