前言
SQL(Structured Query Language)是用于管理关系型数据库的标准语言,主要分为以下几类:
- 数据查询语言(DQL) :SELECT
- 数据操作语言(DML) :INSERT, UPDATE, DELETE
- 数据定义语言(DDL) :CREATE, ALTER, DROP
- 数据控制语言(DCL) :GRANT, REVOKE
- 事务控制语言(TCL) :COMMIT, ROLLBACK
基础SQL语句-数据操作语言
-
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(其他列自动设为默认值或NULL) 3. 一次性插入两条新员工记录: - ID=102,姓名='李四',薪资=9000 - ID=103,姓名='王五',部门='技术部',薪资=12000 1、INSERT INTO employees VALUES(101,'张三','销售部',8500,'2020-05-15'); 2、INSERT INTO employees(id,name,salary) VALUES(102,'李四',9000); -- 改为102避免与第一条记录主键冲突 3、INSERT INTO employees(id,name,department,salary) VALUES (102,'李四',NULL,9000), -- 部门用NULL而不是空值 (103,'王五','技术部',12000); -- 使用英文单引号- 空值为NULL
-
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年之前入职的员工部门标记为"元老团队",薪资增加2000元 1. 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. 性能考虑:大量数据更新时可能锁表,可以考虑分批更新
-
-
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条
-