简单查询
sql
select [distinct]
* | [as 别名] ,列名 [as 别名]
from 表;
说明:
distinct : 表示去重,对输出的结果进行去重操作
*:表示所有的字段
| :表示 或者的意思,左边和右边的内容 不能在一个表中重复出现
条件查询
mysql
# 条件查询where子句语法
select
字段1
字段2
from 表名
where 条件
含有运算符的查询
mysql
# and 连接多个条件
select
字段1,
字段2,
...
from 表名
where 条件1
and 条件2
and 条件3
...;
# OR 或运算(满足任一条件即可)
select
字段1,
字段2
from 表名
where 条件1
or 条件2
or 条件3;
# NOT 非运算(取反,排除条件)
select
字段1,
字段2
from 表名
where not 条件;
select
字段1,
字段2
from 表名
where 字段 not in (值1, 值2, 值3);
select
字段1,
字段2
from 表名
where 字段 not between 值1 and 值2;
select
字段1,
字段2
from 表名
where 字段 is not null;
# IN 在集合中(多值等于判断的简写)
select
字段1,
字段2
from 表名
where 字段 in (值1, 值2, 值3);
-- BETWEEN...AND... 范围判断
select
字段1,
字段2
from 表名
where 字段 between 值1 and 值2;
-- LIKE 模糊匹配
select
字段1,
字段2
from 表名
where 字段 like '模式%';
select
字段1,
字段2
from 表名
where 字段 like '%模式';
select
字段1,
字段2
from 表名
where 字段 like '%模式%';
select
字段1,
字段2
from 表名
where 字段 like '_单字符';
# IS NULL / IS NOT NULL 空值判断
select
字段1,
字段2
from 表名
where 字段 is null;
select
字段1,
字段2
from 表名
where 字段 is not null;
| 运算符类型 | 符号 / 关键字 | 说明 | 示例 |
|---|---|---|---|
| 比较运算 | =、>、<、>=、<=、<>/!= |
等于、大于、小于、不等于... | WHERE age >= 18、WHERE status != 0 |
| 范围运算 | BETWEEN ... AND ... |
在指定数值 / 日期范围内 | WHERE amount BETWEEN 100 AND 500 |
| 集合运算 | IN (值 1, 值 2...) |
匹配集合中的任意值 | WHERE id IN (1,3,5) |
| 空值判断 | IS NULL / IS NOT NULL |
判断字段是否为 NULL (不能用 =) |
WHERE remark IS NULL |
| 模糊查询 | LIKE |
搭配通配符 % (任意字符)、_ (单个字符) |
WHERE name LIKE '张%' (姓张)、WHERE name LIKE '张_' (张 + 1 个字符) |
| 逻辑运算 | AND、OR、NOT |
多条件组合 (且 / 或 / 非) | WHERE age > 18 AND status = 1 |
注意避坑
-
NULL 判断必须用 IS NULL:
WHERE remark = NULL❌WHERE remark IS NULL✅ -
数值 vs 字符串:
若字段是字符串类型(如
varchar),数值条件需加引号WHERE id = '123' -
BETWEEN 包含边界:
BETWEEN 100 AND 500等价于>=100 AND <=500
- 使用null是is null,and 的优先级高于or.
查询排序
mysql
select [distinct]
* | 列名 [as 别名],列名 [as 别名]
from 表
[where 条件]
-- 排序操作
[order by 排序字段1 [ASC | DESC] [,排序字段2 [ASC | DESC]
....] ];
-- ASC:升序(默认)
-- DESC:降序
聚合查询
聚合函数 :之前我们做的查询都是横向查询,它们都是根据条件一行一行的进行判断,而使用聚合函数查询是纵向查询,聚合查询是对一列的值进行计算,然后返回一个单一的值;另外聚合函数会忽略空 (NULL) 值。
| 常用聚合函数 | 作用 |
|---|---|
count() |
统计指定列不为 NULL 的记录行数; |
sum() |
计算指定列的数值和,如果指定列类型不是数值类型,那么计算结果为 0 |
max() |
计算指定列的最大值,如果指定列是字符串类型,那么使用字符串排序运算; |
min() |
计算指定列的最小值,如果指定列是字符串类型,那么使用字符串排序运算; |
avg() |
计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为 0 |
| 函数 | 执行逻辑 |
|---|---|
count(*) |
统计满足 WHERE 条件的所有行(包括字段为 NULL 的行),是 SQL 标准语法,数据库会做最优优化。 |
count(1) |
不读取表的任何字段,而是给每一行「标记一个数字 1」,统计有多少个「1」(等价于统计行数),同样包含 NULL 行。 |
mysql
# COUNT 统计记录数
select
count(*) as 总记录数
from 表名;
select
count(字段名) as 非空记录数
from 表名;
select
count(distinct 字段名) as 去重后数量
from 表名;
# SUM 求和
select
sum(数值字段) as 总和
from 表名;
# AVG 平均值
select
avg(数值字段) as 平均值
from 表名;
# MAX 最大值
select
max(数值字段) as 最大值
from 表名;
# MIN 最小值
select
min(数值字段) as 最小值
from 表名;
# 聚合函数 + WHERE 条件过滤
select
count(*) as 满足条件的记录数
from 表名
where 条件;
cast转换类型函数
CAST 是数据类型转换函数,用于将一种数据类型的值转换为另一种数据类型。
mysql
# CAST 基础语法
select
cast(字段名 as 数据类型) as 别名
from 表名;
分组查询
mysql
# GROUP BY 基础分组
select
分组字段,
聚合函数(字段) as 别名
from 表名
group by 分组字段;
# GROUP BY 多字段分组
select
分组字段1,
分组字段2,
聚合函数(字段) as 别名
from 表名
group by
分组字段1,
分组字段2;
# GROUP BY + WHERE 先过滤再分组
select
分组字段,
count(*) as 数量
from 表名
where 条件
group by 分组字段;
#having 用法
select
分组字段,
count(*) as 数量
from 表名
group by 分组字段
having 聚合条件;
分组必聚合
先明确 WHERE 和 HAVING 的核心差异:
| 特性 | WHERE | HAVING |
|---|---|---|
| 作用时机 | 分组之前筛选数据 | 分组之后筛选数据 |
| 操作对象 | 原始表的行数据(普通字段) | 分组后的聚合结果(聚合函数) |
| 是否能使用聚合函数 | 不可以 | 可以 |
询问式插入
mysql
insert into 目标表
select
字段1,
字段2,
...
from 来源表
where 条件;
| 仅插入数据(表已存在) | SELECT FROM |
INSERT INTO 表名 SELECT ... FROM ... |
|---|---|---|
| 操作目标 | 核心关键词 | 完整语法结构 |
| 建表 + 插入数据(表不存在) | AS SELECT FROM |
CREATE TABLE 表名 AS SELECT ... FROM ... |
查询代码关键词执行优先级顺序:FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY
分页查询mysql⽅⾔limit
mysql
-- MySQL分⻚查询:
-- 语法: limit [start,] num
-- start: 默认从 0开始 表⽰ 表中的第⼀条数据 每⻚的起始值: 计算公式 (N -1) * 每⻚条数 N表⽰第⼏⻚
-- num: 获取多少条 (每⻚显⽰的条数)
-- 放置位置: 整个SQL语句的最后⾯
外键约束
mysql
create table 子表(
字段1 数据类型,
字段2 数据类型,
...
constraint 外键名称 foreign key (子表字段) references 父表(父表主键)
);
内连接查询(inner join)
mysql
select
表1.字段1,
表1.字段2,
表2.字段1,
...
from 表1
inner join 表2 on 表1.关联字段 = 表2.关联字段
where 条件;
# 作用:返回两个表中匹配的记录,不匹配的记录不显示(取交集)
左连接查询(left join)
mysql
select
表1.字段1,
表1.字段2,
表2.字段1,
...
from 表1
left join 表2 on 表1.关联字段 = 表2.关联字段
where 条件;
# 作用:返回左表所有记录,右表匹配的记录显示,不匹配的显示NULL(以左表为主)
右连接查询(right join)
mysql
select
表1.字段1,
表1.字段2,
表2.字段1,
...
from 表1
right join 表2 on 表1.关联字段 = 表2.关联字段
where 条件;
# 作用:返回右表所有记录,左表匹配的记录显示,不匹配的显示NULL(以右表为主)
子查询
mysql
select
表1.字段1,
表1.字段2,
(select 字段 from 表2 where 条件) as 别名,
...
from 表1
where 表1.字段 运算符 (select 字段 from 表2 where 条件);
三种常见子查询格式:
1. 子查询当条件(where后)
mysql
select
字段1,
字段2,
...
from 表1
where 字段 > (select 字段 from 表2 where 条件);
# 作用:子查询结果作为主查询的过滤条件
2. 子查询当来源(from后)
mysql
select
t.字段1,
t.字段2,
...
from (select 字段 from 表2 where 条件) as t
where 条件;
# 作用:子查询结果作为临时表供主查询使用
3. 子查询当字段(select后)
mysql
select
字段1,
(select 字段 from 表2 where 表2.关联字段 = 表1.关联字段) as 别名,
...
from 表1
where 条件;
# 作用:子查询结果为每行动态计算一个字段值