有如下兩條SQL,請問一下,有什麼區別:
1)SELECT inv_cycle_detail.cycle_nbr,
inv_cycle_master.cycle_nbr
FROM inv_cycle_detail,
inv_cycle_master
WHERE ( inv_cycle_master.cycle_nbr = inv_cycle_detail.cycle_nbr ) 2)SELECT a.cycle_nbr,
b.cycle_nbr
FROM inv_cycle_detail a left join inv_cycle_master b
on a.cycle_nbr = b.cycle_nbr
解决方案 »
- MSSql查询分析器问题
- 如何看贴子
- 微软技术大会(Tech·Ed)2005北京 门票转让
- 安装了vs2010学习数据库还用安装sql sever吗??
- 怎么设置sqlserver查询分析器,不自动提交语句
- 急!!!默认日期问题!
- 无法打开SQL Server Management Studio
- 怎么在这个视图上添加索引怎么老是提示错误呢?
- 在sql server中能否用sql语句直接把文本文件倒入数据库成为一张表?
- 求大神给讲解下SQL Server数据库备份的相关问题
- 请教 帖子信息(用户名,发帖ID,标题,内容)这个关系模式属于第几范式呢?
- 一个系统参数表,只有一行,每次只允许一个用户取数据,取成功且更新后,才能允许其他用户取,该如何作?
inv_cycle_detail.cycle_nbr,
inv_cycle_master.cycle_nbr
FROM inv_cycle_detail, inv_cycle_master
WHERE ( inv_cycle_master.cycle_nbr = inv_cycle_detail.cycle_nbr ) 2)SELECT --左连接,inv_cycle_detail表里数据都出来,inv_cycle_master表里只出来和inv_cycle_detail相等的数据,其它用空白来补充
a.cycle_nbr,
b.cycle_nbr
FROM inv_cycle_detail a
left join inv_cycle_master b on a.cycle_nbr = b.cycle_nbr
SELECT
inv_cycle_detail.cycle_nbr,
inv_cycle_master.cycle_nbr
FROM inv_cycle_detail
INNER JOIN inv_cycle_master ON inv_cycle_master.cycle_nbr = inv_cycle_detail.cycle_nbr
left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录
right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录
inner join(等值连接) 只返回两个表中联结字段相等的行举例如下:
--------------------------------------------
表A记录如下:
aID aNum
1 a20050111
2 a20050112
3 a20050113
4 a20050114
5 a20050115表B记录如下:
bID bName
1 2006032401
2 2006032402
3 2006032403
4 2006032404
8 2006032408--------------------------------------------
1.left join
sql语句如下:
select * from A
left join B
on A.aID = B.bID结果如下:
aID aNum bID bName
1 a20050111 1 2006032401
2 a20050112 2 2006032402
3 a20050113 3 2006032403
4 a20050114 4 2006032404
5 a20050115 NULL NULL(所影响的行数为 5 行)
结果说明:
left join是以A表的记录为基础的,A可以看成左表,B可以看成右表,left join是以左表为准的.
换句话说,左表(A)的记录将会全部表示出来,而右表(B)只会显示符合搜索条件的记录(例子中为: A.aID = B.bID).
B表记录不足的地方均为NULL.
--------------------------------------------
2.right join
sql语句如下:
select * from A
right join B
on A.aID = B.bID结果如下:
aID aNum bID bName
1 a20050111 1 2006032401
2 a20050112 2 2006032402
3 a20050113 3 2006032403
4 a20050114 4 2006032404
NULL NULL 8 2006032408(所影响的行数为 5 行)
结果说明:
仔细观察一下,就会发现,和left join的结果刚好相反,这次是以右表(B)为基础的,A表不足的地方用NULL填充.
--------------------------------------------
3.inner join
sql语句如下:
select * from A
innerjoin B
on A.aID = B.bID结果如下:
aID aNum bID bName
1 a20050111 1 2006032401
2 a20050112 2 2006032402
3 a20050113 3 2006032403
4 a20050114 4 2006032404结果说明:
很明显,这里只显示出了 A.aID = B.bID的记录.这说明inner join并不以谁为基础,它只显示符合条件的记录.
--------------------------------------------
注:
LEFT JOIN操作用于在任何的 FROM 子句中,组合来源表的记录。使用 LEFT JOIN 运算来创建一个左边外部联接。左边外部联接将包含了从第一个(左边)开始的两个表中的全部记录,即使在第二个(右边)表中并没有相符值的记录。语法:FROM table1 LEFT JOIN table2 ON table1.field1 compopr table2.field2说明:table1, table2参数用于指定要将记录组合的表的名称。
field1, field2参数指定被联接的字段的名称。且这些字段必须有相同的数据类型及包含相同类型的数据,但它们不需要有相同的名称。
compopr参数指定关系比较运算符:"=", "<", ">", "<=", ">=" 或 "<>"。
如果在INNER JOIN操作中要联接包含Memo 数据类型或 OLE Object 数据类型数据的字段,将会发生错误.
INSERT @TA
SELECT 1, 'aa' UNION ALL
SELECT 2, 'bb'DECLARE @TB TABLE(ID INT, name VARCHAR(2))
INSERT @TB
SELECT 2, 'cc' UNION ALL
SELECT 3, 'dd'--1, 内连接INNER JOIN 或 JOIN
SELECT * FROM @TA AS A INNER JOIN @TB AS B ON A.ID=B.ID
/*
ID name ID name
----------- ---- ----------- ----
2 bb 2 cc
*/--3, 左连接LEFT JOIN
SELECT * FROM @TA AS A LEFT JOIN @TB AS B ON A.ID=B.ID
/*
ID name ID name
----------- ---- ----------- ----
1 aa NULL NULL
2 bb 2 cc
*/--3, 右连接RIGHT JOIN
SELECT * FROM @TA AS A RIGHT JOIN @TB AS B ON A.ID=B.ID
/*
ID name ID name
----------- ---- ----------- ----
2 bb 2 cc
NULL NULL 3 dd
*/--4, 完全外连接 FULL JOIN
SELECT * FROM @TA AS A FULL JOIN @TB AS B ON A.ID=B.ID
/*
ID name ID name
----------- ---- ----------- ----
2 bb 2 cc
NULL NULL 3 dd
1 aa NULL NULL
*/
第二条:返回整个左表的记录+从两个表中返回相匹配的所有记录(左表即代码里先出现的表)
比如:"select * from table_1 left join talbe_2 on search condition"中table_1就是左表
"select * from table_2 left join talbe_1 on search condition"中table_2就是左表
2, left join
1.第一个相当于innser join,内连接两个配置的记录..
2.第二个先找出两个配置的记录,再找出左边没有显示的所有记录.
1)SELECT inv_cycle_detail.cycle_nbr,
inv_cycle_master.cycle_nbr
FROM inv_cycle_detail,
inv_cycle_master
WHERE ( inv_cycle_master.cycle_nbr = inv_cycle_detail.cycle_nbr ) 此为内连接,相当于INNER JOIN 2)SELECT a.cycle_nbr,
b.cycle_nbr
FROM inv_cycle_detail a left join inv_cycle_master b
on a.cycle_nbr = b.cycle_nbr1)( inv_cycle_master.cycle_nbr = inv_cycle_detail.cycle_nbr )
条件改成
( inv_cycle_master.cycle_nbr *= inv_cycle_detail.cycle_nbr )
就是和2一样,即表1全部显示,表面2显示符合条件的。