SQL的多表连接查询

  多表连接查询具有两种规范,SQL92和SQL99规范。

  SQL92规范支持下列多表连接查询:

  (1)等值连接;

  (2)非等值连接;

  (3)外连接;

  (4)广义笛卡尔积;

  SQL99规范支持了可读性更好的多表连接语法,并提供了更多类型的连接查询,SQL99规范支持的多表连接如下:

  (1)交叉连接;

  (2)自然连接;

  (3)使用using句子的连接;

  (4)全外连接,或左、右外连接。

1.SQL92的连接查询

  SQL92多表连接查询语句比较简洁,这种语法把多个数据表放在from之后,多个表之间以逗号隔开;连接条件放在where之后,与查询条件之间用and逻辑运算符连接。如果连接条件要求两列值相等,则称为等值连接,否则称为非等值连接;如果没有任何连接条件,则称为广义笛卡尔积。

  SQL92多表连接查询的语法格式:

select column1,column2 ...
from table1,table2 ...
where join_condition

  多表连接查询中可能出现两个或多个列具有相同列名的情况,则需要在这些同名列之间使用表名作为前缀或表别名作为前缀为限制,以避免系统混淆。

  所有的列都可以增加表名前缀或者表别名前缀。只是进行单表查询时,绝不会出现同名列,所以系统不会发生混淆,因此省略表名前缀。

(1)查询出所有学生资料以及老师姓名

select s.*,teacher_name
#指定多个数据表,并指定表别名
from student_table as s,teacher_table t
#使用where指定连接条件
where s.java_teacher = t.teacher_id;

(2)当要求广义笛卡尔积时,where子句后没有任何的条件,广义笛卡尔积的结果会有n*m条记录。只要把where后边的连接条件去掉,则可以得到广义笛卡尔积。

select s.*,teacher_name
#指定多个数据表,并指定表的别名
from student_table s,teacher_table t;

(3)非等值连接

select s.*,teacher_name
#指定多个数据表,并指定别名
from student_table s,teacher_table t
#使用where子句指定连接条件,非等值连接
where s.java_teacher>t.teacher_id;

(4)当需要过滤数据时,可以将过滤条件和连接条件使用and连接起来

select s.*,teacher_name
#指定多个数据表,并指定表别名
from student_table s,teacher_table t
#使用where指定连接条件,并指定student_name不能为空
where s.java_teacher=t.teacher_id
and student_name is not null;

(5)SQL92的外连接就是在连接条件的列名后增加括号包起来的外连接符,当外连接符出现在左边时成为左外连接,出现在右边时称为右外连接。

select s.*,teacher_name
from student_table s,teacher_table t
#右外连接
where s.java_teacher=t.teacher_id(*);

(6)外连接就是在外连接符所在的表中增加一个“万能行”,这行记录的所有数据都是null,而且该行可以与另一表中所有不满足条件的记录进行匹配,通过这种方式就可以把一个表中的所有记录选出来,不管这些记录是否满足连接条件。

2.SQL99的连接查询

  SQL99与SQL92连接查询的原理基本相同,SQL99的可读性更强,在SQL99中,查询用的多个数据表显式使用xxx join连接,不是依次排在from之后,from之后值需要放一个数据表;连接条件不再放在where以后,而是专门提供了连接条件子句。

(1)交叉连接(cross join)

  交叉连接实质就是SQL92的广义笛卡尔积,所以交叉连接无需任何连接条件。

select s.*,teacher_name
#连接查询的from后只有一个表名
from student_table as s
#cross join交叉连接,相当于广义笛卡儿积
cross join teacher_table t;

(2)自然连接(natural join)

  自然连接表面上看起来也无需指定连接条件,但natrual join是有连接条件的,natrual join会以两个表中的同名列作为连接条件;如果两个表中没有同名列,则cross join和natrual join完全一样。

select s.*,teacher_name
#from后只有一个表名
from student_table s
#natrual join 使用两个表中的同名列为连接条件
natrual join teacher_table t;

(3)using子句连接

  using子句可以连接一列或者多列,用于显式指定两个表中的同名列作为连接条件。假设两个表中有超过一列的同名列,如果使用natrual join,则会把所有的同名列当成连接条件;使用using子句,就可以显式指定使用那些列名作为连接条件。

select s.*,teacher_name
#from后只有一个表名
from student_table s
#join连接另一个表
join teacher_table t
using(teacher_id);

  值得注意的是,如果使用using子句来指定连接条件,则两个表中必须有同名列,否则就会出现错误。

(4)on子句连接

  最常用的连接方式,SQL99语法的连接条件放在on子句中指定,而且每个on子句至指定一个连接条件。这意味着:如果进行N表连接,则需要有N-1个join...on对。


#等值查询
select s.*,teacher_name #from后只有一个表名 from student_table s #join连接另一个表 join teacher_table t #使用on来指定连接条件 on s.java_teacher = t.teacher_id;
#非等值查询
select s.*,teacher_name
#from后只跟一个表名
from student_table s
#join连接另一个表
join teacher_table t
#使用on子句指定连接条件
on s.java_teacher<t.teacher_id;

(5)左、右、全外连接

  这三种外连接分别使用left[outer]join、right[outer]join和full[outer]join,这三种外连接的连接条件一样通过on子句来指定,既可以是等值连接条件,也可以是非等值连接条件。

右外连接,条件是非等值连接:把右边表中所有不满足条件的记录全部列出;

select s.*,teacher_name
#from后只有一个表名
from student_table s
#right join 右外连接另一个表
right join teacher_table t
#使用on来指定连接条件,使用非等值连接
on s.java_teacher<t.teacher_id;

左外连接,条件是非等值连接:把左边表中所有不满足条件的记录全部列出;

select s.*,teacher_name
#from后只有一个表名
from student_table s
#left join 右外连接另一个表
left join teacher_table t
#使用on来指定连接条件,使用非等值连接
on s.java_teacher>t.teacher_id;

全外连接,条件是等值连接:把两个表中所有不满足连接条件的记录全部列出;

select s.*,teacher_name
#from后只有一个表名
from student_table s
#full join 右外连接另一个表
full join teacher_table t
#使用on来指定连接条件,使用非等值连接
on s.java_teacher=t.teacher_id;

SQL的多表连接查询的更多相关文章

  1. SQL语句多表连接查询语法

    一.外连接 1.左连接  left join 或 left outer join SQL语句:select * from student left join score on student.Num= ...

  2. SQL多表连接查询(详细实例)

    转载博客:joeleo博客(http://www.xker.com/page/e2012/0708/117368.html) 本文主要列举两张和三张表来讲述多表连接查询. 新建两张表: 表1:stud ...

  3. SQL多表连接查询

    SQL多表连接查询 本文主要列举两张和三张表来讲述多表连接查询. 新建两张表: 表1:student  截图如下: 表2:course  截图如下: (此时这样建表只是为了演示连接SQL语句,当然实际 ...

  4. oracle(sql)基础篇系列(二)——多表连接查询、子查询、视图

        多表连接查询 内连接(inner join) 目的:将多张表中能通过链接谓词或者链接运算符连接起来的数据查询出来. 等值连接(join...on(...=...)) --选出雇员的名字和雇员所 ...

  5. SQL表连接查询(inner join、full join、left join、right join)

    SQL表连接查询(inner join.full join.left join.right join) 前提条件:假设有两个表,一个是学生表,一个是学生成绩表. 表的数据有: 一.内连接-inner ...

  6. SQL表连接查询

    SQL表连接查询(inner join.full join.left join.right join) 表的数据有: 一.内连接-inner jion : 最常见的连接查询可能是这样,查出学生的名字和 ...

  7. SQL多表连接查询(详细实例)(转)

    http://www.xker.com/page/e2012/0708/117368.html select * from student,course where student.ID=course ...

  8. SQL多表连接查询(具体实例)

    本文主要列举两张和三张表来讲述多表连接查询. 新建两张表: 表1:student  截图例如以下: 表2:course  截图例如以下: (此时这样建表仅仅是为了演示连接SQL语句.当然实际开发中我们 ...

  9. oracle(sql)基础篇系列(二)——多表连接查询、子查询、视图

    多表连接查询 内连接(inner join) 目的:将多张表中能通过链接谓词或者链接运算符连接起来的数据查询出来. 等值连接(join...on(...=...)) --选出雇员的名字和雇员所在的部门 ...

随机推荐

  1. oracle中函数和存储过程的区别和联系【转载竹沥半夏】

    oracle中函数和存储过程的区别和联系[转载竹沥半夏] 在oracle中,函数和存储过程是经常使用到的,他们的语法中有很多相似的地方,但也有自己的特点.刚学完函数和存储过程,下面来和大家分享一下自己 ...

  2. 添加APNS通知

    1.进入苹果开发者官网developer.apple.com,点击member center,进入登录界面. 2.输入你的开发者账号和密码,登录后会跳转到“Select your team”这个界面. ...

  3. postgresql查询的处理过程

    本文简单描述了Postgresql服务器接收到查询后到返回给客户端结果之间一般操作顺序,总的流程图如下: 第一步: 客户端程序可以是任何符合 PostgreSQL 协议规范的程序,如 JDBC 驱动. ...

  4. 解决Windows下网络原因Composer安装失败问题

    由于Composer镜像都在国外,所以直接在官网下载Windows Installer后安装很多情况下是无法成功安装的. 解决办法: 1,将php添加到系统环境变量,并开启openssl扩展. 2,点 ...

  5. NOI 05:最高的分数描述

    描述 孙老师讲授的<计算概论>这门课期中考试刚刚结束,他想知道考试中取得的最高分数.因为人数比较多,他觉得这件事情交给计算机来做比较方便.你能帮孙老师解决这个问题吗? 输入输入两行,第一行 ...

  6. 关于git自己所学到的东西

    1.什么是Git(傻瓜内容跟踪器)      Git是一款免费.开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目 Git 是 Linus Torvalds (Linus在1991年创建了 ...

  7. Excel 导入 导出 Microsoft

    导出: private void exportExcel() { if (saveFileDialog1.ShowDialog() == DialogResult.OK) { Application. ...

  8. 索尼Sony ATI显卡驱动 Win7 Win8 Win8.1 视频黑屏 解决方法

    索尼ATI显卡驱动 Win7  Win8  Win8.1 视频 黑屏 完美解决方法: 下载这个补丁 安装 即可 解决  ! baidu pan:  http://pan.baidu.com/s/1gd ...

  9. SVN提交时响应很慢,我是这样解决的。

    现象:使用TortoiseSVN提交文件时,弹出提交窗口,要等待30秒的样子,才开始工作,开始提交文件后速度还是很快的. 解决后提交文件几乎是秒杀. 解决办法 (我的电脑可以了,但还是有些同事的电脑没 ...

  10. window10 安装SVN 提示权限问题

     http://www.yishimei.cn/network/551.html 经常在网上看到有同学反映,他们在控制面板里卸载软件的时候,总是会出现2502.2503错误代码的问题,并且这个问题大多 ...