隐式内连接多WHERE条件工作原理及查询结果异常解析
关于隐式内连接的疑问与解析
显式与隐式内连接基础
显式内连接(Explicit Inner join)需指定两张表的关联列,仅返回这些列值匹配的记录,示例代码如下:
SELECT Customers.customer_id, Customers.name, Orders.amount FROM Customers INNER JOIN Orders ON Customers.customer_id = Orders.customer_id WHERE Orders.amount >= 200;
而隐式内连接(Implicit Inner join)仅通过WHERE子句指定匹配条件。我想了解多条件下隐式内连接的工作机制,以及条件顺序是否会影响结果?
测试表结构
我有如下两张表:
表1:Customers
| customer_id | name | age |
|---|---|---|
| 1 | John | 25 |
| 2 | Marry | 22 |
表2:Orders
| order_id | amount | customer_id |
|---|---|---|
| 1 | 100 | 1 |
| 2 | 200 | 5 |
Orders表的customer_id字段存储Customers表的customer_id值,但该字段未设置外键约束。其中Orders表的customer_id=5在Customers表中不存在。
异常查询结果分析
我运行以下查询:
查询语句:
SELECT Customers.customer_id, Orders.customer_id, Customers.name, Orders.amount FROM Customers, Orders WHERE Customers.customer_id = Orders.customer_id AND Orders.amount >= 200;
查询结果:
| Customers.customer_id | Orders.customer_id | Customers.name | Orders.amount |
|---|---|---|---|
| (null) | 5 | (null) | 200 |
结果返回了Orders表的全部字段数据,Customers表字段数据为null,但内连接理论上应仅返回两张表匹配的记录,这让我产生了困惑。
更新说明
我发现之前的查询语句中WHERE子句右侧有**(+)**符号,我之前误以为无用而忽略了,现在了解到该符号代表RIGHT OUTER join,此时查询结果就合理了。完整查询语句如下:
SELECT Customers.customer_id, Orders.customer_id, Customers.name, Orders.amount FROM Customers, Orders WHERE Customers.customer_id = Orders.customer_id (+) AND Orders.amount >= 200;
感谢StackOverflow社区的帮助!
内容的提问来源于stack exchange,提问作者Arpit Jain
相关产品推荐
相关产品推荐

