Oracle数据库之多表查询一

流过昼夜 提交于 2020-02-17 01:58:54

   上一篇给大家介绍了数据的单表查询,相信大家对于单表的查询应该都有了一些了解。单表查询在数据库中的使用会有一些,但并不是很多,但是作为初学者,我们需要学习单表查询的思路。今天呢,我们为大家介绍一下数据库中的多表查询,左查询和右查询。因为多表查询在实际项目中的应用还是比较广泛的。我们一定要掌握,掌握了多表查询对于后面的子查询、分组查询的学习就非常的简单了!

第一步:首先开启数据库监听服务:

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左边的表中不满足条件的数据过滤掉

 

 好了,关于多表查询、左查询、右查询方面的知识我们就介绍到这里了哈!!!

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!