USE student_sql
/*定义一个变量,显示其值*/
DECLARE @_A TINYINT
SET @_A =45
SELECT @_A
/*定义一个字符串,为其赋值"Welcome to HQU”*/
DECLARE @_B CHAR(20)
SET @_B ='Welcome to HQU'
SELECT @_B
/*创建局部变量@_SNO(学号)并赋值为某个学号,
然后输出数据库学生表中等于该值的学生的学号、
姓名、性别、所属院系信息;***************/
DECLARE @_SNO CHAR(10)
SET @_SNO ='S001'
SELECT * FROM Student
WHERE Snum = @_SNO
/*计算选课表中学生最高成绩和最低成绩之差,并将结果付给@_drop*/
DECLARE @_SCORE_MAX INT ,@_SCORE_MIN INT
SELECT @_SCORE_MAX =MAX(Score) FROM SC
SELECT @_SCORE_MIN =MIN(Score) FROM SC
SELECT @_SCORE_MAX - @_SCORE_MIN
/*调用全局变量,查询当前数据库服务器名*/
SELECT @@SERVERNAME
/*查询当前数据库服务器名*/
SELECT @@SERVERNAME
/*定义一标量函数,数据库中创建一个标量值函数Sum(n),求1+2+…+n之和。并用相关数据进行测试。*/
GO
CREATE FUNCTION SUN(@_N INT) RETURNS INT
AS
BEGIN
DECLARE @_SUU INT
SET @_SUU =0--变量必须赋初值
WHILE (@_N >0)
BEGIN
SET @_SUU = @_SUU + @_N
SET @_N = @_N -1
END
RETURN @_SUU
END
GO
drop function SUN
SELECT dbo.SUN(100)/*定义一标量函数,按系别统计当前所有学生的平均年龄,并调用该函数。
提示:AVG,DATEDIFF。并调用该函数,系别自选。********************/
CREATE FUNCTION WE(@_RR CHAR(10)) RETURNS INT
AS
BEGIN
DECLARE @EE INT
SET @EE =0
SELECT @EE=AVG(DATEDIFF(YEAR,Sbirth,2018)) FROM Student
WHERE Sdept = @_RR
RETURN @EE
END
DROP FUNCTION WE
SELECT dbo.WE('计算机')/*定义一表值函数,通过姓名查询某学生的学号、性别、所属院系、选修课程名及成绩。*/
CREATE FUNCTION RR(@TT CHAR(10)) RETURNS TABLE
AS
RETURN
SELECT Snum,Ssex,Sdept,Cnum,Score FROM Student,SC
WHERE SC.Sunm = Student.Snum AND Sname= @TT
DROP FUNCTION RR
SELECT dbo.RR('李勇')/*创建一个无参存储过程pro_StuScore,查询以下信息:班级、学号、姓名、性别、课程名称、考试成绩。*/
CREATE PROC pro_StuScore
AS
SELECT Snum,Sname,Ssex,Cname,Score FROM Student,SC,Couse
WHERE Student.Snum=SC.Sunm AND SC.Cnum=Couse.Cnum
EXEC pro_StuScore
DROP pro_StuScore
/*创建查询每个学生的修课总学分的存储过程pro_sumcredit,
要求列出学生学号及总学分。提示:sum聚和函数,多表连接。*/
CREATE PROC pro_sumcredit
AS
SELECT Sunm,SUM(Score) FROM SC
GROUP BY Sunm
DROP pro_sumcredit
EXEC pro_sumcredit
/*查询学生的学号、姓名、选修的课程号、课程名、课程学分,
将学生所在院系作为输入参数,默认值“计算机”。
执行此存储过程,并分别指定一些不同的输入参数值,
比如:没有给任何输入参数,输入参数为“信息”、“生物工程”等查看执行结果。*/
CREATE PROC MM @TT CHAR(10)='计算机'
AS
SELECT Snum,Sname,Cname,Ccredit FROM Student,SC,Couse
WHERE Student.Snum=SC.Sunm AND SC.Cnum= Couse.Cnum AND Sdept=@TT
DROP MM
EXEC MM
DECLARE @PPU CHAR(10)
SET @PPU ='生物工程'-- EXEC MM @PPU
/*创建存储过程,查询指定系的男生人数,其中系为输入参数,人数为输出参数。*/
CREATE PROC CC @VV CHAR(10),@FF INT OUTPUT
AS
SELECT @FF=COUNT(*) FROM Student
WHERE Sdept=@VV AND Ssex='男'
DROP CC
DECLARE @J INT ,@KKJ CHAR(10)
SET @J=0
SET @KKJ='计算机'
EXEC CC @KKJ,@J OUTPUT
SELECT @J
/*创建触发器,限制学生的出生年龄必须在1999~2000年之间。
(拓展选做题:限制学生的年龄在15-45之间。)*/
CREATE TRIGGER NN ON Student
FOR INSERT
AS
DECLARE @SAGE AS DATETIME
SELECT @SAGE = i.Sbirth FROM inserted i
IF @SAGE>2000 OR @SAGE <1999
BEGIN
PRINT '不允许'
ROLLBACK TRAN
END
ELSE PRINT '插入成功'
INSERT INTO Student VALUES ('S0022','李勇','男','计算机','2000.3.25',180808081,'福建')
INSERT INTO Student VALUES ('S0022','李勇','男','计算机','1999.3.25',180808081,'福建')/*(拓展选做题:限制学生的年龄在15-45之间。)*/
CREATE TRIGGER NN ON Student
FOR INSERT
AS
DECLARE @SAGE AS DATETIME
SELECT @SAGE = i.Sbirth FROM inserted i
DECLARE @JKJ INT
SET @JKJ =DATEDIFF(YEAR,@SAGE,2019)
IF @JKJ>45 OR @JKJ <15
BEGIN
PRINT '不允许'
ROLLBACK TRAN
END
ELSE PRINT '插入成功'/*限制每个学期开设的课程总学分在20-30范围内*/
CREATE TRIGGER hh ON Couse
FOR INSERT
AS
DECLARE @JJJ AS INT
SELECT @JJJ = i.Ccredit FROM inserted i
IF @JJJ>30 OR @JJJ <20
BEGIN
PRINT '不允许'
ROLLBACK TRAN
END
ELSE PRINT '插入成功'
INSERT INTO Couse VALUES ('c084','大学英语',3,1,'必修','T001')/*当删除表student中的记录时,自动删除表sc中对应学号的记录。*/
CREATE TRIGGER FF ON Student
FOR DELETE
AS
DECLARE @BBB AS CHAR(10)
SELECT @BBB = d.Snum FROM deleted d
IF EXISTS (SELECT Sunm FROM SC
WHERE Sunm=@BBB)
DELETE FROM SC WHERE Sunm=@BBB
DELETE FROM Student WHERE Snum='s0011'/*(instead of触发器)创建一视图学生表下的Student_view,包含学号、姓名、课程号、课程名、成绩等属性,
在Student_view上创建一个触发器Grade_moidfy,当对Student_view中的学生的成绩进行修改时,
实际修改的是选课表中的相应记录。************************************************************/
CREATE VIEW stu_CS AS SELECT Snum,Sname,Cname,Score FROM Student,Couse,SC
WHERE Student.Snum=SC.Sunm AND SC.Cnum=Couse.Cnum
DROP VIEW stu_CS
CREATE TRIGGER Grade_moidfy ON stu_CS
INSTEAD OF INSERT
AS
DECLARE @_Snum CHAR(10),
@_Sname CHAR(10),
@_Cname CHAR(10),
@_Score INT
SET @_Snum=(SELECT Snum FROM inserted)
SET @_Sname=(SELECT Sname FROM inserted)
SET @_Cname=(SELECT Cname FROM inserted)
SET @_Score=(SELECT Score FROM inserted)
INSERT SC
VALUES(@_Snum,NULL,@_Score)
INSERT stu_CS VALUES('S66',NULL,NULL,NULL,55)---------------查看数据库已有触发器
SELECT name FROM sysobjects WHERE name='FF'and xtype='TR'-- 查看单个触发器内容
exec sp_helptext 'FF'