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数据库命令
- Oracle数据库经常使用经典查询
- Oracle数据库:oracle执行计划性能代价cost,全表扫描速度慢,索引扫描速度快
- Oracle数据库:序列sequence的创建,查询,修改,删除,increment by,start with等关键字
- Oracle数据库:创建和删除视图view,简单和复杂视图,内建视图,topN分析,oracle分页查询
- Oracle数据库:oracle组函数,聚合函数,多行函数,avg,sum,min,max,count,group by,having
- Oracle数据库:oracle外连接left/right/full outer join on,oracle扩展的左右外连接展示符号(+)
- Oracle数据库:oracle函数,单行函数,多行函数,upper,lower,initcap,字符串函数
- [转]Oracle数据库中的约束
- Oracle 执行计划(Explain Plan) 说明
- Oracle数据库的备份方法
- Oracle数据库内置函数
- 《Oracle数据库管理与维护实战》——第 2 章 Oracle体系结构及其基本概念
- 《Oracle数据库管理与维护实战》——2.11 Oracle数据字典
- oracle表复杂查询--创建数据库实例
- c 语言写的高级Oracle®数据库调优及监控工具
- oracle数据库单表查询
- 《Oracle高性能自动化运维》一一2.2 队列锁(Enqueue Lock)
- Oracle 创建数据库
- Oracle数据库 | Oracle并发与一致性
- Oracle教程之学习笔记
- Java使用JDBC连接随意类型数据库(mysql oracle。。)
- Oracle的层次查询(oracle树查询)
- 从数据库到云 Oracle 为IT市场注入“活力”
- MyBatis+Oracle时出现的错误: Method oracle/jdbc/driver/OracleResultSetImpl.isClosed()Z is abstract