SQL的多表连接查询
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的多表连接查询的更多相关文章
- SQL语句多表连接查询语法
一.外连接 1.左连接 left join 或 left outer join SQL语句:select * from student left join score on student.Num= ...
- SQL多表连接查询(详细实例)
转载博客:joeleo博客(http://www.xker.com/page/e2012/0708/117368.html) 本文主要列举两张和三张表来讲述多表连接查询. 新建两张表: 表1:stud ...
- SQL多表连接查询
SQL多表连接查询 本文主要列举两张和三张表来讲述多表连接查询. 新建两张表: 表1:student 截图如下: 表2:course 截图如下: (此时这样建表只是为了演示连接SQL语句,当然实际 ...
- oracle(sql)基础篇系列(二)——多表连接查询、子查询、视图
多表连接查询 内连接(inner join) 目的:将多张表中能通过链接谓词或者链接运算符连接起来的数据查询出来. 等值连接(join...on(...=...)) --选出雇员的名字和雇员所 ...
- SQL表连接查询(inner join、full join、left join、right join)
SQL表连接查询(inner join.full join.left join.right join) 前提条件:假设有两个表,一个是学生表,一个是学生成绩表. 表的数据有: 一.内连接-inner ...
- SQL表连接查询
SQL表连接查询(inner join.full join.left join.right join) 表的数据有: 一.内连接-inner jion : 最常见的连接查询可能是这样,查出学生的名字和 ...
- SQL多表连接查询(详细实例)(转)
http://www.xker.com/page/e2012/0708/117368.html select * from student,course where student.ID=course ...
- SQL多表连接查询(具体实例)
本文主要列举两张和三张表来讲述多表连接查询. 新建两张表: 表1:student 截图例如以下: 表2:course 截图例如以下: (此时这样建表仅仅是为了演示连接SQL语句.当然实际开发中我们 ...
- oracle(sql)基础篇系列(二)——多表连接查询、子查询、视图
多表连接查询 内连接(inner join) 目的:将多张表中能通过链接谓词或者链接运算符连接起来的数据查询出来. 等值连接(join...on(...=...)) --选出雇员的名字和雇员所在的部门 ...
随机推荐
- CLion 2016.2.2 注册激活码
43B4A73YYJ-eyJsaWNlbnNlSWQiOiI0M0I0QTczWVlKIiwibGljZW5zZWVOYW1lIjoibGFuIHl1IiwiYXNzaWduZWVOYW1lIjoiI ...
- utils.js
/** * //2.0检测方式(目测,测量,专用仪器测试等) function GetCheckType() { $.ajax({ url: '@Url.Action("GetCheckTy ...
- LeetCode Find All Anagrams in a String
原题链接在这里:https://leetcode.com/problems/find-all-anagrams-in-a-string/ 题目: Given a string s and a non- ...
- Android 基于Android的手机邮件收发(JavaMail)之三(邮件接收)
初次做这个程序的时候,是仿照着网上别人的程序做的.因为本人比较菜,是一个新手,以前的基础知识没有学好,所以尽管有了别人的代码但是还是不知道怎么在界面上显示出它的效果来,废话不多少,现在就贴出我的参考程 ...
- win8.1 Framework3.5安装不上的问题
问题症状:安装的WIN8系统无法安装Framework,SQL等都有问题 解决误区:直接安装或者更新后在线安装(结果一样各种错误) 解决方法: 1.先gpedit.msc进入本地组策略管理,目录:计算 ...
- 用canvas画环形圆形图片
效果如图自动绘制不停歇 代码如下 var canvas = document.getElementById('myCanvas'),width = canvas.width,height = canv ...
- py2exe使用方法
一.简介 py2exe是一个将python脚本转换成windows上的可独立执行的可执行程序(*.exe)的工具,这样,你就可以不用装python而在windows系统上运行这个可执行程序. py2e ...
- asp.net XMLHttpRequest 进度条以及lengthComputable always false的解决办法
一直用ajax好长时间了,对其原理也有一些了解,最近由于项目需要,使用ajax异步进度条的效果,就研究了一下,用原生的XMLHttpRequest实现进度条函数,XMLHttpRequest有以下函数 ...
- 常用oracle表空间查询语句
--查询数据库表空间使用情况 select a.tablespace_name,a.bytes/1024/1024 "Sum MB",(a.bytes-b.bytes)/1024/ ...
- 安卓手机APP压力monkey测试
一.Monkey概述 Monkey是Android中的一个命令行工具,可以运行在模拟器里或实际设备中.它向系统发送伪随机的用户事件流(如按键输入.触摸屏输入.手势输入等),实现对正在开发的应用程序进行 ...