mysql_3 基础语句
标签(空格分隔): mysql
原博客: https://www.jianshu.com/p/e872bc12f583
原视频: https://www.bilibili.com/video/BV157411K7sf
sql介绍
结构化的查询语言 关系型数据中通用的一类语言
SQL标准 89 92 99 03
help contents
help xx xx 查看帮助
DDL : 数据定义语言
DCL : 数据控制语言
DML : 数据操作语言
DQL : 数据查询语言
SQL mode SQL模式
作用 规范sql语句的书写方式
select @@sql_mode
STRICT_TRANS_TABLES:
在该模式下,如果一个值不能插入到一个事务表中,则中断当前的操作,对非事务表不做限制。必须设置,以后各项可能依赖于该项的设置
NO_ENGINE_SUBSTITUTION:
如果需要的存储引擎被禁用或未编译,那么抛出错误。不设置此值时,用默认的存储引擎替代,并抛出一个异常
ONLY_FULL_GROUP_BY:
对于GROUP BY操作,如果在SELECT中出现的单独的列,没有在GROUP BY子句中出现,那么这个SQL是不合法的
NO_AUTO_VALUE_ON_ZERO:
该值影响自增长列的插入。默认设置下,插入0或NULL代表生成下一个自增长值。如果用户希望插入的值为0,而该列又是自增长的,那么这个选项就有用了
NO_ZERO_IN_DATE:
在严格模式下,不允许日期和月份为零
NO_ZERO_DATE:
设置该值,mysql数据库不允许插入零日期,插入零日期会抛出错误而不是警告
ERROR_FOR_DIVISION_BY_ZERO:
在INSERT或UPDATE过程中,如果数据被零除,则产生错误而非警告。如果未给出该模式,那么数据被零除时MySQL返回NULL
NO_AUTO_CREATE_USER:
禁止GRANT语句创建密码为空的用户
PIPES_AS_CONCAT:
将“||”视为字符串的连接操作符而非或运算符,这和Oracle数据库是一样的,也和字符串的拼接函数Concat相类似
ANSI_QUOTES:
启用ANSI_QUOTES后,不能用双引号来引用字符串,因为它被解释为识别符
也可以在命令行查看和设置sql_mode变量
字符集 chatset 和校验规则 collation
字符集
show collation
utf8
utf8mb4 可以存表情
校对规则
每种字符集 有多种校对规则(排序规则)
show collation
作用:
影响到排序的操作
a
b
ab
Ab
aB
ba
A
B
A Ba a aB b
ASCII码的规则
show collation;
数据类型
数据类型 存储长度 二进制数 二进制数范围
整数 tinyint 0-255
整数 smallint 65535
网上有
https://www.w3school.com.cn/sql/sql_datatypes.asp
enum 枚举
('成都','北京','上海')
json{
id:1,
name:"sab"
}
约束
PK 主键 唯一且非空 每张表只能有一个主键 作为聚簇索引
NOT NULL 非空
UNIQUE 唯一
UNSIGNED 针对数字列 非空的数据
其他属性
default 默认值
comment 注释
SQL应用
client
? 帮助
c 结束上条命令运行
G 格式化输出
q 退出mysql会话
source 导入sql脚本
system 调用linux命令
Server
linux 一切皆文件、命令
mysql 一切皆sql、表
DDL
DDL 数据定义语言
库定义 库名 库属性
创建库
create database 库名 charset utf8mb4;
规范
1.库名大写 业务有关 不要数字开头 库名不要太长 不能使用保留字符串
2.必须指定字符集
查库
show databases;
show create database 库名
修改库
alter database 库名 charset 字符集
删除库
drop database 库名;
表操作
查看
show tables
desc tables
show create table
修改表
alter table wx_users add column shouji varchar(11) not null unique key comment '手机号';
alter table wx_users modity shouji varchar(12) not null unique key comment '手机号';
alter table wx_users change shouji varchar(12) not null unique key comment '手机号' ;
alter table wx_users drop shouji;
删除表
drop table wx_users
新增表
CREATE TABLE wx_users
(
Id int primary key,
LastName varchar(255) not null,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
ComeTime datetime not null default NOW()
)ENGINE=INNODB CHARSET=utf8mb4
此类操作会锁表 因为修改了表的元数据
类似于linux 中的 inode (磁盘位置、文件属性、) 更改属性时inode会变化
DML
select
insert
delete
update
insert
insert into 表名(字段1,字段2) values (字段1,字段2), (字段1,字段2);
insert into 表名 values (字段1,字段2), (字段1,字段2);
update
update table set a = 1 , b = 2 where id = ?
delete
delete from table where id = ?
4.1.3 select 标准用法 配合其他子句使用
几种delete的区别
delete from 表 逻辑上 逐行删除 数据行多 操作很慢 并没从磁盘上删除 只是在存储上打了标记 并不立即释放
drop table 表 表结构 元数据 物理角度删除
truncate table 表 清空表段中的所有数据页 磁盘空间立即释放 HWM高水位线会降低
select
select user()
select version()
help contents Functions
select 10*1000
select @@port
show variables ;
show variables like '%trx%';
单表
前提
默认执行顺序
select
1.from 表1,表2
2.where 条件1 条件2
3.group by 条件1 条件2
4.having 过滤条1 过滤条2
5.order by 条件列1 条件列2
6.limit 限制条件
select 列 from table
select * from table 全部
select + from + where 配合使用 --> grep
= > < >= <= != 条件
select * from table where id > 1
select * from table where 条件 like 'ch%'
ch% 别写 %ch% 不走索引
select * from + where + group by
group by 配合聚合函数 max min avg count sum group_concat 使用
聚合函数
max 最大值
min 最小值
avg 平均值
count 数
sum 求和
group_concat 列转行
说明 : 碰到group by 必然会有聚合函数。
驱动表
在多表连接中,承当for循环中外层循坏的角色。
此时,mysql会拿着驱动表的每个满足条件的关联列的值,去依次找到for循环内循环中的关联值一一进行判断和匹配
建议:
关联时 使用小表作为驱动表 降低next loop次数 left join 可以强制左表为驱动表。
union 和 union all 区别
union 聚集两个结果集 会自动进行结果集去重复
union all 聚集两个结果集 不会去重复
show 语句
show databases;
show tables;
show tables from world; #查看world库下的表
show processlist; #查看连接情况
show full processlist #全部用户连接情况
show charset #查看字符集
show collation #查看校对规则
show engines #查看引擎
show privileges #查看权限
show grants for #查看用户的权限
show create database #查看建库
show create table #查看建表
show index from # 查看表的索引信息
show engine innodb status #查看innodb引擎状态
show status # 查看数据库状态
show status like '%%' #查询数据状态
show variables # 查看所有数据库参数
show variables like '%%' #某些参数部分
show binary logs #查看二进制日志文件信息
show binlog events in # 查看二进制日志事件
show master status # 查看二进制日志的位置点信息
show slave status # 查询从库状态信息
show relaylog events in #查看中继日志事件
结构 逻辑表
数据字典
存放表中列的定义信息
myisam:
t1.frm
innodb:
两份
t1.frm ibdata1 8.0之前
数据行记录
myisam:
t1.MYD
innodb:
t1.ibd
索引
myisam:
t1.MYI
innodb:
t1.ibd
数据库状态
mysql 库 ps sys
权限
mysql 库
user
db
table
column
日志
专门日志文件
information schema
查询部分metadata视图
状态 数据字典 权限
元数据获取
每次数据库启动 会自动在内存中生成I_S 生成查询mysql部分元数据信息试图。
试图?
select语句的执行方法 不保存数据本身
I_S中的试图,保存的就是查询元数据的方法
create view v as select * from user;
select * from v;
I_S table
保存了所有的表的数据字典信息
desc tables
//单位都是B
TABLE_SCHEMA #表所在的库
TABLE_NAME #表名
ENGINE #引擎
TABLE_ROWS #多少行
AVG_ROW_LENGTH #平均行长度
DATA_LENGTH #数据大小
INDEX_LENGTH #索引大小
DATA_FREE #表中是否有碎片
case
case when 判断 then 结果 when 判断2 then 结果2 end