【MySQL】SQL

  • ~3.43K 字
  1. 1. 通用语法
  2. 2. DDL
    1. 2.1. 数据库操作
    2. 2.2. 数据类型
      1. 2.2.1. 数值类型
      2. 2.2.2. 字符串类型
      3. 2.2.3. 日期时间类型
    3. 2.3. 表操作
  3. 3. DML
    1. 3.1. 添加数据
    2. 3.2. 修改数据
    3. 3.3. 删除数据
  4. 4. DQL
    1. 4.1. 语法
    2. 4.2. 基本查询
    3. 4.3. 条件查询
    4. 4.4. 聚合函数
    5. 4.5. 分组查询
    6. 4.6. 排序查询
    7. 4.7. 分页查询
    8. 4.8. 执行顺序
  5. 5. DCL
    1. 5.1. 用户管理
    2. 5.2. 权限控制

这里讲的是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开始,计算方式:查询页码每页显示记录数
  • 分页查询是数据库的方言,不同数据库有不同实现
  • 若查询第一页数据,起始索引可以省略,简写为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 '用户名'@'主机名';

  • 可以用*来指定所有

赞助喵
非常感谢您的喜欢!
赞助喵