SQL 基础语法
本章将介绍 SQL 的基本语法规则,包括语句结构、注释和命名规范。
SQL 语句结构
基本规则
SQL 语句的基本规则如下:
- 不区分大小写:
SELECT和select是等价的(但习惯上关键字用大写) - 语句以分号结尾:多条语句必须用分号分隔
- 可以换行:一条语句可以分成多行书写
- 忽略多余空格:多个空格等同于一个空格
-- 这三条语句是等价的
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;
标识符命名规范
表名和列名
推荐使用以下命名规范:
- 使用小写字母:
users,order_items - 使用下划线分隔:
first_name,created_at - 使用有意义的名称:避免
a,b,temp这样的名称 - 避免使用缩写:
customer_address比cust_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_case | order_items | 推荐,SQL 常用风格 |
| camelCase | orderItems | 部分团队使用 |
| PascalCase | OrderItems | SQL Server 较常见 |
| 全大写 | ORDER_ITEMS | Oracle 传统风格 |
数据库对象
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;
执行顺序:
FROM- 确定数据来源JOIN- 连接表WHERE- 过滤行GROUP BY- 分组HAVING- 过滤分组SELECT- 选择列DISTINCT- 去重ORDER BY- 排序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 = '张三';
小结
本章我们学习了:
- SQL 语句的基本规则(大小写、分号、换行)
- 单行注释和多行注释
- 标识符命名规范
- 数据库对象的类型
- SQL 语句的分类(DDL、DML、DQL、DCL)
- SQL 语句的执行顺序
练习
- 编写一条多行 SQL 语句,查询 users 表的所有数据
- 使用注释解释一条复杂 SQL 语句的作用
- 创建一个符合命名规范的表结构