在以往的工作中我们不可能单一的从一张表中查询数据,而在开始设计数据库的时候,我们会把一些数据存放在不同的数据表中,因此往往需要从多个数据表中获取到我们想要的数据。

笛卡儿积

  在学习这些之前我们先了解一个重要的概念---笛卡儿积。笛卡儿积就是由基表的每一行与另一个基表的每一行链接在一起所生成的表,查询结果的行数就是两个基表行数的积。
                                    

  如上图所示对于orcale 中 emp 表中的数据和 dept 表中的数据(只列举了一部分)取笛卡儿积。一共生成了四组数据,这四组数据就叫笛卡儿积全集,为了避免笛卡儿积全集,我们可以使用 where 子句进行过滤,如图上所示在这四组数据中只有一组符合我们的要求。

  总结以上提到的:

  1. 笛卡儿积就是两个表的列数相加,行数相乘。

  2. 为了避免笛卡儿积可以使用 n - 1 个条件进行过滤(n代表表的个数)。

内连接

  内连接是一种常见的的多表查询,一般使用 inner join, 平时在使用的时候可以省略 inner 关键字。内连接组合两张表,并且基于他们的关联关系来连接它们。在使用内连接的时候需要指定表中的哪些字段组成关联关系,并且要说明基于什么的条件进行关联,它的语句如下:

INNER JOIN table_name ON condition

  以上中 table_name是表名, condition则为进行连接时的条件。下面的语句是将 emp (员工)表和 dept(部门) 表根据部门的编号进行连接:

select * from emp
join dept on emp.deptno = dept.deptno;

  在这个SQL 语句中首先要列出组成所有结果集所需的列名,而后在FROM关键字中指定所需要的表命,在INNER JOIN 关键字后列出要被连接的表名,而在ON后添加了进行连接的条件。需要注意的是在以后的工作和学习中我们不单单是连接两张表,很有可能是多张表呦。

外连接

  外部连接和内部链接十分的相识主要是为了处理空值的匹配问题。外部链接的语法和内链接的语法几乎一样,主要区别就是对空值的处理。外部链接不需要两个表具有匹配的记录,这样可以指定某一个表作为基表总是放到结果集中,外部链接分为左外连接(LEFT OUTER JOIN),右外链接(RIGHT OUTER JOIN),全外链接(FULLOUTER JOIN)。

  以上三者的共同点都是返回符合条件的数据,不同点有以下几点:

    1. 左外链接会返回左表中不符合链接条件的数据

    2. 右外连接会返回右表中不符合链接条件的数据

    3. 全外连接会返回左表中不符合连接条件的数据和右表中符合连接条件查询的数据。

  左外连接,即主表在左侧,字段全部显示,副表 null 补充对其。+号在右侧(副表)

select * from A,B where A.id = B.id(+)

  右外连接,即主表在右侧,字段全部显示,副表 null 补充对其。+号在左侧(副表)

select * from A,B where A.id(+) = B.id

  如查询部门的部门号,部门名称,以及部门的人数:

select d.deptno,d.dname,count(e.empno)
from emp e,dept d
where e.deptno(+)=d.deptno
group by d.deptno, d.dname;
-------------------------------------------------------
select d.deptno,d.dname,count(e.empno)
from emp e right outer join dept d
on e.deptno=d.deptno
group by d.deptno, d.dname;

自连接

  自连接顾名思义:自己和自己链接,其实理解起来很简单,我们在使用表的时候给表起个别名,这样我们就相当于有两个表啦。

  我们直接看一个例子:

  查看员工的姓名和员工领导的姓名:

select e.ename 员工姓名, b.ename 老板姓名
from emp e inner join emp b
on e.mgr=b.empno;
---------------------------------------------------------
select e.ename 员工姓名, b.ename 老板姓名
from emp e, emp b
where e.mgr=b.empno;

orcale 之 多表查询的更多相关文章

  1. django(3) 一对多跨表查询、ajax、多对多

    1.一对多跨表查询获取数据的三种形式:对象.字典.元组 例:有host与business两张表,host与business的id字段关联,business在host表中的对象名是b,  通过查询hos ...

  2. Mysql常用表操作 | 单表查询

    160905 常用表操作 1. mysql -u root -p 回车 输入密码   2. 显示数据库列表 show databases     3. 进入某数据库 use database data ...

  3. Oracle_多表查询

    SQL多表查询 等值和不等值连接查询 从多个表中获取数据:如果在查询的时候,直接从多个表中获取数据.没有添加条件判断,会出现"笛卡尔积"错误 笛卡尔积错误 笛卡尔集会在下面条件下产 ...

  4. mysql,SQL标准,多表查询中内连接,外连接,自然连接等详解之查询结果集的笛卡尔积的演化

    先附上数据. CREATE TABLE `course` ( `cno` ) NOT NULL, `cname` ) CHARACTER SET utf8 NOT NULL, `ctime` ) NO ...

  5. MyBatis实现关联表查询

    一.一对一关联 1.1.提出需求 根据班级id查询班级信息(带老师的信息) 1.2.创建表和数据 创建一张教师表和班级表,这里我们假设一个老师只负责教一个班,那么老师和班级之间的关系就是一种一对一的关 ...

  6. MyBatis学习总结(五)——实现关联表查询(转载)

    本文转载自:http://www.cnblogs.com/jpf-java/p/6013516.html 一.一对一关联 1.1.提出需求 根据班级id查询班级信息(带老师的信息) 1.2.创建表和数 ...

  7. sql多表查询时怎么获取查到的字段

    首先,多表查询不能用hql(貌似hql就是不支持多表查询,如果可以,希望看到的朋友给个例子) List list = systemService.findListbySql("SELECT ...

  8. MyBatis入门学习教程-实现关联表查询

    一.一对一关联 1.1.提出需求 根据班级id查询班级信息(带老师的信息) 1.2.创建表和数据 创建一张教师表和班级表,这里我们假设一个老师只负责教一个班,那么老师和班级之间的关系就是一种一对一的关 ...

  9. 【T-SQL基础】01.单表查询-几道sql查询题

    概述: 本系列[T-SQL基础]主要是针对T-SQL基础的总结. [T-SQL基础]01.单表查询-几道sql查询题 [T-SQL基础]02.联接查询 [T-SQL基础]03.子查询 [T-SQL基础 ...

随机推荐

  1. VS 和Visual Assist X快捷键(转)

    Visual Assist X 最有用的快捷键 1.Alt + G: 在定义与声明之间互跳. 2.Alt + O: 在.h与.cpp之间互跳.(O是字母O,不是数字零) 3.Alt + Shift + ...

  2. Android-SDCard外部存储文件读写

    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses ...

  3. IO--RAID

    RAID IO计算 Raid 0 –每个磁盘的I/O计算= (读+写) /磁盘个数 Raid 1 --每个磁盘的I/O计算= [读+(2*写)]/2 Raid 5 --每个磁盘的I/O计算= [读+( ...

  4. Djangorestframework编写post接口

    前提:已经有Django环境 一.安装 pip install djangorestframework 二.编写视图 import json from django.shortcuts import ...

  5. Maven项目编译时报错缺少tools.jar

    [ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:2.3.2:compile (default ...

  6. alicemq 方便的RabbitMQ 可视化工具

    尽管RabbitMQ 自带一个管理插件,但是还不是那么强大,alicemq 是一个方便强大的可视化工具 rabbitmq 环境准备 docker-compose 文件 version: "3 ...

  7. kali linux之Msf-exploit模块,生成payload

    Exploit模块 Active exploit(主动地向目标机器发送payload并执行,使目标交出shell(反连等)) msf5 > use exploit/windows/smb/pse ...

  8. ios 字符串处理:截取字符串、匹配字符串、分隔字符串

    1.截取字符串 NSString*string =@"sdfsfsfsAdfsdf";string = [string substringToIndex:7];//截取掉下标7之后 ...

  9. Objective-C中的meta-class

    讨论Objective-C的一个奇怪的概念 meta-class 在Objective-C中的每个类,都有它自己相关的meta-class,但因为你很少直接使用meta-class,所以显得很神秘.  ...

  10. js中的substr和substring区别

    js中的substr和substring区别 Substring: 该方法可以有一个参数也可以有两个参数. (1)  一个参数: 示例: var str=“Olive”: str.substring( ...