表连接查询(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 ...
随机推荐
- Springboot(一):入门篇
什么是spring boot spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员 ...
- arm处理器
arm处理器 arm处理器相关 1.体系架构定义了指令集(ISA)和基于这一体系结构下处理器的编程模型. arm卖的是架构或者已经设计好的公版ip核 卖给苹果高通的是架构,需要苹果高通通过架构设计自己 ...
- 几张图带你轻轻松松了解小程序和APP的区别
微信"小程序"的公测一开放,立即在朋友圈刷屏无数,仿佛人人都在互联网圈.但是因为微信限制,程序还不能发布使用,所以也极少人看到真正的小程序是怎么样的. 小程序驿站专注微信小程序的开 ...
- javaWeb学习总结(8)- JSP基础语法(2)
任何语言都有自己的语法,JAVA中有,JSP虽然是在JAVA上的一种应用,但是依然有其自己扩充的语法,而且在JSP中,所有的JAVA语句都可以使用. 一.JSP模版元素 JSP页面中的HTML内容称之 ...
- HTML5&CSS3读书笔记
Hi All, 分享一下我学HTML5 摘抄的读书笔记(我用的还是英文,因为一些新的东西还是来自于欧美国家,希望大家习惯于看一些英文材料): 1. Difference between Section ...
- List在执行remove方法不能删除指定的对象
我们根据List中的源码分析, remove方法的原理: public boolean remove(Object o){ if(o ==null) { for(inti ...
- (原创)foef注意事项
原创内容,转载请标明原文地址 我们先来看下下面的代码 //获取文件大小 DWORD Get_File_Size(const char* m_FilePath) { unsigned long size ...
- javascript基础-闭包
原理 函数里包含函数,即闭包. 包含函数的结果是,子函数会挟持父函数的活动对象.子函数在访问一个变量时,先读自身的活动对象,是否包含此变量,没有从父函数里找,还没有,去祖函数,层层回溯,直到windo ...
- Heartbeat高可用解决方案
Heartbeat高可用 Heartbeat作用: 通过heartbeat,可以将资源(ip以及程序服务等资源)从一台已经故障的计算机快速转移到另一台正常运转的机器上继续提供服务,一般称之为高可用服务 ...
- 读《深入理解Java虚拟机》
Java虚拟机运行时数据区 对象的创建 Java创建对象,在语言层面上使用new关键字.虚拟机遇到new关键字时,会检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的 ...