🔔 SQL 语句

吞佛童子2022年10月10日
  • DB
  • MySQL
大约 5 分钟

🔔 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);

img.png

img_2.png

img_1.png

2) 删

delete from announce where id = 3;

delete 不会减少磁盘文件大小

  • MySQL 执行 delete 命令并不会降低磁盘文件的大小,只是在数据行的删除标记中进行了标记,表示可以复用,但并不会回收表空间
  • 空洞:可以被复用,但是还没有被使用的空间

img_6.png

img_5.png

3) 改

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

img_4.png

img_3.png

4) 查

  1. distinct:
    • 所有列的值都相同才算相同
  2. from table
  3. where 判断条件
  4. group by col
    • 根据指定字段进行分组
  5. having 判断条件
    • 过滤分组
  6. order by col acs[default] | desc
    • 根据字段进行排序
  7. 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

  1. in 先进行子查询,exists 先进行外查询
    • in 适用于后边为小表的情况;exists 适用于左边为小表的情况
  2. not in 内外表都会走全表扫描not exists 右边仍能用到索引

2) count(1) & count(*) & count(列名)

  1. 执行效果
    • count(*) 包括了所有的列,相当于行数,在统计结果的时候,不会忽略列值为NULLexplainindex
    • count(1) 包括了忽略所有列,用1代表代码行,在统计结果的时候,不会忽略列值为NULLexplainindex
    • count(列名) 只包括列名那一列,在统计结果的时候,会忽略列值为 NULL 的计数,即某个字段值为NULL时,不统计
  2. 执行速度
    • count(*) == count(1) == count(索引列),均走 index
    • count(非索引列)all,速度最慢

3) union

  • 组合左右两边的结果集,并消去重复行,最终生成一个结果集表
  • 两边结果集的列必须一致
  • union all 使用时,不会消去重复行

4) expect

  • 组合左右两边的结果集,保留左边存在 & 右边不存在的结果集,消去重复行
  • 两边结果集列必须一致
  • expect all 使用时,不会消去重复行

5) intersect

  • 组合左右两边的结果集,求交集,消去重复行
  • 两边结果集列必须一致
  • intersect all 使用时,不会消去重复行

6) join

  1. left join
  • 左外连接,保留左连接表所有结果集
  1. right join
  2. full/cross join
  3. inner join

6. 字段类型

1) char VS varchar

charvarchar
定长字符串非定长字符串
插入数据长度不足指定固定长度时,用 空格 填充插入数据长度 == 实际存储的数据长度
存取速度存取速度比 varchar 快存取速度比 char 慢
空间利用率空间利用率比 varchar 低空间利用率比 char 高
存放字符数最多存放 255 个字符,无论何种编码方式最多存放 65532 个字符

2) blob VS text

blobtext
存储 二进制数据存储 大字符串
无需字符集有字符集,可根据 字符集的规则对值进行排序 & 比较

3) datetime VS timestamp

datetimetimestamp
数据存储形式YYYY-MM-DD HH:MM:SSYYYY-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) 如何使用

上次编辑于: 2022/10/10 下午8:43:48
贡献者: liuxianzhishou