徐小玉的博客。
分类:
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,即将结果中table的name字段相同的记录合为一条记录,并且只有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,表a有m条记录,表b有n条记录,则一般笛卡尔积后得到的记录条数是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
------------------------------
注释:只返回符合条件的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
不过使用INNER JOIN比较好,兼容性好