orcale 之 多表查询
笛卡儿积

如上图所示对于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 之 多表查询的更多相关文章
- django(3) 一对多跨表查询、ajax、多对多
1.一对多跨表查询获取数据的三种形式:对象.字典.元组 例:有host与business两张表,host与business的id字段关联,business在host表中的对象名是b, 通过查询hos ...
- Mysql常用表操作 | 单表查询
160905 常用表操作 1. mysql -u root -p 回车 输入密码 2. 显示数据库列表 show databases 3. 进入某数据库 use database data ...
- Oracle_多表查询
SQL多表查询 等值和不等值连接查询 从多个表中获取数据:如果在查询的时候,直接从多个表中获取数据.没有添加条件判断,会出现"笛卡尔积"错误 笛卡尔积错误 笛卡尔集会在下面条件下产 ...
- mysql,SQL标准,多表查询中内连接,外连接,自然连接等详解之查询结果集的笛卡尔积的演化
先附上数据. CREATE TABLE `course` ( `cno` ) NOT NULL, `cname` ) CHARACTER SET utf8 NOT NULL, `ctime` ) NO ...
- MyBatis实现关联表查询
一.一对一关联 1.1.提出需求 根据班级id查询班级信息(带老师的信息) 1.2.创建表和数据 创建一张教师表和班级表,这里我们假设一个老师只负责教一个班,那么老师和班级之间的关系就是一种一对一的关 ...
- MyBatis学习总结(五)——实现关联表查询(转载)
本文转载自:http://www.cnblogs.com/jpf-java/p/6013516.html 一.一对一关联 1.1.提出需求 根据班级id查询班级信息(带老师的信息) 1.2.创建表和数 ...
- sql多表查询时怎么获取查到的字段
首先,多表查询不能用hql(貌似hql就是不支持多表查询,如果可以,希望看到的朋友给个例子) List list = systemService.findListbySql("SELECT ...
- MyBatis入门学习教程-实现关联表查询
一.一对一关联 1.1.提出需求 根据班级id查询班级信息(带老师的信息) 1.2.创建表和数据 创建一张教师表和班级表,这里我们假设一个老师只负责教一个班,那么老师和班级之间的关系就是一种一对一的关 ...
- 【T-SQL基础】01.单表查询-几道sql查询题
概述: 本系列[T-SQL基础]主要是针对T-SQL基础的总结. [T-SQL基础]01.单表查询-几道sql查询题 [T-SQL基础]02.联接查询 [T-SQL基础]03.子查询 [T-SQL基础 ...
随机推荐
- getField
model.getField(field, num) field {String} 字段名,多个字段用逗号隔开 num {Boolean | Number} 需要的条数 return {Promise ...
- ibatis源码学习1_整体设计和核心流程
背景介绍ibatis实现之前,先来看一段jdbc代码: Class.forName("com.mysql.jdbc.Driver"); String url = "jdb ...
- MongoDB默认配置
mongodb使用了yaml格式定义的配置文件(http://www.yaml.org/) 默认为: # mongod.conf #where to log logpath=/var/log/mong ...
- Linq to Entities基础之需要熟知14个linq关键字(from,where,select,group,let,on,by...)
1.Linq基础 <1> 关键词: from,in,group,by,where..... MSDN上总结的有14个关键词法... from xxxx in xxxx select =&g ...
- java-03 变量与运算符
1.java中的变量与常量 1.1 变量的定义: 变量,顾名思义就是会变的量,这种思想来源于数学,指的是一个不确定的量或者随时会改变的量. 在我们进行编程的过程中,有一些东西是会随着实际情况而发生变化 ...
- 一些参考网站 - Reference Documentation - Website Address
Reference Documentation - Website Address MSDN Visual Studio 2015官方文档 https://msdn.microsoft.com/zh- ...
- T-SQL逻辑查询
理解T-SQL的逻辑查询顺序是学习SQL Server的基础. T-SQL逻辑执行顺序 (8) SELECT (9) DISTINCT (11) <TOP_specification> ...
- C# 读Autofac源码笔记(2)
刚看了下Autofac属性注入的源码 首先看看WithProperty方法 image.png Autofac将我们的属性值,存在了一个list集合中 image.png 然后将这个集合传递到 ...
- 【RabbitMQ学习记录】- 消息队列存储机制源码分析
本文来自 网易云社区 . RabbitMQ在金融系统,OpenStack内部组件通信和通信领域应用广泛,它部署简单,管理界面内容丰富使用十分方便.笔者最近在研究RabbitMQ部署运维和代码架构,本篇 ...
- Linux系统忘记管理员密码(CentOS、RHEL、Ubuntu)
Linux系统忘记管理员密码(CentOS.RHEL.Ubuntu) 系统使用过程中,尤其是生产环境中.万一忘记管理员密码,该怎么办?是不是很绝望? 1.RHEL 7.0 重启主机进入引导界面键入e键 ...