一、数据库系统的分类:面向对象型、关系型、对象关系型
1、面向对象型数据库(OODBS)
(1)面向对象型数据库系统是一种持久的、可共享对象库的存储器和管理器;是基于OO的思想,因此这类数据库也有封装、类、类层次等概念
(2)目前流行的开源面向对象数据库:DB4O
2、关系型数据库(RDBMS)
(1)关系型数据库基于表的特性,方便用户使用查询语言SQL进行增删改查,目前流行的主流开源产品是MySQL
3、对象关系型数据库
(1)这个概念里保留了关系型数据库的结构,但允许关系表里中的列含有一个复杂的对象,这些对象能够捆绑处理复杂数据的处理过程(一种存储过程),并且SQL能够允许调用与关系型同等的“对象方法”。
(2)目前主流的数据库厂商或多或少都支持了部分面向对象的概念,在Mysql里也引入了OpenGIS(开放的地理数据互操作规范)的支持。
二、关系型数据库的系统架构
1、数据库管理系统和操作系统有很多类似的地方,例如:
(1)支持大量的用户同时读写一份数据(表),这需要合理的处理并发情况=====================》采用缓存技术(buffer)才能提供大并发量下的快速访问。并发访问要求数据库系统的内存管理系统采用类似操作系统的虚拟内存管理方式和算法。
(2)数据库管理系统的网络方面==========》网络协议被设计成能够高速解析客户端的查询
2、DBMS的基本功能模块
(1)网络客户端连接
- (1.1)客户端连接到DBMS有两种方式,一种是通过通信方式,另一种是通过接口连接,接口方式连接到DBMS的,数据库系统已经成为应用系统一部分,即称为嵌入式数据库系统。
- (1.2)网络通信方式连接到DBMS的,一般采用通用的连接器:例如,ODBC JDBC .NET等连接。
- (1.3)不管是网络通信方式,还是接口直连内嵌式数据库系统,应用程序客户端都要发送SQL命令(查询语句或预处理语句)到数据库系统,获取命令的执行结果集,解析和处理结果集,最后展示给用户。
复制代码
(2)SQL解析和优化(Parser+Optimizer)
- (2.1)SQL接口——SQL处理——SQL优化——SQL执行
- (2.2)查询接口也就是SQL接口(SQL Interface),接收SQL语句
- (2.3)SQL语句处理,包括:语句合法性检查——语义检查——获得对象解析锁——数据访问权限的核对,这四个步骤。其中:
- (2.3.1)语句合法性检查:在高速缓存里找不到对应的SQL语句时,才开始检查SQL的合法性。语法检查的过程中,不会对SQL语句中包含 的表名、列表做解析,仅仅是语法上的检查;
- (2.3.2)语义检查:SQL符合语法后,接着对语义检查,也就是对语句中的字段、表等内容做检查,确定字段、表是否在数据库里。如果语法和语义同时有错误,系统会先提示语法错误,等语法完全正确后再提示说列名或表名错误。
- (2.3.3)获得对象解析锁:数据库的主要任务之一是:保证大量并发情况下的数据完整性,当语法和语义都正确后,系统会对我们需要查询的对象加锁,这主要是为了保证数据的一致性,防止查询过程中,其他用户对这个对象结构做改变。
- (2.3.4)数据访问权限的核对:语法和语义检查后,服务器还会做权限核对,如果连接服务器的用户不具有数据库访问权限,客户端就不能够获取这些数据。需要注意:数据库服务器是先进行语法和语义检查,然后才检查访问权限。
- (2.4)SQL优化:数据库查询优化器(Optimize)是RDBMS服务器的一个组成部分,查询优化器的任务是:通过产生可供选择的执行计划,找到最低估算开销的执行计划,来优化一条SQL语句。当一条SQL被送入RDBMS服务器后,将会别解析并提交给数据库查询优化器。查询优化器将会进行查询重写和表达式评估,以产生可供选择的执行计划。产生可供选择的执行计划的数量,取决于RDBMS中定义的计划空间的大小
- (2.5)SQL执行:大部分关系型数据库服务器进程在接到客户端SQL后,不会直接去数据库查询,而是先在数据库的高速缓存中查找,是否存在相同语句的执行计划。如果在数据库高速缓存中,刚好有其他人使用这个查询语句的话,服务器进程会直接把这个数据传递给客户端,省去后续工作。
复制代码
因此,采用高速数据缓存且命中率较高的情况下,可以提高SQL语句的查询效率,一方面是从内存中读取数据比从硬盘中的数据文件读取效率高;另一方面,也是因为这个语句解析的原因。
(3)存储引擎
- 三级结构对数据库的组织从内到外分三个层次描述:内模式、概念模式、外模式。内模式是真正存储数据的,概念模式和外模式仅是一种逻辑表示数据的方法,但却可以放心大胆使用它们,这是靠DBMS的映射功能实现的。
- 查询优化和查询解析实现了概念模式的功能,然而对数据库数据的访问归根到底是需要访问磁盘上的物理文件的。
复制代码
三、MySQL数据库系统
在功能上,MySQL是基于组件的模块化设计,事实上,MySQL架构既不是严格基于组件也不是真正的模块化.。从严格意义上来说,MySQL系统是基于函数库和数据结构的方式来整合代码。
MySQL子系统和核心库
MySQL包含以下子系统和核心库:
——网络连接和网络通信协议子系统(TCP/IP协议,该子系统为其他子系统提供数据包的读 写 解析和发送)
——线程、进程和内存分配子系统(线程子系统跟踪各类线程以保证当客户端发送请求过来时,服务器拥有线程来处理它)
——查询解析和查询优化子系统
——存储引擎接口子系统
——各类存储引擎子系统
——安全管理子系统(数据库系统抵御外部攻击的第一防线,依赖用户验证和访问权限控制来保护服务器)
——日志子系统
——其他子系统,例如复制功能,错误处理等
——mysys核心库文件
(1)子系统之间的联系,例子:一个客户端通过网络连接MySQL服务器,做SQL查询操作等,子系统协作过程:
- (1.1)网络连接子系统执行一系列与网络协议有关的底层任务;
- (1.2)网络连接子系统调用线程子系统,线程系统提供一个线程来处理该连接,这个线程就称为连接线程(连接线程可能来自线程缓存thread cache,也可能是新创建的);
- (1.3)连接线程:
- (1.3.1)首先调用安全管理子系统来验证用户访问的合法性(用户是否有权限访问数据库、密码是否正确等):
- (1.3.2)连接线程确认连接合法后,将获得的数据(SQL语句)根据情况做分发,如果查询和上次查询一模一样,直接从query cache中取值;如果不能直接利用缓存获取查询,则会调用解析子系统对SQL语句进行解析。同时,如果配置了日志功能,还会调用日志系统去记录此次信息(SQL语句、执行时间、执行的用户等);
- (1.3.3)解析子系统将解析结果传给优化子系统,优化SQL语句。同时,涉及到一个安全问题:用户是否有权访问特点的表?这里将再次调用安全管理子系统,确认权限后才可以对表进行操作。
- (1.4)对表进行操作,将一系列请求发往存储引擎接口子系统。发往子系统的请求可以认为是增删改查等SQL操作
- (1.4.1)存储引擎接口子系统将一系列请求自动转化为某个具体的存储引擎子系统方法(例如,innodb存储引擎子系统)。所谓自动,其实就是面向对象编程里的多态。简单来说,调用者感觉在和接口子系统互动,但实际上处理的却是某个具体存储子系统,例如innodb存储引擎子系统。
- (1.4.2)顺利的话,响应存储子系统模块会把执行SQL的结果发往客户端;不顺利,则发送报错信息。最后,服务器将控制权交回给连接线程,连接线程做清理工作,并再次等待客户端的连接或其他查询,直到客户端输入quit命令为止,此次会话才算结束。
- (1.5)补充-1:mysql日常90%的工作如上描述过程在运转,但有例外,例如:如果服务器扮演复制功能,则它的复制子系统还会不停读取二进制日志文件;如果服务器扮演的是从服务器角色,从服务器还将启动两个线程,分别是SQL线程和IO线程,它们共同接受主服务器传过来的语句并更新从服务器。
- (1.6)补充-2:所有子系统的协作运行,都是核心库在默默提供支持。MySQL将一些常用且基础的API放在一起,形成核心库。
复制代码
什么是数据库
- 数据库是一个以某种有组织的方式存储的数据集合。
- 理解数据库的一种最简单的办法是将其想象为一个文件柜。此文件柜是一个存放数据的物理位置,不管数据是什么以及如何组织的。
- 数据库(database): 保存有组织的数据的容器(通常是一个文件或一组文件)。
- 误用导致混淆 : 人们通常用数据库这个术语来代表他们使用的数据库软件。这是不正确的,它是引起混淆的根源。确切地说,数据库软件应称为DBMS(数据库管理系统)。数据库是通过DBMS创建和操纵的容器,你并不直接访问数据库。你使用的是DBMS,它替你访问和操纵数据库。
表和模式
表
- 表(table):某种特定类型数据的结构化清单。
- 在你将资料放入自己的文件柜时,并不是随便将它们扔进某个抽屉就完事了,而是在文件柜中创建文件,然后将相关的资料放入特定的文件中。
- 在数据库领域中,这种文件称为表。表是一种结构化的文件,可用来存储某种特定类型的数据。 表可以保存顾客清单、产品目录,或者其他信息清单。
- 关键的一点在于,存储在表中的数据是同一种类型的数据或一个清单。 决不应该将顾客的清单与订单的清单存储在同一个数据库表中。这样做将使以后的检索和访问很困难。应该创建两个表,每个清单一个表。
- 数据库中的每个表都有一个名字,用来标识自己。此名字是唯一的,这表示数据库中没有其他表具有相同的名字。
模式
- 模式(schema):关于数据库和表的布局及特性的信息。
- 表具有一些特性,这些特性定义了数据在表中如何存储,如可以存储什么样的数据,数据如何分解,各部分信息如何命名,等等。描述表的这些特性信息就是所谓的模式,模式可以用来描述数据库中特定的表以及整个数据库(和其中表的关系)
- 注意: 有时,模式用作数据库的同义词。遗憾的是,模式的含义通常在上下文中并不是很清晰。在这里,模式指的是上面给出的定义。
列和数据类型
表由列组成。列中存储着表中某部分的信息。
列
- 列(column):表中的一个字段/属性。所有表都是由一个或多个列组成的。
- 理解列的最好办法是将表想象为一个网格。网格中每一列存储着一条特定的信息。例如,在顾客表中,一个列存储着顾客编号,另一个列存储着顾客名,而地址、城市、州以及邮政编码全都存储在各自的列中。
- 分解数据:正确地将数据分解为多个列极为重要。 例如,城市、州、邮政编码应该总是独立的列。通过把它分解开,才有可能利用特定的列对数据进行排序和过滤。
数据类型
- 数据类型(datatype):所容许的数据的类型。每个表的列都有相应的数据类型,它限制(或容许)该列中存储的数据。
- 数据类型定义列可以存储的数据种类。 例如,如果列中存储的为数字(或许是订单中的物品数),则相应的数据类型应该为数值类型。
- 数据类型限制可存储在列中的数据种类(例如,防止在数值字段中录入字符值)。 数据类型还帮助正确地排序数据,并在优化磁盘使用方面起重要的作用。
行/记录
- 行(row):表中的一个记录。
- 表中的数据是按行存储的,所保存的每个记录都存储在自己的行内。 如果将表想象为网格,则网格中垂直的列为表列,水平行为表行。
- 是记录还是行? 你可能听到用户在提到行(row)时称其为数据库记录(record)。在很大程度上,这两个术语是可以互相替代的,但从技术上说,行才是正确的术语。
主键
- 主键(primary key):一列(或一组列),其值能够唯一区分表中每一行。
- 表中每一行都应该有可以唯一标识自己的一列(或一组列)。 例如,一个顾客表可以使用顾客编号列,而订单表可以使用订单ID,雇员表可以使用雇员ID或雇员社会保险号。
- 没有主键,更新或删除表中特定行很困难,因为没有安全的方法保证只涉及相关的行。大多数数据库设计人员都应保证他们创建的每个表具有一个主键,以便于以后的数据操纵和管理。
- 主键值规则(强制实施):
- 每个表只能拥有一个主键;
- 任意两行都不具有相同的主键值;
- 每个行都必须具有一个主键值(主键列的数据不允许NULL值)。
- 表中的任何列都可以作为主键,通常定义在表的一列上,但也可以一起使用多个列作为联合主键。在使用多列组合作为一个联合主键时,上述规则必须应用到构成主键的所有列,所有列值的组合必须是唯一的(但单个列的值可以不唯一)
- 使用主键的好习惯:
- 不更新主键列中的值;
- 不重用主键列的值;
- 不在主键列中使用可能会更改的值。(例如,如果使用一个名字作为主键以标识某个供应商,当该供应商合并和更改其名字时,必须更改这个主键。)
- 还有一种非常重要的键,称为外键,我们不在此处介绍了。
四、什么是SQL
- SQL(发音为字母S-Q-L或sequel)是结构化查询语言(Structured Query Language)的缩写。SQL是一种专门用来与数据库通信的语言。
- SQL有如下的优点:
- SQL不是某个特定数据库供应商专有的语言。几乎所有重要的DBMS都支持SQL,所以,学习此语言使你几乎能与所有数据库打交道。
- SQL简单易学。它的语句全都是由描述性很强的英语单词组成,而且这些单词的数目不多。
- SQL尽管看上去很简单,但它实际上是一种强有力的语言,灵活使用其语言元素,可以进行非常复杂和高级的数据库操作。
1.DDL(Data Definition Language,数据定义语言)
主要用于维护存储数据的结构,这种结构包括数据库,表、视图、索引、同义词、聚簇等。
代表指令:
create 创建数据库和数据库的一些对象
drop 删除数据库/表、索引、条件约束以及数据表的权限等
alter 修改数据库表的定义及数据属性
2.DML(Data Manipulation Language,数据操纵语言)
介绍
用来对数据库进行增删改操作
1.添加
INSERT INTO 表名(字段1,字段2,...)VALUES(值1,值2,...)[,(值1,值2,...)...];
2.修改
UPDATE 表名 SET 字段1 = 值1,字段2=值2【where 条件】;
3.删除
DELETE FROM 表名【WHERE 条件】;
3.DCL(Data Control Language,数据控制语言)
管理用户
1.查询用户
USE mysql;
SELECT * FROM user;
2.创建用户
CREATE USER '用户名'@'主机名’ IDENTIFIED BY‘密码' ;
2.修改用户密码
ALTER USER ‘用户名'@'主机名’IDENTIFIED WITH mysqL native_ _password BY '新密码’ ;
3.删除用户
DROP USER‘用户名’@'主机名';
4.DQL(Data Query Language,数据查询语言)
条件查询
基本条件查询
1.查询多个字段
SELECT字段1, 字段2,字段3... FROM表名;
SELECT * FROM表名;
2.设置别名
SELECT字段1 [AS别名1],字段2 [AS别名2] .. FROM表名;
3.去除重复记录
SELECT DISTINCT字段列表FROM表名;
内连接和外连接
1.内连接
mysql> select * from user u inner join dep d on u.id=d.id;
+----+------+------+--------+--------+----+--------+
| id | name | age | status | gender | id | name |
+----+------+------+--------+--------+----+--------+
| 1 | Tom1 | 19 | 1 | 男 | 1 | 研发部 |
| 2 | Tom2 | 29 | 0 | 男 | 2 | 市场部 |
| 3 | Tom3 | 19 | 1 | 男 | 3 | 财务部 |
| 5 | Tom4 | 10 | 1 | 男 | 5 | 总经办 |
+----+------+------+--------+--------+----+--------+
4 rows in set (0.00 sec)
2.左外连接
mysql> select * from user u left join dep d on u.id=d.id;
+----+------+------+--------+--------+------+--------+
| id | name | age | status | gender | id | name |
+----+------+------+--------+--------+------+--------+
| 1 | Tom1 | 19 | 1 | 男 | 1 | 研发部 |
| 2 | Tom2 | 29 | 0 | 男 | 2 | 市场部 |
| 3 | Tom3 | 19 | 1 | 男 | 3 | 财务部 |
| 5 | Tom4 | 10 | 1 | 男 | 5 | 总经办 |
| 6 | Tom5 | 80 | 1 | 男 | NULL | NULL |
+----+------+------+--------+--------+------+--------+
5 rows in set (0.00 sec)
3.右外连接
mysql> select * from user u right join dep d on u.id=d.id;
+------+------+------+--------+--------+----+--------+
| id | name | age | status | gender | id | name |
+------+------+------+--------+--------+----+--------+
| 1 | Tom1 | 19 | 1 | 男 | 1 | 研发部 |
| 2 | Tom2 | 29 | 0 | 男 | 2 | 市场部 |
| 3 | Tom3 | 19 | 1 | 男 | 3 | 财务部 |
| NULL | NULL | NULL | NULL | NULL | 4 | 销售部 |
| 5 | Tom4 | 10 | 1 | 男 | 5 | 总经办 |
+------+------+------+--------+--------+----+--------+
5 rows in set (0.00 sec)
五、什么是MySQL
我们在前面说到,数据的所有存储、检索、管理和处理实际上是由数据库软件——DBMS(数据库管理系统)完成的。MySQL是一种DBMS,即它是一种数据库软件。
1. 客户机—服务器软件
- 服务器软件是与数据文件打交道的软件。 关于数据、数据添加、删除和数据更新的所有请求都由服务器软件完成。这些请求或更改来自运行客户机软件的计算机。
- 客户机软件是与用户打交道的软件。 例如,如果你请求一个按字母顺序列出的产品表,则客户机软件通过网络提交该请求给服务器软件。服务器软件处这个请求,根据需要过滤、丢弃和排序数据;然后把结果送回到你的客户机软件。
- 为了使用MySQL,你需要访问运行MySQL服务器软件的计算机和发布命令到MySQL的客户机软件的计算机。
- 服务器软件为MySQL DBMS。你可以在本地安装的副本上运行,也可以连接到运行在你具有访问权的远程服务器上的一个副本。
- 客户机可以是MySQL提供的工具、脚本语言(如Perl)、Web应用开发语言(如ASP、ColdFusion、JSP和PHP)、程序设计语言(如C、C++、Java)等。
2. MySQL工具
- 如前所述,MySQL是一个客户机—服务器DBMS,因此,为了使用MySQL,需要有一个客户机,即你需要用来与MySQL打交道(给MySQL提供要执行的命令)的一个应用。
- 有许多客户机应用可供选择,但在学习MySQL(确切地说,在编写和测试MySQL脚本时),最好是使用专门用途的实用程序。
- 这里只简单介绍一个mysql命令行实用程序
- 每个MySQL安装都有一个名为mysql的简单命令行实用程序。这个实用程序没有下拉菜单、流行的用户界面、鼠标支持或任何类似的
- 东西。在操作系统命令提示符下输入mysql将出现一个如下的简单提示: