select count(*)  from sysobjects
select count(*)  from syscolumns
select count(*)  from  sysobjects s left join syscolumns c on s.id=c.id

解决方案 »

  1.   

    由于多表连接可以有层次理解,最终也可以简化成2表连接的关系,就不多说了。
    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

    先想想,然后看有什么效果
      

  2.   

    在join 的时候其实可以充分发挥你的想象力,我们不仅可以使用任何可能使用的可以出现逻辑结果的运算符号,还可以使用任何确定/不确定/运算出来的列值进行join 
    看看这个例子(从老文章里抄的):
    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值表示状态未知。
      

  3.   

    elect 1.id,t1.name,t2.monicker 
    from  t1 left join t2 
    on  t1.id=t2.id and charindex(t1.name,t2.monicker)<>0
    我们运行下这个查询,然后我们可以自己体会到“原样保留”这4个字的意思是不删除,也不放大查询中指定不按照Join条件进行过滤筛选的结果。单独的join 使用威力终究有限,与group by 的往往才是 快乐查询/提高效率的 源泉。--接下去要介绍的东西太多,我就没头绪了,只能到此为止。
      

  4.   

    左联接时,假设连接条件是t1.ID=t2.ID
    如果t2.id中有10条id相同的记录,则结果集中就有10条记录
    右联接时原理也是一样的,结果集中有几条记录关键在于两个表记录在条件下是否是唯一一条
      

  5.   

    未必,如果两个表中都有相关的NULL值。