一、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 ⚠️注意事项
- 查询语法关键字是带顺序关系的。

三、DDL 数据定义
2.1 创建数据库
1 2
| CREATE DATABASE 数据库名; USE 数据库名;
|
2.2 创建表
1 2 3 4 5
| CREATE TABLE 表名 ( 字段名1 数据类型 [约束], 字段名2 数据类型 [约束], ... );
|
常用数据类型:
- 整数:
INT、BIGINT
- 小数:
DECIMAL(m,n)、FLOAT、DOUBLE
- 字符串:
VARCHAR(n)、CHAR(n)、TEXT
- 日期:
DATE、DATETIME、TIMESTAMP
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 '张_'
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;
|
4.4 限制 LIMIT
1 2 3 4 5 6 7 8 9
| SELECT * FROM 表名 LIMIT 10; SELECT * FROM 表名 LIMIT 5, 10;
SELECT TOP 10 * FROM 表名;
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 * FROM 表1 INNER JOIN 表2 ON 表1.字段 = 表2.字段;
SELECT * FROM 表1 LEFT JOIN 表2 ON 表1.字段 = 表2.字段;
SELECT * FROM 表1 RIGHT JOIN 表2 ON 表1.字段 = 表2.字段;
SELECT * FROM 表1 LEFT JOIN 表2 ON ... UNION SELECT * FROM 表1 RIGHT JOIN 表2 ON ...;
|
子查询
1 2 3 4 5 6 7 8
| SELECT * FROM 表名 WHERE 字段 = (SELECT 字段 FROM ...);
SELECT * FROM 表名 WHERE 字段 IN (SELECT 字段 FROM ...);
SELECT * FROM 表名 WHERE EXISTS (SELECT 1 FROM ... WHERE 条件);
|
4.8 UNION 联合查询
1 2 3 4 5 6 7
| SELECT 字段 FROM 表1 UNION SELECT 字段 FROM 表2;
SELECT 字段 FROM 表1 UNION ALL SELECT 字段 FROM 表2;
|
五、常用函数
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
| SELECT IF(age >= 18, '成年', '未成年') FROM 表名;
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 视图名;
|
九、资料
B站快速入门课程
SQL学习编写网站