约束
NOT NULL 非空约束
UNIQUE 唯一约束
PRIMARY KEY 主键约束
DEFAULT 默认约束
CHECK 检查约束
FOREIGN KEY 外键约束
实例如下:
create table people(
id int primary key auto_increment comment '主键',
name VARCHAR(10) NOT NULL UNIQUE COMMENT '名字',
age int check ( age>0 and age<=120 ) comment '年龄',
status char(1) default '1' comment '状态',
gender char(1) comment '性别'
)comment '人员信息';
insert into people(name, age, status, gender) values ('翠花',12,'1','男'),('翠绿',72,'1','女');
外键约束:外键用来让两张表的数据之间建立连接,从而保证数据的一致性和完整性。
添加外键:
ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY(外键字段名) REFERENCES 主表(主表列名);
删除外键:
ALTER TABLE 表名 DROP FOREIGN KEY 外键名称;
删除/更新行为
ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY(外键字段名) REFERENCES 主表(主表列名) ON UPDATE 行为 ON DELETE 行为;
多表查询
多表关系:一对一、一对多、多对多;
在多表查询时,我们要消除无效的笛卡尔积;
多表查询分类:
1、连接查询
内连接:查询A、B交集部分数据
外连接:左外连接:查询左表所有数据,以及两张表交集部分数据
右外连接:查询右表所有数据,以及两张表交集部分数据
自连接:当前表与自身的连接查询,自连接必须使用表别名
语法如下:
内连接查询语法:
隐式内连接:
select 字段列表 from 表1,表2 where 条件···;
显示内连接;
select 字段列表 from 表1 [inner] join 表2 on 连接条件··;
外连接查询语法:
左外连接:
SELECT 字段列表 FROM 表1 LEFT[outer] join 表2 on 条件···;
右外连接:
SELECT 字段列表 FROM 表1 RIGHT[outer] join 表2 on 条件···;
自连接查询语法:
select 字段列表 from 表A 别名A join 表A 别名B on 条件···;
自连接查询,可以是内连接查询,也可以是外连接查询;
联合查询-union,union all,对于union查询,就是把多次查询的结果合并起来,形成一个新的查询结果集。union 会将合并的结果去除重复的部分,union all只是将合并的结果加在一起。对于联合查询的多张表的列数必须保持一致,字段类型也需要保持一致。
2、子查询
子查询:SQL语句中嵌套SELECT语句,称为嵌套查询,又称子查询;子查询外部的语句可以是增删改查的任何一个。
标量子查询:子查询返回的结果是单个值(数字、字符串、日期等),最简单的形式,这种子查询称为标量子查询。
列子查询:列子查询返回的结果是一列(可以是多列)。所涉及的操作符:IN、NOT IN 、ANY 、SOME (ANY与SOME都是子查询返回列表中,有任意一个满足即可)、ALL
行子查询:行子查询返回的结果是一行(可以是多列)。所涉及的操作符:=、<>、in、not in
表子查询:表子查询返回的结果是多行多列。所涉及的操作符:in
事务
事务是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。
MySQL默认自动提交事务
方式一:查看/设置事务提交方式
select @@autocommit; set @@autocommit = 0;
提交事务
commit;
回滚事务
rollback;
方式二:
开启事务
START TRANSACTION 或BEGIN;
提交事务
commit;
回滚事务
rollback;
事务的四大特性(ACID):
原子性;一致性;隔离性(数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下进行);持久性;
并发事务问题:
1.脏读:一个事务读到另外一个事务还没有提交的数据;
2.不可重复读:一个事务先后读取同一条记录,但两次读取的数据不同,称之为不可重复读;
3.幻影:一个事务在按照条件查询数据时,没有对应的数据行,但是在插入数据时,又发现这行数据已经存在,好像出现了”幻影“。
事务隔离级别
隔离级别 | 脏读 | 不可重复读 | 幻读 |
Read uncommitted | √ | √ | √ |
Read committed | × | √ | √ |
Repeatable Read (默认) | × | × | √ |
Serializable | × | × | × |
查看事务隔离级别
SELECT @@TRANSACTION_ISOLATION;
设置事务隔离级别
set[session|global] transaction isolation level{READ UNCOMMITTED|READ COMMITTED|REPEATABLE READ | SERIALIZABLE}
事务的隔离级别越高,数据越安全,但是性能越低。