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

笛卡儿积

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

  如上图所示对于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. Java中的http(网络处理)相关的库:HttpClient,HttpCore(转载)

    [背景] 最近和之前,折腾了这个: [教程]模拟登陆百度之Java代码版 然后,对于Java的HttpClient,有了点了解. 现在整理如下: Java本身没有Http相关的库 Java本身,没有内 ...

  2. Javascript基础编程の面向对象编程

    javascript是解释型的语言,在编译时和运行时之间没有明显区别,因此需要更动态的方法.javascript没有正式的类的概念,我们可以使用在运行时创建新的对象类型来替代,并且可以随时更改已有对象 ...

  3. pagecontrol

    PageControl组件位于组件板的Win32页中,该组件用于 实现窗体上多页面技术,每个页面上均能添加若干控件.程序运行时,单击页面标签就可以在多页之间切换.1.建立多页 用鼠标右键单击PageC ...

  4. 打开页面默认弹出软键盘,同时兼容iOS和Android

    // 示例1 open_soft_keyboard({ input: "#username" }); // 示例2 open_soft_keyboard({ input: 'inp ...

  5. sql获取表的所有字段及属性

    select c.name as name,t.name as type ,convert(bit,c.IsNullable) as isNULL , from sysobjects where xt ...

  6. 比特币解锁脚本中的ScriptSignature都包含了什么东西

    比特币 解锁脚本signature script 包含了那些东西? 使用 UTXO 需要私钥签名,私钥到底都签了什么东西呢?一直比较好奇. 比特币的私钥签名总共有五中类型,具体见 btcd 代码,如下 ...

  7. 牛客网提高组模拟赛第五场 T1同余方程(异或)(位运算)

    区间不好做,但是我们可以转化成前缀来做.转化为前缀之后之后就是二维前缀和. 但是我还是不怎么会做.所以只能去看吉老师的题解 (确定写的那么简单真的是题解???). 我们要求模一个数余0,就等于找它的倍 ...

  8. leetcode 19. 删除链表的倒数第N个节点 JAVA

    题目: 给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点. 示例: 给定一个链表: 1->2->3->4->5, 和 n = 2. 当删除了倒数第二个节点后,链 ...

  9. Android学习之 adb被占用解决办法

    1.adb被占用解决办法 方法一:(1)查看5037端口哪个进程在用          netstat -a -o 5037 (2)查看上面进程是哪个执行文件在占用          tasklist ...

  10. StratifiedShuffleSplit()函数 实现对数据集的划分

    sklearn.model_selection.StratifiedShuffleSplit(n_splits=10, test_size=’default’, train_size=None, ra ...