SQL 基础语法和数据类型
本章将介绍 SQL 的基本语法规则和常用数据类型。
SQL 语法规则
基本语句结构
SQL 语句由动词、目标和条件三部分组成:
动词(SELECT) 目标(first_name) 目标(last_name)
FROM 目标(employees)
WHERE 条件(salary > 5000);
语句终止
- SQL 语句以分号
;终止 - 分号用于分隔多个语句
SELECT * FROM users;
SELECT * FROM products;
大小写
- SQL 关键字不区分大小写:SELECT、select、SELECT 都相同
- 表名和列名:取决于数据库配置(通常不区分大小写)
- 字符串值区分大小写:
'Hello'和'hello'不同
-- 以下三种写法等价
SELECT * FROM users;
select * from users;
SeLeCt * FrOm UsErS;
为提高可读性,建议:
- 关键字使用大写:
SELECT、WHERE、FROM - 表名和列名使用小写:
users、user_name
注释
-- 单行注释
SELECT * FROM users; -- 查询所有用户
/*
多行注释
这是SQL中的注释
*/
SELECT name FROM users;
SQL 关键字分类
数据查询
- SELECT:查询数据
- DISTINCT:去重
- WHERE:条件过滤
- ORDER BY:排序
- LIMIT:限制结果数量
数据定义
- CREATE:创建数据库/表
- ALTER:修改表结构
- DROP:删除数据库/表
- TRUNCATE:清空表
数据操作
- INSERT:插入数据
- UPDATE:更新数据
- DELETE:删除数据
其他
- JOIN:连接表
- GROUP BY:分组
- HAVING:分组过滤
- AS:别名
数据类型
1. 数值类型
整数类型
| 数据类型 | 描述 | 存储空间 |
|---|---|---|
| TINYINT | 微整数,-128 到 127 | 1 字节 |
| SMALLINT | 小整数,-32768 到 32767 | 2 字节 |
| INT | 整数,-21亿到21亿 | 4 字节 |
| BIGINT | 大整数 | 8 字节 |
-- 创建整数列
CREATE TABLE employees (
id INT,
age SMALLINT,
salary BIGINT
);
浮点数类型
| 数据类型 | 描述 | 存储空间 |
|---|---|---|
| FLOAT | 单精度浮点 | 4 字节 |
| DOUBLE | 双精度浮点 | 8 字节 |
| DECIMAL(p,s) | 精确数值 | 可变 |
-- p: 总位数, s: 小数位数
-- DECIMAL(10,2) 表示总共10位,小数2位
CREATE TABLE products (
price DECIMAL(10, 2),
discount FLOAT,
rating DOUBLE
);
2. 字符串类型
| 数据类型 | 描述 | 最大长度 |
|---|---|---|
| CHAR(n) | 固定长度 | 255 字符 |
| VARCHAR(n) | 可变长度 | 65535 字符 |
| TEXT | 长文本 | 65535 字符 |
| LONGTEXT | 超长文本 | 4GB |
CREATE TABLE users (
name CHAR(20), -- 固定20字符,不足用空格填充
username VARCHAR(50), -- 可变长度,最多50字符
bio TEXT -- 长文本
);
注意:CHAR 和 VARCHAR 的选择
- CHAR:固定长度,如性别(M/F)、手机号
- VARCHAR:可变长度,如用户名、地址
3. 日期和时间类型
| 数据类型 | 描述 | 格式 |
|---|---|---|
| DATE | 日期 | '2024-01-01' |
| TIME | 时间 | '12:30:00' |
| DATETIME | 日期时间 | '2024-01-01 12:30:00' |
| TIMESTAMP | 时间戳 | 1970-01-01 起的秒数 |
| YEAR | 年份 | '2024' |
CREATE TABLE orders (
order_date DATE,
order_time TIME,
created_at DATETIME,
updated_at TIMESTAMP
);
4. 布尔类型
| 数据类型 | 描述 |
|---|---|
| BOOLEAN / BOOL | 布尔值,TRUE 或 FALSE |
| BIT | 位类型 |
CREATE TABLE users (
is_active BOOLEAN,
is_admin BOOL
);
5. 其他类型
| 数据类型 | 描述 |
|---|---|
| BLOB | 二进制数据(图片、文件) |
| JSON | JSON 数据(MySQL 5.7+) |
| UUID | 通用唯一标识符 |
-- 存储头像图片
CREATE TABLE user_profiles (
avatar BLOB
);
-- 存储 JSON 数据
CREATE TABLE settings (
preferences JSON
);
SQL 基本操作
1. SELECT 查询
-- 查询所有列
SELECT * FROM users;
-- 查询指定列
SELECT name, email FROM users;
-- 带别名
SELECT name AS 姓名, email AS 邮箱 FROM users;
2. INSERT 插入
-- 插入单条数据
INSERT INTO users (name, email, age) VALUES ('张三', '[email protected]', 25);
-- 插入多条数据
INSERT INTO users (name, email, age) VALUES
('李四', '[email protected]', 30),
('王五', '[email protected]', 28);
3. UPDATE 更新
-- 更新数据(注意加 WHERE 条件)
UPDATE users SET age = 26 WHERE name = '张三';
-- 更新多列
UPDATE users SET age = 27, email = '[email protected]' WHERE id = 1;
4. DELETE 删除
-- 删除数据(注意加 WHERE 条件)
DELETE FROM users WHERE id = 1;
-- 危险!删除所有数据
DELETE FROM users;
5. CREATE 创建表
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
email VARCHAR(50) UNIQUE,
age INT DEFAULT 18,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
WHERE 条件
比较运算符
-- 等于
SELECT * FROM users WHERE age = 25;
-- 不等于
SELECT * FROM users WHERE age != 25;
-- 大于、小于
SELECT * FROM users WHERE age > 18;
SELECT * FROM users WHERE age < 60;
-- 大于等于、小于等于
SELECT * FROM users WHERE age >= 18;
SELECT * FROM users WHERE age <= 60;
逻辑运算符
-- AND:同时满足
SELECT * FROM users WHERE age >= 18 AND age <= 30;
-- OR:满足任一条件
SELECT * FROM users WHERE country = 'USA' OR country = 'China';
-- NOT:取反
SELECT * FROM users WHERE NOT country = 'USA';
其他条件
-- IN:在列表中
SELECT * FROM users WHERE country IN ('USA', 'China', 'Japan');
-- BETWEEN:在范围内
SELECT * FROM users WHERE age BETWEEN 18 AND 30;
-- LIKE:模糊匹配
-- % 表示任意字符
SELECT * FROM users WHERE name LIKE '张%';
-- _ 表示单个字符
SELECT * FROM users WHERE name LIKE '张_';
-- IS NULL / IS NOT NULL
SELECT * FROM users WHERE email IS NOT NULL;
ORDER BY 排序
-- 升序(默认)
SELECT * FROM users ORDER BY age;
-- 降序
SELECT * FROM users ORDER BY age DESC;
-- 多列排序
SELECT * FROM users ORDER BY country ASC, age DESC;
LIMIT 限制结果
-- 只取前5条
SELECT * FROM users LIMIT 5;
-- 跳过前10条,取5条(分页)
SELECT * FROM users LIMIT 10, 5;
-- 从第0条开始,取5条
SELECT * FROM users LIMIT 5 OFFSET 10;
综合示例
-- 查询美国用户,按年龄降序排列,只取前10条
SELECT name, email, age, country
FROM users
WHERE country = 'USA'
ORDER BY age DESC
LIMIT 10;
小结
本章我们学习了:
- SQL 语法规则(大小写、注释、语句终止)
- 常用数据类型(数值、字符串、日期、布尔)
- 基本 SQL 操作(SELECT、INSERT、UPDATE、DELETE、CREATE)
- WHERE 条件过滤
- ORDER BY 排序和 LIMIT 限制
练习
- 创建一个学生表,包含学号、姓名、年龄、班级、成绩
- 插入5条学生数据
- 查询成绩在80分以上的学生
- 按成绩降序排列,取前3名
- 查询某个班级的学生数量