目录:
习题篇:
一:创建数据库STUxxxx(其中xxxx为自己的姓名)。
二:在STUxxxx数据库中使用SQL语句创建如下的表结构:
三:使用语句对以上的表结构进行修改
四:用insert语句向数据库STUxxxx的XS表、KC表和XS_KC表中插入如下数据:
五:数据的插入、删除和修改
六:查询
解答篇:
一、 创建数据库STUxxxx(其中xxxx为自己的姓名)。
二、 在STUxxxx数据库中使用SQL语句创建如下的表结构:
三、 使用语句对以上的表结构进行修改
四、 用insert语句向数据库STUxxxx的XS表、KC表和XS_KC表中插入如下数据:
五、 数据的插入、删除和修改
六:查询*
参考篇:
1.学生情况表(XS)结构
列名 |
数据类型 |
长度 |
可否为空 |
默认值 |
说明 |
序号 |
Int |
|
否 |
|
自增字段,主键 |
学号 |
Char |
7 |
否 |
无 |
唯一键 |
姓名 |
Char |
8 |
否 |
无 |
|
性别 |
|
|
否 |
男 |
只能为男或女 |
出生日期 |
datetime |
|
否 |
无 |
|
班级 |
Char |
5 |
是 |
‘41021’ |
|
总学分 |
Tinyint |
|
是 |
0 |
|
是否团员 |
char |
1 |
是 |
|
|
身份证号码 |
char |
18 |
是 |
|
|
备注 |
Text |
|
是 |
无 |
|
2.课程表(KC)结构
列名 |
数据类型 |
长度 |
可否为空 |
默认值 |
说明 |
序号 |
Int |
|
否 |
|
自增字段,初始值为5,主键 |
课程号 |
Char |
3 |
否 |
无 |
|
课程名 |
Char |
20 |
否 |
无 |
|
开课学期 |
|
|
否 |
1 |
只能为1~8 |
学时 |
Tinyint |
|
否 |
无 |
|
学分 |
Tinyint |
|
否 |
0 |
|
3.学生与课程表(XS_KC)结构
列名 |
数据类型 |
长度 |
可否为空 |
默认值 |
说明 |
学号 |
Char |
7 |
否 |
无 |
学号与课程号的组合为主键 |
课程号 |
Char |
3 |
否 |
无 |
|
成绩 |
Tinyint |
|
是 |
0 |
|
1.修改学生情况表(XS)的“姓名”字段,使其数据类型改为varchar(10),且允许为空。
2.删除学生与课程表(XS_KC)中的“学分”字段。
3.修改学生情况表(XS),删除“班级”字段。
4.修改学生情况表(XS),增加一“专业”字段(varchar(20), 默认值为“计算机”)。
5.修改课程表(KC),把字段“学时”的名称改为“总学时”。
学生情况表(XS)
学号 |
姓名 |
性别 |
出生日期 |
专业 |
总学分 |
是否团员 |
身份证号码 |
备注 |
4102101 |
王林 |
男 |
1983-1-23 |
计算机 |
null |
1 |
null |
NULL |
4102102 |
吴荣华 |
女 |
1984-3-28 |
计算机 |
null |
0 |
null |
NULL |
4202103 |
张强 |
男 |
1981-11-19 |
电子 |
NULL |
1 |
null |
NULL |
4202110 |
王向荣 |
男 |
1980-12-9 |
电子 |
null |
0 |
111111111 111111111 |
NULL |
4202221 |
李丽 |
女 |
1982-7-30 |
电子 |
NULL |
1 |
null |
NULL |
4302101 |
刘明 |
男 |
1982-10-18 |
自控 |
null |
1 |
null |
NULL |
4402130 |
叶凡 |
男 |
1983-11-18 |
数学 |
null |
1 |
null |
转专业学习 |
课程表(KC)
课程号 |
课程名 |
开课学期 |
学时 |
学分 |
101 |
计算机基础 |
1 |
48 |
3 |
102 |
C语言 |
2 |
80 |
5 |
103 |
数据库 |
4 |
64 |
4 |
201 |
离散数学 |
6 |
64 |
4 |
202 |
计算机网络 |
7 |
64 |
4 |
301 |
软件工程 |
6 |
64 |
4 |
学生与课程表(XS_KC)
学号 |
课程号 |
成绩 |
4102101 |
101 |
80 |
4102101 |
102 |
89 |
4102101 |
103 |
78 |
4102102 |
101 |
57 |
4102102 |
102 |
67 |
4202103 |
103 |
90 |
4202110 |
101 |
85 |
4202110 |
102 |
91 |
4202221 |
101 |
69 |
4402130 |
101 |
78 |
4402130 |
103 |
74 |
专业 性别 人数
…… …… ……
20.查找平均成绩在80分以上的学生的学号和平均成绩。
21.查找选修的课程中超过2门成绩在80分以上的学生的学号和成绩高于80分的门数。格式如下:
学号 成绩高于80分的门数
…… ……
22.查询选修了课程号为101的每个学生的姓名及成绩。
23.查询 “计算机”专业且选修了“计算机基础”课程的学生的学号、姓名及成绩。
24.显示每门课程的平均成绩。格式如下:
课程名 平均成绩
…… ……
25.查询各个专业各门课程的平均成绩。格式如下
专业 课程名 平均成绩
…… …… ……
26.查询“计算机”专业平均成绩在85分以上的学生的学号、姓名和平均成绩。
27.查询101号课程及格的学生的基本情况。
28.查找比所有计算机专业的学生年龄都大的学生的情况。
<---------------------------------------------------------------------------------------------------->
/*新建数据*/
create database stu_liuxinlei;
/*进入指定数据库*/
use stu_liuxinlei;
/*新建学生情况表XS*/
create table XS(
xs_id int not null AUTO_INCREMENT,
stu_id char(7) not null unique,
stu_name char(8) not null,
stu_sex enum('男','女') not null default '男',
stu_birth datetime not null,
stu_class char(5) default '41021',
stu_credit tinyint default 0,
whether_the_member char(1),
car_id char(18),
remark text,
primary key (xs_id)
);
/*新建课程表(KC)*/
create table KC(
kc_id int not null AUTO_INCREMENT,
kc_number char(3) not null unique,
kc_name char(20) not null,
kc_semester tinyint default 1,
kc_period tinyint not null,
kc_credit tinyint not null default 0,
primary key (kc_id),
constraint check_semester check(kc_semester >= 1 and kc_semester <= 8)
) AUTO_INCREMENT=5;
/*学生与课程表(XS_KC)*/
create table XS_KC(
stu_id char(7) not null,
kc_number char(3) not null,
kc_soucre tinyint default 0,
constraint for_key_stu_id foreign key (stu_id) references XS(stu_id),
constraint for_key_kc_number foreign key (kc_number) references KC(kc_number)
);
/*修改学生情况表(XS)的“姓名”字段,使其数据类型改为varchar(10),且允许为空。*/
alter table XS
modify stu_name varchar(10) null /*设置为空不要写出is null*/
/*删除学生与课程表(XS_KC)中的“学分”字段。*/
alter table XS_KC
drop kc_soucre;
/*修改学生情况表(XS),删除“班级”字段。*/
alter table XS
drop stu_class;
/*修改学生情况表(XS),增加一“专业”字段(varchar(20), 默认值为“计算机”)。*/
alter table XS
add xs_major varchar(20) default '计算机';
/*修改课程表(KC),把字段“学时”的名称改为“总学时”。*/
alter table KC
change kc_period z_kc_period tinyint; /*要想修改字段名称需要定义字段的数据类型*/
/*插入XS表数据*/
insert into XS(stu_id,stu_name,stu_sex,stu_birth,stu_class,stu_credit,whether_the_member,car_id,remark)
values
('4102101', '王林', '男', '1983-1-23', '计算机', null, 1, null, NULL),
('4102102', '吴荣华', '女', '1984-3-28', '计算机', null, 0, null, NULL),
('4202103', '张强', '男', '1981-11-19', '电子', NULL, 1, null, NULL),
('4202110', '王向荣', '男', '1980-12-9', '电子', null, 0, '111111111111111111', NULL),
('4202221', '李丽', '女', '1982-7-30', '电子', NULL, 1, null, NULL),
('4302101', '刘明', '男', '1982-10-18', '自控', null, 1, null, NULL),
('4402130', '叶凡', '男', '1983-11-18', '数学', null, 1, null, '转专业学习');
/*插入KC表数据*/
insert into KC(kc_number,kc_name,kc_semester,kc_period,kc_credit)
values
('101', '计算机基础', 1, 48, 3),
('102', 'C语言', 2, 80, 5),
('103', '数据库', 4, 64, 4),
('201', '离散数学', 6, 64, 4),
('202', '计算机网络', 7, 64, 4),
('301', '软件工程', 6, 64, 4);
/*插入XS_KC表数据*/
insert into XS_KC(stu_id, kc_number, kc_soucre)
values
('4102101', '101', 80),
('4102101', '102', 89),
('4102101', '103', 78),
('4102102', '101', 57),
('4102102', '102', 67),
('4202103', '103', 90),
('4202110', '101', 85),
('4202110', '102', 91),
('4202221', '101', 69),
('4402130', '101', 78),
('4402130', '103', 74);
/*数据的插入、删除和修改*/
/*1. 将KC表中总学时超过60的课程对应的学分增加1分。*/
update KC
set kc_credit = kc_credit + 1
where kc_period > 60;
/*2. 将XS表中学号为“4102101”的同学的总学分增加4分,备注改为“提前修完一门课程”。*/
update XS
set stu_credit = stu_credit + 4, remark = '提前修完一门课程'
where stu_id = '4102101';
/*3. 将XS_KC表中学号为“4102101”的同学的“计算机基础”课程的成绩增加10分。*/
update XS_KC
set kc_soucre = kc_soucre + 10
where stu_id = '4102101';
/*4. 将XS_KC表计算机专业所有学生的各科成绩均提高5%。*/
update XS_KC
set kc_soucre = kc_soucre * (0.05 + 1)
where stu_id = all(
select stu_id
from XS
where stu_class = '计算机'
);
/*5. 将XS_KC表中“数据库”课程的所有成绩信息删除。*/
delete from XS_KC
where kc_number = all(
select kc_number
from KC
where kc_name = '数据库'
);
/*6. 将XS_KC表中其学号在XS表中不存在或其课程号在KC表中不存在的学生的成绩信息删除。*/
delete
#SELECT *
from XS_KC
where 学号 not in (
select 学号
from XS
) or 课程号 not in (
select 课程号
from KC
)
/*7. 创建新表XS1,该表的结构与数据与XS表完全一样。*/
create table XS1(
xs_id int not null AUTO_INCREMENT,
stu_id char(7) not null unique,
stu_name char(8) not null,
stu_sex enum('男','女') not null default '男',
stu_birth datetime not null,
stu_class char(5) default '41021',
stu_credit tinyint default 0,
whether_the_member char(1),
car_id char(18),
remark text,
primary key (xs_id)
);
/*8. 删除XS1表中前两个同学的基本信息。*/
delete from XS1
where xs_id = all(
select xs_id
from XS1
limit 0,2
);
/*9. 删除XS1表中的所有数据。*/
delete from XS1;
/*查询*/
-- 1. 查询XS表中所有同学的学号、姓名和总学分,结果中各列的标题分别指定为num,name和mark。
select stu_id as num, stu_name as name, stu_credit as mark
from XS;
-- 2. 查询XS表中的学生数据来自哪些专业(使用DISTINCT子句消除结果集中的重复行)。
select distinct stu_id, stu_name, stu_class
from XS;
-- 3. 查询XS表中各个同学的姓名、专业名和总学分,只返回结果集的前5行。
select stu_name, stu_class, stu_credit
from XS
limit 0,5;
-- 4. 查询XS表中各个同学的姓名、专业名和总学分,只返回结果集的3-6行
select stu_name, stu_class, stu_credit
from XS
limit 2,3;
-- 5. 查询XS表中每个学生的学号、姓名和年龄信息。
select stu_id, stu_name,
timestampdiff(year,stu_birth,now()) as 'age'
from XS;
-- 6. 查询XS表中1979年出生的学生姓名和专业情况。
select stu_name, stu_class
from XS
where stu_birth >= '1979-01-01' and stu_birth <= '1979-12-31';
-- 7. 查询XS表中专业名为“计算机”或“电子”或“数学”的学生的情况。
select *
from XS
where stu_class in('计算机','电子','数学');
-- 8. 查询XS表中姓“张”或“王”或“李”且单名的学生的情况。
select *
from XS
where stu_name like '张*' or stu_name like '王*' or stu_name like '李*';
-- 9. 查询XS表中专业为“计算机”且总学分尚未确定的学生情况。
select *
from XS
where stu_class = '计算机' and stu_credit is null;
-- 10. 查询年龄最小的前三个同学的姓名、专业和年龄。
select stu_name, stu_class,
timestampdiff(year,stu_birth,now()) as 'age'
from XS
ORDER BY age
limit 0,3;
-- 11. 求选修了“101”课程的学生的平均成绩。
select kc_number, avg(kc_soucre)
from XS_KC
group by kc_number
having kc_number = '101';
-- 12. 求选修了“102”课程的学生的最高分和最低分。
select kc_number, max(kc_soucre) as '最高分', min(kc_soucre) as '最低分'
from XS_KC
where kc_number = '102';
-- 13. 求学号为“4102101”学生的总成绩。
select XS.stu_id, sum(XS_KC.kc_soucre) as '总成绩'
from XS
left join XS_KC on XS.stu_id = XS_KC.stu_id
where XS.stu_id = '4102101';
-- 14. 求专业为“计算机”的学生的总人数。
select stu_class, count(*) as '总人数'
from XS
where stu_class = '计算机';
-- 15. 求选修了“101”课程的学生的人数。
select kc_number, count(*) as '总人数'
from XS_KC
where kc_number = '101';
-- 16. 求选修了课程的学生的人数。
select count(distinct stu_id) as '总人数'
from XS_KC;
-- 17. 求一门课程都未选修的学生的人数。
select count(*)
from XS
where stu_id != all(
select stu_id from XS_KC
);
-- 18. 统计各个专业的学生数。(按专业分组)
select stu_class, count(*)
from XS
group by stu_class;
-- 19. 统计各个专业的男女生人数。格式如下:
-- 专业 性别 人数
-- …… …… ……
select stu_class, stu_sex, count(*)
from XS
group by stu_class,stu_sex;
-- 20. 查找平均成绩在80分以上的学生的学号和平均成绩。
select stu_id ,avg(kc_soucre) as 'avg'
from XS_KC
group by stu_id
having avg > 80;
-- 21. 查找选修的课程中超过2门成绩在80分以上的学生的学号和成绩高于80分的门数。格式如下:
-- 学号 成绩高于80分的门数
-- …… ……
-- 22. 查询选修了课程号为101的每个学生的姓名及成绩。
select XS.stu_name,XS_KC.kc_soucre
from XS,XS_KC,KC
where XS.stu_id = XS_KC.stu_id
and XS_KC.kc_number=KC.kc_number
and KC.kc_number = '101';
-- 23. 查询 “计算机”专业且选修了“计算机基础”课程的学生的学号、姓名及成绩。
select XS.stu_id, XS.stu_name,XS_KC.kc_soucre
from XS,XS_KC,KC
where XS.stu_id = XS_KC.stu_id
and XS_KC.kc_number=KC.kc_number
and KC.kc_name = '计算机基础';
-- 24. 显示每门课程的平均成绩。格式如下:
select kc_number, avg(kc_soucre) as 'avg'
from XS_KC
group by kc_number
<---------------------------------------------------------------------------------------------------->
一、 创建数据库STUxxxx(其中xxxx为自己的姓名)。
create database STUliuxinlei;use STUliuxinlei;
二、 在STUxxxx数据库中使用SQL语句创建如下的表结构:
1.学生情况表(XS)结构
列名 数据类型 长度 可否为空 默认值 说明
序号 Int 否 自增字段,主键
学号 Char 7 否 无 唯一键
姓名 Char 8 否 无
性别 否 男 只能为男或女
出生日期 datetime 否 无
班级 Char 5 是 ‘41021’
总学分 Tinyint 是 0
是否团员 char 1 是
身份证号码 char 18 是
备注 Text 是 无2.课程表(KC)结构
列名 数据类型 长度 可否为空 默认值 说明
序号 Int 否 自增字段,初始值为5,主键
课程号 Char 3 否 无
课程名 Char 20 否 无
开课学期 否 1 只能为1~8
学时 Tinyint 否 无
学分 Tinyint 否 03.学生与课程表(XS_KC)结构
列名 数据类型 长度 可否为空 默认值 说明
学号 Char 7 否 无 学号与课程号的组合为主键
课程号 Char 3 否 无
成绩 Tinyint 是 0create table XS(
序号 int primary key auto_increment,
学号 char(7) not null unique key,
姓名 char(8) not null ,
性别 enum('男','女') not null default '男',
出生日期 datetime not null,
班级 char(5) default '41021',
总学分 tinyint default 0,
是否团员 char(1) ,
身份证号码 char(18) ,
备注 text
)create table KC(
序号 int primary key auto_increment,
课程号 char(3) not null ,
课程名 char(20) not null,
开课学期 enum('1','2','3','4','5','6','7','8') not null default '1',
学时 tinyint not null ,
学分 tinyint not null default 0
)auto_increment=5create table XS_KC(
学号 char(7) ,
课程号 char(3),
成绩 tinyint default 0,
primary key (学号,课程号)
)三、 使用语句对以上的表结构进行修改
1.修改学生情况表(XS)的“姓名”字段,使其数据类型改为varchar(10),且允许为空。alter table XS modify 姓名 varchar(10)
2.删除学生与课程表(XS_KC)中的“学分”字段。
alter table XS_KC drop 学分
3.修改学生情况表(XS),删除“班级”字段。
alter table XS drop 班级
4.修改学生情况表(XS),增加一“专业”字段(varchar(20), 默认值为“计算机”)。
alter table XS add 专业 varchar(20) default '计算机'
5.修改课程表(KC),把字段“学时”的名称改为“总学时”。
alter table KC change 学时 总学时 tinyint default 0
四、 用insert语句向数据库STUxxxx的XS表、KC表和XS_KC表中插入如下数据:
学生情况表(XS)
学号 姓名 性别 出生日期 专业 总学分 是否团员 身份证号码 备注
4102101 王林 男 1983-1-23 计算机 null 1 null NULL
4102102 吴荣华 女 1984-3-28 计算机 null 0 null NULL
4202103 张强 男 1981-11-19 电子 NULL 1 null NULL
4202110 王向荣 男 1980-12-9 电子 null 0 111111111
111111111 NULL
4202221 李丽 女 1982-7-30 电子 NULL 1 null NULL
4302101 刘明 男 1982-10-18 自控 null 1 null NULL
4402130 叶凡 男 1983-11-18 数学 null 1 null 转专业学习
insert into XS (学号,姓名,性别,出生日期,专业,是否团员,身份证号码,备注)
values (4102101,'王林','男','1983-1-23','计算机','1','',''),
(4102102,'吴荣华','女','1984-3-28','计算机','0','',''),
(4202103,'张强','男','1981-11-19','电子','1','',''),
(4202110,'王向荣','男','1980-12-9','电子','0','111111111111111111',''),
(4202221,'李丽','女','1982-7-30','电子','1','',''),
(4302101,'刘明','男','1982-10-18','自控','1','',''),
(4402130,'叶凡','男','1982-11-18','数学','1','','转专业学习')
课程表(KC)
课程号 课程名 开课学期 学时 学分
101 计算机基础 1 48 3
102 C语言 2 80 5
103 数据库 4 64 4
201 离散数学 6 64 4
202 计算机网络 7 64 4
301 软件工程 6 64 4
insert into KC (课程号,课程名,开课学期,学时,学分)
VALUES ('101','计算机基础','1',48,3),
('102','C语言','2',80,5),
('103','数据库','4',64,4),
('201','离散数学','6',64,4),
('202','计算机网络','7',64,4),
('301','软件工程','6',64,4)
学生与课程表(XS_KC)
学号 课程号 成绩
4102101 101 80
4102101 102 89
4102101 103 78
4102102 101 57
4102102 102 67
4202103 103 90
4202110 101 85
4202110 102 91
4202221 101 69
4402130 101 78
4402130 103 74
insert into XS_KC (学号,课程号,成绩)
values
('4102101','101',80),
('4102101','102',89),
('4102101','103',78),
('4102102','101',57),
('4102102','102',67),
('4202103','103',90),
('4202110','101',85),
('4202110','102',91),
('4202221','101',69),
('4402130','101',78),
('4402130','103',74)五、 数据的插入、删除和修改
1. 将KC表中总学时超过60的课程对应的学分增加1分。update KC set 总学时=总学时+1 where 总学时>60
2. 将XS表中学号为“4102101”的同学的总学分增加4分,备注改为“提前修完一门课程”。
update XS set 总学分 = 总学分+4,备注='提前修完一门课程' where 学号='4102101'
3. 将XS_KC表中学号为“4102101”的同学的“计算机基础”课程的成绩增加10分。
update XS_KC
set 成绩 =成绩+10
where 学号='4102101' and 课程号=
(
SELECT 课程号
from KC
where 课程名 = '计算机基础'
)4. 将XS_KC表计算机专业所有学生的各科成绩均提高5%。
UPDATE XS_KC set 成绩 = 成绩*1.05 where 学号 in
(
select 学号
from XS
where 专业='计算机'
)5. 将XS_KC表中“数据库”课程的所有成绩信息删除。
delete
from XS_KC
where 课程号 in(
SELECT 课程号
from KC
where 课程名 = '数据库'
)6. 将XS_KC表中其学号在XS表中不存在或其课程号在KC表中不存在的学生的成绩信息删除。
delete
#SELECT *
from XS_KC
where 学号 not in (
select 学号
from XS) or 课程号 not in (
select 课程号
from KC
)
7. 创建新表XS1,该表的结构与数据与XS表完全一样。create table XS1 like XS;
insert into XS1 select * from XS;8. 删除XS1表中前两个同学的基本信息。
delete
from XS1
limit 29. 删除XS1表中的所有数据。
delete from XS1