MySql分类

1. DDL

  1. 定义
    Data Definition Language,数据定义语言,用来定义数据库对象(数据库,表,字段()。

  2. 数据库操作

    1. 查询所有数据库

      sql 复制代码
      show databases ;
    2. 查询当前数据库

      sql 复制代码
      select database() ;
    3. 创建数据库

      sql 复制代码
      create database [ if not exists ] 数据库名 [ default charset 字符集 ] [ collate 排序
      规则 ] ;
      1. 创建一个itcast数据库, 使用数据库默认的字符集。

        sql 复制代码
        create database itcast;

        注意: 在同一个数据库服务器中,不能创建两个名称相同的数据库,否则将会报错。 可以通过if not exists 参数来解决这个问题,数据库不存在 , 则创建该数据库,如果存在,则不 创建。

        sql 复制代码
        create database if not extists itcast;
        1. 创建一个 itheima 数据库,并且指定字符集
        sql 复制代码
        create database itheima default charset utf8mb4;
    4. 删除数据库

      sql 复制代码
      drop database [ if exists ] 数据库名 ;
    5. 切换数据库

      sql 复制代码
      use 数据库名 ;
  3. 表操作

    1. 查询创建

      1. 查询当前数据库所有表

        sql 复制代码
        show tables;
      2. 查询指定表结构

        sql 复制代码
        desc 表名;
      3. 查询指定表的建表语句

        sql 复制代码
        show create table 表名
      4. 创建表结构

        sql 复制代码
        CREATE TABLE 表名(
        字段1 字段1类型 [ COMMENT 字段1注释 ],
        字段2 字段2类型 [COMMENT 字段2注释 ],
        字段3 字段3类型 [COMMENT 字段3注释 ],
        ......
        字段n 字段n类型 [COMMENT 字段n注释 ]
        ) [ COMMENT 表注释 ] ;
    2. 数据类型

      1. 数值类型

        类型 大小 有符号(SIGNED)范围 无符号(UNSIGNED)范围 描述
        TINYINT 1 byte (-128, 127) (0, 255) 小整数值
        SMALLINT 2 bytes (-32768, 32767) (0, 65535) 大整数值
        MEDIUMINT 3 bytes (-8388608, 8388607) (0, 16777215) 大整数值
        INT/INTEGER 4 bytes (-2147483648, 2147483647) (0, 4294967295) 大整数值
        BIGINT 8 bytes (-2^63, 2^63-1) (0, 2^64-1) 极大整数值
        FLOAT 4 bytes (-3.402823466 E+38, 3.402823466351 E+38) 0 和 (1.175494351 E-38, 3.402823466 E+38) 单精度浮点数值
        DOUBLE 8 bytes (-1.7976931348623157 E+308, 1.7976931348623157 E+308) 0 和 (2.2250738585072014 E-308, 1.7976931348623157 E+308) 双精度浮点数值
        DECIMAL 依赖于M(精度)和D(标度)的值 依赖于M(精度)和D(标度)的值 依赖于M(精度)和D(标度)的值 小数值(精确定点数)
      2. 字符串类型

        | 类型 | 大小 | 描述 |
        | CHAR | 0-255 bytes | 定长字符串(需要指定长度) |
        | VARCHAR | 0-65535 bytes | 变长字符串(需要指定长度) |
        | TINYBLOB | 0-255 bytes | 不超过255个字符的二进制数据 |
        | TINYTEXT | 0-255 bytes | 短文本字符串 |
        | BLOB | 0-65,535 bytes | 二进制形式的长文本数据 |
        | TEXT | 0-65,535 bytes | 长文本数据 |
        | MEDIUMBLOB | 0-16,777,215 bytes | 二进制形式的中等长度文本数据 |
        | MEDIUMTEXT | 0-16,777,215 bytes | 中等长度文本数据 |
        | LONGBLOB | 0-4,294,967,295 bytes | 二进制形式的极大文本数据 |

        LONGTEXT 0-4,294,967,295 bytes 极大文本数据
      3. 日期时间类型

    3. 修改

      1. 添加字段

        为emp表增加一个新的字段"昵称"为nickname,类型为varchar(20)

        sql 复制代码
        ALTER TABLE emp ADD nickname varchar(20) COMMENT '昵称';
      2. 修改数据类型

        sql 复制代码
        ALTER TABLE 表名 MODIFY 字段名 新数据类型 (长度);
      3. 修改字段名和字段类型
        将emp表的nickname字段修改为username,类型为varchar(30)

        sql 复制代码
        ALTER TABLE emp CHANGE nickname username varchar(30) COMMENT '昵称';
      4. 删除字段
        将emp表的字段username删除

        sql 复制代码
        ALTER TABLE emp DROP username;
      5. 修改表名
        将 emp 表的表名修改为 employee

        sql 复制代码
        ALTER TABLE emp RENAME TO employee;
    4. 删除

      1. 删除表
        如果tb_user表存在,则删除tb_user表

        sql 复制代码
        DROP TABLE IF EXISTS tb_user;
      2. 删除指定表,并重新创建表

        sql 复制代码
        TRUNCATE TABLE 表名;

2. DML

定义: DML(Data Manipulation Language)是数据库管理系统中用于操作数据的语言,属于SQL语言的子集。其主要功能是对数据库中的数据进行增、删、改、查操作。以下是DML的核心操作及示例:

  1. 数据查询(SELECT)

    从表中检索数据:

    sql 复制代码
    SELECT * FROM 员工表 WHERE 部门='研发部';
  2. 数据插入(INSERT)

    向表中添加新记录:

    sql 复制代码
    INSERT INTO 员工表 (姓名, 工号, 部门) VALUES ('张三', 'E1001', '研发部');
  3. 数据更新(UPDATE)

    修改现有记录:

    sql 复制代码
    UPDATE 员工表 SET 薪资=薪资*1.1 WHERE 绩效评级='A';
  4. 数据删除(DELETE)

    移除记录:

    sql 复制代码
    DELETE FROM 员工表 WHERE 离职状态=1;

注意:

  • DML操作对象是数据本身(如记录内容),而非表结构
  • 通常需要事务控制(如 COMMIT/ROLLBACK)保证数据一致性
  • 与DDL(数据定义语言)的区别:
    • DDL操作表结构(如 CREATE TABLE
    • DML操作表内容(如 INSERT 数据)

注:不同数据库系统(如MySQL、Oracle)的DML语法存在细节差异,但核心功能一致。

3. DQL

定义: DQL(Data Query Language)是 SQL 的核心组成部分,专门用于从数据库中检索数据,不涉及数据修改或结构变更。其核心是通过 SELECT 语句实现查询操作。以下是对您提到的内容进行补充,结构清晰、逐步展开。

  1. 基本语法

SELECT 语句的基本语法结构如下:

sql 复制代码
SELECT 列名1, 列名2, ...
FROM 表名;
  • SELECT :指定要检索的列名,使用 * 表示所有列。
  • FROM:指定要查询的表名。
  • 示例:SELECT name, age FROM users; 检索用户表中的姓名和年龄。
  1. 条件查询

条件查询使用 WHERE 子句来过滤数据,基于指定条件返回结果。

sql 复制代码
SELECT 列名
FROM 表名
WHERE 条件;
  • 条件 :可以是比较表达式(如 age > 18)、逻辑运算符(如 AND, OR)或模糊查询(如 LIKE '%张%')。
  • 示例:SELECT * FROM orders WHERE amount > 100 AND status = 'paid'; 检索金额大于100且状态为已支付的订单。
  1. 聚合查询

聚合查询使用聚合函数对数据进行汇总计算,如求和、平均值等。

sql 复制代码
SELECT 聚合函数(列名)
FROM 表名;
  • 常用聚合函数
    • COUNT():统计行数,例如 COUNT(*)
    • SUM():计算总和,例如 SUM(amount)
    • AVG():计算平均值,例如 AVG(score)
    • MAX()MIN():获取最大值和最小值。
  • 示例:SELECT AVG(salary) FROM employees; 计算员工平均工资。
  1. 分组查询

分组查询使用 GROUP BY 子句将数据按指定列分组,常与聚合函数结合。

sql 复制代码
SELECT 列名, 聚合函数(列名)
FROM 表名
GROUP BY 列名;
  • 说明GROUP BY 后跟分组列,SELECT 中的列必须是分组列或聚合函数。
  • HAVING 子句 :用于对分组后的结果进行过滤,类似于 WHERE,但作用于分组。
  • 示例:SELECT department, COUNT(*) FROM employees GROUP BY department HAVING COUNT(*) > 5; 按部门分组,统计每个部门的员工数,并筛选员工数大于5的部门。
  1. 排序查询

排序查询使用 ORDER BY 子句对结果集按指定列排序。

sql 复制代码
SELECT 列名
FROM 表名
ORDER BY 列名 [ASC|DESC];
  • ASC :升序(默认),DESC:降序。
  • 可以按多列排序,用逗号分隔。
  • 示例:SELECT name, score FROM students ORDER BY score DESC; 按分数降序检索学生姓名和分数。
  1. 分页查询

分页查询用于限制返回结果的数量,实现数据分页显示。不同数据库语法略有差异,常见使用 LIMITOFFSET

sql 复制代码
SELECT 列名
FROM 表名
LIMIT 行数 OFFSET 起始位置;
  • LIMIT:指定返回的行数。
  • OFFSET:指定跳过的行数(起始索引)。
  • 在 SQL Server 中,使用 TOPROW_NUMBER();在 Oracle 中,使用 ROWNUM
  • 示例:SELECT * FROM products LIMIT 10 OFFSET 20; 检索产品表第21到30行的数据(每页10条)。
  1. 案例

以下是一个综合案例,展示完整的 DQL 查询,包括条件、聚合、分组、排序和分页。

sql 复制代码
SELECT department, AVG(salary) AS avg_salary
FROM employees
WHERE hire_date > '2020-01-01'
GROUP BY department
HAVING AVG(salary) > 5000
ORDER BY avg_salary DESC
LIMIT 5;
  • 解释:查询2020年后入职的员工,按部门分组计算平均工资,筛选平均工资大于5000的部门,按平均工资降序排序,返回前5个结果。
  1. 执行顺序

SQL 查询的逻辑执行顺序不是按语句顺序,而是按以下步骤处理:

  1. FROM:首先确定查询的表。
  2. WHERE:应用条件过滤行。
  3. GROUP BY:将数据分组。
  4. HAVING:过滤分组后的结果。
  5. SELECT:选择列并计算表达式(包括聚合)。
  6. ORDER BY:对结果排序。
  7. LIMIT/OFFSET:应用分页限制。
  • 注意 :实际执行可能因数据库优化而异,但逻辑顺序固定。例如,在 SELECT AVG(salary) FROM employees WHERE age > 30 GROUP BY department; 中,先过滤年龄大于30的员工,再按部门分组计算平均工资。

4. DCL

定义:DCL(Data Control Language)是 SQL 语言的一个子集,主要用于定义和管理数据库用户的访问权限,确保数据库的安全性和数据的完整性。其主要功能包括:

  1. 授予权限 (GRANT):

    • 用于向用户或角色授予对数据库对象(如表、视图、存储过程)的特定操作权限。

    • 语法:

      sql 复制代码
      GRANT <权限列表> ON <对象名称> TO <用户或角色列表> [WITH GRANT OPTION];
    • 示例:

      sql 复制代码
      -- 授予用户 user1 对表 employees 的 SELECT 权限
      GRANT SELECT ON employees TO user1;
      -- 授予角色 manager 对表 sales 的 SELECT, INSERT, UPDATE 权限,并允许该角色将权限授予他人
      GRANT SELECT, INSERT, UPDATE ON sales TO manager WITH GRANT OPTION;
  2. 撤销权限 (REVOKE):

    • 用于移除之前授予用户或角色的权限。

    • 语法:

      sql 复制代码
      REVOKE [GRANT OPTION FOR] <权限列表> ON <对象名称> FROM <用户或角色列表> [CASCADE | RESTRICT];
    • 示例:

      sql 复制代码
      -- 撤销用户 user1 对表 employees 的 SELECT 权限
      REVOKE SELECT ON employees FROM user1;
      -- 撤销角色 manager 对表 sales 的 INSERT 权限,并级联撤销由该角色授予的其他用户的 INSERT 权限
      REVOKE INSERT ON sales FROM manager CASCADE;

权限查询

要查看当前用户或被管理用户的权限,通常需要查询数据库的系统视图(如 INFORMATION_SCHEMA 中的表,或特定数据库的系统表如 pg_catalog.pg_roles, sys.database_permissions 等)。通用性较高的方法是:

  1. 查看当前用户权限:

    • 使用 SHOW GRANTS 命令(具体语法和支持程度因数据库而异)。

    • 示例 (MySQL/MariaDB 风格):

      sql 复制代码
      SHOW GRANTS FOR CURRENT_USER;
    • 查询系统视图(更通用):

      sql 复制代码
      -- 示例:查询当前用户对某表的所有权限 (概念性查询,实际表名需替换)
      SELECT table_name, privilege_type
      FROM information_schema.table_privileges
      WHERE grantee = CURRENT_USER;
  2. 查看其他用户/角色的权限:

    • 同样通过查询系统视图实现,通常需要管理员权限。

    • 示例 (PostgreSQL 风格):

      sql 复制代码
      -- 查看角色 manager 的权限
      SELECT * FROM pg_catalog.pg_roles WHERE rolname = 'manager';
      -- 查看角色 manager 在表 sales 上的具体权限
      SELECT * FROM information_schema.role_table_grants WHERE grantee = 'manager' AND table_name = 'sales';

关键概念

  • 权限类型 : 常见的包括 SELECT (查询), INSERT (插入), UPDATE (更新), DELETE (删除), REFERENCES (引用约束), EXECUTE (执行存储过程), ALL PRIVILEGES (所有权限)。
  • 对象级别: 权限可以授予在数据库、模式、表、视图、列、存储过程等不同级别的对象上。
  • WITH GRANT OPTION : 允许被授权者将获得的权限再授予其他用户/角色。撤销此类权限时需注意 CASCADE 选项的影响。
  • 角色 (ROLE): 用于权限分组和管理。将权限授予角色,再将角色授予用户,简化权限管理。

注意事项:

  • 权限管理是数据库安全的核心,需谨慎操作。
  • 遵循最小权限原则,只授予必要的权限。
  • 撤销权限时,CASCADE 选项会级联撤销所有依赖该权限的权限,可能影响范围较大,需特别注意。RESTRICT (默认) 则在有依赖时阻止撤销。
相关推荐
杨云龙UP1 小时前
SQL Server 备份异地同步 + 清理脚本
运维·服务器·数据库·sql·mysql·sqlserver
O***Z6161 小时前
Redis——Windows安装
数据库·windows·redis
0***h9422 小时前
MySQL 启动失败 (code=exited, status=1FAILURE) 异常解决方案
数据库·mysql
闲人编程2 小时前
Django测试框架深度使用:Factory Boy与Fixture对比
数据库·python·django·sqlite·钩子·fixture·codecapsule
以明志、2 小时前
并行与并发
前端·数据库·c#
5***V9332 小时前
SQL 基础 BETWEEN 的常见用法
数据库·sql·mybatis
麦聪聊数据3 小时前
IT 的“控”与业务的“放”:构建基于 Web 原生架构的安全数据共享平台
数据库·sql·安全
rchmin3 小时前
MySQL分库分表适用场景与依据
数据库·mysql