sql查询这个东西, 要说它简单, 可以很简单, 通常情况下只需使用增删查改配合编程语言的逻辑表达能力,能实现所有功能。 但是增删查改并不能代表sql语句的所有, 完整的sql功能会另人望而生畏。 拿比普通增删查改稍微复杂一个层次的连接查询来说, 盲目使用, 也会出现意料之外的危险结果,导致程序出现莫名其妙的BUG。 在连接查询语法中,另人迷惑首当其冲的要属on筛选和where筛选的区别了, 在我们编写查询的时候, 筛选条件的放置不管是在on后面还是where后面, 查出来的结果总是一样的, 既然如此,那为什么还要多此一举的让sql查询支持两种筛选器呢? 事实上, 这两种筛选器是存在 SQL连接查询是数据库操作中非常重要的部分,它允许我们在多个表之间进行数据的组合和筛选。在连接查询中,On筛选和Where筛选虽然看似相似,但它们在特定情况下的作用和效果是有区别的,尤其在处理Outer Join时,这一点显得尤为重要。 我们要了解SQL中的三种基本连接类型:Cross Join、Inner Join和Outer Join。Cross Join返回两个表的笛卡尔积,即每个左表的记录与右表的每个记录配对。Inner Join则只返回两个表中匹配的记录。而Outer Join,包括Left Join和Right Join,会返回所有左表或右表的记录,即使在右表或左表中没有匹配的记录,此时未匹配的记录会被用NULL填充。 在Cross Join和Inner Join中,On筛选和Where筛选的使用效果是相同的,因为它们都在查找匹配的记录。然而,当涉及到Outer Join时,差异就显现出来了。 以Left Join为例,假设我们有两张表,一张是Main表,另一张是Ext表,两表通过ID字段关联。如果我们想筛选出地址不是杭州的所有用户信息,两种写法可能会产生不同的结果: 1. On筛选: ```sql SELECT * FROM Main LEFT JOIN Ext ON Main.id = Ext.id AND address <> '杭州' ``` 在这种情况下,On筛选器不仅会过滤Main和Ext之间的匹配,而且还会应用于Ext表。因此,地址为杭州的Ext表记录会被排除,但Main表的记录依然会保留,即使它们没有匹配的Ext表记录。这就导致了Main表中的一条记录(即使地址为杭州)也会出现在结果集中,因为它是左表的一部分。 2. Where筛选: ```sql SELECT * FROM Main LEFT JOIN Ext ON Main.id = Ext.id WHERE address <> '杭州' ``` 在这个例子中,Where筛选器会在最后应用,这意味着它会筛选整个结果集。所以,无论在哪个表中,只要地址为杭州的记录都会被剔除,无论是Main表还是Ext表。这样就得到了预期的结果,即不包含地址为杭州的任何记录。 在 Outer Join 的执行过程中,On筛选器先于Where筛选器应用。On筛选器用于确定哪些记录应该相互匹配,而Where筛选器则在整个连接后的结果集上进行筛选。如果将筛选条件放在On后面,它会影响连接本身,而放在Where后面,它则会影响最终的结果集。 理解On和Where筛选器的区别对于编写正确的SQL查询至关重要,尤其是在处理Outer Join时。误用可能导致数据筛选不准确,进而引发程序错误。因此,开发人员需要深入理解这两个筛选器的不同,以便在实践中避免不必要的问题。
- 粉丝: 154
- 资源: 914
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助