🔔 SQL 语句
1. 数据库
create database database-name;
drop database database-name;
2. 数据表
create table table-name(col1 type1 [not null] [primary key],
col2 type2 [not null],...)
create table table-new like table-old;
create table table-new as select col1, col2...from table-old definition only
drop table table-name
select top() * into table-annother from table-cur
insert into table-annother(col1, col2, col3) select col1, col2, col3 from table-cur;
insert into announce(title, user_scope) values ('this is a test', 0);
delete from announce where id = 3;
update announce set create_time = now() where id = 3;
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 table
where
判断条件group by col
having
判断条件 order by col acs[default] | desc
limit m, n
3. 数据列
alter table table-name add column col-name type;
4. 索引
alter table table-name add primary key(col-name);
alter table table-name drop primary key(col-name);
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);
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
走 index
count(1)
包括了忽略所有列,用1代表代码行,在统计结果的时候,不会忽略列值为NULL,explain
走 index
count(列名)
只包括列名那一列,在统计结果的时候,会忽略列值为 NULL 的计数,即某个字段值为NULL时,不统计
- 执行速度
count(*)
== count(1)
== count(索引列)
,均走 index
count(非索引列)
走 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 开始支持
2) 如何使用