SQL 基础语法
掌握了数据库的基本概念后,现在开始学习 SQL 的基础语法。本章将介绍 SQL 的核心语法规则,包括语句结构、注释、标识符等。
SQL 语句的基本结构
标准格式
SQL 语句通常由以下几个部分组成:
sql
SELECT column1, column2 -- 选择要查询的列
FROM table_name -- 指定要查询的表
WHERE condition -- 添加过滤条件
GROUP BY column -- 分组
HAVING condition -- 分组后的过滤条件
ORDER BY column -- 排序
LIMIT number; -- 限制结果数量语句特点
- 不区分大小写:
SELECT和select是相同的 - 以分号结束:每条 SQL 语句以
;结尾 - 多行书写:SQL 语句可以跨多行书写
- 缩进格式:合理的缩进提高可读性
SQL 语句的分类
1. DDL(数据定义语言)
用于定义数据库结构:
sql
-- 创建数据库
CREATE DATABASE mydb;
-- 创建表
CREATE TABLE users (
id INT PRIMARY KEY,
name VARCHAR(50)
);
-- 修改表
ALTER TABLE users ADD COLUMN age INT;
-- 删除表
DROP TABLE users;2. DML(数据操作语言)
用于操作表中的数据:
sql
-- 查询数据
SELECT * FROM users;
-- 插入数据
INSERT INTO users (id, name) VALUES (1, '张三');
-- 更新数据
UPDATE users SET name = '李四' WHERE id = 1;
-- 删除数据
DELETE FROM users WHERE id = 1;3. DCL(数据控制语言)
用于控制访问权限:
sql
-- 授予权限
GRANT SELECT ON users TO 'user1'@'localhost';
-- 撤销权限
REVOKE SELECT ON users FROM 'user1'@'localhost';4. TCL(事务控制语言)
用于管理事务:
sql
-- 开始事务
START TRANSACTION;
-- 提交事务
COMMIT;
-- 回滚事务
ROLLBACK;SQL 注释
单行注释
使用 -- 或 #:
sql
-- 这是一个单行注释
SELECT * FROM users;
# 这也是单行注释
SELECT name FROM users;多行注释
使用 /* ... */:
sql
/*
这是一个多行注释
可以包含多行文字
用于解释复杂的 SQL 语句
*/
SELECT id, name, age
FROM users
WHERE age > 18;注释的最佳实践
sql
-- 查询所有18岁以上的用户
SELECT
id, -- 用户ID
name, -- 用户名
age, -- 年龄
city -- 城市
FROM users
WHERE age > 18; -- 过滤条件SQL 标识符
标识符规则
标识符是数据库对象(表名、列名等)的名称,需要遵循以下规则:
- 可以包含字母、数字和下划线
- 必须以字母或下划线开头
- 不能使用保留字
- 区分大小写(取决于数据库配置)
命名建议
sql
-- 好的命名
user_id
order_date
product_name
total_amount
-- 不推荐的命名
userId -- 驼峰命名
order-date -- 使用连字符
123_column -- 数字开头
table -- 保留字使用引号处理特殊名称
如果需要使用保留字或包含特殊字符的名称,使用引号:
sql
-- MySQL 使用反引号
SELECT `order` FROM `table`;
-- SQL Server 使用方括号
SELECT [order] FROM [table];
-- PostgreSQL 使用双引号
SELECT "order" FROM "table";常用关键字
查询相关
| 关键字 | 说明 | 示例 |
|---|---|---|
| SELECT | 选择数据 | SELECT * FROM users |
| FROM | 指定表 | FROM users |
| WHERE | 过滤条件 | WHERE age > 18 |
| GROUP BY | 分组 | GROUP BY city |
| HAVING | 分组过滤 | HAVING COUNT(*) > 10 |
| ORDER BY | 排序 | ORDER BY name |
| LIMIT | 限制结果 | LIMIT 10 |
数据定义相关
| 关键字 | 说明 | 示例 |
|---|---|---|
| CREATE | 创建 | CREATE TABLE users |
| ALTER | 修改 | ALTER TABLE users |
| DROP | 删除 | DROP TABLE users |
| TRUNCATE | 清空表 | TRUNCATE TABLE users |
数据操作相关
| 关键字 | 说明 | 示例 |
|---|---|---|
| INSERT | 插入 | INSERT INTO users VALUES |
| UPDATE | 更新 | UPDATE users SET name = '...' |
| DELETE | 删除 | DELETE FROM users |
约束相关
| 关键字 | 说明 | 示例 |
|---|---|---|
| PRIMARY KEY | 主键 | id INT PRIMARY KEY |
| FOREIGN KEY | 外键 | FOREIGN KEY (user_id) |
| UNIQUE | 唯一 | email VARCHAR(100) UNIQUE |
| NOT NULL | 非空 | name VARCHAR(50) NOT NULL |
| DEFAULT | 默认值 | age INT DEFAULT 0 |
SQL 语句执行顺序
逻辑执行顺序
SQL 语句的逻辑执行顺序与书写顺序不同:
sql
SELECT -- 5. 选择列
FROM -- 1. 指定表
WHERE -- 2. 过滤行
GROUP BY -- 3. 分组
HAVING -- 4. 过滤分组
ORDER BY -- 6. 排序
LIMIT -- 7. 限制数量示例
sql
-- 执行顺序
SELECT city, COUNT(*) as user_count -- 5. 计算每个城市的用户数
FROM users -- 1. 从用户表
WHERE age >= 18 -- 2. 筛选18岁以上
GROUP BY city -- 3. 按城市分组
HAVING user_count > 5 -- 4. 只显示用户数大于5的城市
ORDER BY user_count DESC -- 6. 按用户数降序排列
LIMIT 5; -- 7. 只显示前5条SQL 运算符
算术运算符
sql
-- 基本运算
SELECT price * quantity -- 乘法
SELECT price + discount -- 加法
SELECT price - discount -- 减法
SELECT price / quantity -- 除法
SELECT price % 2 -- 取模比较运算符
sql
-- 比较运算
WHERE age = 18 -- 等于
WHERE age != 18 -- 不等于
WHERE age > 18 -- 大于
WHERE age < 18 -- 小于
WHERE age >= 18 -- 大于等于
WHERE age <= 18 -- 小于等于逻辑运算符
sql
-- 逻辑运算
WHERE age > 18 AND city = '北京' -- 逻辑与
WHERE age > 18 OR city = '北京' -- 逻辑或
WHERE NOT (age > 18) -- 逻辑非范围和集合运算符
sql
-- 范围运算
WHERE age BETWEEN 18 AND 30 -- 范围查询
WHERE city IN ('北京', '上海') -- 集合查询
WHERE name LIKE '张%' -- 模糊匹配
WHERE email IS NULL -- 判断为空
WHERE email IS NOT NULL -- 判断不为空字符串处理
字符串拼接
sql
-- MySQL 使用 CONCAT
SELECT CONCAT(name, ' - ', city) FROM users;
-- PostgreSQL 使用 ||
SELECT name || ' - ' || city FROM users;
-- SQL Server 使用 +
SELECT name + ' - ' + city FROM users;字符串大小写
sql
-- 转换为大写
SELECT UPPER(name) FROM users;
-- 转换为小写
SELECT LOWER(name) FROM users;字符串长度
sql
-- 获取字符串长度
SELECT LENGTH(name) FROM users;字符串截取
sql
-- 截取字符串
SELECT SUBSTRING(name, 1, 3) FROM users; -- 从第1个字符开始,取3个字符日期时间处理
当前日期时间
sql
-- 获取当前日期时间
SELECT NOW(); -- MySQL
SELECT CURRENT_TIMESTAMP; -- PostgreSQL
SELECT GETDATE(); -- SQL Server日期计算
sql
-- MySQL
SELECT DATE_ADD(NOW(), INTERVAL 7 DAY); -- 7天后
SELECT DATE_SUB(NOW(), INTERVAL 7 DAY); -- 7天前
-- PostgreSQL
SELECT NOW() + INTERVAL '7 days'; -- 7天后
SELECT NOW() - INTERVAL '7 days'; -- 7天前日期格式化
sql
-- MySQL
SELECT DATE_FORMAT(NOW(), '%Y-%m-%d'); -- 2024-01-15
-- PostgreSQL
SELECT TO_CHAR(NOW(), 'YYYY-MM-DD'); -- 2024-01-15NULL 值处理
NULL 的特性
- NULL 表示"未知"或"不存在"
- NULL 不等于任何值,包括 NULL
- 数学运算中,NULL + 任何值 = NULL
NULL 判断
sql
-- 检查 NULL
WHERE email IS NULL
-- 检查非 NULL
WHERE email IS NOT NULLNULL 的运算
sql
-- COALESCE 函数:返回第一个非 NULL 值
SELECT COALESCE(email, '未填写') FROM users;
-- NULLIF 函数:如果两个参数相等,返回 NULL
SELECT NULLIF(price, 0) FROM products;
-- 处理 NULL 的数学运算
SELECT price * quantity * COALESCE(discount, 1) FROM orders;数据类型转换
CAST 函数
sql
-- 转换数据类型
SELECT CAST('123' AS INT); -- 字符串转整数
SELECT CAST(123 AS VARCHAR(10)); -- 整数转字符串
SELECT CAST('2024-01-15' AS DATE); -- 字符串转日期类型转换函数
sql
-- MySQL
SELECT CONVERT('123', INT);
-- PostgreSQL
SELECT '123'::INT;
-- SQL Server
SELECT CONVERT(INT, '123');SQL 语句的最佳实践
1. 使用有意义的别名
sql
-- 好
SELECT
u.name AS user_name,
o.order_date,
COUNT(o.id) AS order_count
FROM users u
JOIN orders o ON u.id = o.user_id;
-- 不好
SELECT
a.name,
b.order_date,
COUNT(b.id)
FROM users a
JOIN orders b ON a.id = b.user_id;2. 合理使用缩进
sql
-- 好的格式
SELECT
name,
age,
city
FROM users
WHERE age > 18
ORDER BY name;
-- 不好的格式
SELECT name, age, city FROM users WHERE age > 18 ORDER BY name;3. 添加注释
sql
-- 查询活跃用户的订单信息
SELECT
u.username,
o.order_id,
o.total_amount
FROM users u
JOIN orders o ON u.id = o.user_id
WHERE u.status = 'active'
AND o.order_date > '2024-01-01';小结
本章介绍了 SQL 的基础语法:
- 语句结构:SELECT、FROM、WHERE 等基本结构
- 语句分类:DDL、DML、DCL、TCL
- 注释语法:单行注释和多行注释
- 标识符规则:命名规则和引号使用
- 常用关键字:查询、定义、操作、约束
- 执行顺序:SQL 语句的逻辑执行顺序
- 运算符:算术、比较、逻辑运算符
- NULL 处理:NULL 的特性和处理方法
掌握这些基础语法是编写 SQL 语句的基础。在接下来的章节中,我们将深入学习如何使用这些语法来查询和操作数据。
下一步: 学习 SELECT 查询,开始从数据库中检索数据。