列出来的答案都是在头歌平台上编译通过的,大家有需要可以参考一下
目录
MySql数据库
数据库和表的基本操作(一)
第1关:查看表结构与修改表名
编程要求
根据提示,在右侧编辑器补充代码:
-
把数据表
tb_emp
改名为jd_emp
; -
查看该数据库下数据表的列表;
-
查看数据表
jd_emp
的基本结构。
USE Company;
#请在此处添加实现代码
########## Begin ##########
########## modify the table name ##########
ALTER TABLE tb_emp RENAME jd_emp;
########## show tables in this database ##########
show tables;
########## describe the table ##########
describe jd_emp;
########## End ##########
第2关:修改字段名与字段数据类型
编程要求
根据提示,在右侧编辑器补充代码:
-
把数据表
tb_emp
的字段Id
改名为prod_id
,数据类型不变; -
把数据表
tb_emp
字段Name
的数据类型改为varchar(30)
。
数据表结构如下:
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关:添加与删除字段
编程要求
根据提示,在右侧编辑器补充代码:
-
在数据表
tb_emp
的Name
字段后添加字段Country
,数据格式为varchar(20)
; -
删除数据表
tb_emp
中的字段Salary
。
数据表结构如下:
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关:修改字段的排列位置
编程要求
根据提示,在右侧编辑器补充代码:
-
将数据表
tb_emp
的Name
字段移至第一列,数据格式不变; -
将
DeptId
字段移至Salary
字段的后边,数据格式不变。
数据表结构如下:
USE Company;
#请在此处添加实现代码
########## Begin ##########
########## modify the column to top ##########
ALTER TABLE tb_emp MODIFY Name varchar(25) FIRST;
########## modify the column to the rear of another column ##########
ALTER TABLE tb_emp MODIFY DeptId int(11) AFTER Salary;
########## End ##########
DESCRIBE tb_emp;
第5关:删除表的外键约束
编程要求
我们已经为你建立了主表tb_dept
和子表tb_emp
,在表tb_emp
上添加了名称为emp_dept
的外键约束,外键名称为DeptId
,依赖于表tb_dept
的主键Id
,下面那是两张表的结构展示:
请你根据提示,在右侧编辑器Begin-End
中补充代码:
- 删除数据表
tb_emp
的外键约束emp_dept
。
USE Company;
#请在此处添加实现代码
########## Begin ##########
########## delete the foreign key ##########
ALTER TABLE tb_emp DROP FOREIGN KEY emp_dept;
########## End ##########
SHOW CREATE TABLE tb_emp \G;
数据库和表的基本操作(二)
第1关:插入数据
编程要求
根据提示,在右侧编辑器Begin-End
处补充代码:
-
我们为你新建了一个空数据表
tb_emp
,请你为它同时添加3
条数据内容; -
空数据表结构如下,注意
字段3
为DeptId
,倒数第二个字母为大写的i
:
- 需要你同时添加的数据内容为: (注意,是同时插入多条记录)
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关:更新数据
编程要求
根据提示,在右侧编辑器Begin-End
处补充代码:
-
我们为你新建了一个数据表
tb_emp
,并添加了3
条数据内容; -
3
条数据内容如下表所示:
- 请你将
Carly
改为Tracy
,相应的,301
改为302
,3200.00
改为4300.00
。
注意:字段3
为DeptId
,倒数第二个字母为大写的i
。
USE Company;
#请在此处添加实现代码
########## Begin ##########
########## update the value ##########
UPDATE tb_emp
SET Name="Tracy",DeptId=302,Salary=4300.00
WHERE id=3;
########## End ##########
SELECT * FROM tb_emp;
第3关:删除数据
编程要求
根据提示,在右侧编辑器Begin-End
处补充代码:
-
我们为你新建了一个数据表
tb_emp
,并添加了3
条数据内容; -
3
条数据内容如下表所示:
- 请你将
Salary
大于3000
的数据行删除。
USE Company;
#请在此处添加实现代码
########## Begin ##########
########## delete the value ##########
DELETE FROM tb_emp
WHERE Salary>3000;
########## End ##########
SELECT * FROM tb_emp;
MySQL数据库 - 单表查询(一)
第1关:基本查询语句
编程要求
根据提示,在右侧编辑器Begin-End
处补充代码:
我们为你新建了一个数据表tb_emp
,结构如下:
-
请你查询字段
Name
和Salary
的内容; -
请你查询整张表的内容。
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 关键字的查询
编程要求
根据提示,在右侧编辑器Begin-End
处补充代码:
我们为你新建了一个数据表tb_emp
,结构如下:
- 请你查询当
Id
不等于1
时,字段Name
和Salary
的内容;
USE Company;
#请在此处添加实现代码
########## Begin ##########
########## retrieving the Name and Salary with IN statement ##########
SELECT Name,Salary FROM tb_emp WHERE Id NOT IN (1);
########## End ##########
第3关:带 BETWEEN AND 的范围查询
编程要求
根据提示,在右侧编辑器Begin-End
处补充代码:
我们为你新建了一个数据表tb_emp
,结构如下:
- 请你查询当字段
Salary
范围在3000~5000
时,字段Name
和Salary
的内容。
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 ##########
MySQL数据库 - 单表查询(二)
第1关:带 LIKE 的字符匹配查询
编程要求
根据提示,在右侧编辑器Begin-End
处补充代码;
我们为你新建了一个数据表tb_emp
,结构如下:
- 请你查询所有
Name
以字母C
为起始的员工的Name
和Salary
的内容;
USE Company;
######### Begin #########
SELECT Name,Salary FROM tb_emp WHERE Name LIKE "C%";
######### End #########
第2关:查询空值与去除重复结果
编程要求
根据提示,在右侧编辑器Begin-End
处补充代码:
我们为你新建了一个数据表tb_emp
,内容如下:
-
使用关键字
IS NULL
返回数据表中字段DeptId
为NULL
的所有字段的内容,注意,返回的是指定行所有字段的内容; -
使用关键字
DISTINCT
返回数据表中字段Name
不重复的内容,注意,只需返回字段Name
的内容。USE Company; ######### Begin ######### SELECT * FROM tb_emp WHERE DeptId IS NULL; ######### End ######### ######### Begin ######### SELECT DISTINCT Name FROM tb_emp; ######### End #########
第3关:带 AND 与 OR 的多条件查询
编程要求
根据提示,在右侧编辑器Begin-End
处补充代码:
我们为你新建了一个数据表tb_emp
,内容如下:
结构如下:
-
使用关键字
AND
返回数据表中字段DeptId
为301
并且薪水
大于3000
的所有字段的内容,其中DeptId
的倒数第二个字母为i
的大写; -
使用关键字
IN
返回数据表中字段DeptId
为301
和303
的所有字段的内容。
USE Company;
######### Begin #########
SELECT * FROM tb_emp WHERE DeptId=301 AND Salary > 3000;
######### End #########
######### Begin #########
SELECT * FROM tb_emp WHERE DeptId=301 OR DeptId=303;
######### End #########
MySQL数据库 - 单表查询(三)
第1关:对查询结果进行排序
编程要求
在右侧编辑器Begin-End
处补充代码,查询学生成绩表中1
班同学的所有信息并以成绩降序的方式显示结果。
我们已经为你提供了学生成绩表: tb_score
表数据:
stu_id | class_id | name | score |
---|---|---|---|
1 | 2 | Jack | 81 |
2 | 1 | David | 74 |
3 | 1 | Mason | 92 |
4 | 2 | Ethan | 89 |
5 | 1 | Gina | 65 |
USE School;
#请在此处添加实现代码
########## Begin ##########
########## 查询1班同学的所有信息以成绩降序的方式显示结果 ##########
select * from tb_score where class_id = 1 order by score desc;
########## End ##########
第2关:分组查询
编程要求
在右侧编辑器Begin-End
处补充代码,对班级表中的班级名称进行分组查询。
我们已经为你提供了班级表信息: tb_class
表数据:
stu_id | class_id | name |
---|---|---|
1 | 367 | Jack |
2 | 366 | David |
3 | 366 | Mason |
4 | 367 | Ethan |
5 | 366 | Gina |
USE School;
#请在此处添加实现代码
########## Begin ##########
########## 对班级名称进行分组查询 ##########
SELECT * FROM tb_class GROUP BY class_id;
########## End ##########
第3关:使用 LIMIT 限制查询结果的数量
编程要求
在右侧编辑器Begin-End
处补充代码,查询班级中第2
名到第5
名的学生信息,并根据学生成绩进行降序排序。
我们已经为你提供了学生成绩表: tb_score
表数据:
id | name | score |
---|---|---|
1 | Jack | 89 |
2 | David | 73 |
3 | Mason | 62 |
4 | Ethan | 93 |
5 | Gina | 76 |
6 | Dorris | 98 |
7 | kain | 86 |
8 | Alice | 91 |
USE School;
#请在此处添加实现代码
########## Begin ##########
########## 查询班级中第2名到第5名的学生信息 ##########
SELECT * FROM tb_score order by score desc LIMIT 1,4;
########## End ##########
MySQL数据库 - 使用聚合函数查询
第1关:COUNT( )函数
编程要求
根据提示,在右侧编辑器Begin-End
处补充代码: 我们为你提供了一张tb_class
表,内容如下:
id | name | classid |
---|---|---|
1 | Emma | 366 |
2 | Mary | 367 |
3 | Allen | 367 |
4 | Kevin | 367 |
5 | Rose | 366 |
6 | James | 367 |
7 | Hale | 366 |
8 | David | 367 |
根据此表数据:
-
查询该表中一共有多少条数据;
-
查询此表中
367 班
有多少位学生,以班级id
和对应人数格式输出。
USE School;
#请在此处添加实现代码
########## Begin ##########
########## 查询该表中一共有多少条数据 ##########
select count(*) from tb_class;
########## 查询此表中367班有多少位学生 ##########
select classid,count(*) from tb_class where classid=367;
########## End ##########
第2关:SUM( )函数
编程要求
根据提示,在右侧编辑器Begin-End
处补充代码,我们为你提供了一张tb_class
表,内容如下:
id | name | course | score |
---|---|---|---|
1 | Emma | 语文 | 86 |
2 | Mary | 语文 | 79 |
3 | Allen | 语文 | 92 |
4 | Emma | 英语 | 116 |
5 | Mary | 英语 | 95 |
5 | Allen | 英语 | 100 |
根据此表数据:
-
查询该表中学生的总成绩;
-
查询学生
语文
课程的总分数。
USE School;
#请在此处添加实现代码
########## Begin ##########
########## 查询所有学生总分数 ##########
select sum(score) from tb_class;
########## 查询学生语文科目的总分数 ##########
select course,sum(score) from tb_class where course="语文";
########## End ##########
第3关:AVG( )函数
编程要求
根据提示,在右侧编辑器Begin-End
处补充代码,我们为你提供了一张tb_class
表,内容如下:
id | name | course | score |
---|---|---|---|
1 | Emma | 语文 | 86 |
2 | Mary | 语文 | 79 |
3 | Allen | 语文 | 92 |
4 | Emma | 英语 | 116 |
5 | Mary | 英语 | 95 |
5 | Allen | 英语 | 101 |
根据此表数据,查询表中该班级三位同学语文
和英语
课程的平均分数以及对应的课程名。
USE School;
#请在此处添加实现代码
########## Begin ##########
########## 查询学生语文科目的平均分数 ##########
select course,avg(score)from tb_class where course="语文";
########## 查询学生英语科目的平均分数 ##########
select course,avg(score) from tb_class where course="英语";
########## End ##########
第4关:MAX( )函数
编程要求
根据提示,在右侧编辑器Begin-End
处补充代码,我们为你提供了一张tb_class
表,内容如下:
id | name | course | score |
---|---|---|---|
1 | Emma | 语文 | 86 |
2 | Mary | 语文 | 79 |
3 | Allen | 语文 | 92 |
4 | Emma | 英语 | 116 |
5 | Mary | 英语 | 95 |
6 | Allen | 英语 | 100 |
根据此表数据,分别查询语文
和英语
课程中的最高分数。
USE School;
#请在此处添加实现代码
########## Begin ##########
########## 查询语文课程中的最高分数 ##########
select course,max(score) from tb_class where course="语文";
########## 查询英语课程中的最高分数 ##########
select course,max(score) from tb_class where course="英语";
########## End ##########
第5关:MIN( )函数
编程要求
根据提示,在右侧编辑器Begin-End
处补充代码,我们为你提供了一张tb_class
表,内容如下:
id | name | course | score |
---|---|---|---|
1 | Emma | 语文 | 86 |
2 | Mary | 语文 | 79 |
3 | Allen | 语文 | 92 |
4 | Emma | 英语 | 116 |
5 | Mary | 英语 | 95 |
5 | Allen | 英语 | 100 |
根据此表数据,分别查询语文
和英语
课程中的最低分数。
USE School;
#请在此处添加实现代码
########## Begin ##########
########## 查询语文课程中的最低分数 ##########
select course,min(score) from tb_class where course="语文";
########## 查询英语课程中的最低分数 ##########
select course,min(score) from tb_class where course="英语";
########## End ##########
MySQL数据库 - 连接查询
第1关:内连接查询
编程要求
在右侧编辑器补充代码,查询数据表中学生姓名以及对应的班级名称,将其对应的列名分别另命名为studentName
和className
。
我们为你提供了两张表,内容如下:
tb_student
表数据:
id | name | class_id |
---|---|---|
1 | Emma | 2 |
2 | Mary | 4 |
3 | Allen | (null) |
4 | Kevin | 1 |
5 | Rose | 2 |
6 | James | 1 |
tb_class
表数据:
id | name |
---|---|
1 | 软件1631 |
2 | 软件1632 |
3 | 测试1631 |
4 | 测试1632 |
USE School;
########## 查询数据表中学生姓名和对应的班级 ##########
#请在此处添加实现代码
########## Begin ##########
select tb_student.name as studentName,tb_class.name as className from tb_student
join tb_class on tb_class.id = tb_student.class_id;
########## End ##########
第2关:外连接查询
编程要求
在右侧编辑器补充代码,分别使用左外连接
和右外连接
查询数据表中所有学生姓名和对应的班级名称,查询结果列分别另命名为studentName
和className
。
我们为你提供了两张表,内容如下:
tb_student
表数据:
id | name | class_id |
---|---|---|
1 | Emma | 2 |
2 | Mary | 4 |
3 | Allen | (null) |
4 | Kevin | 1 |
5 | Rose | 2 |
6 | James | 1 |
tb_class
表数据:
id | name |
---|---|
1 | 软件1631 |
2 | 软件1632 |
3 | 测试1631 |
4 | 测试1632 |
注意:请使用 tb_student 作为左表,tb_class 作为右表。
USE School;
########## 使用左外连接查询所有学生姓名和对应的班级 ##########
#请在此处添加实现代码
########## Begin ##########
select tb_student.name as studentName,tb_class.name as className
from tb_class right join tb_student on
tb_class.id=tb_student.class_id;
########## End ##########
########## 使用右外连接查询所有学生姓名和对应的班级 ##########
select tb_student.name as studentName,tb_class.name as className
from tb_class left join tb_student
on tb_class.id=tb_student.class_id;
#请在此处添加实现代码
########## Begin ##########
########## End ##########
第3关:复合条件连接查询
编程要求
在右侧编辑器补充代码,查询所有班级里分数在90
分以上的学生的姓名和学生的成绩以及学生所在的班级,其中学生的姓名和学生所在班级分别另命名为studentName
和className
。
我们为你提供了两张表,内容如下:
tb_student
表数据:
id | name | class_id | score |
---|---|---|---|
1 | Emma | 2 | 89 |
2 | Mary | 4 | 92 |
4 | Kevin | 1 | 76 |
5 | Rose | 3 | 68 |
6 | James | 1 | 99 |
tb_class
表数据:
id | name |
---|---|
1 | 软件1631 |
2 | 软件1632 |
3 | 测试1631 |
4 | 测试1632 |
USE School;
########## 查询所有班级里分数在90分以上的学生的姓名和学生的成绩以及学生所在的班级 ##########
#请在此处添加实现代码
########## Begin ##########
select s1.name as studentName,score,
s2.name as className from tb_student as s1,
tb_class as s2
where s1.class_id=s2.id and s1.score>90
order by score desc;
########## End ##########
第2关:关键字子查询
编程要求
我们为你提供了如下数据表: tb_salary
表数据:
id | position | salary |
---|---|---|
1 | Java | 8000 |
2 | Java | 8400 |
3 | Java | 9000 |
4 | Python | 6500 |
5 | Python | 10000 |
根据提供的数据,在右侧编辑器中补充代码:
-
查询薪资表中比
Java
最高工资高的所有员工职位名称和薪资; -
查询薪资表中比
Java
最低工资高的所有员工职位名称和薪资; -
查询薪资表中职位为
Java
的所有员工职位名称和薪资。
USE Company;
#请在此处添加实现代码
########## Begin ##########
#1.使用 ALL 关键字进行查询
SELECT position,salary FROM tb_salary WHERE salary >
ANY(SELECT max(salary) FROM tb_salary where position="java");
#2.使用 ANY 关键字进行查询
SELECT position,salary FROM tb_salary WHERE salary >
ANY(SELECT min(salary) from tb_salary where position="java");
#3.使用 IN 关键字进行查询
select position,salary from tb_salary where position in("java");
########## End ##########
MySQL数据库 - 分组选择数据
第1关:GROUP BY 与 聚合函数
编程要求
在右侧编辑器补充代码,对年级Id
和性别进行分组,分别统计表中2、3、4
年级的男生总人数和女生总人数。
student
表数据结构如下:
stuId | gradeId | sex |
---|---|---|
0201 | 2 | 男 |
0221 | 2 | 男 |
0319 | 3 | 女 |
0508 | 5 | 男 |
0610 | 6 | 女 |
0101 | 1 | 男 |
0224 | 2 | 女 |
0413 | 4 | 女 |
要求输出结果显示如下:
USE School;
#请在此处添加实现代码
########## Begin ##########
#1.查询表中2,3,4年级中分别男女的总人数
select gradeId,sex,count(*)
from student where gradeId in (2,3,4)
group by gradeId,sex;
########## End ##########
第2关:使用 HAVING 与 ORDER BY
编程要求
根据提示,在右侧编辑器补充代码:
-
我们要评选三好学生,条件是至少有两门课程在
90
分以上(包括90分)才能有资格,请列出符合的学生的学号(sno
)及其90
分以上(包括90分)科目总数; -
学校评选先进学生,要求平均成绩大于
90
分(包括90分)的学生都有资格,并且语文课必须在95
分以上(包括95分),请列出有资格的学生的学号(sno
)及其科目的平均分。
给定数据表tb_grade
格式如下:
sno | pno | score |
---|---|---|
1 | 语文 | 95 |
1 | 数学 | 98 |
1 | 英语 | 90 |
2 | 语文 | 89 |
2 | 数学 | 91 |
2 | 英语 | 92 |
3 | 语文 | 85 |
3 | 数学 | 88 |
3 | 英语 | 96 |
4 | 语文 | 95 |
4 | 数学 | 89 |
4 | 英语 | 88 |
USE School;
#请在此处添加实现代码
########## Begin ##########
#1.查询表中至少有两门课程在90分以上的学生信息
select sno,count(*)from tb_grade
where score >=90
group by sno having count(pno) >= 2;
#2.查询表中平均成绩大于90分且语文课在95分以上的学生信息
select sno,avg(score) from tb_grade where sno
in(select sno from tb_grade where score >=95 and pno = "语文")
group by sno having avg(score) >=90;
########## End ##########
MySQL开发技巧 - 分页和索引
第1关:MySQL 分页查询
编程要求
根据提示,在右侧编辑器补充代码:
-
按
prod_id
升序查询表products
中第6-10
行数据,只要求prod_id
字段即可(prod_id
从1
开始); -
利用子查询优化查询出按
prod_id
升序的第10-15
行数据,只要求prod_id
字段即可。 数据表结构如下:
USE Products;
#请在此处添加实现代码
########## Begin ##########
#1.分页查询
select prod_id from products where prod_id >
(select prod_id from products limit 4,1) limit 5;
#2.用子查询优化分页查询语句
select prod_id from products where prod_id >
(select prod_id from products limit 9,1) limit 5;
########## End ##########
第2关:索引(单列索引)
编程要求
根据提示,在右侧编辑器创建如下student
表结构,并创建id
为主键索引,name
为唯一索引(索引名name_index
),score
为普通索引(索引名score_index
)。
student
结构如下:
字段名 | 类型、属性 |
---|---|
id | int(11) ,非空,自增长 |
name | varchar(20) , 非空 |
score | int(10) |
USE Students;
#请在此处添加实现代码
########## Begin ##########
#1.创建student表结构并且设置id为主键索引
CREATE TABLE student (
id int(11) NOT NULL AUTO_INCREMENT,
name varchar(20) NOT NULL,
score int(10),
PRIMARY KEY (id)
);
#2.对name建立唯一索引
CREATE UNIQUE INDEX name_index ON `student`(`name`);
#3.对score建立普通索引
CREATE INDEX score_index ON `student`(`score`);
SHOW INDEX FROM student;
########## End ##########
第3关:索引(组合索引)
编程要求
根据提示,在右侧编辑器补充 sql
代码。
有如下表person
,在name
、age
、address
上创建组合索引,索引名name_city_score
(无需建表,只增加组合索引即可)。
表person
结构如下所示:
字段 | 类型 |
---|---|
id | int(11) |
name | varchar(20) |
age | int |
address | varchar(30) |
USE Person;
#请在此处添加实现代码
########## Begin ##########
#1.增加组合索引
ALTER TABLE person ADD INDEX name_city_score (name,age,address);
########## End ##########
SHOW INDEX FROM person;
数据库设计 - 博客系统
第1关:数据库表设计 - 用户信息表
编程要求
请仔细阅读右侧代码,根据方法内的提示,在Begin - End
区域内进行代码补充,具体任务如下:
- 创建用户信息表,使用
blog_db
数据库,创建的表命名为t_user
。
#请在此添加实现代码
########## Begin ##########
#在blog_db库中创建t_user表
create table blog_db.t_user(
userId bigint NOT NULL AUTO_INCREMENT COMMENT '用户ID',
primary key (userId),
username varchar(32) NOT NULL COMMENT '用户名',
password varchar(32) NOT NULL COMMENT '密码',
user_sex varchar(6) NOT NULL DEFAULT '0' COMMENT '性别 0代表男 1代表女',
email varchar(64) DEFAULT NULL COMMENT '邮箱',
phone varchar(11) NOT NULL COMMENT '手机号码',
firstname varchar(6) DEFAULT NULL COMMENT '姓',
lastname varchar(12) DEFAULT NULL COMMENT '名',
avatar varchar(255) DEFAULT NULL COMMENT '头像地址',
is_superuser int NOT NULL DEFAULT '0' COMMENT '是否是管理员 0代表不是 1代表是',
last_login datetime DEFAULT NULL COMMENT '上一次登陆时间',
user_register_time datetime DEFAULT NULL COMMENT '用户注册时间'
);
########## End ##########
第2关:数据库表设计 - 核心表
编程要求
请仔细阅读右侧代码,根据方法内的提示,在Begin - End
区域内进行代码补充,具体任务如下:
-
创建博客类型(
blog_type
)、博客信息(t_blog
)、博客评论(t_comment
)这三张表,并根据设计图建立表与表之间的约束; -
博客类型表(
blog_type
); 创建博客类型表,字段和属性如下:
字段名称 | 类型 | 备注 | 约束 |
---|---|---|---|
type_id | int | 类型id | 主键,自动增长,增量为1 |
type_name | varchar(32) | 类型名称 | 非空 |
- 博客信息表(
t_blog
);
字段名称 | 类型 | 备注 | 约束 |
---|---|---|---|
blog_id | bigint | 博客id | 主键,自动增长 |
blog_title | varchar(100) | 博客标题 | 非空 |
blog_content | longtext | 博客内容 | 非空 |
userid | bigint | 创建人id | 外键 |
type_id | int | 类型ID | 外键 |
blog_status | int | 博客状态 1为发布 0为草稿 | 非空,默认为0 |
create_time | datetime | 创建时间 | 非空 |
update_time | datetime | 更新时间 | 非空 |
cover_image | varchar(255) | 封面图片 | 无 |
创建该表时,注意要添加外键约束,外键为userid
,外键名称设置为FK_user_id
,外键表为用户信息表(t_user
)。
另一个外键为type_id
,外键名称设置为FK_type_id
,外键表为博客类型表(blog_type
)。
- 新闻评论表(
t_comment
)。
字段名称 | 类型 | 备注 | 约束 |
---|---|---|---|
comment_id | bigint | 评论id | 主键,自动增长,增量为1 |
comment_content | varchar(500) | 评论内容 | 非空 |
blog_id | bigint | 评论内容 | 非空,外键 |
createtime | datetime | 评论时间 | 非空 |
userid | bigint | 评论人ID | 非空,外键 |
replyid | int | 评论回复人ID | 非空 |
创建该表时,注意要添加外键约束,外键为userid
,外键名称设置为FK_comment_user_id
,外键表为用户信息表(t_user
)。
另一个外键为blog_id
,外键名称设置为FK_comment_blog_id
,外键表为博客信息表(t_blog
)。
在blog_db
中创建这三张表(顺序不能变,即blog_type -> t_blog -> t_comment
),并添加相应约束。
use blog_db;
CREATE TABLE `t_user` (
`userId` bigint NOT NULL AUTO_INCREMENT COMMENT '用户ID',
`username` varchar(32) NOT NULL COMMENT '用户名',
`password` varchar(32) NOT NULL COMMENT '用户密码',
`user_sex` varchar(6) NOT NULL DEFAULT '0' COMMENT '用户性别',
`email` varchar(64) DEFAULT NULL COMMENT '用户邮箱',
`phone` varchar(11) NOT NULL COMMENT '手机号码',
`firstname` varchar(6) DEFAULT NULL COMMENT '姓',
`lastname` varchar(12) DEFAULT NULL COMMENT '名',
`avatar` varchar(255) DEFAULT NULL COMMENT '头像地址',
`is_superuser` int NOT NULL DEFAULT '0' COMMENT '是否是管理员 1代表 是 0代表不是',
`last_login` datetime DEFAULT NULL COMMENT '上一次登录时间',
`user_register_time` datetime DEFAULT NULL COMMENT '用户注册时间',
PRIMARY KEY (`userId`)
);
#请在此添加实现代码
########## Begin ##########
#创建blog_type、t_blog、t_comment表,并建立表之间的关系
CREATE TABLE `blog_type` (
`type_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '类型ID',
`type_name` varchar(32) NOT NULL COMMENT '类型名称',
PRIMARY KEY (`type_id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
CREATE TABLE `t_blog` (
`blog_id` bigint NOT NULL AUTO_INCREMENT COMMENT '博客ID',
`blog_title` varchar(100) NOT NULL COMMENT '博客标题',
`blog_content` longtext NOT NULL COMMENT '博客内容',
`userid` bigint DEFAULT NULL COMMENT '创建人ID',
`type_id` int(11) DEFAULT NULL COMMENT '类型ID',
`blog_status` int(11) NOT NULL DEFAULT '0' COMMENT '博客状态 1为发布 0为草稿',
`create_time` datetime NOT NULL COMMENT '创建时间',
`update_time` datetime NOT NULL COMMENT '更新时间',
`cover_image` varchar(255) DEFAULT NULL COMMENT '封面图片',
PRIMARY KEY (`blog_id`),
KEY `FK_type_id` (`type_id`),
KEY `FK_user_id` (`userid`),
CONSTRAINT `FK_type_id` FOREIGN KEY (`type_id`) REFERENCES `blog_type` (`type_id`),
CONSTRAINT `FK_user_id` FOREIGN KEY (`userid`) REFERENCES `t_user` (`userId`)
) ENGINE=InnoDB AUTO_INCREMENT=27 DEFAULT CHARSET=utf8;
CREATE TABLE `t_comment` (
`comment_id` bigint NOT NULL AUTO_INCREMENT COMMENT '评论id',
`comment_content` varchar(500) NOT NULL COMMENT '评论内容',
`blog_id` bigint NOT NULL COMMENT '博客ID',
`createtime` datetime NOT NULL COMMENT '评论时间',
`userid` bigint NOT NULL COMMENT '评论人ID',
`replyid` int(11) NOT NULL,
PRIMARY KEY (`comment_id`),
KEY `FK_comment_blog_id` (`blog_id`),
KEY `FK_comment_user_id` (`userid`),
CONSTRAINT `FK_comment_blog_id` FOREIGN KEY (`blog_id`) REFERENCES `t_blog` (`blog_id`),
CONSTRAINT `FK_comment_user_id` FOREIGN KEY (`userid`) REFERENCES `t_user` (`userId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
########## End ##########
第3关:数据库表设计 - 博客标签表
编程要求
请仔细阅读右侧代码,根据方法内的提示,在Begin - End
区域内进行代码补充,具体任务如下:
- 根据设计图,创建博客标签表(
t_tag
),以及中间表(t_tag_blog
),并建立表与表之间的联系。外键名分别为FK_blog_id
、FK_tag_id
。第一个外键对应的是博客信息表的的ID
,第二个外键对应的是标签表的ID
。
use blog_db;
CREATE TABLE `t_user` (
`userId` bigint NOT NULL AUTO_INCREMENT COMMENT '用户ID',
`username` varchar(32) NOT NULL COMMENT '用户名',
`password` varchar(32) NOT NULL COMMENT '用户密码',
`user_sex` varchar(6) NOT NULL DEFAULT '0' COMMENT '用户性别',
`email` varchar(64) DEFAULT NULL COMMENT '用户邮箱',
`phone` varchar(11) NOT NULL COMMENT '手机号码',
`firstname` varchar(6) DEFAULT NULL COMMENT '姓',
`lastname` varchar(12) DEFAULT NULL COMMENT '名',
`avatar` varchar(255) DEFAULT NULL COMMENT '头像地址',
`is_superuser` int NOT NULL DEFAULT '0' COMMENT '是否是管理员 1代表 是 0代表不是',
`last_login` datetime DEFAULT NULL COMMENT '上一次登录时间',
`user_register_time` datetime DEFAULT NULL COMMENT '用户注册时间',
PRIMARY KEY (`userId`)
);
CREATE TABLE `blog_type` (
`type_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '类型ID',
`type_name` varchar(32) NOT NULL COMMENT '类型名称',
PRIMARY KEY (`type_id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
CREATE TABLE `t_blog` (
`blog_id` bigint NOT NULL AUTO_INCREMENT COMMENT '博客ID',
`blog_title` varchar(100) NOT NULL COMMENT '博客标题',
`blog_content` longtext NOT NULL COMMENT '博客内容',
`userid` bigint DEFAULT NULL COMMENT '创建人ID',
`type_id` int(11) DEFAULT NULL COMMENT '类型ID',
`blog_status` int(11) NOT NULL DEFAULT '0' COMMENT '博客状态 1为发布 0为草稿',
`create_time` datetime NOT NULL COMMENT '创建时间',
`update_time` datetime NOT NULL COMMENT '更新时间',
`cover_image` varchar(255) DEFAULT NULL COMMENT '封面图片',
PRIMARY KEY (`blog_id`),
KEY `FK_type_id` (`type_id`),
KEY `FK_user_id` (`userid`),
CONSTRAINT `FK_type_id` FOREIGN KEY (`type_id`) REFERENCES `blog_type` (`type_id`),
CONSTRAINT `FK_user_id` FOREIGN KEY (`userid`) REFERENCES `t_user` (`userId`)
) ENGINE=InnoDB AUTO_INCREMENT=27 DEFAULT CHARSET=utf8;
CREATE TABLE `t_comment` (
`comment_id` bigint NOT NULL AUTO_INCREMENT COMMENT '评论id',
`comment_content` varchar(500) NOT NULL COMMENT '评论内容',
`blog_id` bigint NOT NULL COMMENT '博客ID',
`createtime` datetime NOT NULL COMMENT '评论时间',
`userid` bigint NOT NULL COMMENT '评论人ID',
`replyid` int(11) NOT NULL,
PRIMARY KEY (`comment_id`),
KEY `FK_comment_blog_id` (`blog_id`),
KEY `FK_comment_user_id` (`userid`),
CONSTRAINT `FK_comment_blog_id` FOREIGN KEY (`blog_id`) REFERENCES `t_blog` (`blog_id`),
CONSTRAINT `FK_comment_user_id` FOREIGN KEY (`userid`) REFERENCES `t_user` (`userId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
#请在此添加实现代码
########## Begin ##########
#创建博客标签表(t_tag),并建立表之间的关系
create table t_tag(
tag_id int primary key AUTO_INCREMENT,
tag_name varchar(32) not null
);
create table t_tag_blog(
tag_id int,
blog_id bigint,
constraint FK_blog_id foreign key (tag_id) references t_tag(tag_id),
constraint FK_tag_id foreign key (blog_id) references t_blog(blog_id)
);
########## End ##########
数据库查询 - 选课系统
第1关:数据库数据的插入
编程要求
请仔细阅读右侧代码,根据方法内的提示,在Begin-End
区域内进行代码补充,具体任务如下:
- 表结构已经为你创建好,只需往学生表(
student
)、课程表(course
)和学生选课表(dbsc
)中插入相应数据即可。
USE School;
#请在此添加实现代码
########## Begin ##########
########## 插入学生表(Student)相应数据 ##########
insert into student(Sno,Sname,Ssex,Sage,Sdept) values
(9512101,'李勇','男',19,'计算机系'),
(9512102,'刘晨','男',20, '计算机系'),
(9512103,'王敏', '女',20,'计算机系'),
(9521101,'张立','男',22,'信息系'),
(9521102,'吴宾','女',21,'信息系'),
(9521103,'张海','男',20,'信息系'),
(9531101,'钱小平','女',18,'数学系'),
(9531102,'王大力','男',19,'数学系');
########## 插入课程表(Course)相应数据 ##########
insert into course(Cno,Cname,Ccredit,Semster,Period) values
('C01','计算机文化学',3,1,41),
('C02','VB',2,3,61),
('C03','计算机网络',4,7,14),
('C04','数据库基础',6,6,24),
('C05','高等数学',8,2,19),
('C06','数据结构',5,4,55);
########## 插入学生选课表(DBSC)相应数据 ##########
insert into dbsc(ScID,Sno,Cno,Grade,isTec) values
(1,9512101,'c01',90,'必修'),(2,9512101,'c02',86,'选修'),(3,9512101,'c06',45,'必修'),
(4,9512102,'c02',78,'选修'),(5,9512102,'c04',66,'必修'),
(6,9521102,'c01',82,'选修'),(7,9521102,'c02',75,'选修'),(8,9521102,'c04',92,'必修'),(9,9521102,'c05',50,'必修'),
(10,9521103,'c02',68,'选修'),(11,9521103,'c06',56,'必修'),
(12,9531101,'c01',80,'选修'),(13,9531101,'c05',95,'必修'),
(14,9531102,'c05',85,'必修');
########## End ##########
########## 查询表数据 ##########
SELECT * FROM student;
SELECT * FROM course;
SELECT * FROM dbsc;
第2关:简单查询
编程要求
请仔细阅读右侧代码,根据方法内的提示,在Begin-End
区域内进行代码补充,具体任务如下:
-
查询计算机系全体学生的姓名;
-
查询考试成绩不及格的学生的学号;
-
查询信息系年龄在
20 ~ 23
岁之间的学生的姓名以及其所在系和年龄; -
查询选修修了课程
C02
的学生的学号以及其成绩,查询结果按成绩降序排列; -
统计学生总人数。
#********* Begin *********#
echo "
select Sname, Sdept from student where Sdept = '计算机系';
select Sno from dbsc where Grade < 60;
select Sname, Sdept, Sage from student where Sage >=20 and Sage <=23 and Sdept = '信息系';
select Sno, Grade from dbsc where Cno = 'c02' order by Grade desc;
select count(*) from student;
"
#********* End *********#
第3关:进阶查询
编程要求
请仔细阅读右侧代码,根据方法内的提示,在Begin-End
区域内进行代码补充,具体任务如下:
- 查询所有姓‘ 张 ’学生的详细信息;
- 查询信息系,数学系和计算机系学生的姓名和性别;
- 查询选修课程的人数,列出课程号和人数;
- 查询选修了
3
门课程以上的学生的学号; - 查询计算机系学生的选课情况,要求列出学生的名字,所修课的课程号和成绩。
注意:编写查询语句时,需要查询列表所有信息时,请使用 表名.*
(由于评测原因指定这样书写,实际自己使用可以直接*
)。
#********* Begin *********#
echo "
select student.* from student where Sname like '张%';
select Sname, Ssex, Sdept from student where Sdept in ('计算机系','信息系','数学系');
select Cno, count(*) from dbsc where isTec= '选修' group by Cno;
select Sno from dbsc group by Sno having count(*) > 3;
select Sname,Cno,Grade from dbsc left join student on student.Sno=dbsc.Sno where student.Sdept='计算机系';
"
#********* End *********#
第4关:复杂查询
编程要求
请仔细阅读右侧代码,根据方法内的提示,在Begin-End
区域内进行代码补充,具体任务如下:
- 查询选了选修课程的学生,并列出学生的学号和姓名;
- 查询每名学生的选课门数和平均成绩,并列出相应信息;
- 查询选课门数等于或大于
4
门的学生的平均成绩和选课门数; - 查询信息系选修
VB
课程的学生的成绩,要求列出学生姓名,课程名和成绩; - 编写修改
sql
语句,将成绩小于60
分的加5
分。
注意:编写查询语句时,需要查询列表所有信息时,请使用 表名.*
(由于评测原因指定这样书写,实际自己使用可以直接*
)。
#********* Begin *********#
echo "
select distinct dbsc.Sno, student.Sname from dbsc join student on student.Sno=dbsc.Sno where dbsc.isTec = '选修';
select Sname, count(*), avg(Grade) from dbsc join student on student.Sno=dbsc.Sno group by dbsc.Sno;
select avg(Grade),count(*) from dbsc join student on student.Sno=dbsc.Sno group by dbsc.Sno having count(*) >= 4;
select student.Sname, dbsc.Cno, dbsc.Grade from student left join dbsc on student.Sno=dbsc.Sno
where student.Sdept='信息系' and dbsc.isTec='选修' and Cno='C02';
update dbsc set Grade=Grade+5 where Grade < 60;
"
#********* End *********#