在连接查询中,where子句是如何执行的是一个令人很困惑的事情,下面将举例说明,以防大家犯我犯过的错误。

有如下两张表,class班级表和student学生表,两表通过classcode班级号关联。而非常不巧的是两张表都有address字段,在class表中的address指的是班级所在地址,而student表中的address则是学生的家庭住址。

  1. create table CLASS
  2. (
  3. classcode  NUMBER not null,
  4. classname  VARCHAR2(100),
  5. address VARCHAR2(100)
  6. )
  1. create table STUDENT
  2. (
  3. studentid   NUMBER not null,
  4. studentname VARCHAR2(100),
  5. classcode   NUMBER,
  6. address  VARCHAR2(100)
  7. )
  1. alter table STUDENT
  2. add constraint FK_STUDENT foreign key (CLASSCODE)
  3. references CLASS (CLASSCODE);

在两表中目前有如下数据

class表:

student表:

目前需要查询出坐落于Q山区Q山路班级中的学生,并显示其学生姓名,班级名称,班级地址,我们考虑使用连接查询。
对于我这样的菜鸟来说第一次写出的sql可能是这样的

  1. select c.classname,c.address,t.studentname from student t,class c
  2. where t.classcode=c.classcode
  3. and address='Q山区Q山路';

执行,报错。column ambiguously defined

哦,我们可能会想到可能是由于两张表中都有address这个字段。于是我们为c.address取个别名。执行下面的sql:

  1. select c.classname,c.address as caddress,t.studentname from student t,class c
  2. where t.classcode=c.classcode
  3. and caddress='Q山区Q山路';

执行,再次报错,提示caddress这个是无效的字段。
奇怪,明明结果中有我们命名的caddress字段啊?
这就是连接查询where子句的执行方式问题了。在做连接查询后,执行where子句前首先会获得一个临时表,下面我将这个临时表show出来:

这个临时表拥有所有的班级与学生进行关联查询的结果,where 子句将对此临时表进行筛选。因此可以看出在此表中有两个address存在,通过address无法筛选,而第二个sql中caddress在此临时表中也不存在(字段别名是在最后阶段生效的)因此会报caddress无效的错误。因此要想获得正确的结果需要为address指定表,sql改写为:

  1. select c.classname,c.address as address,t.studentname from student t,class c
  2. where t.classcode=c.classcode
  3. and c.address='Q山区Q山路';

执行得到正确结果。

为了进一步验证以上结论下面我将sql进一步改写

  1. select tr.studentname,cr.caddress,cr.classname from
  2. (select t.studentname,t.address ,t.classcode from student t)tr,
  3. (select c.classcode,c.address as caddress,c.classname from class c )cr
  4. where tr.classcode=cr.classcode
  5. and caddress='Q山区Q山路';

根据上述原理此时where子句从以下临时表中进行筛选

此时可以通过caddress筛选班级地址,也可以通过address筛选学生地址,感兴趣的童鞋可以将where子句中的查询条件caddress改成addree看看结果是不是通过学生地址进行筛选了哦。

转载于:https://blog.51cto.com/owandering/1187756

连接查询中where子句的执行相关推荐

  1. 【大数据】SparkSql 连接查询中的谓词下推处理 (一)

    本文首发于 vivo互联网技术 微信公众号 https://mp.weixin.qq.com/s/YPN85WBNcnhk8xKjTPTa2g 作者:李勇 目录: 1.SparkSql 2.连接查询和 ...

  2. sequelize 左连接 left join_SparkSQL连接查询中的谓词下推处理(下)

    本篇主要介绍的是--外连接查询中的谓词下推规则,这相比内连接中的规则要复杂一些,不过使用简单的表格来进行分析也是可以分析清楚的. 目录: 1.左表 join 后条件下推 2.左表join中条件不下推 ...

  3. join和子查询效率_SparkSQL连接查询中的谓词下推处理(上)

    SparkSQL是架构在 Spark 计算框架之上的分布式 Sql 引擎,使用 DataFrame 和 DataSet 承载结构化和半结构化数据来实现数据复杂查询处理,提供的 DSL可以直接使用 sc ...

  4. MySql 连接查询中 on 和 where 的区别

    大家可以先看MySQL:left join 避坑指南 看过之后再接着看下面 在多表查询时,ON和where都表示筛选条件,on先执行,where后执行. on 后跟连接条件,然后再加的筛选条件只针对关 ...

  5. 关于连接查询主要是左右连接查询中,where和on的区别

    工作中,今天用到左连接查询,我自己造的数据,需要根据条件进行筛选,但是筛选不符合我的要求,最终发现是左右连接中where和on的区别,在作怪,工作中用的表关联太多,我下面简化要点,仅仅把注意点写个简单 ...

  6. mysql连接查询on_MySql 连接查询中 on 和 where 的区别

    MySql 连接查询时,on 后面跟的是连接条件,再跟 and 关键就可以继续加过滤条件,这样看来是不是可以免用 where 增加过滤条件了呢?开始我也是这样以为的(老师是这么教的,且使用 on 的情 ...

  7. 【mysql】左外连接查询中 on 和 where 的区别

    论点 在使用 mysql 的左外连接(left join)查询时,驱动表(left join 左边的表),亦即数据需要全部被查出表的查询条件建议用 where 设定,被驱动表(left join 右边 ...

  8. 连接查询中的ON 子句和 WHERE 子句

    先看两张表结构 produc表 produc_details 问题是下面两个查询结果有什么不同 1.SELECT * FROM product LEFT JOIN product_detailsON ...

  9. php mariadb 查询语法,从PHP调用的查询中的MySQL(MariaDB)执行超时

    在10.1版中使用MariaDB,您有两种限制查询的方法.它可以根据时间或查询的行总数来完成. 按行: SELECT ... LIMIT ROWS EXAMINED rows_limit; 你可以使用 ...

最新文章

  1. 110道Python面试真题和面试简历资料(附链接)
  2. Python 2 宣布正式退休,Python 3 时代到来!
  3. mysql左连接_MySQL left join 左连接的通俗理解
  4. 关于python的全局变量和局部变量、以下描述错误的是_Python:全局变量与局部变量的问题...
  5. 王者荣耀在线服务器,王者荣耀实时对战服务器Photon之PUN介绍
  6. Java集合工具类的一些坑,Arrays.asList()、Collection.toArray()...
  7. 敏捷开发中史诗故事与用户故事的颗粒度
  8. ABP中使用Redis Cache(1)
  9. Axios中无法运行 json-server【已解决】
  10. windows系统bat批处理 执行后 隐藏批处理本身
  11. 【推荐系统】BERT4Rec:使用Bert进行序列推荐
  12. git pull push 项目的时候总是提示要输入用户名密码的解决方案
  13. BXP无盘的更新操作详解(大镜像)(转)
  14. fckeditor for php 下载,fck_FCKeditor免费最新版下载[HTML编辑]-下载之家
  15. PS案例提升 【第1节】抠图--薄、透、露的朦胧美 案例二:扣取婚纱新娘
  16. Android 手把手教你实现百度身份证识别
  17. 关于牛顿-欧拉法的外推和内推的理解
  18. Kali渗透测试(四)——无线网络WPA攻击(PSK破解、AIROLIB、JTR、cowpatty、pyrit)
  19. 手冢国光对战幸村精市,谁才是最强初中生?
  20. 《软技能 代码之外的生存指南》

热门文章

  1. xmlrcp学习 - python中使用xmlrpc
  2. EOJ Monthly 2018.1
  3. 15.2. NFS Client Configuration
  4. linux系统安全加固脚本
  5. 如何计算递归算法的时间复杂度
  6. PowerDesigner教程系列(总)
  7. 限制IP 访问 Oracle 的方法
  8. 动态加载用户控件的怪问题
  9. 嵌入式程序员应知道的0x10个基本问题
  10. Spring-Cloud 从0开始(二) Eureka-Client