数据库第二次作业
作业思路
1、按要求把数据库和表建好,录入信息
mysql> create database wei_tow;
Query OK, 1 row affected (0.01 sec)
mysql> use wen_tow;
Database changed
CREATE TABLE t_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 '工资',
name VARCHAR(20) NOT NULL COMMENT '姓名',
politics VARCHAR(10) NOT NULL DEFAULT '群众' COMMENT '政治面貌',
birth_date DATE NOT NULL COMMENT '出生日期'
);
mysql> desc t_worker;
+---------------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------------+-------------+------+-----+---------+-------+
| department_id | int | NO | | NULL | |
| worker_id | int | NO | PRI | NULL | |
| worker_date | date | NO | | NULL | |
| wages | float(8,2) | NO | | NULL | |
| name | varchar(20) | NO | | NULL | |
| politics | varchar(10) | NO | | 群众 | |
| birth_date | date | NO | | NULL | |
+---------------+-------------+------+-----+---------+-------+
7 rows in set (0.00 sec)
mysql> insert into t_worker value (101,1001,'2015-5-4',7500.00,'张春燕','群众','1990-7-1');
Query OK, 1 row affected (0.01 sec)
mysql> insert into t_worker values(101,1002,'2019-2-6',5200.00,'李名博','团员','1994-2-8');
Query OK, 1 row affected (0.01 sec)
mysql> insert into t_worker values (102,1003,'2008-1-4',10500.00,'王博涵','党员','1994-9-5');
Query OK, 1 row affected (0.01 sec)
mysql> insert into t_worker values(102,1004,'2016-10-10',5500.00,'赵小军','群众',,'1994-9-5');
Query OK, 1 row affected (0.01 sec)
mysql> insert into t_worker values(102,1005,'2014-4-1',8800.00,'钱有财','党员','1992-12-30');
Query OK, 1 row affected (0.01 sec)
mysql> insert into t_worker values(103,1006,'2019-5-5',5500.00,'孙菲菲','党员','1996-9-2');
Query OK, 1 row affected (0.01 sec)
2、按照题意写代码
2.1 显示所有职工的基本信息
mysql> select * from t_worker;
+---------------+-----------+-------------+----------+--------+----------+------------+
| department_id | worker_id | worker_date | wages | name | politics | birth_date |
+---------------+-----------+-------------+----------+--------+----------+------------+
| 101 | 1001 | 2015-05-04 | 7500.00 | 张春雁 | 群众 | 1990-07-01 |
| 101 | 1002 | 2019-02-06 | 5200.00 | 李名博 | 团员 | 1994-02-08 |
| 102 | 1003 | 2008-01-04 | 10500.00 | 王博涵 | 党员 | 1994-09-05 |
| 102 | 1004 | 2016-10-10 | 5500.00 | 赵小军 | 群众 | 1994-09-05 |
| 102 | 1005 | 2014-04-01 | 8800.00 | 钱有财 | 党员 | 1992-12-30 |
| 103 | 1006 | 2019-05-05 | 5500.00 | 孙菲菲 | 党员 | 1996-09-02 |
+---------------+-----------+-------------+----------+--------+----------+------------+
6 rows in set (0.00 sec)
2.2 查询所有职工所属部门的部门号,不显示重复的部门号
mysql> select distinct department_id from t_worker;
+---------------+
| department_id |
+---------------+
| 101 |
| 102 |
| 103 |
+---------------+
2.3 求出所有职工的人数
mysql> select count(*) as total_employess from t_worker;
+-----------------+
| total_employess |
+-----------------+
| 6 |
+-----------------+
1 row in set (0.01 sec)
2.4 列出最高工和最低工资
mysql> select max(wages) as max_wage,min(wages) as min_wage from t_worker;
+----------+----------+
| max_wage | min_wage |
+----------+----------+
| 10500.00 | 5200.00 |
+----------+----------+
1 row in set (0.00 sec)
2.5 列出职工的平均工资和总工资
mysql> select avg(wages) as avg_wage,sum(wages) as sum_wage from t_worker;
+-------------+----------+
| avg_wage | sum_wage |
+-------------+----------+
| 7166.666667 | 43000.00 |
+-------------+----------+
1 row in set (0.00 sec)
2.6 创建一个只有职工号、姓名和参加工作的新表,名为工作日期表
mysql> create table work_name_table as select worker_id,name,department_id from t_worker;
Query OK, 6 rows affected (0.04 sec)
Records: 6 Duplicates: 0 Warnings: 0
mysql> select * from work_name_table;
+-----------+--------+---------------+
| worker_id | name | department_id |
+-----------+--------+---------------+
| 1001 | 张春雁 | 101 |
| 1002 | 李名博 | 101 |
| 1003 | 王博涵 | 102 |
| 1004 | 赵小军 | 102 |
| 1005 | 钱有财 | 102 |
| 1006 | 孙菲菲 | 103 |
+-----------+--------+---------------+
6 rows in set (0.00 sec)
2.7 显示所有党员的年龄
mysql> select name,timestampdiff(year,birth_date,curdate()) as age from t_worker;
+--------+------+
| name | age |
+--------+------+
| 张春雁 | 35 |
| 李名博 | 31 |
| 王博涵 | 30 |
| 赵小军 | 30 |
| 钱有财 | 32 |
| 孙菲菲 | 28 |
+--------+------+
6 rows in set (0.00 sec)
注意:
TIMESTAMPDIFF 是 MySQL 中用于计算两个日期或时间之间差值的函数,语法为:
TIMESTAMPDIFF(unit, start_datetime, end_datetime)
作用:返回 end_datetime 与 start_datetime 之间按指定单位(unit)计算的差值。
常用单位:SECOND(秒)、MINUTE(分钟)、HOUR(小时)、DAY(天)、MONTH(月)、YEAR(年)等。
CURDATE() 是 MySQL 中的一个内置函数,用于返回当前的日期。它的返回值格式通常为 YYYY-MM-DD(例如:2025-07-15),具体格式可能受 MySQL 服务器配置影响
2.8 列出工资在 4000 - 8000 之间的所有职工姓名
mysql> select name from t_worker where wages between 4000 and 8000;
+--------+
| name |
+--------+
| 张春雁 |
| 李名博 |
| 赵小军 |
| 孙菲菲 |
+--------+
4 rows in set (0.00 sec)
2.9 列出所有孙姓和李姓的职工姓名
mysql> select name from t_worker where name like '李%' or name like '孙%';
+--------+
| name |
+--------+
| 李名博 |
| 孙菲菲 |
+--------+
2 rows in set (0.00 sec)
2.10 列出所有部门号为 102 和 103 且不是党员的职工号、姓名
mysql> select worker_id,name from t_worker where department_id in(102,103) and politics !='党员';
mysql> select worker_id,name from t_worker where department_id in(102,103) and politics !='党员';
+-----------+--------+
| worker_id | name |
+-----------+--------+
| 1004 | 赵小军 |
+-----------+--------+
1 row in set (0.00 sec)
2.11 将职工表 t_worker 中的职工按出生的先后顺序排序
mysql> select name,birth_date from t_worker order by birth_date;
+--------+------------+
| name | birth_date |
+--------+------------+
| 张春雁 | 1990-07-01 |
| 钱有财 | 1992-12-30 |
| 李名博 | 1994-02-08 |
| 王博涵 | 1994-09-05 |
| 赵小军 | 1994-09-05 |
| 孙菲菲 | 1996-09-02 |
+--------+------------+
6 rows in set (0.00 sec)
其基本语法为:SELECT 列名 FROM 表名 ORDER BY 列名 [ASC|DESC],其中 ASC 表示升序(默认,可省略),DESC 表示降序。
2.12 显示工资最高的前 3 名职工的职工号和姓名
mysql> select worker_id,name from t_worker order by wages desc limit 3;
+-----------+--------+
| worker_id | name |
+-----------+--------+
| 1003 | 王博涵 |
| 1005 | 钱有财 |
| 1001 | 张春雁 |
+-----------+--------+
3 rows in set (0.00 sec)
ORDER BY wages DESC 和 LIMIT 3 是 SQL 查询中用于排序和限制结果的语句,组合起来的作用是:
ORDER BY wages DESC:按照 wages(工资)这一列的值进行降序排序(即从高到低排列)。
LIMIT 3:只返回排序后的前 3 条记录。
2.13 求出各部门党员的人数
mysql> select department_id,count(*) as party_member_count
from t_worker
where politics = '党员'
group by department_id;
+---------------+--------------------+
| department_id | party_member_count |
+---------------+--------------------+
| 102 | 2 |
| 103 | 1 |
+---------------+--------------------+
2 rows in set (0.00 sec)
SELECT department_id, COUNT(*) AS party_member_count
选取 department_id(部门 ID)作为分组依据。
使用 COUNT(*) 统计每个分组中的记录数(即党员人数),并将结果命名为 party_member_count。
FROM t_worker
从 t_worker 表中获取数据。
WHERE politics = '党员'
过滤条件:仅统计政治面貌为 "党员" 的员工。
GROUP BY department_id
按 department_id 分组,确保每个部门的统计结果独立显示。
2.14 统计各部门的工资和平均工资并保留 2 位小数
mysql> select department_id,sum(wages) as sum_department,round(avg(wages),2) as round_department
from t_worker
group by department_id;
+---------------+----------------+------------------+
| department_id | sum_department | round_department |
+---------------+----------------+------------------+
| 101 | 12700.00 | 6350 |
| 102 | 24800.00 | 8266.67 |
| 103 | 5500.00 | 5500 |
+---------------+----------------+------------------+
3 rows in set (0.00 sec)