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)表空间:所有的数据对 ...
随机推荐
- 使用jsonp跨域调用百度js实现搜索框智能提示(转)
http://www.cnblogs.com/oppoic/p/baidu_auto_complete.html 项目中常常用到搜索,特别是导航类的网站.自己做关键字搜索不太现实,直接调用百度的是最好 ...
- centos安装教程
centos7和6.x有很大的差别,在第一次安装的时候遇到了很多坑,一共安装了三次才成功 如果是用window自带的Hyper-v装centos时 安装包在\\10.10.10.1\ShareDo ...
- string容器
一.string特性 string是STL的字符串类型,通常用来表示字符串.而在使用string之前,字符串通常是用char*表示的,string与char*都可以用来表示字符串. 说到string的 ...
- grunt 压缩js css html 合并等配置与操作详解
module.exports = function(grunt){ //1.引入 grunt.loadNpmTasks('grunt-contrib-cssmin'); grunt.loadNpmTa ...
- 洛谷 3803 【模板】多项式乘法(FFT)
题目:https://www.luogu.org/problemnew/show/P3803 第一道FFT! https://www.cnblogs.com/zwfymqz/p/8244902.htm ...
- 13.Selenium不再支持PhantomJS
在网上查看Selenium教程,发现很多都是使用PhantomJS进行爬虫,故想学习下,下载好了PhantomJS,配好了环境变量,编写代码后发现以下错误 from selenium import w ...
- php之laravel学习
http://laravel-china.github.io/php-the-right-way/#composer_and_packagist laravel 添加 dingoapi路由插件 并运用 ...
- [转] CentOS系统目录学习
最近初学Linux 对linux的目录产生了很多疑问,看到这篇文章,让我顿时对目录有了一个清晰的认识!推荐给大家! ------------------------------------------ ...
- 【转】 Pro Android学习笔记(八二):了解Package(1):包和进程
文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.net/flowingflying/ 在之前,我们已经学习了如何签发apk,见P ...
- iOS按home键后程序的状态变化
iOS 的应用里的几种状态: active: 应用在前台正常运行 background: 应用在后台,并且在执行代码. inactive: 这个状态是应用从一个状态向另一个状态的过渡 suspende ...