运算符
- 算数运算符
- +,-,*,/,%
- 逻辑运算符
- And,or,not
- 条件运算符
- <,>,=,!=,<>,<=,>=
- 模糊查询
- like
- in、not in
- between…and
- is null、is not null
- 位运算符
常用SQL
- DQL(数据查询语言)
- select[distinct]—>from—>where—>group by—>having—>order by[desc|asc]—>limit
- 优先级:from—>where—>group by—>having—>select—>distinct—>order by[desc|asc]—>limit
- 基础查询:select…from…where…
- 排序查询:select…from…where…order by[desc|asc]…
- 分页查询:select…from…where…order by[desc|asc]…limit…
- 分组查询:select…from…where…group by…having…order by[desc|asc]…limit
- 连接查询:select…from…join[left join|right join|full join]…on…
- 内连接
- 左连接
- 右连接
- 全外连接
- 自连接
- 等值连接
- 不等值连接
- 联合查询:select…from …union[union all] select…from….
- 子查询:
- Select后面的子查询
- From后面的子查询
- Where后面的子查询
- Exists后面的子查询
- select[distinct]—>from—>where—>group by—>having—>order by[desc|asc]—>limit
- DML(数据操纵语言)
- insert
- delete
- update
- 修改多表的记录
- DDL(数据定义语言)
- 关键字:create;alter;drop;truncate
- 库、表的管理
- 库
- create database if not exists 名字;
- Drop database if exists 名字;
- Alter database 名字 选项
- show databases;
- Use 库名;
- select database();
- 其他select now(),version(),user();
- 表
- 操作表信息
- Create table if not exists 表名;
- Drop table if exists 表名;
- delete from 表名/truncate 表名;
- Alter table 表名 表选项;
- rename table 原名 to 现名
- Create table 表名 select * from 表名 复制表结构和数据
- Create table 表名 like 表名 复制表结构
- show tables 【from 库名】;
- Show create table 表名;
- Desc 表名;
- 修改字段、索引、字段约束等
- Alter table 表名 具体操作
- 操作
- add column 字段名 字段选项;
- drop column 字段名;
- modify column 字段名 修改的字段信息
- change column 字段名 新字段名 字段信息
- Add primary key(字段名)
- Add index| unique index|fulltext index 索引名(字段名)
- drop primary key
- Drop index 索引名
- 操作表信息
- 库
- 常见的约束
- 主键约束:primary key
- 唯一约束:unique
- 非空约束:not null
- 默认约束:default
- 自增约束:auto_inrement
- 外键约束:foreign key
- 索引类型
- 主键索引
- 唯一索引
- 普通索引
- 联合索引
- 全文索引
- DDL操作是隐性提交的!不能rollback!
- DCL(数据控制语言)
- grant
- Revoke
- TCL(事务控制语言)
- RollBack
- Commit
- SavePoint
数据类型
- 整数
- 分类
- tinyint:1字节,0-255(无符号)
- smallint :2字节 0-65534(无符号)
- mediumint :3字节
- int :4字节
- Bigint :8字节
- 特点
- unsigned 无符号,数值范围翻倍
- int(3) 括号内表示的是显示的宽度,并不实际存储的数值范围。
- 类型选择,在满足条件的情况下,越小越好
- 分类
- 实数(阿里规范,强制:小数类型为decimal,禁止使用float和double)
- 分类
- 浮点数
- float (M,D):单精度,4字节,7个有效数字(整数位),大概是+(-)3.4*10^38的数量级。小数位无法精准存储。
- float范围[-3.4028235E38, 3.4028235E38],可以精准表示[0,16777215]范围内的整数,小数并不能精确表示,要根据内部二进制存储的结构来进行截取。
- float存储方式:转成二进制的科学计数法后进行存储.
- 32位:1位符号位(0正数,1负数),8位指数位,23位尾数位。
- 比如6.5,转成二进制是110.1=1.101*2^2.如下存储,符号位0,指数位2+127=129进行存储,尾数位101,不够0补齐。
- float为什么有效数字是7个!尾数位是23位,加上科学计数法整数部分的默认1,实际存储的数字224-1=16777215=1.6777215*107,所以有效数字是7,16777215以内的整数可以精准存储。超过的部分是跳跃的,部分可以精准存储,部分不可以。
- float小数部分不能精准存储!如5.2,转换成二进制后表示为101.0011001100110011001100110011……最后的0011无限循环下去,但是float最多能存储23位尾数,那么计算机存储的5.2应该是101.001100110011001100110,也就是数字 5.19999980926513671875,计算机使用这个最接近5.2的数来表示5.2。
- 另外:mysql存储的float数据select出来的和实际存储的并不一样,所以如果进行计算,结果会出乎意料!
- double(M,D) :双精度,8字节,15个有效数字(整数位)
- float (M,D):单精度,4字节,7个有效数字(整数位),大概是+(-)3.4*10^38的数量级。小数位无法精准存储。
- 定点数
- decimal(M,D) :可变长度,精准存储。(小数部分超过允许长度会四舍五入,整数部分绝对精准)
- M不要超过65,D不要超过30
- 不指定M,D,默认是(10,0)
- 整数部分不能超过(M-D),不然报错。
- 小数部分长度不超过D,是精准存储!超过的话会进行四舍五入(如果四舍五入后,整数部分超过,会正常显示,由系统承担)
- 浮点数
- 特点
- M表示总位数,D表示小数位,(M-D)则是整数长度
- float和double都是近似值,float整数位是7个有效数字,double整数位是15分有效数字。
- float和double不指定D,M,以实际长度进行存储。
- 整数位不能超过M-D,小数位可以超过D但是float和double小数位都不是精准存储,会有精度丢失,实际存储的值会不一样!而decimal会进行四舍五入!
- 分类
- 字符串
- char :定长字符串,0-255个字符长度,无字符集无关
- varchar :变长字符串,0-65534个字符长度
- 实际长度和记录行长度和字符集有关。
- 一个记录行的长度最长为65535字节,utf-8,按照一个字符=3个字节,最多varchar长度为21844
- varchar变长字符串,长度小于255,有1个字节存储长度,小于65535有2个字节存储长度。
- 因为在varchar存字符串时,第一个字节是空的,不存在任何数据,然后还需两个字节来存放字符串的长度,所以有效长度是65535-1-2=65532字节
- 例:若一个表定义为 CREATE TABLE tb(c1 int, c2 char(30), c3 varchar(N)) charset=utf8; 问N的最大值是多少? 答:(65535-1-2-4-303)/3
- Text:大文本字符串,比如一篇文章
- Blob:二进制字符串,比如图片
- Enum:枚举值代替字符串
- 枚举中字符串数量最大是65535
- 枚举值保存是以2字节的smallint整数进行存储的,每个枚举值存储位置从1开始递增
- 日期与时间
- datetime:8字节,日期+时间,范围是0000-9999
- Timestamp:4字节,
- 时间戳,从1970年开始的毫秒数,最大到2038年。
- UTC随着时区变化
- 一个表中第一个timestamp字段,默认是not null,default current——timestamp,当更新或者插入时也默认也更新。
- 一个表中第二个之后的timestamp字段,默认是0000-00-00,如果指定为null,则为当前时间,如果是default则是0000-00-00,也可以更改default current_timestamp
- 具体属性,最好通过show create table看建表语句
- Date:3字节
- Time:3字节
- Year :1字节,1901-2155
- 位数据类型
- Bit
- Set
函数
- 数值函数
- round(X,D)四舍五入,小数点后保留D位
- ceil()向上取整
- floor()向下取整
- mod(m,n)
- abs()绝对值
- pi()圆周率
- pow(m,n)m的n次方
- sqrt(x)x开平方
- rand()返回0-1的随机数
- truncate(x,D)截取D位小数(注意是截取)
- 字符串函数
- concat()
- Length()
- Upper()
- Lower()
- repeat(string, count)
- Substr(字符串,开始索引) / substr(字符串,开始索引,长度)
- instr(字符串,子串):返回子串第一次出现的索引,没有就返回0
- trim():去除字符串前后指定字符/默认去除前后空格
- ltrim
- rtrim
- replace(字符串,要替换的子串,替换后的子串)
- LPAD(字符串,长度,填充字符串)在指定字符左边填充字符已达到总长度。
- RPAD
- 日期函数
- now()
- Unix_timestamp()
- From_unixtime()
- Year(‘YYYY-MM-DD hh-mm-ss’)
- date(‘YYYY-MM-DD hh-mm-ss’)
- time(‘YYYY-MM-DD hh-mm-ss’)
- Date_formate(‘2020-10-10’,’%Y 年%m月’) 日期转字符
- str_to_date(字符串,日期格式)
- 分组函数
- count()
- avg()
- max()
- min()
- sum()
- Group_concat()
- 控制流函数
- if(expr,expr1,expr2) 如果expr是true,就是expr1,否则就是expr2
- case
when[condition] then…
when[condition1] then…
else …
End
- 格式化函数
- 加密函数
- Md5()
- 类型转换函数
- 系统信息函数
变量
- 按照属性分
- 系统变量
- 自定义变量
- 按照作用范围分为
- 全局变量
- 会话变量
视图
存储过程
流程控制结构
正则表达式
处理重复数据