1.建表
实验表:worker职工表
字段说明:
- department_id:部门号
- worker_id:职工号
- worker_date:入职日期
- wages:工资
- politics:政治面貌
- name:姓名
- borth_date:出生日期
备注:本实验中出生日期字段命名为borth_date(属于拼写笔误,正确英文应为birth_date),下文所有 SQL 统一使用 borth_date,和数据库表保持一致。
sql
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.插入数据
sql
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-12-2');
3.完成查询
(1)、显示所有职工的基本信息。
sql
select * from worker;
查询结果如图:

(2)、查询所有职工所属部门的部门号,不显示重复的部门号。
sql
select distinct department_id from worker;
查询结果如图:

(3)、求出所有职工的人数。
sql
select count(1) '总人数' from worker;
查询结果如图:

(4)、列出最高工和最低工资。
sql
select max(wages) '最高工资' ,min(wages) '最低工资' from worker;
查询结果如图:

(5)、列出职工的平均工资和总工资。
sql
select round(avg(wages),2) as '平均工资' ,sum(wages) as '总工资' from worker;
查询结果如图:

(6)、创建一个只有职工号、姓名和参加工作时间的新表,名为工作日期表workdate(数据来源于worker表)
提示:用复制表的语法
sql
create table workdate select department_id,name,worker_date from worker;
创建成功后查询新表:


(7)、显示所有党员的年龄。
sql
-- 注:字段名是 borth_date,为本次实验的拼写,不是标准birth_date
select name '姓名' , timestampdiff(year,borth_date,curdate()) '年龄' from worker where politics = '党员';
查询结果如图:

这里使用'curdate()'获取服务器当前日期,配合timestampdiff计算周岁;注意:字段为borth_date,是建表时的拼写,并非标准写法,复制代码时请和自己表的字段保持一致。
(8)、列出工资在2000-5000之间的所有职工姓名。
sql
select name '姓名' from worker where wages between 2000 and 5000;
查询结果如图:

(9)、列出所有孙姓和李姓的职工姓名。
sql
select name '姓名' from worker where name like '孙%' or name like '李%';
查询结果如图:

(10)、列出所有部门号为2和3且不是党员的职工号、姓名。
sql
select worker_id '职工号',name '姓名' from worker where department_id in (2,3) and politics != '党员' ;
查询结果如图:
因为表中无部门号为2或3,所有查询结果没有输出。
(11)、将职工表worker中的职工按出生的先后顺序排序。
sql
select name '姓名',borth_date '出生日期' from worker order by borth_date;
查询结果如图:

(12)、显示工资最高的前3名职工的职工号和姓名。
sql
select worker_id '职工号', name '姓名' from worker order by wages desc limit 3;
查询结果如图:

(13)、求出各部门党员的人数。
sql
select department_id '部门号', count(1) '人数' from worker where politics = '党员' group by department_id;
查询结果如图:

(14)、统计各部门的工资和平均工资
sql
select department_id '部门号' , sum(wages) '总工资' , round(avg(wages),2) '平均工资' from worker group by department_id;
查询结果如图:
(15)、列出总人数大于等于4的部门号和总人数。
sql
select department_id '部门号' , count(1) '总人数' from worker group by department_id having count(1)>=4;
查询结果如图:
