红魔咖啡馆

头发越掉越多,头发越掉越少

0%

【MySQL】SQL

这里讲的是SQL的通用语法,DML、DDL、DQL、DCL等语法

通用语法

  • 以分号结尾,可以单行或多行写
  • 语句不区分大小写,但关键字规范是大写
  • 单行注释:--#;多行注释:/**/

DDL

DDL为数据定义语言,涉及定义操作:

数据库操作

  • 查询所有数据库:SHOW DATABASES;
  • 查询当前数据库:SELECT DATABASE();
  • 创建数据库:CREATE DATABASE [IF NOT EXIST] 数据库名 [DEFAULT CARSET 字符集] [COLLATE 排序规则];
    • 若创建已有的数据库,且不添加IF NOT EXIST,会报错
    • 可以自选字符集,建议使用支持四字节长的utf8mb4
  • 删除数据库:DROP DATABASE [IF EXISTS] 数据库名;
    • 若删除没有的数据库,且不添加IF EXISTS,会报错
  • 使用数据库:USE 数据库名;

数据类型

数值类型

  • 指定有无符号在类型后添加SIGNED/UNSIGNED
  • FLOAT与DOUBLE后面要用括号定义总位数与精度,如DOUBLE(4,1)
  • 这里的精度指的是某实数有效数字位数,标度为小数位数

字符串类型

  • CHAR与VARCHAR后面要用括号定义字符最大长度
    • VARCHAR占用大小是数据实际长度,CHAR是定长,多出来的用空格填充
    • VARCHAR性能较差

日期时间类型

表操作

查询:

  • 查询当前数据库所有表:SHOW TABLES;
    • 需要使用USE先进入该数据库
  • 查询表结构:DESC 表名;
  • 查询指定表的建表语句:SHOW CREATE TABLE 表名;

创建:

  • 创建表:

    1
    2
    3
    4
    5
    6
    7
    CREATE TABLE 表名(
    	字段1 字段1类型 [COMMENT 字段1注释],
        字段2 字段2类型 [COMMENT 字段2注释],
        字段3 字段3类型 [COMMENT 字段3注释],
        ...
        字段n 字段n类型 [COMMENT 字段n注释]
    ) [ENGINE=存储引擎] [DEFAULT CHARSET=字符集] [COLLATE=排序规则] [COMMENT 表注释];

修改:

  • 添加字段:ALTER TABLE 表名 ADD 字段名 类型(长度) [COMMENT 注释] [约束];

  • 修改数据类型:ALTER TABLE 表名 MODIFY 字段名 新类型(长度);

  • 修改字段名和类型:ALTER TABLE 表名 CHANGE 旧字段名 新字段名 类型(长度) [COMMENT 注释] [约束];

  • 删除字段:ALTER TABLE 表名 DROP 字段名;

  • 修改表名:ALTER TABLE 表名 RENAME TO 新表名;

删除:

  • 删除表:DROP TABLE [IF EXISTS] 表名;
  • 删除指定表并重新创建:TRUNCATE TABLE 表名;

DML

DML是数据操作语言,对表中的记录进行增删改操作

添加数据

  • 指定字段添加数据:INSERT INTO 表名(字段1,...) VALUES(值1,...);
  • 全部字段添加数据:INSERT INTO 表名 VALUES(值1,...);
  • 批量添加数据:
    • INSERT INTO 表名(字段1,...) VALUES(值1,...), (值1,...), (值1,...)...;
    • INSERT INTO 表名 VALUES(值1,...), (值1,...), (值1,...)...;

注意:

  • 插入数据时字段顺序与之顺序一一对应
  • 字符串和日期数据要在引号中

修改数据

UPDATE 表名 SET 字段名1=值1, 字段名2=值2,... [WHERE 条件];

如果没有条件,则会修改整张表的所有数据

删除数据

DELETE FROM 表名 [WHERE 条件];

  • 如果没有条件,则会删除整张表的所有数据
  • DELETE语句不能删除某一个字段的值,可以用UPDATE

DQL

DQL是数据查询语言,用来查询数据

语法

1
2
3
4
5
6
7
SELECT 字段列表
FROM 表名列表
WHERE 条件列表
GROUP BY 分组字段列表
HAVING 分组后条件列表
ORDER BY 排序字段列表
LIMIT 分页参数;

基本查询

  • 查询多个字段:SELECT 字段1, 字段2,... FROM 表名;

    SELECT * FROM 表名;

  • 设置别名:SELECT 字段1 [AS 别名], 字段2 [AS 别名],... FROM 表名;

    • AS可以省略
  • 去除重复记录:SELECT DISTINCT 字段列表 FROM 表名;

条件查询

语法:SELECT 字段列表 FROM 表名 WHERE 条件列表

条件:

  • IN列表内的值只需要满足一个即可

  • LIKE举例:查询最后一位是X的信息:

    SELECT * FROM table WHERE id LIKE '%X';

聚合函数

某一列作为一个整体,纵向计算

常见聚合函数:

语法:SELECT 聚合函数(字段列表) FROM 表名;

注意:NULL值不参与聚合函数运算

分组查询

语法:SELECT 字段列表 FROM 表名 [WHERE 条件] GROUP BY 分组字段名 [HAVING 分组后过滤条件];

例:查询男性和女性的数量:SELECT gender, COUNT(*) FROM table GROUP BY gender

注意:

  • WHERE用于分组前过滤,不满足WHERE条件的不参与分组;HAVING用于分组后对结果过滤;WHERE不能对聚合函数判断,而HAVING可以
  • 执行顺序:WHERE>聚合>HAVING
  • 分组后查询字段一般为聚合函数和分组字段

排序查询

语法:SELECT 字段列表 FROM 表名 ORDER BY 字段1 排序方式1, 字段2 排序方式2,...;

排序方式:

  • ASC:升序(默认)
  • DESC:降序

首先按照第一个,然后第二个,以此类推

分页查询

语法:SELECT 字段列表 FROM 表名 LIMIT 起始索引, 查询记录数;

  • 起始索引从0开始,计算方式:\((查询页码-1)\times 每页显示记录数\)
  • 分页查询是数据库的方言,不同数据库有不同实现
  • 若查询第一页数据,起始索引可以省略,简写为LIMIT 10
  • LIMIT要放在所有查询最后

执行顺序

编写顺序:SELECT->FROM->WHERE->GROUP BY-> HAVING->ORDER BY->LIMIT

执行顺序:FROM->WHERE->GROUP BY->HAVING ->SELECT->ORDER BY->LIMIT

DCL

DCL是数据控制语言,管理数据库用户和访问权限

用户管理

  • 查询用户:用户信息存放在系统数据库mysql中

    1
    2
    USE mysql;
    SELECT * FROM user;
  • 创建用户:CREATE USER '用户名'@'主机名' IDENTIFIED BY '密码';

    • 任意主机只需要将主机名改为%
  • 修改密码:ALTER USER '用户名'@'主机名' IDENTIFIED WITH 密码处理方式(一般mysql_native_password) BY '新密码';

  • 删除用户:DROP USER '用户名'@'主机名';

权限控制

  • 常用权限:
  • 查询权限:SHOW GRANTS FOR '用户名'@'主机名';

  • 授予权限:GRANT 权限列表 ON 数据库名.表名 TO '用户名'@'主机名';

  • 撤销取消:REVOKE 权限列表 ON 数据库名.表名 FROM '用户名'@'主机名';

  • 可以用*来指定所有