MySql
Mysql介绍
-
数据库优势
- 持久化数据到本地
- 可以四线结构化查询,方便管理
-
数据库相关概念
- DB(DataBase):数据库,保存一组有组织的数据的容器
- DBMS(DataBase Manage System):数据库管理系统,又称为数据库软件(产品),用于管理DB中的数据
- SQL:结构化查询语言,用于和DBMS通信的语言
-
DBMS分为两类
- 基于共享文件系统的DBMS(Access)
- 基于客户机–服务器的DBMS(MYSQL、ORACLE、SQLSERVER)
-
mysql版本
- 5.5
- 5.6
- 5.7
- 8.0 测试版
-
windows下mysql启动和停止
- 启动
- net start mysql
- net stop mysql
- 启动
-
MYSQL语法规范
- 不区分大小写
- 每句话用;或\g结尾
- 各子句一般分行写
- 关键字不能缩写也不能分行
- 用缩进提高语句的可读性
-
MYSQL常见命令
-
查看当前所有数据库
- show database;
-
打开指定库
- use 库名
-
查看其它库的所有表
- show tables from 库名;
-
查看sqlmysql支持的存储引擎
- show engines;
-
创建表
-
create table 表名(
列名 列类型,
列名 列类型,
)
-
-
DDL(数据定义语言 Data Design Language)
- 库和表的管理
- 库的管理
- 创建、修改、删除
- 创建库 create database [if not exsits] 库名;
- 库的修改
- rename database books to 新库名;
- 修改库的字符集 alter database books character set gbk;
- 库的删除
- drop database if exist books;
- 表的管理
- 创建、修改、删除
- 表的创建
- create table()
- 表的修改
- alter table 表名 add|drop|modify|change column
- 修改列的类型或约束
- ALTER TABLE book MODIFY COLUMN pudate TIMESTAMP;
- 添加新列
- ALTER TABLE author ADD COLUMN annual DOUBLE;
- 删除列
- ALTER TABLE author DROP COLUMN annual;
- 修改表名
- ALTER TABLE author RENAME TO book_author;
- 表的删除
- DROP TABLE book_author;
- 库的管理
MYSQL常见的数据类型
-
数值型
-
整型
-
整型类型 字节 范围 Tinyint 1 有符号:-128~127 无符号:0~255 Smallint 2 有符号:-32768~32767 无符号:0~65535 Mediumint 3 有符号:-8388608~8388607 无符号:0~1677215 Int、integer 4 有符号:-2147483648~2147483647 无符号:0~4294967295 Bigint 8 有符号:-9223372036854775808~9223372036854775807 无符号:0~9223372036854775807*2+1
-
-
小数
-
定点数
- DECIMAL(M,D)
-
浮点数
- float double
浮点数类型 字节 范围 float 4 有符号的取值范围:-3.402823466E+38~-1.175494351E-38。 无符号的取值范围:0 和 -1.175494351E-38~-3.402823466E+38。 double 8 有符号的取值范围:-1.7976931348623157E+308~-2.2250738585072014E-308。 无符号的取值范围:0 和 -2.2250738585072014E-308~-1.7976931348623157E+308。 定点数类型 字节 范围 DEC(M,D) DECIMAL(M,D) M+2 最大取值范围与double相同,给定decimal的有效取值返回由M和D决定 -
-
-
字符型
-
较短的文本:char、varchar
-
字符串类型 最多字符数 描述及存储需求 char(M) M M为0~255之间的整数 varchar(M) M M为0~65535之间的整数
-
-
较长的文本:text、blob(较长的二进制数据)
- TEXT包含:TEXT,MEDIUMTEXT,LONGTEXT
- BLOB包含:BLOB,MEDIUMBLOB,LONGBLOB
-
-
日期型
-
日期和时间类型 字节 最小值 最大值 date 4 1000-01-01 9999-12-31 23:59:59 datetime 8 1000-01-01 00:00:00 9999-12-31 23:59:59 timestamp 4 19700101080001 2038年的某个时刻 time 3 -838:59:59 838:59:59 year 1 1901 2155 -
说明
- TimeStamp支持的时间范围较小,取值范围:19700101080001–2038年的某个时间
- DateTime的取值返回:1000-01-01 — 9999-12-31
- timestamp和实际时区有关,更能反映实际的日期,而datetime则只能反映出插入时的当地时区
- timestamp的属性受mysql版本和sqlmode的影响很大
-
TCL(Transaction Control Language)事务控制语言
- 事务
- 一个或一组sql语句组成一个执行单元,这个执行单元要么全部执行,要么全部不执行。在这个单元中,每个MYSQL语句是相互依赖的。而整个单独单元作为一个不可分割的整体,如果单元中某条SQL语句一旦执行失败或产生错误,整个单元将会回滚。所有收到影响的数据将返回到事务开始之前的状态;如果单元中的所有SQL语句均执行成功,则事务被顺利执行
- 事务的ACID属性
- 原子性(Atomicity)
- 原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
- 一致性(Consistency)
- 事务必须使数据库从一个一致性状态变换到另一个一致性状态
- 隔离性(Isolation)
- 事务的隔离性是指一个事务的执行不能被其他事务干扰,即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发的执行的各个事务之间不能相互干扰
- 持久性(Durability)
- 持久性是指一个事务一旦被提交,它对数据库中的数据的改变就是永久性的,接下来的其他操作和数据库故障不应该对其有任何的影响
- 原子性(Atomicity)
- 事务的创建
- 隐式事务:事务没有明显的开启和结束的标记,比如insert,update,delete语句
- 通过show variable like 'autocommit’查看mysql 数据库发现,数据库的事务自动提交设置是默认开启的
- 显示事务:事务具有明显的开启和结束的标记,前提是:必须先设置自动提交功能为禁用
- 步骤
- – 设置自动提交关闭
set autocommit=0;
– 步骤2:开启事务
start TRANSACTION;
– 步骤3:编写事务语句(select insert update delete)事务是针对对表数据的操作
– 语句1
– 语句2
– 步骤4:结束事务
commit;-- 方式1:提交事务
rollback; – 方式2:回滚事务
- – 设置自动提交关闭
- 步骤
- 隐式事务:事务没有明显的开启和结束的标记,比如insert,update,delete语句
数据库的隔离级别
-
查看事务隔离级别
- select @@tx_isolation; mysql5.0
- select @@transaction_isolation; mysql8.0
-
设置事务隔离级别
- set session transaction isolation level read uncommitted;
-
问题描述
- 对于同时运行的多个事务,当这些事务访问数据库中相同的数据时,如果没有采取必要的隔离机制,就会导致各种并发问题
- 脏读:对于两个事务T1,T2,T1读取了已经被T2更新但是还没有被提交的字段。但是之后,若T2回滚,T1读取的内容就是临时且无效的。
- 不可重复读:对于两个事物T1,T2,T1读取了一个字段,然后T2更新了该字段,之后,T1再次读取同一字段,值就不同了。(通过加行锁,解决不可重复读)
- 幻读:对于两个事务T1,T2,T1从一个表中读取了一个字段,然后T2在该表中插入了一些新的行。之哦户,如果T1再次读取同一个表,就会多出几行(Mysql通过MVCC解决了幻读的问题)
- 对于同时运行的多个事务,当这些事务访问数据库中相同的数据时,如果没有采取必要的隔离机制,就会导致各种并发问题
-
解决方案
- 数据库事务的隔离性:数据库系统必须具有隔离并发运行各个事务的能力,使它们不会相互影响,避免各种并发问题
- 一个事务与其他事务隔离的程度称为隔离级别。数据库规定了多种事务隔离级别,不同隔离级别对应不同的干扰程度,隔离级别越高,数据一致性就越好,但并发性越弱。
-
数据库提供的4种事务隔离级别
-
隔离级别 描述 READ UNCOMMITED(读未提交) 允许事务读取未被其他事务提交的变更,脏读,不可重复和幻读的问题都会出现 READ COMMITED(读已提交数据) 只允许事务读取已经被其他事务提交的变更,可以避免脏读,但不可重复和幻读的问题仍然可能出现 REPEATABLE READ(可重复读) 确保事务可以多次从一个字段中读取相同的值,在这个事务持续期间,禁止其他事务对这个字段进行更新,可以避免脏读和不可重复读,但幻读的问题仍然存在(mysql的默认事务隔离级别,mysql利用mvcc解决了可重复读幻读的问题,利用版本号控制) SERIALIZABLE(串行化) 确保事务可以从一个表中读取相同的行,在这个事务持续期间,禁止其他事务对该表执行插入,更新和删除操作。所有并发的问题都可以避免,但是效率十分低下 -
oracle支持的2种事务隔离级别:read commited,serializable。Oracle默认的事务隔离界别为:read commited;
-
mysql支持4中事务隔离级别。mysql默认的事务隔离级别为repeatable read
-
脏读 不可重复读 幻读 read uncommitted × × × read committed √ × × repeatable read √ √ × serializable √ √ √ -
Mysql中的默认事务隔离级别为repeatable read
-
oracle中的默认事务隔离级别为read committed;
-
safepoint 保存点,
- safepoint a;
- rollback to a;
-
Mysql分页查询
-
语法
-
select 查询列表
from 表1 别名
join 表2 别名
where 筛选条件
group by 分组
having 分组后筛选
order by 排序列表
limit 起始条目索引,显示的条目数
-
-
执行顺序
- from 子语句
- join 子句
- on 子句
- where 子句
- group by 子句
- having 子句
- order by 子句
- limit 子句
-
特点
- 起始条目索引如果不写,默认是0
- limit 后面支持的两个参数
- 参数1:显示的起始条目索引
- 参数2:条目数
-
说明
- 区别于Oracle三层嵌套的方式