database和schema的区别
模式(schema)是表、视图等数据库中对象的集合,而数据库(database)是模式的集合。
一个关系数据库管理系统的实例(Instance)中可以建立多个数据库(database);一个数据库中可以建立多个模式(schema);一个模式下通常包括多个表(table)、视图(view)和索引(index)等数据库对象。
在一个数据库中可以有多个应用的数据表,这些不同应用的表可以放在不同的schema之中。每一个schema对应一个用户,不同的应用可以以不同的用户连接数据库,这样,一个大数据库就可以根据应用把其表分开来管理。不同的schema之间它们没有直接的关系,不同的shcema之间的表可以同名,也可以互相引用(但必须有权限),在没有操作别的schema的操作根权 下,每个用户只能操作它自己的schema下的所有的表。不同的schema下的同名的表,可以存入不同的数据(即schema用户自己的数据)。
对schema我们还要注意以下几点:
可以在不同模式下创建相同表名;
DB2系统访问表对象时使用模式名.表对象的格式;
对于不指明模式的表对象 以当前登录用户模式作为隐含模式访问;
注意:
Oracle数据库中不能新创建一个SCHEMA,要想创建一个SCHEMA,只能通过创建一个用户的方法解决。
而在MySQL 5.0.2及更高版本中,CREATE SCHEMA就是CREATE DATABASE的同义词。
在SQL Server中模式(schema)这个概念是在2005的版本里才提出来的,因此SQL Server2000不支持模式这个概念。在sql server2000中,用户和模式是不分离的。换个角度来说SQL2000中的用户和模式的概念就是为用户分配固定的模式。在SQL Server2000中,假如我们在某一个数据库中创建了用户Bosco,按么此时后台也为我们默认地创建了默认Schema (Bosco)。Schema的名字和User的名字相同。
而在SQL Server2005中,当我们用Create User创建数据库用户时,我们可以为该用户指定一个已经存在的Schema作为默认Schema,如果我们不指定,则该用户所默认的Schema即为dbo Schema,dbo 房间(Schema)好比一个大的公共房间,在当前登录用户没有默认Schema的前提下,如果你在大仓库中进行一些操作,比如Create Tabe,如果没有指定特定的房间(Schema),那么你的物品就只好放进公共的dbo房间(Schema)了。但是如果当前登录用户有默认的Schema,那么所做的一切操作都是在默认Schema上进行(比如当前登录用户为login1,该用户的默认Schema为login1,那么所做的所有操作都是在这个login1默认Schema上进行的)。注意dbo是一个Schema,但是dbo同时也是一个user。
在SQL Server2005中创建一个数据库的时候,会包括必须的4个Schema:dbo,INFORMATION_SCHEMA, guest,sys。
数据库的三级模式与两级映像
三级模式与两级映像之间的关系如下所示:
数据库管理系统
|
os
|
|-----------------> 数据库
| |
|-----------------> 内模式
| |
|----------------->内模式映像
| |
|-----------------> 概念模式
| / \
|-----------> 外模式映像A 外模式映像B
| / \
|-------> 外模式A 外模式B
| / \ / \
|---->用户A1 用户A2 用户B1 用户B2
三级模式:外模式、概念模式、内模式
外模式:
外模式又称子模式或用户模式,对应于用户级。它是某个或某几个用户所看到的数据库的数据视图,是与某一应用有关的数据的逻辑表示。外模式是从模式导出的一个子集,包含模式中允许特定用户使用的那部分数据。用户可以通过外模式描述语言来描述、定义对应于用户的数据记录(外模式),也可以利用数据操纵语言(Data Manipulation Language,DML)对这些数据记录进行。外模式反映了数据库的用户观。
概念模式(也叫模式):
模式又称概念模式或逻辑模式,对应于概念级。它是由数据库设计者综合所有用户的数据,按照统一的观点构造的全局逻辑结构,是对数据库中全部数据的逻辑结构和特征的总体描述,是所有用户的公共数据视图(全局视图)。它是由数据库管理系统提供的数据模式描述语言(Data Description Language,DDL)来描述、定义的,体现、反映了数据库系统的整体观。
内模式:
内模式又称存储模式,对应于物理级。它是数据库中全体数据的内部表示或底层描述,是数据库最低一级的逻辑描述,它描述了数据在存储介质上的存储方式和物理结构,对应着实际存储在外存储介质上的数据库。内模式由内模式描述语言来描述、定义。它是数据库的存储观。
注意:
在一个数据库系统中只有唯一的数据库,因而作为定义、描述数据库存储结构的内模式和定义、描述数据库逻辑结构的概念模式,也是唯一的。但是建立在数据库之上的应用则是广泛的、多样的,所以对应的外模式不是唯一的,也不可能是唯一的。
两级映像:外模式映像、内模式映像
外模式映像:
一个DB只有一个概念模式,但可以有多个外模式。 对于每一个外模式,数据库系统都有一个外模式/模式映像,它定义了这个外模式与模式的对应关系。外模式的描述中通常包含了这些映像的定义。
当模式改变时(增加新的关系、新的属性、改变属性的数据类型等),由数据库管理员对各个外模式/模式映像作相应的改变,可以使得外模式保持不变。而又由于应用程序应该是依据外模式编写的,从而应用程序不必修改,这就保证了数据与程序的逻辑独立性。
外模式/模式映像保证了当模式改变时,外模式不用变,这就是逻辑独立性。
内模式映像:
一个DB只有一个模式,也只有一个内模式。所有模式/内模式映像是唯一的,它定义了数据全局逻辑结构与存储结构之间的对应关系。
当数据库的存储结构改变时(例如选用了另一个存储结构),由数据库管理员对模式/内模式映像作出相应的改变,可以使得模式保持不变,从而应用程序也不必改变。这就保证了数据和程序的物理独立性。
模式/内模式映像保证了当内模式改变时,模式不用变,这就是物理独立性。
数据库事务的四大特性(ACID)
原子性
事务是一个原子操作单元,其对数据的修改,要么全都执行,要么全都不执行,在操作失败后不能对数据库中的数据有任何影响。
一致性
在事务开始和完成时,数据必须保持一致状态,这意味着所有相关的数据规则都必须应用于事务的修改,以保持数据的完整性;事务结束时,所有的内部数据结构也必须是正确的。
隔离性
数据库系统提供一定的隔离级别,保证事务在不受外部并发操作影响的“独立”环境执行。这意味着事务处理过程中的中间状态对外部是不可见的,反之亦然(注意:事务的隔离性是相对于两个事务而说的,两个事务独立执行互补干扰)。
持久性
事务完成后,它对数据的修改是永久的,即使出现系统故障也能保持的正确性。
内连接、外连接、交叉连接
内连接
使用比较运算符根据每个表共有的列的值匹配两个表中的行。利用内连接可获取两表的公共部分的记录。有点类似数学中集合的交集。
可细分为三种:
- 等值连接。在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接表中的所有列,包括其中的重复列。
- 不等值连接。在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些运算符包括>、>=、<=、<、!>、!<和<>。
- 自然连接。在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询结果集合中所包括的列,并删除连接表中的重复列。
外连接
外链接(outer join)与内连接是相反的,就是说,如果某张表中的数据在另一张中找不到对应的条目并不影响它依然出现在查询的结果中,这对于两张表都是满足的,两边都有出现null的可能,有点像数学中的并集。
可细分为三种: - 左(外)连接。左连接(left join)即为两张表进行连接时,是以处于left join语句左侧的表为基准去匹配left join语句右边的表,如果左表中的一条数据在右表中能找到与之对应的一条数据,那么就会出现在以虚表形式存在的结果表中,如果没有找到,那么会以null来代替右表中的数据去匹配左表。左连接时左边的表是全部数据,右边的只有符合条件的才有数据。
- 右(外)连接。右连接(right join)本质上是相当于将上述的左连接的这个过程反过来,以连接语句right join右侧的表为基准去匹配左边的表,右连接是处于right join右边的表是全部数据,左边的符合条件的有数据。
- 全(外)连接。全连接(full join)完整外部联接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值。
注意:
MySQL中没有全(外)连接。
交叉连接
左表中的每一行与右表中的所有行组合。交叉联接也称作笛卡尔积。
DDL、DML、DQL、DCL、TCL语句的概念
DDL(Data Definition Language,数据定义语言)
数据定义语言DDL用来创建数据库中的各种对象—–表、视图、索引、同义词、聚簇等。
常见DDL操作:
show databases; # 显示所有数据库
use 数据库名; # 使用该数据库
show create database 数据库名; # 显示创建该数据库的SQL语句
create database 数据库名; # 创建数据库
create database 数据库名 character set utf8; # 创建指定字符编码的数据库
drop databse 数据库名; # 删除数据库
create table 表名(id int ,name char(10),age int ); # 创建表
show tables; # 显示所有表
show create table 表名; # 显示创建该表的SQL语句
alter table 表名 add id int ; # 表中新增列
alter table 表名 modify id double; # 修改表中列的属性
alter table 表名 change id id2 int; # 修改表中列的名字和属性
alter table 表名 drop id; # 删除表中的列
rename table 表名 to 新表名; # 修改表格的名字
alter table 表名 character set utf8; # 修改表的字符编码格式
DML( Data Manipulation Language,数据操纵语言)
使用户能够查询数据库以及操作已有数据库中的数据的计算机语言。主要有三种形式:插入(insert);更新(update);删除(delete)。
常见DML操作:
insert into 表名 (字段1,字段2,字段3) values (值1,值2,值3) # 新增值到表中
update 表名 set name = 'xx' where id =3; # 更新表中数据
delete from 表名 where id = 2; # 删除表中的数据
DQL(Data Query Language SELECT,数据查询语言)
主要用来查看表中的数据,也是平时使用最多的操作。
数据查询语言DQL基本结构是由SELECT子句,FROM子句,WHERE子句组成的查询块:
select <字段名表> from <表或视图名> where <查询条件>
常见DQL操作:
select * from 表名 where id =3; # 查询表中数据
select * from 表名 order by id desc | asc; # 排序查询
select * from 表名 group by 字段; # 分组查询
select * from 表名 where name like '%aa%'; # 模糊查询
select * from 表名 limit (2,5); # 分页查询
select * from 表名 where age between 20 and 30; # 范围查询
select * from 表名 where id in (1,3,5); # 部分查询
DCL(Data Control Language,数据控制语言)
用来授予或回收访问数据库的某种特权,并控制数据库操纵事务发生的时间及效果。主要有:授权(grant);取消权限(revoke)。
常见DCL操作:
# 给用户jerry授予对test_db数据库的增删改查权限,允许该用户从IP为'192.168.0.10'的网络登录
GRANT INSERT,SELECT,UPDATE,DELETE ON test_db.* TO 'jerry'@'192.168.0.10' IDENTIFIED BY 'password' WITH GRANT OPTION;
或
CREATE USER 'jerry'@'192.168.0.10' IDENTIFIED BY 'password';
GRANT INSERT,SELECT,UPDATE,DELETE ON test_db.* TO 'jerry'@'192.168.0.10';
# 收回用户对test_db库的删除权限
REVOKE DELETE ON test_db.* FROM 'jerry'@'192.168.0.10';
# 查询给'jerry'@'192.168.0.10'所授予的所有权限:
SHOW GRANTS FOR 'jerry'@'192.168.0.10';
TCL(Transaction Control Language,事物控制语言)
用来对事务进行管理。 主要有:保存已完成事务动作结果 (COMMIT);保存事务相关数据和状态用以可能的回滚操作(SAVEPOINT);恢复事务相关数据至上一次COMMIT操作之后(ROLLBACK);设置事务选项(SET TRANSACTION)。
DML语句对表数据进行操作的时候都会加上行级锁,确认完成后,必须加上事物处理结束的命令COMMIT才能正式生效,否则改变不一定写入数据库里。如果想撤回这些操作, 可以用命令 ROLLBACK 复原。
注意:
在运行INSERT,DELETE和UPDATE语句前最好估算一下可能操作的记录范围,应该把它限定在较小范围内,例如一万条记录,否则ORACLE处理这个事物用到很大的回退段。程序响应慢甚至失去响应。如果记录数上十万以上这些操作。可以把这些SQL语句分段分次完成。其间加上COMMIT确认事物处理。
数据的提交:
- 显式提交:用COMMIT命令直接完成的提交为显式提交。其格式为:
SQL>COMMIT; - 隐式提交:用SQL命令间接完成的提交为隐式提交。这些命令是:
ALTER,AUDIT,COMMENT,CONNECT,CREATE,DISCONNECT,DROP,EXIT,GRANT,NOAUDIT,QUIT,REVOKE,RENAME。 - 自动提交:若把AUTOCOMMIT设置为ON,则在插入、修改、删除语句执行后,系统将自动进行提交,这就是自动提交。其格式为:
SQL>SET AUTOCOMMIT ON;
数据库的传统集合运算(并、差、交、笛卡尔积)和专门的关系运算(选择、投影、连接、除)
集合运算符:
∪ 并
∩ 交
- 差
专门的关系运算符:
σ 选择
∏ 投影
+ 连接
÷ 除
在数据库中每行就是一个元组,每列就是一个属性。
传统集合运算(并、差、交、笛卡尔积)
并:
R S
A B C A B C
a1 b1 c1 a1 b2 c2
a1 b2 c2 a1 b3 c2
a2 b2 c1 a2 b2 c1
R∪S
A B C
a1 b1 c1
a1 b2 c2
a1 b3 c2
a2 b2 c1
差:
R S
A B C A B C
a1 b1 c1 a1 b2 c2
a1 b2 c2 a1 b3 c2
a2 b2 c1 a2 b2 c1
R-S
A B C
a1 b1 c1
交:
R S
A B C A B C
a1 b1 c1 a1 b2 c2
a1 b2 c2 a1 b3 c2
a2 b2 c1 a2 b2 c1
R∩S
A B C
a1 b2 c2
a2 b2 c1
笛卡尔积:
简单来说,就是把R表的第一行与S表第一行组合写在一起,作为一行。然后把R表的第一行与S表第二行依此写在一起,作为新一行。以此类推。当S表的每一行都与R表的第一行组合过一次以后,换R表的第二行与S表第一行组合,以此类推,直到R表与S表的每一行都组合过一次,则运算完毕。如果R表有N行,S表有M行,那么笛卡尔积R×S有N×M行。
R S
A B C A B C
a1 b1 c1 a1 b2 c2
a1 b2 c2 a1 b3 c2
a2 b2 c1 a2 b2 c1
RxS
A B C A B C
a1 b1 c1 a1 b2 c2
a1 b1 c1 a1 b3 c2
a1 b1 c1 a2 b2 c1
a1 b2 c2 a1 b2 c2
a1 b2 c2 a1 b3 c2
a1 b2 c2 a2 b2 c1
a2 b2 c1 a1 b2 c2
a2 b2 c1 a1 b3 c2
a2 b2 c1 a2 b2 c1
专门的关系运算(选择、投影、连接、除)
数据库的专门关系运算有:选择(对关系进行水平分割)、投影(对关系进行垂直分割)、连接、自然连接(关系的结合)、除运算等。
选择(selection):
选择就是”筛选行”。选择一般要对一张表选择符合条件的行(但包含所有列)。
举例:
R
A B C
a b c
d a f
c b d
σ(B=b)(R)
A B C
a b c
c b d
投影(projection):
投影就是”筛选列”。一个数据库表,如仅希望得到其一部分的列的内容(但全部行),就是投影。
举例:
R
A B C
a b c
d a f
c b d
∏A,C(R)
A C
a c
d f
c d
除(division):
除是笛卡尔积的逆运算。设关系R和S分别有r列和s列(r>s,且s≠0),那么R÷S的结果有(r-s)个列,并且是满足下列条件的最大的表:其中每行与S中的每行组合成的新行都在R中。注意有时关系之间的除法也有”余数”,可能S×T的结果为R的一部分(最大的一部分),R中的多余部分为”余数”。
举例:
C、D是关系S中的两个属性,故在R集合中对除了C, D之外的属性即A、B两属性进行投影, 得到a b; b c; e d;这三组,然后用这个结果与关系S进行笛卡尔积运算,发现b c c d这组在关系R中没有, 其余a b; e d;做的运算在R中存在。因此最后结果为a b; e d。
R
A B C D
a b c d
a b e f
b c e f
e d c d
e d e f
a b d e
S
C D
c d
e f
R÷S
A B
a b
e d
连接(join):
两表笛卡尔积的结果比较庞大,实际应用中一般仅选取其中一部分的行,选取两表列之间满足一定条件的行,这就是关系之间的连接。
根据连接条件的种类不同,关系之间的连接分为等值连接、大于连接、小于连接、自然连接:
- 条件是类似于”B列=D列”的”某列=某列”的条件,就是等值连接;
- 条件是”某列>某列”的,就是大于连接;
- 条件是”某列<某列”的,就是小于连接。
- 自然连接是不提出明确的连接条件,但”暗含”着一个条件,就是”列名相同的值也相同”。在自然连接的结果表中,往往还要合并相同列名的列。当对关系R和S进行自然连接时,要求R和S含有一个或者多个共有的属性。
举例:
等值连接:
R
A B C
a1 b1 5
a1 b2 6
a2 b3 8
a2 b4 12
S
B E
b1 3
b2 7
b3 10
b3 2
b5 2
R.B=S.B的等值连接:
A R.B C S.B E
a1 b1 5 b1 3
a1 b2 6 b2 7
a2 b3 8 b3 10
a2 b3 8 b3 2
小于连接:
R
A B C
1 2 3
4 5 6
7 8 9
S
D E
3 1
6 2
B<D的小于连接
A B C D E
1 2 3 3 1
1 2 3 6 2
4 5 6 6 2
自然连接:
R
A B C
a b c
d b c
b b f
c a d
S
B C D
b c d
b c e
a d b
R与S的自然连接暗含的条件是R.B=S.B且R.C=S.C,因为R、S中有同名的2列B、C
A B C D
a b c d
a b c e
d b c d
d b c e
c a d b