数据库期末复习资料(sql语句,触发器,存储过程)
- 格式:doc
- 大小:40.00 KB
- 文档页数:6
实验12 触发器一、验证本章的所有实例(截图以示每个实例的执行结果)二、为学生成绩管理数据库的department表编写以下触发器(将所使用的T-SQL语句粘贴到每个小题后)(提示:inserted和deleted表不能直接被读取,所以inserted和deleted表的读取也只能在触发器中实现)(1)编写一个insert触发器tr_insert,实现显示department表、inserted和deleted 表的功能。
然后向department表中添加一条departname为“计算机”的记录和一条departname为“外语”的记录,验证触发器的执行(2)编写一个delete触发器tr_delete,实现显示department表、inserted和deleted 表的功能。
然后删除department表中departname为“计算机”的记录,验证触发器的执行(3)编写一个update触发器tr_update,实现显示department表、inserted和deleted 表的功能。
然后将department表中departname为“外语”的记录的departname字段改为“大英部”,验证触发器的执行(4)删除触发器tr_update三、完成本章工作训练营中的题目四、拓展:创建禁止用户login_test登录的触发器步骤提示:1、准备工作:(1)修改登录方式为混合模式(2)创建一个登录用户login_test2、创建一个服务器级别的登录触发器参考代码如下:if exists (SELECT * FROM sys.server_triggers where name= 'logon_verif') Drop Trigger logon_verif On All ServergoCREATE TRIGGER logon_verifON ALL SERVERFOR LOGONASBEGINdeclare @loginName nvarchar(60)set @loginName=EVENTDATA().value('(/EVENT_INSTANCE/LoginName)[1]','nvarchar(60)') if ( @loginName='login_test')BEGINrollbackEndend3、禁用该触发器,使用用户login_test登录,能否成功?4、启用该触发器,验证用户login_test能否成功登录(截图以示结果)。
项目一:1、什么是数据库?数据库:DataBase简写DB,是按照一定的数据结构来组织、存储和管理数据的集合。
2、数据库的特点:数据结构化、数据共享、数据独立性高、数据统一管理与控制。
3、数据库系统的组成:DataBase System简写DBS,由数据库、数据库管理系统(DBMS)和数据库应用程序组成。
4、SQL语言的特点:SQL是结构化查询语言,是一种数据库查询语言和程序设计语言,主要用于管理数据库中的数据。
它是关系型数据库语言的标准。
5、SQL语言的组成:数据定义语言DDL、数据操作语言DML、数据查询语言DQL、数据控制语言DCL6、数据库中的操作都是通过SQL语句来完成的。
项目二:1、创建数据库的命令:create database 库名character set 字符集名collate 校对规则名;2、显示字符集:show character set; 显示校对规则:show collation;3、语法格式中可选项符号:[ ] 表示二选一:|4、MySQL中代码的书写不区分大小写5、显示数据库:show databases 显示数据表:show tables6、显示数据库创建语句的语法格式:SHOW CREATE DATABASE 数据库名;显示表的创建语句的语法:show create table 表;显示视图的创建语句的语法:show create view 视图名7、删除数据库的命令:DROP DATABASE 数据库名删除数据表的命令:DROP TABLE 表名删除视图的命令:DROP VIEW 视图名8、选择数据库语法格式:USE 数据库名;**创建表前,要先使用use db语句打开库9、查看当前所选的数据库:SELECT DATABASE();项目三:1、在表定义的过程中,字段定义之间用逗号隔开。
2、查看表结构:DESC 表名;查看表中某一列的信息:DESC 表名列名;3、复制数据表的语法格式: 1. CREATE TABLE 新表名LIKE 参照表名2、CREATE TABLE 新表名AS (select语句)4、修改列的数据类型:ALTER TABLE 表名MODIFY 字段名数据类型;5、添加新列:ALTER TABLE 表名项目四:ADD 新字段数据类型[FIRST | AFTER 列名]1、insert 命令可以插入一条记录也可以同时输入多条记录。
sql期末考试题及答案SQL期末考试题及答案一、选择题(每题2分,共20分)1. SQL代表什么?A. Structured Query LanguageB. Simple Query LanguageC. Standard Query LanguageD. Streamline Query Language答案:A2. 在SQL中,用于查询数据的命令是什么?A. SELECTB. INSERTC. UPDATED. DELETE答案:A3. 下列哪个不是SQL的数据类型?A. INTB. CHARC. IMAGED. DATE答案:C4. SQL中的主键约束是什么?A. 唯一性约束B. 非空约束C. 默认值约束D. 检查约束答案:A5. SQL语句中,用于插入数据的命令是什么?A. SELECT INTOB. INSERT INTOC. UPDATED. DELETE答案:B6. 下列哪个不是SQL中的聚合函数?A. COUNTB. AVGC. SUMD. DISTINCT答案:D7. SQL中的外连接是什么?A. INNER JOINB. LEFT JOINC. RIGHT JOIND. OUTER JOIN答案:D8. SQL中的事务是什么?A. 一组SQL语句的集合B. 一个数据库表C. 一个数据库视图D. 一个数据库索引答案:A9. SQL中的视图是什么?A. 一个数据库表B. 一个数据库索引C. 一个虚拟的数据库表D. 一个数据库存储过程答案:C10. SQL中的存储过程是什么?A. 一组预先编写好的SQL语句B. 一个数据库表C. 一个数据库视图D. 一个数据库触发器答案:A二、简答题(每题5分,共30分)1. 解释SQL中的主键和外键的区别。
答案:主键是表中用来唯一标识每条记录的字段,不能有重复值,也不能为NULL。
外键是一个表中的字段,它对应于另一个表的主键,用于维护两个表之间的链接。
SQL期末复习学第⼆学期SQL期末复习考核知识点:第⼀章:数据库的基础知识1)数据库概述:定义2)数据库系统:构成、核⼼3)关系模型:记录、属性、字段等概念第三章:SQL 的基础知识1)SQL的数据类型:基本类型的种类与使⽤⽅法2)标⽰符:⾃定义标⽰符的规则3)使⽤SQL语句管理与维护数据库:创建、修改、删除数据库的SQL语句4)使⽤SQL语句管理与维护表:创建、修改、更新、删除的操作5)利⽤简单的SQL语句进⾏表格数据的查询:简单select 语句第四章:SQL ⾼级查询1)关联表查询2)UNION⼦句的使⽤3)⼦查询(IN)与连接查询(LEFT/RIGHT/FULL JION)第五章:视图1)视图的概述2)创建视图、使⽤与维护视图第六章:索引1)索引的概述2)索引的分类第七章:T-SQL 程序设计1)T-SQL的变量类型与表⽰⽅法2)程序流程控制语句:(BEGIN END、IF ELSE、WHILE)第⼋章:函数1)系统内置函数2)⾃定义函数的使⽤第九章:存储过程、触发器和游标1)系统存储过程与⾃定义存储过程的使⽤2)触发器的概述与使⽤第⼗⼀章:SQL 数据库的安全性管理1)SQL的安全性机制2)登陆账号、⽤户账号、⾓⾊等概念的理解第⼗⼆章:数据的备份与恢复数据的备份⽅法与恢复期末复习综合测试题1. 数据库系统的核⼼是()。
A. 编译系统B. 数据库C.操作系统D.数据库管理系统2. 关系模型中的数据逻辑结构是()。
A. 矩阵B. 树C. ⼆维表D.⽮量3. 关系数据库中的关键字是指( )。
A.能惟⼀决定关系的字段B.不可改动的专⽤保留字C.关键的很重要的字段 D能惟⼀标识元组的属性或属性集合4. 对所有视图都可以进⾏。
A.select B. insert C. update D. delete5. 学⽣社团可以接纳多名学⽣参加,但每个学⽣只能参加⼀个社团,从社团到学⽣之间的联系类型是()。
《SQL Server数据库技术与应用》期末复习一、单项选择题(每小题2分,共20分)1.“借书日期必须在还书日期之前”这种约束属于数据库的()功能。
A.恢复B.并发控制C.完整性D.安全性C.完整性2.在数据中,产生数据不一致的根本原因是()。
A.没有严格保护数据B.数据存储量太大C.数据间联系弱D.数据冗余D.数据冗余3.次数据文件用于存储不能存在主数据文件中的数据,默认扩展名为()。
A..ndf B..mdf C..log D..datA..ndf4、若要求查找‘’姓学生的学生号和,正确的SQL语句是( B )。
A. SELECT S#,SNAME FROM S WHERE SNAME=’%’B. SELECT S#,SNAME FROM S WHERE SNAME LIKE ’%’C. SELECT S#,SNAME FROM S WHERE SNAME=’%%’D.SELECT S#,SNAME FROM S WHERE SNAME LIKE ’%%’5.通过CREATE TABLE语句或者其他方法创建了一个表后,可以使用()语句在表中添加记录。
A.DELETE B.INSERT C.UPDATE D.INSEATERB.INSERT6.在关系数据库系统中,一个关系就是()。
A.一二维表B.一条记录C.一个关系数据库D.一个关系代数运算A.一二维表7.语句SELECT ,性别,出生日期FROM student_info返回()列。
A.1 B. 2 C.3 D.4C.38.语句SELECT 1.2*0.5的结果是()。
A.NULL B.1 C.0 D.0.6D.0.69.在关系数据库系统中,为了简化用户的查询操作,而又不增加数据的存储空间,常用的方法是创建(c )。
A.另一个表B.游标C.视图D.索引5.一个查询的结果成为另一个查询的条件,这种查询被称为()。
A.连接查询B.查询C.自查询D.子查询D.子查询10.为了对表中的各行进行快速访问,应对此表建立()。
1、数据处理概念:就是利用计算机对各种类型的数据库进行加工处理。
它包括对数据库的采集,整理,存储,分类,排序,检索,维护,加工,统计和传输等一系列操作过程。
数据管理技术发展的三个阶段:人工管理阶段,文件系统阶段,数据库系统阶段2、从客观世界到计算机世界,数据的转换过程:任何数据的处理都是在反应客观事物属性和运动状态以及满足用户需求的基础上进行的。
3、概念模型的表示(E-R模型):概念模型又称实体联系模型,主要用于描述信息世界中实体的联系。
关系数据库:一个关系视为一张二维表,关系之间的联系是通过一个关系的候选键或主键和另一个关系的外键建立的。
关系模型的基本特征:关系模型是用“二维表”表示事物间的联系。
码的作用:唯一的标识出实体集中的某一个实体。
码有以下几种:超码,候选码,主码,外码4、数据库系统的三级模式:外模式(有多个),模式(基本表),内模式(存储结构)5、SQLSERVER的4个版本对软件和硬件的要求:企业版:支持SQL Server中的所有功能,支持TB级的数据库,可用于web站点和大型企业管理,支持数据仓库所需性能。
标准版:所具有的功能足可以满足普通企业或部门的需求,支持GB级的数据库。
个人版:用于大多数时间与网络断开,而且所运行的应用程序需要SQL Server存储数据的移动用户。
6、数据库管理系统(DBMS)由三个部分组成:DDL DML DCL P17 详细看7、SQLSERVER2000采用C/S客户/服务器。
C/S的计算模型分为两层和多层。
两层C/S机构容易引起胖客户的问题。
8、数据库设计归纳为几个阶段:(1)需求分析阶段,(2)概念设计阶段,(3)逻辑结构设计阶段,(4)物理结构设计阶段,(5)实施阶段,(6)使用与维护阶段。
9、P36,SQLSERVER的几个主要组件:SQL Server是由一系列相互协调的组件构成,主要有服务管理器,企业管理器,查询分析器。
其中负责启动、暂停和停止SQL Server的4种服务的是服务管理器;对本地或远程服务器进行管理操作的应用程序是:企业管理器。
存储过程与触发器概念及应用考试(答案见尾页)一、选择题1. 存储过程是什么?A. 一种数据库对象,用于存储逻辑操作B. 一种数据库对象,用于存储查询语句C. 一种数据库对象,用于存储流程控制语句D. 一种数据库对象,用于存储数据2. 触发器的作用是什么?A. 在数据库中插入、更新或删除数据前自动执行的程序B. 在数据库中创建、修改或删除表C. 用于数据完整性约束D. 用于权限管理3. 存储过程和触发器都存放在以下哪个对象中?A. 数据库B. 表C. 索引D. 视图4. 存储过程可以通过哪种方式调用?A. SQL语句B. 外部程序调用C. 内部程序调用D. 以上都是5. 触发器的类型有哪几种?A. INSERT触发器B. UPDATE触发器C. DELETE触发器D. ALL触发器6. 触发器的工作原理是在哪个事件发生时执行?A. 数据库打开时B. 数据库关闭时C. 数据被插入、更新或删除时D. 用户登录时7. 如何创建一个存储过程?A. 使用CREATE PROCEDURE语句B. 使用CREATE TABLE语句C. 使用ALTER TABLE语句D. 使用CREATE INDEX语句8. 触发器中的IF语句用于做什么?A. 进行条件判断B. 控制触发器的执行流程C. 计算数据D. 存储数据9. 在触发器中,哪个关键字表示不执行任何操作?A. ALLB. EXCEPTIONC. THEND. ELSE10. 触发器的执行顺序是怎样的?A. 从内到外,从上到下B. 从内到外,从下到上C. 从外到内,从上到下D. 从外到内,从下到上11. 触发器的功能是什么?A. 处理数据库中的数据完整性问题B. 执行数据库中的批量操作C. 监控数据库中的数据变化,并在特定事件发生时自动执行操作D. 管理数据库中的用户权限12. 存储过程与触发器都是数据库对象,它们的主要区别是什么?A. 存储过程用于存储查询结果,而触发器用于执行操作B. 存储过程可以有输入参数,而触发器不能C. 存储过程是预编译的,可以提高数据库性能,而触发器是运行时执行的D. 触发器只能由用户触发,而存储过程可以由任何具有权限的用户调用13. 下列哪个不是存储过程的特点?A. 可以接收参数B. 可以有多个输出参数C. 只能在数据库内部执行D. 可以直接修改数据库中的数据14. 触发器通常与哪个对象相关联?A. 数据库表B. 数据库视图C. 数据库索引D. 数据库存储过程15. 在MySQL中,触发器的类型有哪些?A. INSERT触发器B. UPDATE触发器C. DELETE触发器D. SELECT触发器16. 触发器的工作原理是什么?A. 当对触发器关联的数据表进行指定类型的操作时,触发器自动执行预定义的操作B. 当数据库服务器启动时,触发器自动执行C. 当有新的连接连接到数据库时,触发器自动执行D. 当有用户登录到数据库时,触发器自动执行17. 如何在MySQL中创建一个存储过程?A. 使用CREATE PROCEDURE语句B. 使用CREATE FUNCTION语句C. 使用ALTER PROCEDURE语句D. 使用ALTER FUNCTION语句18. 触发器中可以使用哪些类型的条件判断?A. IF...ELSE语句B. CASE语句C. THEN...ELSE语句D. ALL...IN语句19. 触发器可以分为几种类型?(多选)A. INSERT触发器B. UPDATE触发器C. DELETE触发器D. SELECT触发器20. 存储过程和触发器都存放在哪种类型的数据库对象中?A. 表B. 序列C. 索引D. 视图21. 存储过程的类型有哪几种?A. 标准存储过程B. 用户定义存储过程C. 扩展存储过程D. 内置存储过程22. 下列哪个不是存储过程中的控制结构?A. IF...ELSEB. WHILEC. CASED. GOTO23. 触发器在什么情况下会被触发?A. 当表被添加或修改时B. 当数据库连接打开时C. 当用户登录时D. 当执行特定SQL语句时24. 如何使用存储过程?A. 使用CREATE PROCEDURE语句创建存储过程B. 使用ALTER PROCEDURE语句修改存储过程C. 使用DROP PROCEDURE语句删除存储过程D. 以上都是25. 触发器的主要优点是什么?A. 提高数据库性能B. 减少数据库维护成本C. 增加数据库安全性D. 以上都是26. 触发器的主要缺点是什么?A. 可能导致数据库性能下降B. 可能导致数据库死锁C. 可能导致数据库崩溃D. 可能导致数据库锁定二、问答题1. 什么是存储过程?请简述其特点。
## 第一章:SQL基础### 1.1 SQL简介1. 什么是SQL?2. SQL的主要功能有哪些?3. SQL的语法结构是怎样的?### 1.2 数据库概念1. 什么是数据库?2. 数据库有哪些基本类型?3. 数据库系统由哪些部分组成?### 1.3 数据定义语言(DDL)1. 什么是DDL?2. DDL有哪些主要命令?- CREATE:创建数据库、表、视图等。
- ALTER:修改数据库、表、视图等。
- DROP:删除数据库、表、视图等。
### 1.4 数据操纵语言(DML)1. 什么是DML?2. DML有哪些主要命令?- INSERT:插入数据。
- SELECT:查询数据。
- UPDATE:更新数据。
- DELETE:删除数据。
### 1.5 数据控制语言(DCL)1. 什么是DCL?2. DCL有哪些主要命令?- GRANT:授权。
- REVOKE:撤销授权。
## 第二章:SQL查询### 2.1 SELECT语句1. SELECT语句的基本语法结构是怎样的?2. 如何使用SELECT语句查询数据?3. 如何使用WHERE子句进行条件查询?4. 如何使用AND、OR、NOT等逻辑运算符?5. 如何使用ORDER BY对结果进行排序?6. 如何使用GROUP BY进行分组查询?7. 如何使用HAVING子句进行分组筛选?### 2.2 联合查询1. 什么是联合查询?2. 如何使用UNION操作符进行联合查询?3. 如何使用UNION ALL操作符进行联合查询?4. 联合查询中需要注意哪些问题?### 2.3 子查询1. 什么是子查询?2. 子查询有哪些类型?- 单列子查询。
- 多列子查询。
- 行子查询。
- 列子查询。
3. 子查询在SELECT、FROM、WHERE等子句中的使用。
### 2.4 连接查询1. 什么是连接查询?2. 连接查询有哪些类型?- 内连接(INNER JOIN)。
Sql语言1、查询“00001”课程比“00002”课程成绩高的所有学生的学号select a.StuID as "学号"from (select StuID,StuScores from Scores where CourseId='00001') a ,(select StuID,StuScores from Scores where CourseId='00002') bwhere a.StuScores>b.StuScores and a.StuID=b.StuIDselect T1.StuID 学号--使用自表连接from (select StuID,StuScores from Scores where CourseId = '00001') T1inner join (select StuID,StuScores from Scores where CourseId = '00002') T2on T1.StuID = T2.StuIDwhere T1.StuScores>T2.StuScores--2、查询平均成绩大于60分的学号和平均成绩select StuID as "学号",avg(StuScores) as "成绩"from Scoresgroup by StuIDhaving avg(StuScores)>60--3、查询所有同学的学号,姓名,选课数,总成绩select Students.StuID as "学号",Students.StuName as "姓名",count(Scores.CourseId) as "选课总数",sum(StuScores) as "总分"from Students left join Scores on Students.StuID=Scores.StuIDgroup by Students.StuID,StuName--4、查询姓“易”的老师个数select COUNT(distinct(Teacher)) as "个数"from Coursewhere Teacher like '易%'--5、查询没学过“易文龙”老师课的同学的学号,姓名select Students.StuID as "学号",Students.StuName as "姓名"from Studentswhere StuID not in (select distinct(Scores.StuID) from Scores,Course where Scores.CourseId=Course.CourseId and Teacher='易文龙')--6、查询学过“00001”并且也学过编号“00002”课程的同学的学号,姓名select a.StuID as "学号",StuName as "姓名"from Students a,Scores b,(select * from Scores where courseId = '00001') cwhere b.CourseId='00002' and a.StuID = b.StuID and a.StuID = c.StuID--7、查询学过“易文龙”老师所教的所有课程同学的学号,姓名select StuID as "学号",StuName as "姓名" from Students awhere not Exists(select * from Course b where Teacher = '易文龙'and not Exists(select * from Scores c where c.StuID=a.StuID and c.CourseId=b.CourseId))--8、查询课程编号“00002”的成绩比课程编号“00001”课程低的所有同学的学号,姓名select a.StuID as "学号",a.StuName as "姓名"from (select Scores.StuID,StuScores,Students.StuNamefrom Scores inner join Studentson Scores.StuID = Students.StuID and CourseId='00001') a ,(select StuID,StuScores from Scores where CourseId='00002') bwhere a.StuScores>b.StuScores and a.StuID=b.StuID--9、查询所有课程成绩小于60分的同学学号和姓名select StuID as "学号",avg(StuScores) as "平均分"from Scoresgroup by StuID having avg(StuScores)<60;select T1.StuID,StuNamefrom (select StuID from Scores group by StuID having MAX(StuScores)<=60) T1inner join Students T2on T1.StuID = T2.StuID--10、查询没有学过所有课的同学的学号,姓名select Students.StuID as "学号",Students.StuName as "姓名"from Students,Scoreswhere Students.StuID=Scores.StuIDgroup by Students.StuID,Students.StuNamehaving count(CourseId)<(select count(CourseId)from Course)--会漏掉未选修课的学生,应该使用以下方法select T2.*from(select StuID from Scores group by StuID having COUNT(*) = (select COUNT(*) from Course)) T1right join Students T2on T1.StuID=T2.StuIDwhere T1.StuID is null--11、查询至少学过“王丽秋”同学所学一门课的其他同学学号和姓名select Students.StuID as "学号",StuName as "姓名"from Students,Scoreswhere Students.StuID=Scores.StuID and Students.StuName != '王丽秋' and CourseId in (select CourseId from Scoresinner join Students on Students.StuID = Scores.StuIDwhere StuName = '王丽秋')存储过程:--存储过程(不带参数)create procedure up_GetAllComputerasselect * from Computergo--带参数的存储过程create procedure up_GetComputerByCondition(@condition nvarchar(100))asdeclare @sql nvarchar(max)set @sql='select * from Computer where '+@condition exec(@sql)exec up_GetComputerByCondition @style='华'exec up_GetAllComputer触发器:--为课程表建立插入触发器if OBJECT_ID('tgr_Course_insert','tr') is not null drop trigger tgr_Course_insertgocreate trigger tgr_Course_inserton Coursefor insertasdeclare @name nvarchar(10),@number intselect @name=CourseName from insertedselect @number=count(*) from Coursewhere CourseName=@nameif @number<>1rollback tran--回滚事务go--对学生建立一个插入触发器,不允许出现相同的邮箱if OBJECT_ID('tgr_Students_insert','tr') is not nulldrop trigger tgr_Students_insertGOcreate trigger tgr_Students_inserton Students for insertasdeclare @email varchar(50),@number intselect @email=StuEmail from insertedselect @number=count(*) from Studentswhere StuEmail=@emailif @number<>1rollback trango--对课程表建立修改触发器if OBJECT_ID('tgr_Course_update','tr') is not nulldrop trigger tgr_Course_updategocreate trigger tgr_Course_updateon Course for updateasDECLARE @name nvarchar(20),@number intselect @name=CourseName from insertedselect @number=count(*) from Coursewhere CourseName=@nameif @number<>1rollback trango--通过触发器阻止对学生表学号列的修改(列级修改触发器) if OBJECT_ID('tgr_Students_update','tr') is not nulldrop trigger tgr_Students_updategocreate trigger tgr_Students_updateon Students for updateasif update(StuId)rollback trango--删除触发器if OBJECT_ID('tgr_Course_delete','tr') is not nulldrop trigger tgr_Course_deletegocreate trigger tgr_Course_deleteon Course for deleteasif object_id('backupTable','u') is not nullinsert into backupTableselect * from deletedelseselect * into backupTable from deletedgoupdate Course setCourseName='物理'where CourseId='00001'insert into Course(CourseId,CourseName,Teacher) values('00009','化学','王二麻子')select * from Courseselect * from Scoresselect * from Studentsdelete from Course WHERE CourseId='00008'update Students set StuId='20111114'WHERE StuId='20111115'select * from backupTable相关函数使用:declare @age intdeclare @name nvarchar(10)set @age=10set @name= '张三abcde'print '我的年龄是:'+convert(varchar(10),@age)print '我的年龄是:'+cast(@age as varchar(10))print rtrim(ltrim(@name))print @nameprint charindex('张三',@name)print right(@name,len(@name)-charindex('a',@name)+1) print replace(@name,'张三','李四')print year(getdate())print datediff(dd,'2010-10-01',getdate())update Studentsset StuBronDate=dateadd(yy,10,StuBornDate)where StuName='王丽秋'print datename(dw,getdate())update abcdesetpwd=replace(REPLACE(pwd,'o','0'),'i','1')select ListNumberfrom exampleorder byLEFT(ListNumber,CHARINDEX('-',ListNumber)-1),RIGHT(ListNumber,LEN(ListNumber)-CHARINDEX('-',ListNumber)) declare @StuId CHAR(8),@StuName nvarchar(5)declare temp cursor forselect StuId,StuName from Studentsopen tempfetch next from temp into @StuId,@StuNamewhile @@FETCH_STA TUS=0beginselect @StuId,@StuNamefetch next from temp into @StuId,@StuNameendclose tempdeallocate temp。
Sql语言1、查询“00001”课程比“00002”课程成绩高的所有学生的学号select a.StuID as "学号"from (select StuID,StuScores from Scores where CourseId='00001') a ,(select StuID,StuScores from Scores where CourseId='00002') bwhere a.StuScores>b.StuScores and a.StuID=b.StuIDselect T1.StuID 学号--使用自表连接from (select StuID,StuScores from Scores where CourseId = '00001') T1inner join (select StuID,StuScores from Scores where CourseId = '00002') T2on T1.StuID = T2.StuIDwhere T1.StuScores>T2.StuScores--2、查询平均成绩大于60分的学号和平均成绩select StuID as "学号",avg(StuScores) as "成绩"from Scoresgroup by StuIDhaving avg(StuScores)>60--3、查询所有同学的学号,姓名,选课数,总成绩select Students.StuID as "学号",Students.StuName as "姓名",count(Scores.CourseId) as "选课总数",sum(StuScores) as "总分"from Students left join Scores on Students.StuID=Scores.StuIDgroup by Students.StuID,StuName--4、查询姓“易”的老师个数select COUNT(distinct(Teacher)) as "个数"from Coursewhere Teacher like '易%'--5、查询没学过“易文龙”老师课的同学的学号,姓名select Students.StuID as "学号",Students.StuName as "姓名"from Studentswhere StuID not in (select distinct(Scores.StuID) from Scores,Course where Scores.CourseId=Course.CourseId and Teacher='易文龙')--6、查询学过“00001”并且也学过编号“00002”课程的同学的学号,姓名select a.StuID as "学号",StuName as "姓名"from Students a,Scores b,(select * from Scores where courseId = '00001') cwhere b.CourseId='00002' and a.StuID = b.StuID and a.StuID = c.StuID--7、查询学过“易文龙”老师所教的所有课程同学的学号,姓名select StuID as "学号",StuName as "姓名" from Students awhere not Exists(select * from Course b where Teacher = '易文龙'and not Exists(select * from Scores c where c.StuID=a.StuID and c.CourseId=b.CourseId))--8、查询课程编号“00002”的成绩比课程编号“00001”课程低的所有同学的学号,姓名select a.StuID as "学号",a.StuName as "姓名"from (select Scores.StuID,StuScores,Students.StuNamefrom Scores inner join Studentson Scores.StuID = Students.StuID and CourseId='00001') a ,(select StuID,StuScores from Scores where CourseId='00002') bwhere a.StuScores>b.StuScores and a.StuID=b.StuID--9、查询所有课程成绩小于60分的同学学号和姓名select StuID as "学号",avg(StuScores) as "平均分"from Scoresgroup by StuID having avg(StuScores)<60;select T1.StuID,StuNamefrom (select StuID from Scores group by StuID having MAX(StuScores)<=60) T1inner join Students T2on T1.StuID = T2.StuID--10、查询没有学过所有课的同学的学号,姓名select Students.StuID as "学号",Students.StuName as "姓名"from Students,Scoreswhere Students.StuID=Scores.StuIDgroup by Students.StuID,Students.StuNamehaving count(CourseId)<(select count(CourseId)from Course)--会漏掉未选修课的学生,应该使用以下方法select T2.*from(select StuID from Scores group by StuID having COUNT(*) = (select COUNT(*) from Course)) T1right join Students T2on T1.StuID=T2.StuIDwhere T1.StuID is null--11、查询至少学过“王丽秋”同学所学一门课的其他同学学号和姓名select Students.StuID as "学号",StuName as "姓名"from Students,Scoreswhere Students.StuID=Scores.StuID and Students.StuName != '王丽秋' and CourseId in (select CourseId from Scoresinner join Students on Students.StuID = Scores.StuIDwhere StuName = '王丽秋')存储过程:--存储过程(不带参数)create procedure up_GetAllComputerasselect * from Computergo--带参数的存储过程create procedure up_GetComputerByCondition(@condition nvarchar(100))asdeclare @sql nvarchar(max)set @sql='select * from Computer where '+@condition exec(@sql)exec up_GetComputerByCondition @style='华'exec up_GetAllComputer触发器:--为课程表建立插入触发器if OBJECT_ID('tgr_Course_insert','tr') is not null drop trigger tgr_Course_insertgocreate trigger tgr_Course_inserton Coursefor insertasdeclare @name nvarchar(10),@number intselect @name=CourseName from insertedselect @number=count(*) from Coursewhere CourseName=@nameif @number<>1rollback tran--回滚事务go--对学生建立一个插入触发器,不允许出现相同的邮箱if OBJECT_ID('tgr_Students_insert','tr') is not nulldrop trigger tgr_Students_insertGOcreate trigger tgr_Students_inserton Students for insertasdeclare @email varchar(50),@number intselect @email=StuEmail from insertedselect @number=count(*) from Studentswhere StuEmail=@emailif @number<>1rollback trango--对课程表建立修改触发器if OBJECT_ID('tgr_Course_update','tr') is not nulldrop trigger tgr_Course_updategocreate trigger tgr_Course_updateon Course for updateasDECLARE @name nvarchar(20),@number intselect @name=CourseName from insertedselect @number=count(*) from Coursewhere CourseName=@nameif @number<>1rollback trango--通过触发器阻止对学生表学号列的修改(列级修改触发器) if OBJECT_ID('tgr_Students_update','tr') is not nulldrop trigger tgr_Students_updategocreate trigger tgr_Students_updateon Students for updateasif update(StuId)rollback trango--删除触发器if OBJECT_ID('tgr_Course_delete','tr') is not nulldrop trigger tgr_Course_deletegocreate trigger tgr_Course_deleteon Course for deleteasif object_id('backupTable','u') is not nullinsert into backupTableselect * from deletedelseselect * into backupTable from deletedgoupdate Course setCourseName='物理'where CourseId='00001'insert into Course(CourseId,CourseName,Teacher) values('00009','化学','王二麻子')select * from Courseselect * from Scoresselect * from Studentsdelete from Course WHERE CourseId='00008'update Students set StuId='20111114'WHERE StuId='20111115'select * from backupTable相关函数使用:declare @age intdeclare @name nvarchar(10)set @age=10set @name= '张三abcde'print '我的年龄是:'+convert(varchar(10),@age)print '我的年龄是:'+cast(@age as varchar(10))print rtrim(ltrim(@name))print @nameprint charindex('张三',@name)print right(@name,len(@name)-charindex('a',@name)+1) print replace(@name,'张三','李四')print year(getdate())print datediff(dd,'2010-10-01',getdate())update Studentsset StuBronDate=dateadd(yy,10,StuBornDate)where StuName='王丽秋'print datename(dw,getdate())update abcdesetpwd=replace(REPLACE(pwd,'o','0'),'i','1')select ListNumberfrom exampleorder byLEFT(ListNumber,CHARINDEX('-',ListNumber)-1),RIGHT(ListNumber,LEN(ListNumber)-CHARINDEX('-',ListNumber)) declare @StuId CHAR(8),@StuName nvarchar(5)declare temp cursor forselect StuId,StuName from Studentsopen tempfetch next from temp into @StuId,@StuNamewhile @@FETCH_STA TUS=0beginselect @StuId,@StuNamefetch next from temp into @StuId,@StuNameendclose tempdeallocate temp。