SQL语法手册
SQL(Structured Query Language,结构化查询语言)是用于管理关系型数据库的标准语言,广泛应用于数据的查询、插入、更新、删除和数据库管理。以下是一个简明实用的 SQL 语法手册,涵盖核心语法、常见操作、示例和注意事项,适合初学者快速上手并作为参考。本手册以通用 SQL 标准为基础,兼容大多数数据库(如 MySQL、PostgreSQL、SQL Server、Oracle),并会指出特定数据库的差异。
1. SQL 概述
- 定义:SQL 是一种声明式语言,用于操作关系型数据库中的数据和结构。
- 分类:
- DDL(Data Definition Language):定义数据库结构(如表、模式)。
- DML(Data Manipulation Language):操作数据(如插入、查询、更新、删除)。
- DCL(Data Control Language):定义权限(如 GRANT、REVOKE)。
- TCL(Transaction Control Language):管理事务(如 COMMIT、ROLLBACK)。
- 特点:
- 不区分大小写(但建议关键字大写,表名/字段名依数据库约定)。
- 语句以分号
;
结束(部分数据库可选)。 - 跨平台,但不同数据库(如 MySQL、PostgreSQL)有细微语法差异。
2. 数据库和表操作(DDL)
2.1 创建数据库
CREATE DATABASE database_name;
- 示例:
CREATE DATABASE school;
- 注意:
- MySQL/PostgreSQL 支持,SQL Server 使用
CREATE DATABASE school;
. - 检查数据库是否存在:
CREATE DATABASE IF NOT EXISTS school;
.
2.2 删除数据库
DROP DATABASE database_name;
- 示例:
DROP DATABASE IF EXISTS school;
2.3 创建表
CREATE TABLE table_name (
column1 datatype [constraints],
column2 datatype [constraints],
...
);
- 常见数据类型:
INT
/INTEGER
:整数。VARCHAR(n)
:变长字符串,n 为最大长度。CHAR(n)
:定长字符串。TEXT
:长文本。DATE
/DATETIME
:日期/时间。DECIMAL(m,n)
/NUMERIC(m,n)
:精确小数,m 为总位数,n 为小数位。- 常见约束:
PRIMARY KEY
:主键,唯一标识记录。FOREIGN KEY
:外键,关联其他表。NOT NULL
:非空。UNIQUE
:唯一值。DEFAULT value
:默认值。- 示例:
CREATE TABLE students (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
age INT,
class_id INT,
FOREIGN KEY (class_id) REFERENCES classes(id)
);
- 注意:
AUTO_INCREMENT
(MySQL)或SERIAL
(PostgreSQL)用于自增主键。
2.4 修改表
- 添加列:
ALTER TABLE table_name ADD column_name datatype [constraints];
- 示例:
ALTER TABLE students ADD email VARCHAR(100);
- 修改列:
ALTER TABLE table_name MODIFY COLUMN column_name datatype [constraints];
- 示例:
ALTER TABLE students MODIFY COLUMN age INT DEFAULT 18;
- 删除列:
ALTER TABLE table_name DROP COLUMN column_name;
- 示例:
ALTER TABLE students DROP COLUMN email;
2.5 删除表
DROP TABLE table_name;
- 示例:
DROP TABLE IF EXISTS students;
3. 数据操作(DML)
3.1 插入数据(INSERT)
INSERT INTO table_name (column1, column2, ...) VALUES (value1, value2, ...);
- 单行插入:
INSERT INTO students (name, age, class_id) VALUES ('Alice', 20, 1);
- 多行插入(MySQL/PostgreSQL 支持):
INSERT INTO students (name, age, class_id)
VALUES ('Bob', 21, 1), ('Charlie', 19, 2);
- 插入所有列:
INSERT INTO students VALUES (1, 'Alice', 20, 1);
3.2 查询数据(SELECT)
SELECT column1, column2, ... FROM table_name
[WHERE condition]
[GROUP BY column]
[HAVING condition]
[ORDER BY column [ASC|DESC]]
[LIMIT n [OFFSET m]];
- 基本查询:
SELECT name, age FROM students;
- 查询所有列:
SELECT * FROM students;
- 条件查询:
SELECT name FROM students WHERE age > 18;
- 排序:
SELECT name, age FROM students ORDER BY age DESC;
- 分页(MySQL):
SELECT * FROM students LIMIT 5 OFFSET 10;
- PostgreSQL:
LIMIT 5 OFFSET 10
- SQL Server:
SELECT TOP 5 ...
或OFFSET 10 ROWS FETCH NEXT 5 ROWS ONLY
3.3 更新数据(UPDATE)
UPDATE table_name SET column1 = value1, column2 = value2, ... WHERE condition;
- 示例:
UPDATE students SET age = 21 WHERE id = 1;
- 注意:无
WHERE
条件会更新所有记录,需谨慎。
3.4 删除数据(DELETE)
DELETE FROM table_name WHERE condition;
- 示例:
DELETE FROM students WHERE age < 18;
- 注意:无
WHERE
条件会删除所有记录。
4. 高级查询
4.1 聚合函数
- 常用函数:
COUNT(*)
:统计行数。SUM(column)
:求和。AVG(column)
:平均值。MAX(column)
/MIN(column)
:最大/最小值。- 示例:
SELECT COUNT(*) AS total, AVG(age) AS avg_age FROM students;
4.2 分组(GROUP BY)
SELECT class_id, COUNT(*) AS student_count
FROM students
GROUP BY class_id
HAVING COUNT(*) > 1;
- 说明:按
class_id
分组,统计每组学生数量,筛选数量大于 1 的组。
4.3 连接(JOIN)
- 类型:
INNER JOIN
:匹配的记录。LEFT JOIN
:左表所有记录,右表匹配。RIGHT JOIN
:右表所有记录,左表匹配。FULL JOIN
:两表所有记录(MySQL 不支持,PostgreSQL 支持)。- 示例:
SELECT s.name, c.class_name
FROM students s
INNER JOIN classes c ON s.class_id = c.id;
4.4 子查询
SELECT name
FROM students
WHERE class_id = (SELECT id FROM classes WHERE class_name = 'Math');
- 说明:子查询返回
Math
班的id
,用于筛选学生。
4.5 联合(UNION)
SELECT name FROM students
UNION
SELECT name FROM teachers;
- 说明:合并两表的结果,去除重复记录(
UNION ALL
保留重复)。
5. 事务管理(TCL)
- 事务:一组操作要么全成功,要么全失败。
- 常用命令:
BEGIN
/START TRANSACTION
:开始事务。COMMIT
:提交事务。ROLLBACK
:回滚事务。- 示例:
START TRANSACTION;
INSERT INTO students (name, age) VALUES ('David', 22);
UPDATE students SET age = 23 WHERE name = 'David';
COMMIT;
- 如果出错:
ROLLBACK;
6. 权限管理(DCL)
- 授予权限:
GRANT SELECT, INSERT ON students TO 'user'@'localhost';
- 撤销权限:
REVOKE SELECT ON students FROM 'user'@'localhost';
7. 常见示例
7.1 创建和填充表
CREATE TABLE employees (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
salary DECIMAL(10,2),
dept_id INT
);
INSERT INTO employees (name, salary, dept_id)
VALUES ('Alice', 50000.00, 1), ('Bob', 60000.00, 2);
7.2 复杂查询
SELECT d.dept_name, AVG(e.salary) AS avg_salary
FROM employees e
INNER JOIN departments d ON e.dept_id = d.id
WHERE e.salary > 40000
GROUP BY d.dept_name
HAVING AVG(e.salary) > 50000
ORDER BY avg_salary DESC
LIMIT 2;
8. 数据库特定差异
- MySQL:
- 自增:
AUTO_INCREMENT
。 - 分页:
LIMIT n OFFSET m
。 - 不支持
FULL JOIN
。 - PostgreSQL:
- 自增:
SERIAL
。 - 分页:
LIMIT n OFFSET m
。 - 支持
FULL JOIN
。 - SQL Server:
- 自增:
IDENTITY(1,1)
。 - 分页:
OFFSET n ROWS FETCH NEXT m ROWS ONLY
. - Oracle(旧版本):
- 分页:使用
ROWNUM
或FETCH FIRST n ROWS ONLY
(12c+)。 - 自增:需使用序列(Sequence)。
9. 注意事项
- 性能:
- 使用索引(
CREATE INDEX idx_name ON table(column);
)加速查询。 - 避免
SELECT *
,明确指定需要的列。 - 安全性:
- 防止 SQL 注入,使用预处理语句(如
PreparedStatement
在 Java)。 - 限制用户权限,避免过度授权。
- 规范:
- 表名/字段名建议小写或驼峰式,遵循数据库命名规则。
- 使用注释(
--
或/* */
)提高代码可读性。 - 调试:
- 使用
EXPLAIN
(MySQL/PostgreSQL)分析查询性能。 - 检查错误日志定位问题。
10. 总结
- 核心语法:
- DDL:
CREATE
,ALTER
,DROP
。 - DML:
SELECT
,INSERT
,UPDATE
,DELETE
。 - TCL:
BEGIN
,COMMIT
,ROLLBACK
。 - DCL:
GRANT
,REVOKE
。 - 推荐实践:
- 使用明确列名,避免
SELECT *
。 - 为频繁查询的列添加索引。
- 使用事务确保数据一致性。
- 防范 SQL 注入。
- 学习资源:
- MySQL 官方文档:https://dev.mysql.com/doc/
- PostgreSQL 教程:https://www.postgresql.org/docs/
- W3Schools SQL 教程:https://www.w3schools.com/sql/
如果你需要针对特定数据库(如 MySQL、PostgreSQL)的详细语法、复杂查询示例,或结合编程语言(如 Java、PHP)的 SQL 使用,请告诉我!