sql多表查询之一:Where 和 On的秘密
对于还在SQL初级阶段的朋友来说,sql多表查询问题是一个比较有趣也容易出错的技术。什么时候会用到sql多表查询呢?是在两张或两张以上表单中通过某几个字段进行互联管理的时候,这就不得不说说sql多表查询中Where 和 On的秘密。
在了解sql多表查询中Where 和 On的秘密之前,让我们先来温习一下连接基础吧

按列a把两表连接,请问各种连接方式的结果的结果?

语法呢?
左 select * from @a Aa left join @b Bb on Aa.a=Bb.a
右 select * from @a Aa right join @b Bb on Aa.a=Bb.a
内 select * from @a Aa join @b Bb on Aa.a=Bb.a
完全 select * from @a Aa full join @b Bb on Aa.a=Bb.a
迪卡尔 select * from @a,@b
是不是很简单呢,接下来我们来看sql多表查询中Where 和 On的秘密:)
大家想想,依据下表

下面语句出来的结果是什么?
select * from @a _a left join @b _b on _a.id=_b.id where _b.name=1
select * from @a _a left join @b _b on _a.id=_b.id and _b.name=1
先想想,再看结果吧^_*
sql多表查询中Where 和 On的秘密在SQLserver 中的执行顺序是: 先join后where
所以,当条件写在where里,结果如下:

条件写在on里,结果如下:

Where 和 On是不是很有趣,你也试试吧!
下一个

请说出下面语句各返回多少记录
select * from @a a left join @b b on a.id=b.id where a.id=1
select * from @a a left join @b b on a.id=b.id and b.id=1
select * from @a a left join @b b on a.id=b.id and a.id=1
select * from @a a left join @b b on a.id=1
先想想,再看答案:P
— select * from @a a left join @b b on a.id=b.id where a.id=1
— 原因是先执行连接条件,再执行where部分,所以只有1条记录
— select * from @a a left join @b b on a.id=b.id and b.id=1
— 原因是满足a.id=b.id and a.id=1 条件的只有一条,但left join是对没有附和条件的加null处理,所以最后结果是3条
— select * from @a a left join @b b on a.id=b.id and a.id=1
— 原因是满足a.id=b.id and a.id=1 条件的只有一条,但left join是对没有附和条件的加null处理,所以最后结果是3条
— select * from @a a left join @b b on a.id=1
— 原因是在做完迪卡尔后,满足a.id=1 条件的有3条,但left join是对没有附和条件的加null处理,所以最后结果是5条
sql多表查询之一:Where 和 On的秘密的更多相关文章
- oracle SQL多表查询
SQL多表查询 1.集合理论 1.1 什么是集合 具有某种特定性质的事物的总体. 集合的特性:无序性.互异性.确定性. 一个集合可以小到从一个表中取出一行中的一列. 1 ro ...
- SQL联表查询
数据库中最最常用的语法----select.简单的select语法很直白: select column from table where expression: 从((from)存储数据的地方(tab ...
- Sql Server的艺术(四) SQL多表查询
表的基本连接 SQL的一个重要特性就是能通过JOIN关键词,从多个交叉表中查询.分析数据. 连接表的目的 在关系数据库中,数据表设计的一个重要原则就是要避免冗余性. 减少了冗余信息,节省了数据库存储空 ...
- sql多表查询(单表查询略过)
表library: 表borrow: 表reader: 1.等值连接:(常用) 原理:将多张表组合成一个逻辑大表,即字段相加记录相乘(笛卡尔积). 语法:select * from 表A,表B whe ...
- SQL多表查询总结
前言 连接查询包括合并.内连接.外连接和交叉连接,如果涉及多表查询,了解这些连接的特点很重要.只有真正了解它们之间的区别,才能正确使用. 一.Union UNION 操作符用于合并两个或多个 SELE ...
- sql 多表查询结果验证
1.笛卡尔积 定义: 设A,B为集合,用A中元素为第一元素,B中元素为第二元素构成的有序对,所有这样的有序对组成的集合 ,叫做A与B的笛卡尔积,记作AxB. 上面有一个很关键的词为“有序”,因此,我们 ...
- 【数据库】sql连表查询
SQL总结 连表查询 连接查询包括合并.内连接.外连接和交叉连接,如果涉及多表查询,了解这些连接的特点很重要. 只有真正了解它们之间的区别,才能正确使用. 1.Union UNION 操作符用于合并两 ...
- Server Sql 多表查询、子查询和分页
一.多表查询:根据特定的连接条件从不同的表中获取所需的数据 多表查询语法: SELECT table1.column, table2.column FROM table1, table2 WHERE ...
- sql 两表查询后 更新某表中部分字段
这是上一个sql更新某表字段的一个延伸,在更新表数据时,实际上会有多表数据查询场景,查询后,只需要更新某一个表中的数据,以下提供两个方法, 第一种使用update 两表查询 update api_ma ...
随机推荐
- Codeforces Round #256 (Div. 2) A. Rewards
A. Rewards time limit per test 1 second memory limit per test 256 megabytes input standard input out ...
- 英特尔® 硬件加速执行管理器安装指南 — Microsoft Windows*
介绍 本文将指导您安装英特尔® 硬件加速执行管理器(英特尔® HAXM),这是一款可以使用英特尔® 虚拟化技术(VT)加快 Android* 开发速度的硬件辅助虚拟化引擎(管理程序). 前提条件 英特 ...
- 《编程简介(Java) ·10.3递归思想》
<编程简介(Java) ·10.3递归思想> 10.3.1 递归的概念 以两种方式的人:男人和女人:算法是两种:递归迭代/通知: 递归方法用自己的较简单的情形定义自己. 在数学和计算机科学 ...
- 数据收集程序一般建筑(C++ ACE达到)
数据收集程序一般功能 经socket数据的接收的另一侧.端方能够访问智能电表采集器,你可曾与计算机之间的通信的通信协议(你良好的一致性是谁client,谁是服务端,即数据流) 为收集程序要求 可扩展: ...
- 【Android】android图片轮播
第一步,先写一个布局文件 <com.main.util.SlideShowView android:id="@+id/slideshowView" android:layou ...
- 同ListView该接口无法通过手势滑动左右切换界面问题解决方法
同ListView该接口无法通过手势滑动左右切换界面问题解决方法 问题描写叙述: 在做OnGestureListener滑动切换窗体的时候,会遇到这种问题.就是当界面中含有ListView的时候.On ...
- android:强大的图像下载和缓存库Picasso
1.Picasso一个简短的引论 Picasso它是Square该公司生产的一个强大的图像下载并缓存画廊.官方网站:http://square.github.io/picasso/ 仅仅须要一句代码就 ...
- Ribbon 和 Eureka 积分
Ribbon 这是 Netflix 云服务的中间层宣布开放源代码项目,它的主要功能是提供客户机端软件的负载均衡算法,将 Netflix 中间层服务一起. Eureka 是 RESTfu ...
- HDU 1054 Strategic Game(树形DP)
Problem Description Bob enjoys playing computer games, especially strategic games, but sometimes he ...
- 使用 gridfs-stream 存储文件遇到的一个坑。
前一段时间参读了某个coder写的用 gridfs-stream 来存储文件,感觉不错就自己用 gridfs-stream 模块写了一个文件存储服务,但是发现存储的文件总是删不掉, 我调用的是GFS的 ...