MySQL基础查询语法:SELECT、WHERE、ORDER BY、LIMIT详解
MySQL作为最流行的开源数据库,SELECT查询语句是每个开发者必须掌握的基础技能。很多人觉得SQL难学,但其实最核心的就那么几个关键字。今天我来详细讲解SELECT、WHERE、ORDER BY、LIMIT这四个最常用的查询子句,每个都配有实际使用示例,让你一看就懂,一学就会!
作者:默语佬
CSDN技术博主
原创文章,转载请注明出处
前言
MySQL作为最流行的开源数据库,SELECT查询语句是每个开发者必须掌握的基础技能。很多人觉得SQL难学,但其实最核心的就那么几个关键字。今天我来详细讲解SELECT、WHERE、ORDER BY、LIMIT这四个最常用的查询子句,每个都配有实际使用示例,让你一看就懂,一学就会!
适用人群:后端开发者、数据库新人、对数据查询感兴趣的同学
难度等级:⭐(入门级)
学习时间:25分钟

目录
SELECT:选择要查询的列
SELECT语句的基本结构
SELECT是SQL查询的核心,用于指定要从数据库中检索哪些列的数据。
基本语法:
SELECT column1, column2, column3
FROM table_name;
选择所有列
使用*通配符选择所有列:
-- 查询users表的所有列
SELECT * FROM users;
-- 虽然方便,但生产环境不推荐
-- 因为会返回不需要的数据,影响性能
选择特定列
明确指定要查询的列名:
-- 查询用户的姓名和邮箱
SELECT name, email FROM users;
-- 查询订单的ID、金额和状态
SELECT order_id, total_amount, status FROM orders;
列别名
使用AS关键字给列指定别名:
-- 给列指定别名,让结果更易读
SELECT
user_id AS 用户ID,
name AS 姓名,
email AS 邮箱地址
FROM users;
-- 别名可以简化后续引用
SELECT
name AS n,
age AS a
FROM users
WHERE n LIKE '张%'; -- 使用别名n
计算列
SELECT还可以进行简单的数学计算:
-- 计算订单的总价(数量 × 单价)
SELECT
product_name,
quantity,
price,
quantity * price AS total_price
FROM order_items;
-- 计算用户的年龄
SELECT
name,
YEAR(CURDATE()) - YEAR(birth_date) AS age
FROM users;
FROM:指定数据来源
单表查询
FROM子句指定要查询的数据表:
-- 从users表查询数据
SELECT name, email FROM users;
-- 从orders表查询数据
SELECT * FROM orders;
表别名
使用表别名简化SQL语句:
-- 给表指定别名
SELECT u.name, u.email
FROM users u;
-- 表别名在多表连接时特别有用
SELECT u.name, o.order_date
FROM users u
JOIN orders o ON u.user_id = o.user_id;
WHERE:设置查询条件
WHERE子句的作用
WHERE子句用于过滤数据,只返回满足条件的数据行。
语法结构:
SELECT column_list
FROM table_name
WHERE condition;
比较运算符
-- 等值查询
SELECT * FROM users WHERE age = 25;
-- 不等于
SELECT * FROM users WHERE status != 'inactive';
-- 大于、小于
SELECT * FROM products WHERE price > 100;
SELECT * FROM products WHERE stock < 10;
-- 大于等于、小于等于
SELECT * FROM orders WHERE total_amount >= 500;
SELECT * FROM users WHERE created_at <= '2024-01-01';
逻辑运算符
-- AND:同时满足多个条件
SELECT * FROM users
WHERE age >= 18 AND status = 'active';
-- OR:满足任一条件
SELECT * FROM products
WHERE category = '电子产品' OR category = '服装';
-- NOT:取反
SELECT * FROM users
WHERE NOT status = 'banned';
-- 组合使用
SELECT * FROM orders
WHERE (status = 'paid' OR status = 'shipped')
AND total_amount > 200;
模糊查询
使用LIKE进行模糊匹配:
-- % 通配符:匹配任意字符
SELECT * FROM users WHERE name LIKE '张%'; -- 以"张"开头
SELECT * FROM users WHERE email LIKE '%@qq.com'; -- 以"@qq.com"结尾
SELECT * FROM users WHERE phone LIKE '138%'; -- 以"138"开头
-- _ 通配符:匹配单个字符
SELECT * FROM users WHERE phone LIKE '138____5678'; -- 138开头,5678结尾,中间4位任意
范围查询
-- BETWEEN AND:范围查询
SELECT * FROM products
WHERE price BETWEEN 100 AND 500;
-- IN:枚举值查询
SELECT * FROM users
WHERE status IN ('active', 'pending', 'suspended');
-- NOT IN:排除某些值
SELECT * FROM orders
WHERE status NOT IN ('cancelled', 'refunded');
空值处理
-- IS NULL:查找空值
SELECT * FROM users WHERE email IS NULL;
-- IS NOT NULL:查找非空值
SELECT * FROM users WHERE deleted_at IS NOT NULL;
ORDER BY:结果排序
ORDER BY的基本用法
ORDER BY子句用于对查询结果进行排序。
语法:
SELECT column_list
FROM table_name
WHERE condition
ORDER BY column1 [ASC|DESC], column2 [ASC|DESC];
升序和降序
-- 默认升序(ASC)
SELECT * FROM products ORDER BY price;
-- 明确指定升序
SELECT * FROM products ORDER BY price ASC;
-- 降序排列
SELECT * FROM users ORDER BY created_at DESC;
-- 按多个字段排序
SELECT * FROM orders
ORDER BY created_at DESC, total_amount DESC;
排序规则
-- 按字符串排序(字典序)
SELECT * FROM users ORDER BY name ASC;
-- 按数字排序
SELECT * FROM products ORDER BY price DESC;
-- 按日期时间排序
SELECT * FROM orders ORDER BY created_at DESC;
-- NULL值排序(MySQL中NULL值最小)
SELECT * FROM users ORDER BY last_login DESC;
-- NULL值会排在最后
实际应用场景
-- 查询最新注册的用户
SELECT * FROM users
ORDER BY created_at DESC
LIMIT 10;
-- 查询最贵的商品(前5名)
SELECT * FROM products
WHERE category = '电子产品'
ORDER BY price DESC
LIMIT 5;
-- 查询活跃用户(按最后登录时间排序)
SELECT * FROM users
WHERE status = 'active'
ORDER BY last_login DESC;
LIMIT:限制结果数量
LIMIT的基本用法
LIMIT子句用于限制查询结果的数量,常用于分页查询。
语法:
SELECT column_list
FROM table_name
WHERE condition
ORDER BY column_list
LIMIT [offset,] row_count;
限制返回行数
-- 返回前5条记录
SELECT * FROM users LIMIT 5;
-- 返回前10个商品
SELECT * FROM products LIMIT 10;
分页查询
-- 分页查询:每页10条,第1页(第1-10条)
SELECT * FROM users
ORDER BY created_at DESC
LIMIT 0, 10;
-- 第2页(第11-20条)
SELECT * FROM users
ORDER BY created_at DESC
LIMIT 10, 10;
-- 第3页(第21-30条)
SELECT * FROM users
ORDER BY created_at DESC
LIMIT 20, 10;
分页公式:
- 第N页的OFFSET = (N-1) × 每页条数
- LIMIT offset, count
综合查询示例
用户管理场景
-- 查询活跃用户,按注册时间倒序,只返回前20个
SELECT
user_id,
name,
email,
created_at,
last_login
FROM users
WHERE status = 'active'
AND deleted_at IS NULL
ORDER BY created_at DESC
LIMIT 20;
订单查询场景
-- 查询本月销售额最高的10个商品
SELECT
p.product_id,
p.product_name,
SUM(oi.quantity * oi.price) AS total_sales
FROM products p
JOIN order_items oi ON p.product_id = oi.product_id
JOIN orders o ON oi.order_id = o.order_id
WHERE o.status = 'completed'
AND o.created_at >= DATE_FORMAT(CURDATE(), '%Y-%m-01')
GROUP BY p.product_id, p.product_name
ORDER BY total_sales DESC
LIMIT 10;
商品搜索场景
-- 搜索价格在100-500之间的电子产品,按价格升序
SELECT
product_id,
product_name,
price,
stock,
category
FROM products
WHERE category = '电子产品'
AND price BETWEEN 100 AND 500
AND stock > 0
ORDER BY price ASC
LIMIT 50;
SQL查询执行顺序
理解SQL查询的执行顺序有助于写出更高效的查询语句。

执行顺序的重要性:
-- 错误的写法:WHERE中使用了聚合函数
SELECT department, AVG(salary) as avg_salary
FROM employees
WHERE AVG(salary) > 5000; -- 错误!WHERE不能使用聚合函数
-- 正确写法:使用HAVING
SELECT department, AVG(salary) as avg_salary
FROM employees
GROUP BY department
HAVING AVG(salary) > 5000; -- HAVING可以过滤分组结果
总结与学习建议
掌握了这四个基本查询子句,你已经具备了编写大部分SQL查询的能力!
学习路径建议
- 先掌握基础:SELECT、FROM、WHERE
- 再学排序:ORDER BY
- 最后分页:LIMIT
- 综合练习:将它们组合使用
性能优化提示
- WHERE条件:尽量使用索引列作为查询条件
- ORDER BY:避免在没有索引的列上排序
- LIMIT优化:分页查询时注意深度分页问题
- SELECT字段:只选择需要的字段,避免SELECT *
常见错误避免
- 忘记WHERE条件:导致全表查询
- ORDER BY位置错误:放在LIMIT之前
- LIMIT语法错误:OFFSET在前,COUNT在后
- 列名拼写错误:注意大小写敏感性
记住:SQL查询就像搭积木,一块一块地组合,就能构建出复杂的查询逻辑。多练习,多思考执行顺序,你很快就能写出高效的SQL查询!
📝 关于作者
默语佬,CSDN技术博主,专注于数据库技术、SQL优化、后端开发等领域。致力于用通俗易懂的方式分享技术知识。
技术专长:
- MySQL数据库
- SQL查询优化
- 后端开发
- 技术写作
联系方式:
- CSDN:默语佬
- 欢迎技术交流与合作
原创不易,如果这篇文章对你有帮助,请给个三连支持:点赞👍、收藏⭐、关注🔔!
有任何疑问欢迎评论区讨论,看到必回!如果你在学习SQL查询过程中遇到问题,也可以分享你的情况,我会提供针对性的解决方案~ 😊
版权声明:本文为默语佬原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。
更多推荐




所有评论(0)