一、SELECT语句:数据查询的基石
SELECT是SQL中最基础且核心的查询语句,用于从数据库表中检索指定列的数据。其基本语法结构如下:
SELECT column1, column2, ... FROM table_name WHERE condition;
1.1 基础查询实践
在基础查询中,开发者可通过*通配符快速获取所有列数据:
-- 查询用户表所有字段SELECT * FROM users;
或指定具体列名实现精准查询:
-- 仅查询用户ID和姓名SELECT user_id, username FROM users;
1.2 条件筛选进阶
WHERE子句支持多种条件组合,包括比较运算符(=, >, <)、逻辑运算符(AND, OR, NOT)及模糊匹配:
-- 查询年龄大于25且性别为男性的用户SELECT * FROM users WHERE age > 25 AND gender = 'male';-- 使用LIKE进行模糊查询(%表示任意字符)SELECT * FROM products WHERE name LIKE '%手机%';
1.3 聚合函数应用
通过GROUP BY与聚合函数(COUNT, SUM, AVG等)可实现数据统计分析:
-- 统计各部门的员工数量SELECT department, COUNT(*) as employee_count FROM employees GROUP BY department;-- 计算订单总金额SELECT SUM(amount) as total_amount FROM orders WHERE status = 'completed';
二、DISTINCT关键字:数据去重利器
当查询结果中存在重复数据时,DISTINCT可帮助快速获取唯一值集合。其使用方式如下:
2.1 单列去重场景
-- 获取所有不重复的城市名称SELECT DISTINCT city FROM customers;
2.2 多列组合去重
DISTINCT同样适用于多列组合的唯一性判断:
-- 获取不重复的(城市+省份)组合SELECT DISTINCT city, province FROM customers;
2.3 性能优化建议
- 对大表使用DISTINCT时,建议先通过WHERE条件缩小数据范围
- 考虑在相关列上建立索引以提升去重效率
- 避免在包含TEXT/BLOB等大字段的列上使用DISTINCT
三、LIMIT/OFFSET:分页查询解决方案
在数据量较大的场景下,分页查询是提升用户体验的关键技术。主流实现方式包括:
3.1 LIMIT基础语法
-- 查询前10条记录SELECT * FROM products ORDER BY price DESC LIMIT 10;
3.2 OFFSET偏移量控制
通过OFFSET指定起始位置实现分页:
-- 查询第2页数据(每页10条)SELECT * FROM products ORDER BY create_time DESC LIMIT 10 OFFSET 10;
3.3 替代方案对比
| 方案 | 语法示例 | 适用场景 |
|---|---|---|
| LIMIT+OFFSET | LIMIT 10 OFFSET 20 |
明确页码的分页需求 |
| ROW_NUMBER() | WITH numbered AS (...) SELECT * FROM numbered WHERE row_num BETWEEN 21 AND 30 |
复杂分页逻辑(如跨表关联时) |
3.4 性能优化策略
- 为ORDER BY涉及的列建立索引
- 避免在分页查询中使用子查询
- 大偏移量分页时考虑使用”上一页最大ID”方案替代OFFSET
四、ORDER BY:数据排序控制中心
排序是数据展示的重要环节,ORDER BY支持多列排序及自定义方向:
4.1 单列排序基础
-- 按价格升序排列SELECT * FROM products ORDER BY price ASC;-- 按注册时间降序排列(默认DESC可省略)SELECT * FROM users ORDER BY register_time DESC;
4.2 多列组合排序
-- 先按部门升序,再按薪资降序SELECT * FROM employees ORDER BY department ASC, salary DESC;
4.3 表达式排序应用
ORDER BY支持使用表达式或函数进行动态排序:
-- 按姓名长度排序SELECT username FROM users ORDER BY CHAR_LENGTH(username);-- 按折扣后价格排序SELECT product_name, price * 0.8 as discounted_priceFROM products ORDER BY discounted_price;
4.4 NULL值处理
不同数据库对NULL值的排序处理存在差异,常见模式包括:
- NULLS FIRST:将NULL值排在首位
- NULLS LAST:将NULL值排在末尾
-- PostgreSQL示例SELECT * FROM table ORDER BY column NULLS LAST;
五、综合应用案例
5.1 电商热销商品分页展示
-- 查询第3页的热销商品(按销量降序,每页12条)SELECTproduct_id,product_name,price,sales_countFROM productsWHERE status = 'on_sale'ORDER BY sales_count DESCLIMIT 12 OFFSET 24;
5.2 用户行为分析去重
-- 获取每个用户最近一次的登录记录WITH ranked_logins AS (SELECTuser_id,login_time,ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY login_time DESC) as rnFROM user_logins)SELECT user_id, login_timeFROM ranked_loginsWHERE rn = 1;
5.3 复杂排序场景实现
-- 按优先级和创建时间排序任务列表-- 优先级相同的情况下,较早创建的任务排在前面SELECTtask_id,title,priority,create_time,CASEWHEN priority = 'high' THEN 1WHEN priority = 'medium' THEN 2ELSE 3END as priority_rankFROM tasksORDER BY priority_rank, create_time;
六、最佳实践总结
- 查询优化:始终在WHERE条件中包含可过滤的列,减少数据扫描范围
- 索引设计:为ORDER BY和WHERE中频繁使用的列建立复合索引
- 分页策略:大数据量分页时,优先使用”seek method”替代OFFSET
- 代码可读性:对复杂查询使用CTE(WITH子句)提升可维护性
- 安全防护:始终使用参数化查询防止SQL注入,特别是在动态排序场景
通过系统掌握这些核心语法及其组合应用,开发者能够高效处理各类数据查询需求,为业务系统提供稳定可靠的数据支撑。在实际开发中,建议结合数据库执行计划分析工具,持续优化查询性能,确保系统在高并发场景下的响应速度。