查询是数据库的基本应用之一,oracle中的SQL查询语法,一方面遵循了SQL标准,另一方面又有自己的独特之处。
从而使得oracle中的SQL查询功能更加强大。接下来将会涉及oracle中的SQL查询语句,包括:
基本查询:主要讲述查询语句及各种子句的使用;
子查询:主要讲述如何在查询语句中添加子查询;
联合语句:主要讲述多个查询语句之间的集合运算;
关联语句:主要讲述多个表/视图之间的关联关系;
层次化查询:主要讲述树状结构的查询。
一、基本查询:
1. 查询命令select
执行查询的命令为select命令,该命令用于在数据源中捕获最终数据。无论查询语句多么复杂,最外层的select命令总是最后执行。
具体表现为:oracle首先根据from子句获得数据源的所有记录,接着,oracle扫描所有记录,并根据select命令所指定的列获取最终结果。
2. 指定过滤条件----where子句
where子句用于限定from子句所指定的数据源,或者各数据源进行运算之后形成的结果集合。因此,执行顺序处于from子句之后,select命令之前。即使from子句更加复杂,其执行顺序仍然如此。
注:笛卡尔积-->获得的是两个数据表的乘积,第一表的每条记录与第二表的每条记录组合所获得结果集。
3. 获取唯一记录----distinct
在查询时,会出现重复记录。为了剔除重复记录,可以利用distinct关键字。
select distinct a.xxx, b.yyy from table a, tables b where a.a_id = b.a_id
其中,distinct关键字用于获取结果集中列a.xxx,b.yyy的唯一性组合。
4. 分组----group by 子句
在数据库查询中,分组是一个非常重要的应用。分组是指将数据表中的所有记录,以某个或者某些列为标准,划分为一组。例如:在一个存储了地区学生的表中,以学校为标准,可以将所有学生信息划分为多个组。
进行分组查询应该使用group by子句。该子句指定分组标准,并将数据源按照该标准进行划分,然后循环处理每组数据。
select cd.channel_id, cd.channel_name
from intf.ecs_order eo , liuxin.channel_dianqu cd
where eo.org_id = cd.channel_id
group by cd.channel_id, cd.channel_name
其中,group by cd.channel_id, cd.channel_name用于对数据源按列 cd.channel_id, cd.channel_name 进行分组。详细步骤如下:
(1)from子句获得数据源;(2)利用where 子句筛选符合条件的记录;(3)利用group by子句进行分组;
(4)对每组进行循环处理,获得最终结果----每组的cd.channel_id, cd.channel_name。
5. 过滤分组----having子句
where子句可以过滤from子句所指定的数据源,但是对于group by子句所产生的分组无效。为了将分组按照一定条件进行过滤,应该使用having子句。
having子句是依附于group by子句存在而存在的。
select cd.channel_id, cd.channel_name
from intf.ecs_order eo , liuxin.channel_dianqu cd
where eo.org_id = cd.channel_id
group by cd.channel_id, cd.channel_name
having cd.channel_id >100000199
上面例子说明的是ID号大于100000199的记录。
(1)利用group by子句分组;(2)利用having子句筛选分组----组内所有ID号大于100000199。