数据类型

数值类型
  • TINYINT 1bytes 小整数值
  • SMALLINT 2bytes 大整数值
  • MEDIUMINT 3bytes 大整数值
  • INT或INTEGER 4bytes 大整数值
  • BIGINT 8bytes 极大整数值
  • FLOAT 4bytes 单精度浮点数值
  • DOUBLE 8bytes 双精度浮点数值
字符串类型
  • CHAR 0-255 bytes 定长字符串
  • VARCHAR 0-65535 bytes 变长字符串
  • TINYBLOB 0-255 bytes 不超过255个字符的二进制数据
  • TINYTEXT 0-255 bytes 短文本字符串
  • BLOB 0-65 535 bytes 二进制形式的长文本数据
  • TEXT 0-65 535 bytes 长文本数据
  • MEDIUMBLOB 0-16 777 215 bytes 二进制形式的中等长度文本数据
  • MEDIUMTEXT 0-16 777 215 bytes 中等长度文本数据
  • LONGBLOB 0-4 294 967 295 bytes 二进制形式的极大文本数据
  • LONGTEXT 0-4 294 967 295 bytes 极大文本数据
日期时间类型
类型 大小 范围 格式 描述
DATE 3 1000-01-01至9999-12-31 YYYY:MM:DD 日期值
TIME 3 -838:59:59至838:59:59 HH:MM:SS 时间值或持续时间
YEAR 1 1901至2155 YYYY 年份值
DATETIME 8 1000-01-01 00:00:00至9999-12-31 23:59:59 YYYY-MM-DD HH:MM:SS 混合日期和时间值
TIMESTAMP 4 1970-01-01 00:00:01至2038-01-19 03:14:07 YYYY-MM-DD HH:MM:SS 混合日期和时间值,时间戳

DDL 定义操作

数据库操作
查询

SHOW DATABASES;

SHOW DATABASE();

创建

CREATE DATABASE [IF NOT EXISTS] 数据库名 [DEFAULT CHARSET 字符集] [COLLATE 排序规则];

删除

DROP DATABASE [IF EXISTS] 数据库名;

使用

USE 数据库名;

表操作
查询当前数据库所有表

SHOW TABLES;

查询表结构

DESC 表名;

查询指定表的建表语句

SHOW CREATE TABLE 表名;

创建

CREATE TABLE 表名(

字段1 字段1类型 [COMMENT 字段1注释],

字段n 字段n类型 [COMMENT 字段n注释]

) [COMMENT 表注释];

修改

添加字段

ALTER TABLE 表名 ADD 字段名 类型(长度) [COMMENT 注释] [约束];

修改数据类型

ALTER TABLE 表名 MODIFY 字段名 新数据类型(长度);

修改字段名和字段类型

ALTER TABLE 表名 CHANGE 旧字段名 类型(长度) [COMMENT 注释] [约束];

删除字段

ALTER TABLE 表名 DROP 字段名;

修改表名

ALTER TABLE 表名 RENAME TO 新表名;

删除表

DROP TABLE [IF EXISTS] 表名;

删除指定表,并重新创建该表

TRUNCATE TABLE 表名;

DML 数据操作

给指定字段添加数据

INSERT INTO 表名(字段名1,字段名2,…)VALUES (值1,值2,…);

给全部字段添加数据

INSERT INTO 表名 VALUES(值1,值2);

批量添加数据

INSERT INTO 表名(字段名1,字段名2)VALUES (值1,值2),(值1,值2);

INSERT INTO 表名 VALUES (值1,值2),(值1,值2);

DELETE FROM 表名 [WHERE 条件];

UPDATE 表名 SET 字段名1=值1,字段名2=值2,…[WHERE 条件];

DQL 数据查询

SELECT 字段列表

FROM 表名列表

WHERE 条件列表

GROUP BY 分组字段列表

HAVING 分组后条件列表

ORDER BY 排序字段列表

LIMIT 分页参数

基本查询
查询多个字段别名

SELECT 字段 [AS 别名] FROM 表名

SELECT * FROM 表名

去除重复记录

SELECT DISTINCT 字段列表 FROM 表名;

条件查询

SELECT 字段列表 FROM 表名 WHERE 条件列表;

条件:

  • BETWEEN … AND … 在某个范围之内[]
  • IN(…) 在in之后的列表中的值,多选一
  • LIKE 占位符 模糊匹配(__匹配单个字符,%匹配任意个字符)
  • IS NULL 是NULL
聚合函数

将一列数据作为整体进行纵向计算

  • count max min avg sum

SELECT 聚合函数(字段列表) FROM 表名;

分组查询

SELECT 字段列表 FROM 表名 [WHERE 条件] GROUP BY 分组字段名 [HAVING 分组后过滤条件];

where和having不同

  • 执行时机不同:where是分组之前进行过滤,不满足where条件,不参与分组;而having是分组之后对结果进行过滤。
  • 判断条件不同:where不能对聚合函数进行判断,having可以
排序查询

SELECT 字段列表 FROM 表名 ORDER BY 字段1 排序方式1,字段2 排序方式2;

排序方式

  • ASC:升序(默认)
  • DESC:降序
分页查询

SELECT 字段列表 FROM 表名 LIMIT 起始索引,查询记录数;

DCL权限控制

管理用户
查询用户

USE mysql;

SELECT * FROM user;

创建用户

CREATE USER ‘用户名‘@’主机名’ IDENTIFIED BY ‘密码’;

修改用户密码

ALTER USER ‘用户名‘@’主机名’ IDENTIFIED WITH mysql_native_password BY ‘新密码’;

删除用户

DROP USER ‘用户名‘@’主机名’;

权限控制

查询权限:

SHOW GRANTS FOR ‘用户名‘@’主机名’;

授予权限:

GRANT 权限列表 ON 数据库名.表名 TO ’用户名‘@’主机名‘;

撤销权限:

REVOKE 权限列表 ON 数据库名.表名 FROM ’用户名‘@’主机名‘;

函数

函数指一段可以直接被另一段程序调用的程序或代码

字符串函数
函数 功能
CONCAT(S1,S2,…Sn) 字符串拼接
LOWER(str) 转小写
UPPER(str) 转大写
LPAD(str,n,pad) 左填充
RPAD(str,n,pad) 右填充
TRIM(str) 去空格
SUBSTRING(str,start,len) 裁剪返回
数值函数
  • ceil(x):向上取整
  • floor(x):向下取整
  • mod(x,y):返回x/y的模
  • rand():返回0-1随机数
  • round(x,y):求参数x的四舍五入值,保留y位小数
日期函数
  • curdate():返回当前日期
  • curtime():返回当前时间
  • now():返回当前日期和时间
  • year(date):获取指定date的年份
  • month(date):获取指定date的月份
  • day(date):获取指定date的日期
  • date_add(date,INTERVAL expr type):返回一个日期/时间值加上一个时间间隔expr后的时间值
  • datediff(date1,date2):返回起始时间date1和结束时间date2之间的天数
流程函数
  • if(value,t,f):true返回t,否则f
  • ifnull(value1,value2):value1不为空返回value1,否则value2
  • CASE WHEN [val1] THEN [res1] … ELSE [default] END:如果val1为true,返回res1,… 否则返回default默认值
  • CASE [expr] WHEN [val1] THEN [res1] … ELSE [default] END:如果expr的值等于val1,返回res1,… 否则返回default默认值

约束

普通约束
  • 概念:约束是作用于表中字段上的规则,用于限制存储在表中的数据

  • 目的:保证数据库中数据的正确、有效性和完整性

  • 约束 描述 关键字
    非空约束 限制该字段的数据不能为null NOT NULL
    唯一约束 保证该字段的所有数据都是唯一、不重复 UNIQUE
    主键约束 主键是一行数据的唯一标识,要求非空且唯一 PRIMARY KEY
    默认约束 保存数据时,如果未指定该字段的值,则采用默认值 DEFAULT
    检查约束 保证字段值满足某一个条件 CHECHK
    外键约束 用来让两张表的数据之间建立连接,保证数据的一致性和完整性 FOREIGN KEY
  • auto_increment:自动增长

外键约束

外键用来让两张表的数据之间建立连接,从而保证数据的一致性和完整性

添加外键

create table 表名(
 字段名 数据类型,

 [constrain] [外键名称] foreign key(外键字段名) references 主表(主表列名)
);

alter table 表名 add constrain 外键名称 foreign key(外键字段名) references 主表(主表列表);

删除外键

alter table 表名 drop foreign key 外键名称;

删除更新

  • no action / restrict:拥有外键不予更新
  • cascade:级联
  • set null:拥有外键,外键值取null
  • set default:父表变更,外键列设置为默认值(Innodb不支持)
alter table 表名 add constrain 外键名称 foreign key (外键字段) references 主表名(主表字段名) on update cascade on delete cascade;

多表查询

  • 连接查询
    • 内连接:相当于查询A,B交集部分数据
    • 外连接:
      • 左外连接:查询左表以及交集数据
      • 右外连接:查询右表以及交集数据
    • 自连接:当前表与自身的连接查询,自连接必须使用表别名
  • 子查询
连接查询
内连接

隐式:

select 字段列表 from1,2 where 条件...;

显式:

select 字段列表 from1 [inner] join2 on 连接条件...;
外连接

左/右外连接

select 字段列表 from1 left [outer] join2 on 条件;

查询包含左右表以及交集数据

自连接
select 字段列表 from1 别名1 join1 别名2 on 条件...; 

自连接查询,可以是内连接也可以是外连接

联合查询

对于union查询,就是把多次查询结果结合起来,形成一个新的查询结果集

select 字段列表 from1
union [all]
select 字段列表 from2;
  • 对于联合查询的多张表的列数必须保持一致,字段类型也需保持一致
  • union all 会将全部的数据直接合并一起,union会对合并的数据去重
子查询
  • 概念:SQL语句中嵌套SELECT语句,又称为嵌套查询、
select * from t1 where column1= (select column1 from t2);

子查询外部的语句可以是增删改查任何一个

  • 根据子查询结果不同,分为:
  • 标量子查询(查询结果为单个值)
  • 列子查询(查询结果为一列)
  • 行子查询(查询结果为一行)
  • 表字查询(查询结果为多行多列)

事务

事务是一组操作集合,不可分割的工作单位,事务会把所有操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败

事务操作
  • 查看/设置事务提交方式

  • ```sql
    select @@autocommit;
    set @@autocommit=0;

    
    - 提交事务
    
    - ```sql
    	commit;
  • 回滚事务

  • ```sql
    rollback;

    
    - 开启事务
    
    - ```sql
    	start transaction 或 begin;
事务四大特性
  • 原子性(Atomicity):事务是不可分割的最小操作单元,要么全部成功,要么全部失败
  • 一致性(Consistency):事务完成时,必须所有的数据都保持一致状态
  • 隔离性(Isolation):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行
  • 持久性(Durability):事务一旦提交或回滚,它对数据库中的数据的改变就是永久的
并发事务问题
  • 脏读:一个事务读到另一个事务还没有提交的数据
  • 不可重复读:一个事务先后读取同一条记录,但两次读取的数据不同,称之为不可重复读
  • 幻读:一个事务按照条件查询数据时,没有对应的数据行,但是在插入数据时,又发现该行数据已存在,好像出现幻影
事务隔离级别
隔离级别 脏读 不可重复读 幻读
Read uncommitted
Read committed ×
Repeatable Read(默认) × ×
Serializable × × ×

查看事务隔离级别

select @@transaction_isolation;

设置事务隔离级别

set [session|global] transaction isolation level ...;