2026/2/13 17:31:54
网站建设
项目流程
做网站要做相应的app吗,中山建网站,重庆建筑材料价格信息网,cpanel应用不显示wordpress1. SELECT 子句中的过滤
作用
SELECT 子句本身并不用于直接过滤数据行#xff0c;而是用于表达式计算和返回结果列。 但有两种特殊“伪过滤”情况#xff0c;初学者容易混淆#xff1a;
a) 使用CASE WHEN生成标志位
SELECTid,amount,CASE WHEN amount 500 THEN 大额…1. SELECT 子句中的过滤作用SELECT子句本身并不用于直接过滤数据行而是用于表达式计算和返回结果列。但有两种特殊“伪过滤”情况初学者容易混淆a) 使用CASE WHEN生成标志位SELECTid,amount,CASEWHENamount500THEN大额ELSE小额ENDASgradeFROMorders;这里只是标记并没有“过滤”数据行。b) 利用窗口函数的FILTERSELECTSUM(amount)FILTER(WHEREtypeA)ASsum_a,SUM(amount)FILTER(WHEREtypeB)ASsum_bFROMorders;这里的FILTER是对聚合函数的聚合过滤不影响整行是否被选中只决定聚合时哪些被算上。总结SELECT 不能直接过滤结果行除了各种聚合“过滤”标志。真正过滤结果应放在WHERE或JOIN或HAVING。2. JOIN 子句中的过滤ON 条件JOIN的ON部分与WHERE条件不同a) INNER JOINSELECT*FROMaJOINbONa.idb.a_idANDb.statusactive解析b.status active写在ON内只有满足 a.idb.a_id 且 b.status‘active’ 时才产生一对结果。即在关联时提前筛选对方表的相关数据。b) LEFT JOINSELECT*FROMaLEFTJOINbONa.idb.a_idANDb.statusactive解析LEFT JOIN不管 b 有无匹配总会保留 a。ON过滤是如果 b.status 不为 ‘active’则 b 列为 NULL不会把整行 a 去掉。c) 过滤条件写在 WHERESELECT*FROMaLEFTJOINbONa.idb.a_idWHEREb.statusactive解析此写法WHERE条件会把 a 的那些 b 没有匹配到的所有 b 为 NULL 的全部去掉实际上结果和 INNER JOIN 效果一样3. WHERE 子句中的过滤WHERE负责数据源包括 join 后的中间结果的最终行过滤。SELECT*FROMaJOINbONa.idb.a_idWHEREa.amount100ANDb.statusactive先连接再整体过滤。4. 典型案例对比假如有如下两个表students(id, name)scores(student_id, subject, mark)假设每个学生有多个成绩。场景1只看及格成绩条件写在JOINSELECTs.id,s.name,sc.markFROMstudents sJOINscores scONs.idsc.student_idANDsc.mark60只有及格的匹配行会被连接学生不会重复出现不及格的成绩。条件写在WHERESELECTs.id,s.name,sc.markFROMstudents sJOINscores scONs.idsc.student_idWHEREsc.mark60结果一样只显示及格成绩。LEFT JOIN 过滤条件写在JOINSELECTs.id,s.name,sc.markFROMstudents sLEFTJOINscores scONs.idsc.student_idANDsc.mark60每个学生会显示所有自己及格的成绩没及格就为 NULL但学生都在。LEFT JOIN 过滤条件写在WHERESELECTs.id,s.name,sc.markFROMstudents sLEFTJOINscores scONs.idsc.student_idWHEREsc.mark60所有没及格的行包括没考试的、sc.mark是NULL全部被过滤掉效果和INNER JOIN一样注意LEFT JOINWHERE条件在想保留主表比如students所有数据但只展示部分关联的情况下要特别小心写法。5. 总结表格过滤条件位置作用对象推荐场景SELECT只对输出列做条件标记、赋值需展示条件分组/标识JOIN (ON)只影响表之间的连接配对关系只过滤被联接表时主表全保留WHERE影响整个结果最终输出行需要严格筛选全部输出的情况一句话总结只保留主表相关数据LEFT JOIN ... ON ...真正只显示符合条件整行WHERE用于联表附加限定不影响主表全保留JOIN ONSELECT只做数据衍生、打标不过滤行