本帖最后由 DOwnstairs 于 2011-05-15 10:16:23 编辑

解决方案 »

  1.   

    结果一样,相当于inner join
      

  2.   

    JOIN: 如果表中有至少一个匹配,则返回行 
    INNER JOIN: 在表中存在至少一个匹配时,INNER JOIN 关键字返回行
    FULL JOIN: 只要其中一个表中存在匹配,就返回行 

    上面这3个有啥区别,看着好像一样啊?
    LEFT JOIN: 即使右表中没有匹配,也从左表返回所有的行 
    RIGHT JOIN: 即使左表中没有匹配,也从右表返回所有的行 
      

  3.   

    --例如:
    select * from a,b where a.id=b.id 
    --和 
    select * from a as aa join b as bb on bb.id=aa.id 
    --哪个性能高呢?--这只是SQL 的两种不同写法,数据库执行的时候是解释成为同一个语句去执行的
    --实际上都是 inner join 操作。
    --如果你用的是SQL Server 2000的话,在查询分析器里同时选中两个语句
    --然后按ctrl+L 快捷键查看预计执行计划,你会看到执行计划是一模一样的。关于你where 后面的前后顺序是一样的。JOIN 是不是和FULL JOIN一样?
    不是,join和inner join是一样的。
      

  4.   

    没区别,Persons.Id_P = Orders.Id_P 跟 Orders.Id_P=Persons.Id_P完全等价,这是sql语法规则,不属于join问题范畴。
      

  5.   

    关于join:
    a inner join b 等价于 b inner join a
    a outer join b 等价于 b outer join a
    a left join  b 不等价 b left join a
    a right join b 不等价 b right join a
      

  6.   

    带 JOIN 只能  是两个表吗? 多个表行不?
      

  7.   

    例:
    A表:
    ----
    a
    b
    c
    ========
    B表
    ----
    a
    b
    d
    ========
    a inner join b
    ----
    a
    b
    ========
    a outer join b
    ----
    a
    b
    c
    d
    ========
    简单的说就是inner join返回交集,outer join返回并集
      

  8.   

    DECLARE 
    @TA TABLE (IDA INT,VA VARCHAR(10))
    DECLARE
    @TB TABLE (IDB INT,VB VARCHAR(10))INSERT INTO @TA 
    SELECT
    1,'AA' UNION SELECT
    2,'BC' UNION SELECT
    3,'CCC'INSERT INTO @TB
    SELECT 
    1,'2'  UNION SELECT
    3,'58' UNION SELECT
    4,'67' --内联接简单写法
    SELECT A.IDA,A.VA,B.IDB,B.VB FROM @TA A,@TB B
    WHERE A.IDA=B.IDB--内联接
    SELECT A.IDA,A.VA,B.IDB,B.VB FROM @TA A INNER JOIN @TB B
    ON A.IDA=B.IDBSELECT A.IDA,A.VA,B.IDB,B.VB FROM @TA A JOIN @TB B
    ON A.IDA=B.IDB--左外联接
    SELECT A.IDA,A.VA,B.IDB,B.VB FROM @TA A LEFT JOIN @TB B
    ON A.IDA=B.IDBSELECT A.IDA,A.VA,B.IDB,B.VB FROM @TA A LEFT OUTER JOIN @TB B
    ON A.IDA=B.IDB--右外联接
    SELECT A.IDA,A.VA,B.IDB,B.VB FROM @TA A RIGHT JOIN @TB B
    ON A.IDA=B.IDBSELECT A.IDA,A.VA,B.IDB,B.VB FROM @TA A RIGHT OUTER JOIN @TB B
    ON A.IDA=B.IDB--完整外联接
    SELECT A.IDA,A.VA,B.IDB,B.VB FROM @TA A FULL JOIN @TB B
    ON A.IDA=B.IDBSELECT A.IDA,A.VA,B.IDB,B.VB FROM @TA A FULL OUTER JOIN @TB B
    ON A.IDA=B.IDB
    --交叉联接
    SELECT A.IDA,A.VA,B.IDB,B.VB FROM @TA A CROSS JOIN @TB B--自联接
    SELECT A.IDA,A.VA,B.IDA,B.VA FROM @TA A,@TA B WHERE A.IDA=B.IDA+1查询分析器中执行:
    --建表table1,table2:
    create table table1(id int,name varchar(10))
    create table table2(id int,score int)
    insert into table1 select 1,'lee'
    insert into table1 select 2,'zhang'
    insert into table1 select 4,'wang'
    insert into table2 select 1,90
    insert into table2 select 2,100
    insert into table2 select 3,70
    如表
    -------------------------------------------------
    table1|table2|
    -------------------------------------------------
    idname|idscore|
    1lee|190|
    2zhang|2100|
    4wang|370|
    -------------------------------------------------以下均在查询分析器中执行一、外连接
    1.概念:包括左向外联接、右向外联接或完整外部联接2.左连接:left join 或 left outer join
    (1)左向外联接的结果集包括 LEFT OUTER 子句中指定的左表的所有行,而不仅仅是联接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值(null)。
    (2)sql语句
    select * from table1 left join table2 on table1.id=table2.id
    -------------结果-------------
    idnameidscore
    ------------------------------
    1lee190
    2zhang2100
    4wangNULLNULL
    ------------------------------
    注释:包含table1的所有子句,根据指定条件返回table2相应的字段,不符合的以null显示3.右连接:right join 或 right outer join
    (1)右向外联接是左向外联接的反向联接。将返回右表的所有行。如果右表的某行在左表中没有匹配行,则将为左表返回空值。
    (2)sql语句
    select * from table1 right join table2 on table1.id=table2.id
    -------------结果-------------
    id  name   id   score
    ------------------------------
    1   lee    19    0
    2    z     hang  2100
    4    NULL NULL  370
    ------------------------------
    注释:包含table2的所有子句,根据指定条件返回table1相应的字段,不符合的以null显示4.完整外部联接:full join 或 full outer join 
    (1)完整外部联接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值。
    (2)sql语句
    select * from table1 full join table2 on table1.id=table2.id
    -------------结果-------------
    idnameidscore
    ------------------------------
    1lee190
    2zhang2100
    4wangNULLNULL
    NULLNULL370
    ------------------------------
    注释:返回左右连接的和(见上左、右连接)二、内连接
    1.概念:内联接是用比较运算符比较要联接列的值的联接2.内连接:join 或 inner join 3.sql语句
    select * from table1 join table2 on table1.id=table2.id
    -------------结果-------------
    idnameidscore
    ------------------------------
    1lee190
    2zhang2100
    ------------------------------
    注释:只返回符合条件的table1和table2的列4.等价(与下列执行效果相同)
    A:select a.*,b.* from table1 a,table2 b where a.id=b.id
    B:select * from table1 cross join table2 where table1.id=table2.id  (注:cross join后加条件只能用where,不能用on)三、交叉连接(完全)1.概念:没有 WHERE 子句的交叉联接将产生联接所涉及的表的笛卡尔积。第一个表的行数乘以第二个表的行数等于笛卡尔积结果集的大小。(table1和table2交叉连接产生3*3=9条记录)2.交叉连接:cross join (不带条件where...)3.sql语句
    select * from table1 cross join table2
    -------------结果-------------
    idnameidscore
    ------------------------------
    1lee190
    2zhang190
    4wang190
    1lee2100
    2zhang2100
    4wang2100
    1lee370
    2zhang370
    4wang370
    ------------------------------
    注释:返回3*3=9条记录,即笛卡尔积4.等价(与下列执行效果相同)
    A:select * from table1,table2
      

  9.   

    Select  产品名称 as   产品名称,产品批号 as 产品批号,工序表.工序名称 as 工序名称,合格数 as 合格数,作废数 as 作废数,作废表.作废名称 as 作废名称,操作者 as 操作者,机床 as 机床,作废人员 as 作废人员,作废机床 as 作废机床
    FROM (主表 LEFT JOIN 工序表 ON 主表.工序代号 = 工序表.工序代号) LEFT JOIN 作废表 ON 主表.作废代号 = 工序表.作废代号
      

  10.   

    1. 交叉连接table1 cross join table2将包含m*n条记录,由两个表中所有可能的记录对组成,因为没有匹配字段或选择条件,所以不能使用on子句和using子句;
    2. 内连接table1 inner join table2将包含r条记录(r<m*n),严格来说,内连接是交叉连接的一个子集,它是通过消除交叉连接中不满足内连接匹配条件的记录而生成的,必须使用on子句。
    3. 左外连接left outer join包含内连接所有记录,以及保留表table1中NULL扩展的每一个未匹配记录;
    4. 右外连接right outer join包含内连接所有记录,以及保留表table2中NULL扩展的每一个未匹配记录;
    5. 全外连接full outer join包含内连接所有记录,以及保留表table1中NULL扩展的每一个未匹配记录,保留表table2中NULL扩展的每一个未匹配记录,通俗的说,它的查询结果等于左外连接加上右外连接;列合并,两张表的数据会全部出来
    6. 合并连接union join包含table1中NULL扩展的每一个未匹配记录,加上table2中NULL扩展的每一个未匹配记录,通俗的说,它的查询结果等于全外连接减去内连接。(合并连接的两个表必须具有相同数量的字段,对应字段的数据类型也必须相同)行集合并
    JOIN只是INNER JOIN的简写方式。
      

  11.   

    补充以上:
    有m条记录的table1表,有n条记录的table2表。外联接中,保留表的记录全部显示,非保留表以NULL扩展。INNER JOIN和FULL JOIN是完全不同的两种联接查询方式。