作者:默语佬
CSDN技术博主
原创文章,转载请注明出处

前言

MySQL作为最流行的开源数据库,SELECT查询语句是每个开发者必须掌握的基础技能。很多人觉得SQL难学,但其实最核心的就那么几个关键字。今天我来详细讲解SELECT、WHERE、ORDER BY、LIMIT这四个最常用的查询子句,每个都配有实际使用示例,让你一看就懂,一学就会!

适用人群:后端开发者、数据库新人、对数据查询感兴趣的同学
难度等级:⭐(入门级)
学习时间:25分钟


在这里插入图片描述

目录

  1. SELECT:选择要查询的列
  2. FROM:指定数据来源
  3. WHERE:设置查询条件
  4. ORDER BY:结果排序
  5. LIMIT:限制结果数量
  6. 综合查询示例
  7. SQL查询执行顺序

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查询的能力!

学习路径建议

  1. 先掌握基础:SELECT、FROM、WHERE
  2. 再学排序:ORDER BY
  3. 最后分页:LIMIT
  4. 综合练习:将它们组合使用

性能优化提示

  1. WHERE条件:尽量使用索引列作为查询条件
  2. ORDER BY:避免在没有索引的列上排序
  3. LIMIT优化:分页查询时注意深度分页问题
  4. SELECT字段:只选择需要的字段,避免SELECT *

常见错误避免

  1. 忘记WHERE条件:导致全表查询
  2. ORDER BY位置错误:放在LIMIT之前
  3. LIMIT语法错误:OFFSET在前,COUNT在后
  4. 列名拼写错误:注意大小写敏感性

记住:SQL查询就像搭积木,一块一块地组合,就能构建出复杂的查询逻辑。多练习,多思考执行顺序,你很快就能写出高效的SQL查询!


📝 关于作者

默语佬,CSDN技术博主,专注于数据库技术、SQL优化、后端开发等领域。致力于用通俗易懂的方式分享技术知识。

技术专长

  • MySQL数据库
  • SQL查询优化
  • 后端开发
  • 技术写作

联系方式

  • CSDN:默语佬
  • 欢迎技术交流与合作

原创不易,如果这篇文章对你有帮助,请给个三连支持:点赞👍、收藏⭐、关注🔔!

有任何疑问欢迎评论区讨论,看到必回!如果你在学习SQL查询过程中遇到问题,也可以分享你的情况,我会提供针对性的解决方案~ 😊


版权声明:本文为默语佬原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。

更多推荐