求助,某著名企业面试题

kittysin 2009-06-22 08:49:20
select A.a B.b from A join B on A.a = B.b and A.b=1 and A.c=2

select A.a B.b from A join B on A.a = B.b where A.b=1 and A.c=2

有什么区别?
...全文
260 20 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
feixianxxx 2009-06-22
  • 打赏
  • 举报
回复
--2条执行结果都一样!!!
--个人推荐 如果不是多表联系的条件放在where 里面
select A.a B.b from A join B on A.a = B.b where A.b=1 and A.c=2
JonasFeng 2009-06-22
  • 打赏
  • 举报
回复
where的执行顺序肯定排在ON 的后面。
在大数据量的情况下。
个人觉得第一句会效率高些
malin2670372 2009-06-22
  • 打赏
  • 举报
回复
看来大家的结论是:匹配方式不通。但效率结果一样。
等不到来世 2009-06-22
  • 打赏
  • 举报
回复
内联没啥区别,
外联有区别:
if object_id('[ta]') is not null drop table [ta]
go
create table [ta]([a] int,[b] int)
insert [ta]
select 1,1 union all
select 2,2 union all
select 3,3 union all
select null,4
go
if object_id('[tb]') is not null drop table [tb]
go
create table [tb]([a] int,[b] int)
insert [tb]
select 1,1 union all
select 2,null
go
--select * from [ta]
--select * from [tb]

select * from ta a left join tb b on a.a=b.a and b.b is not null
/*
a b a b
----------- ----------- ----------- -----------
1 1 1 1
2 2 NULL NULL
3 3 NULL NULL
NULL 4 NULL NULL

(4 行受影响)
*/
select * from ta a left join tb b on a.a=b.a where b.b is not null
/*
a b a b
----------- ----------- ----------- -----------
1 1 1 1

(1 行受影响)
*/
风_雨_晴 2009-06-22
  • 打赏
  • 举报
回复
效率上讲也没有区别,查询计划是一样一样的
csdyyr 2009-06-22
  • 打赏
  • 举报
回复
初步试了下,生成的执行计划一样,成本一样。
kittysin 2009-06-22
  • 打赏
  • 举报
回复
谢谢你,我想应该从sql的机理上来分析大数据量时二者区别,我想他们肯定有区别,不然也不会出这个题目[Quote=引用 12 楼 zsh0809 的回复:]
SQL codeselect * from benz2
1 1080001 jim cim M
2 1080002 tig cim M
3 1080003 ggg sr F

select * from benz3
1 1080001 jim cim M 25
2 1080002 tig cim M 26
3 1080005 fme cim F 26

以上是我的測試數據。
[/Quote]
「已注销」 2009-06-22
  • 打赏
  • 举报
回复
inner join 和where 区别

1 .WHERE子句中使用的连接语句,在数据库语言中,被称为隐性连接。INNER JOIN……ON子句产生的连接称为显性连接。(其他JOIN参数也是显性连接)WHERE 和INNER JOIN产生的连接关系,没有本质区别,结果也一样。但是!隐性连接随着数据库语言的规范和发展,已经逐渐被淘汰,比较新的数据库语言基本上已经抛弃了隐性连接,全部采用显性连接了。

2 .无论怎么连接,都可以用join子句,但是连接同一个表的时候,注意要定义别名,否则产生错误!

a> inner join:理解为“有效连接”,两张表中都有的数据才会显示left join:理解为“有左显示”,比如on a.field=b.field,则显示a表中存在的全部数据及a\\b中都有的数据,A中有、B没有的数据以null显示

b> right join:理解为“有右显示”,比如on a.field=b.field,则显示B表中存在的全部数据及a\\b中都有的数据,B中有、A没有的数据以null显示

c> full join:理解为“全连接”,两张表中所有数据都显示,实际就是inner +(left-inner)+(right-inner)

3 .join可以分主次表 外联接有三种类型:完全外联,左联,右联.
完全外联包含两张表的所有记录.
左联是以左边的表为主,右边的为辅,右联则相反

4.一般要使得数据库查询语句性能好点遵循一下原则:

* 在做表与表的连接查询时,大表在前,小表在
* 不使用表别名,通过字段前缀区分不同表中的字段
* 查询条件中的限制条件要写在表连接条件前
* 尽量使用索引的字段做为查询条件
「已注销」 2009-06-22
  • 打赏
  • 举报
回复
select * from benz2
1 1080001 jim cim M
2 1080002 tig cim M
3 1080003 ggg sr F

select * from benz3
1 1080001 jim cim M 25
2 1080002 tig cim M 26
3 1080005 fme cim F 26

以上是我的測試數據。
kittysin 2009-06-22
  • 打赏
  • 举报
回复
大数据量时实行效率谁高些?为什么?谢谢[Quote=引用 10 楼 zsh0809 的回复:]
其實從結果上看,是沒有區別的,但是從執行效率上來講,兩者是有差別的。現在測試數據很少,差別不是很大,要是數據量大,就看出來了。LZ可以自己試試。
[/Quote]
「已注销」 2009-06-22
  • 打赏
  • 举报
回复
其實從結果上看,是沒有區別的,但是從執行效率上來講,兩者是有差別的。現在測試數據很少,差別不是很大,要是數據量大,就看出來了。LZ可以自己試試。
csdyyr 2009-06-22
  • 打赏
  • 举报
回复
结果没有区别,只是写法不同。
「已注销」 2009-06-22
  • 打赏
  • 举报
回复
create table benz2(id varchar(7)not null,name varchar(10),dep varchar(10),sex char(1))
create table benz3(id varchar(7),name varchar(10),dep varchar(10),sex char(1),age char(2))
insert into benz3(id,name,dep,sex,age) values('1080005','fme','cim','F','26')
select benz2.NAME,benz3.dep from benz2 join benz3 on benz2.id = benz3.id and benz2.sex='M'
select benz2.NAME,benz3.dep from benz2 join benz3 on benz2.id = benz3.id where benz2.sex='M'


結果都是:
Name DEP
1 jim cim
2 tig cim

區別么,如上,第一个连接两表的条件是A.a = B.b and A.b=1 and A.c=2 ,第二个表连接条件是on A.a = B.b;这里要考的只不过是一个on与where的一个执行顺序问题。
kittysin 2009-06-22
  • 打赏
  • 举报
回复
区别在什么地方?[Quote=引用 3 楼 nalnait 的回复:]
引用 2 楼 xiequan2 的回复:
1:结果没有区别
2:第一个连接两表的条件是A.a = B.b and A.b=1 and A.c=2 ,第二个表连接条件是on A.a = B.b;这里要考的只不过是一个on与where的一个执行顺序问题;


错了,结果有区别
[/Quote]
kittysin 2009-06-22
  • 打赏
  • 举报
回复
区别在哪里?
kittysin 2009-06-22
  • 打赏
  • 举报
回复
到底谁是对的。。。
--小F-- 2009-06-22
  • 打赏
  • 举报
回复
第一个的连接条件是3个 第2个的连接条件是2个 先连接再用2个条件进行筛选
nalnait 2009-06-22
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 xiequan2 的回复:]
1:结果没有区别
2:第一个连接两表的条件是A.a = B.b and A.b=1 and A.c=2 ,第二个表连接条件是on A.a = B.b;这里要考的只不过是一个on与where的一个执行顺序问题;
[/Quote]
错了,结果有区别
xiequan2 2009-06-22
  • 打赏
  • 举报
回复
1:结果没有区别
2:第一个连接两表的条件是A.a = B.b and A.b=1 and A.c=2 ,第二个表连接条件是on A.a = B.b;这里要考的只不过是一个on与where的一个执行顺序问题;
nalnait 2009-06-22
  • 打赏
  • 举报
回复
一个是只有连接条件
一个是连接后再筛选

22,302

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧