InnoDB-DDL 建库
select version();
show databases;
drop database if exists hi_java;
create database if not exists hi_java character set utf8mb4 collate utf8mb4_general_ci;
use hi_java;
show variables like '%character%';
InnoDB-DDL 建表
属性查询
show tables;
show engines;
show variables like '%datadir%';
show table status like 'tb_relation_student';
表备份
create table tableName like someTable;
create table tableName select * from someTable;
create table tableName like someTable;
insert into tableName select * from someTable;
建表规范
tb_业务前缀_表作用 [tb_base_user]
表名不使用复数名词
单表行数超过500万行或者单表容量超过2GB,才推荐进行分库分表
如果预计三年后的数据量根本达不到这个级别,请不要在创建表时就分库分表
latin1: 容易出现乱码问题,在实际项目中使用比较少
GBK: 支持中文,但不支持国际通用字符,在实际项目中使用也不多
utf-8: 占用3个字节,无法存储emoji表情,因为emoji表情一般需要4个字节
utf8mb4: 建议设置
排序规则和字符集有关
字符集utf8mb4对应的排序规则:utf8mb4_general_ci-大小写不敏感;utf8mb4_bin-大小写敏感
个数 < 20
字段允许冗余,冗余字段遵循
1 不是频繁修改的字段
2 不是唯一索引的字段
3 不是varchar超长字段,更不能是text字段
status: 标识状态
delete_status: 软删除标志位
关联字段:关联表名_字段名称 [base_user_id]
必备三字段:id,create_time,update_time
id: bigint unsigned
时间: datetime
是否:tinyint unsigned [1-是,0-否]
枚举:tinyint
金额:decimal(m,n) [n是指小数的长度,m是指整数加小数的总长度]
人年龄:tinyint unsigned
能定义成not null就定义成not null,并设置默认值
1 innodb中需要额外空间存储null
2 null只能通过is null / is not null判断,用=号永远返回false
可以给单个字段加,也可以创建联合的唯一索引
唯一索引失效: 如果是联合的唯一索引,字段值出现null时,则唯一性约束可能会失效
创建唯一索引时,相关字段一定不能包含null值,否则唯一性会失效
InnoDB-DQL Query
查询SQL模板
select * (存在聚合函数)
from t1
[left | right| inner join t2 on]
[where ...](不包含聚合函数的过滤条件)
[group by ...]
[having ...](包含聚合函数的过滤条件)
[order by ...]
[limint ...]
执行流程
from t1
[left | right| inner join t2 on]
[where ...](不包含聚合函数的过滤条件)
[group by ...]
[having ...](包含聚合函数的过滤条件)
select * (存在聚合函数)
[order by ...]
[limint ...]
from > on > left > where > group by > having > select > distinct > order by > limit
SQL技巧
select name,group_concat(code) from `user` group by name;
select * from brand where name like '%苏三%' order by char_length(name) asc limit 5;
select * from brand where name like '%苏三%'
order by char_length(name) asc, locate('苏三',name) asc limit 5,5;
select now(3) from brand limit 1;
InnoDB-DML Insert
SQL技巧
INSERT ignore INTO `brand`(`id`, `code`, `name`) VALUES (123, '108', '苏三');
INSERT INTO `brand`(`id`, `code`, `name`) VALUES (123, '108', '苏三')
on duplicate key update name='苏三',edit_date=now(3);
InnoDB-DML Update
SQL技巧
update brand set name=REPLACE(name,' ','') where name like ' %';
InnoDB-DML Delete
相同点:都能删除数据,都不会删除表结构和索引
delete:
1.数据删除后是可以实现回滚的;
2.未重启数据库,计数器不归零;
3.重启后:InnoDB会从1开始(存内存中,断电即失);MyISAM继续从上一增量开始(存文件中,不会丢失)
truncate:
1.数据删除后是不可以回滚的;
2.使用的系统和事务的日志资源少,速度快,无事务且不触发trigger,不会进行数据回滚到备份;
3.重新设置自增列,计数器归零;
InnoDB 视图
create view vu_company_department
as
select department_name,department_place from tb_company_department;
show tables ;
desc vu_company_department;
show table status like 'vu_company_department';
show create view vu_company_department;
不可更新视图情况:
1 基表中进行聚合计算成为视图的列,不能修改
2 视图表新增数据时,基础表部分字段没有默认值,不能新增
3 虽然可以更新视图数据,但总的来说视图作为虚拟表,主要用于方便查询,不建议更新视图的数据
4 对视图数据的更改,都是通过对实际数据表里数据的操作来完成的
update vu_company_department set department_place = '北京' where department_name = '事业部'
create or replace view vu_company_department
as
select department_name,department_number,department_place from tb_company_department;
alter view vu_company_department
as
select department_name,department_place from tb_company_department;
drop view if exists vu_company_department;
存储过程
set global log_bin_trust_function_creators = 1;
delimiter //
create function rand_num(from_num int,to_num int) returns int(11)
begin
declare i int default 0;
set i = floor(from_num + rand()*(to_num - from_num));
return i;
end //
delimiter ;
delimiter //
create function rand_string(n int) returns varchar(255)
begin
declare chars_str varchar(100) default 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
DECLARE return_str varchar(255) DEFAULT '';
DECLARE i INT DEFAULT 0;
WHILE i < n DO
SET return_str = concat(return_str,substring(chars_str , FLOOR(1 + RAND()*52 ),1));
SET i = i +1;
END WHILE;
RETURN return_str;
end //
delimiter ;