SQL查询中And和Where的使用逻辑以及用加号实现左关联的方式,是很多开发者在编写复杂查询时容易混淆的知识点,不同的写法会直接影响查询结果的正确性。

And和Where的使用提示
基础作用差异
Where是SQL查询中的条件过滤子句,用于对查询结果集进行整体过滤,作用于整个查询的最终输出结果,不符合Where条件的记录会被直接排除在结果集之外。
And是逻辑运算符,用于连接多个条件,既可以出现在Where子句中连接过滤条件,也可以出现在表关联(如left join、right join)的on子句中,连接关联条件。
不同场景下的使用建议
当需要在关联时就过滤从表数据时,应该把条件放在on子句中用And连接,这样不会影响主表的记录输出;当需要在关联完成后过滤整个结果集时,应该把条件放在Where子句中。
下面通过一个内连接的示例展示And在Where中的使用:
-- 查询年龄大于18且城市为北京的用户 SELECT u.id, u.name, u.age, u.city FROM user u WHERE u.age > 18 AND u.city = '北京';
如果是左关联场景,主表条件放在Where中,从表条件放在on的And中,示例代码如下:
-- 左关联查询所有用户及其订单,只关联未支付的订单 SELECT u.id, u.name, o.order_id, o.pay_status FROM user u LEFT JOIN order o ON u.id = o.user_id AND o.pay_status = 0;
用+进行左关联的提示及注意事项
基本语法说明
用加号实现左关联是Oracle数据库特有的关联语法,不属于SQL标准语法,其他主流数据库如MySQL、PostgreSQL等不支持这种写法。左关联的核心逻辑是保留左表(主表)的所有记录,右表(从表)没有匹配的记录时对应字段显示为null。
语法规则是:在关联条件的从表字段后加(+),表示这个字段允许为空,对应左关联的右表侧。
具体注意事项
- 加号只能出现在关联条件中,不能出现在Where子句的条件里,否则会报错或者得到不符合预期的结果。
- 如果关联条件有多个,每个从表字段后都需要加
(+),不能只加其中一个,否则关联逻辑会出错。 - 左关联时加号要加在右表的关联字段后,右关联时加号要加在左表的关联字段后,不能放反位置。
- 这种写法只能实现左关联和右关联,无法实现全外关联,全外关联需要用full outer join语法。
下面是使用+实现左关联的完整示例代码:
-- 查询所有用户及其订单信息,保留没有订单的用户 SELECT u.id, u.name, o.order_id, o.order_amount FROM user u, order o WHERE u.id = o.user_id(+);
如果关联条件有两个,正确的写法如下:
-- 多条件左关联,同时匹配用户id和订单状态 SELECT u.id, u.name, o.order_id, o.order_amount FROM user u, order o WHERE u.id = o.user_id(+) AND o.pay_status(+) = 1;
和标准左关联语法的对比
标准SQL的左关联语法是left join,可读性和通用性都更好,建议优先使用标准语法,只有在维护老旧的Oracle项目时再使用+的写法。两者的结果是一致的,示例如下:
-- 标准左关联写法,和上面的+写法结果一致 SELECT u.id, u.name, o.order_id, o.order_amount FROM user u LEFT JOIN order o ON u.id = o.user_id;
常见错误案例
很多开发者会把从表的条件放在Where子句中,导致左关联失效,示例如下:
-- 错误写法:把从表条件放在Where中,左关联会失效,没有订单的用户会被过滤掉 SELECT u.id, u.name, o.order_id, o.order_amount FROM user u, order o WHERE u.id = o.user_id(+) AND o.pay_status = 1;
正确的写法应该把从表条件放在关联条件中:
-- 正确写法:从表条件放在on等效的位置,用And连接 SELECT u.id, u.name, o.order_id, o.order_amount FROM user u, order o WHERE u.id = o.user_id(+) AND o.pay_status(+) = 1;