🔔 SQL 语句
2022年10月10日
- DB
🔔 SQL 语句
1. 数据库
--- 1. 创建数据库
create database database-name;
--- 2. 删除数据库
drop database database-name;
2. 数据表
--- 1. 创建新表
create table table-name(col1 type1 [not null] [primary key],
col2 type2 [not null],...)
--- 1.1 使用旧表创建新表
create table table-new like table-old;
create table table-new as select col1, col2...from table-old definition only
--- 2. 删除表
drop table table-name
--- 3. 复制表,只复制结构
select top() * into table-annother from table-cur
--- 4. 复制表,拷贝数据
insert into table-annother(col1, col2, col3) select col1, col2, col3 from table-cur;
-------------------- 行操作 -----------------------
--- 1. inert
insert into announce(title, user_scope) values ('this is a test', 0);
--- 2. delete
delete from announce where id = 3;
--- 3. update
update announce set create_time = now() where id = 3;
--- 4. select
select * from announce where id = 3;
--- 求和 & 平均数 & 最大数 & 最小数
select sum(col-name) as sumval from announce;
select avg(col-name) as avgval from announce;
select max(col-name) as maxval from announce;
select min(col-name) as minval from announce;
1) 增
insert into announce(title, user_scope) values ('this is a test', 0);


2) 删
delete from announce where id = 3;
delete 不会减少磁盘文件大小
- MySQL 执行 delete 命令并不会降低磁盘文件的大小,只是在数据行的删除标记中进行了标记,表示可以复用,但并不会回收表空间
- 空洞:可以被复用,但是还没有被使用的空间

3) 改
update announce set create_time = now() where id = 3;

4) 查
distinct:- 所有列的值都相同才算相同
from tablewhere判断条件group by col- 根据指定字段进行分组
having判断条件- 过滤分组
order by col acs[default] | desc- 根据字段进行排序
limit m, n- 从第 0 行结果开始,返回 n 行数据
3. 数据列
--- 1. 增加一列,列增加后无法删除,数据类型也无法改变
--- 唯一能改变的是 增加 varchar 的长度
alter table table-name add column col-name type;
4. 索引
--- 1. 添加主键
alter table table-name add primary key(col-name);
--- 2. 删除主键
alter table table-name drop primary key(col-name);
--- 3. 创建索引,索引不可更改,要想更改需要先删除索引,然后重建索引
create index index-name on table-name(col-name);
alter table table-name add index index-name(col-name);
create unique index-name on table-name(col-name);
alter table table-name add unique index-name(col-name);
--- 4. 删除索引
drop index index-name;
5. 关键字
1) in VS exists
in先进行子查询,exists先进行外查询in适用于后边为小表的情况;exists适用于左边为小表的情况
not in内外表都会走全表扫描;not exists右边仍能用到索引
2) count(1) & count(*) & count(列名)
- 执行效果
count(*)包括了所有的列,相当于行数,在统计结果的时候,不会忽略列值为NULL,explain走indexcount(1)包括了忽略所有列,用1代表代码行,在统计结果的时候,不会忽略列值为NULL,explain走indexcount(列名)只包括列名那一列,在统计结果的时候,会忽略列值为 NULL 的计数,即某个字段值为NULL时,不统计
- 执行速度
count(*)==count(1)==count(索引列),均走indexcount(非索引列)走all,速度最慢
3) union
- 组合左右两边的结果集,并消去重复行,最终生成一个结果集表
- 两边结果集的列必须一致
union all使用时,不会消去重复行
4) expect
- 组合左右两边的结果集,保留左边存在 & 右边不存在的结果集,消去重复行
- 两边结果集列必须一致
expect all使用时,不会消去重复行
5) intersect
- 组合左右两边的结果集,求交集,消去重复行
- 两边结果集列必须一致
intersect all使用时,不会消去重复行
6) join
- left join
- 左外连接,保留左连接表所有结果集
- right join
- full/cross join
- inner join
6. 字段类型
1) char VS varchar
| char | varchar | |
|---|---|---|
定长字符串 | 非定长字符串 | |
插入数据长度不足指定固定长度时,用 空格 填充 | 插入数据长度 == 实际存储的数据长度 | |
| 存取速度 | 存取速度比 varchar 快 | 存取速度比 char 慢 |
| 空间利用率 | 空间利用率比 varchar 低 | 空间利用率比 char 高 |
| 存放字符数 | 最多存放 255 个字符,无论何种编码方式 | 最多存放 65532 个字符 |
2) blob VS text
| blob | text | |
|---|---|---|
存储 二进制数据 | 存储 大字符串 | |
无需字符集 | 有字符集,可根据 字符集的规则对值进行排序 & 比较 |
3) datetime VS timestamp
| datetime | timestamp | |
|---|---|---|
| 数据存储形式 | YYYY-MM-DD HH:MM:SS | YYYY-MM-DD HH:MM:SS |
| 最小单位 | 微秒 | 微秒 |
| 日期范围 | [1000-01-01 00:00:00.000000, 9999-12-31 23:59:59.999999] | [1970-01-01 00:00:01.000000, 2038-01-09 03:13:07.999999] |
| 存储空间 | 8 字节 | 4 字节 |
| 时区 | 与 时区无关 | 依赖于 时区 |
| 默认值 | null | 当前时间 |
7. 存储过程
1) 作用
- 一段可执行的 sql 运行命令,经编译创建并保存在数据库中,之后可以快速调用,为 sql 层面的封装和重用
- MySQL 5.0 开始支持