【SQL】SQL 命令大全
SQL 命令大全,涵盖从基础到高级的各种 SQL 操作:
文章目录
- SQL 分类概览
- 一、数据定义语言 (DDL)
- 数据库操作
- 表操作
- 索引操作
- 二、数据操作语言 (DML)
- 插入数据
- 更新数据
- 删除数据
- 三、数据查询语言 (DQL)
- 基础查询
- WHERE 条件查询
- 排序和限制
- 聚合函数
- 连接查询
- 子查询
- 四、数据控制语言 (DCL)
- 用户和权限管理
- 五、事务控制语言 (TCL)
- 事务管理
- 六、高级 SQL 功能
- 视图 (Views)
- 存储过程 (Stored Procedures)
- 函数 (Functions)
- 触发器 (Triggers)
- 七、窗口函数 (Window Functions)
- 八、常用实用查询
- 分页查询
- 递归查询 (CTE)
- 条件查询
- 九、数据库维护
- 备份和恢复
SQL 分类概览
- 数据定义语言 (DDL)
- 数据操作语言 (DML)
- 数据查询语言 (DQL)
- 数据控制语言 (DCL)
- 事务控制语言 (TCL)
一、数据定义语言 (DDL)
数据库操作
-- 创建数据库
CREATE DATABASE database_name;
CREATE DATABASE IF NOT EXISTS company;-- 选择数据库
USE database_name;-- 删除数据库
DROP DATABASE database_name;
DROP DATABASE IF EXISTS company;-- 显示所有数据库
SHOW DATABASES;
表操作
-- 创建表
CREATE TABLE employees (id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(100) NOT NULL,email VARCHAR(100) UNIQUE,age INT CHECK (age >= 18),salary DECIMAL(10,2),department_id INT,hire_date DATE DEFAULT CURRENT_DATE,FOREIGN KEY (department_id) REFERENCES departments(id)
);CREATE TABLE departments (id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(100) NOT NULL,location VARCHAR(100)
);-- 删除表
DROP TABLE employees;
DROP TABLE IF EXISTS employees;-- 清空表数据
TRUNCATE TABLE employees;-- 修改表结构
ALTER TABLE employees ADD COLUMN phone VARCHAR(15);
ALTER TABLE employees DROP COLUMN phone;
ALTER TABLE employees MODIFY COLUMN name VARCHAR(150);
ALTER TABLE employees RENAME COLUMN name TO full_name;
ALTER TABLE employees RENAME TO staff;-- 显示表结构
DESCRIBE employees;
DESC employees;
SHOW COLUMNS FROM employees;
索引操作
-- 创建索引
CREATE INDEX idx_name ON employees(name);
CREATE UNIQUE INDEX idx_email ON employees(email);
CREATE INDEX idx_dept_salary ON employees(department_id, salary);-- 删除索引
DROP INDEX idx_name ON employees;
二、数据操作语言 (DML)
插入数据
-- 插入单条记录
INSERT INTO employees (name, email, age, salary, department_id)
VALUES ('张三', 'zhangsan@email.com', 25, 5000.00, 1);-- 插入多条记录
INSERT INTO employees (name, email, age, salary, department_id)
VALUES ('李四', 'lisi@email.com', 30, 6000.00, 1),('王五', 'wangwu@email.com', 28, 5500.00, 2);-- 插入查询结果
INSERT INTO employee_backup
SELECT * FROM employees WHERE salary > 5000;
更新数据
-- 更新记录
UPDATE employees
SET salary = salary * 1.1
WHERE department_id = 1;UPDATE employees
SET salary = 6000, age = 31
WHERE name = '张三';-- 使用子查询更新
UPDATE employees
SET salary = (SELECT AVG(salary) FROM employees)
WHERE salary < 5000;
删除数据
-- 删除记录
DELETE FROM employees WHERE id = 5;
DELETE FROM employees WHERE salary < 3000;-- 删除所有记录
DELETE FROM employees;-- 使用子查询删除
DELETE FROM employees
WHERE department_id IN (SELECT id FROM departments WHERE location = '北京'
);
三、数据查询语言 (DQL)
基础查询
-- 查询所有列
SELECT * FROM employees;-- 查询特定列
SELECT name, email, salary FROM employees;-- 去重查询
SELECT DISTINCT department_id FROM employees;-- 列别名
SELECT name AS 姓名, salary AS 月薪 FROM employees;
SELECT name 姓名, salary 月薪 FROM employees;
WHERE 条件查询
-- 比较运算符
SELECT * FROM employees WHERE salary > 5000;
SELECT * FROM employees WHERE age BETWEEN 25 AND 35;
SELECT * FROM employees WHERE name LIKE '张%';
SELECT * FROM employees WHERE email LIKE '%@gmail.com';
SELECT * FROM employees WHERE name LIKE '_三%';-- IN 操作符
SELECT * FROM employees WHERE department_id IN (1, 3, 5);
SELECT * FROM employees WHERE name IN ('张三', '李四');-- NULL 值判断
SELECT * FROM employees WHERE email IS NULL;
SELECT * FROM employees WHERE email IS NOT NULL;-- 组合条件
SELECT * FROM employees
WHERE salary > 5000 AND age < 35;
SELECT * FROM employees
WHERE department_id = 1 OR department_id = 2;
SELECT * FROM employees
WHERE NOT (salary < 3000);
排序和限制
-- 排序
SELECT * FROM employees ORDER BY salary DESC;
SELECT * FROM employees ORDER BY department_id ASC, salary DESC;-- 限制结果集
SELECT * FROM employees LIMIT 10;
SELECT * FROM employees LIMIT 5, 10; -- 跳过5条,取10条
SELECT * FROM employees ORDER BY salary DESC LIMIT 3;
聚合函数
-- 常用聚合函数
SELECT COUNT(*) FROM employees;
SELECT COUNT(DISTINCT department_id) FROM employees;
SELECT AVG(salary) AS 平均工资 FROM employees;
SELECT MAX(salary) AS 最高工资, MIN(salary) AS 最低工资 FROM employees;
SELECT SUM(salary) AS 工资总额 FROM employees;-- 分组统计
SELECT department_id, COUNT(*) AS 人数, AVG(salary) AS 平均工资
FROM employees
GROUP BY department_id;-- HAVING 子句
SELECT department_id, AVG(salary) AS 平均工资
FROM employees
GROUP BY department_id
HAVING AVG(salary) > 5000;
连接查询
-- 内连接
SELECT e.name, d.name AS department_name
FROM employees e
INNER JOIN departments d ON e.department_id = d.id;-- 左连接
SELECT e.name, d.name AS department_name
FROM employees e
LEFT JOIN departments d ON e.department_id = d.id;-- 右连接
SELECT e.name, d.name AS department_name
FROM employees e
RIGHT JOIN departments d ON e.department_id = d.id;-- 全外连接
SELECT e.name, d.name AS department_name
FROM employees e
FULL OUTER JOIN departments d ON e.department_id = d.id;-- 自连接
SELECT e1.name AS 员工, e2.name AS 经理
FROM employees e1
LEFT JOIN employees e2 ON e1.manager_id = e2.id;-- 多表连接
SELECT e.name, d.name AS department, p.name AS project
FROM employees e
JOIN departments d ON e.department_id = d.id
JOIN projects p ON e.department_id = p.department_id;
子查询
-- 标量子查询
SELECT name, salary, (SELECT AVG(salary) FROM employees) AS 平均工资
FROM employees;-- IN 子查询
SELECT name FROM employees
WHERE department_id IN (SELECT id FROM departments WHERE location = '北京'
);-- EXISTS 子查询
SELECT name FROM departments d
WHERE EXISTS (SELECT 1 FROM employees e WHERE e.department_id = d.id AND e.salary > 8000
);-- 比较子查询
SELECT name, salary FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);
四、数据控制语言 (DCL)
用户和权限管理
-- 创建用户
CREATE USER 'username'@'localhost' IDENTIFIED BY 'password';
CREATE USER 'john'@'%' IDENTIFIED BY 'password123';-- 删除用户
DROP USER 'username'@'localhost';-- 授予权限
GRANT SELECT, INSERT ON database.table TO 'username'@'localhost';
GRANT ALL PRIVILEGES ON company.* TO 'admin'@'%';-- 撤销权限
REVOKE INSERT ON database.table FROM 'username'@'localhost';
REVOKE ALL PRIVILEGES ON company.* FROM 'admin'@'%';-- 查看权限
SHOW GRANTS FOR 'username'@'localhost';-- 刷新权限
FLUSH PRIVILEGES;
五、事务控制语言 (TCL)
事务管理
-- 开始事务
START TRANSACTION;
BEGIN;-- 提交事务
COMMIT;-- 回滚事务
ROLLBACK;-- 设置保存点
SAVEPOINT savepoint_name;-- 回滚到保存点
ROLLBACK TO savepoint_name;-- 事务示例
START TRANSACTION;UPDATE accounts SET balance = balance - 1000 WHERE id = 1;
UPDATE accounts SET balance = balance + 1000 WHERE id = 2;-- 如果发生错误
-- ROLLBACK;COMMIT;
六、高级 SQL 功能
视图 (Views)
-- 创建视图
CREATE VIEW high_salary_employees AS
SELECT name, salary, department_id
FROM employees
WHERE salary > 5000;-- 使用视图
SELECT * FROM high_salary_employees;-- 修改视图
CREATE OR REPLACE VIEW high_salary_employees AS
SELECT name, salary, department_id, hire_date
FROM employees
WHERE salary > 6000;-- 删除视图
DROP VIEW high_salary_employees;
存储过程 (Stored Procedures)
-- 创建存储过程
DELIMITER //
CREATE PROCEDURE GetEmployeeCount(IN dept_id INT, OUT emp_count INT)
BEGINSELECT COUNT(*) INTO emp_count FROM employees WHERE department_id = dept_id;
END //
DELIMITER ;-- 调用存储过程
CALL GetEmployeeCount(1, @count);
SELECT @count;
函数 (Functions)
-- 创建函数
DELIMITER //
CREATE FUNCTION GetDepartmentName(emp_id INT)
RETURNS VARCHAR(100)
READS SQL DATA
BEGINDECLARE dept_name VARCHAR(100);SELECT d.name INTO dept_nameFROM employees eJOIN departments d ON e.department_id = d.idWHERE e.id = emp_id;RETURN dept_name;
END //
DELIMITER ;-- 使用函数
SELECT name, GetDepartmentName(id) AS department FROM employees;
触发器 (Triggers)
-- 创建触发器
DELIMITER //
CREATE TRIGGER before_employee_insert
BEFORE INSERT ON employees
FOR EACH ROW
BEGINIF NEW.salary < 0 THENSET NEW.salary = 0;END IF;
END //
DELIMITER ;-- 删除触发器
DROP TRIGGER before_employee_insert;
七、窗口函数 (Window Functions)
-- 排名函数
SELECT name, salary,RANK() OVER (ORDER BY salary DESC) AS salary_rank,DENSE_RANK() OVER (ORDER BY salary DESC) AS dense_rank,ROW_NUMBER() OVER (ORDER BY salary DESC) AS row_num
FROM employees;-- 分区窗口函数
SELECT name, department_id, salary,AVG(salary) OVER (PARTITION BY department_id) AS dept_avg_salary,SUM(salary) OVER (PARTITION BY department_id) AS dept_total_salary
FROM employees;-- 移动平均
SELECT name, hire_date, salary,AVG(salary) OVER (ORDER BY hire_date ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) AS moving_avg
FROM employees;
八、常用实用查询
分页查询
-- MySQL 分页
SELECT * FROM employees ORDER BY id LIMIT 10 OFFSET 20;-- SQL Server 分页
SELECT * FROM employees
ORDER BY id
OFFSET 20 ROWS
FETCH NEXT 10 ROWS ONLY;-- Oracle 分页
SELECT * FROM (SELECT e.*, ROWNUM rn FROM employees e WHERE ROWNUM <= 30
) WHERE rn > 20;
递归查询 (CTE)
-- 通用表表达式
WITH RECURSIVE EmployeeHierarchy AS (-- 锚点成员SELECT id, name, manager_id, 1 AS levelFROM employeesWHERE manager_id IS NULLUNION ALL-- 递归成员SELECT e.id, e.name, e.manager_id, eh.level + 1FROM employees eINNER JOIN EmployeeHierarchy eh ON e.manager_id = eh.id
)
SELECT * FROM EmployeeHierarchy;
条件查询
-- CASE 表达式
SELECT name, salary,CASE WHEN salary < 3000 THEN '低'WHEN salary BETWEEN 3000 AND 6000 THEN '中'ELSE '高'END AS salary_level
FROM employees;-- COALESCE 和 NULLIF
SELECT name, COALESCE(email, '无邮箱') AS email,NULLIF(salary, 0) AS salary -- 如果salary为0则返回NULL
FROM employees;
九、数据库维护
备份和恢复
-- 备份表
CREATE TABLE employees_backup AS SELECT * FROM employees;-- 优化表
OPTIMIZE TABLE employees;-- 分析表
ANALYZE TABLE employees;-- 检查表
CHECK TABLE employees;
这个 SQL 命令大全涵盖了从基础到高级的各种操作,可以作为日常开发和数据库管理的参考手册。