表连接查询(2-n)
一 概述
1 背景
理论上将全部数据放到同一张表中很难实现,实际上即使实现了,表也很庞大,很冗杂,不便于查询与维护,因此将不同的数据存放到不同的表中,需要时连接各表进行查询。
2 执行过程
两张表进行连接查询时,将其中一张表中的每一行数据与另外一张表的全部数据进行对比,如果满足给定的条件,则将这两行数据合并为一行,否则舍弃,继续对比剩余行。
3 笛卡尔现象
如果表连接时未设置连接条件,那么返回的查询结果数目是两个表行数的乘积,这种现象被叫做笛卡尔现象。
二 表连接查询的几种方式
1.内连接
两张表进行连接查询,如果只显示匹配数据,那么采用内连接的方式。
格式:
select t1.columnName01,t2.columnName02 from tbName01 t1(inner)join tbName02 t2 on 连接条件;
为了指明字段所属的表,为每一张参与连接的表指定别名,通过别名调用其中的字段。
2.外连接
外连接将连接指向的一张表中的数据全部返回,另一种表对应字段无匹配数据时用null填充。
格式:
select t1.columnName01,t2.columnName02 from tbName01 t1 right/left (outer) join tbName02 t2 on 连接条件;
在外连接中使用left,左边表的数据被全部取出;使用right,右边表的数据被全部取出。
三 n>=3张表的连接查询
一张表A与多张表连接查询,表A与其他表分别进行连接查询,最终的结果是各个独立连接查询结果中相同A表字段数据的组合,即将某一个连接查询结果中某一行A表全部字段取出,如果其他连接查询结果都具有该A字段,则所有具有该字段的行合并为一行。
下面以多对多关联关系进行演示。
学生表tb_student:

课程表tb_course:

中间表tb_mid(采用联合主键,每个主键字段又是一个外键字段,分别指向对应的学生表或者课程表的主键):

任务:查询学生“李四”所选的全部课程。
分析:学生表与课程表之间没有直接关系,而学生表与中间表、课程表与中间表都有关系,因此采用中间表作为主表,分别与学生表、课程表进行连接查询。
中间表与学生表连接查询,将查询结果记作A表:
select s.id,s.name,m.course_id,m.student_id from tb_student s join tb_mid m on s.id=m.student_id;

中间表与课程表连接查询,将查询结果记作B表:
select c.id,c.name,m.course_id,m.student_id from tb_course c join tb_mid m on c.id =m.course_id;

从A表中的某一行取出主表(tb_mid)的全部数据,与B表的所有行进行对比,如果主表对应字段值相同,则合并为一行,以此循环,就形成了3张表连接查询的结果:

以上就是如下3张表连接查询的执行过程:
select s.id sid,s.name sname,c.id cid ,c.name cname,m.student_id,m.course_id
from
tb_mid m join tb_student s on m.student_id =s.id
join tb_course c on m.course_id=c.id;
在3张表连接查询结果中添加一个过滤条件“where s.name='李四'”就获得了最终结果。
表连接查询(2-n)的更多相关文章
- 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(...=...)) --选出雇员的名字和雇员所 ...
- Access数据库多表连接查询
第一次在Access中写多表查询,就按照MS数据库中的写法,结果报语法错,原来Access的多表连接查询是不一样的 表A.B.C,A关联B,B关联C,均用ID键关联 一般写法:select * fro ...
- PostgreSQL-join多表连接查询和子查询
一.多表连接查询 1.连接方式概览 [inner] join 内连接:表A和表B以元组为单位做一个笛卡尔积,记为表C,然后在C中挑选出满足符合on 语句后边的限制条件的内容. left [outer] ...
- SQL表连接查询(inner join、full join、left join、right join)
SQL表连接查询(inner join.full join.left join.right join) 前提条件:假设有两个表,一个是学生表,一个是学生成绩表. 表的数据有: 一.内连接-inner ...
- SQL的多表连接查询
SQL的多表连接查询 多表连接查询具有两种规范,SQL92和SQL99规范. SQL92规范支持下列多表连接查询: (1)等值连接: (2)非等值连接: (3)外连接: (4)广义笛卡尔积: SQL9 ...
- hibernate 实现多表连接查询(转载)
http://www.cnblogs.com/lihuiyy/archive/2013/03/28/2987531.html 为了方便,直接粘过来,方便查看.不收藏了 Hibernate主要支持两种查 ...
- django ORM model filter 条件过滤,及多表连接查询、反向查询,某字段的distinct
版权归作者所有,任何形式转载请联系作者.作者:petanne(来自豆瓣)来源:https://www.douban.com/note/301166150/ 1.多表连接查询:感觉django太NX了. ...
- IBatis.Net 表连接查询(五)
IBatis.Net之多表查询: 一.定制实际对应类的方式 首先配置多表的测试数据库,IBatis.Net之Oracle表连接查询配置: 首先新建两张表如下: 为两张表建立外键: ALTER TABL ...
随机推荐
- JAVA并发编程实战---第三章:对象的共享
在没有同步的情况下,编译器.处理器以及运行时等都可能对操作的执行顺序进行一些意想不到的调整.在缺乏足够同步的多线程程序中,要对内存操作的执行顺序进行判断几乎无法得到正确的结果. 非原子的64位操作 当 ...
- 自定义ScriptableObject属性显示
自定义ScriptableObject属性显示的三种方式 1. 继承Editor,重写OnInspectorGUI方法 Editor官方文档 需求 将TestClass中intData属性和strin ...
- LeetCode---------Add Two Numbers 解法
You are given two non-empty linked lists representing two non-negative integers. The digits are stor ...
- xcode实用快捷键
command + R 快速编译并运行项目 command + . 停止正在运行的项目 command + shift + O 快速打开xcode文件搜索功能 command + 0 关闭左边的侧边栏 ...
- Homebrew安装和使用
## homebrew使用1. 安装 `$ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/m ...
- 基于HTML5 Canvas实现用户交互
很多人都有这样的疑问,基于HTML5 Canvas实现的元素怎么和用户进行交互?在这里我们用到HT for Web(http://www.hightopo.com/guide/guide/core/b ...
- java中几种获取项目路径方式
转自http://caodaoxi.iteye.com/blog/1234805 在jsp和class文件中调用的相对路径不同. 在jsp里,根目录是WebRoot 在class文件中,根目录 ...
- 【Netty】ChannelHandler和codec
一.前言 前面学习了Netty的codec框架,下面接着学习ChannelHandler与codec之间的关联. 二.ChannelHandler和codec Netty为不同的协议提供了处理器和编解 ...
- 当react框架遇上百度地图
百度地图官方文档的使用指导是这样说的:在页面中引入<script type="text/javascript" src="http://api.map.baid ...
- C#码农的大数据之路 - 使用Ambari自动化安装HDP2.6(基于Ubuntu16.04)并运行.NET Core编写的MR作业
准备主机 准备3台主机,名称作用如下: 昵称 Fully Qualified Domain Name IP 作用 Ubuntu-Parrot head1.parrot 192.168.9.126 Am ...