SQL 基础笔记

一、SQL 简介

1.1 什么是 SQL

SQL(Structured Query Language):用于管理关系型数据库的标准编程语言。

  • RDBMS:Relational Database Management System,关系型数据库管理系统
  • 常见数据库(类型):MySQL、PostgreSQL、SQLite、Oracle、SQL Server
    1.SQLite:轻量级、嵌入式,适合移动应用
    2.MySQL:开源、流行,适合Web应用
    3.PostgreSQL:开源、功能强大,适合复杂应用
    4.Oracle:企业级、功能全面,适合大型应用
    5.SQL Server:微软开发,适合Windows环境

1.2 SQL 基本分类

四大门派,用这几门绝学来与数据库进行交流。学废了也就当个搬运工。🐶

分类 用途 关键字
DDL 定义数据库结构 CREATE、ALTER、DROP
DML 操作数据 INSERT、UPDATE、DELETE
DQL 查询数据 SELECT
DCL 控制权限 GRANT、REVOKE

二、基础语法

2.1 基本规则

  • SQL 语句以分号 ; 结尾(部分数据库可不加)
  • 关键字不区分大小写,但习惯上关键字大写,表名/字段名小写
  • 字符串和日期用单引号 ' ' 包围
  • 注释:-- 单行注释/* 多行注释 */

2.2 书写规范

1
2
3
4
5
6
7
8
9
10
11
-- 推荐的书写风格
SELECT
id,
name,
email
FROM
users /* 是否使用双引号取决于数据库类型 */
WHERE
status = 'active'
ORDER BY
create_time DESC;

2.3 常用运算符

算术运算符

运算符 说明
+
-
*
/
%MOD() 取余

比较运算符

运算符 说明
= 等于
<>!= 不等于
> 大于
< 小于
>= 大于等于
<= 小于等于

逻辑运算符

运算符 说明
AND 且(优先级比OR更高 和Cpp一样可以用括号 )
OR
NOT

2.4 常用命令(MySQL)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
-- 显示所有数据库
SHOW DATABASES;

-- 显示当前数据库所有表
SHOW TABLES;

-- 查看表结构
DESC 表名;
-- 或
DESCRIBE 表名;

-- 查看建表语句
SHOW CREATE TABLE 表名;

-- 显示表的所有列信息
SHOW FULL COLUMNS FROM 表名;

2.5 ⚠️注意事项

  1. 查询语法关键字是带顺序关系的。
  2. 截屏2026-04-12 18.51.16

三、DDL 数据定义

2.1 创建数据库

1
2
CREATE DATABASE 数据库名;
USE 数据库名;

2.2 创建表

1
2
3
4
5
CREATE TABLE 表名 (
字段名1 数据类型 [约束],
字段名2 数据类型 [约束],
...
);

常用数据类型

  • 整数:INTBIGINT
  • 小数:DECIMAL(m,n)FLOATDOUBLE
  • 字符串:VARCHAR(n)CHAR(n)TEXT
  • 日期:DATEDATETIMETIMESTAMP

2.3 约束

1
2
3
4
5
6
7
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
email VARCHAR(100) UNIQUE,
age INT DEFAULT 18,
FOREIGN KEY (dept_id) REFERENCES departments(id)
);

常用约束

  • PRIMARY KEY:主键,唯一标识
  • NOT NULL:非空
  • UNIQUE:唯一
  • DEFAULT:默认值
  • FOREIGN KEY:外键约束
  • AUTO_INCREMENT:自增(MySQL)

2.4 修改表结构

1
2
3
4
5
6
7
8
9
10
11
-- 添加字段
ALTER TABLE 表名 ADD 字段名 数据类型;

-- 修改字段
ALTER TABLE 表名 MODIFY 字段名 新数据类型;

-- 删除字段
ALTER TABLE 表名 DROP COLUMN 字段名;

-- 重命名表
ALTER TABLE 表名 RENAME TO 新表名;

2.5 删除表

1
2
DROP TABLE 表名;           -- 删除表结构
TRUNCATE TABLE 表名; -- 清空表数据(保留结构)

三、DML 数据操作

3.1 插入数据

1
2
3
4
5
6
7
8
9
10
11
-- 插入单条
INSERT INTO 表名 (字段1, 字段2) VALUES (值1, 值2);

-- 插入多条
INSERT INTO 表名 (字段1, 字段2) VALUES
(值1, 值2),
(值3, 值4),
(值5, 值6);

-- 从其他表导入
INSERT INTO 表名 SELECT * FROM 其他表 WHERE 条件;

3.2 更新数据

1
2
3
UPDATE 表名
SET 字段1 = 新值1, 字段2 = 新值2
WHERE 条件;

3.3 删除数据

1
DELETE FROM 表名 WHERE 条件;

四、DQL 数据查询(核心)

4.1 基本查询

1
2
3
4
5
6
7
8
9
10
11
-- 查询所有字段
SELECT * FROM 表名;

-- 查询指定字段
SELECT 字段1, 字段2 FROM 表名;

-- 去重
SELECT DISTINCT 字段 FROM 表名;

-- 别名
SELECT 字段 AS 别名 FROM 表名;

4.2 条件查询 WHERE

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
SELECT * FROM 表名 WHERE 条件;

-- 比较运算符
WHERE age > 18
WHERE name = '张三'
WHERE age >= 18 AND age <= 30

-- 范围
WHERE age BETWEEN 18 AND 30

-- 枚举
WHERE status IN ('active', 'pending')

-- 模糊匹配
WHERE name LIKE '张%' -- 张开头
WHERE name LIKE '%三%' -- 包含三
WHERE name LIKE '张_' -- 张开头,2个字

-- 空值
WHERE email IS NULL
WHERE email IS NOT NULL

4.3 排序 ORDER BY

1
2
3
4
SELECT * FROM 表名 ORDER BY 字段1 ASC, 字段2 DESC;

-- ASC:升序(默认)
-- DESC:降序

4.4 限制 LIMIT

1
2
3
4
5
6
7
8
9
-- MySQL
SELECT * FROM 表名 LIMIT 10;
SELECT * FROM 表名 LIMIT 5, 10; -- 从第5条开始,取10条

-- SQL Server
SELECT TOP 10 * FROM 表名;

-- Oracle
SELECT * FROM 表名 WHERE ROWNUM <= 10;

4.5 聚合函数

1
2
3
4
5
6
7
8
SELECT
COUNT(*) AS 总记录数,
COUNT(字段) AS 非空数量,
SUM(字段) AS 求和,
AVG(字段) AS 平均值,
MAX(字段) AS 最大值,
MIN(字段) AS 最小值
FROM 表名;

4.6 分组 GROUP BY

1
2
3
4
SELECT 字段, 聚合函数
FROM 表名
GROUP BY 字段
HAVING 聚合条件;

注意WHERE 在分组前过滤,HAVING 在分组后过滤。

1
2
3
4
5
-- 示例:统计每个部门的平均工资
SELECT dept_id, AVG(salary) AS avg_salary
FROM employees
GROUP BY dept_id
HAVING AVG(salary) > 5000;

4.7 多表查询

连接(JOIN)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
-- 内连接:只保留匹配的行
SELECT *
FROM1
INNER JOIN2 ON1.字段 =2.字段;

-- 左连接:保留左表全部,右表无匹配为 NULL
SELECT *
FROM1
LEFT JOIN2 ON1.字段 =2.字段;

-- 右连接:保留右表全部
SELECT *
FROM1
RIGHT JOIN2 ON1.字段 =2.字段;

-- 全连接(MySQL 不支持,用 UNION 模拟)
SELECT * FROM1 LEFT JOIN2 ON ...
UNION
SELECT * FROM1 RIGHT JOIN2 ON ...;

子查询

1
2
3
4
5
6
7
8
-- WHERE 中的子查询
SELECT * FROM 表名 WHERE 字段 = (SELECT 字段 FROM ...);

-- IN 子查询
SELECT * FROM 表名 WHERE 字段 IN (SELECT 字段 FROM ...);

-- EXISTS 子查询
SELECT * FROM 表名 WHERE EXISTS (SELECT 1 FROM ... WHERE 条件);

4.8 UNION 联合查询

1
2
3
4
5
6
7
SELECT 字段 FROM1
UNION -- 去重合并
SELECT 字段 FROM2;

SELECT 字段 FROM1
UNION ALL -- 保留重复
SELECT 字段 FROM2;

五、常用函数

5.1 字符串函数

函数 作用
CONCAT(s1, s2) 拼接字符串
LENGTH(s) 获取长度
UPPER(s) / LOWER(s) 大小写转换
TRIM(s) 去除首尾空格
SUBSTRING(s, start, len) 截取子串
REPLACE(s, old, new) 替换
IFNULL(s, default) NULL 替换

5.2 数值函数

函数 作用
ROUND(n, d) 四舍五入
CEIL(n) / FLOOR(n) 向上/下取整
ABS(n) 绝对值
MOD(n, m) 取余
RAND() 随机数

5.3 日期函数

函数 作用
NOW() / SYSDATE() 当前日期时间
CURDATE() 当前日期
YEAR(d) / MONTH(d) / DAY(d) 提取年月日
DATE_FORMAT(d, format) 格式化日期
DATE_ADD(d, INTERVAL n unit) 日期加减
DATEDIFF(d1, d2) 日期差值
1
SELECT DATE_FORMAT(create_time, '%Y-%m-%d %H:%i:%s') FROM 表名;

5.4 条件判断

1
2
3
4
5
6
7
8
9
10
11
12
-- IF
SELECT IF(age >= 18, '成年', '未成年') FROM 表名;

-- CASE WHEN
SELECT
CASE
WHEN score >= 90 THEN 'A'
WHEN score >= 80 THEN 'B'
WHEN score >= 60 THEN 'C'
ELSE 'D'
END AS grade
FROM 表名;

六、索引

6.1 索引类型

类型 说明
普通索引 允许重复值
唯一索引 值唯一
主键索引 主键自动创建,唯一且非空
全文索引 全文搜索(MyISAM)
组合索引 多列组合

6.2 创建索引

1
2
3
4
5
6
7
8
9
10
11
12
13
14
-- 创建索引
CREATE INDEX 索引名 ON 表名(字段);

-- 创建唯一索引
CREATE UNIQUE INDEX 索引名 ON 表名(字段);

-- 创建组合索引
CREATE INDEX 索引名 ON 表名(字段1, 字段2);

-- 查看索引
SHOW INDEX FROM 表名;

-- 删除索引
DROP INDEX 索引名 ON 表名;

6.3 索引原则

  • 适合:数据量大、查询频繁、WHERE 条件常用
  • 避免:数据量小、更新频繁、区分度低的字段
  • 最左前缀:组合索引从左开始使用

七、事务

7.1 事务特性(ACID)

  • Atomicity(原子性):要么全部成功,要么全部失败
  • Consistency(一致性):事务前后数据状态一致
  • Isolation(隔离性):并发事务互不干扰
  • Durability(持久性):提交后数据永久保存

7.2 事务控制

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
-- 开启事务
START TRANSACTION;
-- 或
BEGIN;

-- 提交
COMMIT;

-- 回滚
ROLLBACK;

-- 设置保存点
SAVEPOINT 保存点名称;

-- 回滚到保存点
ROLLBACK TO 保存点名称;

7.3 隔离级别

隔离级别 脏读 不可重复读 幻读
READ UNCOMMITTED 可能 可能 可能
READ COMMITTED 不可能 可能 可能
REPEATABLE READ(默认) 不可能 不可能 可能
SERIALIZABLE 不可能 不可能 不可能
1
SET SESSION TRANSACTION ISOLATION LEVEL 级别;

八、视图

1
2
3
4
5
6
7
8
9
10
11
-- 创建视图
CREATE VIEW 视图名 AS
SELECT 字段1, 字段2
FROM 表名
WHERE 条件;

-- 使用视图
SELECT * FROM 视图名;

-- 删除视图
DROP VIEW 视图名;

九、资料

  1. B站快速入门课程

  2. SQL学习编写网站