SQL语法

学习MySQL SQL语句的基本语法和规则

SQL语法基础

SQL(Structured Query Language)是用于管理关系数据库的标准语言。MySQL遵循SQL标准,并提供了自己的扩展。

SQL语句分类

  • DDL(数据定义语言) - 定义和管理数据库对象
  • DML(数据操作语言) - 操作数据库中的数据
  • DQL(数据查询语言) - 查询数据库中的数据
  • DCL(数据控制语言) - 控制数据库访问权限
  • TCL(事务控制语言) - 管理数据库事务

SQL基本语法规则

语句结束符

SQL语句以分号(;)结束,但在某些客户端工具中分号是可选的。

SQL示例
SELECT * FROM users;

大小写敏感性

  • SQL关键字不区分大小写:SELECTselect 是相同的
  • 数据库名、表名和列名在Windows上不区分大小写,在Linux/Unix上区分大小写
SQL示例
-- 以下语句是等效的
SELECT username FROM users;
select username from users;
Select Username From Users;

注释

MySQL支持三种注释方式:

SQL示例
-- 单行注释(标准SQL)
# 单行注释(MySQL扩展)
/* 
   多行注释
   可以跨越多行
*/

SELECT * FROM users; -- 这是行尾注释

标识符命名规则

合法标识符

  • 可以包含字母、数字、下划线和美元符号
  • 必须以字母或下划线开头
  • 最大长度为64个字符
  • 不能是MySQL保留字
SQL示例
-- 合法的标识符
user_name
user123
_user
$user

-- 不合法的标识符
123user    -- 以数字开头
user-name  -- 包含连字符
select     -- 保留字

引用标识符

如果标识符包含特殊字符或是保留字,可以使用反引号(`)引用:

SQL示例
-- 引用包含特殊字符的标识符
CREATE TABLE `user-table` (
    `select` VARCHAR(50)
);

-- 在查询中使用引用的标识符
SELECT `select` FROM `user-table`;

SQL字面量与NULL处理

字面量包括字符串、数字、日期、布尔值等。SQL使用三值逻辑(TRUE/FALSE/UNKNOWN)处理NULL。

SQL示例
SELECT 'Hello', 123, TRUE, NULL;
-- NULL比较需要使用 IS NULL / IS NOT NULL
SELECT * FROM users WHERE email IS NOT NULL;

SQL语句结构

基本SELECT语句

SQL语法
SELECT column1, column2, ...
FROM table_name
WHERE condition
ORDER BY column1 ASC|DESC
LIMIT number;

INSERT语句

SQL语法
-- 插入指定列
INSERT INTO table_name (column1, column2, ...)
VALUES (value1, value2, ...);

-- 插入所有列
INSERT INTO table_name
VALUES (value1, value2, ...);

UPDATE语句

SQL语法
UPDATE table_name
SET column1 = value1, column2 = value2, ...
WHERE condition;

DELETE语句

SQL语法
DELETE FROM table_name
WHERE condition;

运算符

比较运算符

运算符描述示例
=等于age = 18
<> 或 !=不等于age <> 18
>大于age > 18
<小于age < 18
>=大于等于age >= 18
<=小于等于age <= 18
BETWEEN在某个范围内age BETWEEN 18 AND 25
LIKE搜索模式name LIKE 'J%'
IN指定多个可能的值age IN (18, 21, 25)

逻辑运算符

运算符描述示例
AND逻辑与age > 18 AND status = 'active'
OR逻辑或age < 18 OR age > 65
NOT逻辑非NOT status = 'inactive'

算术运算符

运算符描述示例
+加法price + tax
-减法price - discount
*乘法price * quantity
/除法total / items
% 或 MOD取模age % 2

运算符优先级

优先级从高到低:() → 算术运算符 → 比较运算符 → NOT → AND → OR。建议使用括号明确优先级。

CASE表达式

CASE表达式实现条件逻辑,有两种格式:

SQL示例
SELECT name,
    CASE 
        WHEN salary >= 10000 THEN '高'
        WHEN salary >= 5000 THEN '中'
        ELSE '低'
    END AS salary_level
FROM employees;

常用SQL函数

字符串函数

SQL示例
SELECT 
    CONCAT(first_name, ' ', last_name) AS full_name,
    UPPER(username) AS upper_username,
    LENGTH(email) AS email_length,
    SUBSTRING(description, 1, 100) AS short_desc
FROM users;

数值函数

SQL示例
SELECT 
    ROUND(price, 2) AS rounded_price,
    CEIL(rating) AS ceiling_rating,
    FLOOR(rating) AS floor_rating,
    ABS(balance) AS absolute_balance
FROM products;

日期函数

SQL示例
SELECT 
    NOW() AS current_datetime,
    CURDATE() AS current_date,
    CURTIME() AS current_time,
    DATE_ADD(created_at, INTERVAL 7 DAY) AS next_week,
    DATEDIFF(NOW(), birth_date) AS days_old
FROM users;

窗口函数(MySQL 8.0+)

SQL示例
SELECT name, department, salary,
    RANK() OVER (PARTITION BY department ORDER BY salary DESC) AS dept_rank,
    AVG(salary) OVER (PARTITION BY department) AS dept_avg
FROM employees;

JSON函数

SQL示例
SELECT 
    JSON_EXTRACT(metadata, '$.author') AS author,
    JSON_SET(metadata, '$.views', JSON_EXTRACT(metadata, '$.views') + 1) AS updated_meta
FROM articles;

用户定义变量和会话变量

SQL示例
SET @counter = 0;
SELECT @counter := @counter + 1 AS row_num, name FROM employees;
SHOW SESSION VARIABLES LIKE 'sql_mode';

预处理语句

SQL示例
PREPARE stmt1 FROM 'SELECT * FROM users WHERE id = ?';
SET @id = 5;
EXECUTE stmt1 USING @id;
DEALLOCATE PREPARE stmt1;

SQL语句执行顺序

了解SQL语句的执行顺序对于编写高效的查询非常重要:

  1. FROM - 确定要查询的表
  2. WHERE - 过滤行
  3. GROUP BY - 分组行
  4. HAVING - 过滤分组
  5. SELECT - 选择列
  6. ORDER BY - 排序结果
  7. LIMIT - 限制结果数量

SQL模式(SQL Mode)

SQL模式影响MySQL的行为,例如严格模式会拒绝无效数据:

SQL示例
SET sql_mode = 'STRICT_TRANS_TABLES,NO_ZERO_DATE';
SELECT @@sql_mode;

SQL最佳实践

  • 使用有意义的表名和列名
  • 避免使用SELECT *,明确指定需要的列
  • 使用适当的索引提高查询性能
  • 避免在WHERE子句中使用函数,这会使索引失效
  • 使用参数化查询防止SQL注入
  • 适当使用事务确保数据一致性
  • 格式化SQL语句提高可读性
学习建议:熟练掌握SQL语法是数据库开发的基础,建议多练习各种SQL语句,理解每个关键字的作用。

下一步学习

掌握了SQL基本语法后,您可以继续学习: