数据库基础知识

1.数据、信息、数据处理、数据管理

数据是对客观事物特征的一种抽象的、符号化的表示,即用一定的符号表示那些从观察或测量中收集的基本事实,采用什么符号是人为的规定。

信息是数据有意义的表现。

数据处理是对数据进行收集、组织、存储、加工、抽取和传播等一系列活动的总和,目的是从大量的原始数据中推导出对人们有用的信息。

数据管理是对数据的分类、组织、编码、存储、查询、和维护等活动。

三个阶段:人工管理、文件系统管理、数据库系统

2.模型

模型:对现实世界特征的模拟与抽象。

数据模型:根据实体及其相互联系的方法,树型结构(层次型)、网状结构(网状型)、表结构(关系型)

三类数据模型:概念模型、逻辑数据模型、存储模型

数据模型三要素

(1)数据结构:对实体间联系的表达实现

(2)数据操作:一组用于指定数据结构的任何有效实例执行的操作或推导规则。

(3)数据完整性约束:给出数据及其联系应具有的制约和依赖规则。

3.E-R图

属于概念模型

矩形--实体    椭圆--属性   菱形--联系

双向单箭头--一对一    单向单箭头_单向双箭头--一对多    双向多箭头--多对多

4.两级映像与数据独立性

三种模式:外模式、(概念)模式、内模式

两级映象:外模式/模式、模式/内模式

映像是一种对应规则,指出映象双方是如何转换的。

数据独立性:应用程序与数据结构之间相互独立,互不影响。在三层模式体系结构中,指数据库系统在某一层次上的改变不会使它的上一层发生改变的能力。

逻辑独立性:一旦模式发生变化,无须改变外模式或应用程序的能力,外模式/模式映象。

物理独立性:不会因为内模式改变导致概念模式发生改变的能力,模式/内模式映象。 

数据逻辑独立性难以测底实现,当前数据库产品中,模式的改变会引发应用程序的改变。

5.用户通过DBMS访问数据库的过程

DBMS是一个负责数据库的定义、建立、操作、管理和维护的软件系统。

(1)接受应用程序数据请求

(2)分析操作请求,转换为具体的物理数据处理

(3)DBMS向OS发出操作请求

(4)OS处理数据,结果送到缓冲区,并发出读完标志。

(5)DBMS接到读完信号后,将缓冲区数据经模式映射,变成用户逻辑记录送到用户工作区。

数据字典:描述各级模式的信息,包括数据的结构名、意义、描述定义、存储模式、完整性约束、使用权限等信息。


范式

1NF 对关系模式R中所有属性的属性名和属性值都不可再分

2NF R属于1NF,且每一个非主属性都完全依赖于码(部分依赖:只依赖于码的一部分)

3NF R属于2NF,且不存在传递依赖

BCNF 又称扩展的3NF,R是第一范式,且每个属性都不传递依赖于R的候选键,则R为BCNF

(1)所有非主属性对码都是完全函数依赖(2NF)

(2)所有主属性对每一个不包含它的码都是完全函数依赖(字段里可以有多个码的情况)

(3)没有任何属性完全函数依赖于非码的任何一组属性

4NF R属于1NF,若X->->Y是非平凡的多值依赖,且X包含关键字,则R属于4NF

              程序设计    丽丽

              程序设计     Lucy

              程序设计     Tom

    教师多值依赖于课程值,且课程、教师字段共同构成码

6.事务 Transaction

事务作为单个逻辑工作单元执行的一系列操作,这些操作要么全做,要么全不做,是一个不可分割的工作单位。事务可以由用户显示控制,否则由DBMS自动划分事务。

特点:

原子性Atomicity:要么全做,要么全不做

一致性Consistency:事务的执行不会影响数据的一致性

独立性Isolation:两个以上的事务不会出现交错执行的状态

持久性Durability:事务运行成功后,对数据的更新是永久的。

Begin Transaction开始事务

Commit  提交

Rollback 回滚

并发存取:为充分利用系统资源,改善对事务的响应时间,应允许多个事务在时间上交叉执行,并发的存取数据库。并发存取必须加以控制,否则会存取错误的数据,引发数据不一致。

如果一个事务集的并发调度与某一串行调度是等价的,则称该并发调度是可串行的。在一般的DBMS中,都以可串行化作为并发控制的正确性准则。

前驱图判断一个调度S是否可串行化

构建前驱图的方法:满足下列条件画一个箭头

(1)Ti写在Tj读之前

(2)Ti读在Tj写之前

(3)Ti写在Tj写之前

如果构成的前驱图没有回路,则可用拓扑顺序活得一个等价的串行调度,否则不可串行调度。

7.基于封锁的并发控制

写锁X(也称排他锁):不可再加任何其它锁

读锁S(也称共享锁):资源上存在共享 (S) 锁时,任何其它事务都不能修改数据。

封锁协议:在数据写或读数据时,何时加锁、封锁时间,何时释放的规则。

一级封锁协议:事务T在修改数据K之前必须加X锁,直到事务结束时释放。可防止丢死修改,但不能保证可重复性、不读脏数据

二级封锁协议:一级封锁协议基础上,事务T在读数据K前,对K加S锁,读完即可释放。可防止丢死修改,防止读脏数据,但不能保证可重复性。

三级封锁协议:一级封锁协议基础上,事务T在读数据K前,对K加S锁,直到事务结束时释放。可防止丢死修改,防止读脏数据,保证可重复性。


两段锁协议:TPL协议,Two-Phase Locking Protocol

(1)在任何数据对象进行读写操作前,事务要对数据对象加锁

(2)在释放一个锁后,就不可再加其它锁

这样,锁会不断增加,然后不但减少。


8.死锁

预防死锁

一次申请法:一次申请请全部锁,否则一个锁也不占有。会限制并发数,降低资源使用效率,会引发活锁。

顺序申请法:将数据对象按序编号,事务按顺序申请加锁,这样只有请求低序号的数据对象的事务等待占有高序号数据对象的事务,而不会出现循环等待。顺序标号很困难,因为数据对象很多,且不断变动。


实用的方法:时间标记法,记录事务的运行时间

等待死亡测量:年轻回滚,以当前时间标记开始重新运行

伤害等待策略:年轻等年老,年轻等待,年老回滚。


死锁监测

超时法:

等待图法:出现回路时死锁


9.触发器

事前触发:运行于触发事件发生之前

事后触发:运行于触发事件发生之后

语句级触发:在语句执行前触发

行级触发:在触发器所影响的每一行触发一次。


SQL语句

select * from 学生 where 学号<any(~)

any 与 all : any是单个值,小于其中一个值即可,all是全部值

权限管理

grant select,insert on table 学生 to user1 with grant option

revoke select on table 学生 from user1

权限会级联收回,user1授给user2的此权限,会被级联收回。

表格修改

alter table t2 add construction id unique  为id字段增加unique属性

alter table t2 add construction id primary key 为id字段增加主键属性

top

select top 1 * into # from a     // #表示临时表,把a的第一行赋值到临时表#中

truncate table a   // 截断表a,即清空

insert a select * from #      //把临时表内容复制到表a中


10.SQL注入攻击

指攻击者把SQL命令插入到Web表单或页面请求的查询字符串中,欺骗服务器执行恶意的SQL命令。

用户输入的内容可能被用来构造SQL语句,或作为存储过程的参数,这是SQL注入攻击的原因。

预防方法:

(1)替换单引号:把所有单独出现的单引号改成两个单引号

(2)删除用户输入内容中的连字符,防止攻击者获得访问权限

(3)所用帐号权限控制

(4)检查用户输入的合法性

(5)将用户登录帐号、密码等加密保存

(6)用存储过程执行查询,这样用户输入必须遵从存储过程的安全上下文。


11.存储过程与函数

存储过程是用户定义的一系列SQL语句的集合,涉及特定表或其它对象的任务,用户可以调用存储过程。

函数是数据库已定义的方法,它接受参数并返回某种类型的值,不涉及特定用户表。


12.游标的作用,如何知道游标到了最后?

游标用于定位结果集的行,通过判断全局变量@@FETCH_STATUS可以判断是否到了最后,变量不等于0表示出错或到了最后。

13.聚集索引与非聚集索引

聚集索引的顺序就是数据的物理存储顺序,因此一个表只能有一个聚集索引,但该索引可以包含多个列(组合索引,姓氏、名字)

非聚集索引的索引顺序与物理排列顺序无关

在SQLServer中,索引是通过二叉树的数据结构来描述的。聚集索引中,二叉树的叶节点就是数据节点,而非聚集索引的叶节点仍然是索引节点,但有一个指针指向对应的数据块。

聚集索引对于那些经常要搜索范围值的列特别有效,因为找到包含第一个值的行,便可以确保包含后续索引值的行在物理近邻。

非聚集索引中项目按索引键值的顺序存储,而表中的信息按另一种顺序存储(这可以由聚集索引规定)。


有索引未必检索得快。比如检索全部数据的情况。


14.SQL语句实例

select n(n为任意常量,浮点数,负数,字符串也可以)只是为了判断select的对象表中是否存在满足条件的记录,存在记录就返回一行。

上述select语句还可以加入where子句,比如select 1 from t where t.B = 3; 
满足条件的记录有多少条,结果就返回多少行,行值都为n所对应的常量值;如果没有符合条件的记录,则提示 no rows returned

如 select 1 from t;

如果t中只有1条记录

title: 1

value:1

如果t中有3条记录,则有3行value

title:1

value: 1

            1

            1

(1)找出表ppp中最小的num值,不用min函数

select * from ppp where num <= all(select num from ppp)

slect top 1 num from ppp order by num

(2)找出表ppp中最小的num值,用min函数

select min(num) from ppp

select num from ppp where num=(select min(num) from ppp)     //如果要求这条记录的话,就得用第二种这种写法了

(3)选择表PPP中重复的记录

select * from ppp

where num in(select num from ppp group by num having(count(num)>1))

(4)写出复制表、拷贝表、和四表联查的SQL语句

复制表(只结构,无数据):select * into B from A where 1=0

拷贝表(拷贝数据):select * into B from A

四表联查:select * from A,B,C,D where ..

(5)在SQL Server中用SQL语句建立一张表

create table #Temp(字段1 类型, 字段2 类型, ..)       临时表要在表名前加#

(6)表T2只有一列,共有1000个相同记录,想出方法把第5行到第7行记录取出来,不要使用航标和索引

select top 3 userid from T where userid not in(select top 4 userid from T order by userid) order by userid

select top 7 userid from T where userid > all(select top 4 userid from T order by userid ) order by userid

(7)查数据表中第30到40条记录,有字段ID,但ID并不连续

select * from T where id in(select top 10 id from(select top 40 id from T order by id desc))

select * from T a where exists (select 1 from (select top 10 id from (select top 40 id from T order by id desc) as c)) as b where b.id = a.id

第二句是用exists的一种方法,后面需加where b.id = a.id条件,exists的效率比in要高

(8)如何把时间显示成"20051110 14: 444 : 17"格式

select to_char(sydate,'yyyymmdd hh24:mi:ss') from T

(9)删除重复记录,下面是借助了rowid字段

delete from table1 t1
  where t1.rowid > (select min(t2.rowid) from table1 t2 where t1.id = t2.id);

(10)表T中有10条重复的记录,如何删除其中9条?

答案1:

select top 1 * into # from a

truncate table a

insert a select * from #

答案2:

select distinct * into #tb_tmp from a

drop table a

exec sp_rename 'tb_tmp', 'a'

11.有这样一张表,

id revtime  channel   val

1  2007-5-1   1        79
1  2007-5-1   2        46
1  2007-5-1   3       265
2  2007-6-1   1        80
2  2007-6-1   2        40
2  2007-6-1   3       266
要显示成下面的形式,怎么写SQL语句?
id revtime  channel1data     channel2data  channel3data
1  2007-5-1    79                 46            265
2  2007-6-1    80                 40            266

说明
//根据channel通道号显示出对应通道的数据,用id号聚集
select id,revtime,
max(case channel when 1 then val end) as channel1data
max(case channel when 2 then val end) as channel2data
max(case channel when 3 then val end) as channel3data
from T
group by id,revtime

12.对当前正在运行的数据库改名:sp_renamedb

sp_renamedb  'oldname', 'newname'

对数据表改名

exec sp_rename 'oldname', 'newname'

13.写一个SQL语句,找出修2-3门的学生名字

Study表结构  stu_id, CouseID

Student表结构 Stu_id, Stu_name

 select * from Student as tmp

where (select count(*) from Study where stu_id=tmp.Stu_id) between 2 and 3    //竟然可以这样写,很新奇


发布了143 篇原创文章 · 获赞 11 · 访问量 77万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章