本站不再更新,欢迎光临 java开发技术网
随笔-230  评论-230  文章-8  trackbacks-0

SQL 中JOIN的用法(来自CSDN)

JOIN 连接组合两个表中的字段记录,包括三种:  

INNER JOIN 运算式:连接组合两个表中的字段记录。  

LEFT JOIN 运算式:连接组合两个表中的字段记录,并将包含了 LEFT JOIN 左边表中的全部记录。  

RIGHT JOIN 运算式:连接组合两个表中的字段记录,并将包含了 RIGHT JOIN 右边表中的全部记录。  

INNER JOIN 设定两个表相关联的运算式,以连接组合两个表中的字段记录。  

INNER JOIN 语法如下:  

FROM  1 INNER JOIN  2 ON  1. 字段 比较运算子   2. 字段

两个表连接的字段,譬如  [ 1. 字段 1= 2. 字段 2] ,必须具有相同的字段类型,但是字段名称不需要相同。  

例如,自动编号字段类型可以连接 Long  的字段类型,但是单精整数字段类型不能连接双精整数的字段类型。  

比较运算子可为 = < > <= >= 、或 <>  

JOIN 连接的字段,不可以包含 MEMO 字段类型或 OLE 对象类型,否则会发生错误。  

在一个 JOIN 表达式中,可以连结多个 ON 子句:  

SELECT fields 
FROM 
1 INNER JOIN 
ON 
1. 字段 比较运算子   2. 字段 1 AND 
ON 
1. 字段 比较运算子   2. 字段 2) OR 
ON 
1. 字段 比较运算子   2. 字段 3) 

JOIN 表达式中,可以为巢状式:  

SELECT fields 
FROM 
1 INNER JOIN 
(
2 INNER JOIN [( ]
[INNER JOIN [( ] 
x [INNER JOIN ...)] 
ON 
3. 字段 比较运算子   x. 字段 x)] 
ON 
2. 字段 比较运算子   3. 字段 3) 
ON 
1. 字段 比较运算子   2. 字段

在一个 INNER JOIN 中,可以包括巢状式的 LEFT JOIN RIGHT JOIN ,但是在一个 LEFT JOIN RIGHT JOIN 中不能包括巢状式的 INNER JOIN  


==================================================
看一下一个查询的问题  
我有两张表  
tab1  
       字段  
       aID  
       bID  
 
tab2  
       字段  
       aID  
       bID  


tab1中有记录:  
aID    bID  
as1    19  
as2    19  
as3    23  
as4    45  
tab2中有记录:  
aID    bID  
as2    19  
as3    19  
as4    19  


现在需要查找出两张表中bID相等的且bID=19的记录,应该是5条记录  
我用的方法是:  
方法1:select  tab1.aID,tab2.aID  from  tab1,tab2  where  tab1.bID=tab2.bID  and  tab2.bID=19  
方法2:select  tab1.aID,tab2.aID  from  tab1  join  tab2  on  tab1.bID=tab2.bID  where  tab1.bID=19  
上面两中方法选出的记录都是6条,为什么出这样的问题,应该怎么做呢?  
---------------------------------------------------------------  
 
select  *  form  tab1  where  bID=19  
union  all    
select  *  form  tab2  where  bID=19  
 
 
---------------------------------------------------------------  
 
create  table  tab1  
       (aID  char(10),  
       bID  char(10))  
go  
 
insert  into  tab1(aid,bid)  values('as1','19')  
insert  tab1  values('as2','19')  
insert  tab1  values('as3','38')  
insert  tab1  values('as4','45')  
go  
create  table  tab2  
       (aID  char(10),  
       bID  char(10))  
go  
go  
insert  tab2  values('as2','19')  
insert  tab2  values('as3','19')  
insert  tab2  values('as4','19')  
go  
select  *  from  tab1  
 
select  *  from  tab1  where  tab1.bid='19'union  all  select  *  from  tab2    where  tab2.bid='19'  
 
 
斑竹加的话:  
1、join  产生的是笛卡尔积。  
2、union  会排除重复的记录  
3、union  all  不会排除重复的记录  
 

 

union子句
union操作符将两个查询结果合并为一个结果集。为连接查询合并两个表时:列的数日和顺序在查中必须一致;数据类型兼容
语法:
select  语句
union   [ all ]
select  语句
注意:
1 .union运算从最终结果集中删除重复记录,如想不删除重复记录使用all关键字
2 .第一个select语句中不能用order by或compute子句,只能是最后一个select语名后用

例:查询计算机系的学生式年龄不大于19岁的学习,按年龄倒排序
select   *   from  department  where  dept = ' computer ' ;
union ;
 select 
*   from  student  where  age <= 19
order   by  age  desc

posted on 2007-03-16 17:04 有猫相伴的日子 阅读(1153) 评论(0)  编辑  收藏 所属分类: pl/sql

只有注册用户登录后才能发表评论。


网站导航:
 
本站不再更新,欢迎光临 java开发技术网