①:看上一题
②:
链接
链接
数据库在计算机应用中的作用是:
链接
数据库系统的出现使信息系统从以加工数据的程序为中心转向围绕共享的数据库为中心,既便于数据的集中管理,又有利于应用程序的研制和维护,提高了数据的利用率和相容率,提高了决策的可靠性。
百度百科
数据库系统(Database System),是由数据库及其管理软件组成的系统。
数据库系统是为适应数据处理的需要而发展起来的一种较为理想的数据处理系统,也是一个为实际可运行的存储、维护和应用系统提供数据的软件系统,是存储介质 、处理对象和管理系统的集合体。
常见的数据库系统:SQL Server、MySQl、Oracle
链接
实体-联系模型(Entity-Relationship Model, E-R模型)。
在E-R概念模型中,信息由实体型、实体属性和实体间的联系三种概念单元来表示。
百度百科
人们为数据库设计了一个严谨的体系结构,数据库领域公认的标准结构是三级模式结构,它包括外模式、概念模式、内模式,有效地组织、管理数据,提高了数据库的逻辑独立性和物理独立性。用户级对应外模式,概念级对应概念模式,物理级对应内模式,使不同级别的用户对数据库形成不同的视图。所谓视图,就是指观察、认识和理解数据的范围、角度和方法,是数据库在用户“眼中"的反映,很显然,不同层次(级别)用户所“看到”的数据库是不相同的。
链接
(1)环境级:对计算机系统的机房和设备加以保护,防止物理破坏。
(2)职员级:对数据库系统工作人员,加强劳动纪律和职业道德教育,并正确的授予其访问数据库的权限。
(3)操作系统级:防止未经授权的用户从操作系统层着手访问数据库。
(4)网络级:由于数据库系统允许用户通过网络访问,因此,网络软件内部的安全性对数据库的安全是很重要的。
(5)数据库系统级:检验用户的身份是否合法,检验用户数据库操作权限是否正确。
本节主要讨论数据库系统级的安全性问题。
数据库系统中一般采用用户标识和鉴别、存取控制、视图以及密码存储等技术进行安全控制。
INSERT INTO TABLE_NAME(COLUMN1_NAME, COLUMN2_NAME, ...)
VALUES(VALUE1, VALUE2, ...)
INSERT INTO TABLE_NAME
VALUES(VALUE1, VALUE2, ...)
第一种方式列出了表的列名,顺序与表结构可以不一致,添加值也按指定列对应的顺序添加。
第二种方式没有列出表的列名,值顺序必须与表结构一致。
UPDATE TABLE_NAME
SET COLUMN1_NAME = VALUE1
[WHERE COLUMN2_NAME = VALUE2 [AND COLUMN3_NAME = VALUE3] ]
DELETE FROM TABLE_NAME
[WHERE COLUMN_NAME = VALUE]
TRUNCATE TABLE TABLE_NAME
这种方式从一个表中删除所有行的速度要快于DELETE,TRUNCATE TABLE 语句是一种快速、无日志记录的方法。 TRUNCATE TABLE 语句只记录整个数据页的释放。
SELECT *
FROM TABLE_NAME
[WHERE COLUMN_NAME = VALUE AND COLUMN2 > VALUE2, ...]
SELECT COLUMN1_NAME, COLUMN2_NAME, ...
FROM TABLE_NAME
[WHERE COLUMN_NAME = VALUE OR COLUMN4 > VALUE4, ...]
P92
链接
GROUP BY 语句用于结合聚合函数,根据一个或多个列对结果集进行分组。
SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_namei
SELECT studentno, SUM(usually * 0.3 + final * 0.7) AS '总分'
FROM score
WHERE final >= 75
GROUP BY studentno
[HAVING COUNT(*) >= 3]
[ORDER BY SUM(usually * 0.3 +final * 0.7) DESC]
SELECT COLUMN1_NAME, COLUMN2_NAME, ...
FROM TABLE_NAME
WHERE xxx
ORDER BY COLUMN1_NAME, COLUMN3_NAME, ... [ASC | DESC]
升序:ASC
降序:DESC
INNER JOIN
SELECT column_name(s)
FROM table1
[INNER] JOIN table2
ON table1.column_name = table2.column_name;
游标实际上是一种能从包括多条数据记录的结果集中每次提取一条记录的机制。游标充当指针的作用。 尽管游标能遍历结果中的所有行,但它一次只指向一行。
概括来讲,SQL的游标是一种临时的数据库对象,既可以用来存放在数据库表中的数据行副本,也可以指向存储在数据库中的数据行的指针。游标提供了在逐行的基础上操作表中数据的方法。
博客园链接
索引提供指针以指向存储在表中指定的数据,就好比一本字典中的目录,无需翻阅整本字典,利用目录就可以快速的定位查找到所需信息。使用索引可以大大提高数据库查询的速度。
索引是一个逻辑文件,包含从表或视图中一个或多个列生成的键,以及映射到指定数据行的存储位置指针。 ※
链接
SqlServer中有多种索引类型:
P192
视图是从一个或多个表及其他视图中通过 SELECT 语句导出的虚拟表, 视图所对应数据的行和列数据来自定义视图查询所引用的表(视图中的数据来自定义视图所引用的表),并且在引用视图时动态生成。通过视图可以实现对基表数据的查询与修改。
视图为数据库用户提供了很多的便利,主要包括:
CREATE VIEW V_score
AS
SELECT studentno, courseno, final
FROM score
WHERE final >= 80
ALTER VIEW V_score
AS
SELECT *
FROM score
WHERE final <= 90
EXEC sp_rename 'V_old', 'V_new'
注意: 更改对象名的任一部分都可能会破坏脚本和存储过程。(这是在执行上述SQL语句时 SSMS 给出的提示),虽然可以重命名成功,但是不建议使用此语句来重命名 存储过程、触发器、用户定义函数或视图 等数据库对象,而是将其删除,然后使用新名称重新创建。
DROP VIEW V_score
"CREATE PROCEDURE"必须是批处理中仅有的语句。
存储过程(Stored Procedure)是一组完成特定功能的 Transact-SQL 语句的集合,即将一些固定的操作集中起来由 SQL Server 服务器来完成,应用程序只需调用它就可以实现某个特定的任务。存储过程可以通过用户、其他存储过程或触发器来调用执行。
利用存储过程可以让系统达到如下目的:
链接
CREATE PROC Proc1
AS
SELECT *
FROM score
WHERE usually >= 80
CREATE PROC
CREATE PROCEDURE
CREATE PROC Proc2
@target int
AS
SELECT *
FROM score
WHERE usually >= @target
CREATE PROC Proc3
@target int = 80, @avg numeric(6, 2) OUTPUT
AS
SELECT @avg = AVG(usually)
FROM score
WHERE usually >= @target
ALTER PROC Proc1
WITH ENCRYPTION
AS
SELECT *
FROM score
WHERE usually >= 80
[WITH { RECOMPILE | ENCRYPTION }]
此时,若使用系统存储过程 sp_helpertext 显示存储过程的定义,则结果显示为“对象 ‘Proc1’ 的文本已加密。”
EXECUTE sp_helptext Proc1
EXEC Proc1
EXEC Proc2 @target = 70
DECLARE @average numeric(6, 2)
EXEC Proc3 @target = 70, @avg = @average OUTPUT
SELECT @average
触发器(Trigger)是一种响应数据操作语言(DML)事件或数据定义语言(DDL)事件而执行的特殊类型的存储过程,是在用户对某一表中的数据进行 UPDATE、INSERT 和 DELETE 操作时被触发执行的一段程序。触发器助于强制引用完整性,以便在添加、更新或删除表中的行时保留表之间已定义的关系。
事物是由一系列的数据操作命令组成,是数据库应用程序的基本逻辑单元。在 SQL Server 中,以事务为基本操作单位,使用锁来实现并发控制。
在 SQL Server 中事务作为单个逻辑工作单元来执行一系列操作,具有如下4个特点:(ACID)
链接
链接
如果不考虑事务的隔离性,会发生的几种问题:
脏读
脏读是指在一个事务处理过程里读取了另一个未提交的事务中的数据。
当一个事务正在多次修改某个数据,而在这个事务中这多次的修改都还未提交,这时一个并发的事务来访问该数据,就会造成两个事务得到的数据不一致
不可重复读
不可重复读是指在对于数据库中的某个数据,一个事务范围内多次查询却返回了不同的数据值,这是由于在查询间隔,被另一个事务修改并提交了。
例如事务T1在读取某一数据,而事务T2立马修改了这个数据并且提交事务给数据库,事务T1再次读取该数据就得到了不同的结果,发送了不可重复读。
不可重复读和脏读的区别是,脏读是某一事务读取了另一个事务未提交的脏数据,而不可重复读则是读取了前一事务提交的数据。
在某些情况下,不可重复读并不是问题,比如我们多次查询某个数据当然以最后查询得到的结果为主。但在另一些情况下就有可能发生问题,例如对于同一个数据A和B依次查询就可能不同,A和B就可能打起来了……
虚读(幻读)
幻读是事务非独立执行时发生的一种现象。例如事务T1对一个表中所有的行的某个数据项做了从“1”修改为“2”的操作,这时事务T2又对这个表中插入了一行数据项,而这个数据项的数值还是为“1”并且提交给数据库。而操作事务T1的用户如果再查看刚刚修改的数据,会发现还有一行没有修改,其实这行是从事务T2中添加的,就好像产生幻觉一样,这就是发生了幻读。
幻读和不可重复读都是读取了另一条已经提交的事务(这点就脏读不同),所不同的是不可重复读查询的都是同一个数据项,而幻读针对的是一批数据整体(比如数据的个数)。
现在来看看MySQL数据库为我们提供的四种隔离级别:
① Serializable (串行化):可避免脏读、不可重复读、幻读的发生。
② Repeatable read (可重复读):可避免脏读、不可重复读的发生。
③ Read committed (读已提交):可避免脏读的发生。
④ Read uncommitted (读未提交):最低级别,任何情况都无法保证。
任何对数据的修改都是在事务环境中进行的
BEGIN {TRAN | TRANSACTION} [{transaction_name | @tran_name_variable}]
[WITH MARK{ 'description' }]
DECLARE @TranName VARCHAR(20);
SELECT @TranName = 'UPDATE_USUALLY';
BEGIN TRAN @TranName;
UPDATE score SET usually = 66
WHERE studentno = 11111
COMMIT TRAN @TranName;
BEGIN TRAN
INSERT INTO score
VALUES(222,222,'222','222')
SAVE TRAN SAVEPOINT;
DELETE FROM score
WHERE studentno = 222;
ROLLBACK TRAN SAVEPOINT;
COMMIT TRAN;
链接
P235
使用排他锁,就是当一个事务在进行操作的时候,其他事务不能进行操作,只有一个操作结束之后才能进行其他关于这个资源的操作。锁的范围是行。
锁的范围:行锁: 对某行记录加上锁 ; 表锁: 对整个表加上锁
共享锁(S):保护资源,以便只能对其进行读取访问。当资源上存在共性锁时,其他事务均不能修改数据。
排他锁(X):指示数据修改,例如插入、更新或删除。确保不能同时对同一资源进行多个更新。