热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

Oracle学习笔记:SQL查询总结

1查询语句1.1获取唯一记录——distinct获取员工唯一工资状况的SQL语句如下所示。SQLgt;selectdistincte.employee_name,

1 查询语句 1.1获取唯一记录——distinct 获取员工唯一工资状况的SQL语句如下所示。 SQLgt; select distinct e.employee_name,

1 查询语句

1.1获取唯一记录——distinct

获取员工唯一工资状况的SQL语句如下所示。

SQL> select distinct e.employee_name, s.salary

from employees e, salary s

where e.employee_id = s.employee_id;

1.2

在数据库查询中,,分组是一个非常重要的应用。分组是指将数据表中所有记录中,以某个或者某些列为标准,划分为一组。

进行分组查询应该使用

1.3

where

为了获得工资总额大于

select e.employee_id, e.employee_name, sum(s.salary) total_salary

from employees e, salary s

where e.employee_id = s.employee_id

group by e.employee_id, e.employee_name

having (sum(s.salary))>10000

1.4

order by

对该搜寻结果按照工资水平由高到低的顺序排列,SQL语句如下所示。

SQL> select distinct e.employee_name, s.salary

from employees e, salary s

where e.employee_id = s.employee_id

order by s.salary desc;

1.5 order by

当两种子句同时存在时,

order by

获得员工工资总额状况,并按照工资总额由高到低的顺序进行排列。

SQL> select e.employee_name, sum(s.salary) total_salary

from employees e, salary s

where e.employee_id = s.employee_id

group by e.employee_name

order by total_salary desc;

1.6 order bydistinct

order by

规则

获得所有员工姓名,并按工资进行升序排列。

SQL> select e.employee_name,s.salary

from employees e, salary s

where e.employee_id = s.employee_id

order by s.salary desc;

2 子查询

子查询是指在查询语句的内部嵌入查询,以获得临时的结果集。

Oracle总是自动优化带有子查询的查询语句。如果子查询中的数

据源与父查询中的数据可以实现连接操作,那么将转化为连接操

作;否则,将首先执行子查询,然后执行父查询。

2.1 查询条件中的子查询

例如,在表employees中存储了员工信息。但是其中某些员工并未领取过工资。

那么可以利用子查询作为查询条件来获得所有领取过工资的员工信息。

SQL> select * from employees

where employee_id in (select employee_id from salary);

2.2 建表语句中的子查询

子查询的另外一个应用场景用于建表语句中。

例如,

现欲创建一个与该视图具有相同结构的空数据表,则可以利用如下SQL语句。

SQL> create table tmp_user_objects

as select * from user_objects where 1<>1;

2.3 插入语句中的子查询

我们也可以在插入语句中使用子查询。这相当于向表中批量插入数据。

创建的数据表为空表,我们可以利用子查询向其中插入数据。

SQL> insert into tmp_user_objects

select * from user_objects

where object_type='TABLE';

select * from user_objects where object_type='TABLE'

用于获得视图

该子查询的所有记录,将被插入表tmp_user_objects中。

3 联合语句

联合语句是指对于多个查询所获得结果集进行集合操作。

这些集合操作包括:

这些集合运算都是二元运算,运算结果仍然是一个记录集合。

3.1

union运算实际是合并两个结果集中的所有记录,并将其中重复记录剔除(保证结果集中的记录唯一)。

实例:数据库中存在着两个表

分别存储了参加了

select student_id, student_name from a_students

union

select student_id, student_name from b_students;

3.2

union all

但是union all只是将两个运算结果集进行简单整合,并不剔除其中的重复数据。

这是与union运算的最大区别。

只需在上例

3.3

interseect运算是指交集运算。

该运算可以获得两个结果集的交集——即同时存在于两个结果集中的记录。

在表

现欲获得既参加了

即同时存在于两个表中的学生姓名,则可以使用intersect运算。

相应的SQL语句如下所示。

SQL> select student_name from a_students

intersect

select student_name from b_students;

3.4

minus是集合间的减法运算。该运算将返回第一个集合中存在,

而第二个集合中不存在的记录。

现欲获得参加了

此时,我们可以利用

而不存在于表b_students中的学生姓名。

SQL> select student_name from a_students

minus

select student_name from b_students;

3.5 联合语句的混合运算

对于这四种集合运算

Oracle允许进行混合运算。在混合运算时,这四种运算的优先级是相同的,

也就是说,他们将按照自左至右的顺序依次进行。

intersect

SQL> select student_name from a_students

intersect

select student_name from a_students

union all

select student_name from b_students

4 连接

在大多数查询中,所使用的数据源往往有多个。

当多个数据源同时使用时,这些数据源如何进行

组合便成为了一个至关重要的问题。连接即用来

指定多个数据源之间的组合关系。默认情况下,

多个数据源之间使用的是笛卡尔积方式进行组合。

除此之外,Oracle还提供了另外几种特殊的组合方式。

这些特殊方式有效补充了笛卡尔积的不足

4.1 自然连接

自然连接,顾名思义,即无需用户指定任何连接条件,

只需指定连接的两个数据源。至于两个数据源如何进行数据整合则无需用户操心。

自然连接所使用的关键字为natural join。其连接原则为,

两个数据源的共有列,并且具有相同列值。

二者可以进行自然连接操作,相应的SQL语句如下所示。

select * from employees natural join salary;

natural join用于两个表之间的自然连接。

搜寻结果获得的结果集,将含有公共列employee_id

这里所说的公共列是指,不能为列employee_id指定限定词。

例如,不能将列

SQL> select e.employee_id

4.2 内连接

自然连接强制使用两个表之间的公共列作为搜寻条件;

而且要求公共列的值必须相等。这带来了极大的限制,

因此,自然连接并不常用。而内连接突破了这两种约束。

内连接可以自行指定连接列和连接条件。内连接运算的关键字为inner join

同样为了实现获得员工工资状况这一需求,利用内连接的SQL语句如下所示。

SQL> select e.employee_id, e.employee_name, s.month, s.salary

from employees e

inner join salary s

on e.employee_id = s.employee_id;

4.3 外连接

内连接所指定的两个数据源,处于平等的地位。而外连接不同,外连接总是以一个数据源为基础,将另外一个数据源与之进行条件匹配。即使条件不匹配,基础数据源中的数据总是出现在结果集中。那么,依据哪个数据源作为基础数据源,便出现了两种外连接的方式——左(外)连接和右(外)连接。因为内连接没有左右之分,所以习惯上,我们将左外连接和右外连接简称为左连接和右连接。

1.左连接

2. 右连接

3. 外连接的简略写法

简略写法的优劣

5.完全连接

语句片断:

  SELECT MODELNAME, TABLENAME

  FORM EMCD_MONITOR_MODEL , EMCD_MONITOR_TABLE

  WHERE EMCD_MONITOR_TABLE.MODELID(+) =EMCD_MONITOR_MODEL.ID

始终记住

反之, A.bid=B.id (+)为左连接;

相当于标准

5 层次化查询

关系型数据库中,同一个数据表中的记录具有相同的列,因此,

不同的记录之间存在着平行关系。但是,有时候,各记录之间也

可能存在着

将整个表中的数据看做树状结构,而基于树状结构数据的查询,

称为层次化查询。

5.1 树状模型

树状模型一个很典型的实例为市场信息。不同层级的市场之间存在着父子关系。

5.2 层次化查询

select

from 表名

start with 开始条件

connect by 递归条件

其中,

5.3 层次化查询的相关函数

对于层次化查询,最常用的函数为

sys_connect_by_path(

其中,名指定将哪个列的值进行串联,而分隔符则指定字符串串联时的分隔符。


推荐阅读
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 本文介绍了adg架构设置在企业数据治理中的应用。随着信息技术的发展,企业IT系统的快速发展使得数据成为企业业务增长的新动力,但同时也带来了数据冗余、数据难发现、效率低下、资源消耗等问题。本文讨论了企业面临的几类尖锐问题,并提出了解决方案,包括确保库表结构与系统测试版本一致、避免数据冗余、快速定位问题等。此外,本文还探讨了adg架构在大版本升级、上云服务和微服务治理方面的应用。通过本文的介绍,读者可以了解到adg架构设置的重要性及其在企业数据治理中的应用。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文介绍了使用postman进行接口测试的方法,以测试用户管理模块为例。首先需要下载并安装postman,然后创建基本的请求并填写用户名密码进行登录测试。接下来可以进行用户查询和新增的测试。在新增时,可以进行异常测试,包括用户名超长和输入特殊字符的情况。通过测试发现后台没有对参数长度和特殊字符进行检查和过滤。 ... [详细]
  • 本文详细介绍了MysqlDump和mysqldump进行全库备份的相关知识,包括备份命令的使用方法、my.cnf配置文件的设置、binlog日志的位置指定、增量恢复的方式以及适用于innodb引擎和myisam引擎的备份方法。对于需要进行数据库备份的用户来说,本文提供了一些有价值的参考内容。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • 本文由编程笔记小编整理,介绍了PHP中的MySQL函数库及其常用函数,包括mysql_connect、mysql_error、mysql_select_db、mysql_query、mysql_affected_row、mysql_close等。希望对读者有一定的参考价值。 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • Oracle分析函数first_value()和last_value()的用法及原理
    本文介绍了Oracle分析函数first_value()和last_value()的用法和原理,以及在查询销售记录日期和部门中的应用。通过示例和解释,详细说明了first_value()和last_value()的功能和不同之处。同时,对于last_value()的结果出现不一样的情况进行了解释,并提供了理解last_value()默认统计范围的方法。该文对于使用Oracle分析函数的开发人员和数据库管理员具有参考价值。 ... [详细]
  • MyBatis错题分析解析及注意事项
    本文对MyBatis的错题进行了分析和解析,同时介绍了使用MyBatis时需要注意的一些事项,如resultMap的使用、SqlSession和SqlSessionFactory的获取方式、动态SQL中的else元素和when元素的使用、resource属性和url属性的配置方式、typeAliases的使用方法等。同时还指出了在属性名与查询字段名不一致时需要使用resultMap进行结果映射,而不能使用resultType。 ... [详细]
  • 本文详细介绍了在ASP.NET中获取插入记录的ID的几种方法,包括使用SCOPE_IDENTITY()和IDENT_CURRENT()函数,以及通过ExecuteReader方法执行SQL语句获取ID的步骤。同时,还提供了使用这些方法的示例代码和注意事项。对于需要获取表中最后一个插入操作所产生的ID或马上使用刚插入的新记录ID的开发者来说,本文提供了一些有用的技巧和建议。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
author-avatar
财气冲天6_757
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有