我想通过这次作业得到什么
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) 统计行数据




















