Loading ...
第五篇:MySQL 高级查询技巧

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

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

-- 只查询学生姓名和年龄
SELECT name, age FROM students;

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

查询前 N 条记录

SELECT * FROM 表名 LIMIT 数量;
-- 示例:查询前10条学生记录
SELECT * FROM students LIMIT 10;

分页查询

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

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

逻辑运算符

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

NULL 值处理

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

-- 查询未填写手机号的用户
SELECT * FROM users WHERE phone IS NULL;

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

集合查询(IN / NOT IN)

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

-- 查询学历为小学、中学、高中的学生
SELECT * FROM students 
WHERE education IN ('小学', '中学', '高中');

-- 查询学历不是小学、中学的学生
SELECT * FROM students 
WHERE education NOT IN ('小学', '中学');

模糊查询(LIKE / REGEXP)

LIKE + 通配符

  • %:匹配任意多个字符(包括 0 个);
  • _:匹配单个字符。
-- 查询姓名中包含“张”的用户
SELECT * FROM users WHERE name LIKE '%张%';

-- 查询姓名为“张X三”的用户(X为任意单个字符)
SELECT * FROM users WHERE name LIKE '张_三';

REGEXP + 正则表达式

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

-- 查询姓名以“张”开头的用户
SELECT * FROM users WHERE name REGEXP '^张';

-- 查询姓名以“三”结尾的用户
SELECT * FROM users WHERE name REGEXP '三$';

排序查询(ORDER BY)

单字段排序

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

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

SELECT * FROM students ORDER BY age DESC;

多字段排序

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

-- 先按年龄降序,年龄相同则按姓名升序
SELECT * FROM students 
ORDER BY age DESC, name ASC;

范围查询(BETWEEN AND)

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

-- 查询年龄在18-25岁之间的学生(等价于age >= 18 AND age <= 25)
SELECT * FROM students 
WHERE age BETWEEN 18 AND 25;

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

分组查询(GROUP BY)

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

SELECT 分组字段, 聚合函数(字段) FROM 表名 GROUP BY 分组字段;

示例

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

WHERE 与 HAVING 的区别

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

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

SELECT gender, COUNT(*) AS 人数 
FROM students 
WHERE age > 18  -- 先筛选年龄>18的学生
GROUP BY gender 
HAVING 人数 > 10;  -- 再筛选人数>10的分组

暂无评论

发送评论 编辑评论

|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇