数据库概述
数据库,简而言之可视为电子化的文件柜——存储电子文件的处所,用户可以对文件中的资料执行新增、截取、更新、删除等操作。
所谓数据库是以一定方式储存在一起、能予多个用户共享、具有尽可能小的冗余度、与应用程序彼此独立的数据集合。一个数据库由多个表空间(Tablespace)构成,底层。
数据库管理系统
数据库管理系统(Database Management System,简称DBMS)是为管理数据库而设计的电脑软件系统,一般具有存储、截取、安全保障、备份等基础功能。数据库管理系统可以依据它所支持的数据库模型来作分类,例如关系式、XML;或依据所支持的电脑类型来作分类,例如服务器聚类、移动电话;或依据所用查询语言来作分类,例如SQL、XQuery;或依据性能冲量重点来作分类,例如最大规模、最高执行速度;亦或其他的分类方式。不论使用哪种分类方式,一些DBMS能够跨类别,例如,同时支持多种查询语言。
数据库的分类
随着数据库技术与其他分支学科技术的结合,出现了多种新型数据库,例如:与分布处理技术结合产生的分布式数据库、与并行处理技术结合产生的并行数据库、与人工智能结合产生的演绎数据库、与多媒体技术结合产生的多媒体数据库。另外,数据库技术应用于特定的领域,出现了工程数据库、 地理数据库、统计数据库、空间数据库等特定领域数据库。
关系数据库:
关系型数据库是信息的集合,它以预定义的关系组织数据,数据存储在一个或多个由列和行构成的表(或“关系”)中,用户可以轻松查看和理解不同数据结构之间的关系。 关系是不同表之间的逻辑连接,根据这些表之间的交互建立。
-
MySQL
-
MariaDB(MySQL的代替品)
-
Percona Server(MySQL的代替品)
-
-
PostgreSQL
-
Microsoft Access
-
Microsoft SQL Server
-
Google Fusion Tables
-
FileMaker
-
Oracle数据库
-
Sybase
-
dBASE
-
Clipper
-
FoxPro
-
foshub
几乎所有的数据库管理系统都配备了一个开放式数据库连接(ODBC)驱动程序,令各个数据库之间得以互相集成。
非关系型数据库(NoSQL):
Not only SQL,是对不同于传统的关系数据库的数据库管理系统的统称,其数据存储可以不需要固定的表格模式以及元数据(metadata),也经常会避免使用SQL的JOIN操作,一般有水平可扩展性的特征。
-
BigTable(Google)
-
Cassandra
-
MongoDB
-
CouchDB
-
Redis
键值数据库:
-
Apache Cassandra(为Facebook所使用):高度可扩展
-
Dynamo
-
LevelDB(Google)
数据库模型
-
物件模型
-
层次模型(轻量级数据访问协议)
-
网状模型(大型数据储存)
满足下面两个条件的基本层次联系的集合为网状模型。
- 允许一个以上的结点无双亲;
- 一个结点可以有多于一个的双亲。
-
关系模型
-
面向对象模型
-
半结构化模型
-
平面模型(表格模型,一般在形式上是一个二维阵列。如表格模型数据Excel)
架构 (Schema)
资料库的架构可以大致区分为三个概括层次:内层、概念层和外层。
- 内层:最接近实际储存体,亦即有关资料的实际储存方式。
- 外层:最接近使用者,即有关个别使用者观看资料的方式。
- 概念层:介于两者之间的间接层。[9]
数据库索引
资料索引的观念由来已久,像是一本书前面几页都有目录,目录也算是索引的一种,只是它的分类较广,例如车牌、身份证字号、条码等,都是一个索引的号码,当我们看到号码时,可以从号码中看出其中的端倪,若是要找的人、车或物品,也只要提供相关的号码,即可迅速查到正确的人事物。
另外,索引跟栏位有著相应的关系,索引即是由栏位而来,其中栏位有所谓的关键栏位(Key Field),该栏位具有唯一性,即其值不可重复,且不可为"空值null
"。例如:在合并资料时,索引便是扮演欲附加栏位资料之指向性用途的角色。故此索引为不可重复性且不可为空。
数据库事务
事务(transaction)包含一组数据库操作的逻辑工作单元,在事务中包含的数据库操作是不可分割的整体,这些操作要么一起做,要么一起回滚(Roll Back)到执行前的状态。 事务的ACID特性:
-
原子性(atomicity)
-
一致性(consistency)
-
隔离性(isolation)
-
持续性(durability)
事务的并发性是指多个事务的并行操作轮流交叉运行,事务的并发可能会存取和存储不正确的数据,破坏交易的隔离性和数据库的一致性。
SQL语法
-
DDL(Data Definition Language) 数据定义语言,用来定义数据库对象:数据库,表,列等。DDL就是用来操作数据库,表等;其语句包括动词CREATE和DROP。在数据库中创建新表或删除表(CREAT TABLE 或 DROP TABLE)
-- 查询所有的数据库 SHOW DATABASES; -- 创建数据库 CREATE DATABASE 数据库名称; -- 当存在对应名字的数据库,先删库再新建 CREATE DATABASE IF NOT EXISTS 数据库名称; -- 使用数据库 USE 数据库名称; SELECT DATABASE(); -- 删除数据库 DROP DATABASE 数据库名称; DROP DATABASE IF EXISTS 数据库名称;
-
DML(Data Manipulation Language) 数据操作语言,用来对数据库中表的数据进行增删改
DML简单理解就是对表中数据进行增删改;其语句包括动词INSERT,UPDATE和DELETE。
-- 查询数据库表 SHOW TABLES; -- 查看表结构 DESC 表名称; -- 建表 CREATE TABLE 表名 ( 字段名1 数据类型1, 字段名2 数据类型2, … 字段名n 数据类型n ); CREATE TABLE IF NOT EXITS 表名 ( 字段名1 数据类型1, 字段名2 数据类型2, … 字段名n 数据类型n ); -- 删表 DROP TABLE 表名; DROP TABLE IF EXISTS 表名; -- 改表名 ALTER TABLE 表名 RENAME TO 新的表名; -- 加字段 ALTER TABLE 表名 ADD 列名 数据类型; -- 改字段类型 ALTER TABLE 表名 MODIFY 列名 新数据类型; -- 修改字段名及字段类型 ALTER TABLE 表名 CHANGE 列名 新列名 新数据类型; -- 删字段 ALTER TABLE 表名 DROP 列名;
-
DQL(Data Query Language) 数据查询语言,用来查询数据库中表的记录(数据),动词:SELECT
DQL简单理解就是对数据进行查询操作。从数据库表中查询到我们想要的数据。
-- 查询数据 SELECT 字段列表 FROM 表名; SELECT * FROM 表名; -- 查询对应字段并去重 SELECT DISTINCT 字段列表 FROM 表名; -- 条件查询 SELECT 字段列表 FROM 表名 WHERE 条件列表; -- 排序查询,ASC:升序排列(默认值)DESC:降序排列 SELECT 字段列表 FROM 表名 ORDER BY 排序字段名1 [排序方式1],排序字段名2 [排序方式2] …; -- 分页查询,起始索引 = (当前页码 - 1) * 每页显示的条数 SELECT 字段列表 FROM 表名 LIMIT 起始索引 , 查询条目数; -- 聚合函数 SELECT 聚合函数名(列名) FROM 表; -- 分组查询 SELECT 字段列表 FROM 表名 [WHERE 分组前条件限定] GROUP BY 分组字段名 [HAVING 分组后条件过滤]; -- 拼表查询,得到的结果是笛卡尔积,比如表1数据为a,b,表2数据为1,2,3,则积为{a,1},{a,2},{a,3},{b,1},{b,2},{b,3} SELECT * FROM 表名1, 表名2; -- 隐式内连接 SELECT 字段列表 FROM 表1,表2… WHERE 条件; -- 显示内连接,多表查询的时候join更优where SELECT 字段列表 FROM 表1 [INNER] JOIN 表2 ON 条件; -- 左外连接 SELECT 字段列表 FROM 表1 LEFT [OUTER] JOIN 表2 ON 条件; -- 右外连接 SELECT 字段列表 FROM 表1 RIGHT [OUTER] JOIN 表2 ON 条件;
![SQL JOINS](/SQL JOINS.jpg)
-
DCL(Data Control Language) 数据控制语言,用来定义数据库的访问权限和安全级别,及创建用户;
DCL简单理解就是对数据库进行权限控制。比如我让某一个数据库表只能让某一个用户进行操作等。
以及其他的一些CCL(指针控制语言),TPL(事务处理语言)等
-- 给指定列添加数据 INSERT INTO 表名(列名1,列名2,…) VALUES(值1,值2,…); -- 给全部列添加数据 INSERT INTO 表名 VALUES(值1,值2,…); -- 批量添加数据 INSERT INTO 表名(列名1,列名2,…) VALUES(值1,值2,…),(值1,值2,…),(值1,值2,…)…; INSERT INTO 表名 VALUES(值1,值2,…),(值1,值2,…),(值1,值2,…)…; -- 修改表数据 UPDATE 表名 SET 列名1=值1,列名2=值2,… [WHERE 条件]; -- 删除数据 DELETE FROM 表名 [WHERE 条件];
SQL 函数
-
聚合函数
聚集/聚合函数作用于一组数据,并对一组数据返回一个值,聚集函数会忽略NULL值;
COUNT
:统计结果记录数,如果列的值为NULL,不会计算在内的,即会忽略NULL值MAX
: 统计计算最大值MIN
: 统计计算最小值SUM
: 统计计算求和AVG
: 统计计算平均值,如果列的值为NULL,不会计算在内的,即会忽略NULL值 -
类型转化函数
CAST(value AS type)
,CONVERT(value, type)
:用来获取一个类型的值,并产生另一个类型的值;
可装换的数据类型:
- 二进制,同带binary前缀的效果 :
BINARY
- 字符型,可带参数 :
CHAR()
- 日期 :
DATE
- 时间:
TIME(5)
- 日期时间型 :
DATETIME
- 浮点数 :
DECIMAL
- 整数 :
SIGNED
- 无符号整数 :
UNSIGNED
- 二进制,同带binary前缀的效果 :
-
字符串函数
LENGTH(s)
:返回字符串s的长度(字节数)CONCAT(s1,s2,...)
:将字符串s1,s2等多个字符串合并为一个字符串。如果有任何参数为null,则函数返回null。如果参数是数字,则自动转换为字符串。
UPPER(s)
:将字符串s的所有字母变成大写字母LOWER(s)
:将字符串s的所有字母变成小写字母TRIM(s)
:去掉字符串s开始和结尾处的空格 -
日期函数
CURDATE()
,CURRENT_DATE()
,CURRENT_DATE
:返回当前日期CURTIME()
,CURRENT_TIME()
,CURRENT_TIME
:返回当前时间NOW()
,CURRENT_TIMESTAMP()
,LOCALTIME()
,SYSDATE()
,LOCALTIMESTAMP()
:返回当前日期和时间
YEAR(d)
:接受date参数,并返回日期的年份 -
控制流程函数
IF(test,arg1,arg2)
:如果test是真,返回t;否则返回fIFNULL(arg1,arg2)
:如果arg1不是空,返回arg1,否则返回arg2