第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的基础语法,包括:

  1. SQL的简介和分类
  2. SQL的数据类型
  3. SQL的运算符
  4. DDL语句(CREATE、ALTER、DROP)
  5. DML语句(INSERT、UPDATE、DELETE)
  6. DQL语句(SELECT的各种用法)
  7. 连接查询和子查询
  8. SQL的最佳实践

SQL是关系型数据库的核心,掌握SQL基础语法是进行数据库操作的前提。在下一集中,我们将学习SQL的增删改查操作,进一步提高数据库操作能力。

十一、练习

  1. 创建一个products表,包含id、name、price、category、created_at等字段
  2. 向products表中插入5条产品数据
  3. 查询所有产品的信息
  4. 查询价格大于100的产品
  5. 查询分类为"电子产品"的产品
  6. 查询价格在50到200之间的产品
  7. 更新某个产品的价格
  8. 删除某个产品
  9. 计算所有产品的平均价格
  10. 按分类分组,统计每组产品的数量
« 上一篇 SQLite数据库操作 下一篇 » SQL增删改查