标准SQL基础语句-数据操作语言(DML)

73 阅读4分钟

前言

SQL(Structured Query Language)是用于管理关系型数据库的标准语言,主要分为以下几类:

  1. 数据查询语言(DQL) :SELECT
  2. 数据操作语言(DML) :INSERT, UPDATE, DELETE
  3. 数据定义语言(DDL) :CREATE, ALTER, DROP
  4. 数据控制语言(DCL) :GRANT, REVOKE
  5. 事务控制语言(TCL) :COMMIT, ROLLBACK

基础SQL语句-数据操作语言

  1. INSERT

    向表中插入新行

    基本语法:

    -- 形式1:指定列插入
    INSERT INTO 表名 (列1, 列2,...) 
    VALUES (值1, 值2,...);
    
    -- 形式2:全列插入
    INSERT INTO 表名
    VALUES (值1, 值2,...);
    
    -- 形式3:多行插入
    INSERT INTO 表名 (列1, 列2,...)
    VALUES (值1, 值2,...),
           (值3, 值4,...),
           ...;
    
    • 字符串和日期值必须用单引号括起
    • 未指定的列将被设为NULL或默认值
    • 必须为主键列提供唯一值
    • 插入的值必须符合列的数据类型和约束

    练习:

    假设有`employees`表结构:
    CREATE TABLE employees (
        id INT PRIMARY KEY,
        name VARCHAR(50) NOT NULL,
        department VARCHAR(50) DEFAULT '未分配',
        salary DECIMAL(10,2) CHECK (salary > 0),
        hire_date DATE
    );
    请写出SQL语句:
    1.  插入一条完整记录:ID=101,姓名='张三',部门='销售部',薪资=8500,入职日期='2020-05-15'
    2.  插入一条记录,只提供id、name和salary(其他列自动设为默认值或NULL3.  一次性插入两条新员工记录:
        -   ID=102,姓名='李四',薪资=9000
        -   ID=103,姓名='王五',部门='技术部',薪资=12000
    
    1INSERT INTO employees
    VALUES(101,'张三','销售部',8500,'2020-05-15');
    2INSERT INTO employees(id,name,salary)
    VALUES(102,'李四',9000);  -- 改为102避免与第一条记录主键冲突
    3INSERT INTO employees(id,name,department,salary)
    VALUES
        (102,'李四',NULL,9000),  -- 部门用NULL而不是空值
        (103,'王五','技术部',12000);  -- 使用英文单引号
    
    • 空值为NULL
  2. UPDATE

    用于修改表中已存在的记录数据

    基本语法:

    UPDATE table_name
    SET column1 = value1,
        column2 = value2,...
    WHERE condition;
    
    • WHERE子句:指定要更新的记录条件

      • 如果省略WHERE子句,将更新表中的所有记录!
    • SET子句:指定要修改的列和新值

      • 可以更新一个或多个列
      • 可以使用表达式计算新值
    • 支持的操作

      • 直接赋值:SET salary = 5000
      • 基于原值计算:SET salary = salary * 1.1
      • 使用函数:SET name = UPPER(name)
    假设有`employees`表结构:
    CREATE TABLE employees (
        id INT PRIMARY KEY,
        name VARCHAR(50) NOT NULL,
        department VARCHAR(50) DEFAULT '未分配',
        salary DECIMAL(10,2) CHECK (salary > 0),
        hire_date DATE
    );
    1.  将"李四"的部门改为"人力资源部"
    2.  给所有销售部员工加薪15%
    3.2020年之前入职的员工部门标记为"元老团队",薪资增加20001. 
    UPDATE employees
    SET department = '人力资源部'
    WHERE name = '李四';
    
    2. 
    UPDATE employees
    SET salary = ROUND(salary * 1.15, 2)
    WHERE department = '销售部';
    
    3. 
    UPDATE employees
    SET department = '元老团队', salary = salary + 2000
    WHERE hire_date < '2020-01-01';
    

    2.1. 安全第一:执行UPDATE前先用SELECT验证WHERE条件

    ```
    SELECT * FROM employees WHERE department = '技术部';  -- 先确认
    UPDATE employees SET salary = salary * 1.1 WHERE department = '技术部';
    ```
    

    2.2. 事务使用:重要更新应在事务中进行

    ```
    BEGIN TRANSACTION;
    UPDATE accounts SET balance = balance - 100 WHERE id = 1;
    UPDATE accounts SET balance = balance + 100 WHERE id = 2;
    COMMIT;  -- 或ROLLBACK如果出错
    ```
    

    2.3. 性能考虑:大量数据更新时可能锁表,可以考虑分批更新

  3. DELETE

    从表中删除记录

    基本语法:

    DELETE FROM table_name
    WHERE condition;
    

    关键要点

    • WHERE子句

      • 指定要删除的记录条件
      • 如果省略WHERE子句,将删除表中的所有记录!
    • 删除机制

      • 只删除数据,不删除表结构
      • 自增计数器不会被重置(与TRUNCATE不同)
    • 可恢复性

      • 在事务中可以回滚删除操作
      • 提交事务后无法恢复(除非有备份)

    练习:

    继续使用employees表,请写出SQL语句:
    1.  删除id为103的员工记录
    2.  删除薪资低于8000的所有员工
    3.  删除部门为"测试部"且入职时间在2023年之后的员工
    1. 
    DELETE FROM employees WHERE id = 103;
    2. 
    DELETE FROM employees WHERE salary < 8000;
    3. 
    DELETE FROM employees 
    WHERE department = '测试部' AND hire_date > '2023-01-01';
    

    安全建议:

    • 生产环境执行DELETE前,建议先用SELECT验证:

      SELECT * FROM employees 
      WHERE department = '测试部' AND hire_date > '2023-01-01';
      
    • 重要删除操作应在事务中进行:

      BEGIN TRANSACTION;
      DELETE FROM employees WHERE ...;
      -- 确认无误后
      COMMIT;
      -- 或发现问题时
      ROLLBACK;
      
    • 考虑添加LIMIT限制删除数量(MySQL语法):

      DELETE FROM employees WHERE salary < 8000 LIMIT 100;  -- 每次只删100条