第二章:SQL 基础与数据类型
2.1 SQL 概述
什么是 SQL
SQL(Structured Query Language)是用于管理关系型数据库的标准编程语言。
SQL 语句分类
| 分类 |
语句 |
说明 |
| DDL |
CREATE, ALTER, DROP |
数据定义语言 |
| DML |
SELECT, INSERT, UPDATE, DELETE |
数据操作语言 |
| DCL |
GRANT, REVOKE |
数据控制语言 |
| TCL |
COMMIT, ROLLBACK, SAVEPOINT |
事务控制语言 |
2.2 数据类型
数值类型
| 类型 |
大小 |
范围(有符号) |
范围(无符号) |
用途 |
| TINYINT |
1字节 |
-128~127 |
0~255 |
小整数 |
| SMALLINT |
2字节 |
-32768~32767 |
0~65535 |
大整数 |
| INT |
4字节 |
-21亿~21亿 |
0~42亿 |
整数 |
| BIGINT |
8字节 |
极大 |
0~极大 |
超大整数 |
| FLOAT |
4字节 |
±3.4E38 |
- |
单精度 |
| DOUBLE |
8字节 |
±1.7E308 |
- |
双精度 |
| DECIMAL |
变长 |
取决于定义 |
- |
精确数值 |
-- 数值类型示例
CREATE TABLE numeric_demo (
tiny_col TINYINT, -- 1字节
small_col SMALLINT, -- 2字节
int_col INT, -- 4字节
big_col BIGINT, -- 8字节
float_col FLOAT(10,2), -- 总10位,小数2位
double_col DOUBLE, -- 双精度
decimal_col DECIMAL(15,2) -- 精确小数:9999999999999.99
);
字符串类型
| 类型 |
大小 |
说明 |
| CHAR(n) |
0-255 |
固定长度,不足补空格 |
| VARCHAR(n) |
0-65535 |
可变长度 |
| TINYTEXT |
255字节 |
短文本 |
| TEXT |
65535字节 |
文本 |
| MEDIUMTEXT |
16MB |
中等文本 |
| LONGTEXT |
4GB |
长文本 |
-- 字符串类型示例
CREATE TABLE string_demo (
fixed_char CHAR(10), -- 固定10字符
var_char VARCHAR(255), -- 最多255字符
tiny_text TINYTEXT, -- 短文本
article TEXT, -- 文章内容
long_text LONGTEXT -- 长文本
);
CHAR vs VARCHAR 对比:
| 特性 |
CHAR |
VARCHAR |
| 存储方式 |
固定长度 |
可变长度 |
| 性能 |
查询快 |
节省空间 |
| 尾部空格 |
自动补足 |
保留 |
| 适合场景 |
固定长度(性别、状态码) |
长度不固定(用户名、地址) |
日期时间类型
| 类型 |
大小 |
格式 |
范围 |
| DATE |
3字节 |
YYYY-MM-DD |
1000-01-01 ~ 9999-12-31 |
| TIME |
3字节 |
HH:MM:SS |
-838:59:59 ~ 838:59:59 |
| DATETIME |
8字节 |
YYYY-MM-DD HH:MM:SS |
1000-01-01 ~ 9999-12-31 |
| TIMESTAMP |
4字节 |
YYYY-MM-DD HH:MM:SS |
1970-01-01 ~ 2038-01-19 |
| YEAR |
1字节 |
YYYY |
1901 ~ 2155 |
-- 日期时间类型示例
CREATE TABLE datetime_demo (
birth_date DATE, -- 生日:2024-01-15
work_time TIME, -- 工时:08:30:00
create_dt DATETIME, -- 创建时间:2024-01-15 10:30:00
update_ts TIMESTAMP, -- 更新时间,自动更新
entry_year YEAR -- 入学年份:2024
);
-- 插入示例
INSERT INTO datetime_demo VALUES
('2024-01-15', '08:30:00', '2024-01-15 10:30:00', NOW(), 2024);
JSON 类型(MySQL 5.7+)
-- JSON 类型示例
CREATE TABLE json_demo (
id INT PRIMARY KEY,
meta JSON
);
-- 插入 JSON 数据
INSERT INTO json_demo VALUES (1, '{"name": "张三", "age": 25, "skills": ["Python", "MySQL"]}');
-- 查询 JSON 字段
SELECT meta->>'$.name' FROM json_demo; -- 张三
SELECT JSON_EXTRACT(meta, '$.age') FROM json_demo; -- 25
-- 更新 JSON 字段
UPDATE json_demo SET meta = JSON_SET(meta, '$.age', 26) WHERE id = 1;
枚举与集合
-- ENUM 类型
CREATE TABLE enum_demo (
gender ENUM('M', 'F', 'Unknown'),
status ENUM('active', 'inactive', 'pending') DEFAULT 'pending'
);
INSERT INTO enum_demo VALUES ('M', 'active');
-- SET 类型(可多选)
CREATE TABLE set_demo (
hobbies SET('reading', 'music', 'sports', 'coding')
);
INSERT INTO set_demo VALUES ('reading,music,coding');
2.3 运算符与表达式
算术运算符
| 运算符 |
说明 |
示例 |
| + |
加法 |
5 + 3 = 8 |
| - |
减法 |
5 - 3 = 2 |
| * |
乘法 |
5 * 3 = 15 |
| / |
除法 |
5 / 3 = 1.67 |
| DIV |
整除 |
5 DIV 3 = 1 |
| % 或 MOD |
取余 |
5 % 3 = 2 |
比较运算符
| 运算符 |
说明 |
| = |
等于 |
| <>, != |
不等于 |
| > |
大于 |
| < |
小于 |
| >= |
大于等于 |
| <= |
小于等于 |
| BETWEEN |
在范围内 |
| IN |
在列表中 |
| LIKE |
模式匹配 |
| IS NULL |
为空 |
| IS NOT NULL |
不为空 |
-- 比较运算符示例
SELECT * FROM users WHERE age >= 18;
SELECT * FROM products WHERE price BETWEEN 100 AND 500;
SELECT * FROM users WHERE name IN ('张三', '李四', '王五');
SELECT * FROM users WHERE email LIKE '%@example.com';
逻辑运算符
| 运算符 |
说明 |
优先级 |
| NOT 或 ! |
逻辑非 |
最高 |
| AND 或 && |
逻辑与 |
中 |
| OR 或 || |
逻辑或 |
最低 |
| XOR |
逻辑异或 |
- |
-- 逻辑运算符示例
SELECT * FROM users WHERE age >= 18 AND status = 'active';
SELECT * FROM orders WHERE status = 'shipped' OR status = 'delivered';
SELECT * FROM users WHERE NOT status = 'banned';
位运算符
| 运算符 |
说明 |
| & |
按位与 |
| | |
按位或 |
| ^ |
按位异或 |
| ~ |
按位取反 |
| « |
左移 |
| » |
右移 |
2.4 常用函数
字符串函数
| 函数 |
说明 |
示例 |
| CONCAT |
拼接字符串 |
CONCAT(‘Hello’, ’ ‘, ‘World’) |
| LENGTH |
字符串长度 |
LENGTH(‘Hello’) |
| UPPER/LOWER |
大小写转换 |
UPPER(‘hello’) |
| TRIM |
去除空格 |
TRIM(’ hello ‘) |
| SUBSTRING |
截取字符串 |
SUBSTRING(‘Hello’, 1, 3) |
| REPLACE |
替换字符串 |
REPLACE(‘Hello’, ’l’, ‘x’) |
| LPAD/RPAD |
填充字符串 |
LPAD(‘5’, 3, ‘0’) |
| INSTR |
查找子串 |
INSTR(‘Hello’, ’ll’) |
-- 字符串函数示例
SELECT CONCAT(first_name, ' ', last_name) AS full_name FROM users;
SELECT UPPER('hello'); -- HELLO
SELECT TRIM(' hello '); -- hello
SELECT SUBSTRING('HelloWorld', 1, 5); -- Hello
SELECT REPLACE('HelloWorld', 'World', 'MySQL'); -- HelloMySQL
数值函数
| 函数 |
说明 |
示例 |
| ABS |
绝对值 |
ABS(-5) |
| ROUND |
四舍五入 |
ROUND(3.14159, 2) |
| CEIL/CEILING |
向上取整 |
CEIL(3.1) |
| FLOOR |
向下取整 |
FLOOR(3.9) |
| MOD |
取余 |
MOD(10, 3) |
| POW/POWER |
幂运算 |
POW(2, 3) |
| SQRT |
平方根 |
SQRT(16) |
| RAND |
随机数 |
RAND() |
-- 数值函数示例
SELECT ABS(-10); -- 10
SELECT ROUND(3.14159, 3); -- 3.142
SELECT CEIL(3.1); -- 4
SELECT FLOOR(3.9); -- 3
SELECT RAND(); -- 0-1 之间的随机数
日期时间函数
| 函数 |
说明 |
示例 |
| NOW/CURRENT_TIMESTAMP |
当前时间戳 |
NOW() |
| CURDATE/CURRENT_DATE |
当前日期 |
CURDATE() |
| CURTIME/CURRENT_TIME |
当前时间 |
CURTIME() |
| DATE |
提取日期 |
DATE(‘2024-01-15 10:30:00’) |
| TIME |
提取时间 |
TIME(‘2024-01-15 10:30:00’) |
| YEAR/MONTH/DAY |
提取年月日 |
YEAR(NOW()) |
| DATE_FORMAT |
格式化日期 |
DATE_FORMAT(NOW(), ‘%Y-%m-%d’) |
| DATE_ADD/DATE_SUB |
日期加减 |
DATE_ADD(NOW(), INTERVAL 7 DAY) |
| DATEDIFF |
日期差 |
DATEDIFF(‘2024-01-15’, ‘2024-01-01’) |
-- 日期函数示例
SELECT NOW(); -- 2024-01-15 10:30:00
SELECT CURDATE(); -- 2024-01-15
SELECT DATE_FORMAT(NOW(), '%Y年%m月%d日'); -- 2024年01月15日
SELECT DATE_ADD(NOW(), INTERVAL 30 DAY); -- 30天后
SELECT DATEDIFF('2024-12-31', NOW()); -- 距年底天数
SELECT DATE_FORMAT(create_time, '%Y-%m') AS month FROM orders;
条件函数
-- IF 函数
SELECT IF(age >= 18, '成年', '未成年') FROM users;
-- IFNULL 函数
SELECT IFNULL(nickname, '匿名用户') FROM users;
-- CASE 语句
SELECT
name,
score,
CASE
WHEN score >= 90 THEN '优秀'
WHEN score >= 80 THEN '良好'
WHEN score >= 60 THEN '及格'
ELSE '不及格'
END AS grade
FROM students;
-- NULLIF 函数:两个值相同返回 NULL
SELECT NULLIF(a, b) FROM table_name;
聚合函数
| 函数 |
说明 |
| COUNT |
计数 |
| SUM |
求和 |
| AVG |
平均值 |
| MAX |
最大值 |
| MIN |
最小值 |
| GROUP_CONCAT |
连接分组值 |
-- 聚合函数示例
SELECT COUNT(*) FROM users;
SELECT COUNT(DISTINCT department) FROM employees;
SELECT SUM(salary) FROM employees;
SELECT AVG(age) FROM users;
SELECT MAX(price), MIN(price) FROM products;
SELECT department, GROUP_CONCAT(name) FROM employees GROUP BY department;
2.5 注释
-- 单行注释(MySQL 特有)
# 单行注释(Shell 风格)
/*
多行注释
可跨越多行
*/
2.6 本章小结
✅ SQL 分为 DDL、DML、DCL、TCL 四大类
✅ 掌握数值、字符串、日期时间等核心数据类型
✅ 熟练使用各种运算符和表达式
✅ 记住常用函数:字符串、数值、日期、聚合函数
📖 下章预告:数据库与表操作