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(旧版本):
  • 分页:使用 ROWNUMFETCH 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 使用,请告诉我!

类似文章

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注