1.创建学生表student,sno是主键,sname非空唯一性,性别在男、女之间,年龄在14-50岁之间,并在学号列sno上创建no_con的主码约束,姓名列sname上创建名为name_in的唯一性索引。
create table student_test
(
sno char(10),
sname char(10) not null unique,
ssex char(2) check (ssex in('男','女')),
sage smallint CHECK (sage between 14 and 50),
sdept char(20)
primary key no_con(sno),
index name_in(sname)
);
2.创建学生选课表sc,其中(sno,cno)是主键,且两属性均参照student和course表的主键。成绩grade列要求在0-100之间的整数。
create table sc_test
(
sno char(10),
cno char(10),
grade smallint check(grade between 0 and 100),
primary key(sno,cno),
foreign key (sno) references student(sno),
foreign key (cno) references course(cno)
);
3.查询选修了全部课程的学生的姓名。
方法1:
SELECT SNAME
FROM STUDENT
WHERE NOT EXISTS
(SELECT *
FROM COURSE
WHERE NOT EXISTS
(SELECT *
FROM SC
WHERE SNO=STUDENT.SNO
AND CNO=COURSE.CNO));
方法2:
select Sname
from student
where Sno IN
(select Sno
from SC
group by Sno
having count(*)=
(select count(*)
from course))
4.创建所有选修了‘数据库’课程的学生的视图,要求包含学生学号、姓名、课程号、课程名和成绩
create view db_stu
as
select student.sno,sname,course.cno,cname,grade
from student,course,sc
where student.sno=sc.sno and course.cno=sc.Cno
and cname='数据库';
5.将更新student表的权限授予用户ken,并允许继续传递。
grant update on student to ken
with grant option;
6.将所有‘数据库’课程的成绩加5分。
1. update sc
set grade=grade+5
where cno in
(
select cno
from course
where cname='数据库'
);
2. update sc,course
set grade=grade+5
where sc.cno=course.cno
AND cname='数据库';
3. UPDATE sc
SET grade=
CASE
when grade+5>100 then 100
else grade+5
END;
7.将sc表中学生成绩按照五级分制输出,结果列名输出为学号、课号和等级。
select sno as 学号, cno as 课号, grade,
case
when grade is null then '尚未选课'
when grade < 60 then '不及格'
when grade<70 then '及格'
when grade<80 then '中'
when grade<90 then '良'
else '优秀'
end as 等级
from sc;
8.删除student表上性名列的唯一性约束。
drop index name_in on student;
9.查询sc表中平均分大于70分的学生的姓名、系别和平均分。
SELECT sname,sdept,avg(grade)
FROM sc JOIN student
using(sno)
GROUP BY Sno
HAVING avg(grade)>70;
10.查询student表中,姓名第二个字为“晨”的学生的学号、姓名和性别
SELECT sno,sname,ssex
from student
where sname like '_晨%';
11.查询课名中包涵下划线的课程号、课名和学分
SELECT Cno,Cname,Ccredit
from course
where cname like '%\_%';
或
SELECT Cno,Cname,Ccredit
FROM Course
WHERE Cname like '%#_%' ESCAPE '#';
12.查询课程名以“数”字开头或者“统”子结尾的课程情况
SELECT * from course
where cname REGEXP '^数'
OR cname REGEXP '统$';
13.查找未选修数据库的学生的姓名、学号、专业名
select Sno,Sname,Sdept
from Student
where Sno not in
(select Sno
from SC
where Cno in
( select Cno
from course
where Cname = '数据库')
);
14.找出每个学生超过他选修课程平均成绩的课程号。
SELECT Sno, Cno
FROM SC x
WHERE Grade >=(SELECT AVG(Grade)
FROM SC y
WHERE y.Sno=x.Sno);
15.查询非计算机科学系中比计算机科学系任意一个学生年龄小的学生姓名和年龄
SELECT Sname,Sage
FROM Student
WHERE Sage < ANY (SELECT Sage
FROM Student
WHERE Sdept= 'CS')
AND Sdept <> 'CS' ;
或
SELECT Sname,Sage
FROM Student
WHERE Sage <
(SELECT MAX(Sage)
FROM Student
WHERE Sdept= 'CS')
AND Sdept <> 'CS');
16.查询所有选修了1号课程的学生姓名。
SELECT Sname
FROM Student
WHERE EXISTS
(SELECT *
FROM SC
WHERE Sno=Student.Sno AND Cno= '1');
17.从student表中查找所有女学生的姓名、学号,以及与201215121号学生的年龄差距。
select sno, sname, sage-
( select sage
from student
where Sno='201215121'
) as 年龄差
from student
where Ssex='女';
18.在选课数据库上产生一个结果集,包括每个专业的男生人数、女生人数、总人数,以及学生总人数。
select sdept, ssex, count(*) as '人数'
from student
group by sdept,Ssex
with rollup;
19.在学生选课数据库上产生一个结果集,包括每门课程、各专业的平均成绩、每门课程的总平均成绩和所有课程的总平均成绩。
select cname, sdept, avg(grade) as '平均成绩'
from student JOIN sc using(sno) JOIN course using(cno)
group by cname,Sdept
with rollup;
20.查询全体学生情况,查询结果按所在系的系名升序排列,同一系中的学生按年龄降序排列。
SELECT *
FROM Student
ORDER BY Sdept, Sage DESC;
21.查找student表中从学号第2位同学开始的2位学生的信息。
select *
from student
order by sno
limit 1,2;
22.在运算过程中,用字符串表示的数字可以自动地转换为字符串。当执行转换时,如果字符串的第一位是数字,那么它被转换为这个数字的值,否则,它被转换为零。
select '80AA'+'1', 'AA80'+1, '10x' * 2 * 'qwe';
23.创建一个存储过程,有两个输入参数:学号stu_sno和课程名course_name,要求当某学生某门课程的成绩小于60分时,输出学分为0,大于等于60分时,输出该课程的学分。
create procedure out_score(in stu_sno char(10), in course_name char(20),out score int)
begin
declare course_no char(3);
declare course_credit tinyint;
declare course_grade tinyint;
select cno into course_no from course where cname=course_name;
select ccredit into course_credit from course where cname=course_name;
select grade into course_grade from sc where sno=stu_sno and cno=course_no;
if course_grade<60 then
set score=0;
else
set score=(select ccredit
from course
where cname=course_name);
end if;
end ;
call out_score('201215121','数据库',@x);
select @x;
24.创建一个存储函数,通过调用存储函数name_of_stu获得学号的姓名,判断姓名是否是“刘辰”,是则返回刘辰所在系名,不是则返回“FALSE”。
create function is_stu(student_sno char(10))
returns char(10)
begin
declare name char(10);
select name_of_stu(student_sno) into name;
if name= '刘辰' then
return(select sdept from student where sno=student_sno);
else
return 'false';
end if;
end;