SQL表连接查询(inner join、full join、left join、right join)【转载】

多表查询

多表查询分为 内、外连接;

外连接

外连接分为左连接(left join 或left outer join)、右连接(right join 或者 right outer join)、和完整外部连接 (full join 或者 full outer join)

1:左连接(left join 或left outer join)

左连接(left join 或 left outer join)的结果就是left join子句中的左表的所有行,而不仅仅是链接列所匹配的行,如果左表中的某行在右表中没有匹配,则在相关联的结果行中右表的所有选择列均为空值(NULL);
SQL语法:

select * from  table1 left join table2 on 
    table1.条件列名 = table2.条件列名;

右连接(right join 或 right outer join )

右连接(right join 或 right outer join )在这里不做多说这左连接很象但是是相反的,只说一下语法
SQL语法:

select *from table1 right join table2 on 
    table1. 条件列= table2.条件列;

完全外部连接(full join 或 full outer join)

显示左右表中的所有行,当某一个表中没有匹配的行时,则另一个表的选择列表列包含空值(NULL)如果有则显示全部数据;
SQL语法:

select *from table1 full join table2 on  
    table1.条件列名= table2.条件列名;

内连接(join 或者inner join )

概念:内连接就是用比较运算符比较要用连接列的值的连接;
SQL语法:

select *fron table1 join table2  on 
    table1.条件列名 = table2.条件列名;
返回符合匹配条件的两表列;

等价于:

select A* ,B* from table1 A ,table2 B 
    where A.条件列名 =B.条件列名

select * form table1 cross join table2
    where table1.条件列名 = table2.条件列名
    (注: Cross join 后面不能跟on 只能用where

交叉连接(完全)

概念:没有用where子句的交叉连接将产生连接所涉及的笛卡尔积第一个表的行数乘以第二个表的行数等于笛卡尔积和结果集的大小

交叉连接: Cross join(不带条件where,如果带返回或显示的是匹配的行数)

SQL语法:

select *from  table1 cross join table2

如果有条件(where)

select * from table1  cross join table2 
    where table1. 条件列名= table2.条件列名

等价于

select *from table1,table2 (不带where)

示例:

前提条件:假设有两个表,一个是学生表,一个是学生成绩表。
结构

表的数据有:
表数据

一、内连接-inner jion :

最常见的连接查询可能是这样,查出学生的名字和成绩:

select s.name,m.mark from student s,mark m 
    where s.id=m.studentid;

上面就是我们最常见的inner join,即内连接,把符合student.id=mark.studentid 条件的元组才选出来,也可以写成:

select s.name,m.mark from student s inner join 
    mark m on s.id=m.studentid;

符合条件的只有两条结果,查出结果为:
内连接查询结果

二、左连接-left join:

左连接是把左边的表的元组全部选出来:

select s.name,m.mark from student s left join 
    mark m on s.id=m.studentid;

上面语句就是把左边的表,即student表中的元组全部选出,尽管有些分数表是没数据的,也选了出来,选出的结果为:
左连接查询结果

三、右连接-right join:

右连接就是把右边表的数据全部取出,不管左边的表是否有匹配的数据:

select s.name,m.mark from student s right join 
    mark m on s.id=m.studentid;

上面的语句就是把mark分数表的数据全部取出来,不管student表中是否有数据匹配,如下图所示:
右连接查询

四、全连接-full join:

把左右两个表的数据都取出来,不管是否匹配:

select s.name,m.mark from student s full join 
    mark m on s.id=m.studentid;

如下图所示,学生表和成绩表的数据都取了出来:

注意:
比较常用的是第一种,内连接,而且是用这种写法:

select s.name,m.mark from student s,mark m 
    where s.id=m.studentid;

小结:

关键是理解joinouter join

1:join

保留所有符合on条件的行,查询结果行数量不会大于被join的表;

2:outer join

保留上面join的结果,并根据left, right, 或full,保留其中至少一个表内的不符合on条件的结果行,这种结果行仅有一个表内的结果,另一半数据用null填充;

自己小结:

外关联与内关联的语法

1:内关联

1:内关联 // 实质上就是有一样的就形成一条记录放回,而不会出现有个别字段为空的情况;

    select  s_emp.id, first_name, name from s_emp,
        inner join s_dept on
        ( 
            s_emp.dept_id = s_dept.id 
        ) // 这种语法比较直观

实质上这等价于:

    select  s_emp.id, first_name, name from s_emp,
         s_dept where s_emp.dept_id = s_dept.id;

2:左外关联

select  s_emp.id, first_name, name from s_emp,
    left outer join s_dept on
    (
         s_emp.dept_id = s_dept.id 
    )     

3:右外关联

    select  s_emp.id, first_name, name from s_emp,
        right outer join s_dept on
        ( 
            s_emp.dept_id = s_dept.id 
        ) 

4:完全关联(属于外关联)

    select  s_emp.id, first_name, name from s_emp,
        full outer join s_dept on
        (
            s_emp.dept_id = s_dept.id 
        ) 

不等关联

如:

select  s_emp.id, first_name, name from s_emp,
    where upper(name) like 'S\_%' escape '\'    
    // 查询以S_打头的记录
SELECT  e.ename, e.job, e.sal, s.grade
    FROM    emp e, salgrade s
    WHERE   e.sal BETWEEN s.losal AND s.hisal;

自关联

这个时候用表别名就成为必须的;

select  e.id, e.first_name, m.first_name from 
    s_emp e, s_emp m 
    where e.manager_id = m.id; 
    // 实质上是同一张表,起了别名进行区分

原创信息:

原创地址(感谢原创博主的总结和分享,谢谢) :
http://www.cnblogs.com/lichen396116416/archive/2011/02/13/1953182.html
http://www.cnblogs.com/still-windows7/archive/2012/10/22/2734613.html

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值