2020年上半年SQL Server数据库复习(哭)

前言

赶紧考完,去年我就得了腱鞘炎了,今年变得更加严重,一敲键盘就手腕疼——手臂、手腕、手掌、手指、关节,这些地方都因为敲键盘而患了伤痛,早起都撑不住自己下床!


考试要点

第1章 数据库概述

2、了解数据管理技术的发展经历了2个阶段。

(人工管理阶段)、文件管理系统阶段、数据库管理阶段、(数据库高级管理阶段)

3、理解文件管理方式的缺点。

1)松散包装。关系映射中没有ACID(原子性,一致性,隔离性,持久性)操作,这意味着无法保证。考虑一种情况,您手动或通过一些黑客家伙从手中删除您的文件。您可能不知道该文件是否存在。
2)安全性低。由于您的文件可以保存在您应该提供写入权限的文件夹中,因此很容易出现安全问题并引发麻烦,例如黑客攻击。如果您无法在安全性方面做出妥协,最好避免保存在文件系统中。

4、理解数据库管理方式的特点(优点)。

ACID一致性,包括在文件存储在数据库外部时更新的回滚。文件将与数据库同步,不能孤立,这在跟踪事务时占上风。备份自动包含文件二进制文件。它比保存在文件系统中更安全。

5、掌握数据独立性的概念。

应用程序和数据结构之间相互独立, 互不影响

6、了解数据库系统的组成。

数据库、数据库管理系统(及其开发工具)、应用系统、数据库管理员、用户

   \;

第2章 数据库系统结构

2、掌握数据模型三要素是什么。

数据结构、数据操作、完整性约束

3、理解数据模型的两个层次:概念层数据模型、组织层数据模型。

概念层数据模型:

从用户观点对数据和信息建模,是数据库设计者与用户之间的交流工具,是数据库逻辑模型的继承。E-R模型是最常用的概念模型。

组织(逻辑层)层数据模型:

用来描述数据的整体逻辑结构,逻辑模型主要是描述数据的逻辑存储结构、数据操作和完整性约束。

物理层数据模型:

确定数据的物理存储结构、数据存取路径以及调整、优化数据库的性能。

4、掌握E-R模型的相关概念、以及E-R图的画法。

ER模型由实体Entity,属性Attribute和联系Relationship组成。

Entity用方框
Attribute用椭圆,多个Attribute连接到一个Entity上,或者连在Relationship上
Relationship用菱形,连接多个Entity

   \;
5、掌握关系模型的基本概念(术语)。

关系模型是指用二维表的形式表示实体和实体间联系的数据模型

   \;
6、掌握关系模型的3类数据完整性约束:实体完整性、参照完整性、用户定义的完整性。掌握其概念,知道其作用和区别。

实体完整性:

每个表都有主键

参照完整性:

如果表中有外键,那么外键要么是空,要么是另一个表的主键

用户定义的完整性:

数据不要超过自定义的范围

   \;
7、理解数据库系统的三级模式结构。

外模式、概念模式、内模式
_
外模式是用户模式
概念模式是逻辑模式
内模式是物理模式

   \;
   \;

第3章 SQL语言基础及数据定义功能

1、了解四大类SQL语言的功能。

数据查询语言DQL,数据操纵语言DML,数据定义语言DDL,数据控制语言DCL

2、掌握常见的SQL数据类型。

字符型(nchar,varchar,char,nvarchar),文本型(text,ntext),数值型(tinyint,smallint,float,double,int,bigint,decimal,numeric),逻辑型(bit)、日期型(datetime)

   \;
3、掌握CREATE TABLE语句的格式、写法。包括定义表的约束

CREATE TABLE Student(
	sno char(4) not null,
	sname char(8),
	sage int,
	ssex char(2),
	sdept char(20),
	primary key(sno)
)

4、掌握DROP TABLE和ALTER TABLE语句。

--删除表Student
DROP TABLE Student

--为表Student添加一个字段
ALTER TABLE Student
	ADD XKLX char(4)
	

5、掌握数据完整性的实现方法。(5种约束)

not null      非空约束
unique        唯一约束(distinct也是唯一约束,但是distinct用在执行中,unique用在创建中)
primary key   主键约束
foreign key   外键约束,保证该外键是别的表的主键
check         布尔约束,比如:CHECK (P_Id>0),保证P_Id大于零

   \;
6、备份数据库

BACKUP DATABASE mydb TO DISK='E:\SQL\BACKUP3\demllie_2020_4_13.bak'

   \;

第4章 数据操作语句

1、熟练掌握SELECT语句的基本用法。包括各种子句、查询条件的写法、聚合函数。

显示整张表
SELECT * FROM Student




查询课程C001的最高分
SELECT MAX(grade) AS 'C001课程最高分' FROM sc
	WHERE cno = 'C001'





2、掌握多表连接查询方法。

查询所有科目成绩在70~80分之间的学生的学号、课程号、成绩
SELECT s.sno,cno,grade FROM student s
	JOIN sc ON sc.sno = s.sno
	WHERE grade BETWEEN 70 AND 80  			(包含7080)





统计每门课的选课人数和考试最高分
SELECT c.cno,cname,COUNT(*) '选课人数' , MAX(grade) '最高分' FROM course c
	FULL JOIN sc ON sc.cno = c.cno
	GROUP BY c.cno,cname      	
( WHERE中不能用聚合函数,但是如果先用GROUP BY,再
	 用HAVING,就可以在HAVING后使用聚合函数  )




(多表连接种类 (inner) joinleft joinright joinfull join

   \;
3、掌握子查询的用法。

查询没有选课的学生姓名、学号、所在系
SELECT sname,sno,sdept FROM student
	WHERE sno NOT IN( SELECT sno FROM sc)  		(子表查询中只能有一个字段)




查询与李华年龄相同的学生的姓名、所在系、年龄
SELECT sname,sdept,sage FROM student
	WHERE sage = ( SELECT sage FROM student WHERE sname = '李华' )
 	(  中文匹配可以用中文正则,即  sname like '%李华%' 表示一个字符串中出现了“李华”  )




查询大于全体学生平均年龄的女生的学号、姓名、所在系
SELECT sno,sname,sdept FROM student
	WHERE sage > ( SELECT AVG(sage) FROM student )
		  AND 
		  ssexm = '女'



查询选修了数据结构的学生的姓名、学号、所在系
SELECT sname,s.sno,sdept FROM student s
	JOIN sc ON sc.sno = s.sno
	JOIN course c ON sc.cno = c.cno
	WHERE cname='数据结构'



   \;
4、掌握INSERT语句、DELETE语句、UPDATE语句的用法。

将所有课程学分都增加一份
UPDATE course SET ccredit= ccredit + 1


将VB课程学分改为3
UPDATE course SET ccredit=3 WHERE cname='VB基础'



删除没有人选的记录
DELETE course WHERE cno NOT IN(  SELECT DISTINCT cno FROM sc )delete table student只能删除表中所有数据,不能删除表本身)
(distinct也是唯一约束)




新建一个pass表,含学号、姓名、所在系、课程号、课程名、成绩,
将所有及格的数据存入pass
CREATE TABLE pass(
	psno char(10) not null,
	psname char(10),
	pdept char(20),
	pcno char(4),
	pcname char(8),
	pgrade int
)
INSERT INTO pass(psno,psname,pdept,pcno,pcname,pgrade) 
	SELECT sc.sno,sname,sdept,sc.cno,cname,grade FROM student
		LEFT JOIN  sc on student.sno = sc.sno
		JOIN course on course.cno = sc.cno
		WHERE grade >= 60



   \;
5、理解CASE表达式的用法。

查询统计系的学生的人数和男女生人数
SELECT SUM(   CASE WHEN sdept='统计系' THEN 1 ELSE 0 END  )           统计总人数
	AS '统计系学生人数'		
		SUM(  CASE WHEN ssex='男' THEN 1 ELSE 0 END )				  统计男生人数
	AS '统计系男生人数'
		SUM(  CASE WHEN ssex='女' THEN 1 ELSE 0 END )				  统计女生人数
	AS '统计系女生人数'
	FROM student




   \;
6、了解查询的交、并、差运算。

差————查询在北京的仓库中,职员工资小于等于2900的仓库号
SELECT 仓库号 FROM 仓库 WHERE 城市='北京' 
	EXCEPT
	SELECT 仓库号 FROM 职工 WHERE 工资>2900



和————查询在北京的仓库的仓库号或职员工资大2900的仓库号
SELECT 仓库号 FROM 仓库 WHERE 城市='北京'
	UNION ALL
	SELECT 仓库号 FROM  职工 WHERE  工资>2000



交—————查询在北京的仓库中,职员工资大于2900的仓库号
SELECT 仓库号 FROM 仓库 WHERE 城市='北京'
	INTERSECT
	SELECT 仓库号 FROM 职工 WHERE 工资>2000


   \;
7、查询一个范围内的记录

显示VB课程的第2名到第4名的学生的学号、姓名、成绩。
SELECT top 3
		sc.sno,sname,grade FROM student 
		JOIN sc on student.sno = sc.sno
		JOIN course on course.cno = sc.cno
		WHERE cname = 'VB基础' and grade not in (
			
			SELECT top 1 
			--	sc.sno,sname,grade FROM student     --incorrect
				grade FROM student    				--correct
				JOIN sc on student.sno = sc.sno
				JOIN course on course.cno = sc.cno
				WHERE cname = 'VB基础'
				ORDER BY grade DESC
		
		) 
		ORDER BY grade DESC


   \;
   \;

第5章 视图

1、掌握视图的概念,理解其特点(优点)。

视图是基于 SQL 语句的结果集的可视化的表。
视图是逻辑上的表,是虚拟的表!!!可以当成普通表进行查询
优点是不用多次查询所有表

2、掌握视图的定义(CREATE VIEW)、修改(ALTER VIEW)和删除(DROP VIEW)。

查询学生的学号、姓名、所在系、课程号、课程名、课程学分
CREATE VIEW V31 
	AS
	SELECT sc.sno,sname,sdept,sc.cno,cname,grade FROM student
		FULL JOIN sc on sc.sno = student.sno
		FULL JOIN course on sc.cno = course.cno



查询学生的学号、姓名、选修的课程名和考试成绩
CREATE VIEW V32 
	AS
	SELECT sc.sno,sname,cno,grade FROM student
	LEFT JOIN sc on sc.sno = student.sno




统计每个学生的选课门数,要求列出学生学号和选课门数
CREATE VIEW V33 
	AS
	SELECT sno,count(cno) AS CourseNum FROM sc
	GROUP BY sno 




统计每个学生的修课总学分,要求列出学生学号和总学分
(考试成绩大于等于60才可以获得此门课程的学分)
CREATE VIEW V34 AS
	SELECT sno,sum(ccredit) as WholeGrade  FROM sc
		JOIN course ON course.cno = sc.cno
		GROUP BY sno



查询计算机系Java考试成绩最高的学生的学号、姓名、Java考试成绩
CREATE VIEW V35 AS
	SELECT top 1 sc.sno,sname,grade as JavaGrade FROM student
		JOIN sc ON sc.sno = student.sno
		JOIN course ON sc.cno = course.cno
		WHERE cname='Java基础'
		ORDER BY grade 




查询计算机系选课门数超过3门的学生的姓名和选课门数
SELECT DISTINCT sname,CourseNum FROM V31
	JOIN V33 ON V33.sno = V31.sno
	WHERE CourseNum>3 AND sdept='计算机系'




列出平均成绩在80分以上的课程名及平均分。
SELECT cname,AVG(grade) avGrade FROM TEST4
	GROUP BY cname
	HAVING AVG(grade) > 80				(用来替代where中使用不了聚合函数的限制)
	







(视图中无法进行INSERT插入数据)



3、掌握视图的作用。

大大减少多表查询的次数

   \;

第6章 关系数据库规范化理论

1、掌握关系模式中的码的概念:候选码、主码、主属性、非主属性。

候选码:能唯一确定一条记录的属性,或者一组属性
主码:主键(键就是码),主键属于候选码
主属性:候选码
非主属性:非候选码

   \;
   \;
2、掌握1NF、2NF、3NF的概念,掌握对关系模式进行规范化分解的方法。

1NF:列名不能有包含关系,每个字段都不能分割——也就是表中的列明只能是并列的!!!
_
2NF:属性完全依赖于主属性!!!
_
3NF:没有传递依赖!!———比如sc到student,sc到course,这个例子中没有student到course,那样的话就有course传递依赖于sc了
_

   \;

   \;

第7章 数据库保护

1、理解事务的概念。

用户定义的工作序列

2、了解事务的4个特征。(ACID)

Atomicity——原子性,事务不可被打断,要执行就完整执行!
Consistency——一致性,数据库的状态必须只有一种,一个操作只能是失败或者成功,不能是失败和成功!!!
Isolation——隔离性,一个事务的执行不能被其他事务干扰
Durability———持久性(Permanence永久性),事务执行后,对数据的改变是永久的

3、理解SQL事务处理模型。

ISO事务处理模型

每次写完一个事务后,写一个COMMIT,不同的事务通过COMMIT分隔

T-SQL事务处理模型

每个事务前面写一个BEGIN TRANSACTION,后面写一个COMMIT

   \;


4、理解4种数据不一致情况。
  1. 丢失数据修改——A对数据做的修改被B给覆盖了
  2. 读脏数据——A读数据后,B回滚了数据
  3. 不可重复读——A读第一次和读第二次之间,数据被B修改了
  4. 产生幽灵数据——A读第一次和读第二次之间,数据被B删除了(或者被增加了某些数据)

   \;
5、了解锁的类型。

共享锁:

Shared Lock,简称S锁可读),没有事务加X锁时,大家都能给数据加S锁。当有事务加上X锁,其他事务就什么锁都不能加了!!!

排他锁:

Exclusive Lock,简称X锁可读可写),只要第一次加上S锁的事务可以再加上X锁,等到第一次加上S锁的事务释放S锁后,其他事务才能加S锁。

   \;
6、理解各级封锁协议的动作与防止数据不一致性的不同效果。
在这里插入图片描述

   \;
7、掌握并发调度的可串行性。能分析并发调度的具体实例。
在这里插入图片描述

   \;

第8章 数据库设计

1、了解数据库设计的各个环节。

需求分析——》概念结构设计——》逻辑结构设计——》物理结构设计

下面是简单化的步骤
——
了解功能需求
定义实体
绘制E-R图
把E-R图转换成模型
检查模型
根据模型定义数据库

2、掌握概念结构设计方法,能画出各局部E-R图,并合并为全局图。

3、掌握逻辑结构设计方法,能根据E-R图转换成符合3NF范式的关系表。

   \;

第9章 综合章节

1、了解存储过程的概念。

存储过程(Stored Procedure)是一种在数据库中存储复杂程序,以便外部程序调用的一种数据库对象

2、掌握存储过程的实现与管理:CREATE PROC、EXEC、 ALTER PROC、DROP PROC等语句,系统存储过程sp_help、sp_helptext等。

建立一个临时表t_pass,并建立一个存储过程P_pass,
输入专业名称后,输出该专业所有课程
都及格的学生的学号、名字到临时表t_pass,
如果没有输入参数,则输出所有课程都及格的学生
--删除之前已有的表
IF OBJECT_ID('mydb.dbo.P_disp') IS NOT NULL
	DROP PROCEDURE P_pass
GO
IF OBJECT_ID('mydb.dbo.#t_pass') IS NOT NULL   
	DROP TABLE #t_pass    --删除临时表
GO

---------------------------------------------------------------------------------
--返回两行数据
CREATE PROCEDURE P_pass
	@NAME char(8)=NULL
	AS	
	IF(@NAME IS NOT NULL)
				SELECT sc.sno AS OUT_NO,sname AS OUT_NAME
								FROM student
								JOIN sc ON sc.sno = student.sno
								GROUP BY sc.sno,sname,sdept
								HAVING count(grade)=sum(
									CASE 
										WHEN grade>=60 THEN 1
										ELSE 0
									END
								)				
								AND
								sdept=@NAME			
				
		---------------------------------------------------------
	IF(@NAME IS NULL)		
				SELECT sc.sno AS OUT_NO,sname AS OUT_NAME
								FROM student
								JOIN sc ON sc.sno = student.sno
								GROUP BY sc.sno,sname
								HAVING count(grade)=sum(
									CASE 
										WHEN grade>=60 THEN 1
										ELSE 0
									END
								)															  
				
				
GO
---------------------------------------------------------------------------------
DECLARE @t_pass TABLE(
	OUT_NO int,
	OUT_NAME char(10)
)
INSERT INTO @t_pass EXEC P_pass '信息系'    --将过程结果存入临时表中
SELECT * FROM @t_pass
GO

   \;
   \;


3、了解触发器的概念与分类。

instead触发器,在发生动作前触发!
for(after)触发器,在发生动作后触发!
_
触发器按动作分类有insert触发器、delete触发器、update触发器

   \;
4、掌握触发器的实现与管理:CREATE TRIGGER、ALTER TRIGGER、DROP TRIGGER等语句,系统存储过程sp_help、sp_helptext,系统表inserted、deleted和sysobjects等。

建立一个触发器T_delsc,当删除STUDENT表中的某条记录时,
也删除SC表中与其相关联的记录。

----删除已有的触发器
IF EXISTS( SELECT name FROM SYSOBJECTS WHERE name='T_delsc')
	DROP TRIGGER T_delsc
GO

--创建新的触发器
CREATE TRIGGER T_delsc
	ON student
	FOR DELETE
	AS
	BEGIN
		DECLARE @NO char(8)						--定义中间变量
		SELECT @NO=sno FROM DELETED				--在DELETED中查询要删除的学号
		DELETE sc WHERE sno = @NO				--删除该学号的所有记录
	END
GO

--直接在student删除一条记录时,因为会删除sc中的多条记录,这多条记录的学号一样,SQL Server不知道要删除哪条,所以删除操作被SQL Server阻止!!!
--解决方式是设置sno为student的主键!!!


参考:
文件系统与数据库的优缺点
数据模型和数据库系统的模型结构
五种完整性约束分别是什么——基于MySQL数据库的数据约束实例

猜你喜欢

转载自blog.csdn.net/weixin_41374099/article/details/106611915