select count(*) from sysobjects
select count(*) from syscolumns
select count(*) from sysobjects s left join syscolumns c on s.id=c.id
select count(*) from syscolumns
select count(*) from sysobjects s left join syscolumns c on s.id=c.id
解决方案 »
- SQL Server 2005开发版支持全文搜索吗?
- 想写一个存储过程
- 关于SQL的插入问题
- sql2008附加2005做的库的问题
- 不在事务中的select *...是不是在运行是会有共享锁,update ...在运行是会有更新锁
- 在A表中有User,Name两个字段,用Select语句要返回User(Name)的样式,怎么实现?
- 急,在线等????
- 帮忙!我的SQL Server 无法安装,急呀!
- 如何把类别表中的记录查询输出能够便于显示树的结构!详见内容。
- 关于表中记录修改记录的问题
- 存储过程的执行有没有先后顺序的啊?????????
- 高分求教:一个*.dbf表已被其它程序使用,使用ODBC执行查询语句失败,请教如何共享访问。
join 在数学的理解上可以认为是对两个表的笛卡儿积进行筛选,换句话说,join 能得到的最大集是笛卡儿积,最小集是0行的结果集。
为了讨论,我们先假设有表
t1:
id name
1 Tom
2 Sum
3 Lee
t2:
id monicker
1 Fat Tom
1 Picker
2 Heller查询
select 1.id,t1.name,t2.monicker from t1, t2 ( select 1.id,t1.name,t2.monicker from t1 cross join t2)
就是返回两个表的笛卡儿积,将返回一个9行的数据,这个9行数据的成因是什么呢?自然是因为对于t1的每行数据在t2 里都有3种跟他join 的可能性。
但是我们承认这样的查询除了获得体育彩票之外,在绝大部分情况下都不是我们需要的查询。
最常用的筛选符号自然是“=”号把上面的语句改成:
select 1.id,t1.name,t2.monicker from t1 join t2
on t1.id=t2.id
(select t1.id,t1.name,t2.monicker from t1, t2
where t1.id=t2.id)
就是我们最常用的join 类型了。
但请注意,我们说过我们“进行筛选”,但是没有说过用什么符号进行筛选,看看下面这个查询
select 1.id,t1.name,t2.monicker from t1 join t2
on 1=1
结果就相当于cross join 了
那请思考一下下面这个 查询有什么效果select 1.id,t1.name,t2.monicker
from t1 join t2
on t1.id=t2.id and charindex(t1.name,t2.monicker)<>0
先想想,然后看有什么效果
看看这个例子(从老文章里抄的):
emp_no name
001 Tom
002 Green
003 Sam
004 Sun
005 Hale
想变成两列显示
emp_no1 name1 emp_no2 name2
001 Tom 004 Sun
002 Green 005 Hale
003 Sam于是有了
select e1.name as name1,e1.emp_no as emp_no1,e2.name as name2,e2.emp_no as emp_no2
from
(select emp.* ,(select count(*) from emp x where x.emp_no<=emp.emp_no) as cnt from emp) e1,
(select emp.* ,(select count(*) from emp x where x.emp_no<=emp.emp_no) as cnt from emp) e2,
where (e1.cnt-((select count(*) from emp)/2))*=e2.cnt
现在,你对join 的可以发挥想象力的能力还有多少怀疑?所谓的 outer join 其实是放宽 Join 筛选条件,——会有这样的效果:按照原样保持不符合筛选条件的行集,但是对于不保留的方面,全部用NULL值表示状态未知。
from t1 left join t2
on t1.id=t2.id and charindex(t1.name,t2.monicker)<>0
我们运行下这个查询,然后我们可以自己体会到“原样保留”这4个字的意思是不删除,也不放大查询中指定不按照Join条件进行过滤筛选的结果。单独的join 使用威力终究有限,与group by 的往往才是 快乐查询/提高效率的 源泉。--接下去要介绍的东西太多,我就没头绪了,只能到此为止。
如果t2.id中有10条id相同的记录,则结果集中就有10条记录
右联接时原理也是一样的,结果集中有几条记录关键在于两个表记录在条件下是否是唯一一条