操作4:三张表的连接查询。查询“信息管理系”修了“计算机文化学” 的学生姓名和成绩。
SELECT Sname, Grade FROM Student s JOIN SC ON s.Sno = SC. Sno JOIN Course c ON c.Cno = SC.Cno WHERE Dept = '信息管理系' AND Cname = '计算机文化学'
操作5:综合使用聚合函数、多表连接、分组。
有分组和行选择条件的多表连接查询。统计计算机系学生每门课程的选课人数、平均成绩、最高成绩和最低成绩。
SELECT Cno, COUNT(*) AS Total,
AVG(Grade) as AvgGrade,
MAX(Grade) as MaxGrade,
MIN(Grade) as MinGrade
FROM Student S JOIN SC ON S.Sno = SC.Sno
WHERE Dept = '计算机系'
GROUP BY Cno
4.索引
4.1 创建索引
语法:
create [ unique ] [ clustered | nonclustered ] index 索引名
on { 表名 | 视图名 } ( 列名 [ asc | desc ] [ , ...n ] )
注意:
1.一个表中只能创建1个聚集索引。(由于系统已自动在主键上创建了聚集索引,所以用户不能再创建,除非先删除已有的索引,重新创建)
2.一个表中可以创建若干个非聚集索引。
操作:在kc表中,重新创建名为“ix_kcm”的索引,使其成为惟一性的非聚集索引
create unique index ix_kcm on kc ( 课程名 desc) with drop_existing --删除已存在的索引,创建新的索引
4.2 删索引
语法:drop index {表名 . | 视图名 . } 索引名 [ , … n ]
注意:
SQL Server系统自动建立的索引不能用drop index删除,只能用alter table语句中的drop constraint子句来解除加在该字段上的主键约束或惟一性约束,这些约束一解除,相关的索引也就被删除了。
4.3 查看索引
语法:[exec] sp_helpindex {表名 | 视图名 }
5.视图
5.1 视图介绍
5.1.1 视图的含义和作用
视图是基于某个查询结果的虚表。是用户查看和修改数据表中数据的一种方式。每个视图都有几个被定义的列和多个数据行。
5.1.2 视图与基本表
1.视图中的数据列和行来源于其所引用的基表。
2.视图所对应的数据并不实际存储在数据库中,而是仍存储在视图所引用的基表中。
3.数据库中只存储视图的定义。
5.1.3 使用视图的目的与好处
1.聚焦特定数据:使用户只能看到和操作与他们有关的数据,提高了数据的安全性。
2.简化数据操作:使用户不必写复杂的查询语句就可对数据进行操作。
3.定制用户数据:使不同水平的用户能以不同的方式看到不同的数据。
4.合并分离数据:视图可以从水平和垂直方向上分割数据,但原数据库的结构保持不变。
5.2 创建视图
语法:
create view 视图
[ (列名表) ]
[ with encryption ] --用于 加密视图的定义,用户只能查看不能修改。
as
select查询语句
[ with check option ] --强制所有通过是同修改的数据,都要满足select语句中指定的条件
操作1:创建一个 名为“v1”的视图,用于查询计算机网络专业男生的学号、姓名、出生日期,并将视图的列名分别改为:学生学号、男生姓名、生日。
create view v1 (学生学号,男生姓名, 生日)
as
select 学号, 姓名, 出生日期 from xsqk
where 专业名=‘计算机网络’ and 性别=1
go 使用视图
select * from v1
5.3 修改视图
语法:alter view 视图
[ (列名表) ]
[ with encryption ]
as
select查询语句
[ with check option ]
操作:在“v1”的视图中增加两列:专业名和所在系。
alter view v1
(学生学号,男生姓名,生日,专业,系)
as
select 学号,姓名,出生日期,专业名,所在系
from xsqk
where 专业名=‘计算机网络’ and 性别=1
)
5.4 删除视图
语法: drop view 视图名[ ,……n ]5.5 通过视图管理表中的数据
5.5.1 使用视图插入数据
注意:
1.可通过视图向基表中插入数据,但插入的数据实际上存放在基表中,而不是存放在视图中。
2.如果视图引用了多个表,使用insert语句插入的列必须属于同一个表。
3.若创建视图时定义了“with check option”选项,则使用视图向基表中插入数据时,必须保证插入后的数据满足定义视图的限制条件。
操作1:向“V1”视图中添加两条记录。
insert into v1 values(‘020106’,‘张三’,‘1981-04-22’,‘计算机网络’,‘计算机’) insert into v1 values(‘020107’,‘张四’,‘1981-07-08’,‘信息安全’,‘计算机’)
5.5.2 使用视图删除数据
注意:
1.要删除的数据必须包含在视图的结果集中。
2.如果视图引用了多个表时,无法用delete命令删除数据。
语法:
delete from 视图名 [ where 条件]
操作:删除“V1”视图中学号为‘020108’的记录。
delete from V1 where sno = ‘020108’
6.存储过程和触发器
6.1 存储过程
存储过程实际上就是数据库里的函数6.1.2 创建并执行存储过程
创建存储过程语法:
CREATE PROC[EDURE] 存储过程名
[ { @参数名 数据类型 } [ = default ] [OUTPUT] ] [ , … n ]
AS SQL语句 [ … n ]
执行存储过程
语法:
[ EXEC [ UTE ] ] 存储过程名 [实参 [, OUTPUT] [, … n] ]
6.1.3 不带参数的存储过程
操作:查询计算机系学生的考试情况,列出学生的姓名、课程名和考试成绩。
CREATE PROCEDURE p_StudentGrade1
AS
SELECT Sname, Cname, Grade
FROM Student s INNER JOIN SC
ON s.Sno = SC.Sno INNER JOIN Course c
ON c.Cno = sc.Cno
WHERE Dept = '计算机系' 执行:
EXEC p_StudentGrade1
6.1.4 使用输入参数
语法:create proc[edure] 存储过程名
@形参 数据类型 [=默认值] ,…n
as SQL语句
执行:
[execute] 存储过程名 [ @实参= ] 值 ,…n
注意:
执行存储过程时输入参数的传递方式由三种(让我想到了python ^_^)
1.按位置传递:直接给出参数的值,实参与形参一一对应
2.通过参数名传递:使用“参数名=参数值“的形式,参数可以任意顺序给出
3.如果在定义存储过程时为参数指定了默认值,则在执行存储过程时可以不为有默认值的参数提供值。
操作:创建并执行带输入参数的存储过程p_x