Skip to content

SQL 基础语法

掌握了数据库的基本概念后,现在开始学习 SQL 的基础语法。本章将介绍 SQL 的核心语法规则,包括语句结构、注释、标识符等。

SQL 语句的基本结构

标准格式

SQL 语句通常由以下几个部分组成:

sql
SELECT column1, column2  -- 选择要查询的列
FROM table_name           -- 指定要查询的表
WHERE condition          -- 添加过滤条件
GROUP BY column          -- 分组
HAVING condition         -- 分组后的过滤条件
ORDER BY column          -- 排序
LIMIT number;            -- 限制结果数量

语句特点

  • 不区分大小写SELECTselect 是相同的
  • 以分号结束:每条 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-15

NULL 值处理

NULL 的特性

  • NULL 表示"未知"或"不存在"
  • NULL 不等于任何值,包括 NULL
  • 数学运算中,NULL + 任何值 = NULL

NULL 判断

sql
-- 检查 NULL
WHERE email IS NULL

-- 检查非 NULL
WHERE email IS NOT NULL

NULL 的运算

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 查询,开始从数据库中检索数据。