第五篇:MySQL 高级查询技巧

投影查询(只查需要的字段)

只查询指定字段,减少数据传输量,提升效率:

1
2
3
<code>-- 只查询学生姓名和年龄
SELECT name, age FROM students;
</code>

限制查询(分页与取前 N 条)

查询前 N 条记录

1
2
3
4
<code>SELECT * FROM 表名 LIMIT 数量;
-- 示例:查询前10条学生记录
SELECT * FROM students LIMIT 10;
</code>

分页查询

1
2
3
4
<code>SELECT * FROM 表名 LIMIT 起始位置, 数量;  -- 起始位置从0开始
-- 示例:查询第11-20条记录(起始位置=10,数量=10)
SELECT * FROM students LIMIT 10, 10;
</code>

条件查询(精准筛选数据)

逻辑运算符

  • AND(同时满足多个条件):
1
2
3
4
<code>-- 查询年龄&gt;18且性别为男的学生
SELECT * FROM students
WHERE age &gt; 18 AND gender = &#039;男&#039;;
</code>
  • OR(满足任一条件):
1
2
3
4
<code>-- 查询年龄&lt;18或学历为小学的学生
SELECT * FROM students
WHERE age &lt; 18 OR education = &#039;小学&#039;;
</code>
  • NOT(排除条件):
1
2
3
4
<code>-- 查询性别不是男的学生
SELECT * FROM students
WHERE NOT gender = &#039;男&#039;;
</code>

NULL 值处理

NULL表示 “未知”,不能用=!=判断,需用IS NULLIS NOT NULL

1
2
3
4
5
6
<code>-- 查询未填写手机号的用户
SELECT * FROM users WHERE phone IS NULL;

-- 查询已填写手机号的用户
SELECT * FROM users WHERE phone IS NOT NULL;
</code>

集合查询(IN / NOT IN)

判断字段值是否在指定集合中:

1
2
3
4
5
6
7
8
<code>-- 查询学历为小学、中学、高中的学生
SELECT * FROM students
WHERE education IN (&#039;小学&#039;, &#039;中学&#039;, &#039;高中&#039;);

-- 查询学历不是小学、中学的学生
SELECT * FROM students
WHERE education NOT IN (&#039;小学&#039;, &#039;中学&#039;);
</code>

模糊查询(LIKE / REGEXP)

LIKE + 通配符

  • %:匹配任意多个字符(包括 0 个);
  • _:匹配单个字符。
1
2
3
4
5
6
<code>-- 查询姓名中包含“张”的用户
SELECT * FROM users WHERE name LIKE &#039;%张%&#039;;

-- 查询姓名为“张X三”的用户(X为任意单个字符)
SELECT * FROM users WHERE name LIKE &#039;张_三&#039;;
</code>

REGEXP + 正则表达式

更灵活的模糊匹配,支持正则语法:

1
2
3
4
5
6
<code>-- 查询姓名以“张”开头的用户
SELECT * FROM users WHERE name REGEXP &#039;^张&#039;;

-- 查询姓名以“三”结尾的用户
SELECT * FROM users WHERE name REGEXP &#039;三$&#039;;
</code>

排序查询(ORDER BY)

单字段排序

1
2
3
<code>SELECT * FROM 表名 ORDER BY 字段 [ASC|DESC];
-- ASC:升序(默认,可省略);DESC:降序
</code>

示例:按年龄降序查询学生(年龄大的在前)

1
2
<code>SELECT * FROM students ORDER BY age DESC;
</code>

多字段排序

当第一个字段值相同时,按第二个字段排序:

1
2
3
4
<code>-- 先按年龄降序,年龄相同则按姓名升序
SELECT * FROM students
ORDER BY age DESC, name ASC;
</code>

范围查询(BETWEEN AND)

查询字段值在指定范围内的数据(包含边界值):

1
2
3
4
5
6
7
8
<code>-- 查询年龄在18-25岁之间的学生(等价于age &gt;= 18 AND age &lt;= 25)
SELECT * FROM students
WHERE age BETWEEN 18 AND 25;

-- 查询年龄不在18-25岁之间的学生
SELECT * FROM students
WHERE age NOT BETWEEN 18 AND 25;
</code>

分组查询(GROUP BY)

结合聚合函数COUNTSUMAVGMAXMIN)对数据分组统计,语法:

1
2
<code>SELECT 分组字段, 聚合函数(字段) FROM 表名 GROUP BY 分组字段;
</code>

示例

  • 按性别统计学生人数:
1
2
3
4
<code>SELECT gender, COUNT(*) AS 人数 
FROM students
GROUP BY gender;
</code>
  • 按学历计算平均年龄:
1
2
3
4
<code>SELECT education, AVG(age) AS 平均年龄 
FROM students
GROUP BY education;
</code>

WHERE 与 HAVING 的区别

WHERE分组前筛选数据,不能使用聚合函数;HAVING分组后筛选聚合结果,可使用聚合函数。

示例:筛选出人数大于 10 的性别分组

1
2
3
4
5
<code>SELECT gender, COUNT(*) AS 人数 
FROM students
WHERE age &gt; 18 -- 先筛选年龄&gt;18的学生
GROUP BY gender
HAVING 人数 &gt; 10; -- 再筛选人数&gt;10的分组</code>

上一篇
下一篇