数据操纵语言
-
DML(Data Manipulation Language –数据操纵语言) 可以在下列条件下执行:
– 向表中插入数据
– 修改现存数据
– 删除现存数据 -
事务是由完成若干项工作的DML语句组成的
INSERT INTO sales_reps(id, name, salary, commission_pct)
SELECT employee_id, last_name, salary, commission_pct
FROM employees WHERE job_id LIKE '%REP%';
- truncate删除后,如果再插入,标识列从1开始,delete删除后,如果再插入,标识列从断点开始
- delete可以添加筛选条件,truncate不可以添加筛选条件
- truncate效率较高
- truncate没有返回值,delete可以返回受影响的行数
- truncate不可以回滚,delete可以回滚
数据定义语言
- 创建库
create database 【if not exists】 库名【 character set 字符集名】;
- 修改库
alter database 库名 character set 字符集名;
- 删除库
drop database 【if exists】 库名;
- 创建表
create table 【if not exists】 表名(
字段名 字段类型 【约束】,
字段名 字段类型 【约束】,
。。。
字段名 字段类型 【约束】
)
- 修改表
添加列
alter table 表名 add column 列名 类型 【first|after 字段名】;
修改列的类型或约束
alter table 表名 modify column 列名 新类型 【新约束】;
修改列名
alter table 表名 change column 旧列名 新列名 类型;
删除列
alter table 表名 drop column 列名;
修改表名
alter table 表名 rename 【to】 新表名;
- 删除表
drop table【if exists】 表名;
- 复制表
复制表的结构
create table 表名 like 旧表;
- 复制表的结构+数据
create table 表名
select 查询列表 from 旧表【where 筛选】;
数据类型
整数类型 | 字节 |
---|---|
tinyint | 1 |
smallint | 2 |
mediumint | 3 |
int/integer | 4 |
bigint | 8 |
- 特点:
①,都可以设置无符号和有符号,默认有符号,通过unsigned设置无符号
②,如果超出了范围,会报out or range异常,插入临界值
③,长度可以不指定,默认会有一个长度
长度代表显示的最大宽度,如果不够则左边用0填充,但需要搭配zerofill,并且默认变为无符号整型
-
定点数:decimal(M,D)
-
浮点数:
float(M,D) 4
double(M,D) 8 -
特点:
①,M代表整数部位+小数部位的个数,D代表小数部位
②,如果超出范围,则报out or range异常,并且插入临界值
③,M和D都可以省略,但对于定点数,M默认为10,D默认为0
④,如果精度要求较高,则优先考虑使用定点数
-
char、varchar、binary(较短的二进制)、varbinary(较短的二进制)、enum(用于保存枚举)、set(保存集合)、text(较长的文本)、blob(较大的二进制)
-
char:固定长度的字符,写法为char(M),最大长度不能超过M,其中M可以省略,默认为1
-
varchar:可变长度的字符,写法为varchar(M),最大长度不能超过M,其中M不可以省略
- year年 ( 1个字节 )
- date日期( 4个字节 )
- time时间( 3个字节 )
- datetime 日期+时间 ( 8个字节 )
- timestamp 日期+时间 (4个字节) 比较容易受时区、语法模式、版本的影响,更能反映当前时区的真实时间
约束
- 为了保证数据的一致性和完整性,SQL规范以约束的方式对表数据进行额外的条件限制。
- 约束是表级的强制规定
- 可以在创建表时规定约束(通过 CREATE TABLE 语句),或者在表创建之后也可以(通过 ALTER TABLE 语句)
- 有以下六种约束:
①, NOT NULL 非空约束,规定某个字段不能为空
②, UNIQUE 唯一约束,规定某个字段在整个表中是唯一的
③,PRIMARY KEY 主键( 非空且唯一)
④, FOREIGN KEY 外键
⑤, CHECK 检查约束
⑥, DEFAULT 默认值
-
注意: MySQL不支持check约束,但可以使用check约束,而没有任何效果
-
根据约束数据列的限制,约束可分为:
单列约束:每个约束只约束一列
多列约束:每个约束可约束多列数据 -
根据约束的作用范围,约束可分为:
列级约束只能作用在一个列上,跟在列的定义后面
表级约束可以作用在多个列上,不与列一起,而是单独定义
- 非空约束用于确保当前列的值不为空值,非空约束只能出现在表对象的列上。
- Null类型特征:
所有的类型的值都可以是null,包括int、float等数据类型
空字符串””不等于null,0也不等于null - 创建 not null 约束
CREATE TABLE emp(
id INT(10) NOT NULL,
NAME VARCHAR(20) NOT NULL DEFAULT 'abc',
sex CHAR NULL
);
- 增加 not null 约束
ALTER TABLE emp MODIFY sex VARCHAR(30) NOT NULL;
- 取消 not null 约束,增加默认值
ALTER TABLE emp MODIFY NAME VARCHAR(15) DEFAULT 'abc' NULL;
- 唯一约束,允许出现多个空值:NULL
- 同一个表可以有多个唯一约束,多个列组合的约束。在创建唯一约束的时候,如果不给唯一约束名称,就默认和列名相同
- MySQL会给唯一约束的列上默认创建一个唯一索引
CREATE TABLE USER(
id INT NOT NULL,
NAME VARCHAR(25),
PASSWORD VARCHAR(16),
#使用表级约束语法,表示用户名和密码组合不能重复
CONSTRAINT uk_name_pwd UNIQUE(NAME,PASSWORD)
);
- 添加唯一约束
ALTER TABLE USER ADD UNIQUE(NAME,PASSWORD);
ALTER TABLE USER ADD CONSTRAINT uk_name_pwd UNIQUE(NAME,PASSWORD);
ALTER TABLE USER MODIFY NAME VARCHAR(20) UNIQUE;
- 删除约束
ALTER TABLE USER DROP INDEX uk_name_pwd;
- 主键约束相当于唯一约束+非空约束的组合,主键约束列不允许重复,也不允许出现空值
- 列级模式
CREATE TABLE emp(
id INT AUTO_INCREMENT PRIMARY KEY,
NAME VARCHAR(20)
);
- 表级模式
CREATE TABLE emp(
id INT NOT NULL AUTO_INCREMENT,
NAME VARCHAR(20),
CONSTRAINT emp_id_pk PRIMARY KEY(id)
);
- 组合模式
CREATE TABLE emp(
id INT NOT NULL,
NAME VARCHAR(20),
pwd VARCHAR(15),
CONSTRAINT emp_pk PRIMARY KEY(NAME,pwd)
);
- 删除主键约束
ALTER TABLE emp DROP PRIMARY KEY;
- 添加主键约束
ALTER TABLE emp ADD PRIMARY KEY(NAME,pwd);
- 修改主键约束
ALTER TABLE emp MODIFY id INT PRIMARY KEY;
- 外键约束是保证一个或两个表之间的参照完整性,外键是构建于一个表的两个字段或是两个表的两个字段之间的参照关系。
- 从表的外键值必须在主表中能找到或者为空。当主表的记录被从表参照时,主表的记录将不允许删除,如果要删除数据,需要先删除从表中依赖该记录的数据,然后才可以删除主表的数据。
- 还有一种就是级联删除子表数据。
注意:外键约束的参照列,在主表中引用的只能是主键或唯一键约束的列 - 同一个表可以有多个外键约束
- 创建外键约束
主表:
CREATE TABLE dept(
dept_id INT AUTO_INCREMENT PRIMARY KEY,
dept_name VARCHAR(20)
);
从表:
CREATE TABLE emp(
emp_id INT AUTO_INCREMENT PRIMARY KEY,
last_name VARCHAR(15),
dept_id INT,
CONSTRAINT emp_dept_id_fk FOREIGN KEY(dept_id) REFERENCES dept(dept_id)
);
- 删除外键约束
ALTER TABLE emp DROP FOREIGN KEY emp_dept_id_fk;
- 增加外键约束
alter table emp add constraint emp_dept_id_fk foreign key(dept_id) references dept(dept_id);
- FOREIGN KEY: 在表级指定子表中的列
- REFERENCES: 标示在父表中的列
- ON DELETE CASCADE( 级联删除): 当父表中的列被删除时,子表中相对应的列也被删除
- ON DELETE SET NULL( 级联置空): 子表中相应的列置空
CREATE TABLE student(
id INT AUTO_INCREMENT PRIMARY KEY,
NAME VARCHAR(20),
classes_name VARCHAR(20),
classes_number INT,
/*表级别联合外键*/
FOREIGN KEY(classes_name, classes_number)
REFERENCES classes(NAME, number) ON DELETE CASCADE);
事务
- 事务由单独单元的一个或多个SQL语句组成,在这个单元中,每个MySQL语句是相互依赖的。而整个单独单元作为一个不可分割的整体,如果单元中某条SQL语句一旦执行失败或产生错误,整个单元将会回滚。所有受到影响的数据将返回到事物开始以前的状态;如果单元中的所有SQL语句均执行成功,则事物被顺利执行。
- 通过show engines;来查看mysql支持的存储引擎
①,原子性(Atomicity):原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生
②,一致性(Consistency):事务必须使数据库从一个一致性状态变换到另外一个致性状态。
③,隔离性(Isolation):事务的隔离性是指一个事务的执行不能被其他事务干扰,即一个事务内部的操作及使用的数据对并发的其他的事务是隔离的,并发执行的各个事务之间不能互相干扰
④,持久性(Durability):持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来的其他操作和数据库故障不应该对其有任何影响
-- 开启事务
set autocommit = 0;
start transaction;
-- 编写一组事务的语句
update account set balance = 10000 where username = 'Tommey周';
update account set balance = 10000 where username = 'Tommey';
-- 结束事务
rollback;
-- commit;
- 脏读:对于两个事务 T1, T2, T1 读取了已经被 T2 更新但还 没有被提交的字段,之后, 若 T2 回滚, T1读取的内容就是临时且无效的.
- 不可重复读: 对于两个事务T1, T2, T1 读取了一个字段, 然后 T2 更新了该字段,之后, T1再次读取同一个字段, 值就不同了.
- 幻读:对于两个事务T1, T2, T1 从一个表中读取了一个字段, 然后 T2 在该表中 插入了一些新的行. 之后, 如果 T1 再次读取同一个表, 就会多出几行.
数据库事务的隔离性:数据库系统必须具有隔离并发运行各个事务的能力,使它们不会相互影响,避免各种并发问题
隔离级别 | 描述 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|---|
READ UNCOMMITTED(读未提交数据) | 允许事务读取未被其他事务提交的变更 | √ | √ | √ |
READ COMMITTED(读已提交数据) | 指允许事务读取已经被其它事务提交的变更 | × | √ | √ |
REPEATABLE READ(可重复读) | 确保事务可以多次从一个字段中读取相同的值,在这个事务持续期间,禁止其他事务对这个字段进行更新 | × | × | √ |
SERIALIZABLE(串行化) | 确保事务可以从一个表中读取相同的行,在这个事务持续期间,禁止其他事务对该表执行插入,更新和删除操作,所有并发问题都可以避免,但性能十分低下 | × | × | × |
- Oracle 支持的 2 种事务隔离级别:READ COMMITED,SERIALIZABLE。 Oracle 默认的事务隔离级别为: READ
COMMITED - Mysql 支持 4 种事务隔离级别. Mysql 默认的事务隔离级别为: REPEATABLE READ
- 每启动一个 mysql 程序, 就会获得一个单独的数据库连接. 每个数据库连接都有一个全局变量 @@tx_isolation, 表示当前的事务隔离级别.
- 查看当前的隔离级别: SELECT @@tx_isolation;
- 设置当前 mySQL 连接的隔离级别:
set transaction isolation level read committed;
- 设置数据库系统的全局的隔离级别:
set global transaction isolation level read committed;
set autocommit = 0;
start transaction;
delete from account where id = 1;
savepoint a;-- 设置保存点
delete from account where id = 2;
rollback to a;