sql多表查询之一:Where 和 On的秘密

原文 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的秘密,布布扣,bubuko.com

时间: 2024-10-13 01:51:59

sql多表查询之一:Where 和 On的秘密的相关文章

#3 SQL多表查询

经验: 1,where 和having的区别? where是用于原始字段的过滤, having主要用于聚合函数的汇总过滤,虽然这个原始字段也是可以用的,但是不推荐,因为效率比where低 所以尽量少用having,能不用尽量不用(where 能实现的having 都能实现,但是效率低 ) 2,count(*)和count(字段名)的差别 第一个会输出全部的行,,而第二个如果遇到为Null的,就不会数出来, 3,还有一个要注意的.如果 我要查询一个   hehe_haha   ,hehe_xixi

#4 SQL 多表查询、子查询

今天讲了一个SQL的多表查询和子查询 笔记里面有挺多有用的图片,重要是为了方便了解外连接和内连接,还有自连接等... 这里显示不出来,所以放一个链接, 到有道云笔记去看:http://note.youdao.com/share/?id=90f107b6a6aac379a795373f7f98c6ff&type=note 多表查询和子查询的关系? 多表查询可以做到的,子查询都可以做到,子查询思路比较符合正常人的思路,但是代码稍微长一点 多表查询 |--内部链接查询 : select * from

SQL联表查询

数据库中最最常用的语法----select.简单的select语法很直白: select column from table where expression: 从((from)存储数据的地方(table)按照(where)一定的条件(expression)查找(select)我要的数据(column); 但是在实际工作中用到的比较多的往往还是多联表查询,所以在这里记下自己学习多联表查询的心得. 首先聊一聊笛卡尔积,这是几乎所有数据库书籍在讲多联表查询时第一个要讲的东西,我等P民也只能是把笛卡尔

SQL联表查询的总结

1.Union UNION 操作符用于合并两个或多个 SELECT 语句的结果集. UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表. 当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行.两种情况下,派生表的每一行不是来自 TABLE1 就是来自 TABLE2. 注意:使用UNION时,两张表查询的结果有相同数量的列.列类型相似. 学生表信息(Students): ID Name Age City

Sql Service的艺术(四) SQL多表查询

表的基本连接 SQL的一个重要特性就是能通过JOIN关键词,从多个交叉表中查询.分析数据. 连接表的目的 在关系数据库中,数据表设计的一个重要原则就是要避免冗余性. 减少了冗余信息,节省了数据库存储空间. 简化了数据修改.维护操作. 学习本节需要的数据表: CREATE TABLE TEACHER ( ID INT IDENTITY (1,1) PRIMARY KEY , --主键,自增长 TNO INT NOT NULL, --教工号 TNAME CHAR(10) NOT NULL, --教师

sql 两表查询后 更新某表中部分字段

这是上一个sql更新某表字段的一个延伸,在更新表数据时,实际上会有多表数据查询场景,查询后,只需要更新某一个表中的数据,以下提供两个方法, 第一种使用update 两表查询 update api_manage_apicollectioninfo_copy a, api_manage_apicollectionmanage b set a.header=replace(a.header,'XXXDDD','zhangjun') WHERE a.api_collection_id=b.id and

sql 多表查询结果验证

1.笛卡尔积 定义: 设A,B为集合,用A中元素为第一元素,B中元素为第二元素构成的有序对,所有这样的有序对组成的集合 ,叫做A与B的笛卡尔积,记作AxB. 上面有一个很关键的词为"有序",因此,我们来看一个例子: 例如,A={a,b},B={0,1,2},则 AxB={<a,o>,<a,1>,<a,2>,<b,0>,<b,1>,<b,2>,} BxA={<0,a>,<0,b>,<1,

mysql如何查询多样同样的表/sql分表查询、java项目日志表分表的开发思路/按月分表

之前开发的一个监控系统,数据库的日志表是单表,虽然现在数据还不大并且做了查询sql优化,不过以后数据库的日志表数据肯定会越来越庞大,将会导致查询缓慢,所以把日志表改成分表,日志表可以按时间做水平分表,我是按月分的,每个月一张表,这时候的问题是 数据库有多张同样的分表如何根据条件查询? 在进行分页的时候如何计算总记录数?如何查询出所有分表? 每个月的新表是如何创建?系统如何自动创建? 不确定哪个分表的情况如何查询某一条详细记录? 分表查询分表查询可以用union或者union all进行查询uni

sql学习总结(4)——SQL多表查询技术

4.1笛卡尔积 select 姓名,工资,城市 from 职工,仓库 仓库5条记录,职工表18条记录,结果18*5=90条记录. 职工表18个员工,仓库表5个仓库,即5个职工所在的城市,若要显示职工的姓名.工资及所在城市信息,结果应该为18条记录: select 姓名,工资,城市 from 职工,仓库 where 职工.仓库号=仓库.仓库号 4.2带有运算符的多表查询 显示工资不在1500~2000之间,并且城市为空的职工姓名.工资及所在城市信息: select 姓名,工资,城市, from 职