头歌 MySql数据库参考答案

该文提供了一系列关于MySQL数据库的操作示例,包括查看表结构、修改表名、字段操作、数据插入、更新和删除,以及查询语句的使用,如基本查询、范围查询、分组查询、聚合函数等。还涉及到连接查询、子查询和分页索引的应用,展示了数据库设计和选课系统的数据操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

列出来的答案都是在头歌平台上编译通过的,大家有需要可以参考一下

目录

MySql数据库

数据库和表的基本操作(一)

第1关:查看表结构与修改表名

编程要求

第2关:修改字段名与字段数据类型

编程要求

 第3关:添加与删除字段

编程要求

第4关:修改字段的排列位置 

编程要求

第5关:删除表的外键约束

编程要求

数据库和表的基本操作(二)

第1关:插入数据

编程要求

 第2关:更新数据

编程要求

 第3关:删除数据

编程要求

 MySQL数据库 - 单表查询(一)

第1关:基本查询语句

编程要求

第2关:带 IN 关键字的查询 

编程要求

 第3关:带 BETWEEN AND 的范围查询

编程要求

 MySQL数据库 - 单表查询(二)

第1关:带 LIKE 的字符匹配查询

编程要求

 第2关:查询空值与去除重复结果

编程要求

第3关:带 AND 与 OR 的多条件查询 

编程要求

 MySQL数据库 - 单表查询(三)

第1关:对查询结果进行排序

编程要求

 第2关:分组查询

编程要求

 第3关:使用 LIMIT 限制查询结果的数量

编程要求

 MySQL数据库 - 使用聚合函数查询

第1关:COUNT( )函数

编程要求

 第2关:SUM( )函数

编程要求

第3关:AVG( )函数 

编程要求

 第4关:MAX( )函数 

编程要求

第5关:MIN( )函数 

编程要求

MySQL数据库 - 连接查询 

第1关:内连接查询

编程要求

第2关:外连接查询 

编程要求

第3关:复合条件连接查询

编程要求

 第2关:关键字子查询

编程要求

MySQL数据库 - 分组选择数据 

第1关:GROUP BY 与 聚合函数

编程要求

 第2关:使用 HAVING 与 ORDER BY

编程要求

 MySQL开发技巧 - 分页和索引

第1关:MySQL 分页查询

编程要求

第2关:索引(单列索引) 

编程要求

第3关:索引(组合索引) 

编程要求

 数据库设计 - 博客系统

第1关:数据库表设计 - 用户信息表

编程要求

第2关:数据库表设计 - 核心表 

编程要求

第3关:数据库表设计 - 博客标签表 

编程要求

数据库查询 - 选课系统 

第1关:数据库数据的插入

编程要求

第2关:简单查询 

编程要求

第3关:进阶查询 

编程要求

第4关:复杂查询 

编程要求



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_empName字段后添加字段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_empName字段移至第一列,数据格式不变;

  • 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条数据内容;

  • 空数据表结构如下,注意字段3DeptId,倒数第二个字母为大写的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改为3023200.00改为4300.00

注意字段3DeptId,倒数第二个字母为大写的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,结构如下:

  • 请你查询字段NameSalary的内容;

  • 请你查询整张表的内容。

    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时,字段NameSalary的内容;
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时,字段NameSalary的内容。
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为起始的员工的NameSalary的内容;
USE Company;

######### Begin #########
SELECT Name,Salary FROM tb_emp WHERE Name LIKE "C%";

######### End #########
 第2关:查询空值与去除重复结果
编程要求

根据提示,在右侧编辑器Begin-End处补充代码:

我们为你新建了一个数据表tb_emp,内容如下:

  • 使用关键字IS NULL返回数据表中字段DeptIdNULL的所有字段的内容,注意,返回的是指定行所有字段的内容;

  • 使用关键字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返回数据表中字段DeptId301并且薪水大于3000的所有字段的内容,其中DeptId的倒数第二个字母为i的大写;

  • 使用关键字IN返回数据表中字段DeptId301303的所有字段的内容。

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_idclass_idnamescore
12Jack81
21David74
31Mason92
42Ethan89
51Gina65
USE School;

#请在此处添加实现代码
########## Begin ##########

########## 查询1班同学的所有信息以成绩降序的方式显示结果 ##########
select * from tb_score where class_id = 1 order by score desc;

########## End ##########
 第2关:分组查询
编程要求

在右侧编辑器Begin-End处补充代码,对班级表中的班级名称进行分组查询。

我们已经为你提供了班级表信息: tb_class表数据:

stu_idclass_idname
1367Jack
2366David
3366Mason
4367Ethan
5366Gina
USE School;

#请在此处添加实现代码
########## Begin ##########

########## 对班级名称进行分组查询 ##########
SELECT * FROM tb_class GROUP BY class_id;

########## End ##########
 第3关:使用 LIMIT 限制查询结果的数量
编程要求

在右侧编辑器Begin-End处补充代码,查询班级中第2名到第5名的学生信息,并根据学生成绩进行降序排序。

我们已经为你提供了学生成绩表: tb_score表数据:

idnamescore
1Jack89
2David73
3Mason62
4Ethan93
5Gina76
6Dorris98
7kain86
8Alice91
USE School;

#请在此处添加实现代码
########## Begin ##########

########## 查询班级中第2名到第5名的学生信息 ##########
SELECT * FROM tb_score order by score desc LIMIT 1,4;

########## End ##########

 MySQL数据库 - 使用聚合函数查询

第1关:COUNT( )函数
编程要求

根据提示,在右侧编辑器Begin-End处补充代码: 我们为你提供了一张tb_class表,内容如下:

idnameclassid
1Emma366
2Mary367
3Allen367
4Kevin367
5Rose366
6James367
7Hale366
8David367

根据此表数据:

  1. 查询该表中一共有多少条数据;

  2. 查询此表中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表,内容如下:

idnamecoursescore
1Emma语文86
2Mary语文79
3Allen语文92
4Emma英语116
5Mary英语95
5Allen英语100

根据此表数据:

  1. 查询该表中学生的总成绩;

  2. 查询学生语文课程的总分数

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表,内容如下:

idnamecoursescore
1Emma语文86
2Mary语文79
3Allen语文92
4Emma英语116
5Mary英语95
5Allen英语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表,内容如下:

idnamecoursescore
1Emma语文86
2Mary语文79
3Allen语文92
4Emma英语116
5Mary英语95
6Allen英语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表,内容如下:

idnamecoursescore
1Emma语文86
2Mary语文79
3Allen语文92
4Emma英语116
5Mary英语95
5Allen英语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关:内连接查询
编程要求

在右侧编辑器补充代码,查询数据表中学生姓名以及对应的班级名称,将其对应的列名分别另命名为studentNameclassName

我们为你提供了两张表,内容如下:

tb_student表数据:

idnameclass_id
1Emma2
2Mary4
3Allen(null)
4Kevin1
5Rose2
6James1

tb_class表数据:

idname
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关:外连接查询 
编程要求

在右侧编辑器补充代码,分别使用左外连接右外连接查询数据表中所有学生姓名和对应的班级名称,查询结果列分别另命名为studentNameclassName

我们为你提供了两张表,内容如下:

tb_student表数据:

idnameclass_id
1Emma2
2Mary4
3Allen(null)
4Kevin1
5Rose2
6James1

tb_class表数据:

idname
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分以上的学生的姓名和学生的成绩以及学生所在的班级,其中学生的姓名和学生所在班级分别另命名为studentNameclassName

我们为你提供了两张表,内容如下:

tb_student表数据:

idnameclass_idscore
1Emma289
2Mary492
4Kevin176
5Rose368
6James199

tb_class表数据:

idname
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表数据:

idpositionsalary
1Java8000
2Java8400
3Java9000
4Python6500
5Python10000

根据提供的数据,在右侧编辑器中补充代码:

  1. 查询薪资表中比Java最高工资高的所有员工职位名称和薪资;

  2. 查询薪资表中比Java最低工资高的所有员工职位名称和薪资;

  3. 查询薪资表中职位为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表数据结构如下:

stuIdgradeIdsex
02012
02212
03193
05085
06106
01011
02242
04134

要求输出结果显示如下:

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
编程要求

根据提示,在右侧编辑器补充代码:

  1. 我们要评选三好学生,条件是至少有两门课程在90分以上(包括90分)才能有资格,请列出符合的学生的学号(sno)及其90分以上(包括90分)科目总数;

  2. 学校评选先进学生,要求平均成绩大于90分(包括90分)的学生都有资格,并且语文课必须在95分以上(包括95分),请列出有资格的学生的学号(sno)及其科目的平均分。

给定数据表tb_grade格式如下:

snopnoscore
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 分页查询
编程要求

根据提示,在右侧编辑器补充代码:

  1. prod_id升序查询表products中第6-10行数据,只要求prod_id字段即可(prod_id1开始);

  2. 利用子查询优化查询出按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结构如下:

字段名类型、属性
idint(11) ,非空,自增长
namevarchar(20) , 非空
scoreint(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,在nameageaddress上创建组合索引,索引名name_city_score (无需建表,只增加组合索引即可)。

person结构如下所示:

字段类型
idint(11)
namevarchar(20)
ageint
addressvarchar(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_idint类型id主键,自动增长,增量为1
type_namevarchar(32)类型名称非空
  • 博客信息表(t_blog);
字段名称类型备注约束
blog_idbigint博客id主键,自动增长
blog_titlevarchar(100)博客标题非空
blog_contentlongtext博客内容非空
useridbigint创建人id外键
type_idint类型ID外键
blog_statusint博客状态 1为发布 0为草稿非空,默认为0
create_timedatetime创建时间非空
update_timedatetime更新时间非空
cover_imagevarchar(255)封面图片

创建该表时,注意要添加外键约束,外键为userid,外键名称设置为FK_user_id,外键表为用户信息表(t_user)。

另一个外键为type_id,外键名称设置为FK_type_id,外键表为博客类型表(blog_type)。

  • 新闻评论表(t_comment)。
字段名称类型备注约束
comment_idbigint评论id主键,自动增长,增量为1
comment_contentvarchar(500)评论内容非空
blog_idbigint评论内容非空,外键
createtimedatetime评论时间非空
useridbigint评论人ID非空,外键
replyidint评论回复人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_idFK_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区域内进行代码补充,具体任务如下:

  1. 查询计算机系全体学生的姓名;

  2. 查询考试成绩不及格的学生的学号;

  3. 查询信息系年龄在20 ~ 23岁之间的学生的姓名以及其所在系和年龄;

  4. 查询选修修了课程C02的学生的学号以及其成绩,查询结果按成绩降序排列;

  5. 统计学生总人数。

#********* 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区域内进行代码补充,具体任务如下:

  1. 查询所有姓‘ 张 ’学生的详细信息;
  2. 查询信息系,数学系和计算机系学生的姓名和性别;
  3. 查询选修课程的人数,列出课程号和人数;
  4. 查询选修了3门课程以上的学生的学号;
  5. 查询计算机系学生的选课情况,要求列出学生的名字,所修课的课程号和成绩。

注意:编写查询语句时,需要查询列表所有信息时,请使用 表名.* (由于评测原因指定这样书写,实际自己使用可以直接*)。

#********* 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区域内进行代码补充,具体任务如下:

  1. 查询选了选修课程的学生,并列出学生的学号和姓名;
  2. 查询每名学生的选课门数和平均成绩,并列出相应信息;
  3. 查询选课门数等于或大于4门的学生的平均成绩和选课门数;
  4. 查询信息系选修VB课程的学生的成绩,要求列出学生姓名,课程名和成绩;
  5. 编写修改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 *********#

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值