暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

连接到 Oracle 数据库并探索它

胡飞 2024-12-03
463

2连接到 Oracle 数据库并探索它

您只能通过客户端程序(例如 SQL*Plus 或 SQL Developer)连接到 Oracle 数据库。连接到数据库后,您可以查看架构对象、查看 Oracle 数据库表的属性和数据,以及使用查询从 Oracle 数据库表中检索数据。

通过客户端程序连接到 Oracle 数据库后,您可以在该客户端程序中输入并运行命令。有关详细信息,请参阅客户端程序的文档。

2.1从 SQL*Plus 连接到 Oracle 数据库

SQL*Plus 是一个客户端程序,您可以通过它访问 Oracle 数据库。本主题演示如何启动 SQL*Plus 并连接到 Oracle 数据库。

笔记:

对于 以下过程的 步骤34 ,您需要用户名和密码。

要从 SQL*Plus 连接到 Oracle 数据库:

  1. 如果您使用的是 Windows 系统,请显示 Windows 命令提示符。

  2. 在命令提示符处,键入,然后按Entersqlplus

  3. 在出现用户名提示时,键入您的用户名,然后按Enter键。

  4. 在出现密码提示时,键入您的密码,然后按Enter

    笔记:

    为了安全起见,您的密码在屏幕上不可见。

    系统将您连接到 Oracle 数据库实例。

    您处于 SQL*Plus 环境中。在SQL>提示符下,您可以输入并运行 SQL*Plus 命令、SQL 语句、PL/SQL 语句和操作系统命令。

    要退出 SQL*Plus,请键入并按Enterexit

    笔记:

    退出 SQL*Plus 将结束 SQL*Plus 会话,但不会关闭 Oracle 数据库实例。

    示例 2-1启动 SQL*Plus,连接到 Oracle 数据库,运行 SQLSELECT语句,然后退出 SQL*Plus。用户输入为粗体

示例 2-1 从 SQL*Plus 连接到 Oracle 数据库

> sqlplus SQL*Plus:2012 年 12 月 27 日星期四 07:43:41 发布 12.1.0.1.0 生产版 版权所有 (c) 1982、2012,Oracle。版权所有。 输入用户名:your_user_name 输入密码:your_password 连接到: Oracle Database 12c 企业版版本 - 12.1.0.1.0 64 位生产版 SQL>从员工中选择计数(*); 数数(*) ---------- 107 SQL>退出 与 Oracle Database 12c 企业版版本 - 12.1.0.1.0 64 位生产版断开连接 >


参见:

父主题: 连接到 Oracle 数据库并探索它

2.2从 SQL Developer 连接到 Oracle 数据库

SQL Developer 是一个客户端程序,您可以使用它访问 Oracle 数据库。

我们鼓励您使用当前可用的 SQL Developer 版本,您可以从以下位置下载该版本:

http://www.oracle.com/technetwork/developer-tools/sql-developer/downloads/

本节假设您的系统上安装了 SQL Developer,并演示如何启动它并连接到 Oracle 数据库。如果您的系统上未安装 SQL Developer,请参阅Oracle SQL Developer 用户指南以获取安装说明。

笔记:

对于以下过程:

  • 如果您使用的 SQL Developer 工具包不包含 JDK,则首次在系统上启动 SQL Developer 时,必须提供 Java 开发工具包的路径。

  • 出现提示时,您需要输入用户名和密码。

要从 SQL Developer 连接到 Oracle 数据库:

  1. 启动 SQL 开发人员。

    有关说明,请参阅Oracle SQL Developer 用户指南

    如果这是您第一次在系统上启动 SQL Developer,系统会提示您输入 Java 开发工具包 (JDK) 安装的路径(例如,C:\Program Files\Java\jdk1.8.0_65)。在提示后键入路径或浏览到该路径,然后按Enter键。

  2. “连接”框架中,单击“新建连接”图标

  3. 新建/选择数据库连接窗口中:

    1. 在“连接名称”“用户名”“密码”字段中键入适当的值

      为了安全起见,您键入的密码字符显示为星号。

      密码字段附近有复选框“保存密码”。默认情况下,它是取消选择的。 Oracle 建议接受默认值。

    2. 如果未显示Oracle窗格,请单击Oracle选项卡。

    3. Oracle窗格中,接受默认值。

      (默认值为:连接类型,基本;角色,默认,主机名,本地主机;端口,1521;SID 选项,已选择;SID 字段,xe。)

    4. 单击按钮测试

      连接已测试。如果连接成功,状态指示灯将从空白变为成功

    5. 如果测试成功,请单击“连接”按钮。

      新建/选择数据库连接窗口关闭。连接框架显示您在步骤 3的连接名称字段中输入其名称的连接

您处于 SQL Developer 环境中。

要退出 SQL Developer,请“文件”菜单中选择“退出”

笔记:

退出 SQL Developer 会结束 SQL Developer 会话,但不会关闭 Oracle 数据库实例。下次启动 SQL Developer 时,使用上述过程创建的连接仍然存在。 SQL Developer 会提示您输入在步骤3中提供的密码 (除非您选中了“保存密码”复选框)。

参见:

父主题: 连接到 Oracle 数据库并探索它

2.3以HR用户连接Oracle数据库

要执行本文档中的教程和示例,您必须以用户身份连接到 Oracle 数据库HR

用户HR拥有HR本文档中的示例和教程使用的示例架构。

父主题: 连接到 Oracle 数据库并探索它

2.3.1解锁HR账户

您必须解锁 HR 帐户并重置其密码,然后才能以 HR 用户身份连接到 Oracle 数据库。

默认情况下,安装 HR 方案后,HR 帐户将被锁定且密码已过期。

笔记:

对于以下过程,您需要具有ALTER USER系统权限的用户的名称和密码

解锁 HR 帐户并重置其密码:

  1. 使用 SQL*Plus,以具有ALTER USER系统权限的用户身份连接到 Oracle 数据库

  2. SQL>提示,解锁HR账户并重置密码:

    警告:

    选择一个安全的密码。有关安全密码的指南,请参阅Oracle 数据库安全指南

    更改用户 HR 帐户解锁由密码识别;


    系统回应:

    用户已更改。


    HR帐户已解锁,密码为密码

现在您可以以用户 HR 的身份使用密码 pass 来连接到 Oracle数据库

参见:

父主题: 以用户 HR 身份连接到 Oracle 数据库

2.3.2以 HR 用户身份从 SQL*Plus 连接到 Oracle 数据库

您可以使用 SQL*Plus 以 HR 用户身份连接到 Oracle 数据库。

笔记:

如果HR账户被锁定,请参见解锁HR账户,然后返回本节。

要以 HR 用户身份从 SQL*Plus 连接到 Oracle 数据库:

笔记:

对于此任务,您需要 HR 帐户的密码。

  1. 如果您已连接到 Oracle 数据库,请关闭当前连接。

  2. 按照“从 SQL*Plus 连接到 Oracle 数据库中的说明进行操作,HR在步骤 3中输入 HR 帐户的用户名,在步骤4中输入 HR 帐户的密码 

    您现在已作为用户 HR 连接到 Oracle 数据库。

参见:

SQL*Plus 用户指南和参考HR使用 SQL*Plus 创建连接 的示例

父主题: 以用户 HR 身份连接到 Oracle 数据库

2.3.3从 SQL Developer 以 HR 用户身份连接到 Oracle 数据库

您可以使用 SQL Developer 以 HR 用户身份连接到 Oracle 数据库。

笔记:

如果HR账户被锁定,请参见解锁HR账户,然后返回本节。

要从 SQL Developer 以 HR 用户身份连接到 Oracle 数据库:

笔记:

对于此任务,您需要 HR 帐户的密码。

按照“从 SQL Developer 连接到 Oracle 数据库中的说明进行操作,在步骤3中输入以下值 

  • 对于连接名称,输入hr_conn

    (您可以输入不同的名称,但本文档中的教程假定您将连接命名为hr_conn。)

  • 对于用户名,输入HR

  • 对于密码,输入 HR 帐户的密码。

您现在已作为用户 HR 连接到 Oracle 数据库。

父主题: 以用户 HR 身份连接到 Oracle 数据库

2.4使用 SQL*Plus 探索 Oracle 数据库

如果您以 HR 用户身份从 SQL*Plus 连接到 Oracle 数据库,则可以查看 HR 模式对象和 EMPLOYEES 表的属性。

笔记:

如果您没有以用户 HR 身份从 SQL*Plus 连接到 Oracle 数据库,请参阅以用户 HR 身份从 SQL*Plus 连接到 Oracle 数据库,然后返回到本节。

父主题: 连接到 Oracle 数据库并探索它

2.4.1使用 SQL*Plus 查看 HR 模式对象

使用 SQL*Plus,您可以通过查询静态数据字典视图USER_OBJECTS来查看属于 HR 模式的对象

示例 2-2显示如何查看属于 HR 模式的对象的名称和数据类型。

示例 2-2 使用 SQL*Plus 查看 HR 模式对象

列 OBJECT_NAME 格式 A25 列对象类型格式 A25 从 USER_OBJECTS 中选择 OBJECT_NAME、OBJECT_TYPE, 按 OBJECT_TYPE、OBJECT_NAME 排序;


结果类似于:

OBJECT_NAME OBJECT_TYPE ------------------------ ------------------------ COUNTRY_C_ID_PK 指数 DEPT_ID_PK 索引 DEPT_LOCATION_IX 索引 EMP_DEPARTMENT_IX 索引 EMP_EMAIL_UK 索引 EMP_EMP_ID_PK 索引 EMP_JOB_IX 索引 EMP_MANAGER_IX 索引 EMP_NAME_IX 索引 JHIST_DEPARTMENT_IX 索引 JHIST_EMPLOYEE_IX 索引 JHIST_EMP_ID_ST_DATE_PK 索引 JHIST_JOB_IX 索引 JOB_ID_PK 索引 LOC_CITY_IX 索引 LOC_COUNTRY_IX 索引 LOC_ID_PK 索引 LOC_STATE_PROVINCE_IX 索引 REG_ID_PK 索引 ADD_JOB_HISTORY 程序 SECURE_DML 过程 DEPARTMENTS_SEQ 序列 EMPLOYEES_SEQ 序列 LOCATIONS_SEQ 序列 国家表 部门表 员工表 职位表 作业_历史表 位置表 地区表 SECURE_EMPLOYEES 触发 UPDATE_JOB_HISTORY 触发器 EMP_DETAILS_VIEW 查看 已选择 34 行。


参见:

父主题: 使用 SQL*Plus 探索 Oracle 数据库

2.4.2使用 SQL*Plus 查看 EMPLOYEES 表属性和数据

您可以使用 SQL*Plus 命令、SQL SELECT语句和静态数据字典视图来查看 HR.EMPLOYEES 表的属性和数据。

您可以使用SQL*Plus命令DESCRIBE查看HR模式中EMPLOYEES表的列属性,并使用SQL语句SELECT查看数据。要查看表的其他属性,请使用静态数据字典视图(例如,USER_CONSTRAINTSUSER_INDEXESUSER_TRIGGERS)。

示例 2-3显示了如何查看 HR 模式中 EMPLOYEES 表的属性。

示例 2-3 使用 SQL*Plus 查看 EMPLOYEES 表属性

描述员工


结果:

名字为空?类型 ---------------------------------------------------- -------- - ------------ EMPLOYEE_ID NOT NULL NUMBER(6) FIRST_NAME VARCHAR2(20) LAST_NAME NOT NULL VARCHAR2(25) 电子邮件不为空 VARCHAR2(25) PHONE_NUMBER VARCHAR2(20) HIRE_DATE 非空日期 JOB_ID NOT NULL VARCHAR2(10) 工资数字(8,2) COMMISSION_PCT 编号(2,2) MANAGER_ID 号(6) DEPARTMENT_ID 号(4)


例2-4展示了如何查看HR模式中EMPLOYEES表中的一些数据。

示例 2-4 使用 SQL*Plus 查看 EMPLOYEES 表数据

列 FIRST_NAME 格式 A20 姓氏列格式 A25 电话号码格式列 A20 按 LAST_NAME排序,从员工中选择 LAST_NAME、FIRST_NAME、PHONE_NUMBER ;


结果类似于:

LAST_NAME FIRST_NAME PHONE_NUMBER ---------------------------------- -------------------- ----- ---------------- 阿贝尔·艾伦 011.44.1644.429267 安德桑达尔 011.44.1346.629268 阿特金森莫哲 650.124.6234 奥斯汀大卫 590.423.4569 贝尔·赫尔曼 515.123.8888 百达雪莉 515.127.4563 班达·阿米特 011.44.1346.729268 贝茨·伊丽莎白 011.44.1343.529268 ... 乌尔曼·何塞·曼努埃尔 515.124.4469 瓦尔加斯·彼得 650.121.2004 维什尼·克拉拉 011.44.1346.129268 沃尔曼尚塔 650.123.4234 沃尔什·阿拉纳 650.507.9811 韦斯·马修 650.123.1234 惠伦·詹妮弗 515.123.4444 兹洛特埃莱尼 011.44.1344.429018 已选择 107 行。


参见:

父主题: 使用 SQL*Plus 探索 Oracle 数据库

2.5使用 SQL Developer 探索 Oracle 数据库

如果您以 HR 用户身份从 SQL Developer 连接到 Oracle 数据库,则可以查看 HR 模式对象和 EMPLOYEES 表的属性。

父主题: 连接到 Oracle 数据库并探索它

2.5.1教程:使用 SQL Developer 查看 HR 架构对象

本教程演示如何使用 SQL Developer 查看属于 HR 模式的对象,即如何浏览HR 模式。

笔记:

如果您没有从 SQL Developer 以 HR 用户身份连接到 Oracle 数据库,请参阅从 SQL Developer 以 HR 用户身份连接到 Oracle 数据库,然后返回到本教程。

要浏览 HR 架构:

  1. “连接”框架中,单击hr_conn图标左侧的加号 (+)

    如果您未连接到数据库,则会打开“连接信息”窗口。如果您已连接到数据库,则hr_conn信息将展开(请参阅步骤2中“单击确定”后面的信息 )。

  2. 如果连接信息窗口打开:

    1. 用户名字段中,输入hr

    2. 密码字段中,输入用户 HR 的密码。

    3. 单击“确定”

    hr_conn信息展开:加号变成减号 (-),在hr_conn图标下,会出现架构对象类型列表 — 表、视图、索引等。 (如果单击减号,则hr_conn信息会折叠:减号变为加号,并且列表消失。)

参见:

父主题: 使用 SQL Developer 探索 Oracle 数据库

2.5.2教程:使用 SQL Developer 查看 EMPLOYEES 表属性和数据

本教程演示如何使用 SQL Developer 查看 HR 架构中 EMPLOYEES 表的属性和数据。

笔记:

如果您不浏览 HR 模式,请参阅教程:使用 SQL Developer 查看 HR 模式对象,然后返回到本教程。

查看 EMPLOYEES 表的属性和数据:

  1. Connections框架中,展开Tables

    在表,将显示 HR 模式中的表的列表。

  2. 选择表EMPLOYEES

    在Oracle SQL Developer窗口右侧框架的“列”窗格中,将显示该表的所有列的列表。每列的右侧是其属性——名称、数据类型等。 (要查看所有列属性,请将水平滚动条向右移动。)

  3. 在右侧框架中,单击“数据”选项卡。

    将出现“数据”窗格,显示该表中所有记录的编号列表。 (要查看更多记录,请向下移动垂直滚动条。要查看更多记录列,请向右移动水平滚动条。)

  4. 在右侧框架中,单击“约束”选项卡。

    将出现“约束”窗格,其中显示该表上的所有约束的列表。每个约束的右侧是其属性 - 名称、类型、搜索条件等。 (要查看所有约束属性,请将水平滚动条向右移动。)

  5. 通过单击相应的选项卡探索其他属性。

    要查看用于创建 EMPLOYEES 表的 SQL 语句,请单击SQL选项卡。 SQL 语句出现在名为EMPLOYEES的窗格中。要关闭此窗格,请单击名称EMPLOYEES右侧的x


参见:

Oracle SQL Developer 用户指南有关 SQL Developer 用户界面的更多信息

父主题: 使用 SQL Developer 探索 Oracle 数据库

2.6选择表格数据

笔记:

要学习本节中的教程和示例,您必须以用户 HR 身份从 SQL Developer 连接到 Oracle 数据库。有关说明,请参阅从 SQL Developer 以用户 HR 身份连接到 Oracle 数据库

  • 关于查询 查询
    SQL SELECT语句)从一个或多个表或视图中选择数据。
  • 在 SQL Developer 中运行查询
    本节介绍如何使用工作表在 SQL Developer 中运行查询。
  • 教程:选择表的所有列
    本教程演示如何选择 EMPLOYEES 表的所有列。
  • 教程:选择表的特定列
    本教程演示如何仅选择 EMPLOYEES 表的 FIRST_NAME、LAST_NAME 和 DEPARTMENT_ID 列。
  • 在新标题下显示选定的列
    在显示的查询结果中,默认列标题是列名称。要在新标题下显示列,请在列名称后立即指定新标题(别名)。别名会在查询期间重命名列,但不会更改其在数据库中的名称。
  • 选择满足指定条件的数据
    要仅选择与指定条件匹配的数据,请SELECT语句中包含WHERE子句。
  • 对选定数据进行排序
    显示查询结果时,记录可以按任何顺序排列,除非您使用ORDER BY子句指定记录顺序。
  • 从多个表中选择数据
    要从多个表中选择数据,可以使用称为联接的查询。连接中的表必须至少共享一个列名。
  • 在查询中使用运算符和函数
    查询的select_list可以包含 SQL表达式,其中可以包含 SQL 运算符和 SQL 函数。这些运算符和函数可以将表数据作为操作数和参数。 SQL 表达式将被计算,并且它们的值将出现在查询结果中。

父主题: 连接到 Oracle 数据库并探索它

2.6.1关于查询

查询或 SQL SELECT语句从一个或多个表视图中选择数据。

最简单的查询形式具有以下语法:

从源列表选择选择列表


select_list指定要从中选择数据的列,source_list指定包含这些列表或视图。

嵌套在另一个 SQL 语句中的查询称为子查询

在 SQL*Plus 环境中,您可以在SQL>迅速的。

在 SQL Developer 环境中,您可以在工作表中输入查询(或任何其他 SQL 语句)。

笔记:

显示查询结果时,记录可以按任何顺序排列,除非您使用ORDER BY子句指定记录的顺序。有关详细信息,请参阅对选定数据进行排序

参见:

父主题: 选择表数据

2.6.2在 SQL Developer 中运行查询

本节介绍如何使用工作表在 SQL Developer 中运行查询。

笔记:

工作表不仅限于查询;您可以使用它来运行任何 SQL 语句。

要在 SQL Developer 中运行查询:

  1. 如果 SQL Developer 的右框架显示hr_conn窗格:

    1. 如果“工作表”子窗格未显示,请单击“工作表”选项卡。

    2. 转到步骤 4

  2. 单击“SQL 工作表”图标

  3. 如果选择连接窗口打开:

    1. 如果“连接”字段没有值hr_conn,请从菜单中选择该值。

    2. 单击“确定”

    将出现一个窗格,其中包含一个标记为hr_conn的选项卡和两个子窗格:WorksheetQuery Builder。在工作表中,您可以输入 SQL 语句。

  4. 工作表中,键入查询(SELECT语句)。

  5. 单击图标“运行语句”

    查询运行。在工作表,出现查询结果窗格,显示查询结果。

  6. 在hr_conn选项卡下,单击图标Clear

    查询消失,您可以在工作表中输入另一个 SQL 语句。当您运行另一个 SQL 语句时,其结果将显示在“查询结果”窗格中,替换先前运行的 SQL 语句的结果。

参见:

Oracle SQL Developer 用户指南,了解有关在 SQL Developer 中 使用工作表的信息

父主题: 选择表数据

2.6.3教程:选择表的所有列

本教程演示如何选择 EMPLOYEES 表的所有列。

要选择 EMPLOYEES 表的所有列:

  1. 如果存在带有hr_conn选项卡的窗格,请选择它。否则,单击“SQL 工作表”图标,如在 SQL Developer 中运行查询中所示。
  2. 工作表中,输入以下查询:

    SELECT * FROM EMPLOYEES;

  3. 单击图标“运行语句”

    查询运行。在Worksheet,将出现Query Result窗格,其中显示 EMPLOYEES 表的所有列。

警告:

在包含存储敏感数据(例如密码或信用卡信息)的列的表上 使用SELECT *时要非常小心。

参见:

教程:使用 SQL Developer 查看 EMPLOYEES 表属性和数据,了解有关使用 SQL Developer 查看表数据的另一种方法的信息

父主题: 选择表数据

2.6.4教程:选择表的特定列

本教程演示如何仅选择 EMPLOYEES 表的 FIRST_NAME、LAST_NAME 和 DEPARTMENT_ID 列。

仅选择 FIRST_NAME、LAST_NAME 和 DEPARTMENT_ID:

  1. 如果存在带有hr_conn选项卡的窗格,请选择它。否则,单击“SQL 工作表”图标,如在 SQL Developer 中运行查询中所示。
  2. 如果“工作表”窗格包含查询,请通过单击“清除”图标清除该查询。
  3. 工作表中,输入以下查询:

    SELECT FIRST_NAME, LAST_NAME, DEPARTMENT_ID FROM EMPLOYEES;

  4. 单击图标“运行语句”

    查询运行。在Worksheet,出现Query Result窗格,显示查询结果,类似于:

    FIRST_NAME LAST_NAME DEPARTMENT_ID -------------------- ------------------------- ----- -------- 唐纳德·奥康奈尔 50 道格拉斯·格兰特 50 詹妮弗惠伦 10 迈克尔·哈特斯坦 20 帕特费伊 20 苏珊·马夫里斯 40 赫尔曼·贝尔 70 雪莱希金斯 110 威廉·吉茨 110 史蒂文·金 90 尼娜·科赫哈 90 FIRST_NAME LAST_NAME DEPARTMENT_ID -------------------- ------------------------- ----- -------- 莱克斯·德哈恩 90 ... 凯文·菲尼 50 已选择 107 行。


父主题: 选择表数据

2.6.5在新标题下显示选定的列

在显示的查询结果中,默认的列标题是列名称。要在新标题下显示列,请在列名称后立即指定新标题(别名)。别名会在查询期间重命名列,但不会更改其在数据库中的名称。

示例 2-5中的查询选择与教程:选择表的特定列中的查询相同的列,但它还为它们指定了别名。由于别名没有用双引号括起来,因此它们以大写字母显示。

如果将列别名括在双引号中,则会保留大小写,并且别名可以包含空格,如示例 2-6中所示。

参见:

Oracle 数据库 SQL 语言参考有关SELECT语句的更多信息,包括列别名 ( c_alias )

示例 2-5 在新标题下显示选定的列

选择 FIRST_NAME名字、LAST_NAME名字、DEPARTMENT_ID部门 来自员工;


结果类似于:

第一最后部门 -------------------- ------------------------- ----- ----- 唐纳德·奥康奈尔 50 道格拉斯·格兰特 50 詹妮弗惠伦 10 迈克尔·哈特斯坦 20 帕特费伊 20 苏珊·马夫里斯 40 赫尔曼·贝尔 70 雪莱希金斯 110 威廉·吉茨 110 史蒂文·金 90 尼娜·科赫哈 90 第一最后部门 -------------------- ------------------------- ----- ----- 莱克斯·德哈恩 90 ... 凯文·菲尼 50 已选择 107 行。


示例 2-6 保留大小写并在列别名中包含空格

选择 FIRST_NAME “名字”、LAST_NAME “姓氏” 来自员工;


结果类似于:

名字 姓氏 -------------------- ------------------------- 唐纳德·奥康奈尔 道格拉斯·格兰特 詹妮弗·惠伦 迈克尔·哈特斯坦 帕特·费伊 苏珊·马夫里斯 赫尔曼·贝尔 雪莱·希金斯 威廉·吉茨 史蒂文·金 尼娜·科赫哈 名字 姓氏 -------------------- ------------------------- 莱克斯·德哈恩 ... 凯文·菲尼 已选择 107 行。


父主题: 选择表数据

2.6.6选择满足指定条件的数据

要仅选择与指定条件匹配的数据,请SELECT语句中包含WHERE子句。

WHERE子句中的条件可以是任何 SQL 条件(有关 SQL 条件的信息,请参阅Oracle 数据库 SQL 语言参考)。

示例 2-7中的查询仅选择部门 90 中员工的数据。

要仅选择部门 100、110 和 120 中的员工的数据,请使用以下WHERE子句:

哪里 DEPARTMENT_ID IN (100, 110, 120);


示例2-8中的查询仅选择姓氏以“Ma”开头的员工的数据。

要仅选择姓氏包含“ma”的员工的数据,请使用以下WHERE子句:

WHERE LAST_NAME LIKE '%ma%';


示例 2-9中的查询测试两个条件:工资是否至少为 11000,以及佣金百分比是否不为空。

参见:

示例 2-7 从一个部门选择数据

选择 FIRST_NAME、LAST_NAME、DEPARTMENT_ID 来自员工 其中 DEPARTMENT_ID = 90


结果类似于:

FIRST_NAME LAST_NAME DEPARTMENT_ID -------------------- ------------------------- ----- -------- 史蒂文·金 90 尼娜·科赫哈 90 莱克斯·德哈恩 90


已选择 3 行。


示例 2-8 选择以相同子字符串开头的姓氏数据

选择FIRST_NAME、LAST_NAME 来自员工 WHERE LAST_NAME LIKE 'Ma%'


结果类似于:

FIRST_NAME LAST_NAME -------------------- ------------------------- 贾森·马林 史蒂文·马克尔 詹姆斯·马洛 马蒂亚·马文斯 兰德尔·马托斯 苏珊·马夫里斯 已选择 6 行。


示例 2-9 选择满足两个条件的数据

选择 FIRST_NAME、LAST_NAME、SALARY、COMMISSION_PCT“%” 来自员工 WHERE (SALARY >= 11000) AND (COMMISSION_PCT IS NOT NULL) ;


结果类似于:

FIRST_NAME LAST_NAME 工资% -------------------- ------------------------- ----- ----- ---------- 约翰·拉塞尔 14000 .4 凯伦合伙人 13500 .3 阿尔贝托·埃拉苏里斯 12000 .3 杰拉尔德·坎布罗 11000 .3 丽莎奥泽 11500 .25 艾伦·阿贝尔 11000 .3 已选择 6 行。


父主题: 选择表数据

2.6.7对选定数据进行排序

显示查询结果时,记录可以按任何顺序排列,除非您使用ORDER BY子句指定记录的顺序。

示例2-10中的查询结果LAST_NAME按 升序(默认) 排序。

或者,在 SQL Developer 中,您可以省略ORDER BY子句并双击要排序的列的名称。

排序标准不需要包含在选择列表中,如示例 2-11所示。

参见:

Oracle 数据库 SQL 语言参考有关SELECT语句(包括ORDER BY子句)

示例 2-10 按 LAST_NAME 对所选数据进行排序

选择FIRST_NAME、LAST_NAME、HIRE_DATE 来自员工 按姓氏排序


结果:

FIRST_NAME LAST_NAME HIRE_DATE -------------------- ------------------------- ----- ---- 埃伦·阿贝尔 2004 年 5 月 11 日 桑达尔·安德 2008 年 3 月 24 日 莫哲·阿特金森 30-OCT-05 大卫·奥斯汀 2005 年 6 月 25 日 赫尔曼·贝尔 07-JUN-02 雪莉·拜达 24-DEC-05 阿米特·班达 21-APR-08 伊丽莎白·贝茨 2007 年 3 月 24 日 ... FIRST_NAME LAST_NAME HIRE_DATE -------------------- ------------------------- ----- ---- 何塞·曼努埃尔·乌尔曼 07-MAR-06 彼得·巴尔加斯 2006 年 7 月 9 日 克拉拉·维什尼 2005 年 11 月 11 日 尚塔·沃尔曼 2005 年 10 月 10 日 阿兰娜·沃尔什 2006 年 4 月 24 日 马修·韦斯 2004 年 7 月 18 日 詹妮弗·惠伦 2003 年 9 月 17 日 埃莱妮·兹洛特基 2008 年 1 月 29 日 已选择 107 行


示例 2-11 按未选定的列对选定的数据进行排序

选择FIRST_NAME,HIRE_DATE 来自员工 按姓氏排序


结果:

FIRST_NAME HIRE_DATE -------------------- --------- 艾伦 2004 年 5 月 11 日 桑达尔 2008 年 3 月 24 日 莫哲 2005 年 10 月 30 日 大卫 25-JUN-05 赫尔曼 07-JUN-02 谢利 24-DEC-05 阿米特 21-APR-08 伊丽莎白 2007 年 3 月 24 日 ... FIRST_NAME HIRE_DATE -------------------- --------- 何塞·曼努埃尔 07-MAR-06 彼得 06 年 7 月 9 日 克拉拉 11-NOV-05 尚塔 2005 年 10 月 10 日 阿拉娜 24-APR-06 马太福音 2004 年 7 月 18 日 詹妮弗 17-SEP-03 埃莱妮 2008 年 1 月 29 日 已选择 107 行。


父主题: 选择表数据

2.6.8从多个表中选择数据

要从多个表中选择数据,您可以使用称为join 的查询。连接中的表必须至少共享一个列名。

假设您要选择每个员工的 FIRST_NAME、LAST_NAME 和 DEPARTMENT_NAME。 FIRST_NAME 和 LAST_NAME 位于 EMPLOYEES 表中,DEPARTMENT_NAME 位于 DEPARTMENTS 表中。两个表都有 DEPARTMENT_ID。您可以使用示例 2-12中的查询

对于仅出现在联接的一个表中的列名,表名限定符是可选的,但对于同时出现在两个表中的列名来说,表名限定符是必需的。以下查询等效于示例 2-12中的查询:

SELECT FIRST_NAME “名字”、 LAST_NAME “姓氏”、 DEPARTMENT_NAME “部门名称” 来自员工、部门 其中 EMPLOYEES.DEPARTMENT_ID = DEPARTMENTS.DEPARTMENT_ID 按 DEPARTMENT_NAME、LAST_NAME 排序;


为了使使用限定列名的查询更具可读性,请使用表别名,如下例所示:

选择FIRST_NAME“第一”, LAST_NAME“最后”, DEPARTMENT_NAME“部门名称” 来自员工 e部门 d, 其中e.DEPARTMENT_ID = d.DEPARTMENT_ID 按 d.DEPARTMENT_NAME、e.LAST_NAME 排序;


尽管您在FROM子句中创建别名,但您可以在查询的早期使用它们,如下例所示:

SELECT e.FIRST_NAME “名字”、 e.LAST_NAME “姓氏”、 d.DEPARTMENT_NAME “部门名称” 来自员工 e,部门 d 其中 e.DEPARTMENT_ID = d.DEPARTMENT_ID 按 d.DEPARTMENT_NAME、e.LAST_NAME 排序;


参见:

Oracle 数据库 SQL 语言参考了解有关联接的更多信息

示例 2-12 从两个表中选择数据(连接两个表)

选择 EMPLOYEES.FIRST_NAME“第一”, EMPLOYEES.LAST_NAME“最后”, DEPARTMENTS.DEPARTMENT_NAME "部门名称" 来自员工、部门 其中 EMPLOYEES.DEPARTMENT_ID = DEPARTMENTS.DEPARTMENT_ID 按 DEPARTMENTS.DEPARTMENT_NAME、EMPLOYEES.LAST_NAME 排序;


结果:

部门名称 -------------------- ------------------------- ----- ------------------------ 威廉·吉茨会计 雪莱希金斯会计 詹妮弗·惠伦政府 莱克斯·德哈恩行政人员 史蒂文·金 执行官 尼娜·科赫哈 执行官 陈约翰财经 ... 何塞·曼努埃尔·乌尔曼金融 苏珊·马夫里斯人力资源 大卫·奥斯汀 IT ... 瓦利·帕塔巴拉 IT 帕特·费伊营销 迈克尔·哈特斯坦营销 赫尔曼贝尔公共关系 雪利百达采购 ... 西格尔·托比亚斯 采购 埃伦·阿贝尔·赛尔斯 ... 埃莱妮·兹洛特基销售 莫哲阿特金森航运 ... 马修·韦斯航运 已选择 106 行。


父主题: 选择表数据

2.6.9在查询中使用运算符和函数

查询的 select_list 可以包含 SQL 表达式,其中可以包含 SQL 运算符和 SQL函数这些运算符和函数可以将表数据作为操作数和参数。 SQL 表达式将被计算,并且它们的值将出现在查询结果中。

  • 在查询中使用算术运算符
    基本算术运算符 — +(加法)、-(减法)、*(乘法)和 /(除法)— 对列值进行运算。
  • 在查询中使用数字函数
    数字函数接受数字输入并返回数字值。每个数值函数都会为计算的每一行返回一个值。
  • 在查询中使用串联运算符
    串联运算符 ( ||) 通过将第二个字符串附加到第一个字符串,将两个字符串合并为一个字符串。例如,'a'||'b'='ab'。您可以使用此运算符来组合查询结果同一列中两列或表达式的信息。
  • 在查询中使用字符函数
    字符函数接受字符输入。大多数返回字符值,但有些返回数字值。每个字符函数为计算的每一行返回一个值。
  • 在查询中使用日期时间函数
    日期时间函数对DATE、时间戳和间隔值进行操作。每个日期时间函数为计算的每一行返回一个值。
  • 在查询中使用转换函数
    转换函数将一种数据类型转换为另一种数据类型。
  • 在查询中使用聚合函数
    聚合函数接受一组行并返回单个结果行。行组可以是整个表或视图。
  • 在查询中使用 NULL 相关函数NULL
    相关函数有助于处理NULL值。
  • 在查询中使用 CASE 表达式
    CASE表达式允许您在 SQL 语句中使用IF ... THEN ... ELSE逻辑而无需调用子程序。CASE表达式有两种:简单的和搜索的。
  • 在查询中使用 DECODE 函数DECODE
    函数将表达式与多个搜索值进行比较。只要表达式的值与搜索值匹配,DECODE就会返回与该搜索值关联的结果。如果DECODE找不到匹配项,则返回默认值(如果指定)或NULL(如果未指定默认值)。

参见:

父主题: 选择表数据

2.6.9.1在查询中使用算术运算符

基本算术运算符——+(加法)、-(减法)、*(乘法)和/(除法)——对列值进行运算。

示例 2-13中的查询按 SALARY 降序显示部门 90 中每个员工的 LAST_NAME、SALARY(月薪)和年薪。

示例 2-13 在查询中使用算术表达式

选择 LAST_NAME, 工资“月薪”, 工资* 12 “年薪” 来自员工 其中 DEPARTMENT_ID = 90 按薪资说明排序;


结果:

LAST_NAME 月薪 年薪 ------------------------ ----------- ---------- 国王 24000 288000 德哈恩 17000 204000 科赫哈尔 17000 204000


父主题: 在查询中使用运算符和函数

2.6.9.2在查询中使用数字函数

数字函数接受数字输入并返回数字值。每个数值函数都会为计算的每一行返回一个值。

Oracle 数据库 SQL 语言参考中列出并描述了 SQL 支持的数值函数

示例 2-14中的查询使用数字函数ROUND显示部门 100 中每个员工的每日工资,四舍五入到最接近的美分。

示例 2-15中的查询使用数字函数TRUNC来显示部门 100 中每个员工的每日工资(截断为最接近的美元)。

参见:

Oracle 数据库 SQL 语言参考有关 SQL 数值函数的更多信息

示例 2-14 对数值数据进行舍入

SELECT LAST_NAME, ROUND (((SALARY * 12)/365), 2) “每日工资” 来自员工 其中 DEPARTMENT_ID = 100 按姓氏排序;


结果:

LAST_NAME每日工资 ------------------------ ---------- 陈269.59 最爱 295.89 格林伯格 394.52 波普 226.85 夏拉 253.15 乌尔曼 256.44 已选择 6 行。


示例 2-15 截断数值数据

SELECT LAST_NAME, TRUNC ((SALARY * 12)/365) “每日工资” 来自员工 其中 DEPARTMENT_ID = 100 按姓氏排序;


结果:

LAST_NAME每日工资 ------------------------ ---------- 陈269 最爱 295 格林伯格 394 波普 226 夏拉 253 乌尔曼256 已选择 6 行。


父主题: 在查询中使用运算符和函数

2.6.9.3在查询中使用串联运算符

连接运算符 ( ||) 通过将第二个字符串附加到第一个字符串,将两个字符串合并为一个字符串。例如,'a'||'b'='ab'。您可以使用此运算符来组合查询结果同一列中两列或表达式的信息。

示例 2-16中的查询将每个选定员工的名字、空格和姓氏连接起来。

参见:

Oracle 数据库 SQL 语言参考了解有关串联运算符的更多信息

示例 2-16 连接字符数据

选择名字 || ' ' || LAST_NAME “姓名” 来自员工 其中 DEPARTMENT_ID = 100 按姓氏排序;


结果:

姓名 ---------------------------------------------------------- 约翰·陈 丹尼尔·法维特 南希·格林伯格 路易斯·波普 伊斯梅尔·夏拉 何塞·曼努埃尔·乌尔曼 已选择 6 行。


父主题: 在查询中使用运算符和函数

2.6.9.4在查询中使用字符函数

字符函数接受字符输入。大多数返回字符值,但有些返回数字值。每个字符函数为计算的每一行返回一个值。

Oracle 数据库 SQL 语言参考中列出并描述了 SQL 支持的字符函数

函数UPPERINITCAPLOWER分别以大写、首字母大写和小写显示其字符参数。

示例 2-17中的查询以大写形式显示 LAST_NAME,以大写形式显示第一个字符的 FIRST_NAME,所有其他字符以小写形式显示,以及以小写形式显示 EMAIL。

参见:

Oracle 数据库 SQL 语言参考有关 SQL 字符函数的更多信息

示例 2-17 更改字符数据的大小写

SELECT UPPER(LAST_NAME) “姓氏”、 INITCAP(FIRST_NAME) “名字”、 LOWER(EMAIL) “电子邮件” 来自员工 其中 DEPARTMENT_ID = 100 通过电子邮件订购;


结果:

最后一封电子邮件 ---------------------------------- -------------------- ----- -------------------- 丹尼尔·德法维特 西亚拉 伊斯梅尔·伊斯西亚拉 陈约翰 乌尔曼·何塞·曼努埃尔·杰穆尔曼 路易斯·波普·波普 格林伯格 南希·恩格林贝 已选择 6 行。


父主题: 在查询中使用运算符和函数

2.6.9.5在查询中使用日期时间函数

日期时间函数对DATE、时间戳和间隔值进行操作。每个日期时间函数为计算的每一行返回一个值。

Oracle 数据库 SQL 语言参考中列出并描述了 SQL 支持的日期时间函数

对于每个DATE和时间戳值,Oracle 数据库存储以下信息:

  • 日期

  • 小时

  • 分钟

  • 第二

    对于每个时间戳值,Oracle 数据库还存储秒的小数部分,您可以指定其精度。同时存储区,使用 数据类型TIMESTAMPWITHTIMEZONE TIMESTAMPWITHLOCALTIMEZONE 

有关DATE数据类型的更多信息,请参阅Oracle 数据库 SQL 语言参考

有关TIMESTAMP数据类型的更多信息,请参阅Oracle 数据库 SQL 语言参考

有关其他时间戳数据类型和间隔数据类型的信息,请参阅Oracle 数据库 SQL 语言参考

示例 2-18中的查询使用EXTRACTSYSDATE函数来显示部门 100 中每个员工的工作年限。SYSDATE函数将系统时钟的当前日期作为DATE值返回。有关SYSDATE函数的更多信息,请参阅Oracle 数据库 SQL 语言参考。有关EXTRACT函数的信息,请参阅Oracle 数据库 SQL 语言参考

例2-19中的查询使用SYSTIMESTAMP函数来显示当前系统日期和时间。SYSTIMESTAMP函数返回TIMESTAMP值。有关SYSTIMESTAMP函数的信息,请参阅Oracle 数据库 SQL 语言参考

查询的FROM子句中的表DUAL是 Oracle 数据库与数据字典一起自动创建的单行表。当您想要使用SELECT语句计算常量表达式时,请从DUAL中选择。由于DUAL只有一行,因此该常量仅返回一次。有关从DUAL中进行选择的更多信息,请参阅Oracle 数据库 SQL 语言参考

参见:

Oracle 数据库 SQL 语言参考有关 SQL 日期时间函数的更多信息

示例 2-18 显示日期之间的年数

SELECT LAST_NAME, (EXTRACT(YEAR FROM SYSDATE) - EXTRACT(YEAR FROM HIRE_DATE)) "工作年数" 来自员工 其中 DEPARTMENT_ID = 100 按“工作年限”排序;


结果:

LAST_NAME 工作年数 ------------------------ -------------- 波普 5 乌尔曼 6 陈7 夏拉 7 格林伯格 10 最爱 10 已选择 6 行。


示例 2-19 显示系统日期和时间

选择提取(来自系统时间戳的小时)|| ':' || 提取(系统时间戳中的分钟)|| ':' || 回合(提取(系统时间戳中的第二个),0)|| ', ' || 提取(系统时间戳中的月份)|| '/' || 提取(SYSTIMESTAMP 中的日期)|| '/' || EXTRACT(YEAR FROM SYSTIMESTAMP)“系统时间和日期” 来自双;


结果取决于当前SYSTIMESTAMP值,但格式如下:

系统时间和日期 -------------------------------------------------- ----------------- 18:17:53, 12/27/2012


父主题: 在查询中使用运算符和函数

2.6.9.6在查询中使用转换函数

转换函数将一种数据类型转换为另一种数据类型。

Oracle 数据库 SQL 语言参考中列出并描述了 SQL 支持的转换函数

示例 2-20中的查询使用TO_CHAR函数将 HIRE_DATE 值( DATE类型)转换为格式为 的字符值FMMonth DD YYYYFM删除月份名称中的前导和尾随空格。是日期时间格式模型FMMonth DD YYYY的示例。有关日期时间格式模型的信息,请参阅Oracle 数据库 SQL 语言参考

示例 2-21中的查询使用TO_NUMBER函数将 POSTAL_CODE 值(类型为VARCHAR2)转换为NUMBER类型的值,并在计算中使用。

参见:

示例 2-20 使用格式模板将日期转换为字符

选择 LAST_NAME, 雇用_日期, TO_CHAR(HIRE_DATE, 'FMMonth DD YYYY') "开始日期" 来自员工 其中 DEPARTMENT_ID = 100 按姓氏排序;


结果:

LAST_NAME HIRE_DATE 开始日期 -------------------------------------------------------------------------------------------------- - 陈 28-SEP-05 2005 年 9 月 28 日 法维特 16-AUG-02 2002 年 8 月 16 日 格林伯格 17-AUG-02 2002 年 8 月 17 日 波普 07-DEC-07 2007 年 12 月 7 日 夏拉 30-SEP-05 2005 年 9 月 30 日 乌尔曼 07-MAR-06 三月 7 2006 已选择 6 行。


示例 2-21 将字符转换为数字

选择城市, POSTAL_CODE "旧代码", TO_NUMBER(POSTAL_CODE) + 1 “新代码” 从地点 其中 COUNTRY_ID = '美国' 按邮政编码订购;


结果:

CITY 旧代码 新代码 ------------------------------ ------------ -------- -- 南湖 26192 26193 南不伦瑞克 50090 50091 西雅图 98199 98200 南旧金山 99236 99237 已选择 4 行。


父主题: 在查询中使用运算符和函数

2.6.9.7在查询中使用聚合函数

聚合函数接受一组行并返回单个结果行。行组可以是整个表或视图。

Oracle 数据库 SQL 语言参考中列出并描述了 SQL 支持的聚合函数

聚合函数与GROUP BY子句一起使用时尤其强大,该子句按一列或多列对查询结果进行分组,并为每个组提供一个结果。

示例 2-22中的查询使用COUNT函数和GROUP BY子句来显示向每个经理报告的人数。通配符*代表整个记录。

示例 2-22显示一名员工不向经理报告。以下查询选择该员工的名字、姓氏和职位:

列 FIRST_NAME 格式 A10; 列姓氏格式 A10; 列作业_标题格式 A10; 选择e.FIRST_NAME, e.LAST_NAME, j.JOB_TITLE 来自员工 e、工作 j 其中 e.JOB_ID = j.JOB_ID 并且MANAGER_ID 为 NULL


结果:

FIRST_NAME LAST_NAME JOB_TITLE ---------- ---------- ---------- 史蒂文·金 总统


要使查询仅返回聚合值满足指定条件的行,请在查询的 HAVING子句中使用聚合函数。

示例 2-23中的查询显示每个部门每年在工资上花费的金额,但仅限于该金额超过 1,000,000 美元的部门。

示例 2-24中的查询使用多个聚合函数来显示每个 JOB_ID 的工资统计信息。

参见:

Oracle 数据库 SQL 语言参考有关 SQL 聚合函数的更多信息

示例 2-22 计算每组中的行数

SELECT MANAGER_ID "经理", COUNT(*) "报告数量" 来自员工 按 MANAGER_ID 分组 按 MANAGER_ID 排序;


结果:

经理报告数量 ---------- ----------------- 100 14 101 5 102 1 103 4 108 5 114 5 120 8 121 8 122 8 123 8 124 8 145 6 146 6 147 6 148 6 149 6 201 1 205 1 1 已选择 19 行。


示例 2-23 将聚合函数限制为满足条件的行

选择 DEPARTMENT_ID“部门”, SUM(SALARY*12) "所有工资" 来自员工 总和(工资 * 12) >= 1000000 按 DEPARTMENT_ID 分组;


结果:

部门所有薪资 ---------- ------------ 50 1876800 80 3654000


示例 2-24 使用聚合函数获取统计信息

SELECT JOB_ID, COUNT(*) "#", MIN(SALARY) "最低", ROUND(AVG(SALARY), 0) "平均", MEDIAN(SALARY) "中位数", MAX(SALARY) "最高", ROUND( STDDEV(工资)) “标准差” 来自员工 按 JOB_ID 分组 按 JOB_ID 排序


结果:

JOB_ID # 最小平均中值最大标准差 ---------- ---------- ---------- ---------- ---------- ---------- ---------- AC_帐户 1 8300 8300 8300 8300 0 AC_MGR 1 12008 12008 12008 12008 0 AD_ASST 1 4400 4400 4400 4400 0 AD_PRES 1 24000 24000 24000 24000 0 AD_VP 2 17000 17000 17000 17000 0 FI_帐户 5 6900 7920 7800 9000 766 FI_MGR 1 12008 12008 12008 12008 0 HR_REP 1 6500 6500 6500 6500 0 IT_PROG 5 4200 5760 4800 9000 1926 MK_MAN 1 13000 13000 13000 13000 0 MK_REP 1 6000 6000 6000 6000 0 PR_REP 1 10000 10000 10000 10000 0 PU_CLERK 5 2500 2780 2800 3100 239 PU_MAN 1 11000 11000 11000 11000 0 SA_MAN 5 10500 12200 12000 14000 1525 SA_REP 30 6100 8350 8200 11500 1524 SH_CLERK 20 2500 3215 3100 4200 548 ST_CLERK 20 2100 2785 2700 3600 453 ST_MAN 5 5800 7280 7900 8200 1066 已选择 19 行。


父主题: 在查询中使用运算符和函数

2.6.9.8在查询中使用 NULL 相关函数

NULL相关函数有助于处理NULL值。

Oracle 数据库 SQL 语言参考中列出并描述了 SQL 支持的NULL相关函数

示例 2-25中的查询返回姓氏以“B”开头的员工的姓氏和职务。如果员工没有收到佣金(即,如果 COMMISSION_PCT 为NULL),NVL函数将用“Not Applicable”替换NULL

示例 2-26中的查询使用NVL2函数返回姓氏以“B”开头的员工的姓氏、工资和收入: 如果 COMMISSION_PCT 不为NULL,则收入为工资加上佣金;如果 COMMISSION_PCT 不为 NULL ,则收入为工资加上佣金;如果 COMMISSION_PCT 为NULL,则收入仅为工资。

参见:

示例 2-25 用字符串替换 NULL 值

SELECT LAST_NAME, NVL(TO_CHAR(COMMISSION_PCT), '不适用') "COMMISSION" 来自员工 LAST_NAME 的位置类似于“B%” 按姓氏排序;


结果:

LAST_NAME 佣金 ------------------------ ------------------------ ---------------- 贝尔 不适用 百达 不适用 班达.1 贝茨.15 贝尔不适用 伯恩斯坦.25 比索 不适用 布卢姆.2 公牛 不适用 已选择 9 行。


示例 2-26 为 NULL 和 Not NULL 值指定不同的表达式

选择 LAST_NAME、SALARY、 NVL2(COMMISSION_PCT、SALARY + (SALARY * COMMISSION_PCT)、SALARY) 收入 来自 LAST_NAME 如“B%”的员工 按姓氏排序;


结果:

LAST_NAME 工资收入 ------------------------ ---------- ---------- 贝尔 10000 10000 百达 2900 2900 班达 6200 6820 贝茨 7300 8395 贝尔 4000 4000 伯恩斯坦 9500 11875 比索 3300 3300 绽放 10000 12000 公牛 4100 4100 已选择 9 行。


父主题: 在查询中使用运算符和函数

2.6.9.9在查询中使用 CASE 表达式

CASE表达式允许您在 SQL 语句中使用IF ... THEN ... ELSE逻辑,而无需调用子程序。CASE表达式有两种:简单的和搜索的。

示例 2-27中的查询使用简单的CASE表达式来显示每个国家/地区代码的国家/地区名称。

示例 2-28中的查询使用搜索的CASE表达式来显示基于与服务年限相关的日期范围的建议加薪(15%、10%、5% 或 0%)。

参见:

示例 2-27 在查询中使用简单的 CASE 表达式

选择唯一的 COUNTRY_ID ID、 CASE COUNTRY_ID WHEN 'AU' THEN '澳大利亚 ' WHEN 'BR' THEN '巴西' WHEN 'CA' THEN '加拿大' WHEN 'CH' THEN '瑞士' WHEN 'CN' THEN '中国' WHEN 'DE ' 那么'德国' 当'在'那么'印度' WHEN 'IT' THEN '意大利' WHEN 'JP' THEN '日本' WHEN 'MX' THEN '墨西哥' WHEN 'NL' THEN '荷兰' WHEN 'SG' THEN '新加坡' WHEN 'UK' THEN 'United “王国” ,当“美国”时,“美国”, 否则“未知” 结束国家 从地点 按 COUNTRY_ID 排序;


结果:

ID 国家 -- -------------- 澳大利亚 澳大利亚 BR 巴西 加拿大 加利福尼亚州 CH 瑞士 CN 中国 德国 在印度 意大利信息技术 日本太平绅士 MX 墨西哥 NL 荷兰 新加坡新加坡 英国 英国 美国 美国 已选择 14 行。


示例 2-28 在查询中使用搜索的 CASE 表达式

选择 LAST_NAME“姓名”, HIRE_DATE“开始”, 工资“工资”, 案件 WHEN HIRE_DATE < TO_DATE('03-Jan-01', 'dd-mon-yy') 然后截断(工资*1.15, 0) 当 HIRE_DATE >= TO_DATE('01-Jan-03', 'dd-mon-yy') 并且 HIRE_DATE < TO_DATE('06 年 1 月 1 日', 'dd-mon-yy') 然后截断(工资*1.10, 0) 当 HIRE_DATE >= TO_DATE('01-Jan-06', 'dd-mon-yy') 并且 HIRE_DATE < TO_DATE('07 年 1 月 1 日', 'dd-mon-yy') 然后截断(工资*1.05, 0) 其他薪资 结束“拟议薪资” 来自员工 其中 DEPARTMENT_ID = 100 按聘用日期订购;


结果:

姓名 开始薪资 建议薪资 ------------------------ --------- ---------- ------ --------- 法维特 2002 年 8 月 16 日 9000 10350 格林伯格 2008 年 8 月 17 日 12008 13809 陈 28-SEP-05 8200 9020 夏拉 2005 年 9 月 30 日 7700 8470 乌尔曼 07-MAR-06 7800 8190 波普 07-12-07 6900 6900 已选择 6 行。


父主题: 在查询中使用运算符和函数

2.6.9.10在查询中使用 DECODE 函数

DECODE函数将表达式与多个搜索值进行比较。只要表达式的值与搜索值匹配,DECODE就会返回与该搜索值关联的结果。如果DECODE找不到匹配项,则返回默认值(如果指定)或NULL(如果未指定默认值)。

示例 2-29中的查询使用DECODE函数显示三个不同工作的建议加薪。表达式为JOB_ID;搜索值为“PU_CLERK”、“SH_CLERK”和“ST_CLERK”;默认为 SALARY。

笔记:

DECODE函数的参数可以是任何 SQL 数字或字符类型。 Oracle 在比较之前会自动将表达式和每个搜索值转换为第一个搜索值的数据类型。 Oracle 自动将返回值转换为与第一个结果相同的数据类型。如果第一个结果的数据类型为CHAR或者第一个结果为NULL,则 Oracle 会将返回值转换为数据类型VARCHAR2

参见:

示例 2-29 在查询中使用 DECODE 函数

SELECT LAST_NAME, JOB_ID, SALARY, DECODE(JOB_ID, 'PU_CLERK', SALARY * 1.10, 'SH_CLERK', SALARY * 1.15, 'ST_CLERK', SALARY * 1.20, SALARY) “建议薪资” 来自员工 WHERE JOB_ID LIKE '%_CLERK' AND LAST_NAME < 'E' 按姓氏排序;


结果:

LAST_NAME JOB_ID SALARY 建议薪资 ------------------------ ---------- ---------- ----- ---------- 阿特金森 ST_CLERK 2800 3360 百达PU_CLERK 2900 3190 贝尔 SH_CLERK 4000 4600 比索 ST_CLERK 3300 3960 公牛 SH_CLERK 4100 4715 敞篷车 SH_CLERK 3000 3450 钟SH_CLERK 3800 4370 科尔梅纳雷斯 PU_CLERK 2500 2750 戴维斯 ST_CLERK 3100 3720 德林格 SH_CLERK 3400 3910 迪莉 SH_CLERK 3600 4140 已选择 11 行。

文章转载自胡飞,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论