数据库知识点简易版

数据库系统,整理的都是比较简单常用的,很多概念性的东西没有放上来。

一、关系数据库标准语言SQL

SQL组成 

1.DML(数据操作语言)

——查询、插入、删除和修改数据库中的数据;

——SELECT、INSERT、 UPDATE 、DELETE等;

2.DCL(数据控制语言)

——用来控制存取许可、存取权限等;

——GRANT、REVOKE 等;

3.DDL(数据定义语言)

——用来建立数据库、数据库对象和定义其列

——CREATE TABLE 、DROP TABLE 等

4.TCL  (事务控制语句)

变量说明、流程控制、功能函数

——定义变量、判断、分支、循环结构等

——日期函数、数学函数、字符函数、系统函数等

二、SQL基本概念

支持SQL的RDBMS(关系型数据库管理系统)支持关系数据库三级模式结构,如下图。其中外模式对应于视图(view)和部分基本表(base table),模式对应于基本表,内模式对应于存储文件(Stored file)。

1.外模式对应于视图和部分基本表,模式对应于基本表,内模式对应于存储文件。用户可以用sql对基本表和视图进行查询或者其他操作,基本表和视图一样,都是关系。

2.索引是加快查询速度的有效手段。系统在存取数据时会自动选择合适的索引作为存取路径。

创建索引:create [unique] [cluster] Index <索引名>

删除索引:drop index <索引名>

索引是各种关系数据库系统最常见的一种逻辑单元,是关系数据库系统举足轻重的重要组成部分,对于提高检索数据速度有着至关重要的作用,索引的原理是根据索引值得到行指针,然后快速定位到数据库记录。

3.聚集函数:count()-统计元组个数、sum()-求和、avg()-求平均值、max()-求最大值、min()-求最小值

group by— 将查询结果按某一列或多列的值分组,值相等的为一组

对查询结果分组的目的是为了细化聚集函数的作用对象。如果未对查询结果分组,聚集函数将作用于整个查询结果。分组后聚集函数将作用于每一个组,即每一组都有一个函数值。

:求各个课程号及相应的选课人数。Cno为课程号,SC为学生选课表,里面有学号Sno,课程号Cno,成绩Grade三个字段。

select Cno,count(Sno) from SC group by Cno;

该语句对查询结果按Cno的值分组,所有具有相同Cno值的元组为一组,然后对每一组作用聚集函数COUNT计算,以求得改组的学生人数。

如果分组后还要求按一定的条件对这些组进行筛选,最终只输出满足指定条件的组,则可以使用HAVING短语指定筛选条件。

:查询选修了3门以上课程的学生学号。

select Sno from SC group by Sno having count(*) > 3;

先用group by子句按Sno进行分组,再用聚集函数count对每一组计数。having短语给出了选择组的条件,只有满足条件的组才会被选出来。

4.集合查询

Select语句的查询结果是元组的集合,所以多个select语句的结果可进行集合操作。集合操作主要包括并操作Union、交操作Intersect和差操作except。注意,参加集合操作的各查询结果的列数必须相同;对应项的数据类型也必须相同。

5.数据更新

1)插入数据 insert into <表名> [属性列1,属性列2...] values (常量1,常量2);

      插入子查询结果 insert into <表名> [属性列1,属性列2...] 子查询;

2)修改数据 update <表名> set <列名> = <表达式>[, <列名> = <表达式>]… [where<条件>];

      update student set age = age+1;

3)删除数据 delete from <表名> [where<条件>];

6.视图

视图是从一个或几个基本表(或视图)导出的表。它与基本表不同,是一个虚表。数据库中只存放视图的定义,而不存放视图对应的数据,这些数据仍存放在原来的基本表中。所以基本表中的数据发生变化,从视图中查询出的数据也就随之改变了。

1)定义视图:create view <视图名> [<列名>,<列名>…] as <子查询> [with check option]

其中,子查询可以是任意复杂的select语句,但通常不允许含有order by字句和distinct短语。

with check option表示对视图进行update,insert和delete操作时要保证更新、插入或删除的行满足视图定义中的谓词条件(即子查询中的条件表达式)。

2)删除视图:drop view <视图名> [cascade];

视图删除后视图的定义将从数据字典中删除。如果该视图上还导出了其他视图,则使用cascade级联删除语句,把该视图和由它导出的所有视图一起删除。

3)查询视图:select <字段1> <字段2> from <表名>

视图的作用

1).安全性 

因为视图是虚拟的,物理上是不存在的,只是存储了数据的集合,视图中数据是根据基表的更新而更新,用户不可以更改/删除视图。

2).方便,简化数据操作

当我们业务需求要查出多张表的数据,这时我们可能会关联多张表查询处理.如果这个查询sql复杂的话也影响了查询效率. 

这个时候我们就可以创建视图,查询时候只需要 select * from view 就ok啦~

3).订制数据--将你需要的几张表中的数据整合到一张表上面,然后可以做自己想做的事情。

在实际业务中,比如我为某企业做的一个后台管理系统,里面分好几种角色:采购员、销售、技术员、后勤...

后勤部的人可能只需要一些和后勤有关的数据,与他无关的数据对于他们没有意义,这时候我们可以根据业务创建一个后勤视图view_logistics

通过这个create view 视图名 as 命令建立:

例如:create view viewName as(select s.id as schoolId,s.school as schoolName,s.gradeid as gradeid,g.grade as gradeName,g.studentid as studentid ,t.`name` as studentName,t.age as studentAge from school s,grade g,student t where s.gradeid=g.id and  g.studentid=t.id);

查询数据只需要select * from viewName;

4)视图的好处:

(1)视图能够简化用户的操作;

(2)视图使用户能以多种角度看待同一数据;

(3)视图对重构数据库提供了一定程度的逻辑独立性;

(4)视图能够对机密数据提供安全保护;

(5)适当的利用视图可以更清晰的表达查询

视图是从一个或几个基本表中导出的表。它本身不独立存储在数据库中,即数据库中只存放视图的定义而不存放视图对应的数据。用户可以在视图上再定义视图。

7.内连接、外连接

1) 内连接,即最常见的等值连接,例:

SELECT * 

FROM t_user1,t_user2

WHERE t_user1.id = t_user2.id

2) 左外连接是在等值连接的基础上加上主表中的未匹配数据

left outer join 或者 left join

SELECT *

FROM t_user1 

LEFT OUTER JOIN  t_user2

ON t_user1.id = t_user2.id

(以左边的表为准,即:左边表中不匹配的数据加入到搜索结果中)

3) 右外连接是在等值连接的基础上加上被连接表的不匹配数据

right outer join 或者 right join

SELECT *

FROM t_user1

RIGHT OUTER JOIN t_user2

ON t_user1.id=t_user2.id

4) 全外连接 full outer join 或者 full join

全外连接是在等值连接的基础上将左表和右表的未匹配数据都加上

SELECT * 

FROM t_user1

FULL OUTER JOIN t_user2

ON t_user1.id=t_user2.id

全外连接的等价写法,对同一表先做左连接,然后右连接

SELECT  t_user1.*,t_user2.*

FROM t_user1

LEFT OUTER JOIN t_user2

ON t_user1.id = t_user2.id

UNION

SELECT  t_user1.*,t_user2.*

FROM t_user2

LEFT OUTER JOIN t_user1

ON t_user1.id = t_user2.id

三、数据库的安全性控制

1.授权与回收

1)grant 

语句的一般格式为:

grant <权限> [,<权限>] on <对象类型> <对象名> [<对象类型> <对象名>]…

to <用户> [,<用户>]…

[with grant option];

eg: grant select on table student to user1;

数据库角色:是被命名的一组与数据库操作相关的权限,角色是权限的集合。因此,可以为一组具有相同权限的用户创建一个角色,使用角色来管理数据库权限可以简化授权的过程。

角色的创建:create role <角色名>

给角色赋权:grant <权限> on <对象类型> 对象名 to <角色>…

将一个角色授予其他的角色或用户:grant <角色1>[,<角色2>]… to <角色3> [,<用户1>]…[with admin option]

with admin option子句,则获得某种权限的角色或用户还可以把这种权限再授予其他的角色。

2)角色权限的收回revoke <权限> [,<权限>]… on <对象类型> <对象名> from <角色> [,<角色>]

四、数据完整性

1.实体完整性

关系模型的实体完整性在create table中用primary key定义。实体完整性检查包括:

1)检查主码值是否唯一,如果不唯一则拒绝插入或修改。

2)检查主码的各个属性是否为空,只要有一个为空就拒绝插入或修改。

从而保证了实体完整性。

2.参照完整性

关系模型的实体完整性在create table中用foreign key定义哪些列为外码,用references短语指明这些外码参照哪些表的主码。

3.用户定义的完整性

属性上的约束条件,即属性值限制包括:

列值非空(not null)

列值唯一(unique)

检查列值是否满足一个布尔表达式(check短语)

4.触发器

是用户定义在关系表上的一类由事件驱动的特殊过程。一旦定义,任何用户对表的增删改操作均由服务器自动激活相应的触发器,在DBMS(数据库管理系统)核心层进行集中的完整性控制。类似于约束。

create trigger <触发器名> {before|after} <触发事件> on <表名> for each {row|statement} [when <触发条件>] <触发动作体>

触发事件可以是insert、delete或update,也可以是这几个事件的组合,如insert or delete等。update后面还可以有of<触发列,…>,即进一步指明修改哪些列时触发器激活。

触发器按照所触发动作的间隔尺寸可以分为行级触发器(for each row)和语句级触发器(for each statement)。

触发器被激活只有当触发条件为真时触发动作体才执行;否则触发动作体不执行。如果省略when触发条件,则触发动作体在触发器激活后立即执行。

五、存储过程

存储过程被编译后保存在数据库中,可以被反复调用,运行速度较快。存储过程是由PL/SQL语句书写的过程,这个过程经编译和优化后存储在数据库服务器中,因此称它为存储过程,使用时只要调用即可。

优点:

1).由于存储过程不像解释执行的SQL语句那样在提出操作请求时才进行语法分析和优化工作,因而运行效率高,它提供了在服务器端快速执行sql语句的有效途径。

2).存储过程降低了客户机和服务器之间的通信量。客户机上的应用程序只要通过网络向服务器发出存储过程的名字和参数,就可以让RDBMS执行许多条的SQL语句,并执行数据处理。只有最终处理结果才返回客户端。

3).方便实施企业规则。可以把企业规则的运算程序写成存储过程放入数据库服务器中,由RDBMS管理,既有利于集中控制,又能够方便地进行维护。当用户规则发生变化时只要修改存储过程,无需修改其他应用程序。

1.创建存储过程

create procedure 过程名 ([参数1,参数2,…]) /*存储过程首部*/

as

<PL/SQL块>;/*存储过程体,描述该存储过程的操作*/

2.执行存储过程

call/perform procedure 过程名([参数1,参数2,...]);

3.删除存储过程

drop procedure 过程名();

六、事务的基本概念

事务是用户定义的一个数据库操作序列,这些操作要么全做要么全不做,是一个不可分割的工作单位。事务通常以begin transaction开始,以commit或rollback结束。commit表示提交,即提交事务的所有操作。rollback表示回滚,即在事务运行的过程中发生了某种故障,事务不能继续执行,系统将事务中对数据库的所有已完成的操作全部撤销,回滚到事务开始时的状态。

它有如下四个特性:

1.A (Atomicity) 原子性

原子性很容易理解,也就是说事务里的所有操作要么全部做完,要么都不做,事务成功的条件是事务里的所有操作都成功,只要有一个操作失败,整个事务就失败,需要回滚。

比如银行转账,从A账户转100元至B账户,分为两个步骤:1)从A账户取100元;2)存入100元至B账户。这两步要么一起完成,要么一起不完成,如果只完成第一步,第二步失败,钱会莫名其妙少了100元。

2.C (Consistency) 一致性

一致性也比较容易理解,也就是说数据库要一直处于一致的状态,事务的运行不会改变数据库原本的一致性约束。

例如现有完整性约束a+b=10,如果一个事务改变了a,那么必须得改变b,使得事务结束后依然满足a+b=10,否则事务失败。

3.I (Isolation) 独立性

所谓的独立性是指并发的事务之间不会互相影响,如果一个事务要访问的数据正在被另外一个事务修改,只要另外一个事务未提交,它所访问的数据就不受未提交事务的影响。

比如现在有个交易是从A账户转100元至B账户,在这个交易还未完成的情况下,如果此时B查询自己的账户,是看不到新增加的100元的。

4.D (Durability) 持久性

持久性是指一旦事务提交后,它所做的修改将会永久的保存在数据库上,即使出现宕机也不会丢失。

七、数据库优化相关

1.原则上为创建的每个表都建立一个主键,主键唯一标识某一行记录,用于强制表的实体完整性。

2.为每一个外键列建立一个索引,如果确认它是唯一的,就建立唯一索引。

3.查询仅仅返回需要的行和列,尽量避免全表查询(select * from table)。

4.在适当的时候使用事务,尽量将事务放在一个存储过程中。

5.对于大表查询,应考虑在where及order by涉及的列上建立索引。

6.尽量避免在where子句中对字段进行null值判断,否则将导致引擎放弃使用索引而进行全表扫描。

7.应尽量避免在where子句中使用 != 或 <>操作符,否则将导致引擎放弃使用索引而进行全表扫描。

8.应尽量避免在where子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描。

9.应尽量避免在where子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描。

10.in和not in要慎用,否则会导致全表扫描,对于连续的数值,能用between就不要用in。

11.不要在where子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引。

12.尽量避免在一个复杂查询里面使用 like, 例如:select * from tableName where column1 '%parm1%’。

13.查两张以上表时,把记录少的放在右边。

14.避免在索引列上使用 is null和is not null。

15.避免使用耗费资源的操作,带有DISTINCT,UNION,MINUS,INTERSECT,ORDER BY的SQL语句会启动SQL引擎 执行,耗费资源的排序(SORT)功能。DISTINCT需要一次排序操作, 而其他的至少需要执行两次排序。

16.避免使用NOT IN,可以用LEFT OUTER JOIN代替它。

17.不要在where子句中进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引。

18.尽量使用exists代替select count(*)来判断是否存在记录。

19.避免频繁创建和删除临时表,减少系统表资源的消耗。 

20.尽量使用UNION ALL代替UNION。

21.要尽量避免在where子句中对字段进行NULL值判断。

22.要尽量避免在where子句使用<>对字段进行判断。

23.避免在WHERE子句中使用in,not in,or 或者having。

24.使用exists(not exists)替换in(not in)的使用。

25.使用where字句进行范围判断的时候,尽量使用>=替换>、<=替换<。

26.多表连接的时候,表名都使用别名字段都带上别名

27.尽量多使用commit提交数据。

28.当只要一行数据时使用 LIMIT 1。

29.提防隐式类型转换,a=0与a=‘0’是完全不同的,比如a字段类型是varchar2,sql语句where a=0,这样就会很低效。

猜你喜欢

转载自blog.csdn.net/m0_37568814/article/details/82698270