MySQL基础语法 #
一、SQL语句分类 #
1.1 SQL语言分类 #
| 分类 | 全称 | 说明 | 关键字 |
|---|---|---|---|
| DDL | Data Definition Language | 数据定义语言 | CREATE, ALTER, DROP |
| DML | Data Manipulation Language | 数据操作语言 | INSERT, UPDATE, DELETE |
| DQL | Data Query Language | 数据查询语言 | SELECT |
| DCL | Data Control Language | 数据控制语言 | GRANT, REVOKE |
| TCL | Transaction Control Language | 事务控制语言 | COMMIT, ROLLBACK |
1.2 语句示例 #
sql
-- DDL: 数据定义
CREATE DATABASE mydb;
CREATE TABLE users (id INT, name VARCHAR(50));
ALTER TABLE users ADD COLUMN age INT;
DROP TABLE users;
-- DML: 数据操作
INSERT INTO users VALUES (1, 'John');
UPDATE users SET name = 'Jane' WHERE id = 1;
DELETE FROM users WHERE id = 1;
-- DQL: 数据查询
SELECT * FROM users;
-- DCL: 数据控制
GRANT SELECT ON mydb.* TO 'user'@'localhost';
REVOKE SELECT ON mydb.* FROM 'user'@'localhost';
-- TCL: 事务控制
COMMIT;
ROLLBACK;
二、注释 #
2.1 单行注释 #
sql
-- 这是单行注释(推荐)
SELECT * FROM users;
# 这也是单行注释(MySQL特有)
SELECT * FROM users;
2.2 多行注释 #
sql
/*
* 这是多行注释
* 可以跨越多行
*/
SELECT * FROM users;
/*
查询所有用户信息
包括ID、姓名、邮箱
*/
SELECT id, name, email FROM users;
2.3 注释最佳实践 #
sql
-- 推荐:在复杂查询前添加说明
-- 查询2024年销售额前10的产品
SELECT
product_name,
SUM(amount) AS total_sales
FROM orders
WHERE YEAR(order_date) = 2024
GROUP BY product_name
ORDER BY total_sales DESC
LIMIT 10;
-- 推荐:在关键步骤添加注释
SELECT
id,
name,
-- 计算折扣后价格
price * 0.9 AS discount_price
FROM products;
三、标识符 #
3.1 标识符规则 #
标识符用于命名数据库、表、字段等对象。
| 规则 | 说明 | 示例 |
|---|---|---|
| 长度 | 1-64个字符 | users, order_items |
| 字符 | 字母、数字、下划线、$ | user_name, user$ |
| 开头 | 字母或下划线 | _temp, users |
| 大小写 | 取决于操作系统 | Linux区分,Windows不区分 |
3.2 合法标识符 #
sql
-- 合法标识符
CREATE TABLE users (id INT);
CREATE TABLE user_info (id INT);
CREATE TABLE User123 (id INT);
CREATE TABLE _temp (id INT);
3.3 非法标识符 #
sql
-- 非法标识符(会报错)
CREATE TABLE 123users (id INT); -- 以数字开头
CREATE TABLE user-name (id INT); -- 包含连字符
CREATE TABLE table (id INT); -- 使用关键字
3.4 使用反引号 #
sql
-- 使用反引号可以包含特殊字符或关键字
CREATE TABLE `table` (id INT);
CREATE TABLE `user-name` (id INT);
CREATE TABLE `123users` (id INT);
-- 查询时也需要使用反引号
SELECT * FROM `table`;
四、关键字与保留字 #
4.1 常用关键字 #
sql
-- 数据定义
CREATE, ALTER, DROP, TRUNCATE, RENAME
-- 数据操作
INSERT, UPDATE, DELETE, SELECT
-- 数据控制
GRANT, REVOKE
-- 约束
PRIMARY, KEY, FOREIGN, UNIQUE, NOT, NULL, DEFAULT
-- 查询
FROM, WHERE, GROUP, BY, HAVING, ORDER, LIMIT
-- 连接
JOIN, INNER, LEFT, RIGHT, ON
-- 函数
COUNT, SUM, AVG, MAX, MIN
4.2 避免使用关键字 #
sql
-- 不推荐:使用关键字作为表名或字段名
CREATE TABLE order (
select INT,
from VARCHAR(50)
);
-- 推荐:添加前缀或后缀
CREATE TABLE order_info (
select_count INT,
from_address VARCHAR(50)
);
-- 或使用反引号
CREATE TABLE `order` (
`select` INT,
`from` VARCHAR(50)
);
五、命名规范 #
5.1 数据库命名 #
sql
-- 推荐:小写字母,下划线分隔
CREATE DATABASE my_database;
CREATE DATABASE ecommerce_db;
CREATE DATABASE blog_system;
-- 不推荐
CREATE DATABASE MyDatabase; -- 大小写混用
CREATE DATABASE my-database; -- 使用连字符
CREATE DATABASE myDatabase; -- 驼峰命名
5.2 表命名 #
sql
-- 推荐:小写字母,下划线分隔,使用复数
CREATE TABLE users;
CREATE TABLE order_items;
CREATE TABLE product_categories;
-- 不推荐
CREATE TABLE User; -- 单数
CREATE TABLE OrderItems; -- 驼峰
CREATE TABLE order-items; -- 连字符
5.3 字段命名 #
sql
-- 推荐:小写字母,下划线分隔
CREATE TABLE users (
id INT PRIMARY KEY,
user_name VARCHAR(50),
created_at DATETIME,
is_active TINYINT(1)
);
-- 不推荐
CREATE TABLE users (
ID INT, -- 大写
UserName VARCHAR(50), -- 驼峰
is-active TINYINT(1) -- 连字符
);
5.4 索引命名 #
sql
-- 主键索引:pk_表名
ALTER TABLE users ADD CONSTRAINT pk_users PRIMARY KEY (id);
-- 唯一索引:uk_表名_字段名
CREATE UNIQUE INDEX uk_users_email ON users(email);
-- 普通索引:idx_表名_字段名
CREATE INDEX idx_users_name ON users(name);
-- 组合索引:idx_表名_字段1_字段2
CREATE INDEX idx_users_name_age ON users(name, age);
5.5 外键命名 #
sql
-- 外键命名:fk_表名_关联表名
ALTER TABLE orders
ADD CONSTRAINT fk_orders_users
FOREIGN KEY (user_id) REFERENCES users(id);
六、大小写规则 #
6.1 SQL关键字 #
sql
-- 关键字不区分大小写(推荐大写)
SELECT * FROM users;
select * from users;
SELECT * FROM USERS;
-- 推荐写法
SELECT id, name FROM users WHERE age > 18;
6.2 标识符大小写 #
sql
-- 取决于操作系统和配置
-- Linux:区分大小写
-- Windows:不区分大小写
-- 查看大小写设置
SHOW VARIABLES LIKE 'lower_case_table_names';
-- 值说明:
-- 0: 区分大小写(Linux默认)
-- 1: 表名存储为小写,名称比较不区分大小写(Windows默认)
-- 2: 表名按原样存储,比较时不区分大小写(macOS默认)
6.3 数据大小写 #
sql
-- 字符串数据区分大小写(取决于排序规则)
SELECT 'ABC' = 'abc'; -- 结果取决于collation
-- 区分大小写比较
SELECT BINARY 'ABC' = 'abc'; -- 返回 0(false)
-- 使用区分大小写的排序规则
CREATE TABLE users (
name VARCHAR(50) COLLATE utf8mb4_bin
);
七、语句规范 #
7.1 语句结束 #
sql
-- SQL语句以分号结尾
SELECT * FROM users;
-- 在命令行客户端中,分号表示语句结束
mysql> SELECT * FROM users
-> ;
7.2 语句换行 #
sql
-- 推荐:每个子句单独一行
SELECT
id,
name,
email
FROM users
WHERE age > 18
ORDER BY created_at DESC
LIMIT 10;
-- 不推荐:所有内容在一行
SELECT id, name, email FROM users WHERE age > 18 ORDER BY created_at DESC LIMIT 10;
7.3 缩进规范 #
sql
-- 推荐:使用4个空格或1个Tab缩进
SELECT
id,
name,
CASE
WHEN age < 18 THEN '未成年'
WHEN age < 60 THEN '成年'
ELSE '老年'
END AS age_group
FROM users
WHERE
status = 1
AND created_at > '2024-01-01';
八、数据类型 #
8.1 数值类型 #
sql
-- 整数类型
TINYINT -- 1字节,-128到127
SMALLINT -- 2字节,-32768到32767
MEDIUMINT -- 3字节
INT -- 4字节,常用
BIGINT -- 8字节,大整数
-- 浮点类型
FLOAT -- 4字节,单精度
DOUBLE -- 8字节,双精度
-- 定点类型
DECIMAL(M,D) -- 精确小数,M总位数,D小数位
-- 示例
CREATE TABLE products (
id INT,
price DECIMAL(10,2), -- 10位总长,2位小数
weight FLOAT
);
8.2 字符串类型 #
sql
-- 定长字符串
CHAR(N) -- 固定N长度,最大255
-- 变长字符串
VARCHAR(N) -- 可变长度,最大65535
-- 文本类型
TINYTEXT -- 255字节
TEXT -- 65535字节
MEDIUMTEXT -- 16MB
LONGTEXT -- 4GB
-- 示例
CREATE TABLE articles (
title VARCHAR(200),
content TEXT
);
8.3 日期时间类型 #
sql
-- 日期类型
DATE -- 日期,格式:YYYY-MM-DD
TIME -- 时间,格式:HH:MM:SS
DATETIME -- 日期时间,格式:YYYY-MM-DD HH:MM:SS
TIMESTAMP -- 时间戳,自动更新
YEAR -- 年份
-- 示例
CREATE TABLE events (
event_date DATE,
event_time TIME,
created_at DATETIME,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
8.4 其他类型 #
sql
-- 布尔类型
BOOLEAN -- 实际是TINYINT(1)
-- 枚举类型
ENUM('A', 'B', 'C')
-- 集合类型
SET('a', 'b', 'c')
-- JSON类型
JSON
-- 示例
CREATE TABLE users (
is_active BOOLEAN DEFAULT TRUE,
status ENUM('active', 'inactive', 'banned'),
tags SET('tag1', 'tag2', 'tag3'),
profile JSON
);
九、表达式 #
9.1 算术表达式 #
sql
SELECT 10 + 5; -- 加法,结果:15
SELECT 10 - 5; -- 减法,结果:5
SELECT 10 * 5; -- 乘法,结果:50
SELECT 10 / 5; -- 除法,结果:2.0000
SELECT 10 DIV 3; -- 整除,结果:3
SELECT 10 % 3; -- 取余,结果:1
SELECT 10 MOD 3; -- 取余,结果:1
-- 在查询中使用
SELECT
product_name,
price,
price * 0.9 AS discount_price,
price * quantity AS total
FROM products;
9.2 比较表达式 #
sql
SELECT 10 = 10; -- 等于,结果:1
SELECT 10 != 10; -- 不等于,结果:0
SELECT 10 <> 10; -- 不等于,结果:0
SELECT 10 > 5; -- 大于,结果:1
SELECT 10 < 5; -- 小于,结果:0
SELECT 10 >= 10; -- 大于等于,结果:1
SELECT 10 <= 10; -- 小于等于,结果:1
-- 安全等于(NULL值比较)
SELECT NULL <=> NULL; -- 结果:1
SELECT NULL = NULL; -- 结果:NULL
9.3 逻辑表达式 #
sql
SELECT TRUE AND FALSE; -- 与,结果:0
SELECT TRUE OR FALSE; -- 或,结果:1
SELECT NOT TRUE; -- 非,结果:0
SELECT TRUE XOR FALSE; -- 异或,结果:1
-- 在WHERE中使用
SELECT * FROM users
WHERE age >= 18 AND status = 1;
十、NULL值处理 #
10.1 NULL值概念 #
sql
-- NULL表示"没有值"或"未知值"
-- NULL不等于0、空字符串或空格
SELECT NULL = NULL; -- 结果:NULL
SELECT NULL != NULL; -- 结果:NULL
SELECT NULL IS NULL; -- 结果:1
SELECT NULL IS NOT NULL; -- 结果:0
10.2 NULL值判断 #
sql
-- 错误写法
SELECT * FROM users WHERE name = NULL; -- 不会返回任何结果
-- 正确写法
SELECT * FROM users WHERE name IS NULL;
SELECT * FROM users WHERE name IS NOT NULL;
10.3 NULL值函数 #
sql
-- IFNULL:如果为NULL则返回默认值
SELECT IFNULL(name, 'Unknown') FROM users;
-- COALESCE:返回第一个非NULL值
SELECT COALESCE(phone, email, 'N/A') AS contact FROM users;
-- NULLIF:如果相等则返回NULL
SELECT NULLIF(a, b);
十一、总结 #
语法要点:
| 要点 | 说明 |
|---|---|
| 注释 | 单行用 --,多行用 /* */ |
| 标识符 | 字母开头,可用字母数字下划线 |
| 命名规范 | 小写、下划线分隔、见名知意 |
| 大小写 | 关键字不区分,标识符看系统 |
| 语句结束 | 分号结尾 |
| NULL处理 | 使用 IS NULL / IS NOT NULL |
下一步,让我们学习MySQL数据类型!
最后更新:2026-03-26