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)表空间:所有的数据对 ...
随机推荐
- python模型字段
http://python.usyiyi.cn/translate/django_182/ref/models/fields.html#model-field-types
- swing之JDialog
package canying; import java.awt.Color; import java.awt.Graphics; import java.awt.Image; import java ...
- 序章:为什么学习使用kotlin、及kotlin的一些碎碎念
为什么使用kotlin? 当然是因为项目目前的开发语言是kotlin啊! 一方面是想能够尽快适应项目,另一方面,kotlin这门语言独特的语法,确实很吸引我,也让我意识到java代码在某些程度上的繁琐 ...
- zabbix上的宏(macro)介绍
宏:macro,预设的文本替换模式: 宏是一种抽象概念(Abstraction),它根据一些列预定义的规则替换一定的文本模式,而解释或编译器在遇到宏时会自动进行这一模式替换.类似地,zabbix基于宏 ...
- Asp.NET Core+ABP框架+IdentityServer4+MySQL+Ext JS之验证码
验证码这东西,有人喜欢有人不喜欢.对于WebApi是否需要验证码,没去研究过,只是原来的SimpleCMS有,就加上吧. 在WeiApi上使用验证码,关键的地方在于WeiApi是没有状态的,也就是说, ...
- 2 ignite关键特性
数据注入和流计算: Ignite流式计算允许以可扩展和容错的方式处理连续不中断的数据流.在一个中等规模的集群中,数据注入Ignite的比例会很高,很容易达到每秒百万级的规模. Ignite可以与主要的 ...
- C++面试考点
1.下面程序在x64下结果 struct st { int a; long long b; double c; }; int main() { st s; cout << &s.a ...
- 【转】href="#"与"javascript:void(0);"的区别
在工作中,如果我们想把a标签中的链接置成空链接,我们一般会用两种方法: 1 <a href="#" target="_blank"></a&g ...
- c语言-顺序表
在数据结构中包含两种,一种线性结构(包括顺序表,链表,栈,队列),一种非线性结构(树,图), 顺序表,其实就是在内存动态数组,Java中的ArrayList就是一个典型的顺序表,它在顺序表的基础上增加 ...
- python之简单的函数介绍(http://docs.python.org/3/library)
Python不但能非常灵活地定义函数,而且本身内置了很多有用的函数,可以直接调用. 在上面的网站上我们可以进行查询,Python具体都有哪些函数. 我们也可以再交互命令行中来查找函数: >> ...