数据库
数据库分类
- 关系型数据库
- Oracle
- Mysql
- SQLServer
- Access
- 非关系型数据库
- MongoDB
- Redis
- Solr
- ElasticSearch
- Hive
- HBase
关系型数据库
关系型数据库有特定的组织方式,其以行和列的形式存储数据,以便于用户理解。关系型数据库这一系列的行和列被成为表,一组表组成了数据库。用户通过查询来检索数据库中的数据,而查询是一个用于限定数据库中某些区域的执行代码。关系模型可以简单理解为二维表模型,而一个关系型数据库就是由二维码表及其之间的关系组成的一个数据集合
MySql数据库
- MySql服务端,它用来处理具体数据维护,保护磁盘
- MySql客户端,CRUD操作
SQL语句
概述
SQL即结构化查询语言(Structured Query Language),是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系型数据库系统,同时也是数据库脚本文件的扩展名
分类
- DML(Data Manipulation Languahe) 数据操作语言
如:insert、delete、update、select 简称C(Create 新增) R(Retrieve 查询) U(Update) D(Delete) - DDL(Data Definition Language) 数据库定义语言
如:create table等 - DCL(Data Control Language) 数据库控制语言
如:grant(用户授权)、deny(拒绝)、revoke(收回)等,只有管理员才有相应的权限 - DQL(Data Query Language) 数据库查询语言
如:select 语法
注意: SQL不区分大小写
命名规则
- 字段名必须以字母开头,尽量不要使用拼音
- 长度不能超过 30 个字符
- 不能使用数据库保留字,如 where、order、group
- 只能使用大小写字母,数字,$等
- 多个单词用下划线隔开
数据类型
- thinyint,int 整数类型
- float,double 小数类型
- number(5,2) decimal(5,2) 也可以表示小数,表示共五位,其中可以有两位小数
- decimal 和 numeric 表示精确的整数数字
- date 包含年月日
- time 时分秒
- datetime 年月日时分秒
- timestamp 时间戳,不是日期,是从1970.1.1到指定日期的毫秒数
- blob 二进制数据,可以存放图片、声音,容量4G,因为数据库大,备份慢,这些内容价值不大,迁移时时间久,所以目前都不会直接存储这样的数据,而只存储访问路径,文件直接放在磁盘上
字段约束
- 主键约束 primary key:加了这个约束之后该字段所在列就是主键,主键特点就是唯一、非空,通常,每个表都要有主键
主键自增策略(auto_increment):主键一般设置为 int 数值类型,为了方便维护,可以设置自增策略,我们不需要专门为其指定值,该字段会在我们每次新增数据时自己自增1
id int primary key auto_increment
- 非空约束(not null):如果为一个列添加了非空约束,这个列的值就不能为空
sex varchar(6) not null
- 唯一约束(unique):如果为一个列添加了唯一约束,这个列的值就必须时唯一的
id_number varchar(20) unique
- 外键约束(foreign key):设置外键约束的两个表之间具有父子关系,即子表中某个字段的取值范围由父表决定
#表未存在
name varchar(10),
id_number varchar(20),
name varchar(10) foreign key references Persons(id_number)
- 检查约束(check):检查约束用于限制列中的值的范围
如果对单个列定义 check 约束,那么该列只允许特定的值
如果对一个表定义 check 约束,那么该约束会在特定的列中对值进行限制
#check约束规定id>0
id int primary key auto_increment
check(id>0)
#check约束多个字段
id int primary key auto_increment
age int not null
check(id>0 and age>0)
- 默认约束(default):默认约束用于向列中插入默认值。如果没有规定其他值。那么会将默认值添加到所有的新纪录
sex varchar(6) not null default "男"
常用SQL命令
- 库命令:
#创建一个名字为dbname并且编码格式为utf-8的库
create database dbname default charcter set utf-8
#删除名为dbname库
drop database dbname
#查看所有数据库
show databases
#使用名为dbname的数据库
use dbname
- 表命令:
#创建名字为tb_name的表,假如id、name、sex字段,id为主键自增
create table tb_name(
id int primary auto_increment,
name varchar(20),
sex varchar(6)
)
#删除名字为tb_name的表
drop table tb_name
#查看名字为tb_name表结构
desc tb_name
#向名字为tb_name的表插入数据(字段名:id、name、sex)
insert into tb_name values(null,"tom","男") #id主键自增,赋null值
insert into tb_name(name,sex) values("Jerry","男")
#查询名为tb_name的表全部数据
select * from tb_name #不好 * 降低效率
select id,name,sex from tb_name
#根据条件查询名为tb_name的表某一个数据/全部数据
select id from tb_name where name = "tom"
select id,name,sex from tb_name where sex = "男"
#根据条件修改名为tb_name的表的数据
update tb_name set name = "jack" where id = 2
#根据条件删除名为tb_name的表中的数据
delete from tb_name where name = "tom"
#根据某个字段对名为tb_name的表进行排序
select id,name,sex from tb_name order by id #order by 默认升序
select id,name,sex from tb_name order by id desc #order by 字段 desc 降序
#查询表中总记录数
select count(*) from tb_name
事务(transaction)
概述
事务是指作为单个逻辑工作单元执行的一系列操作,要么完美的执行,要么完全的不执行
简单来说,事务就是将一堆的SQL语句(通常是增删改查操作)绑定在一起执行,要么都执行成功,要么都执行失败,即都成功才成功,否则就会恢复到这堆SQL执行之前的状态
特性
事务必须满足四个条件(ACID):原子性(Atomicity,不可分割性)、一致性(Consistency)、隔离性(Isolation,独立性)、持久性(Durability)
- 原子性:一个事务中的所有操作,要么全部不完成,不会结束在中间某个环节。事务在执行过程中如果发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样
- 一致性:在事务开始之前和事务完成之后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精准度、串联性以及后续数据库可以自发地完成预定的工作
- 隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致
- 持久性:事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失
隔离级别
- 读未提交(Read uncommitted):安全性最差,可能发生并发数据问题,性能最好
- 读提交(Read committed):Oracle默认的隔离级别
- 可重复读(repeatable read):MySQL默认的隔离级别,安全性较好,性能一般
- 串行化(Serializable):表级锁,读写都加锁,效率低下,安全性高,不能并发