小木的学习日记-SQL按条件筛选数据

SQL WHERE 子句:数据筛选的核心逻辑与实战指南

一、引言:为什么 WHERE 如此重要?

在 SQL 中,WHERE子句是数据筛选的 “过滤器”,类比 Python 中的if语句,决定哪些行能进入结果集。掌握它,就能从海量数据中精准提取所需信息,是数据分析和开发的必备技能。

二、WHERE 基本用法:从简单筛选到运算符对比
1. 基础语法:筛选单价 > 500 的商品

sql

SELECT sku_name, sku_price
FROM commodity
WHERE sku_price > 500;

  • 逻辑:仅返回sku_price大于 500 的行,类似 Python 的if sku_price > 500
2. 运算符对比(SQL vs Python)
功能PythonSQL
等于===
不等于!=<>(或!=,部分数据库支持)
大于 / 小于><同 Python

示例:SQL 中WHERE age = 18表示 “年龄等于 18”,而 Python 中需写age == 18

三、特殊场景处理:时间与缺失值
1. 时间数据筛选:精确到秒的 “隐形规则”

sql

-- 筛选1994-08-30之后出生的人(含当天零点整)
SELECT * FROM users
WHERE birth > '1994-08-30';

  • 注意
    • 时间需用引号包裹(如'YYYY-MM-DD')。
    • SQL 默认时间为'YYYY-MM-DD 00:00:00',即 “当天零点”,若需包含全天,可写birth >= '1994-08-30'
2. 缺失值(NULL):不是 “0”,而是 “无数据”
  • NULL vs 0
    • 0是有效数据(如订单金额 0 元,代表免费)。
    • NULL是缺失值(如订单金额 NULL,代表数据未录入或异常)。
  • 查询 NULL

    sql

    -- 提取联系表中无电话号码的记录
    SELECT * FROM contact_info
    WHERE phone_number IS NULL;
    
四、SQL 子句执行顺序:为什么WHERE不能用SELECT别名?

执行顺序(从先到后):
FROM → WHERE → SELECT → ORDER BY → LIMIT

  • 关键限制
    WHERESELECT之前执行,因此 **WHERE子句中无法使用SELECT定义的别名 **(如discount)。
    例:

    sql

    -- 错误!WHERE先执行,此时discount尚未定义
    SELECT discount_price/price AS discount
    FROM commodity
    WHERE discount <> 1; -- 报错:discount列不存在
    

    正确写法需重复计算(如WHERE discount_price/price <> 1),或使用子查询(进阶技巧)。
五、实战练习题:提取折扣最大的前 3 商品
题目:

commodity表中,筛选折扣(discount_price/price ≠ 1)的商品,按折扣比例(升序,即折扣最大)取前 3 名,输出namediscount

代码解析:

sql

SELECT name, discount_price/price AS discount
FROM commodity 
WHERE discount_price/price <> 1  -- 筛选有折扣(≠1)
ORDER BY discount_price/price     -- 按折扣比例升序(越小折扣越大)
LIMIT 3;                          -- 取前3条

  • 为什么WHEREORDER BY用原始表达式?
    因执行顺序:WHEREORDER BYSELECT之前,此时discount别名尚未生成,必须重复计算discount_price/price
六、总结:掌握 WHERE,掌控数据筛选
  • 核心能力:筛选(WHERE)、排序(ORDER BY)、限制(LIMIT)的组合使用。
  • 避坑指南
    • 时间数据加引号,区分NULL0
    • 牢记子句执行顺序,避免WHERE中使用SELECT别名。
  • 实战价值:从电商折扣分析到用户画像筛选,WHERE是数据清洗和分析的第一步。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值