创建YGGL数据库并在YGGL数据库创建三个表:employees,salary,departments。
创建XSCJ数据库并在XSCJ数据库创建三个表:XS,KC,XS_KC。
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;
CREATE TABLE salary (
员工编号 char(6) NOT NULL,
收入 float(8,2) NOT NULL,
支出 float(8,2) NOT NULL,
PRIMARY KEY (员工编号)
) ENGINE=InnoDB;
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;
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;
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;
select avg(收入) as 员工平均收入 from salary;
select sum(支出) as 员工的总支出 from salary;
select 姓名,地址,电话号码 from employees where 性别='0';
select count(*) as 员工总人数 from employees;
select max(收入) as 最高收入,min(收入) as 最低收入 from salary;
8.对YGGL数据库进行条件查询。
(1)显示月收入高于2000元的员工的员工号。
select 员工编号,收入 from salary where 收入>=2000;
select 姓名,地址,出生日期 from employees where 出生日期>='1970';
(3)显示工作年限三年以上(含3年)、学历在本科以上(含本科)的男性员工的信息。
select 姓名,性别,工作年限,学历 from employees where 性别='1' and 工作年限>=3 and 学历='本科';
(4)查找员工号中倒数第二个数字为0的员工的姓名、地址和学历。
select 员工编号,姓名,地址,学历 from employees where 员工编号 like '%0_';
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 姓名='王林';
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 性别;
select 部门名称,count(*) as 员工人数 from departments join employees on(employees.员工部门号=departments.部门编号) group by 部门名称 having count(*)>2;
select 学历,count(*) from employees group by 学历;
(5)将员工信息按出生日期从大到小排序。
select * from employees order by 出生日期 desc;
select 姓名,收入 from employees join salary on(employees.员工编号=salary.员工编号) order by 收入;
(7)按员工的工作年限进行分组,统计各个工作年限的人数,并按人数从小到大排序。
select 工作年限,count(*) from employees group by 工作年限 order by count(*);
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;
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;
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;
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';
select distinct 专业名,总学分 from XS;
select count(*) as 总人数 from XS;
select count(*) as 备注不为空的人数 from XS where 备注 is not null;
select count(*) as 总学分在50以上的人数 from XS where 总学分>=50;
select 课程号,max(成绩) as 最高成绩,min(成绩) as 最低成绩 from XS_KC join XS on(XS.学号=XS_KC.学号) where 课程号='101';
select 学号,sum(成绩) as 总成绩 from XS_KC where 学号='081101';
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;
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_';
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 专业名='无线电';
select * from xs where 总学分 is null;
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);
select distinct 课程名 as 选过的课程名 from kc join xs_kc using(课程号);
(28)查找所有学生情况及他们选修的课程号,若学生未选修任何课,也要包括其情况。
select * from xs left outer join XS_KC on(xs.学号=XS_KC.学号);
select * from kc left join xs_KC on(kc.课程号=xs_kc.课程号);
(30)查找在xscj数据库中选修了课程号206的课程的学生的姓名、学号。
select 姓名,学号 from xs_kc join xs using(学号) where 课程号='206';
select 姓名,学号,专业名 from xs where 学号 not in(select 学号 from XS_KC where 课程号 in(select 课程号 from KC where 课程名='离散数学'));
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');
select 姓名 from xs join XS_KC using(学号) where 课程号='206';
select 专业名 from xs;
select 专业名,count(*) as 各专业学生数 from xs group by 专业名;
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;
select 专业名,出生时间 from xs where 专业名='通信工程' order by 出生时间;
(43)将计算机专业学生的“计算机基础”课程成绩按降序排列。
select 课程名,成绩 from kc join XS_kc using(课程号) where 课程名='计算机基础' order by 成绩 desc;
select 学号,姓名,专业名 from xs where 专业名='计算机' order by(select avg(成绩) from XS_KC group by XS_KC.学号 having xs.学号=XS_KC.学号);
select * from xs order by 学号 limit 5;
select * from xs order by 学号 limit 3,5;