ORACLE 查询

查询作为SQL语言中作重要的组成部分,其作用也是巨大的。一个完整的select语句由select … from …组成。而这个基础的语句可以扩充为:

Select … From … Where … (Group by) … Having(where) … Order by…

下面举个最简单的例子:在这里插入图片描述

得到的查询结果: 在这里插入图片描述

可以将通配符*换成student表中你需要的字段,如SNO,SNAME,从而得到自己想要的结果。可有时候我们需要的数据不仅仅来源于一张表,这个时候就要进行连表查询。而表格的连接方式又分为很多种:

  • 等值连接(也称为内连接,以两边中相同的字段作为连接条件
  • 非等值连接(范围筛选连接条件)
  • 外连接(使用外连接来查询不满足连接条件的数据)
  • 自连接(本表与本表存在相关联的字段)
  • 叉集(笛卡尔积)
  • 自然连接(以两个表中具有相同名字的列为条件创建等值连接。)

在表格的连接过程中可能会出现很多问题,首先就是笛卡尔积。笛卡尔积的形成是由于在连表的时候未写连接条件,而导致两表的数据进行一对多随意连接,造成大量甚至是巨量的数据冗余,从而对数据库带来极大的负担。所以在进行连表时一定要注意连接条件的使用,尽量避免笛卡尔积的出现。

连表时可以使用where来建立连接条件:在这里插入图片描述

也可以使用on来建立连接条件:在这里插入图片描述

有些表名冗长难写,这个时候就可以使用别名来简化查询。在不同表中具有相同列名的列可以用表的别名加以区分。使用表名前缀可以提高执行效率。

有时候我们需要的数据不满足表的连接条件,就得不到想要的结果,例如上面查询的结果为:
在这里插入图片描述

有四名同学的信息,可我们又想查询到所有学生,就算没有成绩也可以,这个时候就需要用到外连接,外连接同样针对whereon各有各的写法:

Oracle SQL语法(where): 在这里插入图片描述

SQL 1999语法(on): 在这里插入图片描述

外连接的表格会查询出该表的所有数据,就算不满足连接条件也会查询出来,而不满足的其他表的列值为空。这个时候得到的查询结果为:
在这里插入图片描述

Oracle SQL语法与SQL 1999语法都是可用的,不必过分纠结两者的区别,灵活运用也可以提高查询效率。

为了满足更复杂的要求,在写查询语句的时候可以运用子查询来满足需求,并且简化查询。在查询语句中如果有子查询的存在,那么SQL语句会先执行子查询,再执行外查询,这也印证了“子查询的结果作为外查询的条件”

如题:查询张三所在班级的所有学生信息。那我们需要先查询出“张三”所在的班级:
在这里插入图片描述在这里插入图片描述

然后再根据班级来查询该班的学生信息:
在这里插入图片描述在这里插入图片描述

这样要写两个查询语句才能得到结果,但是我们可以发现,第一个查询语句的结果,就是第二个查询语句的条件,那么我们就可以使用子查询来简化它:
在这里插入图片描述

这样写得到的结果与前面分两个查询语句写是相同的。

除了连表以外,还有一个需就是函数的使用。函数可以根据函数本身的功能来对数据进行操作,也可以对数据的类型进行转换。而函数之间也是可以嵌套使用的,就相当于外查询嵌套子查询,内部的函数结果作为外部函数的参数。
在这里插入图片描述

最后得到的结果就是将first_name和last_name转换成大写后拼接起来:
在这里插入图片描述

函数的使用中还需要注意的就是分组函数,分组函数能处理多条数据并且返回一个值,需要使用group by子句进行分组以及having子句进行筛选。
在这里插入图片描述
在这里插入图片描述

当我们在最终的查询结果出来之后,就可以对其进行排序的操作,这个时候就引入了一个新的语法——ROWNUM(伪列)。顾名思义,伪列就是一个虚拟的列,它可以为当前数据进行标号,效果如下:

在这里插入图片描述
在这里插入图片描述

有伪列之后就可以通过为例进行数据的筛选和排序,但有一点要注意的是,由于Oracle的执行顺序中order by 子句是最后执行的,而伪列是在select 子句中执行,所以在使用伪列的同时又使用了order by 子句,那么伪列原本的顺序将会被打乱,这个时候再使用where 子句对伪列进行数据筛选的时候得到的结果就是错误的:

在这里插入图片描述
在这里插入图片描述

所以我们在使用伪列的过程中一定要注意Oracle的执行顺序,上面的问题可以使用子查询来解决为:
在这里插入图片描述
那么得到的结果就是正确的:
在这里插入图片描述

Oracle SQL语句的执行顺序为:
1. from 语句
2. where/on 语句(连接条件)
3. where
4. group by 语句
5. having 语句
6. select 语句
7. union、minus、intersect等
8. order by

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值