第123集 SQL基础语法
一、SQL简介
1.1 什么是SQL
SQL(Structured Query Language)是结构化查询语言的缩写,是用于管理关系型数据库的标准编程语言。SQL可以用于创建、查询、更新和删除数据库中的数据。
1.2 SQL的特点
- 标准化:SQL是ANSI(美国国家标准协会)和ISO(国际标准化组织)的标准语言
- 简单易学:语法接近英语,易于理解和学习
- 功能强大:可以执行从简单查询到复杂的数据操作
- 通用:几乎所有关系型数据库都支持SQL
- 非过程化:只需指定要做什么,不需要指定怎么做
1.3 SQL的分类
- DDL(数据定义语言):用于定义数据库结构,如CREATE、ALTER、DROP等
- DML(数据操作语言):用于操作数据库中的数据,如INSERT、UPDATE、DELETE等
- DQL(数据查询语言):用于查询数据库中的数据,主要是SELECT语句
- DCL(数据控制语言):用于控制数据库的访问权限,如GRANT、REVOKE等
- TCL(事务控制语言):用于管理数据库事务,如COMMIT、ROLLBACK等
二、SQL数据类型
不同的数据库系统支持的数据类型可能略有不同,以下是一些常见的数据类型:
2.1 数值类型
| 数据类型 | 描述 | 示例 |
|---|---|---|
| INTEGER/INT | 整数类型 | 123, -456 |
| SMALLINT | 小整数类型 | 123 |
| BIGINT | 大整数类型 | 1234567890123 |
| FLOAT | 单精度浮点数 | 3.14 |
| DOUBLE | 双精度浮点数 | 3.1415926535 |
| DECIMAL/NUMERIC | 精确数值类型 | DECIMAL(10,2)表示最多10位数字,其中2位小数 |
2.2 字符串类型
| 数据类型 | 描述 | 示例 |
|---|---|---|
| CHAR(n) | 固定长度字符串,长度为n | 'hello' |
| VARCHAR(n) | 可变长度字符串,最大长度为n | 'hello world' |
| TEXT | 长文本字符串 | 一篇文章内容 |
| BLOB | 二进制大对象,用于存储图片、音频等 | 图片数据 |
2.3 日期和时间类型
| 数据类型 | 描述 | 示例 |
|---|---|---|
| DATE | 日期类型(年-月-日) | '2023-12-25' |
| TIME | 时间类型(时:分:秒) | '14:30:45' |
| DATETIME/TIMESTAMP | 日期和时间类型 | '2023-12-25 14:30:45' |
| YEAR | 年份类型 | 2023 |
2.4 其他类型
| 数据类型 | 描述 | 示例 |
|---|---|---|
| BOOLEAN | 布尔类型 | TRUE/FALSE |
| ENUM | 枚举类型,只能取预定义的值 | ENUM('男', '女') |
| SET | 集合类型,可以取多个预定义的值 | SET('篮球', '足球', '排球') |
三、SQL运算符
3.1 算术运算符
| 运算符 | 描述 | 示例 |
|---|---|---|
| + | 加法 | 5 + 3 = 8 |
| - | 减法 | 5 - 3 = 2 |
| * | 乘法 | 5 * 3 = 15 |
| / | 除法 | 5 / 3 = 1.666... |
| % | 取余 | 5 % 3 = 2 |
3.2 比较运算符
| 运算符 | 描述 | 示例 |
|---|---|---|
| = | 等于 | age = 18 |
| <> | 不等于 | age <> 18 |
| != | 不等于(非标准) | age != 18 |
| > | 大于 | age > 18 |
| < | 小于 | age < 18 |
| >= | 大于等于 | age >= 18 |
| <= | 小于等于 | age <= 18 |
| BETWEEN | 在指定范围内 | age BETWEEN 18 AND 30 |
| LIKE | 模糊匹配 | name LIKE '张%' |
| IN | 在指定集合中 | age IN (18, 20, 22) |
| IS NULL | 为空 | email IS NULL |
| IS NOT NULL | 不为空 | email IS NOT NULL |
3.3 逻辑运算符
| 运算符 | 描述 | 示例 |
|---|---|---|
| AND | 逻辑与 | age > 18 AND gender = '男' |
| OR | 逻辑或 | age > 18 OR gender = '女' |
| NOT | 逻辑非 | NOT age > 18 |
3.4 连接运算符
| 运算符 | 描述 | 示例 |
|---|---|---|
| CONCAT() | 连接字符串 | CONCAT(first_name, ' ', last_name) |
四、DDL语句
4.1 CREATE语句
用于创建数据库对象,如表、索引等。
创建数据库
CREATE DATABASE mydatabase;创建表
CREATE TABLE students (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
age INT,
gender VARCHAR(10),
email VARCHAR(100) UNIQUE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);创建索引
CREATE INDEX idx_students_name ON students(name);4.2 ALTER语句
用于修改数据库对象的结构。
添加列
ALTER TABLE students ADD COLUMN address VARCHAR(200);修改列
ALTER TABLE students MODIFY COLUMN age SMALLINT;删除列
ALTER TABLE students DROP COLUMN address;4.3 DROP语句
用于删除数据库对象。
删除表
DROP TABLE IF EXISTS students;删除数据库
DROP DATABASE IF EXISTS mydatabase;五、DML语句
5.1 INSERT语句
用于向表中插入数据。
插入单条数据
INSERT INTO students (name, age, gender, email)
VALUES ('张三', 18, '男', 'zhangsan@example.com');插入多条数据
INSERT INTO students (name, age, gender, email)
VALUES
('李四', 19, '男', 'lisi@example.com'),
('王五', 20, '女', 'wangwu@example.com');5.2 UPDATE语句
用于更新表中的数据。
-- 更新单个字段
UPDATE students SET age = 21 WHERE id = 1;
-- 更新多个字段
UPDATE students SET age = 20, email = 'newemail@example.com' WHERE name = '李四';5.3 DELETE语句
用于删除表中的数据。
-- 删除指定记录
DELETE FROM students WHERE id = 1;
-- 删除所有记录(保留表结构)
DELETE FROM students;六、DQL语句(SELECT)
SELECT语句是SQL中最重要的语句,用于查询数据库中的数据。
6.1 基本查询
-- 查询所有列
SELECT * FROM students;
-- 查询指定列
SELECT name, age FROM students;
-- 为列取别名
SELECT name AS 姓名, age AS 年龄 FROM students;6.2 条件查询
-- 基本条件
SELECT * FROM students WHERE age > 18;
-- 多个条件
SELECT * FROM students WHERE age > 18 AND gender = '女';
-- 范围查询
SELECT * FROM students WHERE age BETWEEN 18 AND 22;
-- 集合查询
SELECT * FROM students WHERE age IN (18, 20, 22);
-- 模糊查询
SELECT * FROM students WHERE name LIKE '张%'; -- 姓张的人
SELECT * FROM students WHERE name LIKE '%三%'; -- 名字中包含三的人
SELECT * FROM students WHERE name LIKE '张_'; -- 姓张且名字只有两个字的人6.3 排序查询
-- 升序排序(默认)
SELECT * FROM students ORDER BY age ASC;
-- 降序排序
SELECT * FROM students ORDER BY age DESC;
-- 多列排序
SELECT * FROM students ORDER BY gender ASC, age DESC;6.4 限制查询
-- 限制结果数量(MySQL/SQLite)
SELECT * FROM students LIMIT 5;
-- 限制结果数量并指定起始位置
SELECT * FROM students LIMIT 5 OFFSET 10; -- 从第11条记录开始,取5条
-- SQL Server使用TOP
SELECT TOP 5 * FROM students;
-- Oracle使用ROWNUM
SELECT * FROM students WHERE ROWNUM <= 5;6.5 聚合函数
-- 计算总记录数
SELECT COUNT(*) AS total_students FROM students;
-- 计算年龄总和
SELECT SUM(age) AS total_age FROM students;
-- 计算平均年龄
SELECT AVG(age) AS avg_age FROM students;
-- 查找最大年龄
SELECT MAX(age) AS max_age FROM students;
-- 查找最小年龄
SELECT MIN(age) AS min_age FROM students;6.6 分组查询
-- 按性别分组,统计每组人数
SELECT gender, COUNT(*) AS count FROM students GROUP BY gender;
-- 按性别分组,统计每组平均年龄
SELECT gender, AVG(age) AS avg_age FROM students GROUP BY gender;
-- 分组后过滤
SELECT gender, COUNT(*) AS count FROM students
GROUP BY gender
HAVING COUNT(*) > 10;七、连接查询
7.1 内连接(INNER JOIN)
返回两个表中匹配的记录。
SELECT students.name, classes.class_name
FROM students
INNER JOIN classes ON students.class_id = classes.id;7.2 左连接(LEFT JOIN)
返回左表中的所有记录,以及右表中匹配的记录。
SELECT students.name, classes.class_name
FROM students
LEFT JOIN classes ON students.class_id = classes.id;7.3 右连接(RIGHT JOIN)
返回右表中的所有记录,以及左表中匹配的记录。
SELECT students.name, classes.class_name
FROM students
RIGHT JOIN classes ON students.class_id = classes.id;7.4 全连接(FULL JOIN)
返回两个表中的所有记录,无论是否匹配。
SELECT students.name, classes.class_name
FROM students
FULL JOIN classes ON students.class_id = classes.id;八、子查询
子查询是嵌套在另一个SQL语句中的查询。
8.1 作为条件
-- 查询年龄大于平均年龄的学生
SELECT * FROM students
WHERE age > (SELECT AVG(age) FROM students);8.2 作为数据源
-- 查询每个班级的平均年龄,然后查询平均年龄大于20的班级
SELECT class_id, avg_age FROM (
SELECT class_id, AVG(age) AS avg_age
FROM students
GROUP BY class_id
) AS avg_ages
WHERE avg_age > 20;8.3 作为值
-- 插入一条记录,班级ID为最新的班级
INSERT INTO students (name, age, class_id)
VALUES ('赵六', 21, (SELECT MAX(id) FROM classes));九、SQL最佳实践
9.1 命名规范
- 使用有意义的表名和列名
- 表名使用单数或复数形式保持一致
- 避免使用SQL关键字作为标识符
- 考虑使用前缀或后缀区分表和视图
9.2 性能优化
- 只查询需要的列,避免SELECT *
- 创建适当的索引
- 避免在WHERE子句中使用函数
- 合理使用JOIN和子查询
- 避免使用不必要的ORDER BY
9.3 安全性
- 使用参数化查询,避免SQL注入
- 限制用户的访问权限
- 对敏感数据进行加密
- 定期备份数据库
9.4 可读性
- 使用大写字母书写SQL关键字
- 适当缩进和换行
- 添加注释说明复杂的查询
十、总结
本集我们学习了SQL的基础语法,包括:
- SQL的简介和分类
- SQL的数据类型
- SQL的运算符
- DDL语句(CREATE、ALTER、DROP)
- DML语句(INSERT、UPDATE、DELETE)
- DQL语句(SELECT的各种用法)
- 连接查询和子查询
- SQL的最佳实践
SQL是关系型数据库的核心,掌握SQL基础语法是进行数据库操作的前提。在下一集中,我们将学习SQL的增删改查操作,进一步提高数据库操作能力。
十一、练习
- 创建一个products表,包含id、name、price、category、created_at等字段
- 向products表中插入5条产品数据
- 查询所有产品的信息
- 查询价格大于100的产品
- 查询分类为"电子产品"的产品
- 查询价格在50到200之间的产品
- 更新某个产品的价格
- 删除某个产品
- 计算所有产品的平均价格
- 按分类分组,统计每组产品的数量