MySQL 实训5(创建两个数据库并查询六个表) 的代码及操作

MySQL 专栏收录该内容
4 篇文章 0 订阅

实训内容

创建YGGL数据库并在YGGL数据库创建三个表:employees,salary,departments。

创建XSCJ数据库并在XSCJ数据库创建三个表:XS,KC,XS_KC。

一、YGGL数据库

1.首先需要创建YGGL数据库:

create database YGGL
	default character set gb2312 collate gb2312_chinese_ci;

创建数据库代码
▲因为我已经创建过了,所以图片里的代码数据库名会+1,以下+1操作不做重复解释。

2.创建员工信息表employees

use YGGL;
create table employees (
  员工编号 char(6) NOT NULL,
  姓名 char(10) NOT NULL,
  学历 char(4) NOT NULL,
  出生日期 date NOT NULL,
  性别 char(2) NOT NULL,
  工作年限 tinyint(1) DEFAULT NULL,
  地址 varchar(20) DEFAULT NULL,
  电话号码 char(11) DEFAULT NULL,
  员工部门号 char(3) DEFAULT NULL,
  PRIMARY KEY (员工编号)
) ENGINE=InnoDB;

创建表格
3.创建员工薪水情况表salary

CREATE TABLE salary (
  员工编号 char(6) NOT NULL,
  收入 float(8,2) NOT NULL,
  支出 float(8,2) NOT NULL,
  PRIMARY KEY (员工编号)
) ENGINE=InnoDB;

创建员工薪水表
4.创建部门信息表departments

CREATE TABLE departments (
  部门编号 char(3) NOT NULL,
  部门名称 char(20) NOT NULL,
  备注 text,
  PRIMARY KEY (部门编号)
) ENGINE=InnoDB;

创建部门信息表
5.给salary表建立数据完整性约束,创建外键,以保证当要删除和更新employees表中的员工编号时,自动删除和更新salary表中匹配的行。

alter table salary add foreign key (员工编号) references employees(员工编号) on delete cascade on update cascade;

修改完整性
6.插入数据
(1)插入employees表数据

INSERT INTO employees VALUES ('000001', '王林', '大专', '1966-01-23', '1', 8, '中山路32-1-508', '83355668', '2');
INSERT INTO employees VALUES ('010008', '伍容华', '本科', '1976-03-28', '1', 3, '北京东路100-2', '83321321', '1');
INSERT INTO employees VALUES ('020010', '王向荣', '硕士', '1982-12-09', '1', 2, '四牌楼', '83792361', '1');
INSERT INTO employees VALUES ('020018', '李丽', '大专', '1960-07-30', '0', 6, '中山东路102-2', '83413301', '1');
INSERT INTO employees VALUES ('102201', '刘明', '本科', '1972-10-18', '1', 3, '虎距路100-2', '83606608', '5');
INSERT INTO employees VALUES ('102208', '朱俊', '硕士', '1965-09-28', '1', 2, '牌楼巷5-3-106', '84708817', '5');
INSERT INTO employees VALUES ('108991', '钟敏', '硕士', '1979-08-10', '0', 4, '中山路10-3-105', '83346722', '3');
INSERT INTO employees VALUES ('111006', '张石兵', '本科', '1974-10-01', '1', 1, '解放路34-1-203', '84563418', '5');
INSERT INTO employees VALUES ('210678', '林涛', '大专', '1977-04-02', '1', 2, '中山北路24-35', '83467336', '3');
INSERT INTO employees VALUES ('302566', '李玉珉', '本科', '1968-09-20', '1', 3, '热和路209-3', '58765992', '4');
INSERT INTO employees VALUES ('308759', '叶凡', '本科', '1978-11-18', '1', 2, '北京西路3-7-52', '83308901', '4');
INSERT INTO employees VALUES ('504209', '陈林琳', '大专', '1969-09-03', '0', 5, '汉中路120-4-12', '84468158', '4');

(2)插入salary表数据

INSERT INTO salary VALUES ('000001', 2100.80, 123.09);
INSERT INTO salary VALUES ('010008', 1582.62, 88.03);
INSERT INTO salary VALUES ('020010', 2860.00, 198.00);
INSERT INTO salary VALUES ('020018', 2347.68, 180.00);
INSERT INTO salary VALUES ('102201', 2569.88, 185.65);
INSERT INTO salary VALUES ('102208', 1980.00, 100.00);
INSERT INTO salary VALUES ('108991', 3259.98, 281.52);
INSERT INTO salary VALUES ('111006', 1987.01, 79.58);
INSERT INTO salary VALUES ('210678', 2240.00, 121.00);
INSERT INTO salary VALUES ('302566', 2980.70, 210.20);
INSERT INTO salary VALUES ('308759', 2531.98, 199.08);
INSERT INTO salary VALUES ('504209', 2066.15, 108.00);

(3)插入departments表数据

INSERT INTO departments VALUES ('1', '财务部', NULL);
INSERT INTO departments VALUES ('2', '人力资源部', NULL);
INSERT INTO departments VALUES ('3', '经理办公室', NULL);
INSERT INTO departments VALUES ('4', '研发部', NULL);
INSERT INTO departments VALUES ('5', '市场部', NULL);

7.对YGGL数据库进行select语句查询。
(1)查询employees表员工部门号和性别,要求消除重复行。

select distinct 员工部门号,性别 from employees;

在这里插入图片描述
(2)计算每个雇员的实际收入(实际收入=收入-支出)。

select 员工编号,姓名,收入-支出 as 实际收入 from salary join employees using(员工编号);

在这里插入图片描述
(3)查询employees表中员工的姓名和性别,要求sex值为1时显示为“男”,为0时显示为“女”

select 姓名,case when 性别='1' then '男' when 性别='0' then '女' end as 性别 from employees; 

在这里插入图片描述
(4)查询每个雇员的地址和电话,显示的列标题要求显示“address” “telephone”。

select 地址 as address,电话号码 as telephone from employees;

在这里插入图片描述
(5)计算salary表中员工月收入的平均数。

select avg(收入) as 员工平均收入 from salary;

在这里插入图片描述
(6)计算所有员工的总支出。

select sum(支出) as 员工的总支出 from salary;

在这里插入图片描述
(7)显示女雇员的地址和电话。

select 姓名,地址,电话号码 from employees where 性别='0';

在这里插入图片描述
(8)计算员工总数。

select count(*) as 员工总人数 from employees;

在这里插入图片描述
(9)显示员工的最高收入和最低收入。

select max(收入) as 最高收入,min(收入) as 最低收入 from salary;

在这里插入图片描述
8.对YGGL数据库进行条件查询。
(1)显示月收入高于2000元的员工的员工号。

select 员工编号,收入 from salary where 收入>=2000;

在这里插入图片描述
(2)查询1970年以后出生的员工的姓名和地址。

select 姓名,地址,出生日期 from employees where 出生日期>='1970';

在这里插入图片描述
(3)显示工作年限三年以上(含3年)、学历在本科以上(含本科)的男性员工的信息。

select 姓名,性别,工作年限,学历 from employees where 性别='1' and 工作年限>=3 and 学历='本科';

在这里插入图片描述
(4)查找员工号中倒数第二个数字为0的员工的姓名、地址和学历。

select 员工编号,姓名,地址,学历 from employees where 员工编号 like '%0_';

在这里插入图片描述
(5)查询月收入在2000~3000元的员工。

select 姓名,收入 from salary join employees on (salary.员工编号=employees.员工编号) where 收入>=2000 and 收入<=3000;

在这里插入图片描述
9.对YGGL数据库进行多表查询。
(1)查询“王林”的基本情况和所工作的部门名称。

select distinct * from employees join departments on (employees.员工部门号=departments.部门编号) join salary on (employees.员工编号=salary.员工编号) where 姓名='王林';

在这里插入图片描述
(2)查询财务部、研发部、市场部的员工信息。

select * from departments join employees on(employees.员工部门号=departments.部门编号) where 部门名称='财务部' or 部门名称='研发部' or 部门名称='市场部';

在这里插入图片描述

(3)查询每个雇员的基本情况和薪水情况。

select distinct * from employees join salary on(employees.员工编号=salary.员工编号);

在这里插入图片描述

(4)查询研发部在1970年以前出生的员工姓名和薪水情况。

select 姓名,出生日期,部门名称,收入,支出 from employees join salary on(employees.员工编号=salary.员工编号) join departments on(employees.员工部门号=departments.部门编号) where 部门名称='研发部' and 出生日期>'1970';

在这里插入图片描述

(5)查询employees表中员工的姓名、住址和收入水平,要求2000元以下显示为“低收入”,2000~3000显示为“中等收入”,3000元以上时显示为“高收入”。

select 姓名,地址,case when 收入<2000 then '低收入' when 收入>=2000 and 收入<=3000 then '中等收入' else '高收入' end as 收入水平 from employees join salary on(employees.员工编号=salary.员工编号);

在这里插入图片描述
10.对YGGL进行分类汇总与排序。
(1)按部门列出该部门工作的员工人数。

select 部门名称,count(*) from departments join employees on(employees.员工部门号=departments.部门编号) group by 部门名称;

在这里插入图片描述
(2)分别统计男性员工和女性员工人数。

select 性别,count(*) from employees group by 性别;

在这里插入图片描述
(3)查找雇员数超过2人的部门名称和员工数量。

select 部门名称,count(*) as 员工人数 from departments join employees on(employees.员工部门号=departments.部门编号) group by 部门名称 having count(*)>2;

在这里插入图片描述
(4)按员工学历分组统计各种学历人数。

select 学历,count(*) from employees group by 学历;

(5)将员工信息按出生日期从大到小排序。

select * from employees order by 出生日期 desc;

在这里插入图片描述
(6)将员工薪水按收入多少从小到大排序。

select 姓名,收入 from employees join salary on(employees.员工编号=salary.员工编号) order by 收入;

在这里插入图片描述
(7)按员工的工作年限进行分组,统计各个工作年限的人数,并按人数从小到大排序。

select 工作年限,count(*) from employees group by 工作年限 order by count(*);

在这里插入图片描述

二、XSCJ数据库

1.首先需要创建XSCJ数据库:

create database XSCJ
	default character set gb2312 collate gb2312_chinese_ci;

创建数据库
▲因为我已经创建过了,所以图片里的代码数据库名会+1,以下+1操作不做重复解释。

2.创建学生基本情况表XS

use XSCJ;
CREATE TABLE XS (
  学号 char(6) NOT NULL,
  姓名 char(8) DEFAULT NULL,
  专业名 char(10) NOT NULL DEFAULT '计算机',
  性别 tinyint(1) DEFAULT NULL,
  出生时间 date DEFAULT NULL,
  总学分 tinyint(1) NOT NULL,
  照片 blob,
  备注 text,
  PRIMARY KEY (学号)
) ENGINE=InnoDB;

创建表
3.创建课程信息表KC

CREATE TABLE KC (
  课程号 char(3) NOT NULL,
  课程名 char(16) DEFAULT NULL,
  开课学期 tinyint(1) DEFAULT NULL,
  学时 tinyint(1) DEFAULT NULL,
  学分 tinyint(1) NOT NULL,
  PRIMARY KEY (课程号)
) ENGINE=InnoDB;

在这里插入图片描述
4.创建成绩表XS_KC

CREATE TABLE XS_KC (
  学号 char(6) NOT NULL,
  课程号 char(3) NOT NULL,
  成绩 tinyint(1) NOT NULL,
  学分 tinyint(1) NOT NULL,
  PRIMARY KEY (学号,课程号)
) ENGINE=InnoDB;

在这里插入图片描述
(1)建立数据完整性约束,创建外键,以保证当要删除和更新XS表中的学号时,自动删除和更新XS——KC表中匹配的行。

alter table xs_kc add foreign key(学号) references XS(学号) on delete cascade on update cascade;
alter table xs_kc add foreign key(课程号) references KC(课程号) on delete cascade on update cascade;

在这里插入图片描述
5.插入数据
(1)插入XS表数据

INSERT INTO XS VALUES ('081101', '王林', '计算机', 1, '1990-02-10', 50, NULL, NULL);
INSERT INTO XS VALUES ('081102', '程明', '计算机', 1, '1989-10-06', 50, NULL, NULL);
INSERT INTO XS VALUES ('081103', '王燕', '计算机', 0, '1989-10-06', 50, NULL, NULL);
INSERT INTO XS VALUES ('081104', '韦严严', '计算机', 1, '1990-08-26', 50, NULL, NULL);
INSERT INTO XS VALUES ('081106', '李方方', '计算机', 1, '1990-11-20', 50, NULL, NULL);
INSERT INTO XS VALUES ('081107', '李明', '计算机', 1, '1990-05-01', 54, NULL, '提前修完《数据结构》,成绩游戏');
INSERT INTO XS VALUES ('081108', '林一帆', '计算机', 1, '1989-08-05', 52, NULL, '已提前修完一门课');
INSERT INTO XS VALUES ('081109', '张强民', '计算机', 1, '1989-08-11', 50, NULL, NULL);
INSERT INTO XS VALUES ('081110', '张蔚', '计算机', 0, '1991-07-22', 50, NULL, '三好生');
INSERT INTO XS VALUES ('081111', '赵琳', '计算机', 0, '1990-03-18', 50, NULL, NULL);
INSERT INTO XS VALUES ('081113', '严红', '计算机', 0, '1989-08-11', 48, NULL, '有一门功课不及格,待补考');
INSERT INTO XS VALUES ('081201', '王敏', '通信工程', 1, '1989-06-10', 42, NULL, NULL);
INSERT INTO XS VALUES ('081202', '王林', '通信工程', 1, '1989-01-29', 40, NULL, '有一门功课不及格,待补考');

(2)插入KC表数据

INSERT INTO KC VALUES ('101', '计算机基础', 1, 80, 5);
INSERT INTO KC VALUES ('102', '程序设计与语言', 2, 68, 4);
INSERT INTO KC VALUES ('206', '离散数学', 4, 68, 4);
INSERT INTO KC VALUES ('208', '数据结构', 5, 68, 4);
INSERT INTO KC VALUES ('209', '操作系统', 6, 68, 4);
INSERT INTO KC VALUES ('210', '计算机原理', 5, 85, 5);
INSERT INTO KC VALUES ('212', '数据库原理', 7, 68, 4);
INSERT INTO KC VALUES ('301', '计算机网络', 7, 51, 3);
INSERT INTO KC VALUES ('302', '软件工程', 7, 51, 3);

(3)插入XS_KC表数据

INSERT INTO XS_KC VALUES ('081101', '101', 80, 5);
INSERT INTO XS_KC VALUES ('081101', '102', 78, 4);
INSERT INTO XS_KC VALUES ('081101', '206', 76, 4);
INSERT INTO XS_KC VALUES ('081102', '102', 78, 4);
INSERT INTO XS_KC VALUES ('081102', '206', 78, 4);
INSERT INTO XS_KC VALUES ('081103', '101', 62, 5);
INSERT INTO XS_KC VALUES ('081103', '102', 70, 4);
INSERT INTO XS_KC VALUES ('081103', '206', 81, 4);

6.对XSCJ数据库进行数据查询。
(1)查询XS表中各个同学的姓名、专业名、和总学分。

select 姓名,专业名,总学分 from XS;

在这里插入图片描述
(2)查询XS表中计算机系同学的学号、姓名和总学分,结果中各列的标题分别指定为number、name和mark。

select 学号 as number,姓名 as ame,总学分 as mark from XS where 专业名='计算机';

在这里插入图片描述
(3)查询xs表中计算机系各同学的学号、姓名和总学分,对其总学分按以下规则进行替换:若总学分为空值,替换为“尚未选课”;若总学分小于50,替换为“不及格”;若总学分在50~52之间,替换为“合格”;若总学分大于52,替换为优秀。列标题更改为”等级“。

select 学号,姓名,总学分,case when 总学分 is null then '尚未选课' when 总学分<50 then '不及格' when 总学分>=50 and 总学分<=52 then '合格' when 总学分>52 then '优秀' end as 等级 from XS where 专业名='计算机';

在这里插入图片描述
(4)按120分计算成绩,显示XS_KC 表中学号为081101的学生课程信息。

select *,姓名,round(成绩*1.2,2) as 120分值的成绩 from XS_KC join xs using(学号) where 学号='081101';

在这里插入图片描述
(5)对XS表只选择专业名和总学分,消除结果集中的重复行。

select distinct 专业名,总学分 from XS;

在这里插入图片描述
(6)求学生的总人数。

select count(*) as 总人数 from XS;

在这里插入图片描述
(7)统计备注不为空的学生数目。

select count(*) as 备注不为空的人数 from XS where 备注 is not null;

在这里插入图片描述
(8)统计总学分在50分以上的人数。

select count(*) as 总学分在50以上的人数 from XS where 总学分>=50;

在这里插入图片描述
(9)求选修101课程的学生的最高分和最低分。

select 课程号,max(成绩) as 最高成绩,min(成绩) as 最低成绩 from XS_KC join XS on(XS.学号=XS_KC.学号) where 课程号='101';

在这里插入图片描述
(10)求学号081101的学生所学课程的总成绩。

select 学号,sum(成绩) as 总成绩 from XS_KC where 学号='081101';

在这里插入图片描述
(11)求选修101课程的学生的平均成绩。

select avg(成绩) as 选修101课程平均成绩 from XS_KC where 课程号='101';

在这里插入图片描述
(12)查询XSCJ数据库XS表中学号为081101的学生的情况。

select * from XS where 学号='081101';

在这里插入图片描述
(13)查询XS表中总学分大于50的学生的情况。

select * from XS where 总学分>=50;

在这里插入图片描述
(14)查询XS表中备注为空的同学的情况。

select * from XS where 备注 is null;

在这里插入图片描述
(15)查询XS表中专业为计算机,性别为女(0)的同学的情况。

select * from XS where 专业名='计算机' and 性别='0';

在这里插入图片描述
(16)查询XS_KC 表中102 和206课程中大于80分的同学的记录。

select * from XS_KC where (课程号='102' or 课程号='206') and 成绩>=80;

在这里插入图片描述
(17)查询XSCJ 数据库XS 表中姓王的学生学号、姓名及性别。

select 学号,姓名,性别 from XS where 姓名 like '王%';

在这里插入图片描述
(18)查询XSCJ数据库XS表中学号倒数第二个数字为0的学生学号、姓名及专业名。

select 学号,姓名,专业名 from xs where 学号 like '%0_';

在这里插入图片描述
(19)查询XS表中名字包含下划线的学生学号和姓名。

select 学号,姓名 from xs where 姓名 like '%#_%'escape '#';

在这里插入图片描述
▲为了证明语法正确,故意把表里的数据改了一下在进行查询,但其实运行结果应该是下面这张图才对
在这里插入图片描述
(20)查询XS表中不在1989年出生的学生情况。

select * from xs where 出生时间<'1989-01-01' or 出生时间>='1989-12-31';

下列与上列语句等价

select * from xs where 出生时间 not between '1989-01-01' and '1989-12-31';

在这里插入图片描述
(21)查询xs表中专业名为“计算机” “通信工程” 或 “无线电” 的学生的情况。

select * from xs where 专业名='计算机' or 专业名='通信工程' or 专业名='无线电';

在这里插入图片描述
(22)查询xscj数据库中总学分尚不定的学生的情况。

select * from xs where 总学分 is null;

在这里插入图片描述
(23)查找xscj数据库中所有学生选过的课程名和课程号。

select 课程名,课程号 from xs_kc join xs on(XS_KC.学号=XS.学号) join kc using(课程号);

在这里插入图片描述
(24)查找选修了206课程且成绩在80分以上的学生姓名及成绩。

select 姓名,成绩,课程号 from XS_KC join xs using(学号) where 课程号='206' and 成绩>80;

在这里插入图片描述
(25)查找选修了“计算机基础” 课程且成绩在80分以上的学生学号、姓名、课程名及成绩。

select 学号,姓名,课程名,成绩 from XS_KC join xs using(学号) join kc using(课程号) where 课程名='计算机基础' and 成绩>=80;

在这里插入图片描述
(26)查找xscj数据库中课程不同、成绩相同的学生的学号、课程号和成绩。

select 学号,成绩,课程号 from XS_KC where 成绩 in(select 成绩 from XS_KC group by 成绩 having count(*)>1);

在这里插入图片描述
(27)查找kc表中所有学生选过的课程名。

select distinct 课程名 as 选过的课程名 from kc join xs_kc using(课程号);

在这里插入图片描述
(28)查找所有学生情况及他们选修的课程号,若学生未选修任何课,也要包括其情况。

select * from xs left outer join XS_KC on(xs.学号=XS_KC.学号);

在这里插入图片描述
(29)查找被选修了的课程的选修情况和所有开设的课程名。

select * from kc left join xs_KC on(kc.课程号=xs_kc.课程号);

在这里插入图片描述
(30)查找在xscj数据库中选修了课程号206的课程的学生的姓名、学号。

select 姓名,学号 from xs_kc join xs using(学号) where 课程号='206';

在这里插入图片描述
(31)查找未选修离散数学的学生的姓名、学号、专业名。

select 姓名,学号,专业名 from xs where 学号 not in(select 学号 from XS_KC where 课程号 in(select 课程号 from KC where 课程名='离散数学'));

在这里插入图片描述
(32)查找选修了离散数学的学生学号。

select 学号 from XS_kc join kc using(课程号) where 课程名='离散数学';

在这里插入图片描述
(33)查找xs表中比所有计算机系的学生年龄都大的学生学号、姓名、专业名、出生日期。

select 学号,姓名,专业名,出生时间 from xs where 出生时间>all (select 出生时间 from xs where 专业名='计算机');

在这里插入图片描述
(34)查找xs_kc表中课程号为206的成绩不低于课程号101的最低成绩的学生的学号。

select 学号 from XS_KC where 课程号='206' and 成绩>any(select 成绩 from XS_KC where 课程号='101');

在这里插入图片描述
(35)查找选修了206号课程的学生姓名。

select 姓名 from xs join XS_KC using(学号) where 课程号='206';

在这里插入图片描述
(36)将xs中各专业名输出。

select 专业名 from xs;

在这里插入图片描述
(37)求xs中各专业的学生数。

select 专业名,count(*) as 各专业学生数 from xs group by 专业名;

在这里插入图片描述
(38)求被选修的各们课程的平均成绩和选修该课程的人数。

select 课程号,avg(成绩) as 各选修课程的平均成绩,count(*) from XS_KC group by 课程号;

在这里插入图片描述
(39)在xscj数据库上产生一个结果集,包括每个专业的男生人数、女生人数、总人数以及学生总人数。

select 专业名,性别,count(*) as 各专业的人数 from xs group by 专业名,性别 with rollup;

在这里插入图片描述
(40)查找xscj数据中平均成绩在85分以上的学生的学号和平均成绩。

select 学号,avg(成绩) as 平均成绩 from XS_KC group by 学号 having avg(成绩)>85;

在这里插入图片描述
(41)查找选修课程超过2门且成绩都在80分以上的学生的学号。

select 学号 from XS_KC where 成绩>=80 group by 学号 having count(*)>2;

在这里插入图片描述
(42)将通信工程专业的学生按出生日期先后排序。

select 专业名,出生时间 from xs where 专业名='通信工程' order by 出生时间;

在这里插入图片描述
(43)将计算机专业学生的“计算机基础”课程成绩按降序排列。

select 课程名,成绩 from kc join XS_kc using(课程号) where 课程名='计算机基础' order by 成绩 desc;

在这里插入图片描述
(44)将计算机专业学生按期平均成绩排列。

select 学号,姓名,专业名 from xs where 专业名='计算机' order by(select avg(成绩) from XS_KC group by XS_KC.学号 having xs.学号=XS_KC.学号);

在这里插入图片描述
(45)查找XS表中学号最靠前的5位学生的信息。

select * from xs order by 学号 limit 5;

在这里插入图片描述
(46)查找XS表中从第四位同学开始的5位学生的信息。

select * from xs order by 学号 limit 3,5;

在这里插入图片描述

完啦!!!!!!!!!

©️2021 CSDN 皮肤主题: 游动-白 设计师:白松林 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值