首页 SQL
文章
取消

SQL

SQL1

1 SQL通用语法

  1. SQL语句可以单行或多行书写,以 ; j结尾
  2. SQL语句可以使用 空格缩进 来增强语句的可读性
  3. MySQL数据库的SQL语句不区分大小写,关键字建议使用大写
  4. 注释
    • 单行注释:-- 注释内容# 注释内容(MySQL特有)
    • 多行注释: /* 注释内容 */

2 SQL分类

分类说明
Data Definition Language DDL数据定义语言,用来定义数据库对象(数据库,表,字段)
Data Manipulation Language DML数据操作语言,用来对数据库表中的数据进行 增删改
Data Query Language DQL数据查询语言,用来查询数据库中表的记录
Data Control Language DCL数据控制语言,用来创建数据库用户、控制数据库的访问权限

3 DDL

3.1. 数据库操作

  1. 查询

    • 查询所有数据库

      SHOW DATABASES;
      
    • 查询当前数据库

      SELECT DATABASES();
      
  2. 创建

    CREATE DATABASE [IF NOT EXISTS] 数据库名 [DEFAULT CHARSET 字符集] [COLLATE 排序规则];
    
  3. 删除

    DROP DATABASE [IF EXISTS] 数据库名;
    
  4. 使用

    USE 数据库名;
    

3.2. 表操作

  1. 查询

    • 查询当前数据库的所有表

      SHOW TABLES;
      
    • 查询表结构

      DESC 表名;
      
    • 查询指定表的建表语句

      SHOW CREATE TABLE 表名;
      
  2. 创建

    CREATE TABLE 表名(
    	字段1 字段1类型[ COMMENT 字段1注释],
       	字段2 字段1类型[ COMMENT 字段2注释],
       	字段3 字段1类型[ COMMENT 字段3注释],
        ...
       	字段n 字段n类型[ COMMENT 字段n注释]
    )[ COMMENT 表注释];
    
    注意:

    ... 为可选字段,最后一个字段后面没 ,

  3. 数据类型

    MySQL中的数据类型有很多,主要分为三大类:数值类型、字符串类型、日期时间类型。

    • 数值类型

      image-20221122181337350

      age TINYINT UNSIGNED
      
      score DOUBLE(4,1) -- 4是总长度 1是小数点后的位数
      
    • 字符串类型

      image-20221123113306096

      • char(10)

        最长不超过 10,未达到字符长度用 空格 补齐

        性能较好

      • varchar(10)

        最长不超过 10, 动态长度

        性能较差

    • 日期时间类型

      image-20221123140439179

    • 其他类型

  4. 修改

    • 添加字段

      ALTER 表名 ADD 字段名 类型(长度) [COMMENT 注释] [约束];
      
    • 修改数据类型

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

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

      ALTER TABLE 表名 DROP 字段名;
      
    • 修改表名

      ALTER TABLE 表名 RENAME TO 新表名;
      
    • 删除表

      DROP TABLE [IF EXISTS] 表名; -- 表中数据会被删除
      
    • 删除指定表,并重新创建新表

      TRUNCATE TABLE 表名;  -- 表中数据会被删除
      
  5. MySQL图形化界面

    image-20221123152221245

4 DML

Data Manipulation Language (数据库操作语言),用来对数据库中表的数据记录进行增删改操作

4.1. 添加数据(INSERT)

  1. 给指定字段添加数据

    INSERT INTO 表名(字段名1,字段名2,...) VALUES(值1,值2,...);
    
  2. 给全部字段添加数据

    INSERT INTO 表名 VALUES(值1,值2,...);
    
  3. 批量添加数据

    INSERT INTO 表名(字段名1,字段名2,...) VALUES(值1,值2,...),(值1,值2,...),(值1,值2,...);
    
    INSERT INTO 表名 VALUES(值1,值2,...),(值1,值2,...),(值1,值2,...);
    
  4. **注意**
    • 插入数据时,指定的字段顺序需要与值得顺序是一一 对应的
    • 字符串和日期型的数据应该包含在引号中
    • 插入的数据大小,应该在字段的规定范围内

4.2. 修改数据(UPDATE)

  1. 修改数据

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

    修改语句的条件可以有,也可以没有,如果没有条件,则会修改整张表的所以数据

4.3. 删除数据(DELETE

  1. 删除数据

    DELETE FROM 表名 [ WHERE 条件];
    
  2. **注意**
    • DELETE语句的条件可以有,也可以没有,如果没有条件,则会删除整张表的所以数据
    • DELETE语句不能删除某一个字段的值(可以使用 UPDATE)

5 DQL

Data Query Language(数据查询语言),用来查询数据库中表的记录

关键字:`select`

5.1. 语法

SELECT	字段列表
FROM	表名列表

WHERE	条件列表

GROUP BY	分组字段列表
HAVING	分组后条件列表

ORDER BY	排序字段列表

LIMIT	分页参数

5.2. 基本查询

  1. 查询多个字段

    SELECT 字段1,字段2,字段3,... FROM 表名;
    
    SELECT * FROM 表名; -- 不推荐
    
    注意:

    避免写 * 影响效率,字段名不直观

  2. 设置别名

    SELECT 字段1 [ AS 别名1],字段2 [ AS 别名2],... FROM 表名;
    
    注意:

    AS 可省略

  3. 去重复记录

    SELECT DISTINCT 字段列表 FROM 表名;
    

5.3. 条件查询(WHERE

  1. 语法

    SELECT 字段列表 FROM 表名 WHERE 条件列表;
    
  2. 条件

    • 比较运算符

      image-20221123162420988

    • 逻辑运算符

      image-20221123162432004

    • 特殊示例

      IS NULL;
      IS NOT NULL;
           
      age != 88;
      age <> 88;
           
      age >=15 AND age <=20;
      age BETWEEN 15 AND 20; -- 最小值在前
           
      age IN(15,20);
      age = 15 OR age =20;
           
      name LIKE '__'; -- 查询名字为两个字符的数据,1个下划线 代表一个字符
           
      idcard LIKE '%X';
      idcard LIKE '_________________X';
      

5.4. 聚合函数(COUNT、MAX、MIN、AVG 、SUM

  1. 介绍

    将一列数据作为一个整体,进行纵向计算

  2. 常见聚合函数

    image-20221123165528739

  3. 语法

    SELECT 聚合函数(字段列表) FROM 表名;
    
  4. **注意:**

    NULL 不参与所有聚合函数运算

5.5. 分组查询(GROUP BY

  1. 语法

    SELECT 字段列表 FROM 表名 [ WHERE 条件 ] GROUP BY 分组字段名 [ HAVING 分组后过滤条件];
    
  2. `WHERW` 与 `HAVING`

    的区别

    • 执行时机不同:WHERE 是分组之前进行过滤,不满足WHERE条件,不参与分组;而 HAVING 是分组之后对结果进行过滤
    • 判断条件不同:WHERE不能对聚合函数进行判断,而HAVING可以
  3. **注意**
    • 执行顺序:WHERE > 聚合函数 > HAVING
    • 分组之后,查询的字段一般为聚合函数和分组字段,查询其他字段无任何意义
  4. 特殊示例

    -- 查询年龄小于45,且根据工作分组,并且员工数量大于3的工作城市
    SELECT workaddress,COUNT(*) address_count FROM emp WHERE age<45 GROUP BY workaddress HAVING address_count > 3;
    

5.6. 排序查询(ORDER BY

  1. 语法

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

    • ASC - 升序(默认值)
    • DESC - 降序
  3. 注意:

    多字段排序,当第一字段值相同时才会根据第二字段进行排序

5.7. 分页查询(LIMIT

  1. 语法

    SELECT 字段列表 FROM 表名 LIMIT 起始索引,查询记录数;
    
  2. 注意
    • 起始索引 从 0 开始 起始索引 = (查询页码 - 1)* 每页显示记录数
    • 如果查询的是第一页数据,起始索引可省略
    • 分页查询是数据库的方言,不同数据库有不同的实现, MySQL中是 LIMIT

5.8. 执行顺序

FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY → LIMIT

image-20221123174329287

6 DCL

Data Control Language(数据控制语言),用来管理数据库 用户、控制数据库访问权限。

6.1. 用户管理

  1. 查询用户

    USE mysql;
    SELECT * FROM user;
    
  2. 创建用户

    CREATE USER '用户名'@'主机名' IDENTIFIED BY '密码';
    
  3. 修改用户密码

    ALTER USER '用户名'@'主机名' IDENTIFIED WITH mysql_native_password BY '新密码';
    
  4. 删除用户

    DROP USER '用户名'@'主机名';
    
  5. **注意**
    • 主机名可以使用 & 通配
    • 这些操作SQL开发人员操作较少,主要是DBA(Database Administrator 数据库管理员)使用

6.2. 权限控制

  1. 权限类型

    image-20221123221801800

  2. 查询权限

    SHOW GRANTS FOR '用户名'@'主机名';
    
  3. 授予权限

    GRANTS 权限列表 ON 数据库名.表名 TO '用户名'@'主机名';
    
  4. 撤销权限

    REVOKE 权限列表 ON 数据库名.表名 FROM '用户名'@'主机名';
    
  5. **注意**
    • 多个权限之间,使用 , 分隔
    • 授权时,数据库名和表名可以使用 * 进行通配
本文由作者按照 CC BY 4.0 进行授权

MySQL概述

MySQL函数