Oracle数据库之多表查询一
上一篇给大家介绍了数据的单表查询,相信大家对于单表的查询应该都有了一些了解。单表查询在数据库中的使用会有一些,但并不是很多,但是作为初学者,我们需要学习单表查询的思路。今天呢,我们为大家介绍一下数据库中的多表查询,左查询和右查询。因为多表查询在实际项目中的应用还是比较广泛的。我们一定要掌握,掌握了多表查询对于后面的子查询、分组查询的学习就非常的简单了!
第一步:首先开启数据库监听服务:
1.Win + R ---> cmd --->输入lsnrctl start --->显示如下图,则开启成功!开启监听服务使用的命令是:lsnrctl start
第二步:然后在开启数据库的主服务orcl,使用的命令是:net start oracleserviceorcl
我们使用自己提前造好的测试数据进行本篇文章的详解。接着往下看。
我们创建一个t_student表和一个t_score表。
通过sql语句查看两张表中的信息,如下:
select * from t_student;
select * from t_score;
t_student表:
t_score表:
需求1:如果我想查询张山的数学成绩,应该怎么办呢?很显然张山和成绩并不在一个表中,他们分别在不同的表中,所以,我们需要将两张表结合看。我们通过上面的截图可以狠清晰的发现t_student表和t_score表是通过主键ID关联的,所以我们可以通过主键ID来把两张表进行关联,在查询我们想要的结果。在做这个操作之前呢?我们先来看一个概念:笛卡尔积。
笛卡尔是一个叫法而已,源于数学家,笛卡尔。之所以这么叫是因为,在数据库中在进行多张表直接关联的时间会产生笛卡尔积,那么我们具体来看一下什么情况下会产生笛卡尔积呢?
需求2:我们继续需求1讨论,现在我想通过一条sql语句把学生表和成绩表关联起来,如果不知道笛卡尔积的可能会出现下面的情况:
select * from t_student,t_score; #查询学生表和成绩表
查询结果:
通过上面的图,可以狠清楚的看见产生了12条数据,这12条数据的由来是怎么样的呢?因为我们是4个学生,但是只有三个学生有对应的各科成绩,所以最后执行select * from s_student,t_score;语句时,会产生 4*3 =12条数据,这种现象在数据中就是产生了笛卡尔积了,很显然这个结果并不是我们想要的,因为我们只要看每一位学生,对应的成绩。那么如何去掉笛卡尔积,只显示我们想要的数据呢?继续往下看。
select * from t_student t1,t_score t2 where t1.id=t2.id;
我们运行上面这条sql语句会发现,下面的查询结果是我们真正想要的。查看结果如下:
对于上面的sql语句,我们来解析一下:
select * from t_student t1,t_score t2 where t1.id=t2.id; #t1 t2 是表的别名
#t1.id = t2.id 是通过主键将t_student表和t_score表进行关联,筛选我们要找的数据,剔除不符合的数据。
# * 代表查找的所有结果
当然,除了上面的这种写法,还有一个比较变态的写法,这种写法对比第一种写法在展示上面不是那么容易理解,但是这里面小编也为大家介绍一下,因为多了解一些总是没错的。来,我们看一下另外一种sql的语法格式,我们还是以上面的例子为基础给大家演示:
select * from t_student t1 inner join t_student t2 on t1.id=t2.id; #语法解析:
------>inner join 是链接另一个表的命令
------> on 后面跟的是两个表之间通过什么关联在一起的 很显然我们使用的是id进行关联的
同样的查询的结果也是和上面的一样的,我们截图来看下:
所以,通过上面的例子,我们应该知道一点,在进行多张表关联的时候,一定要通过主键进行关联。不然的话无法有效链接,会产生笛卡尔积。如果表的数据有成百上千条,那估计产生的笛卡尔积会相当的庞大,所以,请小伙伴一定要注意哈!
我们知道了笛卡尔积以后呢,继续分享下一个知识点:左查询和右查询。来先看一下概念:
- 左查询:以左表的数据为准,将右表中不满足的数据过滤掉,其中left左边的为左边,右边的为右表。
- 右查询:以右边的数据为准,将左表中不满足的数据过滤掉,其中right右边的为右边,左边的为左边。
来看一下左链接的实例,查询的sql语句如下:
select * from t_student t1 left join t_score t2 on t1.id=t2.id; #sql解析:
-----left join 链接另一张表的sql命令 以left左边的表为主,将left右表中不满足的数据显示出来。
如果你知道了左查询,那么同样的,右查询就变得很easy了,好了,那me我们在看一下右查询的使用:
查询的右查询的sql语句如下:
select * from t_student t1 right join t_score t2 on t1.id=t2.id; #sql语句解析:
---right join 链接另一张表的sql命令 right代表的是right单词右表的为主表,将左边不符合条件的表筛选出来 ---on 是通过什么进行关联的 很显然我们是通过id进行关联的
我们查看一下查看的结果:
关于左查询和右查询的实例是不是很简单理解呢?OK,那么我们总结一下知识点吧!
- 1.多张表进行关联的时候,一定不要忘记要通过主键关联,不然会产生笛卡尔积
- 2.左查询:以left关键字左边的表为主,将left右边的表中不满足条件的数据过滤掉
- 3.右查询:以right关键字右表的表为主,将right左边的表中不满足条件的数据过滤掉
好了,关于多表查询、左查询、右查询方面的知识我们就介绍到这里了哈!!!
Oracle数据库之多表查询一的更多相关文章
- Oracle数据库之单表查询
接着上一篇的分享,今天主要给大家分享的是关于数据中的单表查询,单表查询很基础,也很重要,但是任何一个初学者必须要掌握的姿势,单表查询就是对单个表进行操作,查询我们想要的数据.单表查询里面的内容也是比较 ...
- Oracle数据库之七 多表查询
七.多表查询 对于查询在之前已经学过了简单查询.限定查询.查询排序,这些都属于 SQL 的标准语句,而上一章的单行函数,主要功能是为了弥补查询的不足. 而从多表查询开始就正式进入到了复杂查询部 ...
- oracle数据库之多表查询二
多表查询解题思路: 1.分析题目要查询的结果涉及到那几张表 2.将每张表建立关联条件,否则会产生笛卡尔积 3.分清楚查询的条件,然后使用and将条件链接 4.涉及到分组查询的需要使用聚合函数 5.分组 ...
- Oracle数据库--解决单张表中数据量巨大(大数据、数据量上百万级别,后查询,更新数据等耗时剧增)
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/QQ578473688/article/details/54561397 思路1:采用备份表 备份表中 ...
- PowerDesigner生成Oracle数据库时,表名会带引号问题
使用PowerDesigner生成数据库建表SQL脚本时,尤其是Oracle数据库时,表名一般会带引号.其实加引号是PL/SQL的规范,数据库会严格按照""中的名称建表,如果没有& ...
- oracle数据库误删的表以及表中记录的恢复
oracle数据库误删的表以及表中记录的恢复 一.表的恢复 对误删的表,只要没有使用PURGE永久删除选项,那么从flash back区恢复回来希望是挺大的.一般步骤有: --1.从flash bac ...
- oracle 数据库下所有表结构、数据量及缺失值统计
表结构 SELECT t1.TABLE_NAME, t1.COLUMN_NAME, t1.DATA_TYPE || '(' || t1.DATA_LENGTH || ')', t2.COMMENTS ...
- MySQL/MariaDB数据库的多表查询操作
MySQL/MariaDB数据库的多表查询操作 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.单表查询小试牛刀 [root@node105.yinzhengjie.org.cn ...
- Oracle数据库对象(表空间/同义词/序列/视图/索引)
数据库对象 Oracle数据库对象: 数据库对象是数据库的组成部分,常常用 CREATE 命令进行创建,可以使用 ALTER 命令修改,用 DROP 执行删除操作. 种类: (1)表空间:所有的数据对 ...
随机推荐
- C#进阶之路(五):Linq初识
关于LINQ的文章,网上有很多,所以这篇文章我主要是总结下我自己的学习心得. 首先需要先了解的相关技术 1.隐式类型.匿名类型.对象初始化器 1)隐式类型,使用var关键字创建,C#编译器会根据用于初 ...
- UML类图与类的关系详解【转】
在画类图的时候,理清类和类之间的关系是重点. 类的关系有泛化(Generalization).实现(Realization).依赖(Dependency)和关联(Association).其中关联又分 ...
- 试用 Eagle 9.1
试用 Eagle 9.1 有推挤功能 原理图可以设置组装变体. 输出的 CAM 可以自定义,没有 Protel 那么死板. 保存的文件是 xml 文件,可以自由解析.
- java中初始化方法
本文主要是讲从<java编程思想>中看到的东西,是第七章复用类的开头内容,主要是类初始化的几种方法的位置,主要包括 1.在定义对象的地方.这意味着他们总是在构造器被调用前被初始化. 2.在 ...
- Java-API:javax.servlet.http.HttpServletResponse
ylbtech-Java-API:javax.servlet.http.HttpServletResponse 1.返回顶部 1. javax.servlet.http Interface HttpS ...
- 找不到引用microsoft.office.core解决办法 via mrcjiong
在控制面板中,选择"添加删除程序",找到office ,选择"更改",在对话框中选择"添加删除功能",然后选择自定义安装,添加上office ...
- 反射+属性标签 通用Excel导入导
在做通用导入导出的时候,最关键的应该就是实体导出导入的顺序了,但是编译器在编译的时候又无法自定义属性编译的顺序,所以需要一个自定义的特性标签来指定实体类导出的顺序,然后通过自定义的比较器将属性排序 因 ...
- sea.js的模块化开发
为什么使用sea.js? Sea.js 追求简单.自然的代码书写和组织方式,具有以下核心特性: 简单友好的模块定义规范:Sea.js 遵循 CMD 规范,可以像Node.js 一般书写模块代码. 自然 ...
- 虚拟机VMware的安装以及指南
VMware是一个非常强大的虚拟软件,它的更新速度非常的快,随着软件的更新速度的加快,它的大小会越来越大,但是新的版本大多数会是给企业使用的,对于我们而言,不那么的需要,所以,我们只需要使用一些差不多 ...
- Android LRUCache
package android.util; import java.util.LinkedHashMap; import java.util.Map; /** * A cache that holds ...