SQL语言根据功能可分为四类:DDL、DML、DQL、DCL。下面是详细的分类说明和使用示例:
一、DDL(数据定义语言)
作用:定义和管理数据库对象(表、索引、视图等结构)
常用语句:
-- 创建数据库
CREATE DATABASE mydb;
-- 使用数据库
USE mydb;
-- 创建表
CREATE TABLE employees (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100) NOT NULL,
age INT,
department VARCHAR(50),
salary DECIMAL(10, 2),
hire_date DATE
);
-- 修改表结构
ALTER TABLE employees
ADD COLUMN email VARCHAR(100);
-- 修改列
ALTER TABLE employees
MODIFY COLUMN name VARCHAR(150);
-- 删除列
ALTER TABLE employees
DROP COLUMN age;
-- 重命名表
RENAME TABLE employees TO staff;
-- 删除表
DROP TABLE staff;
-- 创建索引
CREATE INDEX idx_department ON employees(department);
-- 删除索引
DROP INDEX idx_department ON employees;
二、DML(数据操作语言)
作用:对表中的数据进行增删改操作
常用语句:
-- 插入数据
INSERT INTO employees (name, department, salary, hire_date)
VALUES
('张三', '技术部', 15000.00, '2023-01-15'),
('李四', '市场部', 12000.00, '2023-03-20');
-- 更新数据
UPDATE employees
SET salary = salary * 1.1 -- 涨薪10%
WHERE department = '技术部';
-- 删除数据
DELETE FROM employees
WHERE hire_date < '2020-01-01';
-- 清空表(删除所有数据)
TRUNCATE TABLE employees; -- 比DELETE快,不可回滚
三、DQL(数据查询语言)
作用:查询数据库中的数据
常用语句:
-- 基本查询
SELECT * FROM employees;
-- 选择特定列
SELECT name, department, salary FROM employees;
-- 条件查询
SELECT * FROM employees
WHERE salary > 10000 AND department = '技术部';
-- 排序
SELECT * FROM employees
ORDER BY salary DESC, name ASC;
-- 分组聚合
SELECT
department,
COUNT(*) as employee_count,
AVG(salary) as avg_salary,
SUM(salary) as total_salary
FROM employees
GROUP BY department;
-- 分组后筛选
SELECT department, AVG(salary)
FROM employees
GROUP BY department
HAVING AVG(salary) > 10000;
-- 连接查询
SELECT
e.name,
e.salary,
d.department_name
FROM employees e
JOIN departments d ON e.department_id = d.id;
-- 子查询
SELECT name, salary
FROM employees
WHERE salary > (
SELECT AVG(salary) FROM employees
);
-- 分页查询
SELECT * FROM employees
LIMIT 10 OFFSET 20; -- MySQL
-- 或
SELECT * FROM employees
OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY; -- SQL标准
四、DCL(数据控制语言)
作用:控制数据库访问权限和事务
常用语句:
-- 创建用户
CREATE USER 'user1'@'localhost' IDENTIFIED BY 'password123';
-- 授予权限
GRANT SELECT, INSERT ON mydb.employees TO 'user1'@'localhost';
-- 授予所有权限
GRANT ALL PRIVILEGES ON mydb.* TO 'user1'@'localhost';
-- 撤销权限
REVOKE INSERT ON mydb.employees FROM 'user1'@'localhost';
-- 删除用户
DROP USER 'user1'@'localhost';
-- 提交事务
COMMIT;
-- 回滚事务
ROLLBACK;
-- 设置保存点
SAVEPOINT sp1;
-- 回滚到保存点
ROLLBACK TO sp1;
使用场景总结
| 分类 |
主要用途 |
常用语句 |
特点 |
|---|
| DDL |
定义结构 |
CREATE, ALTER, DROP, TRUNCATE |
自动提交,不可回滚 |
| DML |
操作数据 |
INSERT, UPDATE, DELETE |
需要显式提交,可回滚 |
| DQL |
查询数据 |
SELECT |
只读操作,不影响数据 |
| DCL |
控制权限 |
GRANT, REVOKE, COMMIT, ROLLBACK |
管理访问和事务 |
实战示例
-- 1. 创建数据库和表(DDL)
CREATE DATABASE company;
USE company;
CREATE TABLE departments (
dept_id INT PRIMARY KEY,
dept_name VARCHAR(50) NOT NULL
);
CREATE TABLE employees (
emp_id INT PRIMARY KEY AUTO_INCREMENT,
emp_name VARCHAR(100) NOT NULL,
dept_id INT,
salary DECIMAL(10, 2),
FOREIGN KEY (dept_id) REFERENCES departments(dept_id)
);
-- 2. 插入数据(DML)
INSERT INTO departments VALUES
(1, '技术部'),
(2, '市场部'),
(3, '财务部');
INSERT INTO employees (emp_name, dept_id, salary) VALUES
('王五', 1, 8000.00),
('赵六', 2, 7500.00),
('孙七', 1, 9000.00);
-- 3. 查询数据(DQL)
SELECT
d.dept_name,
COUNT(e.emp_id) as emp_count,
AVG(e.salary) as avg_salary
FROM departments d
LEFT JOIN employees e ON d.dept_id = e.dept_id
GROUP BY d.dept_id
HAVING AVG(e.salary) > 7000
ORDER BY avg_salary DESC;
-- 4. 创建视图(DDL)
CREATE VIEW high_salary_employees AS
SELECT emp_name, salary, dept_name
FROM employees e
JOIN departments d ON e.dept_id = d.dept_id
WHERE salary > 8000;
-- 5. 事务控制(DCL)
START TRANSACTION;
UPDATE employees
SET salary = salary * 1.05
WHERE dept_id = 1;
-- 如果检查无误则提交
COMMIT;
-- 如果发现问题则回滚
-- ROLLBACK;
-- 6. 权限管理(DCL)
GRANT SELECT, UPDATE ON company.employees TO 'manager'@'localhost';
REVOKE UPDATE ON company.employees FROM 'assistant'@'localhost';
注意事项
DDL语句执行后通常自动提交,无法回滚
DML语句需要显式提交(除非设置自动提交)
TRUNCATE vs DELETE:TRUNCATE更快但不可回滚
GRANT/REVOKE需要管理员权限
不同的数据库系统可能有语法差异
这些分类帮助开发者更好地组织SQL代码,理解不同语句的作用和使用场景。