Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1563379
  • 博文数量: 289
  • 博客积分: 11086
  • 博客等级: 上将
  • 技术积分: 3291
  • 用 户 组: 普通用户
  • 注册时间: 2006-06-22 17:06
个人简介

徐小玉的博客。

文章分类

全部博文(289)

文章存档

2023年(6)

2022年(1)

2021年(2)

2020年(9)

2019年(9)

2018年(6)

2017年(10)

2016年(10)

2014年(3)

2013年(4)

2011年(12)

2010年(16)

2009年(14)

2008年(119)

2007年(48)

2006年(20)

我的朋友

分类:

2008-02-13 16:42:38

基本概念
连接          将几个个有关联的表(其中一个表的主键是其他表的外键)建立连接关系,形成一个临时表以供它用。
                  
建立连接的主键/外键是建立连接的依据。
内连接    将进行连接的表以建立连接的依据为中心,将这些表取交集,交集就是内连接的结果。
                  
作用就是找出在两张表中都有的记录。
外连接    连接的动作和内连接一样,结果不同。将表进行交集之后,取交集中的记录以及某表中除交集之外的所有记录。包括左连接和右连接。
                  
例如A表左连接B表,实际上就是取交集在B表中所有字段的值+A表内容。
自连接    连接动作同上,只不过是在一张表中进行。
                  
这样的情况适用于表中的2个字段互相有关联,并且要对这种关联进行处理时。

Join 进行表的各种连接
Select name,id FROM table1 [INNER|LEFT OUTER|RIGHT OUTER] JOIN table2 ON table1.id [>|<|>=|<=|=] table2.id
这是进行内连接/左外联/右外联的表示方式,其中id就是建立连接的依据,on后面的部分是选择对象的筛选条件。例如,如果是“=”,表示在两个表中id 相同的记录中进行查询

Order By 将查询结果进行排序
格式order by table.name Desc,将结果按照表table中的字段name进行降序排序。默认不标明排序方式的是升序。

Group By Having
将查询结果按照Group By的条件进行分组,Having 增加结果显示的约束条件,即在上述查询结果中符合某条件的记录才能显示。
Group By table.name Having tabel.number>2
,即将结果中tablename字段相同的记录合为一条记录,并且只有table.number大于2的分组符合显示条件。

Sum
()计算某些记录的和
AVG
()计算某些记录的平均值
Count
()计算符合某些条件的记录的个数
Max
()筛选出某些值中的最大值
Min
()筛选出某些值中的最小值

oracle pl-sql中,左连接和右连接以如下方式来实现, 查看如下语句:
select emp_name, dept_name form employee, department where

employee.emp_deptid (+) = department.deptid   

sql文使用了右连接,即“(+)”所在位置的另一侧为连接的方向,右连接说明等号右侧的所有 记录均会被显示,无论其在左侧是否得到匹配,也就是说上例中无论会不会出现某个部门没有一个的情况,这个部门的名字都会在查询结果中出现。

反之:
select emp_name, dept_name
form employee, department
where employee.emp_deptid = department.deptid(+)
则是左连接,无论这个有没有一个能在department表中得到匹配的部门号,这个的记录都会被显示

inner join 与一般笛卡尔积的区别:inner join是笛卡尔积的特殊形式。如果有表a和表b,am条记录,表bn条记录,则一般笛卡尔积后得到的记录条数是m*n条,记录之间的组合是随意 的。而内连接则是建立在表a和表b的结构中有相同的列名的基础上进行的。

select * from tb1 a inner join tb2 b on a.id=b.id
select * from tb1 a ,tb2 b where a.id=b.id 有什么不同?
第一条和第二条SQL语句的执行方式应该是不一样的。第一条的话应该是参照表a中的记录,一条一条到表b中去找符合记录的,符合则连在一起,否则转到a中下一条。
而第2条语句的执行方式是将表a和表b的记录组合起来,然后考察满足条件的,并返回

一、外连接
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
-------------
结果-------------
idnameidscore
------------------------------
1lee190
2zhang2100
NULLNULL370
------------------------------
注释:包含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
------------------------------
注释:只返回符合条件的table1table2的列

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 子句的交叉联接将产生联接所涉及的表的笛卡尔积。第一个表的行数乘以第二个表的行数等于笛卡尔积结果集的大小。(table1table2交叉连接产生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

不过使用INNER JOIN比较好,兼容性好

阅读(1878) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~