目录
三、国产数据库实例——以达梦数据库为例
3-1达梦数据库 - 表空间管理
第1关:表空间管理
3-2达梦数据库 - 模式管理
第1关:模式管理
3-3达梦数据库 - 表管理
第1关:表管理
3-4达梦数据库-数据查询
第1关:简单查询
-- 请在此编写sql语句
---------- Begin ----------
select * from stock.total;
---------- End ----------
-- 请勿删除下面语句
exit
第2关:条件查询
-- 请在此编写sql语句
---------- Begin ----------
SELECT
stu_id,
stu_name,
sex,
birth,
department,
addr
FROM
test.student
WHERE
addr LIKE '河北省%' OR addr LIKE '安徽省%';
---------- End ----------
-- 请勿删除下面语句
exit
第3关:列运算与别名查询
-- 请在此编写sql语句
---------- Begin ----------
SELECT
stu_name,
2022 - CAST(birth AS INTEGER) AS age
FROM
test.student;
---------- End ----------
-- 请勿删除下面语句
exit
第4关:函数查询
-- 请在此编写sql语句
---------- Begin ----------
SELECT
stu_name,
2021 - CAST(birth AS INTEGER) AS age,
SUBSTR(addr, 1, 3) AS province
FROM
test.student
WHERE
addr LIKE '河北省%';
---------- End ----------
-- 请勿删除下面语句
exit
3-5达梦数据库 - 表数据操作
第1关:表数据操作
-- 请在此编写sql语句
---------- Begin ----------
-- 插入数据
insert into test.tb_salary(id,language,salary) values(6,'C++',9000);
-- 修改数据
UPDATE test.tb_salary SET salary=salary+500 where language='Java';
-- 删除数据
DELETE FROM test.tb_salary where id=4;
commit;
---------- End ----------
-- 请勿删除下面语句
exit
3-6达梦数据库 - 分区交换
第1关:分区交换
-- 请在此编写代码
----------Begin----------
CREATE TABLE test.t_partitiontab (
id INT,
name VARCHAR(20)
) PARTITION BY RANGE (id) (
-- 分区 p1 存储 id 小于 201 的数据
PARTITION p1 VALUES LESS THAN (201),
-- 分区 p2 存储 id 大于等于 201 且小于 401 的数据
PARTITION p2 VALUES LESS THAN (401),
-- 分区 p3 存储 id 大于等于 401 且小于 601 的数据
PARTITION p3 VALUES LESS THAN (601),
-- 分区 p4 存储 id 大于等于 601 且小于 801 的数据
PARTITION p4 VALUES LESS THAN (801),
-- 分区 p5 存储 id 大于等于 801 的数据
PARTITION p5 VALUES LESS THAN (MAXVALUE)
);
-- 插入 1 - 1000 的测试数据
INSERT INTO test.t_partitiontab (id, name)
SELECT LEVEL, 'test_name'
FROM DUAL
CONNECT BY LEVEL <= 1000;
-- 提交插入操作
COMMIT;
-- 查询每个分区的数据行数
SELECT
ROW_NUMBER() OVER (ORDER BY PARTITION_NAME) AS 行号,
PARTITION_NAME,
NUM_ROWS AS NUM
FROM
DBA_TAB_PARTITIONS
WHERE
TABLE_NAME = 'T_PARTITIONTAB' AND OWNER = 'TEST';
----------End----------
/
commit
/
exit
3-7达梦数据库 - 视图管理
第1关:视图管理
-- 请在此编写sql语句
---------- Begin ----------
-- 1.创建视图
CREATE VIEW test.salary_view AS SELECT * FROM test.tb_salary WHERE language = 'Python';
-- 2.删除视图
DROP VIEW test.view_salary;
---------- End ----------
-- 请勿删除下面语句
exit
3-8达梦数据库 - 索引管理
第1关:索引管理
-- 请在此编写sql语句
---------- Begin ----------
-- 1.创建索引
CREATE UNIQUE INDEX test.index2 ON test.total(tradedate, tradetime);
-- 2.删除索引
DROP INDEX test.index1;
---------- End ----------
/
commit
/
-- 请勿删除下面语句
exit
3-9达梦数据库 - 序列管理
第1关:序列管理
-- 请在此编写sql语句
---------- Begin ----------
-- 1.创建序列
CREATE SEQUENCE test.my_seq START WITH 10 INCREMENT BY 2 ORDER;
---------- End ----------
insert into test.tb_salary(id,language,salary)
values(test.my_seq.NEXTVAL,'Java',8000),
(test.my_seq.NEXTVAL,'Java',8400),
(test.my_seq.NEXTVAL,'Java',9000),
(test.my_seq.NEXTVAL,'Python',6500),
(test.my_seq.NEXTVAL,'Python',10000);
-- 2.删除序列
---------- Begin ----------
DROP SEQUENCE test.my_seq;
---------- End ----------
-- 请勿删除下面语句
exit
3-10达梦数据库 - 同义词管理
第1关:同义词管理
-- 请在此编写sql语句
---------- Begin ----------
-- 1.创建同义词
CREATE SYNONYM FOR test.tb_class '班级' ;
-- 2.删除同义词
DROP PUBLIC SYNONYM '学生';
---------- End ----------
-- 请勿删除下面语句
exit
3-11达梦数据库 - 数据库安全
第1关:用户管理
-- 请在此编写sql语句
---------- Begin ----------
-- 1.创建用户
CREATE USER user1 IDENTIFIED BY abcabcabc ;
-- 2.修改用户
ALTER USER user2 IDENTIFIED BY a88888888;
---------- End ----------
-- 请勿删除下面语句
exit
这里老是错,花了500金币发现我的答案和参考答案一样,真的是醉了。浪费了我500金币!!!
第2关:权限管理
-- 请在此编写sql语句
---------- Begin ----------
-- 1.给用户授权查询权限
GRANT SELECT ON test.total TO user1;
-- 2.收回用户权限
REVOKE INSERT ANY TABLE FROM user2;
---------- End ----------
-- 请勿删除下面语句
exit
四、关系型数据库实战——以MySQL为例
4-1MySQL数据库 - 初识MySQL
第1关:创建数据库
----##连接数据库##----
mysql -uroot -p123123
----##创建数据库##----
create database MyDb;
第2关:创建表
create table t_emp(
id INT comment'员工编号',
name VARCHAR(32) comment'员工名称',
deptId INT comment'所在部门标号',
salary FLOAT comment'工资');
第3关:添加主键约束
----##创建数据库###----
create database TestDb;
----##创建表##----
create table t_user1(
userId INT comment'用户ID',
name VARCHAR(32) comment'用户名',
password VARCHAR(11) comment'密码',
phone VARCHAR(11) comment'电话号码',
email VARCHAR(32) comment'邮箱',
PRIMARY KEY(userId));
create table t_user2(
name VARCHAR(32) comment'用户名',
phone VARCHAR(11) comment'电话号码',
email VARCHAR(32) comment'邮箱',
PRIMARY KEY(name,phone));
第4关:添加外键约束
create table t_class(
id INT PRIMARY KEY comment'班级Id',
name VARCHAR(22) comment'班级名称');
create table t_student(
id INT comment'学号',
name VARCHAR(22) comment'学生姓名',
classId INT comment'班级ID',
CONSTRAINT fk_stu_class1 FOREIGN KEY(classId) REFERENCES t_class(id)
);
第5关:添加常用约束
----##使用 MyDb 数据库##---
USE MyDb;
----##创建表##----
CREATE TABLE t_user (
id INT PRIMARY KEY AUTO_INCREMENT COMMENT '用户 ID',
username VARCHAR(32) UNIQUE NOT NULL COMMENT '用户名',
sex VARCHAR(4) DEFAULT '男' COMMENT '性别'
) DEFAULT CHARSET = utf8;
----##显示表结构,模拟预期输出##----
SHOW COLUMNS FROM t_user;
此处的代码我的运行结果与预期结果相同,但是未通过,不知道是什么原因
第6关:视图
use School;
#请在此处添加实现代码
########## Begin ##########
#1.创建单表视图
CREATE VIEW stu_view AS
SELECT
math,
chinese,
math + chinese AS 'math+chinese'
FROM
student;
#2.创建多表视图
CREATE VIEW stu_classes AS
SELECT
s.stu_id,
s.name,
si.classes
FROM
student s
JOIN
stu_info si ON s.stu_id = si.stu_id;
########## End ##########
第7关:创建索引(单列索引)
USE Students;
#请在此处添加实现代码
########## Begin ##########
-- 1. 创建 student 表结构并且设置 id 为主键索引
CREATE TABLE `student` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(20) NOT NULL,
`score` int(11), -- 添加 score 字段
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;
-- 2. 对 name 建立唯一索引
CREATE UNIQUE INDEX name_index ON `student`(`name`);
-- 3. 对 score 建立普通索引
CREATE INDEX score_index ON `student`(`score`);
-- 显示表的索引信息
SHOW INDEX FROM student;
########## End ##########
此处的代码我的运行结果与预期结果相同,但是未通过,不知道是什么原因
第8关:创建索引(组合索引)
USE Person;
#请在此处添加实现代码
########## Begin ##########
#1.增加组合索引
CREATE INDEX name_city_score ON person(name, age, address);
########## End ##########
SHOW INDEX FROM person;
4-2MySQL数据库 -修改数据库
第1关:查看表结构与修改表名
USE Company;
#请在此处添加实现代码
########## Begin ##########
########## modify the table name ##########
ALTER TABLE tb_emp RENAME TO jd_emp;
########## show tables in this database ##########
SHOW TABLES;
########## describe the table ##########
DESCRIBE jd_emp;
########## End ##########
第2关:修改字段名与字段数据类型
USE Company;
#请在此处添加实现代码
########## Begin ##########
########## change the column name ##########
ALTER TABLE tb_emp CHANGE Id prod_id INT(11);
########## change the data type of column ##########
ALTER TABLE tb_emp MODIFY Name varchar(30);
########## End ##########
DESCRIBE tb_emp;
第3关:添加与删除字段
USE Company;
#请在此处添加实现代码
########## Begin ##########
########## add the column ##########
ALTER TABLE tb_emp ADD Country varchar(20) AFTER Name;
########## delete the column ##########
ALTER TABLE tb_emp DROP Salary;
########## End ##########
DESCRIBE tb_emp;
第4关:修改字段的排列位置
USE Company;
#请在此处添加实现代码
########## Begin ##########
-- 将 Name 列修改为 VARCHAR(25) 类型并移动到第一列
ALTER TABLE tb_emp MODIFY COLUMN Name VARCHAR(25) FIRST;
-- 将 DeptId 列修改为 INT(11) 类型并移动到 Salary 列之后
ALTER TABLE tb_emp MODIFY COLUMN DeptId INT(11) AFTER Salary;
########## End ##########
-- 查看表结构
DESCRIBE tb_emp;
第5关:删除表的外键约束
USE Company;
#请在此处添加实现代码
########## Begin ##########
########## delete the foreign key ##########
ALTER TABLE tb_emp DROP FOREIGN KEY emp_dept;
########## End ##########
SHOW CREATE TABLE tb_emp \G;
4-3MySQL数据库 - 插入、更新、删除数据
第1关:插入数据
USE Company;
#请在此处添加实现代码
########## Begin ##########
########## bundle insert the value ##########
INSERT INTO tb_emp (Id, Name, DeptId, Salary)
VALUES
(1, 'Nancy', 301, 2300.00),
(2, 'Tod', 303, 5600.00),
(3, 'Carly', 301, 3200.00);
########## End ##########
SELECT * FROM tb_emp;
第2关:更新数据
USE Company;
#请在此处添加实现代码
########## Begin ##########
########## update the value ##########
UPDATE tb_emp
SET
Name = 'Tracy', DeptId = 302, Salary = 4300.00
WHERE
Name = 'Carly';
########## End ##########
SELECT * FROM tb_emp;
第3关:删除数据
USE Company;
#请在此处添加实现代码
########## Begin ##########
########## delete the value ##########
DELETE FROM tb_emp WHERE Salary > 3000;
########## End ##########
SELECT * FROM tb_emp;
4-4MySQL数据库 - 单表查询
第1关:基本查询语句
USE Company;
#请在此处添加实现代码
########## Begin ##########
########## retrieving the Name and Salary ##########
SELECT Name, Salary FROM tb_emp;
########## retrieving all the table ##########
SELECT * FROM tb_emp;
########## End ##########
第2关:带 IN 关键字的查询
USE Company;
#请在此处添加实现代码
########## Begin ##########
########## retrieving the Name and Salary with IN statement ##########
SELECT Name, Salary FROM tb_emp WHERE Id != 1;
########## End ##########
第3关:带 BETWEEN AND 的范围查询
USE Company;
#请在此处添加实现代码
########## Begin ##########
########## retrieving the Name and Salary with BETWEEN AND statement ##########
SELECT Name, Salary FROM tb_emp WHERE Salary BETWEEN 3000 AND 5000;
########## End ##########
第4关:带 LIKE 的字符匹配查询
USE Company;
######### Begin #########
SELECT Name, Salary FROM tb_emp WHERE Name LIKE 'C%';
######### End #########
第5关:查询空值与去除重复结果
USE Company;
######### Begin #########
SELECT * FROM tb_emp WHERE DeptId IS NULL;
######### End #########
######### Begin #########
SELECT DISTINCT Name FROM tb_emp;
######### End #########
第6关:带 AND 与 OR 的多条件查询
USE Company;
######### Begin #########
SELECT * FROM tb_emp WHERE DeptId = 301 AND Salary > 3000;
######### End #########
######### Begin #########
SELECT * FROM tb_emp WHERE DeptId IN (301, 303);
######### End #########
第7关:使用 LIMIT 限制查询结果的数量
USE School;
#请在此处添加实现代码
########## Begin ##########
########## 查询班级中第2名到第5名的学生信息 ##########
SELECT *
FROM tb_score
ORDER BY score DESC
LIMIT 1, 4;
########## End ##########
4-5MySQL数据库 - 连接查询和子查询
第1关:内连接查询
USE School;
########## 查询数据表中学生姓名和对应的班级 ##########
#请在此处添加实现代码
########## Begin ##########
SELECT
s.name AS studentName,
c.name AS className
FROM
tb_student s
JOIN
tb_class c ON s.class_id = c.id
WHERE
s.class_id IS NOT NULL;
########## End ##########
第2关:外连接查询
USE School;
########## 使用左外连接查询所有学生姓名和对应的班级 ##########
#请在此处添加实现代码
########## Begin ##########
SELECT
s.name AS studentName,
c.name AS className
FROM
tb_student s
LEFT JOIN
tb_class c ON s.class_id = c.id;
########## End ##########
########## 使用右外连接查询所有学生姓名和对应的班级 ##########
#请在此处添加实现代码
########## Begin ##########
SELECT
s.name AS studentName,
c.name AS className
FROM
tb_student s
RIGHT JOIN
tb_class c ON s.class_id = c.id;
########## End ##########
第3关:关键字子查询
USE Company;
#请在此处添加实现代码
########## Begin ##########
#1.使用 ALL 关键字进行查询
SELECT position, salary
FROM tb_salary
WHERE
salary > (
SELECT MAX(salary)
FROM tb_salary
WHERE position = 'Java'
);
#2.使用 ANY 关键字进行查询
SELECT position, salary
FROM tb_salary
WHERE
salary > (
SELECT MIN(salary)
FROM tb_salary
WHERE position = 'Java'
);
#3.使用 IN 关键字进行查询
SELECT position, salary
FROM tb_salary
WHERE
position = 'Java';
########## End ##########
第4关:分页子查询
USE Products;
#请在此处添加实现代码
########## Begin ##########
#1.分页查询
SELECT prod_id
FROM products
ORDER BY prod_id
LIMIT 5 OFFSET 5;
#2.用子查询优化分页查询语句
SELECT prod_id
FROM (
SELECT prod_id
FROM products
ORDER BY prod_id
) AS subquery
LIMIT 5 OFFSET 10;
########## End ##########
4-6MySQL数据库 - 使用聚合函数查询
第1关:COUNT( )函数
USE School;
#请在此处添加实现代码
########## Begin ##########
########## 查询该表中一共有多少条数据 ##########
select count(*) from tb_class;
########## 查询此表中367班有多少位学生 ##########
select classid ,count(id) as 'count(*)'
from tb_class
where classid=367;
########## End ##########
第2关:SUM( )函数
USE School;
#请在此处添加实现代码
########## Begin ##########
########## 查询所有学生总分数 ##########
select sum(score) from tb_class;
########## 查询学生语文科目的总分数 ##########
select course,sum(score) as 'sum(score)'
from tb_class
where course='语文';
########## End ##########
第3关:AVG( )函数
USE School;
#请在此处添加实现代码
########## Begin ##########
########## 查询学生语文科目的平均分数 ##########
SELECT
'语文' AS course,
AVG(score) AS `avg(score)`
FROM
tb_class
WHERE
course = '语文';
########## 查询学生英语科目的平均分数 ##########
SELECT
'英语' AS course,
AVG(score) AS `avg(score)`
FROM
tb_class
WHERE
course = '英语';
########## End ##########
第4关:MAX( )函数
USE School;
#请在此处添加实现代码
########## Begin ##########
########## 查询语文课程中的最高分数 ##########
SELECT
'语文' AS course,
MAX(score) AS `max(score)`
FROM
tb_class
WHERE
course = '语文';
########## 查询英语课程中的最高分数 ##########
SELECT
'英语' AS course,
MAX(score) AS `max(score)`
FROM
tb_class
WHERE
course = '英语';
########## End ##########
第5关:MIN( )函数
USE School;
#请在此处添加实现代码
########## Begin ##########
########## 查询语文课程中的最低分数 ##########
SELECT
'语文' AS course,
MIN(score) AS `min(score)`
FROM
tb_class
WHERE
course = '语文';
########## 查询英语课程中的最低分数 ##########
SELECT
'英语' AS course,
MIN(score) AS `min(score)`
FROM
tb_class
WHERE
course = '英语';
########## End ##########
4-7MySQL数据库 - 其他函数的使用
第1关:字符函数
#请在此添加实现代码
########## Begin ##########
-- 假设表名为 employee
SELECT
CONCAT(UPPER(LEFT(Name, 1)),
LOWER(SUBSTRING(Name, 2))) AS Name
FROM
employee;
########## End ##########
第2关:数学函数
--#请在此添加实现代码
--########## Begin ##########
update Score set s_score=TRUNCATE(s_score - ROUND(SQRT((POWER(4,4)-POWER(3,3))/POWER(2,2)),2),2);
--########## End ##########
第3关:日期时间函数和流程控制类函数
#请在此添加实现代码
--########## Begin ##########
-- 查询所有学生的出生年份及至2019-01-01时的年龄
select year(s_birth) as year,(2021-01-01)-year(s_birth) as '年龄' from Student;
-- 查询所有课程中的最高分、最低分、平均分和及格率,按课程id升序输出
SELECT
s.c_id AS `课程id`,
c.c_name AS `课程名`,
MAX(s.s_score) AS `最高分`,
MIN(s.s_score) AS `最低分`,
ROUND(AVG(s.s_score), 2) AS `平均分`,
ROUND(SUM(CASE WHEN s.s_score >= 60 THEN 1 ELSE 0 END) / COUNT(s.s_score) * 100, 2) AS `及格率`
FROM
Score s
JOIN
Course c ON s.c_id = c.c_id
GROUP BY
s.c_id, c.c_name
ORDER BY
s.c_id ASC;
--########## End ##########
第4关:自定义函数
#请在此添加实现代码
########## Begin ##########
create function fn_three_max(param_1 int,param_2 int, param_3 int)returns int
return 999;
########## End ##########
4-8MySQL数据库 - 分组选择数据
第1关:对查询结果进行排序
USE School;
#请在此处添加实现代码
########## Begin #########
####查询1班同学的所有信息以成绩降序的方式显示结果 ####
SELECT * FROM tb_score
WHERE class_id=1
ORDER BY score DESC;
########## End ##########
第2关:分组查询
USE School;
#请在此处添加实现代码
########## Begin ##########
########## 对班级名称进行分组查询 ##########
SELECT * FROM tb_class GROUP BY class_id;
########## End ##########
第3关:GROUP BY 与 聚合函数
USE School;
#请在此处添加实现代码
########## Begin ##########
#1.查询表中2,3,4年级中分别男女的总人数
SELECT
gradeId,
sex,
COUNT(stuId) AS `count(*)`
FROM
student
WHERE
gradeId IN (2, 3, 4)
GROUP BY
gradeId, sex
ORDER BY
gradeId, sex;
########## End ##########
第4关:使用 HAVING 与 ORDER BY
USE School;
#请在此处添加实现代码
########## Begin ##########
#1.查询表中至少有两门课程在90分以上的学生信息
SELECT
sno,
COUNT(*) AS `count(*)`
FROM
tb_grade
WHERE
score >= 90
GROUP BY
sno
HAVING
COUNT(*) >= 2;
#2.查询表中平均成绩大于90分且语文课在95分以上的学生信息
########## End ##########
SELECT
tg.sno,
ROUND(AVG(tg.score), 4) AS `avg(score)`
FROM
tb_grade tg
JOIN (
-- 子查询筛选出语文成绩大于等于 95 分的学生学号
SELECT
sno
FROM
tb_grade
WHERE
pno = '语文' AND score >= 95
) qualified_students ON tg.sno = qualified_students.sno
GROUP BY
tg.sno
HAVING
AVG(tg.score) >= 90;
4-9MySQL数据库 - 复杂查询
第1关:分数排名
#请在此添加实现代码
########## Begin ##########
-- 情况一:平分后的下一个名次是下一个连续的整数值,名次之间无“间隔”
-- 创建一个临时表,将分数去重并按降序排序
SELECT
s1.Score,
(
-- 子查询统计大于等于当前分数的去重后的分数数量,即为排名
SELECT COUNT(DISTINCT s2.Score)
FROM score s2
WHERE s2.Score >= s1.Score
) AS `Rank`
FROM
score s1
GROUP BY
s1.Score, s1.Id
ORDER BY
s1.Score DESC;
-- 情况二:排名是非连续的
-- 创建一个临时表,将分数去重并按降序排序
SELECT
s1.Score,
(
-- 子查询统计大于当前分数的分数数量加 1,即为排名
SELECT COUNT(*) + 1
FROM score s2
WHERE s2.Score > s1.Score
) AS `Rank`
FROM
score s1
GROUP BY
s1.Score, s1.Id
ORDER BY
s1.Score DESC;
########## End ##########
第2关:体育馆的人流量
#请在此添加实现代码
--########## Begin ##########
SELECT
id,
`date`,
visitors_flow
FROM (
SELECT
id,
`date`,
visitors_flow,
id - (SELECT COUNT(*) FROM gymnasium g2 WHERE g2.id <= g1.id AND g2.visitors_flow >= 100) AS grp
FROM
gymnasium g1
WHERE
g1.visitors_flow >= 100
) subquery
WHERE
grp IN (
SELECT
grp
FROM (
SELECT
id - (SELECT COUNT(*) FROM gymnasium g2 WHERE g2.id <= g1.id AND g2.visitors_flow >= 100) AS grp
FROM
gymnasium g1
WHERE
g1.visitors_flow >= 100
) inner_subquery
GROUP BY
grp
HAVING
COUNT(*) >= 3
)
ORDER BY
id;
--########## End ##########
第3关:统计总成绩
#请在此添加实现代码
########## Begin ##########
SELECT
tc.classname,
SUM(CASE WHEN ts.chinese >= 60 THEN ts.chinese ELSE 0 END) AS chinese,
SUM(CASE WHEN ts.maths >= 60 THEN ts.maths ELSE 0 END) AS maths
FROM
tb_score ts
JOIN
tb_class tc ON ts.name = tc.stuname
GROUP BY
tc.classname
ORDER BY
tc.classname;
########## End ##########
第4关:查询学生平均分
#请在此添加实现代码
########## Begin ##########
SELECT
s.s_id,
s.s_name,
ROUND(IFNULL(AVG(sc.s_score), 0), 2) AS avg_score
FROM
student s
LEFT JOIN
score sc ON s.s_id = sc.s_id
GROUP BY
s.s_id, s.s_name
HAVING
ROUND(IFNULL(AVG(sc.s_score), 0), 2) < 60;
########## End ##########
第5关:查询修课相同学生信息
#请在此添加实现代码
########## Begin ##########
-- 子查询找出 s_id = 01 学习的课程数量
SELECT
s.s_id,
s.s_name,
s.s_sex
FROM
student s
JOIN (
-- 对每个学生学习的课程进行分组统计
SELECT
sc.s_id,
GROUP_CONCAT(sc.c_id ORDER BY sc.c_id) AS course_list,
COUNT(DISTINCT sc.c_id) AS course_count
FROM
score sc
GROUP BY
sc.s_id
) student_course_summary ON s.s_id = student_course_summary.s_id
-- 筛选出学习课程数量和课程集合都与 s_id = 01 相同的学生
WHERE
student_course_summary.course_count = (
SELECT COUNT(DISTINCT c_id)
FROM score
WHERE s_id = '01'
)
AND student_course_summary.course_list = (
SELECT GROUP_CONCAT(c_id ORDER BY c_id)
FROM score
WHERE s_id = '01'
)
AND s.s_id != '01';
########## End ##########
第6关:查询各科成绩并排序
#请在此添加实现代码
########## Begin ##########
select a.* ,count(b.s_score)+1 rank from score a left join score b
on a.c_id = b.c_id and a.s_score < b.s_score
group by a.c_id,a.s_id
order by a.c_id,count(b.s_score);
########## End ##########
第7关:查询张老师课程成绩最高的学生信息
--#请在此添加实现代码
--########## Begin ##########
-- 查询选修“张三”老师所授课程且成绩最高的学生信息及其成绩
SELECT
s.s_id,
s.s_name,
s.s_sex,
sc.s_score,
c.c_id,
c.c_name
FROM
student s
JOIN
score sc ON s.s_id = sc.s_id
JOIN
course c ON sc.c_id = c.c_id
JOIN
teacher t ON c.t_id = t.t_id
WHERE
t.t_name = '张三'
AND sc.s_score = (
SELECT
MAX(s_score)
FROM
score sc2
JOIN
course c2 ON sc2.c_id = c2.c_id
JOIN
teacher t2 ON c2.t_id = t2.t_id
WHERE
t2.t_name = '张三'
);
--########## End ##########
第8关:查询两门课程不及格同学信息
--#请在此添加实现代码
--########## Begin ##########
-- 查询两门及其以上不及格课程的同学的学号、姓名及其平均成绩
SELECT
s.s_id,
s.s_name,
ROUND(AVG(sc.s_score)) AS avg_score
FROM
student s
JOIN
score sc ON s.s_id = sc.s_id
GROUP BY
s.s_id, s.s_name
HAVING
SUM(CASE WHEN sc.s_score < 60 THEN 1 ELSE 0 END) >= 2;
--########## End ##########
第9关:交换工资
--#请在此添加实现代码
--########## Begin ##########
UPDATE tb_Salary
SET sex =
case
when sex='f' then 'm'
ELSE 'f'
END;
--########## End ##########
第10关:换座位
--#请在此添加实现代码
--########## Begin ##########
SELECT
-- 对于座位号为偶数的学生,将其座位号减 1
CASE
WHEN id % 2 = 0 THEN id - 1
-- 对于座位号为奇数且不是最后一个座位的学生,将其座位号加 1
WHEN id % 2 = 1 AND id < (SELECT MAX(id) FROM tb_Seat) THEN id + 1
-- 对于座位号为奇数且是最后一个座位的学生,保持座位号不变
ELSE id
END AS id,
name
FROM
tb_Seat
ORDER BY
id;
--########## End ##########