数据库

1.   数据库事务的 4 个特性是:原子性、一致性、持续性、隔离性

1)   原子性:事务是数据库的逻辑工作单位,它对数据库的修改要么全部执行,要么全部不执行。

2)   一致性:事务前后,数据库的状态都满足所有的完整性约束。

3)   隔离性:并发执行的事务是隔离的,一个不影响一个。如果有两个事务,运行在相同的时间内,执行相同的功能,同一时间仅有一个请求用于同一数据。设置数据库的隔离级别,可以达到不同的隔离效果。

4)   持久性:在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。

 

2.   零散知识点:

1)   数据库系统的主要特点:数据结构化、数据度的冗余度小、较高的数据独立性。

2)   关系数据模型的三个组成部分:数据结构,完整性,数据模型

3)   数据库管理系统的主要功能:数据定义,数据操作,数据库的运行管理,数据组织、存储与管理,数据库的保护和维护,通信

4)   数据库系统:数据库数据库管理系统以及其开发工具应用系统数据库管理员构成。其中,数据库系统软件包括数据库管理系统、开发工具和数据库应用系统。

 

3.   SQL语句如何实现收回 user2 查询基本表 T 的权限?

revoke select on t from user2

1)   deny:在安全系统中创建一项,以拒绝给当前数据库内的安全帐户授予权限并防止安全帐户通过其组或角色成员资格继承权限。

例如:拒绝user4查询视图MyView的权限 deny SELECT on MyView to user4

2)   revoke删除以前在当前数据库内的用户上授予或拒绝的权限。

 

4.   数据库中的几种语言:

1)   数据查询语言(DQL):用来查询记录。保留字:select、where、order by、group by、having。

2)   数据操作语言(DML):用来操纵数据库记录。保留字:insert、update、delete。

3)   数据定义语言(DDL):用来定义数据库的表、库、列等对象。保留字:create、alter、drop、truncate

4)   数据控制语言(DCL):用来定义访问权限和安全级别。保留字:commit,rollback、savepoint、grant、revoke。

授予权限 grant privileges on dbname.tablename to‘username’@’host’

a)    privileges:可以是SELECT,INSERT,UPDATE等,如果要授予所的权限则用ALL

b)    dbname:数据库名

c)    tablename:表名,若要授予该用户对数据库中所有表的操作权限则可用表示,如.*

例如:grant select on BookStore.* to UserA

撤销权限 revoke privilege on dbname.tablename from ‘username’@’host’;

 

5.   零散知识点:

1)   超键(super key):在关系中能唯一标识元组的属性集称为关系模式的超键

2)   候选键(candidate key):不含有多余属性的超键称为候选键

3)   主键(primary key):用户选作元组标识的一个候选键称为主键

 

6.   对于数据库索引的说法错误的是(B)

A 索引可以提升查询,分组和排序的性能;

B 索引不会影响表的更新、插入和删除操作的效率;

C 全表扫描不一定比使用索引的执行效率低;

D 对于只有很少数据值的列,不应该创建索引

 

有关数据库中索引的相关知识点:

A.   索引的概念

数据库索引,是数据库管理系统中一个排序的数据结构以协助快速查询、更新数据库表中数据。索引的实现通常使用B树及其变种B+树 。在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法。这种数据结构,就是索引。为表设置索引要付出代价的:一是增加了数据库的存储空间 ,二是在插入和修改数据时要花费较多的时间(因为索引也要随之变动) 。

B.   创建索引的优点:

1)   通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性

2)   大大加快数据的检索速度,这也是创建索引的最主要的原因。

3)   加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。

4)   使用分组和排序子句进行检索,减少查询中分组和排序的时间

5)   通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。 

C.   增加索引的弊端:

1)   对表中的数据进行增删改时,索引也要动态维护,降低了数据库的维护性。

2)   索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。

3)   创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。  

 

D.   需要创建索引的列:

索引是建立在数据库表中的某些列的上面。在创建索引的时候,应该考虑在哪些列上可以创建索引,在哪些列上不能创建索引。 一般来说,应该在以下这些列上创建索引:

1)   在经常需要搜索的列,可以加快搜索的速度;

2)   在作为主键的列,强制该列的唯一性和组织表中数据的排列结构;

3)   在经常用在连接的列,这些列主要是一些外键,可以加快连接的速度;

4)   在经常需要根据范围进行搜索的列,因为索引已经排序,其指定的范围是连续的;

5)   在经常需要排序的列上创建索引,这样查询可以利用索引的排序,加快排序查询时间;

6)   在经常使用在WHERE子句中的列上面创建索引,加快条件的判断速度。

 

E.   不适合创建索引的列:

不应该创建索引的的这些列具有下列特点:

1)   在查询中很少使用或者参考的列不应该创建索引。既然这些列很少使用到,因此有索引或者无索引,并不能提高查询速度。相反,由于增加了索引,反而降低了系统的维护速度和增大了空间需求。

2)   对于那些只有很少数据值的列也不应该增加索引。由于这些列的取值很少,例如人事表的性别列,在查询的结果中,结果集的数据行占了表中数据行的很大比例,即需要在表中搜索的数据行的比例很大。增加索引,并不能明显加快检索速度。

3)   对于那些定义为text, image和bit数据类型的列不应该增加索引。这些列的数据量要么相当大,要么取值很少。

4)   当修改性能远远大于检索性能时,不应该创建索引。修改性能和检索性能是互相矛盾的。当增加索引时,会提高检索性能,但是会降低修改性能。当减少索引时,会提高修改性能,降低检索性能。因此,当修改性能远远大于检索性能时,不应该创建索引。

 

F.   索引的分类:

三种索引: 唯一索引、主键索引和聚集索引

1)   普通索引:最基本的索引,而且没有唯一性之类的限制

创建:create index [indexName] on [TableName] ([column],…)

删除:drop index [tableName].[indexName]

 

唯一索引不允许其中任何两行具有相同索引值的索引。当现有数据中存在重复的键值时,大多数数据库不允许将新创建的唯一索引与表一起保存。数据库还防止添加,将在表中创建重复键值的新数据。

例如,如果在 employee 表中职员的姓 (lname) 上创建了唯一索引,则任何两个员工都不能同姓。

创建: create Unique index [indexName] on [TableName] ([column],…)

删除:drop index [TableName].[IndexName]

 

2)   主键索引

数据库表经常有一列或列组合,其值唯一标识表中的每一行。该列称为表的主键。在数据库关系图中为表定义主键将自动创建主键索引,主键索引是唯一索引的特定类型。该索引要求主键中的每个值都唯一。当在查询中使用主键索引时,它还允许对数据的快速访问。建议建立唯一索引时,直接创建主键索引就好了。

 

3)   聚集索引

该索引中键值的逻辑顺序决定了表中相应行的物理顺序。聚集索引类似于电话簿,按姓氏排列数据。由于聚集索引规定数据在表中的物理存储顺序,因此一个表只能包含一个聚集索引。但该索引可以包含多个列(组合索引),就像电话簿按姓氏和名字进行组织一样。

创建:CREATE cluster index [IndexName] ON [TableName]([ColumnName],[ColumnName],...)

聚集索引使用注意事项:

(1) 定义聚集索引键时使用的列越少越好

(2) 使用下列运算符返回一个范围值的查询:BETWEEN、>、>=、< 和 <=,可以按物理顺序更快的返回一个范围;

(3) 被连续访问的列;

(4) 返回大型结果集的查询;

(5) 经常被使用表联接或 GROUP BY 子句的查询访问的列;一般来说,这些是外键列。对 ORDER BY 或 GROUP BY 子句中指定的列进行索引,可以使 SQL Server 不必对数据进行排序,因为这些行已经排序。这样可以提高查询性能;

(6) OLTP 类型的应用程序,这些程序要求进行非常快速的单行查找(一般通过主键)。应在主键上创建聚集索引;

 

4)   非聚集索引

数据存储在一个地方,索引存储在另一个地方,索引带有指针指向数据的存储位置。非聚集索引中的项目按索引键值的顺序存储而表中的信息按另一种顺序存储(这可以由聚集索引规定)。对于非聚集索引,可以为在表非聚集索引中查找数据时常用的每个列创建一个非聚集索引。有些书籍包含多个索引。例如,一本介绍园艺的书可能会包含一个植物通俗名称索引,和一个植物学名索引,因为这是读者查找信息的两种最常用的方法。

创建CREATE noclustered index [IndexName] ON [TableName]([ColumnName],[ColumnName]...)

 

7.   数据表建立复合索引tab_index(“name”,”age”),下面哪些语句能用上索引?(A)

A select*from table where age=18 and name=’test’;

B select*from table where name=’test’and age=18;

C select*from table where name like”%test%”and age=18;

D select*from table where name like”%test”and age=18;

 

1)   什么是复合索引?

索引可以包含一个、两个或更多个列。两个或更多个列上的索引被称作 复合索引。

2)   复合索引作用

利用索引中的附加列,您可以缩小搜索的范围,但使用一个具有两列的索引不同于使用两个单独的索引。

3)   例子

 CREATE INDEX name ON employee (emp_lname, emp_fname)

复合索引的结构与电话簿类似,它首先按姓氏对雇员进行排序,然后按名字对所有姓氏相同的雇员进行排序。如果您知道姓氏,电话簿将非常有用,如果您知道名字和姓氏,电话簿则更为有用,但如果您只知道名字而不知道姓氏,电话簿将没有用处。所以复合索引,字段的先后顺序是很重要的。 列的顺序:在创建复合索引时,应该仔细考虑列的顺序。对索引中的所有列执行搜索或仅对前几列执行搜索时,复合索引非常有用;仅对后面的任意列执行搜索时,复合索引则没有用处。

解析:

A,没有注意复合索引顺序

B 正确

C 凡是对索引列,使用了‘%XXX’,都不走索引。如果改为where name = 'test%'则可以走索引。

 

8.   数据库设计分为四个阶段:

1)需求分析阶段:编写软件规格说明书及初步的用户手册,提交评审。

2)概念设计阶段:E-R图设计阶段。

3)逻辑设计阶段:主要是E_R转换成关系模式(或者说是建立关系模式的阶段)。

4)物理设计阶段

注:在数据库设计中,描述数据间内在语义联系得到E-R图的过程属于(概念设计阶段)

 

9.   数据库中并发操作的相关知识点:

A.   并发与并行的区分:

1)   并发(Concurrent)当有多个线程在操作时,如果系统只有一个CPU,则它不可能真正同时进行一个以上的线程,它只能把CPU运行时间划分成若干个时间段,再将时间段分配给各个线程执行,在一个时间段的线程代码运行时,其它线程处于挂起状。

2)   并行(Parallel):当系统有一个以上CPU时,则线程的操作有可能非并发。当一个CPU执行一个线程时,另一个CPU可以执行另一个线程,两个线程互不抢占CPU资源,可以同时进行。

3)   区别:并发和并行是即相似又有区别的两个概念,并行是指两个或者多个事件在同一时刻发生;而并发是指两个或多个事件在同一时间间隔内发生。

 

B.   数据库事务并发带来的数据不一致问题有:更新丢失、脏读、不可重复读、幻象读。

1)   丢失修改:一个事务的更新覆盖了另一个事务的更新。两个事务读入同一数据并修改,后提交的结果破坏先提交的结果,导致先提交的事务修改被丢失;

 

2)   不可重复读:一个事务两次读取同一个数据,两次读取的数据不一致。先提交的事务读取数据后,后提交的事务执行更新操作,使得前面的事务不能读取前一次结果。

 

3)   读脏数据:一个事务读取了另一个事务未提交的数据。某事务修改某一数据,并将它写回磁盘,后来的事务读取同一数据后,前一事务由于某种原因回滚(rollback),这时前面已经修改的数据已经恢复原值,后读到的数据就与数据库的数据不一致。

 

4)   幻象读:一个事务两次读取一个范围的记录,两次读取的记录数不一致。

a)   事务T1按一定条件从数据库中读取了某些数据记录后,事务T2删除了其中部分记录,当T1再次按照相同条件读取数据时,发现某些记录神秘的消失了.

b)   事务T1按一定条件从数据库中读取了某些数据记录后,事务T2插入了一些记录,当T1再次按照相同条件读取数据时,发现多了一些记录.

 

事务A:张三妻子两次查询张三有几张银行卡。事务B:张三新办一张银行卡。事务A第一次查询银行卡数的时候,张三还没有新办银行卡,第二次查询银行卡数的时候,张三已经新办了一张银行卡,导致两次读取的银行卡数不一样。幻象读本质上是读写操作的冲突,解决办法是读完再写。

 

以上三种现象的原因是并发操作破坏了事务的隔离性。为了应对这些数据不一致性,主要技术主要有:封锁,时间戳,乐观控制法。

 

10.  数据库中的封锁机制相关知识点

A.   封锁机制的概念

封锁就是事务T在对某个数据对象操作之前,先向系统发出请求对其加锁。加锁后事务T就对该数据对象有了一定的控制,在事务T释放它的锁之前,其他事务不能更新此数据对象。基本的锁类型有两种:排他锁(又称写锁,X锁)和共享锁(又称读锁,S锁),此处再加一个更新锁意向锁

 

1)   共享锁(读锁S锁),是读取操作创建的锁。事务T对数据A加上共享锁后,则其他事务只能对A再加共享锁,不能加排他锁。获准共享锁的事务只能读数据,不能修改数据。

2)   排他锁(写锁X锁),如果事务T对数据A加上排他锁后,则其他事务不能再对A加任任何类型的封锁。获准排他锁的事务T既能读数据,又能修改数据。

3)   更新锁(U锁):更新锁在修改操作的初始化阶段用来锁定可能要被修改的资源,这样可以避免使用共享锁造成的死锁现象。因为使用共享锁时,修改数据的操作分为两步,首先获得一个共享锁,读取数据,然后将共享锁升级为排它锁,然后再执行修改操作。这样如果同时有两个或多个事务同时对一个事务申请了共享锁,在修改数据的时候,这些事务都要将共享锁升级为排它锁。这时,这些事务都不会释放共享锁而是一直等待对方释放,这样就造成了死锁。如果一个数据在修改前直接申请更新锁,在数据修改的时候再升级为排它锁,就可以避免死锁。

4)   意向锁:对多粒度树中的结点加意向锁,则说明该结点的下层结点正在被加锁;对任一结点加锁时,必须先对它的上层结点加意向锁。

意向锁的作用就是当一个事务在需要获取资源锁定的时候,如果遇到自己需要的资源已经被排他锁占用的时候,该事务可以需要锁定行的表上面添加一个合适的意向锁。如果自己需要一个共享锁,那么就在表上面添加一个意向共享锁。而如果自己需要的是某行(或者某些行)上面添加一个排他锁的话,则先在表上面添加一个意向排他锁。意向共享锁可以同时并存多个,但是意向排他锁同时只能有一个存在。

 

 

意向锁是InnoDB自动加的,不需用户干预。对于UPDATE、DELETE和INSERT语句,InnoDB会自动给涉及数据集加排他锁(X);对于普通SELECT语句,InnoDB不会加任何锁;事务可以通过以下语句显示给记录集加共享锁或排他锁。

共享锁(S):SELECT * FROM table_name WHERE ... LOCK IN SHARE MODE

排他锁(X):SELECT * FROM table_name WHERE ... FOR UPDATE

 

B.   封锁协议

在运用X锁和S锁这两种基本封锁对数据对象加锁时,还需要约定一些规则。例如,何时申请X锁或S锁、持锁时间、何时释放等。这些规则称为封锁协议。通常使用三级封锁协议来在不同程度上解决并发操作的不正确调度带来的丢失修改、不可重复读和读“脏”数据等不一致性问题。

1)   一级封锁协议

事务T在修改数据R之前必须先对其加X锁,直到事务结束才释放。一级封锁协议可以防止丢失修改,并保证事务T是可恢复的。

2)   二级封锁协议

在一级封锁协议基础上增加事务T在读数据R之前必须先对其加S锁,读完后释放S锁。二级封锁协议防止丢失修改读脏数据

3)   三级封锁协议

在一级封锁协议的基础上增加事务T在读数据R之前必须先对其加S锁,直到事务结束才释放。三级封锁协议出防止了丢失修改和读“脏”数据外,还可以进一步防止了不可重复读。

 

C.   Mysql中锁的粒度划分

MySQL各存储引擎使用了三种级别的锁定机制:表级锁定,行级锁定和页级锁定

1)   表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低;

MyISAM在执行查询语句(SELECT)前,会自动给涉及的所有表加读锁,在执行更新操作(UPDATE、DELETE、INSERT等)前,会自动给涉及的表加写锁,这个过程并不需要用户干预,因此,用户一般不需要直接用LOCK TABLE命令给MyISAM表显式加锁。

2)   行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高;

3)   页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。

4)   适用范围:从锁的角度来说,表级锁更适合于以查询为主,只有少量按索引条件更新数据的应用,如Web应用;而行级锁则更适合于有大量按索引条件并发更新少量不同数据,同时又有并发查询的应用,如一些在线事务处理(OLTP)系统。

 

例题;

若事务 T 对数据 R 已加 X 锁,则其他事务对数据 R(D)

A 可以加 S 锁不能加 X 锁 ;B 不能加 S 锁可以加 X 锁

C 可以加 S 锁也可以加 X 锁 ; D 不能加任何锁

 

11.  数据库中的三级模式:外模式,(概念)模式,内模式。

1)   模式:模式又称概念模式逻辑模式,对应于概念级。它是由数据库设计者综合所有用户的数据,按照统一的观点构造的全局逻辑结构,是对数据库中全部数据的逻辑结构和特征的总体描述,是所有用户的公共数据视图(全局视图)。由DDL来描述、定义的,体现、反映了数据库系统的整体观。

2)   外模式:外模式又称子模式用户模式,对应于用户级。它是某个或某几个用户所看到的数据库的数据视图,是与某一应用有关的数据的逻辑表示。利用数据操纵语言DML对这些数据记录进行

3)   内模式:内模式又称存储模式,对应于物理级,它是数据库中全体数据的内部表示或底层描述,是数据库最低一级的逻辑描述,它描述了数据在存储介质上的存储方式和物理结构,对应着实际存储在外存储介质上的数据库。内模式由内模式描述语言来描述、定义,它是数据库的存储观。

外模式和模式建立逻辑独立性数据的逻辑独立性是指(用户的应用程序与数据库的逻辑结构是相互独立的);模式和内模式建立物理独立性

 

12.  OODB中,包含其他对象的对象,称为(复合对象)

ORDB 中,同类元素的无序集合,并且允许一个成员可多次出现,称为(多集类型也称作包类型

 

13.  数据库中的几种故障

1)   事务故障:由非预期的、不正常的程序结束所造成的故障。如输入数据错误、运算溢出、违反存储保护、并行事务发生死锁;

2)   系统故障:系统的运行过程中,由于某种原因造成系统停止运转,致所有正在运行的事务都以非正常的方式终止,要求系统重新启动。如CPU错误、DBMS代码错误

3)   介质故障:系统在运行过程中,辅助存储器介质受到破坏,使存储在外存中的数据部分或全部丢失。

 

14.  关于JDBC PreparedStatement:可以用来进行动态查询、通过预编译和缓存机制提升了执行的效率、有助于防止SQL注入,因为它会自动对特殊字符转义。

 

15.  数据库中范式相关知识点:

A.   有关“键”的概念

1)   超键:在关系中能唯一标识元组的属性或属性集称为关键模式的超键。

2)   候选键:不含有多余属性的超键称为候选键。也就是在候选键中在删除属性就不是键了。

3)   主键:用户选作元组标识的候选键称为主键。一般不加说明,键就是指主键。

4)   外键:如果模式R中属性K是其他模式的主键,那么K在模式R中称为外键。

 

B.   关系数据库中的“依赖”定义

若在一张表中,在属性(或属性组)X的值确定的情况下,必定能确定属性Y的值,那么就可以说Y函数依赖于X,写作 X → Y。

例如在学生表中,找不到任何一条记录,它们的学号相同而对应的姓名不同。所以我们可以说姓名函数依赖于学号,写作 学号 → 姓名。但是反过来,因为可能出现同名的学生,所以有可能不同的两条学生记录,它们在姓名上的值相同,但对应的学号不同,所以我们不能说学号函数依赖于姓名。

1)   部分函数依赖:设X,Y是关系R的两个属性集合,存在X→Y,若X’是X的真子集,存在X’→Y,则称Y部分函数依赖于X。

举个例子:学生基本信息表R中(学号,身份证号,姓名)当然学号属性取值是唯一的,在R关系中,(学号,身份证号)->(姓名),(学号)->(姓名),(身份证号)->(姓名);所以姓名部分函数依赖与(学号,身份证号);

2)   完全函数依赖:设X,Y是关系R的两个属性集合,X’是X的真子集,存在X→Y,但对每一个X’都有X’!→Y,则称Y完全函数依赖于X。

例子:学生基本信息表R(学号,班级,姓名)假设不同的班级学号有相同的,班级内学号不能相同,在R关系中,(学号,班级)->(姓名),但是(学号)->(姓名)不成立,(班级)->(姓名)不成立,所以姓名完全函数依赖与(学号,班级);

3)   传递函数依赖:设X,Y,Z是关系R中互不相同的属性集合,存在X→Y(Y !→X),Y→Z,则称Z传递函数依赖于X。

例子:在关系R(学号 ,宿舍, 费用)中,(学号)->(宿舍),宿舍!=学号,(宿舍)->(费用),费用!=宿舍,所以符合传递函数的要求;

 

C.   几个范式的定义

1)   第一范式(1NF)

主属性(主键)不为空且不重复,字段不可再分。

2)   第二范式(2NF)

在第一范式的基础上,要求非主属性完全依赖主属性。(不存在非主属性对主键的部分依赖)

3)   第三范式(3NF)

3NF在2NF的基础之上,消除了非主属性对于码的传递依赖(不能存在:非主键列 A 依赖于非主键列 B,非主键列 B 依赖于主键的情况。)

4)   BC范式(BCNF)

BC范式在 3NF 的基础上,消除主属性对于码的部分与传递函数依赖

(1)所有非主属性对每一个码都是完全函数依赖;

(2)所有的主属性对于每一个不包含它的码,也是完全函数依赖;

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

 

D.   几个范式的定义

1)   第一范式

 

改为

 

2)   第二范式

当数据表中是联合主键,但是有的列只依赖联合主键中的一个或一部分属性组成的联合主键,此时需要拆表才能复合第二范式。

 

两个主属性:学号 和 课程。“学号“和”课程“就组成了联合主键。

对于(学号,课名) → 姓名,有 学号 → 姓名,存在非主属性 姓名 对码(学号,课名)的部分依赖。

对于(学号,课名) → 系名,有 学号 → 系名,存在非主属性 系名 对码(学号,课名)的部依赖。

对于(学号,课名) → 系主任,有 学号 → 系主任,存在非主属性 系主任  对码(学号,课名)的部分依赖

3)   第三范式

Employee(emp_id,emp_name,emp_age,dept_id,dept_name,dept_info),当员工表中emp_id能够唯一确定员工员工信息,但是dept_name可由dept_id唯一确定,此时,该表不符合第三范式,此时可以删除除了dept_id之外的其他部门信息,把所有部门信息单独建立一张部门表。

4)   BC范式

某公司有若干个仓库;每个仓库只能有一名管理员,一名管理员只能在一个仓库中工作; 一个仓库中可以存放多种物品,一种物品也可以存放在不同的仓库中。每种物品在每个仓库中都有对应的数量。

那么关系模式 仓库(仓库名,管理员,物品名,数量) 属于哪一级范式?

答:已知函数依赖集:仓库名 → 管理员,管理员 → 仓库名,(仓库名,物品名)→ 数量

码:(管理员,物品名),(仓库名,物品名)

主属性:仓库名、管理员、物品名 ;非主属性:数量

∵ 不存在非主属性对码的部分函数依赖和传递函数依赖。∴ 此属于3NF。

某仓库被清空后,需要删除所有与这个仓库相关的物品存放记录,会带来什么问题?——仓库本身与管理员的信息也被随之删除了。 如果某仓库更换了管理员,会带来什么问题?——这个仓库有几条物品存放记录,就要修改多少次管理员信息。

但是存在着主属性对于码的部分函数依赖与传递函数依赖。(在此例中就是存在主属性 仓库名 对于码(管理员,物品名)的部分函数依赖:仓库名 → 管理员

仓库(仓库名,管理员) 库存(仓库名,物品名,数量)。这样,之前的插入异常,修改异常与删除异常的问题就被解决了。

 

16.  按照规范设计,我们将数据库的设计过程分为六个阶段: 

1)   系统需求分析阶段: 1:调查分析用户活动;2:收集和分析需求数据,确定系统边界信息需求,处理需求,安全性和完整性需求;3:编写系统分析报告

2)   概念结构设计阶段:1、需求分析数据;2、局部E-R模型;3、全局E-R模型

3)   逻辑结构设计阶段:1、初始关系模式设计;2、关系模式规范化:3:模式评价

4)   物理结构设计阶段;1、确定物理结构;2、评价物理结构

5)   数据库实施阶段:1、建立实际数据库结构;2、装入数据;3、数据库试运行;4、应用程序编码与调试;5、整理文档

6)   数据库运行与维护阶段:1、维护数据库的安全性和完整性;2、监测并改善数据库性能;3、重新组织和构造数据库

 

17.  视图设计一般有3种设计次序

1、自顶向下。先全局框架,然后逐步细化 

2、自底向上。先局部概念结构,再集成为全局结构 

3、由里向外。先核心结构,再向外扩张 

4、混合策略。1与2相结合,先自顶向下设计一个概念结构的框架,再自底向上为框架设计局部概念结构

 

18.  用命令()可以查看mysql数据库中user表的表结构?

desc user;  show create table user;   describe user; 三种都可以。

 

 

19.  关系规范化中的删除异常是指(不该删除的数据被删除); 应该删除的数据未被删除 是运行时异常,我们一般说的异常都是指运行时异常

 

20.  SQL 语言是(非过程化)的语言,易学习。

 

21.  在SQL语句中引用宿主变量时,为了区别数据库中变量,宿主变量前须加“:”,它可与数据库中变量同名。在宿主语言语句中,宿主变量可与其它变量一样使用,不须加冒号。当宿主变量的数据类型与数据库中不一致时,由系统按约定转换。

 

22.  数据库中的视图(子查询)相关知识点:

视图(子查询):是从一个或多个表导出的虚拟的表,其内容由查询定义。具有普通表的结构,但是不实现数据存储。对视图的修改:单表视图一般用于查询和修改,会改变基本表的数据,多表视图一般用于查询,不会改变基本表的数据。

1)   定义和概念

① 从一个或几个基本表中根据用户需要而做成一个虚表

② 视图是虚表,它在存储时只存储视图的定义,而没有存储对应的数据 

③ 视图只在刚刚打开的一瞬间,通过定义从基表中搜集数据,并展现给用户

2)   视图的优点

① 能分割数据,简化观点。可以通过select和where来定义视图,从而可以分割数据基表中某些对于用户不关心的数据,使用户把注意力集中到所关心的数据列.进一步简化浏览数据工作 

② 为数据提供一定的逻辑独立性。 如果为某一个基表定义一个视图,即使以后基本表的内容的发生改变了也不会影响“视图定义”所得到的数据 

③ 提供自动的安全保护功能。 视图能像基本表一样授予或撤消访问许可权,给用户是表的一部分访问权限而不是全部。

④ 视图可以间接对表进行更新,因此视图的更新就是表的更新 

3)   使用视图的一些限制和规则

① 视图必须唯一命名,不能和表或者其他视图重名

② 视图可以嵌套,可以从其他视图中构造视图

③ order by可以用在视图定义中,但是如果select语句从视图中检索数据时候,在视图中order by将被覆盖。

4)   视图和基本表的区别

a)   视图是已经编译好的sql语句。而表不是  

b)   视图没有实际的物理记录。而表有。

c)   表是内容,视图是窗口

d)   表只用物理空间而视图不占用物理空间,视图只是逻辑概念的存在,表可以及时对它进行修改,但视图只能有创建的语句来修改

e)   表是内模式,视图是外模式

f)   视图是查看数据表的一种方法,可以查询数据表中某些字段构成的数据,只是一些SQL语句的集合。从安全的角度说,视图可以不给用户接触数据表,从而不知道表结构。

g)   表属于全局模式中的表,是实表;视图属于局部模式的表,是虚表。 

h)   视图的建立和删除只影响视图本身,不影响对应的基本表。

5)   视图的创建、删除、使用、查看:

CREATE or replace view VIEW view_name AS

SELECT column_name(s)

FROM table_name

WHERE condition

DROP VIEW view_name

select * from view当成表使用就好

由于视图相关与一张虚表,使用show tables查看当前数据中的视图:

6)   通过视图变更数据

INSERT INTO v_order(pid,pname,price) VALUES('p010','柴油','34');

跨表插入数据系统反馈报错,提示不能修改超过一个表的数据。因此,可以通过视图插入数据,但是只能基于一个基础表进行插入,不能跨表更新数据。

 

补充考点:创建视图的时候的 with check 语句

对视图进行update或者insert操作时,保证更新或者插入的行满足图中定义的谓词条件。例如:一张表里有个字段是专业的;你创建视图的时候 create view stu as select 学生 from table where 专业='计算机' with check option 这样where后面就实现了对专业的限定 以后你如果对视图添加记录的时候专业如果不是计算机的话不让添加进去的。

 

    Access的数据表视图中,可以修改字段名称、删除字段和删除记录,但是不能够修改字段类型。字段的类型需要在设计视图中修改。

 

例题:在视图上不能完成的操作是(C)

A 更新视图 ; B 查询 ; C 在视图上定义新的表 ; D 在视图上定义新的视图

 

23.  数据的物理独立性是指用户的应用程序与存储在磁盘上的数据库中数据是相互独立的。即,数据在磁盘上怎样存储由DBMS管理,用户程序不需要了解,应用程序要处理的只是数据的逻辑结构,这样当数据的物理存储改变了,应用程序不用改变。

 

24.  对基本表 S,执行操作 DROP TABLES RESTRICT 的作用是当没有由 S 中的列产生的视图或约束时将表 S 删除

drop table:从一个数据库中删除一个表

drop table Restrict:确保只有不存在相关视图或完整性约束的表才可以被删除

drop table cascade:任何引用的视图或完整性约束都将被删除

 

25.  查询订购单号(字符型,长度为4)尾字符是"1"的错误命令是______。

A SELECT * FROM 订单 WHERE SUBSTR(订购单号,4)="1"

B SELECT * FROM 订单 WHERE SUBSTR(订购单号,4,1)="1"

C SELECT * FROM 订单 WHERE "1"$订购单号

D SELECT * FROM 订单 WHERE RIGHT(订购单号,1)="1"

 

SUBSTR用法:

1.SBUSTR(str,pos); 就是从pos开始的位置,一直截取到最后;

2.1.SBUSTR(str,pos,len); 就是从pos开始的位置,截取len长度;

RIGHT用法

right(a,b)函数表示的是从字符表达式最右边一个字符开始返回指定数目的字符.若 b 的值大于 a 的长度,则返回字符表达式的全部字符a.如果 b 为负值或0,则返回空字符串。

 

26.  在DDBS中,数据传输量是衡量查询时间的一个主要指标,导致数据传输量大的主要原因是( C )

A 场地间距离过大;B数据库的数据量大;C不同场地间的联接操作;D在CPU上处理通信的代价高

DDBS 分布式数据库系统

 

27.  数据库中的字符串的连接操作符  

连接运算符主要用于连接字符串,其运算符有三个:+,&,||;

1)   &用来强调两个表达式作为字符串连接,如“hello”&23&"word",结果为“hello23word”

2)   +连接两个字符串,要求+两端的类型必须一致,如“hello”+23+"word",结果会报错“类型不匹配”

3)   注意点:oracle数据库:用“||”可以,用“&不可以”

        MySQL数据库:用“||”和“&”都可以

在MySql中,concat函数的作用是是将传入的参数连接成为一个字符串,则concat(’aaa’,null,’bbb’)的结果是(Null)

CONCAT合并字符串,只要有一个字符串为空,则输出为空;CONCAT_WS合并字符串,只要第一个字符串不为空,则输出不为空。

 

28.  有关数据字典的相关知识点:

数据字典是数据库的重要组成部分。数据库数据字典是一组表和视图结构。它们存放在SYSTEM表空间中。它存放有数据库所用的有关信息,对用户来说是一组只读的表。数据字典内容包括: 1、数据库中所有模式对象的信息,如表、视图、簇、及索引等。

2、分配多少空间,当前使用了多少空间等。 3、列的缺省值。 4、约束信息的完整性。 5、用户的名字。 6、用户及角色被授予的权限。 7、用户访问或使用的审计信息。

8、其它产生的数据库信息。

 

29.  有关异常的总结:

1)   “插入异常”是指当要往数据库中插入新的数据的时候,插入不成功导致异常;

2)   “删除异常”是指当要删除数据库中数据的时候,不能删除,删除不成功;

3)   ”修改异常”是指当要修改数据库中数据的时候,修改不成功;

4)   数据库中的“插入异常”、“删除异常”、“修改异常”是数据库模式中存在依赖关系导致

 

30.  在数据库三级模式间引入二级映象的主要作用是( 提高数据与程序的独立性 )?

 

31.  模糊查询语句,数据库中的模糊查询关键字为like,并提供了四种模糊匹配条件:

1)   %:表示0~n个任意个字符

把flow_user这张表里面,列名username中含有“王”的记录全部查询出来

select * from flow_user where username like '%王%';

2)   _:表示一个字符

只能找到“王英琨”这样username为三个字且中间一个字是“英”的内容。

select * from flow_user where username like '_英_';

3)   []:表示括号内所列字符中的一个

将找出“王飞”“李飞”“张飞”(而不是“张王李飞”)。

select * from flow_user where username LIKE'[王李张]飞';

4)   [^]:表示不在括号所列之内的单个字符。

将找出不是“王飞”“李飞”“张飞“的”赵飞“、”吴飞“等。

select * from flow_user where username LIKE'[^王李张]飞';

 

32.  数据库技术的根本目标是要解决数据共享的问题;数据库管理系统的工作不包括:为定义的数据库提供操作系统

 

33.  死锁发生时( 撤消其中一个事务,并恢复到初态 )

 

34.  Mysql实现的四种通信协议(TCP/IP,Socket,共享内存,命名管道)

 

35.  数据库中的"空值" 和"NULL"的概念:

1)   空值('')是不占用空间的,判断空字符用 = '' 或者 <> '' 来进行处理;

2)   NULL值是未知的,且占用空间,不走索引;判断 NULL 用 IS NULL 或者 is not null , SQL 语句函数中可以使用 ifnull ()函数来进行处理.

3)   在进行 count ()统计某列的记录数的时候,如果采用的 NULL 值,会别系统自动忽略掉,但是空值是统计到其中

 

36.  设关系模式R(A,B,C),F是R上成立的FD集,F={A→B,C→B},ρ={AB,AC}是R的一个分解,那么分解ρ( C )?

A 保持函数依赖集F;B 丢失了A→B;

C 丢失了C→B;D 丢失了B→C

 

37.  数据库恢复的基础是利用转储的冗余数据。这些转储的冗余数据包括(日志文件,数据库后备副本)

38.  (1)PCTFREE:为一个块保留的空间百分比,表示数据块在什么情况下可以被insert。

(2)PCTUSED:是指当块里的数据低于多少百分比时,又可以重新被insert。

形象举例说明:

假如:一个杯子一共可装10分水:

PCTFREE = 10,说明杯子装到9分水,就不能再装了,即:不能进行insert操作,但可以进行update操作。

PCTUSED = 40,说明杯子中的水喝到4分一下,就可以往里面装水,即:进行insert操作。

 

 

39.  某查询语句运行后返回的结果集为:

 

则最有可能的查询语句是以下:C

A SELECT class, AVG(score) FROM test WHERE class<3

B SELECT class, AVG(score) FROM test WHERE class<3 GROUP BY class

C SELECT class, AVG(score) FROM test WHERE class<3 GROUP BY ALL class

D SELECT class, AVG(score) FROM test GROUP BY class HAVING class<3

 

因为出现了3班 NULL, 所以如果是D的话,就不会出现Null了。条件限制了选择的class<3 所以只有1 ,2班有成绩。

下面是帮助中group by +all的用法:

GROUP BY 子句中提供 ALL 关键字。只有在 SELECT 语句还包括 WHERE 子句时,ALL 关键字才有意义。如果使用 ALL 关键字,那么查询结果将包括由 GROUP BY 子句产生的所有组,即使某些组没有符合搜索条件的行。没有 ALL 关键字,包含 GROUP BY 子句的 SELECT 语句将不显示没有符合条件的行的组。

注:having与where的区别:

1、  having是在分组后对数据进行过滤的。

Where是在分组前对数据进行过滤的。

2、  having后面可以使用聚合函数(统计函数)

where后面不可以使用聚合函数。

 

40.  五种基本关系代数运算是? (∪,-,×,π,σ )

关系运算:选择、投影、连接、除

传统集合运算:并、差、交、笛卡尔

5种基本运算:并、差、笛卡尔、选择、投影

关系代数运算中的基本运算包括并(∪)、差(-)、广义笛卡尔积(×)、投影(π)和选择(σ),其他运算的功能都可以由这五种基本运算来实现。

投影操作是从表中选出某些列而丢弃另一些列。如果只对一个关系中的某些属性感兴趣,那么就需要使用投影操作在这些属性上投影该关系。

关系R是的投影是从关系R中选择出若干属性列组成新的关系。分为两步:

(1)选择出指定的属性,形成一个可能含有重复行的表。

(2)删除重复行,形成新的关系

对关系R进行投影运算后,得到关系S,则( 关系R的元组数大于或等于关系S的元组数 )。

 

41.  在 SQL 语句中,与 X between 20 and 30 等价的表达式是: X>=20 AND X<=30

 

42.  关系数据库规范化是为解决关系数据库中( 插入、删除和数据冗余 )问题而引入的。

 

43.  SQL语句性能分析的关键字是什么? EXPLAIN

explain命令在解决数据库性能上是第一推荐使用命令,大部分的性能问题可以通过此命令来简单的解决,Explain可以用来查看SQL语句的执行效 果,可以帮助选择更好的索引和优化查询语句,写出更好的优化语句。explain语法:explain select … from … [where ...] 例如:explain select * from news;

44.  数据库中的E-R图

1)   实体类型的转换:将一个实体型转换为一个关系模式,关系的属性就是实体的属性;

2)   关系类型转换分为如下几种情况

a)   1:1联系:可以转换成一个独立的关系模式,也可以与任意一端对应的关系模式合并。

如果转换为一个独立的关系模式,则与该联系相连的各实体的码以及联系本身的属性均转换为关系的属性,每个实体的码均是该关系的候选码。

如果与某一端实体对应的关系模式合并,则需要在该关系模式的属性中加入另一个关系模式的码和联系本身的属性。

b)   1n联系:可以转换为一个独立的关系模式,也可以与n端对应的关系模式合并。如果转换为一个独立的关系模式,则与该联系相连的各实体的码以及联系本身的属性均转换为关系的属性,而关系的码为n端实体的码。

c)   m:n联系:转换为一个关系模式,与该联系相连的各实体的码以及联系本身的属性均转换为关系的属性,各实体的码组成关系的码或关系码的一部分。

 

实例:

 

1)   部门(部门号,部门名,经理的职工号,…)

此为部门实体对应的关系模式,该关系模式已包含了联系“领导所对应的关系模式。经理的职工号是关系的候选码

2)   职工(职工号,部门号,职工名,职务,…)

此为职工实体对应的关系模式,该关系模式已包含了联系“属于”所对应的关系模式。

3)   产品(产品号,产品名,产品组长的职工号,…)此为产品实体对应的关系模式。

4)   供应商(供应商号,姓名,…)此为供应商实体对应的关系模式 。

5)   零件(零件号,零件名,…)为零件实体对应的关系模式。

6)    生产(职工号,产品号,工作天数,…)此为联系“生产”所对应的关系模式。

7)   供应(产品号,供应商号,零件号,供应量)此为联系“联系”所对应的关系模式。

 

45.  数据库中的触发器

1)   触发器的概念

触发器(trigger)是SQL server 提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,比如当对一个表进行操作( insert,delete, update)时就会激活它执行。触发器经常用于加强数据的完整性约束和业务规则等。

不会触发触发器的包括 SELECT、TRUNCATE、WRITETEXT、UPDATETEXT。

2)   触发器的语法

Create trigger trigger_name ON {table_name | view_name}

{FOR | After | Instead of } [ insert, update,delete ]

AS  sql_statement

删除触发器:drop trigger 触发器名

3)   触发器的分类

a)   After触发器,After触发器要求只有执行某一操作insert、update、delete之后触发器才被触发,且只能定义在表上。

b)   Instead of 触发器,Instead of 触发器表示并不执行其定义的操作(insert、update、delete)而仅是执行触发器本身。既可以在表上定义instead of触发器,也可以在视图上定义。

c)   后触发型触发器

使用for或after选项定义的触发器,执行过程如下:1. 执行到引发触发器执行的语句。2. 执行该语句 。3. 执行触发器

4)   触发器的作用

a)   完成比约束更复杂的数据约束

b)   检查所做的sql是否允许

c)   调用更多的存储过程

d)   防止数据表结构更改或数据表被删除

e)   修改其他数据表的数据

f)   发送sql mail

g)   返回自定义的错误信息

5)   注意事项

a)   一个表可以有多个触发器,但一个触发器只能对应一个表,但可以引用数据库以外的对象

b)   同一个数据表中,对每个操作而言,可以建立多个after触发器,但instead of 触发器只能创建一个

c)   对某个操作,既建了after触发器,又设置了instead of触发器,instead of触发器一定会激活,after触发器不一定会被激活

 

46.  数据库中的约束

1)   实体完整性:主键完整性的约束条件,要求主键不能为空(NULL)且不可以重复。

约束类型:主键约束(primary key)、唯一约束(unique)、自增长(auto_increment)

Sqlserver(identity)、oracle(sequence)

 

       
   

CREATE TABLE student (

    id INT auto­_increment

    name VARCHAR(20) NOT NULL,

    sex ENUM('male', 'female'),

    age INT NOT NULL ,

    PRIMARY KEY(id) /* 在定义完所有属性后设置主键 */

 

 
 

CREATE TABLE student (

    id INT PRIMARY KEY, /* 紧跟在属性定义后面 */

    name VARCHAR(20) NOT NULL,

    age INT NOT NULL

);

 

 
 

 

 

 

 

 

 

 

 

 

或者使用: alter table student add primary key(id)

           alter table add constraint pk_stuid primary key(id)

删除主键约束:alter table 表名 drop primary key

 

2)   参照完整性:参照完整性是相对于外键而言的,在数据库中,外键常用来关联两个表,它的值要么为NULL,要么就是它参照的那个表的主键值。

 

       
 

CREATE TABLE user (

    user_id INT AUTO_INCREMENT PRIMARY KEY,

    password VARCHAR(20) NOT NULL,

);

 

 
 

CREATE TABLE groups (

    group_id INT AUTO_INCREMENT,

    PRIMARY KEY(group_id, group_name),

    FOREIGN KEY (user_id) REFERENCES user(user_id)

    /* 将user_id定为外键,参照user表中的user_id属性 */

);

 
 

 

 

 

 

 

 

 

或:

alter table score1 add constraint fk_stu_score foreign key(sid) references stu(id);

 

3)   用户自定义完整性:在CREATE TABLE中定义属性时,可以根据应用程序的要求在属性上添加约束条件(属性限制),包括:列值非空(NOT NULL)、列值唯一(UNIQUE)、check约束(mysql不支持)check(sex =’男’or ‘女’)、默认值约束(default)

例如定义的时候可以写:sex varchar(10) default’男’

 

47.  数据库中关于删除的几个关键词

当你不再需要该表时, 用 drop;

当你仍要保留该表,但要删除所有记录时, 用 truncate;

当你要删除部分记录时(always with a WHERE clause), 用 delete.

48.  SQL 语句中修改表结构的命令是(ALTER TABLE

修改表结构包括:增加字段、删除字段、增加约束、删除约束、修改缺省值、修改字段数据类型、重命名字段、重命名表等。这些操作都是用 alter table 命令来完成。常用用法如下:

1、增加字段:ALTER TABLE 表名 ADD 字段名 字段类型;

2、删除字段:ALTER TABLE 表名 DROP COLUMN 字段列名;

3、增加约束:ALTER TABLE 表名 ADD CHECK(字段名<>'')或者 ALTER TABLE 表名 ADD CONSTRAINT 约束名 UNIQUE(字段名);

4、删除约束:ALTER TABLE 表名 DROP CONSTRAINT 约束名;

5、修改字段缺省值:ALTER TABLE 表名 ALTER COLUMN 字段名 SET DEFAULT 默认值;

6、 修改字段数据类型:ALTER TABLE 表名 ALTER COLUMN 字段名TYPE l类型;

7、重命名字段:ALTER TABLE 表名 RENAME COLUMN 旧字段名TO 新字段名;

8、重命名表:ALTER TABLE 表名 RENAME TO 新表名。

 

49.  六、多表查询(重要)

多表查询有如下几种:

l  合并结果集;UNION 、  UNION ALL

l  连接查询

Ø  内连接  [INNER] JOIN  ON

Ø  外连接  OUTER JOIN ON

²  左外连接 LEFT [OUTER] JOIN

²  右外连接 RIGHT [OUTER] JOIN

²  全外连接(MySQL不支持)FULL JOIN

Ø  自然连接  NATURAL JOIN

l  子查询

1 合并结果集

1.     作用:合并结果集就是把两个select语句的查询结果合并到一起!

2.     合并结果集有两种方式:

l  UNION:去除重复记录,例如:SELECT * FROM t1 UNION SELECT * FROM t2;

l  UNION ALL:不去除重复记录,例如:SELECT * FROM t1 UNION ALL SELECT * FROM t2。

 

 

3.     要求:被合并的两个结果:列数、列类型必须相同。

2 连接查询(非常重要)

连接查询就是求出多个表的乘积,例如t1连接t2,那么查询出的结果就是t1*t2。

 

 

连接查询会产生笛卡尔积,假设集合A={a,b},集合B={0,1,2},则两个集合的笛卡尔积为{(a,0),(a,1),(a,2),(b,0),(b,1),(b,2)}。可以扩展到多个集合的情况。

那么多表查询产生这样的结果并不是我们想要的,那么怎么去除重复的,不想要的记录呢,当然是通过条件过滤。通常要查询的多个表之间都存在关联关系,那么就通过关联关系去除笛卡尔积。

你能想像到emp和dept表连接查询的结果么?emp一共14行记录,dept表一共4行记录,那么连接后查询出的结果是56行记录。

也就你只是想在查询emp表的同时,把每个员工的所在部门信息显示出来,那么就需要使用主外键来去除无用信息了。

 

 

  使用主外键关系做为条件来去除无用信息

SELECT * FROM emp,dept WHERE emp.deptno=dept.deptno;

在多表查询中,在使用列时必须指定列所从属的表,例如emp.deptno表示emp表的deptno列。

 

 

 

上面查询结果会把两张表的所有列都查询出来,也许你不需要那么多列,这时就可以指定要查询的列了。

SELECT emp.ename,emp.sal,emp.comm,dept.dname

FROM emp,dept

WHERE emp.deptno=dept.deptno;

 

 

还可以为表指定别名,然后在引用列时使用别名即可。

SELECT e.ename,e.sal,e.comm,d.dname

FROM emp AS e,dept AS d

WHERE e.deptno=d.deptno;其中AS是可以省略的

 

多表连接查询运行机制:多表查询的过程可以理解为一个嵌套循环的过程。

for t in teacher             //依次遍历teacher表中的每一条记录

{

       for s in student             //依次遍历student表中的每一条记录

{

if(s.java_teacher=t.teacher_id)   //当满足连接条件的时候输出连个表连接后的结果

       Output  s+t

}

}

2.1 内连接

上面的连接语句就是内连接,但它不是SQL标准中的查询方式,可以理解为方言!SQL标准的内连接为:

SELECT *

FROM emp e

INNER JOIN dept d

ON e.deptno=d.deptno;

INNER可以省略,MySQL默认的连接方式就是内连接

不使用WHERE,而是使用ON

内连接的特点:查询结果必须满足条件。例如我们向emp表中插入一条记录:

 

  其中deptno为50,而在dept表中只有10、20、30、40部门,那么上面的查询结果中就不会出现“张三”这条记录,因为它不能满足e.deptno=d.deptno这个条件。

On子句:将连接的条件放在on子句中,而且每个on子句只能指定一个连接条件。如果需要连接N个表,则需要有N-1个join-on对。

2.2 外连接(左连接、右连接)

外连接的特点:查询出的结果存在不满足条件的可能。

左连接:

SELECT * FROM emp e

LEFT OUTER JOIN dept d

ON e.deptno=d.deptno;

OUTER可以省略

左连接是先查询出左表(即以左表为主),然后查询右表,右表中满足条件的显示出来,不满足条件的显示NULL。

这么说你可能不太明白,我们还是用上面的例子来说明。其中emp表中“张三”这条记录中,部门编号为50,而dept表中不存在部门编号为50的记录,所以“张三”这条记录,不能满足e.deptno=d.deptno这条件。但在左连接中,因为emp表是左表,所以左表中的记录都会查询出来,即“张三”这条记录也会查出,但相应的右表部分显示NULL。

 

 

2.3 右连接

右连接就是先把右表中所有记录都查询出来,然后左表满足条件的显示,不满足显示NULL。例如在dept表中的40部门并不存在员工,但在右连接中,如果dept表为右表,那么还是会查出40部门,但相应的员工信息为NULL。

SELECT * FROM emp e

RIGHT OUTER JOIN dept d

ON e.deptno=d.deptno;

 

 

 

 

连接查询心得

连接不限与两张表,连接查询也可以是三张、四张,甚至N张表的连接查询。通常连接查询不可能需要整个笛卡尔积,而只是需要其中一部分,那么这时就需要使用条件来去除不需要的记录。这个条件大多数情况下都是使用主外键关系去除。

两张表的连接查询一定有一个主外键关系,三张表的连接查询就一定有两个主外键关系,所以在大家不是很熟悉连接查询时,首先要学会去除无用笛卡尔积,那么就是用主外键关系作为条件来处理。如果两张表的查询,那么至少有一个主外键条件,三张表连接至少有两个主外键条件

 

3 自然连接

大家也都知道,连接查询会产生无用笛卡尔积,我们通常使用主外键关系等式来去除它。而自然连接无需你去给出主外键等式,它会自动找到这一等式:

两张连接的表中名称和类型完全一致的列作为条件,例如emp和dept表都存在deptno列,并且类型一致,所以会被自然连接找到!

当然自然连接还有其他的查找条件的方式,但其他方式都可能存在问题!

SELECT * FROM emp NATURAL JOIN dept;内连接

SELECT * FROM emp NATURAL LEFT JOIN dept;左连接

SELECT * FROM emp NATURAL RIGHT JOIN dept;右连接

Using子句:用于显示指定两个表中的同名列,并将其作为连接条件。假设两个表中有查过一列的同名列,如果使用自然连接(natural join),则会把所有的同名列当成连接条件,使用using子句,就可以显示指定那些同名列作为连接条件。

4 子查询(非常重要)

一个select语句中包含另一个完整的select语句。

子查询就是嵌套查询,即SELECT中包含SELECT,如果一条语句中存在两个,或两个以上SELECT,那么就是子查询语句了。

l  子查询出现的位置:

Ø  where后,作为条为被查询的一条件的一部分;

Ø  from后,作表;

l  当子查询出现在where后作为条件时,还可以使用如下关键字:

Ø  any

Ø  all

l  子查询结果集的形式:

Ø  单行单列(用于条件)

Ø  单行多列(用于条件)

Ø  多行单列(用于条件)

Ø  多行多列(用于表)

练习:

1.     工资高于JONES的员工。

分析:

查询条件:工资>JONES工资,其中JONES工资需要一条子查询。

 

第一步:查询JONES的工资

SELECT sal FROM emp WHERE ename='JONES'

 

第二步:查询高于甘宁工资的员工

SELECT * FROM emp WHERE sal > (${第一步})

 

结果:

SELECT * FROM emp WHERE sal > (SELECT sal FROM emp WHERE ename='JONES')

 

2、查询与SCOTT同一个部门的员工。

 

l  子查询作为条件

l  子查询形式为单行单列

 

3、工资高于30号部门所有人的员工信息

分析:

SELECT * FROM emp WHERE sal>(

SELECT MAX(sal) FROM emp WHERE deptno=30);

 

查询条件:工资高于30部门所有人工资,其中30部门所有人工资是子查询。高于所有需要使用all关键字。

 

第一步:查询30部门所有人工资

SELECT sal FROM emp WHERE deptno=30;

 

第二步:查询高于30部门所有人工资的员工信息

SELECT * FROM emp WHERE sal > ALL (${第一步})

 

结果:

SELECT * FROM emp WHERE sal > ALL (SELECT sal FROM emp WHERE deptno=30) 大于所有

 

l  子查询作为条件

l  子查询形式为多行单列(当子查询结果集形式为多行单列时可以使用ALL或ANY关键字)

 

4、查询工作和工资与MARTIN(马丁)完全相同的员工信息

分析:

查询条件:工作和工资与MARTIN完全相同,这是子查询

 

第一步:查询出MARTIN的工作和工资

SELECT job,sal FROM emp WHERE ename='MARTIN'

 

第二步:查询出与MARTIN工作和工资相同的人

SELECT * FROM emp WHERE (job,sal) IN (${第一步})

 

结果:

SELECT * FROM emp WHERE (job,sal) IN (SELECT job,sal FROM emp WHERE ename='MARTIN')

 

5、有2个以上直接下属的员工信息

SELECT * FROM emp WHERE empno IN(

SELECT mgr FROM emp GROUP BY mgr HAVING COUNT(mgr)>=2);

l  子查询作为条件

l  子查询形式为单行多列

5、查询员工编号为7788的员工名称、员工工资、部门名称、部门地址

分析:(无需子查询)

查询列:员工名称、员工工资、部门名称、部门地址

查询表:emp和dept,分析得出,不需要外连接(外连接的特性:某一行(或某些行)记录上会出现一半有值,一半为NULL值)

条件:员工编号为7788

第一步:去除多表,只查一张表,这里去除部门表,只查员工表

SELECT ename, sal FROM emp e WHERE empno=7788

 

第二步:让第一步与dept做内连接查询,添加主外键条件去除无用笛卡尔积

SELECT e.ename, e.sal, d.dname, d.loc

FROM emp e, dept d

WHERE e.deptno=d.deptno AND empno=7788

 

第二步中的dept表表示所有行所有列的一张完整的表,这里可以把dept替换成所有行,但只有dname和loc列的表,这需要子查询。

第三步:查询dept表中dname和loc两列,因为deptno会被作为条件,用来去除无用笛卡尔积,所以需要查询它。

SELECT dname,loc,deptno FROM dept;

 

第四步:替换第二步中的dept

SELECT e.ename, e.sal, d.dname, d.loc

FROM emp e, (SELECT dname,loc,deptno FROM dept) d

WHERE e.deptno=d.deptno AND e.empno=7788

 

l  子查询作为表

l  子查询形式为多行多列

有一种子查询可以返回多行多列,此时where子句中应当有对应的数据列,并使用圆括号将多列数据括起来。

Select *

From Student

Where (Student_id,Student_name) in (

       Select teacher_id,teacher_name

       From teacher

);

6、自连接:自己连接自己,起别名

求7369员工编号、姓名、经理编号和经理姓名

       SELECT e1.empno , e1.ename,e2.mgr,e2.ename

       FROM emp e1, emp e2

       WHERE e1.mgr = e2.empno AND e1.empno = 7369;

 

练习:

  求各个部门薪水最高的员工所有信息

  select e.* from emp e,

--部门最高工资

(select max(sal) maxsal,deptno from emp

group by deptno) a

where e.deptno = a.deptno

and e.sal =a.maxsal

 

内容来源于网络如有侵权请私信删除
你还没有登录,请先登录注册
  • 还没有人评论,欢迎说说您的想法!