参考https://blog.csdn.net/weixin_43947974/article/details/84855856
1.数据库操作:
1)创建数据库: create database database_name;
? 创建并设置字符编码 create database database_name character setutf8;
2)删除数据库: drop datebase database_name;
3)查看数据库字符集编码: show variables like ‘character_set_database‘
? 如果使用可视化工具要切换到所查数据库,或者使用: use database_name; 命令使用所查数据库``
4)修改数据库字符编码: alter database_name character set utf8;
2.数据表的操作:
1)创建表: create table table_name(field1 int primary key,field2 varchar(20) not null ...)
2)删除表: drop table table_name
3)插入表: insert into table_name(field1,field2) values(value1,value2)
4)查询表: select * from table_name where 查询条件
5)添加列: alter table table_name add col_name varchar(20) not null
6)删除列: alter table table_name drop column col_name
7)修改列: alter table table_name modify column col_name varchar(50)
8)更新列: update table_name set col1=value1... where 条件...
3.约束:
1)种类:primary key(主键约束)、default(默认约束)、not null(非空约束)、unique(唯一约束)、foreign key(外键约束)、check(检查约束)
2)添加约束: alter table table_name add constraint 约束名 约束类型
比如: alter table student add constraint fk_1 foreign key(class_id) references class(class_id);
3)删除约束: alter table table_name drop 约束类型 约束名称 注意:删除主键时,应先删除引用了它的外键
比如: alter table student drop foreign key fk_1
4.数据库查询
1.简单的查询:
1)无条件查询:select * from table_name;
2)条件查询:select * from table_name where 条件;
3)排序查询:select col1,col2,...from table_name where 条件 .. order by 列名 desc/asc
? desc:从大到小排序。
? asc:从小到大排序,默认是asc
比如: select s_id,s_name,s_score from student where s_score>=60 order by s_id desc
4)模糊查询:查询关键字 like 主要使用 % 、_、[ ]三个字符
% 表示匹配0个或多个字符(通配符)
_匹配一个字符
[ ]匹配其中中的一个(类似正则表达式)
例: select * from student where s_name like ‘张%‘ 译:查询学生中姓张的,两个字,三个字的都可以查出来,如:张三、张麻子
例: select * from student where s_name like ‘张_‘ 译:查询学生中姓张的,且只有两个字的,如:张三、张四
例: select * from student where s_name like ‘[张李王]三‘ 译:查询学生中姓名为:张三、李三、王三 的信息
5)分组查询:select * from table_name group by 列名 关键字
group by 将统计的列中相同数据进行分组
比如: select s_score,count(*) ‘人数‘ from student group by s_score
译:查询学生中每个分数有多少人,对统计出来人数的列暂时命名为‘人数’,就是对相同的成绩进行了分组
分组查询常用函数:
(1)max:求最大值
例: select s_name,max(math_score) from student group by s_name 查询数学成绩最高的学生姓名
(2)min:求最小值
例: select s_name,min(math_score) from student group by s_name 查询数学成绩最低的学生姓名
(3)avg:求平均值
例: select class_id,avg(math_score) from student group by class_id 查询每个班的平均数学成绩
(4)sum:求总数和
例: select sum(s_id) from student group by s_id 查询表中一共有多少学生,若不分组,将会将所有学生id相加获取最后总和
(5)count:求总行数
例: select count(s_id) from student 查询表中一共有多少行学生
6)having用法:筛选成组后的各种数据,它可以筛选真实表中没有的数据作为查询条件
比如: select s_name,sum(s_score) from student group by s_name having sum(s_score)>600 查询总成绩大于600分的学生,但我们表没有总分这个记录
只有每科的成绩,这时就可以用having了,where就不能来筛选总成绩大于600的学生了。
having和where的区别:
having:having对查询结果中的列发挥作用,筛选数据
wherer:where针对表中的列发挥作用,查询数据
7)limit用法:limit 主要是用于分页,limit n,m 表示从n+1开始取m条数据
比如: select * from student limit 2,5 表示取所有信息的第3条后面的5条记录:3、4、5、6、7
8)简单的多表查询: select table1.,table2. from table1,table2 where 条件
2.子查询和连接查询
1)where子查询:把内层查询结果当作外层查询的比较条件
比如:查询成绩及格的学生,后面括号里可以放子查询,也可以放已知的数据。
select s_name,s_score
from student
where s_score
in (select s_score from student wheres_score>=60)
2)from子查询:把子查询的结果作为一个表,进行再次查询
比如:查询成绩及格学生的姓名和班级,这里将子查询作为一个新表(stu) 再进行查询 ,这里有班级表(class)和学生表(student)
select s_name,class_name
from class,(select s_name,class_id from student where s_score>=60) as stu
where class.class_id = stu.class_id
3)exists子查询:把子查询结果拿到内层,看内层的查询是否成立
比如:查询班级中的学生姓名,
select class_id,s_name
from student where exists(select * from class where class.class_id=student.class_id)
4)连接查询
连接查询我们把表的数据给出来,方便对照查看
left join 左连接:以左表为准,去右表找数据,如果没有匹配的数据,则以null补空位
语法: select col1,col2,col3 from ta left join tb on 条件
? on后面放连接的一些条件,跟where后面跟条件一样
例: SELECT class.*,s_id,s_name FROM class LEFT JOIN student ONclass.class_id=student.class_id
结果:
查询班级里的学生,没有学生的就用 null 补位了
right join 右连接:以右表为准,去左表找数据,如果没有匹配的数据,则以null补空位 和左连接相反
语法: select col1,col2,col3 from ta right join tb on 条件
inner join 内连接:查询的结果是所连接2个表的交集,
语法: select ta1.,ta2. from ta1 inner join ta2 on 条件
例: SELECT class.*,s_id,s_name FROM student INNER JOIN class 我们这里不跟条件,查询的就是两个表的所有交集
例: SELECT class.*,s_id,s_name FROM student INNER JOIN class ON class.class_id=student.class_id 有条件后,都满足条件的才会查询出来
常用数据类型
创建数据库
--创建students数据库
create database student;
--创建student表结构
CREATE TABLE Student (
Sno CHAR(7) PRIMARY KEY,
Sname NCHAR(5) NOT NULL,
Ssex NCHAR(1) check (ssex=‘男‘ or ssex=‘女‘),
Sage TINYINT,
Sdept NVARCHAR(20)
)
--创建course表结构
CREATE TABLE Course (
Cno CHAR(6),
Cname NVARCHAR(20) NOT NULL,
Credit TINYINT default 1,
Semester TINYINT,
PRIMARY KEY(Cno)
);
--创建sc表结构
CREATE TABLE SC (
Sno CHAR(7) NOT NULL,
Cno CHAR(6) NOT NULL,
Grade TINYINT,
PRIMARY KEY (Sno, Cno),
FOREIGN KEY (Sno) REFERENCES Student (Sno),
FOREIGN KEY (Cno) REFERENCES Course (Cno)
) ;
--往student表中插入数据
insert into student values(‘0811101‘,‘李勇‘,‘男‘,21,‘计算机系‘)
insert into student values(‘0811102‘,‘刘晨‘,‘男‘,20,‘计算机系‘)
insert into student values(‘0811103‘,‘王敏‘,‘女‘,20,‘计算机系‘)
insert into student values(‘0811104‘,‘张小红‘,‘女‘,19,‘计算机系‘)
insert into student values(‘0821101‘,‘张立‘,‘男‘,20,‘信息管理系‘)
insert into student values(‘0821102‘,‘吴宾‘,‘女‘,19,‘信息管理系‘)
insert into student values(‘0821103‘,‘张海‘,‘男‘,20,‘信息管理系‘)
insert into student values(‘0831101‘,‘钱小平‘,‘女‘,21,‘通信工程系‘)
insert into student values(‘0831102‘,‘王大力‘,‘男‘,20,‘通信工程系‘)
insert into student values(‘0831103‘,‘张姗姗‘,‘女‘,19,‘通信工程系‘)
--往course表中插入数据
insert into course values(‘C001‘,‘高等数学‘,4,1)
insert into course values(‘C002‘,‘大学英语‘,3,1)
insert into course values(‘C003‘,‘大学英语‘,3,2)
insert into course values(‘C004‘,‘计算机文化学‘,2,2)
insert into course values(‘C005‘,‘JAVA‘,2,3)
insert into course values(‘C006‘,‘数据库基础‘,4,5)
insert into course values(‘C007‘,‘数据结构‘,4,4)
insert into course values(‘C008‘,‘计算机网络‘,4,4)
--往sc表中插入数据
insert into sc values(‘0811101‘,‘C001‘,96)
insert into sc values(‘0811101‘,‘C002‘,80)
insert into sc values(‘0811101‘,‘C003‘,84)
insert into sc values(‘0811101‘,‘C005‘,62)
insert into sc values(‘0811102‘,‘C001‘,92)
insert into sc values(‘0811102‘,‘C002‘,90)
insert into sc values(‘0811102‘,‘C004‘,84)
insert into sc values(‘0821102‘,‘C001‘,76)
insert into sc values(‘0821102‘,‘C004‘,85)
insert into sc values(‘0821102‘,‘C005‘,73)
insert into sc values(‘0821102‘,‘C007‘,NULL)
insert into sc values(‘0821103‘,‘C001‘,50)
insert into sc values(‘0821103‘,‘C004‘,80)
insert into sc values(‘0831101‘,‘C001‘,50)
insert into sc values(‘0831101‘,‘C004‘,80)
insert into sc values(‘0831102‘,‘C007‘,NULL)
insert into sc values(‘0831103‘,‘C004‘,78)
insert into sc values(‘0831103‘,‘C005‘,65)
insert into sc values(‘0831103‘,‘C007‘,NULL)
select * from Student
select * from Course
select * from SC
第一章
--① 在Teacher表中添加一个职称列:列名为:Title,类型为nchar(4)。
alter table Teacher add Title nchar(4)
--② 为Teacher表中的Title列增加取值范围约束,取值范围为:{教授,副教授,讲师}。
alter table Teacher add check(Title=‘教授‘ and Title=‘副教授‘ and Title=‘讲师‘)
--③ 将Course表中Credit列的类型改为:tinyint。
alter table Course drop constraint CK__Course__Credit__0BC6C43E --删除约束
alter table Course
alter Column Credit tinyint
--④ 删除Student表中的Sid和Sdate列。
alter table Student drop constraint UQ__Student__CA1E5D79023D5A04 --删除约束
alter table Student drop constraint DF__Student__Sdate__07020F21 --删除约束
alter table Student
drop Column Sid,Sdate
--⑤ 为Teacher表添加主键约束,其主键为:Tno。
alter table Teacher add primary key(Tno)
--⑥ 在Teacher表中添加一个移动电话列:列名为:Tel,类型为普通编码定长字符串,长度为11。
alter table Teacher add Tel nchar(11)
--⑦ 在Teacher表中添加一个住址列:列名为Adrs,类型为Unicode编码变长字符串,最大长度为25。
alter table Teacher
add Adrs nvarchar(25)
--⑧ 为TC表选择适合的属性,添加Tno,cno为主键约束。
alter table TC
add constraint fk_Tno1 primary key(Tno)
alter table TC
add constraint fk_Cno1 primary key(Cno)
--⑨ 为TC表中的Tno添加引用Teacher表的外键,名为fk_tno,Cno添加引用Course表的外键,名为fk_cno。
alter table TC
add constraint fk_tno foreign key(Tno) references Teacher(Tno)
alter table TC
add constraint fk_Cno foreign key(Cno) references Course(Cno)
--⑩ 在student中插入一行数据(学号:‘0811101‘,姓名:‘李勇‘,性别:‘男‘,年龄:21,所在系:‘计算机系‘),course表中插入一行数据(课程号:‘C001‘,课程名:‘高等数学‘,开课学期:4,学分:1)、sc表中插入一行数据(学号:‘0811101‘,课程号:‘C001‘,成绩:96)
insert into Student(Sno,Sname,Ssex,Sage,Sdept)values(‘0811101‘,‘李勇‘,‘男‘,21,‘计算机系‘)
insert into Course(Cno,Cname,Credit,Semester)values(‘C001‘,‘高等数学‘,4,1)
insert into SC(Sno,Cno,Grade)values(‘0811101‘,‘C001‘,96)
insert into Student values(‘1606367‘,‘林恩‘,‘男‘,21,‘计算机系‘)
第二章
--1. 查询SC表中的全部数据。
select * from sc
--2. 查询所有学生的所在系名(不重复显示)。
select distinct sdept from student
--3. 查询计算机系学生的姓名和年龄,并按年龄升序显示结果。
select sname,sage from student
where sdept = ‘计算机系‘ order by Sage asc
--4. 查询计算机系年龄在18~20岁的男生姓名和年龄。
select sname ,sage from student
where sdept=‘计算机系‘ and sage between 18 and 20 and ssex=‘男‘
--5. 查询C001课程的最高分。
select max(grade) 最高分 from sc
where cno=‘C001‘
--6. 查询计算机系学生的最大年龄和最小年龄,并分别取别名,显示为年长和年幼。
select max(sage) 年长,min(sage) 年幼 from student
where sdept=‘计算机系‘
--7. 统计每个系的学生人数。
select sdept,count(*) 学生人数 from student
group by sdept
--8. 统计每门课程的选课人数和最高成绩。
select count(*) 选课人数,max(grade) 最高成绩 from sc
group by cno
--9. 统计每个学生的选课门数和考试总成绩,并按选课门数降序显示结果。
select sno,count(*) 选课门数,sum(Grade) 考试总成绩 from sc
group by sno
order by count(cno) desc
--10. 列出总成绩超过200的学生的学号和总成绩。
select sno,sum(Grade) 考试总成绩 from sc
group by sno
having sum(Grade)>200
--11. 查询所有姓名第二个字是“小”或“大”的学生姓名
select sname from student where Sname like ‘_小%‘ or Sname like ‘_大%‘
--12. 查询学号尾数不是1、5的的学生姓名和学号。
select sname,sno from student
where Sno not like ‘%1‘ and Sno not like ‘%5‘
--13. 查询计算机系和信息管理系学生中年龄在18-20的学生的学号、姓名、所在的系
select Sno,Sname,sdept
from student
where Sdept = ‘计算机系‘ or Sdept = ‘信息管理系‘ and Sage between 18 and 20
--14. 统计每个学生的选课门数和平均成绩,列出平均成绩大于70分学生的学号,选课门数、平均成绩、结果按平均成绩从高到低排列
select sno,COUNT(*) as 选课门数,avg(grade) as 平均成绩
from sc group by sno
having avg(grade)>70
order by avg(grade) desc
--15. 查询计算机系和信息管理系每个系的学生人数
select Sdept,COUNT(sno) as 学生人数
from student group by Sdept having Sdept=‘计算机系‘ or Sdept=‘信息管理系‘
--16. 查询选了C002课程的学生姓名和所在系。
select sname,sdept from sc join student on sc.Sno=student.sno
where cno=‘c002‘
--17. 查询考试成绩80分以上的学生姓名、课程号和成绩,并按成绩降序排列结果。
select sname,cno,grade from sc join student on sc.Sno=student.sno
where grade>80
order by grade desc
--18. 查询"计算机系"选了"JAVA"课程的学生信息,列出学生姓名、课程名和成绩
select sname,Cname,grade
from student
join sc on sc.sno=student .sno
join course on course.cno=sc.cno
where sdept=‘计算机系‘ and cname = ‘JAVA‘
--19. 查询与“计算机文化学”在同一学期开设的课程的课程名和开课学期。
select c1.Cname 课程名,c1.Semester 开课学期
from Course c1 join Course c2
on c1.Semester=c2.Semester
where c2.Cname=‘计算机文化学‘
--20. 查询成绩在70~80分的学生的学号、课程名和成绩,并按成绩降序显示结果。
select sno 学号,Cname 课程名,grade 成绩
from Course join sc
on Course.Cno = sc.Cno
where grade between 70 and 80
order by grade desc
--21. 查询哪些课程没有学生选修,列出课程号和课程名。
select c.Cno,Cname from SC s right outer
join Course c on s.Cno=c.Cno where sno is null
--22. 查询计算机系哪些学生没有选课,列出学生姓名。
select sname from SC s right outer
join student on student.sno=s.sno
where s.sno is null and sdept =‘计算机系‘
--23. 查询每个学生的选课情况,包括未选课的学生,列出学生的学号、姓名、选的课程号。
select student.sno,sname,cno from SC s right outer
join student on student.sno=s.sno
第三章
--1.查询选课门数最多的前2位学生,列出学号和选课门数。
select top 2 sno,count(cno) 选课门数
from sc
group by sno
order by count(cno) desc
--2.查询计算机系年龄最大的三个学生的姓名和年龄(包含并列的结果)。
select top 3 sname 姓名,sage 年龄
from student
group by Sname,sage,sdept
having sdept = ‘计算机系‘
order by count(sage) desc
--3.查询选了java课程的学生的学号、姓名、所在系、课程名和成绩,并对所在系进行如下处理:
--当所在系为“计算机系”时,在查询结构中显示“CS”;
--当所在系为“信息管理系”时,在查询结构中显示“IM”;
--当所在系为“通信工程系”时,在查询结构中显示“COM”;
select student.sno,sname,sdept,cname,grade,
case
when sdept=‘计算机系‘ then ‘CS‘
when sdept=‘信息管理系‘ then ‘IM‘
when sdept=‘通信工程系‘ then ‘COM‘
end as 所在系
from sc
join student on student.sno = sc.sno
join course on sc.cno = course.cno
where cname=‘JAVA‘
--4.查询计算机系学生姓名、年龄和年龄情况,其中年龄情况为:如果年龄小于20,则显示“偏小”;如果年龄在20-22,则显示“合适”;如果年龄大于22,则显示“偏大”。
select sname 姓名,sage 年龄,
case
when sage<20 then ‘偏小‘
when sage>=20 and sage<=22 then ‘合适‘
when sage>22 then ‘偏大‘
end as 年龄情况
from student where sdept=‘计算机系‘
--5.查询每位学生成绩,并将成绩换算成积点:
--其中不及格成绩和成绩为空的科目绩点为0,
--其他成绩十位上的数即为积点
--(60分的积点是6;78分的积点是7;89分的积点是8),
--同时对每位同学的积点进行统计,
--列出学号,
--总绩点并按总积点的降序排列
select sname,
case
when Grade<60 and Grade is null then 0
when Grade>=60 and Grade <70 then 6
when Grade>=70 and Grade <80 then 7
when Grade>=80 and Grade <90 then 8
when Grade>=90 and Grade <=100 then 9
end as 科目绩点 into JiDian
from sc
join student on student.sno = sc.sno
join course on sc.cno = course.cno
select sname 姓名,SUM(科目绩点)
from JiDian
group by sname
order by SUM(科目绩点) desc
--6.查询计算机系选了java课程的学生姓名、所在系和考试成绩,并将结果保存到新表
select sname,sdept,grade
into NewGrid
from sc
join student on student.sno = sc.sno
join course on sc.cno = course.cno
where Sdept = ‘计算机系‘ and Cname = ‘JAVA‘
--7.统计每个系的女生人数,并将所在系和人数结果保存到新表Girls中(此表为全局临时表);
--通过Girls表查询计算机系的女生人数,列出系名和人数。
select Sdept as sdept,COUNT(sno) as num
into ##Girls
from student where Ssex=‘女‘
group by sdept
select sdept,num
from ##Girls
where sdept = ‘计算机系‘
--用子查询实现以下题目(10-15题)
--8.查询选了“C001”课程的学生姓名和所在系。
select sname 姓名,sdept 所在系
from student
where sno in
( select sno
? from Course join SC on Course.Cno = SC.cno
? where course.Cno=‘C001‘
)
--9.查询计算机系成绩80分以上的学生的学号和姓名。
select Sno 学号,Sname 姓名
from student
where sdept = ‘计算机系‘ and sno in
( select sno
? from sc
? where grade>=80
)
--10.查询计算机系考试成绩最高的学生的姓名。
select Sname 姓名
from student join SC on student.Sno = SC.sno
where sdept = ‘计算机系‘ and grade=
( select top 1 grade
? from sc
)
--11.查询年龄最大的男生的姓名、所在系和年龄。
select Sname 姓名,Sdept 所在系,sage 年龄
from student
where ssex = ‘男‘ and sage in
( select top 1 sage
? from student
)
--12.查询C001课程的考试成绩高于该课程平均成绩的学生的学号和成绩。
select student.Sno 学号,grade 成绩
from student join sc on student.sno = sc.sno
where cno =‘C001‘ and grade >
( select AVG(grade)
? from sc
? where cno =‘C001‘
? group by cno
)
--13.查询计算机系学生考试成绩高于计算机系学生平均成绩的学生的姓名、考试的课程名和考试成绩。
select student.Sno 学号,cname 课程名,grade 成绩
from sc
join student on student.sno = sc.sno
join course on course.cno = sc.cno
where Sdept=‘计算机系‘ and grade >
( select AVG(grade)
? from sc
? join student on student.sno = sc.sno
? where Sdept=‘计算机系‘
)
--采用exists查询完成以下题目(14-16题)
--14.查询选了java课程的学生的姓名,学号和所在的系(采用exists查询)
select Sname 姓名,student.Sno 学号,Sdept 系别 from student
where exists
( select * from sc
? where exists
? (
? select *
? from course
? where cno =sc.cno and Cname =‘JAVA‘
? ) and Sno = student.sno
)
--15.查询选修了“C002”号课程的学生姓名
select Sname 姓名 from student
where exists
( select * from sc
? where exists
? (
? select *
? from course
? where cno =sc.cno and cno =‘C002‘
? ) and Sno = student.sno
)
--16.查询选了JAVA课程的学生姓名和所在系
select Sname 姓名,Sdept 系别 from student
where exists
( select * from sc
? where exists
? (
? select *
? from course
? where cno =sc.cno and Cname=‘JAVA‘
? ) and Sno = student.sno
)
--17.每位同学将各自的信息插入到student表中,包括学号、姓名、性别、年龄和所在的系
insert into student values(1606367,‘林恩‘,‘男‘,21,‘计算机系‘)
--18.创建一张表,表名为每位同学各自的学号(如s211506999)
--表结构包括(姓名、选的课程名和考试成绩);
--将计算机系每个学生的姓名、选的课程名和考试成绩插入到此表中。
create table s211606367
(
? sname varchar(20),
? cname varchar(40),
? grade tinyint
)
insert into s211606367
select sname,cname,grade
from sc
join student on student.sno = sc.sno
join course on course.cno = sc.cno
where Sdept =‘计算机系‘
--19.将所有选修C001课程的学生的成绩加10分。
update SC set grade = grade+10
where sno in
( select sno
? from Course join sc on sc.Cno = Course.cno
? where sc.cno=‘C001‘
)
--20.将计算机系所有学生的“计算机文化学”的考试成绩加10分。
update SC set grade = grade+10
where sno in
( select sc.sno
? from sc join Course on sc.Cno = Course.cno
? join student on sc.sno = student.sno
? where cname=‘计算机文化学‘ and Sdept = ‘计算机系‘
)
--21.修改“java”课程的考试成绩,如果是通信工程系的学生,则增加10分;如果是信息管理系的学生则增加5分,其他系的学生不加分。
update SC set grade = grade+
case sdept
when ‘通信工程系‘ then 10
when ‘信息管理系‘ then 5
else 0
end
from student join SC on student.Sno =SC.Sno
join course on course.cno=sc.cno
where cname=‘JAVA‘
--22.删除成绩成绩为空的学生的选课记录。
delete from SC
where Grade is null
--23.删除信息管理系“高等数学”考试成绩不及格学生的“高等数学”选课记录。
delete from SC
where Sno in
( select distinct sc.sno
? from student join SC on student.Sno =SC.Sno
? join course on course.cno=sc.cno
? where Sdept=‘信息管理系‘ and Cname=‘高等数学‘ and Grade<60
)
--24.删除“java”考试成绩最低的学生的java修课记录。
delete from SC
where grade in
( select MIN(grade)
? from student join SC on student.Sno =SC.Sno
? join course on course.cno=sc.cno
? where Cname=‘JAVA‘
)
--25.删除没人选的课程的基本信息。
delete from course
where cno in
( select Course.cno
? from sc right outer join course on course.cno=sc.cno
? where sc.Cno is null
)
第四章
--1、索引:写出实现下列操作的SQL语句,并执行所写代码。
--(1)在Student表上为Sname列建立一个聚集索引,索引名为:IdxSname。(提示:若执行创建索引的代码,请先删除该表的主键约束,及sc表的外键约束)
alter table Sc drop constraint FK__SC__Sno__0AD2A005 --先删除外键约束
alter table Student drop constraint PK__Student__CA1FE4647F60ED59 --再删除本表约束
create clustered index IdxSname on Student(Sname)
--(2)在Course表上为Cname列建立一个唯一的非聚集索引,索引名为:IdxCN。(注:写出sql语句,如果执行报错,请说明报错原因就可以)
create unique nonclustered index IdxCN on Course(Cname)
--(3)在SC表上为Sno和Cno建立一个组合的聚集索引,索引名为:IdxSnoCno。
alter table sc drop constraint PK__SC__E600025308EA5793
create clustered index IdxSnoCno on sc(sno,cno)
--(4)删除Sname列上建立的IdxSname索引。
drop index Student.IdxSname
--2、视图:写出创建满足下述要求的视图的SQL语句,并执行所写代码。
--(1)查询学生的学号、姓名、所在系、课程号、课程名、课程学分,视图名为V_STU_SC_CO。
create view V_STU_SC_CO(sno,sname,sdept,cno,cname,credit)
as
select student.sno,sname,sdept,course.cno,cname,credit
from SC join Student on student.Sno = SC.Sno
join Course on SC.Cno = Course.cno
--(2)查询学生的学号、姓名、选修的课程名和考试成绩,视图名为V_SNO_GRADE。
create view V_SNO_GRADE(sno,sname,cname,grade)
as
select student.sno,sname,cname,grade
from SC join Student on student.Sno = SC.Sno
join Course on SC.Cno = Course.Cno
--(3)统计每个学生的选课门数,要求列出学生学号和选课门数,视图名为V_COUNT。
create view V_COUNT(sno,cnamecount)
as
select sno,COUNT(cno)
from SC
group by sno
--(4)统计每个学生的修课总学分,要求列出学生学号和总学分(说明:考试成绩大于等于60才可获得此门课程的学分),视图名为V_COUNT_CREIT。
create view V_COUNT_CREIT(sno,countcredit)
as
select sno,SUM(credit)
from sc
join Course on SC.Cno = Course.cno
where Grade>=60
group by sno
--3、利用第2题建立的视图,完成如下查询。
--(1)查询考试成绩大于等于90分的学生的姓名、课程名和成绩。
select sno,cname,grade
from V_SNO_GRADE
where Grade>=90
--(2)查询选课门数超过3门的学生的学号和选课门数。
select sno 学号,COUNT(cno) 选课门数
from V_STU_SC_CO
group by sno
having COUNT(cno)>3
--(3)查询计算机系选课门数超过3门的学生的姓名和选课门数(提示:物理表和视图连接)。
select sname 姓名,cnamecount 选课门数
from V_COUNT
join student on V_COUNT.sno = student.sno
where student.Sdept = ‘计算机系‘ and cnamecount>3
(4)定义的视图,使其查询每个学生的学号、总学分以及总的选课门数。
alter view V_COUNT_CREIT(sno,countcredit,countcno)
as
select sno 学号,SUM(credit) 总学分,COUNT(sc.cno) 总选课门数
from sc
join Course on SC.Cno = Course.cno
where Grade>=60
group by sno
--5、创建满足如下要求的触发器。
--(1)限制学生的考试成绩必须在0-100之间,,触发器名称为tri_grade(使用后触发型)。
create trigger tri_grade
on sc after insert
as
if(select grade from sc
where grade in (select grade from inserted))<0
or (select grade from sc
where grade in (select grade from inserted))>100
rollback
--(2)限制不能删除成绩不及格的考试记录,触发器的名称为tri_less60(使用后触发型)。
create trigger tri_less60
on sc after delete
as
if exists(select * from deleted
where grade<60)
rollback
--(3)限制每个学生每学期选的课程不能超过5门,触发器名称tri_count(使用前触发型)。
create trigger tri_count
on sc instead of insert
as
if (select count() from sc
where sno in (select sno from inserted))<5
insert into sc select from inserted
--6、创建满足如下要求的存储过程。
--(1)查询每个学生的修课总学分,要求列出学生学号及总学分,存储过程名为p1。
create procedure p1
as
select sno 学号,sum(credit) 总学分
from SC join course on sc.cno = course.cno
group by sno
--(2)查询学生的学号、姓名、选修的课程号、课程名、课程学分,
--将学生所在的系作为输入参数,默认为”信息管理系“,执行此存储过程,
--查询“计算机系”情况,存储过程名为p2。
create procedure p2
@sdept char(20) = ‘信息管理系‘
as
select student.sno 学号,sname,sc.cno,cname,credit
from SC join course on sc.cno = course.cno
join student on sc.sno=student.sno
where sdept=@sdept
exec p2‘计算机系‘
--(3)创建存储过程,查询指定系的男生人数,
--其中系为输入参数,人数为输出参数,存储过程名为p3,
--执行存储过程,查询计算机系的男生人数。
create procedure p3
@sdept char(20),
@number char(7) output
as
select @number=count(sno)
from student
where sdept=@sdept and ssex=‘男‘
declare @number int
exec p3‘计算机系‘,@number output
print @number
--(4)创建存储过程用于修改指定课程的开课学期。
--输入参数为:课程号和修改后的开课学期,
--存储过程名陪p4,执行该存储过程,修改c001的课程为第4学期开课。
create procedure p4
@cno char(6),@Semester tinyint
as
update course set Semester = @Semester
where cno = @cno
exec p4‘c001‘,4
原文地址:https://www.cnblogs.com/mumuyinxin/p/10482304.html