跳到主要内容

SQL 基础语法

本章将介绍 SQL 的基本语法规则,包括语句结构、注释和命名规范。

SQL 语句结构

基本规则

SQL 语句的基本规则如下:

  1. 不区分大小写SELECTselect 是等价的(但习惯上关键字用大写)
  2. 语句以分号结尾:多条语句必须用分号分隔
  3. 可以换行:一条语句可以分成多行书写
  4. 忽略多余空格:多个空格等同于一个空格
-- 这三条语句是等价的
SELECT * FROM users;
select * from users;
Select * From Users;

-- 多行写法(推荐)
SELECT
id,
name,
email
FROM users
WHERE age > 18;

关键字

SQL 关键字是保留字,不能用作表名、列名等标识符。常见关键字包括:

分类关键字
数据查询SELECT, FROM, WHERE, ORDER BY, GROUP BY, HAVING
数据操作INSERT, UPDATE, DELETE
数据定义CREATE, ALTER, DROP, TRUNCATE
数据控制GRANT, REVOKE
连接操作JOIN, INNER, LEFT, RIGHT, FULL, ON
集合操作UNION, INTERSECT, EXCEPT
注意

如果必须使用关键字作为标识符,需要用反引号(MySQL)或双引号(标准 SQL)包裹:

-- MySQL
SELECT * FROM `order`;

-- PostgreSQL / Oracle
SELECT * FROM "order";

注释

SQL 支持两种注释方式:

单行注释

使用 -- 开头,从 -- 到行末都是注释:

-- 这是一个单行注释
SELECT * FROM users; -- 这也是注释

多行注释

使用 /* */ 包裹,可以跨越多行:

/*
* 这是一个多行注释
* 可以写很多内容
* 用于解释复杂的 SQL 逻辑
*/
SELECT * FROM users;

标识符命名规范

表名和列名

推荐使用以下命名规范:

  1. 使用小写字母users, order_items
  2. 使用下划线分隔first_name, created_at
  3. 使用有意义的名称:避免 a, b, temp 这样的名称
  4. 避免使用缩写customer_addresscust_addr 更清晰
-- 好的命名
CREATE TABLE order_items (
order_id INT,
product_id INT,
quantity INT,
unit_price DECIMAL(10, 2)
);

-- 不好的命名
CREATE TABLE oi (
oid INT,
pid INT,
qty INT,
up DECIMAL(10, 2)
);

命名约定对比

风格示例说明
snake_caseorder_items推荐,SQL 常用风格
camelCaseorderItems部分团队使用
PascalCaseOrderItemsSQL Server 较常见
全大写ORDER_ITEMSOracle 传统风格

数据库对象

SQL 操作的主要对象包括:

数据库(Database)

数据库是表的集合:

-- 创建数据库
CREATE DATABASE my_app;

-- 使用数据库
USE my_app; -- MySQL
\c my_app; -- PostgreSQL

-- 删除数据库
DROP DATABASE my_app;

表(Table)

表是数据的存储结构,由行和列组成:

-- 创建表
CREATE TABLE users (
id INT PRIMARY KEY,
name VARCHAR(100),
email VARCHAR(200)
);

-- 查看表结构
DESCRIBE users; -- MySQL
\d users; -- PostgreSQL

视图(View)

视图是虚拟表,基于查询结果:

CREATE VIEW active_users AS
SELECT * FROM users WHERE status = 'active';

索引(Index)

索引用于加速查询:

CREATE INDEX idx_email ON users(email);

SQL 语句分类

SQL 语句按功能分为以下几类:

DDL(数据定义语言)

用于定义数据库结构:

-- 创建
CREATE TABLE users (...);

-- 修改
ALTER TABLE users ADD COLUMN age INT;

-- 删除
DROP TABLE users;

DML(数据操作语言)

用于操作数据:

-- 插入
INSERT INTO users VALUES (1, '张三');

-- 更新
UPDATE users SET name = '李四' WHERE id = 1;

-- 删除
DELETE FROM users WHERE id = 1;

DQL(数据查询语言)

用于查询数据:

SELECT * FROM users WHERE age > 18;

DCL(数据控制语言)

用于权限控制:

-- 授权
GRANT SELECT ON users TO user1;

-- 收回权限
REVOKE SELECT ON users FROM user1;

SQL 执行顺序

了解 SQL 的执行顺序有助于理解查询结果:

SELECT DISTINCT column_list
FROM table_name
JOIN another_table ON condition
WHERE row_condition
GROUP BY column_list
HAVING group_condition
ORDER BY column_list
LIMIT count;

执行顺序

  1. FROM - 确定数据来源
  2. JOIN - 连接表
  3. WHERE - 过滤行
  4. GROUP BY - 分组
  5. HAVING - 过滤分组
  6. SELECT - 选择列
  7. DISTINCT - 去重
  8. ORDER BY - 排序
  9. LIMIT - 限制行数

理解执行顺序的重要性:

-- 错误:WHERE 中不能使用 SELECT 中定义的别名
SELECT name AS user_name FROM users WHERE user_name = '张三'; -- 错误

-- 正确:使用原列名
SELECT name AS user_name FROM users WHERE name = '张三';

-- 或者使用子查询
SELECT * FROM (
SELECT name AS user_name FROM users
) t WHERE user_name = '张三';

小结

本章我们学习了:

  1. SQL 语句的基本规则(大小写、分号、换行)
  2. 单行注释和多行注释
  3. 标识符命名规范
  4. 数据库对象的类型
  5. SQL 语句的分类(DDL、DML、DQL、DCL)
  6. SQL 语句的执行顺序

练习

  1. 编写一条多行 SQL 语句,查询 users 表的所有数据
  2. 使用注释解释一条复杂 SQL 语句的作用
  3. 创建一个符合命名规范的表结构