Student Guide SQL Fundamentals

User Manual:

Open the PDF directly: View PDF PDF.
Page Count: 838

DownloadStudent Guide SQL Fundamentals
Open PDF In BrowserView PDF
Student Guide
X95174GC10
Edition 1.0 | May 2016

Learn more from Oracle University at oracle.com/education/

Oracle University Student Learning Subscription Use Only

SQL Fundamentals

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Apoorva Srinivas

Disclaimer

Puja Singh

This document contains proprietary information and is protected by copyright and other intellectual
property laws. You may copy and print this document solely for your own use in an Oracle training
course. The document may not be modified or altered in any way. Except where your use
constitutes "fair use" under copyright law, you may not use, share, download, upload, copy, print,
display, perform, reproduce, publish, license, post, transmit, or distribute this document in whole or
in part without the express authorization of Oracle.

Technical Contributors and
Reviewers
Nancy Greenberg
Suresh Rajan
Satyajit Ranganathan
Gururaj Bs
Editors
Chandrika Kennedy
Vijayalakshmi Narasimhan
Raj Kumar
Graphic Editors
Kavya Bellur
Prakash Dharmalingam
Maheshwari Krishnamurthy
Publishers
Pavithran Adka
Asief Baig

The information contained in this document is subject to change without notice. If you find any
problems in the document, please report them in writing to: Oracle University, 500 Oracle Parkway,
Redwood Shores, California 94065 USA. This document is not warranted to be error-free.
Restricted Rights Notice
If this documentation is delivered to the United States Government or anyone using the
documentation on behalf of the United States Government, the following notice is applicable:
U.S. GOVERNMENT RIGHTS
The U.S. Government’s rights to use, modify, reproduce, release, perform, display, or disclose
these training materials are restricted by the terms of the applicable Oracle license agreement
and/or the applicable U.S. Government contract.
Trademark Notice
Oracle and Java are registered trademarks of Oracle and/or its affiliates. Other names may be
trademarks of their respective owners.

Oracle University Student Learning Subscription Use Only

Authors

1

Introduction
Lesson Objectives 1-2
Lesson Agenda 1-3
Course Objectives 1-4
Lesson Agenda 1-5
Course Roadmap 1-6
Lesson Agenda 1-12
Introduction to Oracle Cloud 1-13
Oracle Cloud Services 1-14
Database on Oracle Cloud 1-15
Lesson Agenda 1-16
Oracle Database Documentation 1-17
Additional Resources 1-18
Summary 1-19

2

Relational Database Overview
Course Roadmap 2-2
Objectives 2-3
Lesson Agenda 2-4
Database: Definition 2-5
Data Storage on Different Media 2-6
Database Management System (DBMS) 2-7
Why Do I Need a Database Solution? 2-8
Examples of Databases 2-9
Lesson Agenda 2-10
Oracle Database 12c: Focus Areas 2-11
Oracle Database 12c 2-12
Lesson Agenda 2-14
Relational and Object Relational Database Management Systems 2-15
Relational Database Concept 2-16
Definition of a Relational Database 2-17
Data Models 2-18
Entity Relationship Model 2-19
Entity Relationship Modeling Conventions 2-20

iii

Oracle University Student Learning Subscription Use Only

Contents

3

Database Storage Structures
Course Roadmap 3-2
Objectives 3-3
Lesson Agenda 3-4
Database Data Storage 3-5
Lesson Agenda 3-6
Introduction to Logical Structures 3-7
Data Blocks 3-8
Extents 3-9
Segments 3-10
Tablespaces 3-11
Lesson Agenda 3-12
Introduction to Physical Storage Structures 3-13
Data Files 3-14
Control Files 3-15
Online Redo Log Files 3-16
Lesson Agenda 3-17
Relational Tables 3-18
Quiz 3-19
Summary 3-21
Practice 3: Overview 3-22

4

Introduction to SQL
Course Roadmap 4-2
Objectives 4-3
Lesson Agenda 4-4
Using SQL to Query Your Database 4-5

iv

Oracle University Student Learning Subscription Use Only

Relating Multiple Tables 2-22
Relational Database Terminology 2-23
Advantages of a Relational Database 2-24
Lesson Agenda 2-25
OLTP Versus OLAP 2-26
SQL Database Versus NoSQL Database 2-27
Multitenant Architecture 2-28
Introduction to Oracle Cloud 2-29
Oracle Cloud Services 2-30
Database on Oracle Cloud 2-31
Quiz 2-32
Summary 2-33
Practice 2: Overview 2-34

5

Retrieving Data Using the SQL SELECT Statement
Course Roadmap 5-2
Objectives 5-3
Lesson Agenda 5-4
Basic SELECT Statement 5-5
Selecting All Columns 5-6
Selecting Specific Columns 5-7
Writing SQL Statements 5-8
Column Heading Defaults for Output 5-9
Lesson Agenda 5-10
Arithmetic Expressions 5-11
Using Arithmetic Operators 5-12
Operator Precedence 5-13
Defining a Null Value 5-14
Lesson Agenda 5-15
Defining a Column Alias 5-16
Using Column Aliases 5-17
Lesson Agenda 5-18
Concatenation Operator 5-19
Literal Character Strings 5-20

v

Oracle University Student Learning Subscription Use Only

SQL Statements Used in the Course 4-6
Lesson Agenda 4-7
Introduction to PL/SQL 4-8
Lesson Agenda 4-9
Human Resources (HR) Schema for This Course 4-10
Tables Used in the Course 4-11
Academic (AD) Schema 4-12
Class Account Information 4-14
Course Environment 4-15
Lesson Agenda 4-16
SQL Development Environments 4-17
What Is Oracle SQL Developer? 4-18
Specifications of SQL Developer 4-19
SQL Developer 4.1.3 Interface 4-20
Creating a Database Connection 4-22
Coding SQL in SQL*Plus 4-23
Creating a Connection to Database on Oracle Cloud 4-24
Quiz 4-25
Summary 4-26
Practice 4: Overview 4-27

6

Restricting and Sorting Data
Course Roadmap 6-2
Objectives 6-3
Lesson Agenda 6-4
Limiting Rows by Using a Selection 6-5
Limiting Rows That Are Selected 6-6
Using the WHERE Clause 6-7
Character Strings and Dates 6-8
Comparison Operators 6-9
Using Comparison Operators 6-10
Range Conditions Using the BETWEEN Operator 6-11
Using the IN Operator 6-12
Pattern Matching Using the LIKE Operator 6-13
Combining Wildcard Characters 6-14
Using NULL Conditions 6-15
Defining Conditions Using Logical Operators 6-16
Using the AND Operator 6-17
Using the OR Operator 6-18
Using the NOT Operator 6-19
Lesson Agenda 6-20
Rules of Precedence 6-21
Lesson Agenda 6-23
Using the ORDER BY Clause 6-24
Sorting 6-25
Lesson Agenda 6-27
Using SQL Row Limiting Clause in a Query 6-28
SQL Row Limiting Clause: Example 6-29
Lesson Agenda 6-30
Substitution Variables 6-31
Using the Single-Ampersand Substitution Variable 6-33

vi

Oracle University Student Learning Subscription Use Only

Using Literal Character Strings 5-21
Alternative Quote (q) Operator 5-22
Using the DISTINCT keyword 5-23
Using DISTINCT with Multiple Columns 5-24
Lesson Agenda 5-25
Displaying Table Structure 5-26
Using the DESCRIBE Command 5-27
Quiz 5-28
Summary 5-29
Practice 5: Overview 5-30

7

Using Single-Row Functions to Customize Output
Course Roadmap 7-2
Objectives 7-3
Lesson Agenda 7-4
SQL Functions 7-5
Two Types of SQL Functions 7-6
Single-Row Functions 7-7
Lesson Agenda 7-9
Character Functions 7-10
Case-Conversion Functions 7-12
Using Case-Conversion Functions 7-13
Character-Manipulation Functions 7-14
Using Character-Manipulation Functions 7-15
Lesson Agenda 7-16
Nesting Functions 7-17
Nesting Functions: Example 7-18
Lesson Agenda 7-19
Numeric Functions 7-20
Using the ROUND Function 7-21
Using the TRUNC Function 7-22
Using the MOD Function 7-23
Lesson Agenda 7-24
Working with Dates 7-25
RR Date Format 7-26
Using the SYSDATE Function 7-27
Using the CURRENT_DATE and CURRENT_TIMESTAMP Functions 7-28
Arithmetic with Dates 7-29
Using Arithmetic Operators with Dates 7-30
Lesson Agenda 7-31
Date-Manipulation Functions 7-32
Using Date Functions 7-33

vii

Oracle University Student Learning Subscription Use Only

Character and Date Values with Substitution Variables 6-34
Specifying Column Names, Expressions, and Text 6-35
Using the Double-Ampersand Substitution Variable 6-36
Lesson Agenda 6-37
Using the DEFINE Command 6-38
Using the VERIFY Command 6-39
Quiz 6-40
Summary 6-41
Practice 6: Overview 6-42

8

Using Conversion Functions
Course Roadmap 8-2
Objectives 8-3
Lesson Agenda 8-4
Conversion Functions 8-5
Implicit Data Type Conversion 8-6
Explicit Data Type Conversion 8-8
Lesson Agenda 8-10
Using the TO_CHAR Function with Dates 8-11
Elements of the Date Format Model 8-12
Using the TO_CHAR Function with Dates 8-15
Using the TO_CHAR Function with Numbers 8-16
Using the TO_NUMBER and TO_DATE Functions 8-19
Using the TO_CHAR and TO_DATE Functions with the RR Date Format 8-21
Lesson Agenda 8-22
General Functions 8-23
NVL Function 8-24
Using the NVL Function 8-25
Using the NVL2 Function 8-26
Using the NULLIF Function 8-27
Using the COALESCE Function 8-28
Quiz 8-30
Summary 8-32
Practice 8: Overview 8-33

9

Using Conditional Expressions
Course Roadmap 9-2
Objectives 9-3
Lesson Agenda 9-4
Conditional Expressions 9-5
CASE Expression 9-6
Using the CASE Expression 9-7
Searched CASE Expression 9-8
Lesson Agenda 9-10
DECODE Function 9-11
Using the DECODE Function 9-12

viii

Oracle University Student Learning Subscription Use Only

Using ROUND and TRUNC Functions with Dates 7-34
Quiz 7-35
Summary 7-37
Practice 7: Overview 7-38

10 Reporting Aggregated Data Using the Group Functions
Course Roadmap 10-2
Objectives 10-3
Lesson Agenda 10-4
What Is Data Aggregation? 10-5
Lesson Agenda 10-6
Types of Group Functions 10-7
Group Functions 10-8
Group Functions: Syntax 10-9
Common Group Functions 10-10
Using the AVG and SUM Functions 10-11
Using the MIN and MAX Functions 10-12
Using the COUNT Function 10-13
Using DISTINCT in COUNT function 10-14
Group Functions and Null Values 10-15
Lesson Agenda 10-16
Creating Groups of Data 10-17
Creating Groups of Data: GROUP BY Clause Syntax 10-19
Using the GROUP BY Clause 10-20
Grouping by More Than One Column 10-22
Using the GROUP BY Clause on Multiple Columns 10-23
Common Errors: Using Group Functions 10-24
Restricting Group Results: Using the HAVING Clause 10-27
Restricting Group Results with the HAVING Clause 10-28
Using the HAVING Clause 10-29
Lesson Agenda 10-31
Nesting Group Functions 10-32
Quiz 10-33
Summary 10-38
Practice 10: Overview 10-39
11 Retrieving Data from Multiple Tables Using Joins
Course Roadmap 11-2
Objectives 11-3
Lesson Agenda 11-4
Why Join? 11-5
Obtaining Data from Multiple Tables 11-6

ix

Oracle University Student Learning Subscription Use Only

Quiz 9-14
Summary 9-16
Practice 9: Overview 9-17

12 Using the Set Operators
Course Roadmap 12-2
Objectives 12-3
Lesson Agenda 12-4
Set Operators 12-5
Set Operator Rules 12-6
Oracle Server and Set Operators 12-7

x

Oracle University Student Learning Subscription Use Only

Types of Joins 11-7
Joining Tables Using the SQL:1999 Syntax 11-8
Inner Joins 11-9
Creating Natural Joins 11-10
Retrieving Records with Natural Joins 11-11
Creating Joins with the USING Clause 11-12
Joining Column Names 11-13
Retrieving Records with the USING Clause 11-14
Qualifying Ambiguous Column Names 11-15
Using Table Aliases with the USING Clause 11-16
Creating Joins with the ON Clause 11-17
Retrieving Records with the ON Clause 11-18
Creating Three-Way Joins 11-19
Applying Additional Conditions to a Join 11-20
Lesson Agenda 11-21
Joining a Table to Itself 11-22
Self-Joins Using the ON Clause 11-23
Lesson Agenda 11-24
Nonequijoins 11-25
Retrieving Records with Nonequijoins 11-26
Lesson Agenda 11-27
Returning Records with No Direct Match Using OUTER Joins 11-28
INNER Versus OUTER Joins 11-29
LEFT OUTER JOIN 11-30
RIGHT OUTER JOIN 11-31
FULL OUTER JOIN 11-32
Lesson Agenda 11-33
Cartesian Products 11-34
Generating a Cartesian Product 11-35
Creating Cross Joins 11-36
Quiz 11-37
Summary 11-40
Practice 11: Overview 11-41

13 Using Subqueries to Solve Queries
Course Roadmap 13-2
Objectives 13-3
Lesson Agenda 13-4
Using a Subquery to Solve a Problem 13-5
Subquery Syntax 13-6
Using a Subquery 13-7
Rules and Guidelines for Using Subqueries 13-8
Types of Subqueries 13-9
Lesson Agenda 13-10
Single-Row Subqueries 13-11
Single-Row Subqueries: Example 13-12
Executing Single-Row Subqueries 13-13
Using Group Functions in a Subquery 13-14
HAVING Clause with Subqueries 13-15
What Is Wrong with This Statement? 13-16
No Rows Returned by the Inner Query 13-17
Lesson Agenda 13-18
Multiple-Row Subqueries 13-19

xi

Oracle University Student Learning Subscription Use Only

Lesson Agenda 12-8
Tables Used in This Lesson 12-9
Lesson Agenda 12-13
UNION Operator 12-14
Using the UNION Operator 12-15
UNION ALL Operator 12-16
Using the UNION ALL Operator 12-17
Lesson Agenda 12-18
INTERSECT Operator 12-19
Using the INTERSECT Operator 12-20
Lesson Agenda 12-21
MINUS Operator 12-22
Using the MINUS Operator 12-23
Lesson Agenda 12-24
Matching the SELECT Statements 12-25
Matching the SELECT Statement: Example 12-26
Lesson Agenda 12-27
Using the ORDER BY Clause in Set Operations 12-28
Quiz 12-29
Summary 12-31
Practice 12: Overview 12-32

14 Introduction to Data Manipulation Language
Course Roadmap 14-2
Objectives 14-3
Lesson Agenda 14-4
DML 14-5
Adding a New Row to a Table 14-6
INSERT Statement Syntax 14-7
Inserting New Rows 14-8
Inserting Rows with Null Values 14-9
Inserting Special Values 14-10
Inserting Specific Date and Time Values 14-11
Creating a Script 14-12
Copying Rows from Another Table 14-13
Lesson Agenda 14-15
Changing Data in a Table 14-16
UPDATE Statement Syntax 14-17
Updating Rows in a Table 14-18
Updating Two Columns with a Subquery 14-20
Updating Rows Based on Another Table 14-21
Lesson Agenda 14-22
Removing a Row from a Table 14-23
DELETE Statement 14-24
Deleting Rows from a Table 14-25
Deleting Rows Based on Another Table 14-26
TRUNCATE Statement 14-27
Lesson Agenda 14-28
Database Transaction: Example 14-29
Database Transactions 14-30
Database Transactions: Start and End 14-31

xii

Oracle University Student Learning Subscription Use Only

Using the IN Operator in Multiple-Row Subqueries 13-20
Using the ANY Operator in Multiple-Row Subqueries 13-21
Using the ALL Operator in Multiple-Row Subqueries 13-22
Lesson Agenda 13-23
Multiple-Column Subqueries 13-24
Multiple-Column Subquery: Example 13-25
Lesson Agenda 13-26
Null Values in a Subquery 13-27
Quiz 13-28
Summary 13-32
Practice 13: Overview 13-33

15 Introduction to Data Definition Language
Course Roadmap 15-2
Objectives 15-3
Lesson Agenda 15-4
Database Objects 15-5
Naming Rules 15-6
Lesson Agenda 15-7
CREATE TABLE Statement 15-8
Creating Tables 15-9
Lesson Agenda 15-10
Data Types 15-11
DEFAULT Option 15-13
Lesson Agenda 15-14
Including Constraints 15-15
Constraint Guidelines 15-17
Defining Constraints 15-18
NOT NULL Constraint 15-21
UNIQUE Constraint 15-22
PRIMARY KEY Constraint 15-24
FOREIGN KEY Constraint 15-25
FOREIGN KEY Constraint: Keywords 15-27
CHECK Constraint 15-28

xiii

Oracle University Student Learning Subscription Use Only

Advantages of COMMIT and ROLLBACK Statements 14-32
Explicit Transaction Control Statements 14-33
Rolling Back Changes to a Marker 14-35
Implicit Transaction Processing 14-36
Setting AutoCommit in SQL Developer 14-37
Commit/Rollback on Exiting SQL Developer 14-38
State of Data Before COMMIT or ROLLBACK 14-39
State of Data After COMMIT 14-40
COMMIT: Example 14-41
State of Data After ROLLBACK 14-42
ROLLBACK: Example 14-43
Statement-Level Rollback 14-44
Lesson Agenda 14-45
Read Consistency 14-46
Notes Page 14-47
Quiz 14-48
Summary 14-52
Practice 14: Overview 14-53

16 Managing Tables Using DML Statements
Course Roadmap 16-2
Objectives 16-3
Lesson Agenda 16-4
Creating a Table Using a Subquery 16-5
Lesson Agenda 16-7
ALTER TABLE Statement 16-8
Adding a Column 16-10
Modifying a Column 16-11
Dropping a Column 16-12
Read-Only Tables 16-13
Lesson Agenda 16-14
Dropping a Table 16-15
Quiz 16-16
Summary 16-18
Practice 16: Overview 16-19
17 Introduction to Data Dictionary Views
Course Roadmap 17-2
Objectives 17-3
Lesson Agenda 17-4
Data Dictionary 17-5
Data Dictionary Structure 17-7
How to Use the Dictionary Views 17-9
USER_OBJECTS and ALL_OBJECTS Views 17-10
USER_OBJECTS View 17-11
Lesson Agenda 17-12
Table Information 17-13
Column Information 17-14
Constraint Information 17-16
USER_CONSTRAINTS: Example 17-17
Querying USER_CONS_COLUMNS 17-18
Lesson Agenda 17-19

xiv

Oracle University Student Learning Subscription Use Only

CREATE TABLE: Example 15-29
Violating Constraints 15-30
Quiz 15-32
Summary 15-35
Practice 15: Overview 15-36

18 Creating Views
Course Roadmap 18-2
Objectives 18-3
Lesson Agenda 18-4
Database Objects 18-5
Views 18-6
Advantages of Views 18-7
Simple Views and Complex Views 18-8
Lesson Agenda 18-9
Creating a View 18-10
Retrieving Data from a View 18-13
Modifying a View 18-14
Creating a Complex View 18-15
View Information 18-16
Lesson Agenda 18-17
Rules for Performing DML Operations on a View 18-18
Using the WITH CHECK OPTION Clause 18-21
Denying DML Operations 18-23
Lesson Agenda 18-25
Removing a View 18-26
Quiz 18-27
Summary 18-31
Practice 18: Overview 18-32
19 Creating Sequences, Synonyms, and Indexes
Course Roadmap 19-2
Objectives 19-3
Lesson Agenda 19-4
Database Objects 19-5
Referencing Another User’s Tables 19-6
Sequence 19-7
CREATE SEQUENCE Statement: Syntax 19-8
Creating a Sequence: Example 19-10
NEXTVAL and CURRVAL Pseudocolumns 19-11
Using a Sequence 19-13
SQL Column Defaulting Using a Sequence 19-14

xv

Oracle University Student Learning Subscription Use Only

Adding Comments to a Table 17-20
Quiz 17-21
Summary 17-23
Practice 17: Overview 17-24

20 Managing Constraints, Temporary Tables, and External Tables
Course Roadmap 20-2
Objectives 20-3
Lesson Agenda 20-4
Adding a Constraint Syntax 20-5
Adding a Constraint 20-6
Dropping a Constraint 20-7
Dropping a CONSTRAINT ONLINE 20-8
ON DELETE Clause 20-9
Cascading Constraints 20-10
Renaming Table Columns and Constraints 20-12
Disabling Constraints 20-13
Enabling Constraints 20-14
Constraint States 20-15
Deferring Constraints 20-16
Difference Between INITIALLY DEFERRED and INITIALLY IMMEDIATE 20-17
DROP TABLE … PURGE 20-19
Lesson Agenda 20-20

xvi

Oracle University Student Learning Subscription Use Only

Caching Sequence Values 19-15
Modifying a Sequence 19-16
Guidelines for Modifying a Sequence 19-17
Sequence Information 19-18
Lesson Agenda 19-19
Synonyms 19-20
Creating a Synonym for an Object 19-21
Creating and Removing Synonyms 19-22
Synonym Information 19-23
Lesson Agenda 19-24
Indexes 19-25
How Are Indexes Created? 19-26
Creating an Index 19-27
CREATE INDEX with the CREATE TABLE Statement 19-28
Function-Based Indexes 19-30
Creating Multiple Indexes on the Same Set of Columns 19-31
Creating Multiple Indexes on the Same Set of Columns: Example 19-32
Index Information 19-33
Removing an Index 19-35
Quiz 19-36
Summary 19-40
Practice 19: Overview 19-41

21 Using Advanced Subqueries
Course Roadmap 21-2
Objectives 21-3
Lesson Agenda 21-4
Retrieving Data by Using a Subquery as a Source 21-5
Lesson Agenda 21-7
Multiple-Column Subqueries 21-8
Column Comparisons 21-9
Pairwise Comparison Subquery 21-10
Nonpairwise Comparison Subquery 21-11
Lesson Agenda 21-12
Scalar Subquery Expressions 21-13
Scalar Subqueries: Examples 21-14
Lesson Agenda 21-15
Correlated Subqueries 21-16
Using Correlated Subqueries: Example 1 21-18
Using Correlated Subqueries: Example 2 21-19
Lesson Agenda 21-20
Using the EXISTS Operator 21-21
Finding All Departments That Do Not Have Any Employees 21-23
Lesson Agenda 21-24
WITH Clause 21-25
WITH Clause: Example 21-26
Recursive WITH Clause 21-27
Recursive WITH Clause: Example 21-28
Quiz 21-29
Summary 21-30
Practice 21: Overview 21-31

xvii

Oracle University Student Learning Subscription Use Only

Temporary Tables 20-21
Creating a Temporary Table 20-22
Lesson Agenda 20-23
External Tables 20-24
Creating a Directory for the External Table 20-25
Creating an External Table 20-27
Creating an External Table by Using ORACLE_LOADER 20-29
Quiz 20-31
Summary 20-35
Practice 20: Overview 20-36

23 Controlling User Access
Course Roadmap 23-2
Objectives 23-3
Lesson Agenda 23-4
Database Security 23-5
Controlling User Access 23-6
Privileges 23-7
System Privileges 23-8
Typical DBA Privileges 23-9
Creating Users 23-10
User System Privileges 23-11
Granting System Privileges 23-12
Lesson Agenda 23-13
What Is a Role? 23-14
Role: Syntax 23-15
Creating and Granting Privileges to a Role 23-16
Changing Your Password 23-17
Lesson Agenda 23-18
Object Privileges 23-19
Granting Object Privileges 23-22
Passing On Your Privileges 23-23
Confirming Granted Privileges 23-24
Lesson Agenda 23-25
Revoking Object Privileges 23-26

xviii

Oracle University Student Learning Subscription Use Only

22 Manipulating Data by Using Advanced Subqueries
Course Roadmap 22-2
Objectives 22-3
Lesson Agenda 22-4
Using Subqueries to Manipulate Data 22-5
Lesson Agenda 22-6
Inserting by Using a Subquery as a Target 22-7
Lesson Agenda 22-9
Using the WITH CHECK OPTION Keyword on DML Statements 22-10
Lesson Agenda 22-12
Correlated UPDATE 22-13
Using Correlated UPDATE 22-14
Correlated DELETE 22-16
Using Correlated DELETE 22-17
Summary 22-18
Practice 22: Overview 22-19

24 Advanced Data Manipulation
Course Roadmap 24-2
Objectives 24-3
Lesson Agenda 24-4
Explicit Default Feature: Overview 24-5
Using Explicit Default Values 24-6
Lesson Agenda 24-7
Multitable INSERT Statements: Overview 24-8
Types of Multitable INSERT Statements 24-10
Multitable INSERT Statements 24-11
Unconditional INSERT ALL 24-13
Conditional INSERT ALL: Example 24-14
Conditional INSERT ALL 24-15
Conditional INSERT FIRST: Example 24-17
Conditional INSERT FIRST 24-18
Pivoting INSERT 24-20
Lesson Agenda 24-23
MERGE Statement 24-24
MERGE Statement Syntax 24-25
Merging Rows: Example 24-26
Lesson Agenda 24-29
FLASHBACK TABLE Statement 24-30
Using the FLASHBACK TABLE Statement 24-32
Lesson Agenda 24-33
Tracking Changes in Data 24-34
Flashback Query: Example 24-35
Flashback Version Query: Example 24-36
VERSIONS BETWEEN Clause 24-37
Quiz 24-38
Summary 24-40
25 Managing Multiple Time Zones
Course Roadmap 25-2
Objectives 25-3
Lesson Agenda 25-4

xix

Oracle University Student Learning Subscription Use Only

Lesson Agenda 23-28
Oracle Cloud Service Administration Roles 23-29
Quiz 23-30
Summary 23-34
Practice 23: Overview 23-35

xx

Oracle University Student Learning Subscription Use Only

Time Zones 25-5
TIME_ZONE Session Parameter 25-6
CURRENT_DATE, CURRENT_TIMESTAMP, and LOCALTIMESTAMP 25-7
Comparing Date and Time in a Session’s Time Zone 25-8
DBTIMEZONE and SESSIONTIMEZONE 25-10
TIMESTAMP Data Types 25-11
TIMESTAMP Fields 25-12
Difference Between DATE and TIMESTAMP 25-13
Comparing TIMESTAMP Data Types 25-14
Lesson Agenda 25-15
INTERVAL Data Types 25-16
INTERVAL Fields 25-17
INTERVAL YEAR TO MONTH: Example 25-18
INTERVAL DAY TO SECOND Data Type: Example 25-20
Lesson Agenda 25-21
EXTRACT 25-22
TZ_OFFSET 25-23
FROM_TZ 25-25
TO_TIMESTAMP 25-26
TO_YMINTERVAL 25-27
TO_DSINTERVAL 25-28
Daylight Saving Time (DST) 25-29
Quiz 25-31
Summary 25-32

Lesson 1: Introduction

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Oracle University Student Learning Subscription Use Only

1

After completing this lesson, you should be able to:
• Define the goals of the course
• Describe the course roadmap
• List the Oracle Database documentation and additional resources

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

In this lesson, you gain an understanding of the overall objectives of the course. You learn about the
roadmap followed for the course. You also learn where to find the documentation for Oracle
Database 12c, Oracle Cloud, and SQL Developer for reference.

SQL Fundamentals 1 - 2

Oracle University Student Learning Subscription Use Only

Lesson Objectives

•
•
•
•

Overview of course objectives
Overview of course roadmap
Introduction to Oracle Cloud
Oracle Database 12c SQL documentation and additional resources

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

SQL Fundamentals 1 - 3

Oracle University Student Learning Subscription Use Only

Lesson Agenda

After completing this course, you should be able to:
• Identify the major components of Oracle Database
• Retrieve row and column data from tables with the SELECT statement
• Create reports of sorted and restricted data
• Employ SQL functions to generate and retrieve customized data
• Run complex queries to retrieve data from multiple tables
• Run data manipulation language (DML) statements to update data in Oracle
Database
• Run data definition language (DDL) statements to create and manage
schema objects
• Manage users with different levels of access privileges
• Use data dictionary views
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

This course offers you an introduction to the Oracle Database technology. In this class, you learn the
basic concepts of relational databases and the powerful SQL programming language. This course
provides the essential SQL skills that enable you to write queries against single and multiple tables,
manipulate data in tables, create database objects, query metadata, manage users, and use data
dictionary views.

SQL Fundamentals 1 - 4

Oracle University Student Learning Subscription Use Only

Course Objectives

•
•
•
•

Overview of course objectives
Overview of course roadmap
Introduction to Oracle Cloud
Oracle Database 12c SQL documentation and additional resources

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

SQL Fundamentals 1 - 5

Oracle University Student Learning Subscription Use Only

Lesson Agenda

Course Roadmap
Unit 1: Relational Database and SQL
Overview

Lesson 2: Relational Database Overview

Unit 2: Retrieving and Sorting Data
Lesson 3: Database Storage Structures
Unit 3: Joins, Subqueries, and Set
Operators

Lesson 4: Introduction to SQL

Unit 4: DML and DDL

Unit 5: Managing Relational Database

Unit 6: Advance Queries and Database
Management System

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

In Unit 1, you will learn about databases and database concepts. You will be introduced to relational
databases, data storage concepts, and SQL.

SQL Fundamentals 1 - 6

Oracle University Student Learning Subscription Use Only

Lesson 1: Course Overview

Course Roadmap
Unit 1: Relational Database and SQL
Overview

Lesson 5: Retrieving Data Using SQL
SELECT Statement

Unit 2: Retrieving and Sorting Data
Lesson 6: Restricting and Sorting Data
Unit 3: Joins, Subqueries, and Set
Operators
Lesson 7: Using Single-Row Functions
Unit 4: DML and DDL
Lesson 8: Using Conversion Functions
Unit 5: Managing Relational Database
Lesson 9: Using Conditional Expressions
Unit 6: Advance Queries and Database
Management System

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

In Unit 2, you will dive into the concepts of SQL. You will learn to use the SQL SELECT statement to
retrieve data from database tables, and restrict and sort the retrieved data. You will also learn about
single-row functions, conversion functions, and conditional expressions in SQL.

SQL Fundamentals 1 - 7

Oracle University Student Learning Subscription Use Only

Lesson 1: Course Overview

Course Roadmap
Lesson 1: Course Overview

Unit 2: Retrieving and Sorting Data
Unit 3: Joins, Subqueries, and Set
Operators

Lesson 10: Reporting Aggregated Data
Using the Group Functions

Lesson 11: Retrieving Data from Multiple
Tables Using Joins

Unit 4: DML and DDL
Lesson 12: Using the Set Operators
Unit 5: Managing Relational Database

Unit 6: Advance Queries and Database
Management System

Lesson 13: Using Subqueries to Solve
Queries

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

In Unit 3, you will learn about using joins, subqueries, and set operators. You will learn to write
compound queries in SQL to generate customized reports using group functions, joins, and
subqueries.

SQL Fundamentals 1 - 8

Oracle University Student Learning Subscription Use Only

Unit 1: Relational Database and SQL
Overview

Course Roadmap
Lesson 1: Course Overview

Unit 2: Retrieving and Sorting Data
Unit 3: Joins, Subqueries, and Set
Operators

Lesson 14: Introduction to Data
Manipulation Language

Unit 4: DML and DDL

Lesson 15: Introduction to Data Definition
Language

Unit 5: Managing Relational Database
Lesson 16: Managing Tables using DML
Statements
Unit 6: Advance Queries and Database
Management System

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

In Unit 4, you will learn about Data Manipulation Language (DML) and Data Definition Language
(DDL). Using DML statements, you will learn to update and manage data in the tables. Using DDL
statements, you will learn to create tables, remove tables, etc.

SQL Fundamentals 1 - 9

Oracle University Student Learning Subscription Use Only

Unit 1: Relational Database and SQL
Overview

Course Roadmap
Lesson 1: Course Overview

Unit 2: Retrieving and Sorting Data
Lesson 17: Introduction to Data Dictionary
Views

Unit 3: Joins, Subqueries, and Set
Operators

Lesson 18: Creating Views

Unit 4: DML and DDL

Lesson 19: Creating Sequences,
Synonyms and Indexes

Unit 5: Managing Relational Database

Unit 6: Advance Queries and Database
Management System

Lesson 20: Managing Constraints,
Temporary Tables and External Tables

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

In Unit 5, you will be introduced to views. You will also learn to query data dictionary views. You will
learn to create sequences, synonyms and indexes. You will also learn to manage constraints and
tables.

SQL Fundamentals 1 - 10

Oracle University Student Learning Subscription Use Only

Unit 1: Relational Database and SQL
Overview

Course Roadmap
Lesson 1: Course Overview

Unit 2: Retrieving and Sorting Data

Lesson 21: Using Advanced Subqueries

Unit 3: Joins, Subqueries, and Set
Operators

Lesson 22: Manipulating Data by Using
Advanced Subqueries

Unit 4: DML and DDL

Lesson 23: Controlling User Access

Unit 5: Managing Relational Database

Lesson 24: Advanced Data Manipulation

Unit 6: Advance Queries and Database
Management System

Lesson 25: Managing Multiple Timezones

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

In Unit 6, you will be introduced to some advanced features of SQL. You will learn to write advanced
subqueries. You will learn to create users and manage users. You will also learn about managing
multiple timezones.

SQL Fundamentals 1 - 11

Oracle University Student Learning Subscription Use Only

Unit 1: Relational Database and SQL
Overview

•
•
•
•

Overview of course objectives
Overview of course roadmap
Introduction to Oracle Cloud
Oracle Database 12c SQL documentation and additional resources

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

SQL Fundamentals 1 - 12

Oracle University Student Learning Subscription Use Only

Lesson Agenda

Oracle Cloud is an enterprise cloud for business. Oracle Public Cloud consists of
many different services that share some common characteristics:
• On-demand self-service
• Resource pooling
•
•
•

Rapid elasticity
Measured service
Broad network access
www.cloud.oracle.com

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Oracle Cloud is an enterprise cloud for business. It provides an integrated collection of application
and platform cloud services that are based on best-in-class products and open Java and SQL
standards.
As a result, the applications and databases that are deployed in Oracle Cloud are portable and can
be easily moved to or from a private cloud or an on-premise (local machine) environment.
• All Cloud Services can be provisioned through a self-service interface. Users can get their
Cloud Services delivered on an integrated development and deployment platform with tools to
rapidly extend and create new services. Oracle Cloud services are built on the Oracle Exalogic
Elastic Cloud and Oracle Exadata Database Machine, which together offer a platform that
delivers extreme performance, redundancy, and scalability. The top two benefits of cloud
computing are speed and cost.
The five essential characteristics are:
• On-demand self-service: Provisioning, monitoring, management control
• Resource pooling: Sharing and a level of abstraction between consumers and services
• Rapid elasticity: The ability to quickly scale up or down as needed
• Measured service: Metering utilization for either internal chargeback (private cloud) or external
billing (public cloud)
• Broad network access: Typically, access through a browser on any networked device

SQL Fundamentals 1 - 13

Oracle University Student Learning Subscription Use Only

Introduction to Oracle Cloud

Oracle Cloud provides the following three types of services:
• Software as a Service (SaaS)
• Platform as a Service (PaaS)
• Infrastructure as a Service (IaaS)

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

•

•

•

Software as a Service (SaaS) generally refers to applications that are delivered to end users
over the Internet. Oracle CRM On Demand is an example of a SaaS offering that provides both
multitenant as well as single-tenant options, depending on the customer’s preferences.
Platform as a Service (PaaS) generally refers to an application development and deployment
platform that is delivered as a service to developers, enabling them to quickly build and deploy
a SaaS application to end users. The platform typically includes databases, middleware, and
development tools, all delivered as a service via the Internet.
Infrastructure as a Service (IaaS) refers to computing hardware (servers, storage, and
network) delivered as a service. This typically includes the associated software as well as
operating systems, virtualization, clustering, and so on. Examples of IaaS in the public cloud
include Amazon’s Elastic Compute Cloud (EC2) and Simple Storage Service (S3).

The database cloud is built within an enterprise’s private cloud environment, as a PaaS model. The
database cloud provides on-demand access to database services in a self-service, elastically
scalable, and metered manner. The database cloud offers compelling advantages in cost, quality of
service, and agility. A database can also be deployed within a virtual machine on an IaaS platform.
Database clouds can be rapidly deployed on Oracle Exadata, a pre-integrated and optimized
hardware platform that supports both online transaction processing (OLTP) and data warehouse
(DW) workloads.

SQL Fundamentals 1 - 14

Oracle University Student Learning Subscription Use Only

Oracle Cloud Services

Database on Oracle Cloud
Oracle Database Cloud Service
–
–
–

It is implemented as a PaaS.
The service is identified by an identity domain.
You can sign in, and create a new Database Service Instance to start using the
Cloud Database memory.

Sample Service
Instance
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

•
•

•
•
•
•
•
•

Oracle Database Cloud Service is a service offered as a PaaS.
When an Oracle Database Cloud Service is purchased or is requested as a trial version, you
receive a welcome email from the Oracle Cloud team with the following details:
- Service Identity Domain
- User ID
- Temporary password that must be changed upon first sign-in
When you sign in to the service, you see the “My Services” page with options to manage the
service and its users.
Initially, there will not be any service instances. You will need to create a Database Service
Instance by using the “Create Service Instance” wizard.
Only after the Database Service Instance is created does memory get allocated from Oracle
Cloud’s Database.
Using the Public IP that is provided for the newly created Database Service Instance, you can
create a new connection in SQL Developer and start accessing data.
If you want to access the Database Service Instance by using SQL *Plus, you need to create an
SSH tunnel by using the ssh utility on Linux.
You can refer to Creating an SSH Tunnel Using the ssh Utility on Linux on the Oracle Help
Center for more details.

SQL Fundamentals 1 - 15

Oracle University Student Learning Subscription Use Only

•

•
•
•
•

Overview of course objectives
Overview of course roadmap
Introduction to Oracle Cloud
Oracle Database 12c SQL documentation and additional resources

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

SQL Fundamentals 1 - 16

Oracle University Student Learning Subscription Use Only

Lesson Agenda

•
•
•
•

Oracle Database Reference
Oracle Database SQL Language Reference
Oracle Database Concepts
Oracle Database SQL Developer User’s Guide

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Navigate to http://docs.oracle.com/en/database/database.html to access the Oracle Database 12c
documentation library.

SQL Fundamentals 1 - 17

Oracle University Student Learning Subscription Use Only

Oracle Database Documentation

For additional information about Oracle Database 12c, refer to the following:
• Oracle Database 12c: New Features eStudies
• Oracle Learning Library:
–

•
•

•

http://www.oracle.com/goto/oll

Oracle Cloud:
– http://cloud.oracle.com
Online SQL Developer Home Page, which is available at:
– http://www.oracle.com/technology/products/database/sql_developer/in
dex.html
SQL Developer tutorial, which is available online at:
– http://download.oracle.com/oll/tutorials/SQLDeveloper/index.htm
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

SQL Fundamentals 1 - 18

Oracle University Student Learning Subscription Use Only

Additional Resources

In this lesson, you should have learned about:
• The goals of the course
• The course roadmap used in this course
• The documentation and resources for reference

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

This lesson provided you an overview of the course objectives and the different units and lessons in
the course. In the next lesson, you will learn about databases and database concepts.

SQL Fundamentals 1 - 19

Oracle University Student Learning Subscription Use Only

Summary

Oracle University Student Learning Subscription Use Only

Lesson 2: Relational Database
Overview

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Oracle University Student Learning Subscription Use Only

2

Lesson 1: Course Overview

Unit 1: Relational Database and SQL
Overview

You are here

Lesson 2: Relational Database Overview

Unit 2: Retrieving and Sorting Data
Lesson 3: Database Storage Structures
Unit 3: Joins, Subqueries, and Set
Operators

Lesson 4: Introduction to SQL

Unit 4: DML and DDL

Unit 5: Managing Relational Database

Unit 6: Advance Queries and Database
Management System

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

In Unit 1, you will learn about databases and database concepts. You will be introduced to relational
databases, data storage concepts, and Structured Query Language (SQL).

SQL Fundamentals 2 - 2

Oracle University Student Learning Subscription Use Only

Course Roadmap

After completing this lesson, you should be able to:
• Define a database
• Describe the components of a database
• Explain the need of a database
• List the major transformations in database technology
• List the key concepts of a relational database
• Discuss the benefits of using a relational database

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

In this lesson, you gain an understanding of databases and database concepts. You also learn about
the relational database management system (RDBMS). Additionally, you learn about the need and
benefits of using a database.

SQL Fundamentals 2 - 3

Oracle University Student Learning Subscription Use Only

Objectives

•
•
•
•

Introduction to Database
Overview of Oracle Database 12c
Overview of Relational Database management concepts and terminologies
Overview of Database technologies

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

SQL Fundamentals 2 - 4

Oracle University Student Learning Subscription Use Only

Lesson Agenda

A database:
• Is a centralized and structured set of data stored on a computer system
• Provides facilities for retrieving, adding, modifying, and deleting the data
when required
• Provides facilities for transforming the retrieved data into useful information
Database
Store
Modify
Retrieve
Delete

Add

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

A database is a centralized and structured set of data stored on a computer system. It can be
accessed in various ways. A database enables you to add, modify, and delete data. You can retrieve
data and customize it into meaningful information.

SQL Fundamentals 2 - 5

Oracle University Student Learning Subscription Use Only

Database: Definition

Electronic
spreadsheet

Filing cabinet

Database

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Every organization has some information needs. A library keeps a list of members, books, due dates,
and fines. A company needs to save information about its employees, departments, and salaries.
These pieces of information are called data.
Organizations can store data in various media and in different formats, such as a hard copy
document in a filing cabinet, or data stored in electronic spreadsheets or in databases.
A database is an organized collection of information.
To manage databases, you need a database management system (DBMS).

SQL Fundamentals 2 - 6

Oracle University Student Learning Subscription Use Only

Data Storage on Different Media

Database Management System (DBMS)

Elements of a DBMS

Kernel Code

Repository
of
Metadata

Query Language

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

A DBMS has the following elements:
• The kernel code manages memory and storage for the DBMS.
• The repository of metadata is called a data dictionary.
• The query language enables applications to access the data.

SQL Fundamentals 2 - 7

Oracle University Student Learning Subscription Use Only

A DBMS is a software that controls the storage, organization, and retrieval of data.

Why Do I Need a Database Solution?

Multiple Data Items

Multiple Users

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

The basic component of a file in a file system is a data item. Examples of data items in the real world
are last name, first name, street address, and employee ID.
A database is a more complex object. It is a collection of interrelated stored data that must meet the
needs of many users. A database must also adhere to the business rules and processes of the
organization.
Advantages of using a database rather than a simple file system are:
• Availability of data to a diverse group of users
• Integration of data for easier access and modification when performing complex transactions
• Data integrity and reduced data redundancy

SQL Fundamentals 2 - 8

Oracle University Student Learning Subscription Use Only

Integration of Multiple
Components

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Examples of areas where database applications are used:
• Airlines and railways use online databases for reservations and for displaying information on
the schedule.
• Banks use databases for storing information about customers, accounts, loans, and
transactions.
• Schools and colleges use databases to maintain details about courses, students, and faculty.
• Telecommunication departments store information in their databases about the communication
network, telephone numbers, call details, and monthly bills.
• Databases are used:
- For keeping track of purchases on credit and debit cards, which helps generate monthly
statements
- For integrating heterogeneous information sources for business-related activities, such as
online shopping, booking of holiday packages, and doctor consultations
- In the healthcare industry to maintain and track patient healthcare details
- In the area of digital publishing and digital libraries to manage and deliver textual and
multimedia data
- In finance and trading for storing information pertaining to sales, purchases of stocks and
bonds, or online trading
- At organizations for storing information about their employees, salaries, benefits, and
taxes, and for generating paychecks

SQL Fundamentals 2 - 9

Oracle University Student Learning Subscription Use Only

Examples of Databases

•
•
•
•

Introduction to Database
Overview of Oracle Database 12c
Overview of Relational Database management concepts and terminologies
Overview of Database technologies

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

SQL Fundamentals 2 - 10

Oracle University Student Learning Subscription Use Only

Lesson Agenda

Oracle Database 12c: Focus Areas

Infrastructure
Grids

Application
Development

Oracle Cloud

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Oracle Database 12c offers extensive features across the following focus areas:
• Infrastructure Grids: The Infrastructure Grid technology of Oracle enables pooling of low-cost
servers and storage to form systems that deliver the highest quality of service in terms of
manageability, high availability, and performance. Oracle Database 12c consolidates and
extends the benefits of grid computing. Apart from taking full advantage of grid computing,
Oracle Database 12c has unique change assurance features to manage changes in a
controlled and cost-effective manner.
• Information Management: Oracle Database 12c extends the existing information management
capabilities in content management, information integration, and information lifecycle
management areas. Oracle provides content management of advanced data types such as
Extensible Markup Language (XML), text, spatial, multimedia, medical imaging, and semantic
technologies.
• Application Development: Oracle Database 12c has capabilities to use and manage all the
major application development environments such as PL/SQL, Java/JDBC, .NET, Windows,
PHP, SQL Developer, and Application Express.
• Oracle Cloud: The Oracle Cloud is an enterprise cloud for business. It provides an integrated
collection of application and platform cloud services that are based on best-in-class products
and open Java and SQL standards.

SQL Fundamentals 2 - 11

Oracle University Student Learning Subscription Use Only

Information Management

Manageability
High Availability
Performance
Security
Information Integration

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Organizations need to support multiple terabytes of information for users who demand fast and
secure access to business applications round the clock. The database systems must be reliable and
must be able to recover quickly in the event of any kind of failure. Oracle Database 12c is designed
along the following feature areas to help organizations manage infrastructure grids easily and deliver
high-quality service:
• Manageability: By using some of the change assurance, management automation, and fault
diagnostics features, the database administrators (DBAs) can increase their productivity,
reduce costs, minimize errors, and maximize quality of service. Some of the useful features that
promote better management are Database Replay facility, the SQL Performance Analyzer, the
Automatic SQL Tuning facility, and Real-Time Database Operations Monitoring.
Enterprise Manager Database Express 12c is a web-based tool for managing Oracle databases.
Enterprise Manager Database Express greatly simplifies database performance diagnostics by
consolidating the relevant database performance screens into a consolidated view called
Database Performance Hub. DBAs get a single, consolidated view of the current real-time and
historical view of the database performance across multiple dimensions such as database load,
monitored SQL and PL/SQL, and Active Session History (ASH) on a single page for the
selected time period.

SQL Fundamentals 2 - 12

Oracle University Student Learning Subscription Use Only

Oracle Database 12c

High availability: By using the high availability features, you can reduce the risk of down
time and data loss. These features improve online operations and enable faster database
upgrades.

•

Performance: By using capabilities such as SecureFiles, compression for online
transaction processing (OLTP), Real Application Clusters (RAC) optimizations, Result
Caches, and so on, you can greatly improve the performance of your database. Oracle
Database 12c enables organizations to manage large, scalable, transactional and data
warehousing systems that deliver fast data access using low-cost modular storage.
Security: Oracle Database 12c helps organizations protect their information with unique
secure configurations, data encryption and masking, and sophisticated auditing
capabilities. It delivers a secure and scalable platform for reliable and fast access to all
types of information by using the industry-standard interfaces.
Information integration: Oracle Database 12c has many features to better integrate data
throughout the enterprise. It also supports advanced information lifecycle management
capabilities. This helps you manage the changing data in your database.

•

•

SQL Fundamentals 2 - 13

Oracle University Student Learning Subscription Use Only

•

•
•
•
•

Introduction to Database
Overview of Oracle Database 12c
Overview of Relational Database management concepts and terminologies
Overview of Database technologies

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

SQL Fundamentals 2 - 14

Oracle University Student Learning Subscription Use Only

Lesson Agenda

•
•
•
•
•

Relational model and object relational model
User-defined data types and objects
Fully compatible with relational database
Supports multimedia and large objects
High-quality database server features

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

The Oracle server supports both the relational and the object relational database models.
The Oracle server extends the data-modeling capabilities to support an object relational database
model that provides object-oriented programming, complex data types, complex business objects,
and full compatibility with the relational world.
It includes several features for improved performance and functionality of the OLTP applications,
such as better sharing of runtime data structures, larger buffer caches, and deferrable constraints.
Data warehouse applications benefit from enhancements such as parallel execution of insert, update,
and delete operations; partitioning; and parallel-aware query optimization. The Oracle model
supports client/server and web-based applications that are distributed and multitiered.
For more information about the relational and object relational model, refer to Oracle Database
Concepts for 12c Database.

SQL Fundamentals 2 - 15

Oracle University Student Learning Subscription Use Only

Relational and Object Relational Database Management
Systems

•
•
•

Dr. E. F. Codd proposed the relational model for database systems in 1970.
It is the basis for the relational database management system (RDBMS).
The relational model consists of the following:
–
–
–

Collection of objects or relations
Set of operators to act on the relations
Data integrity for accuracy and consistency

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

The principles of the relational model were first outlined by Dr. E. F. Codd in a June 1970 paper titled
A Relational Model of Data for Large Shared Data Banks. In this paper, Dr. Codd proposed the
relational model for database systems.
The common models used at that time were hierarchical and network, or even simple flat-file data
structures. RDBMS soon became very popular, especially for its ease of use and flexibility in
structure. In addition, a number of innovative vendors, such as Oracle, supplemented the RDBMS
with a suite of powerful application development and user-interface products, thereby providing a
total solution.
Components of the Relational Model
• Collections of objects or relations that store the data
• A set of operators that can act on the relations to produce other relations
• Data integrity for accuracy and consistency

SQL Fundamentals 2 - 16

Oracle University Student Learning Subscription Use Only

Relational Database Concept

Definition of a Relational Database

Oracle
server

Table name: EMPLOYEES

…

Table name: DEPARTMENTS

…
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

A relational database uses relations or two-dimensional tables to store information.
For example, you might want to store information about all the employees in your company. In a
relational database, you create several tables to store different pieces of information about your
employees, such as an employee table, a department table, and a salary table.

SQL Fundamentals 2 - 17

Oracle University Student Learning Subscription Use Only

A relational database is a collection of relations or two-dimensional tables
controlled by the Oracle server.

Model of
system
in client’s
mind

Entity model of
client’s model
Table model
of entity model

Oracle
server

Tables on disk

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Models are the cornerstone of design. Engineers build a model of a car to work out any details before
putting it into production. In the same manner, system designers develop models to explore ideas
and improve the understanding of database design.
Purpose of Models
Models help to communicate the concepts that are in people’s minds. They can be used to do the
following:
• Communicate
• Categorize
• Describe
• Specify
• Investigate
• Evolve
• Analyze
• Imitate
The objective is to produce a model that fits a multitude of these uses, can be understood by an end
user, and contains sufficient detail for a developer to build a database system.

SQL Fundamentals 2 - 18

Oracle University Student Learning Subscription Use Only

Data Models

Entity Relationship Model
Create an entity relationship diagram from business specifications or
narratives:
EMPLOYEE
#*
number
*
name
o
job title

•

Assigned to
Composed of

DEPARTMENT
#*
number
*
name
o
location

Scenario:
–
–

“. . . Assign one or more employees to a
department . . .”
“. . . Some departments do not yet have assigned employees
. . .”

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

In an effective system, data is divided into discrete categories or entities. An entity relationship (ER)
model is an illustration of the various entities in a business and the relationships among them. An ER
model is derived from business specifications or narratives and built during the analysis phase of the
system development life cycle. ER models separate the information required by a business from the
activities performed within the business. Although businesses can change their activities, the type of
information tends to remain constant. Therefore, the data structures also tend to be constant.
Benefits of ER Modeling
• Documents information for the organization in a clear, precise format
• Provides a clear picture of the scope of the information requirement
• Provides an easily understood pictorial map for database design
• Offers an effective framework for integrating multiple applications
Key Components
• Entity: An aspect of significance about which information must be known. Examples are
departments, employees, and orders.
• Attribute: Something that describes or qualifies an entity. For example, for the employee entity,
the attributes would be the employee number, name, job title, hire date, department number,
and so on. Each of the attributes is either required or optional. This state is called optionality.
• Relationship: A named association between entities showing optionality and degree.
Examples are employees and departments, and orders and items.

SQL Fundamentals 2 - 19

Oracle University Student Learning Subscription Use Only

•

Entity:
• Singular, unique name
• Uppercase
• Soft box
• Synonym in parentheses
EMPLOYEE
#*
number
*
name
o
job title

Attribute:
• Singular name
• Lowercase
• Mandatory marked with “*”
• Optional marked with “o”
Assigned to
Composed of

DEPARTMENT
#*
number
*
name
o
location

Unique Identifier (UID)
Primary marked with “#”
Secondary marked with “(#)”
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Entities
To represent an entity in a model, use the following conventions:
• Singular, unique entity name
• Entity name in uppercase
• Soft box
• Optional synonym names in uppercase within parentheses: ( )
Attributes
To represent an attribute in a model, use the following conventions:
• Singular name in lowercase
• Asterisk (*) tag for mandatory attributes (that is, values that must be known)
• Letter “o” tag for optional attributes (that is, values that may be known)

SQL Fundamentals 2 - 20

Oracle University Student Learning Subscription Use Only

Entity Relationship Modeling Conventions

Symbol

Description

Dashed line

Optional element indicating “maybe”

Solid line

Mandatory element indicating “must be”

Crow’s foot

Degree element indicating “one or more”

Single line

Degree element indicating “one and only one”

Note: The term cardinality is a synonym for the term degree.
Each source entity {may be | must be} in relation {one and only one | one or more} with the
destination entity.
Note: The convention is to read clockwise.
Unique Identifiers
A unique identifier (UID) is any combination of attributes or relationships, or both, that serves to
distinguish occurrences of an entity. Each entity occurrence must be uniquely identifiable.
• Tag each attribute that is part of the UID with a hash sign “#”.
• Tag secondary UIDs with a hash sign in parentheses (#).

SQL Fundamentals 2 - 21

Oracle University Student Learning Subscription Use Only

Relationships
Each direction of the relationship contains:
• A label: For example, taught by or assigned to
• An optionality: Either must be or maybe
• A degree: Either one and only one or one or more

•
•

Each row of data in a table can be uniquely identified by a primary key.
You can logically relate data from multiple tables using foreign keys.
Table name: DEPARTMENTS
Table name: EMPLOYEES

…
Primary key

Primary key
Foreign key
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Each table contains data that describes exactly one entity. For example, the EMPLOYEES table
contains information about employees. Categories of data are listed across the top of each table, and
individual cases are listed below. By using a table format, you can readily visualize, understand, and
use information.
Because data about different entities is stored in different tables, you may need to combine two or
more tables to answer a particular question. For example, you may want to know the location of the
department where an employee works. In this scenario, you need information from the EMPLOYEES
table (which contains data about employees) and the DEPARTMENTS table (which contains
information about departments). With an RDBMS, you can relate the data in one table to the data in
another table by using foreign keys. A foreign key is a column (or a set of columns) that refers to a
primary key in the same table or another table.
You can use the ability to relate data in one table to data in another table to organize information in
separate, manageable units. Employee data can be kept logically distinct from the department data
by storing it in a separate table.
Guidelines for Primary Keys and Foreign Keys
• You cannot use duplicate values in a primary key.
• Primary keys generally cannot be changed.
• Foreign keys are based on data values and are purely logical (not physical) pointers.
• A foreign key value must match an existing primary key value or unique key value; otherwise, it
must be null.
• A foreign key must reference either a primary key or a unique key column.

SQL Fundamentals 2 - 22

Oracle University Student Learning Subscription Use Only

Relating Multiple Tables

Relational Database Terminology
3

6

5

1

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

A relational database can contain one or many tables. A table is the basic storage structure of an
RDBMS. A table holds all the data necessary about something in the real world, such as employees,
invoices, or customers.
The slide shows the contents of the EMPLOYEES table or relation. The numbers indicate the following:
1. A single row (or tuple) representing all the data required for a particular employee. Each row in
a table should be identified by a primary key, which permits no duplicate rows. The order of
rows is insignificant; specify the row order when the data is retrieved.
2. A column or attribute containing the employee number. The employee number identifies a
unique employee in the EMPLOYEES table. In this example, the employee number column is
designated as the primary key. A primary key must contain a value and the value must be
unique.
3. A column that is not a key value. A column represents one kind of data in a table; in this
example, the data is the salaries of all the employees. Column order is insignificant when
storing data; specify the column order when the data is retrieved.
4. A column containing the department number, which is also a foreign key. A foreign key is a
column that defines how tables relate to each other. A foreign key refers to a primary key or a
unique key in the same table or in another table. In the example, DEPARTMENT_ID uniquely
identifies a department in the DEPARTMENTS table.
5. A field can be found at the intersection of a row and a column. There can be only one value in it.
6. A field may have no value in it. This is called a null value. In the EMPLOYEES table, only those
employees who have the role of sales representative have a value in the COMMISSION_PCT
(commission) field.

SQL Fundamentals 2 - 23

Oracle University Student Learning Subscription Use Only

4

2

•
•
•
•
•

Avoids duplication of data
Ensures consistency of data that is stored as records
Easier to modify data and data format
Easier to insert and delete data
Easier to maintain security of data

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

When you store data in tables, you can easily add, modify, and delete data, as well as maintain
consistency of the stored information.

SQL Fundamentals 2 - 24

Oracle University Student Learning Subscription Use Only

Advantages of a Relational Database

•
•
•
•

Introduction to Database
Overview of Oracle Database 12c
Overview of Relational Database management concepts and terminologies
Overview of Database technologies
–
–
–
–

Difference between OLTP and OLAP
Difference between SQL Database and NoSQL Database
Overview of Multitenant architecture of Oracle Database 12c
Introduction to Oracle Cloud and Database Cloud Service

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

SQL Fundamentals 2 - 25

Oracle University Student Learning Subscription Use Only

Lesson Agenda

OLTP Versus OLAP
OLAP

Works with operational data

Works with historical data

Is used for updating data

Is used for reporting data

Schema is normalized

Schema can be of any type (star, snowflake,
constellation)

Simple queries are used

Complex queries are used

Retrieval of data is fast

Retrieval of data is slow

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

There are two types of information systems that help in managing and processing transactionoriented and analytical-oriented applications. They are as follows:
Online Transaction Processing (OLTP) refers to a number of simple online transactions such as
INSERT, UPDATE, or DELETE. The main function of OLTP is to retrieve, modify, or delete data at a
high speed while maintaining data integrity in a centralized environment. A special characteristic of
an OLTP database is the normalization of data. This helps in providing faster access and efficient
performance of the database. This system is suitable to address online applications such as a
banking transaction system.
Online Analytical Processing (OLAP) refers to relatively a small number of online transactions
using complex queries. The main function of OLAP is to retrieve aggregated data from a set of
historical or archived data stored in the database. Since the data is seldom changed, it can be used
for analytical purposes. This system is suitable for applications such as business intelligence and
data mining.

SQL Fundamentals 2 - 26

Oracle University Student Learning Subscription Use Only

OLTP

SQL Database Versus NoSQL Database
NoSQL Database

Is a relational database

Is a non-relational or distributed database

Stores data as records

Stores data as documents (JSON, key-value pair)

Schemas are predefined

Schemas are dynamic

Scaling is vertical

Scaling is horizontal

Uses SQL to query database

Uses APIs to query database

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

The different types of databases differ mainly in their architecture and how the data is stored. They
also differ based on the applications they are used for.
SQL Database is a relational database whose data can be queried by using SQL. You can store data
in the tables only if the tables and the field types are defined. Hence the design must be finalized
before applying any business logic to manipulate data. All the tables in the database are normalized,
thereby reducing redundancy. Complex queries can be written to retrieve customized reports. In
order to scale up the database, you will need to increase the capacity of the server, which in turn
increases the cost. SQL Database is ideal in cases where data requirements can be identified and
data integrity is essential.
NoSQL Database is a scalable, distributed database. APIs with programming languages such as
Java, Python, etc. are used to retrieve document-based data. Data can be modeled as relational
database–style tables, JSON documents, or key-value pairs. Oracle NoSQL Database is a sharded
(shared-nothing) system, which distributes the data uniformly across the multiple shards in the
cluster. Within each shard, storage nodes are replicated to ensure high availability, rapid failover in
the event of a node failure, and optimal load balancing of queries. NoSQL Database provides Java,
C, Python, and node.js drivers and a REST API to simplify application development. NoSQL
Database is integrated with a wide variety of related Oracle and open source applications in order to
simplify and streamline the development and deployment of modern big data applications.

SQL Fundamentals 2 - 27

Oracle University Student Learning Subscription Use Only

SQL Database

Multitenant Architecture
Central management
and administration

Provides isolation

Multiple databases in a
centrally managed platform

PDB1

PDB2

PDB3

Maintains security

Reduces DBA resources
cost

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

The multitenant architecture enables an Oracle database to function as a multitenant container
database (CDB). A CDB includes zero, one, or many pluggable databases (PDBs).
A PDB is a portable collection of schemas, schema objects, and non-schema objects. In other words,
a database that consolidates other databases is called a container database or CDB, and a database
consolidated within a CDB is called a pluggable database or PDB.
All Oracle databases before Oracle Database 12c were non-CDBs. Oracle Database 12c supports
both the new multitenant architecture and the old non-CDB architecture.
In this course, you will be connecting to a schema in a PDB to execute the SQL statements.

SQL Fundamentals 2 - 28

Oracle University Student Learning Subscription Use Only

CDB

The Oracle Cloud is an enterprise cloud for business. The Oracle Public Cloud
consists of many different services that share some common characteristics:
• On-demand self-service
• Resource pooling
www.cloud.oracle.com
• Rapid elasticity
• Measured service
• Broad network access

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

The Oracle Cloud is an enterprise cloud for business. It provides an integrated collection of
application and platform cloud services that are based upon best-in-class products and open Java
and SQL standards.
As a result, the applications and databases deployed in the Oracle Cloud are portable and can be
easily moved to or from a private cloud or an on-premise (local machine) environment.
• All Cloud Services can be provisioned through a self-service interface. Users can get their
Cloud Services delivered on an integrated development and deployment platform, with tools to
rapidly extend and create new services. Oracle Cloud services are built on the Oracle Exalogic
Elastic Cloud and Oracle Exadata Database Machine, together offering a platform that delivers
extreme performance, redundancy, and scalability. The top two benefits of cloud computing are
speed and cost.
The five essential characteristics are:
• On-demand self-service: Provisioning, monitoring, management control
• Resource pooling: Implies sharing and a level of abstraction between consumers and services
• Rapid elasticity: The ability to quickly scale up or down as needed
• Measured service: Metering utilization for either internal chargeback (private cloud) or external
billing (public cloud)
• Broad network access: Typically means access through a browser on any networked device

SQL Fundamentals 2 - 29

Oracle University Student Learning Subscription Use Only

Introduction to Oracle Cloud

The Oracle Cloud provides the following three types of services:
• Software as a Service (SaaS)
• Platform as a Service (PaaS)
• Infrastructure as a Service (IaaS)

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

•

•

•

•

•

Software as a Service (SaaS) generally refers to applications that are delivered to end users
over the Internet. Oracle CRM On Demand is an example of a SaaS offering that provides both
multitenant as well as single-tenant options, depending on the customer’s preferences.
Platform as a Service (PaaS) generally refers to an application development and deployment
platform delivered as a service to developers, enabling them to quickly build and deploy a SaaS
application to end users. The platform typically includes databases, middleware, and
development tools, all delivered as a service via the Internet.
Infrastructure as a Service (IaaS) refers to computing hardware (servers, storage, and
network) delivered as a service. This typically includes the associated software as well as
operating systems, virtualization, clustering, and so on. Examples of IaaS in the public cloud
include Amazon’s Elastic Compute Cloud (EC2) and Simple Storage Service (S3).
The database cloud is built within an enterprise’s private cloud environment, as a PaaS model.
The database cloud provides on-demand access to database services in a self-service,
elastically scalable, and metered manner. The database cloud offers compelling advantages in
cost, quality of service, and agility. A database can also be deployed within a virtual machine in
an IaaS platform.
Database clouds can be rapidly deployed on Oracle Exadata, a pre-integrated and optimized
hardware platform that supports both OLTP and Data Warehouse workloads.

SQL Fundamentals 2 - 30

Oracle University Student Learning Subscription Use Only

Oracle Cloud Services

Database on Oracle Cloud
Oracle Cloud Database as a Service (DBaaS)
–
–
–

Implemented as a PaaS
Service identified by an identity domain
Sign in and create a new Database Service Instance to start using the Cloud
Database memory

Sample Service
Instance
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

•
•

•
•
•
•
•
•

Oracle Cloud Database as a Service (DBaaS) is a service offered as PaaS.
When an Oracle Cloud DBaaS is purchased or requested for a trial version, you will receive a
welcome email from the Oracle Cloud team with following details:
- Service Identity Domain
- User ID
- Temporary password, which has to be changed upon your first sign-in
Once you sign in to the service, you will see the “My Services” page with all the options to
manage the service and its users.
Initially, there are no service instances and you need to create a Database Service Instance
using the “Create Service Instance” wizard.
Only upon the Database Service Instance creation does the memory get allocated from the
Oracle Cloud’s Database.
Using the Public IP provided for the newly created Database Service Instance, you can create a
new connection in SQL Developer and start accessing the data.
If you want to access the Database Service Instance using SQL *Plus, you need to create an
SSH tunnel using the ssh utility on Linux.
You can refer to
http://www.oracle.com/webfolder/technetwork/tutorials/obe/cloud/dbaas/obe_dbaas_QS/oracle_
database_cloud_service_dbaas_quick_start.html in Oracle Help Center for more details.

SQL Fundamentals 2 - 31

Oracle University Student Learning Subscription Use Only

•

Which of the following are true for a Primary Key?
a. Can contain duplicate values
b. Has unique values in a table
c. Cannot be NULL
d. Can be changed to a different value in a table

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Answer: b, c

SQL Fundamentals 2 - 32

Oracle University Student Learning Subscription Use Only

Q

Quiz

In this lesson, you should have learned about:
• The features of Oracle Database 12c
• The theoretical and physical aspects of a relational
database
• Oracle server’s implementation of RDBMS and object
relational database management system (ORDBMS)
• The major transformations in database technology
• The salient features of Oracle Cloud

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Relational database management systems are composed of objects or relations. They are managed
by operations and governed by data integrity constraints.
Oracle Corporation produces products and services to meet your RDBMS needs. The main products
are the following:
• Oracle Database with which you store and manage information by using SQL
• Oracle Fusion Middleware with which you develop, deploy, and manage modular business
services that can be integrated and reused
• Oracle Enterprise Manager Grid Control, which you use to manage and automate administrative
tasks across sets of systems in a grid environment
SQL
The Oracle server supports ANSI-standard SQL and contains extensions. SQL is the language that is
used to communicate with the server to access, manipulate, and control data.

SQL Fundamentals 2 - 33

Oracle University Student Learning Subscription Use Only

Summary

This practice covers the following topics:
• Identifying entities, attributes, and their corresponding tables, rows, and
columns
• Identifying unique identifiers and their corresponding primary keys

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

In this practice, you perform the following:
• Identify entities, attributes, and their corresponding tables, rows, and columns.
• Identify unique identifiers and their corresponding primary keys.
Note the following location for the lab files:
/home/oracle/labs/sql1/labs
If you are asked to save any lab files, save them in this location.
In any practice, there may be exercises that are prefaced with the phrases “If you have time” or “If
you want an extra challenge.” Work on these exercises only if you have completed all other exercises
within the allocated time and would like a further challenge to your skills.
Perform the practices slowly and precisely. You can experiment with saving and running command
files. If you have any questions at any time, ask your instructor.
Note: All written practices use Oracle SQL Developer as the development environment. Although it is
recommended that you use Oracle SQL Developer, you can also use SQL*Plus that is available in
this course.

SQL Fundamentals 2 - 34

Oracle University Student Learning Subscription Use Only

Practice 2: Overview

Lesson 3: Database Storage
Structures

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Oracle University Student Learning Subscription Use Only

3

Course Roadmap
Unit 1: Relational Database and SQL
Overview

You are here

Lesson 2: Relational Database Overview

Unit 2: Retrieving and Sorting Data
Lesson 3: Database Storage Structures
Unit 3: Joins, Subqueries, and Set
Operators

Lesson 4: Introduction to SQL

Unit 4: DML and DDL

Unit 5: Managing Relational Database

Unit 6: Advance Queries and Database
Management System

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

In Unit 1, you will learn about databases and database concepts. You will be introduced to relational
databases, data storage concepts, and SQL.

SQL Fundamentals 3 - 2

Oracle University Student Learning Subscription Use Only

Lesson 1: Course Overview

After completing this lesson, you should be able to:
• Understand database data storage
• Define logical structures
• Define physical storage structures
• Describe the structure of relational tables

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

In this lesson, you will learn about database data storage. You will gain an understanding of logical
structures and physical storage structures. You will also learn about relational table structure.

SQL Fundamentals 3 - 3

Oracle University Student Learning Subscription Use Only

Objectives

•
•
•
•

Overview of database data storage
Introduction to logical structures
Introduction to physical storage structures
Structure of relational tables

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

SQL Fundamentals 3 - 4

Oracle University Student Learning Subscription Use Only

Lesson Agenda

Database Data Storage

Logical
Structures

A database has physical
structures and logical
structures.

Tablespace

Physical
Structures
Data Files

Segment

Control Files

Extent
Online Redo
Logs

Data Block

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

A database can be considered from both a physical and a logical perspective. Physical data is data
viewable at the operating system level. Logical data, such as a table, is meaningful only for the
database. A SQL statement can list the tables in an Oracle database, but an operating system utility
cannot.
The physical storage of data can be managed without affecting access to logical storage structures
because the physical and logical structures are separate.

SQL Fundamentals 3 - 5

Oracle University Student Learning Subscription Use Only

Data storage is one of the essential tasks of the database.

•
•
•
•

Overview of database data storage
Introduction to logical structures
Introduction to physical storage structures
Structure of relational tables

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

SQL Fundamentals 3 - 6

Oracle University Student Learning Subscription Use Only

Lesson Agenda

•
•

Oracle Database allocates logical space for all data in the database.
There are four allocation units of database space allocation:
–
–
–
–

Data Blocks
Extents
Segments
Tablespaces

Logical
Structures
Tablespace
Segment
Extent

Finest level of
granularity

Data Block

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Data blocks are the smallest units of storage that Oracle Database can use or allocate. At the finest
level of granularity, Oracle Database stores data in data blocks. One logical data block corresponds
to a specific number of bytes of physical disk space.
An extent is a set of logically contiguous data blocks allocated for storing a specific type of
information.
A segment is a set of extents allocated for a specific database object, such as a table. For example,
the data for the Employees table is stored in its own data segment. Every database object that
consumes storage consists of a single segment.
Each segment belongs to one and only one tablespace. Thus, all extents for a segment are stored in
the same tablespace.

SQL Fundamentals 3 - 7

Oracle University Student Learning Subscription Use Only

Introduction to Logical Structures

A data block is the
smallest logical storage
unit of a database.

A single data block
represents a specific
number of bytes on the
physical hard disk.

The size of a data block is
generally a multiple of the
operating system block size.

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

The Oracle Database manages the logical storage space in the data files of a database in units called data
blocks, also called Oracle blocks or pages. A data block is the minimum unit of database I/O. At the physical
level, database data is stored in disk files made up of operating system blocks. An operating system block is the
minimum unit of data that the operating system can read or write. In contrast, an Oracle block is a logical
storage structure whose size and structure are not known to the operating system.
A data block consists of the following format:

•
•
•
•
•

Header that holds generic information like block address and type of segment
Table Directory that contains information about the table having rows in that block
Row Directory that contains information about the actual row contained in that block
Free Space that is the available free space in the data block
Row Data that contains table or index data

The first three components of a data block (Header, Table Directory, and Row Directory) are collectively known
as Overhead.

SQL Fundamentals 3 - 8

Oracle University Student Learning Subscription Use Only

Data Blocks

Extents

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Data blocks in an extent are logically contiguous, but can be physically spread out on the disk. By
default, the database allocates an initial extent for a data segment when the segment is created. The
first data block of every segment contains a directory of the extents in the segment.

SQL Fundamentals 3 - 9

Oracle University Student Learning Subscription Use Only

An extent is a logical unit of database storage space allocation made up of
contiguous data blocks.

Segments

Data Blocks

Data Blocks

Segment
96Kb
Data
File

Exten
t
72KB

Data
File

Extent
72KB

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

A segment is a set of extents that have been allocated for a specific type of data structure and that
are stored in the same tablespace. For example, each table's data is stored in its own data segment,
while each query's data is stored in a temporary segment. Oracle allocates space for segments in
extents.
Oracle allocates another extent when the existing extents of a segment become full. The extents of a
segment may or may not be contiguous on disk, because extents are allocated on an as-needed
basis.
Segments reside in a physical structure called a Data File, which is covered in further topics.

SQL Fundamentals 3 - 10

Oracle University Student Learning Subscription Use Only

A segment is a set of extents that have been allocated for a specific type of data
structure and that are stored in the same tablespace.

Tablespaces

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Tablespaces are the primary logical storage structures of any Oracle database. The usable data of
an Oracle database is logically stored in the tablespaces and physically stored in the data files
associated with the corresponding tablespaces.
An Oracle database consists of one or more logical storage units called tablespaces. The database's
data is collectively stored in the database's tablespaces. Each tablespace in an Oracle database
consists of one or more files called data files, which are physical structures that conform to the
operating system in which an Oracle database is running.
An index is associated with a tablespace and helps in retrieving data more quickly. Just as the index
in a manual helps you locate information faster than if there were no index, a database index
provides a faster access path to tablespace data.

SQL Fundamentals 3 - 11

Oracle University Student Learning Subscription Use Only

Oracle Database stores data logically in tablespaces and physically in
data files associated with the corresponding tablespaces.

•
•
•
•

Overview of database data storage
Introduction to logical structures
Introduction to physical storage structures
Structure of relational tables

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

SQL Fundamentals 3 - 12

Oracle University Student Learning Subscription Use Only

Lesson Agenda

•
•

An Oracle Database is a set of files that stores Oracle data in persistent disk
storage.
The following database files are generated:
–
–
–

Data files and temp files
Control files
Online redo log files

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

•

•
•
•

A data file is a physical file on the disk that is created by Oracle Database and contains data
structures, such as tables and indexes. A temp file is a data file that belongs to a temporary
tablespace. The data is written to these files in an Oracle proprietary format that cannot be read
by other programs.
A control file is a root file that tracks the physical components of the database.
The online redo log is a set of files containing records of changes made to data.
A database instance is a set of memory structures that manages database files.

SQL Fundamentals 3 - 13

Oracle University Student Learning Subscription Use Only

Introduction to Physical Storage Structures

•
•

Oracle Database stores database data in data files.
Every database must have at least one data file.

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Oracle Database stores database data in data files. Every database must have at least one data file.
Oracle Database allocates space for user data in tablespaces, which, like segments, are logical
storage structures. Each segment belongs to only one tablespace. Oracle Database physically stores
tablespace data in data files. Tablespaces and data files are closely related, but they have important
differences:
• Each tablespace consists of one or more data files, which conform to the operating system in
which the Oracle database is running.
• The data for a database is collectively stored in the data files located in each tablespace of the
database.
• A segment can span one or more data files, but it cannot span multiple tablespaces.
• A database must have the SYSTEM and SYSAUX tablespaces. Oracle Database automatically
allocates the first data files of any database for the SYSTEM tablespace during database
creation.
• The SYSTEM tablespace contains the data dictionary, which is a set of tables that contains
database metadata. Generally, a database also has an undo tablespace and a temporary
tablespace (usually named TEMP).

SQL Fundamentals 3 - 14

Oracle University Student Learning Subscription Use Only

Data Files

•
•

The database control file is a small binary file associated with only one
database.
A control file contains the following information:
Time stamp of
database creation

Metadata that must
be accessible when
the database is not
open

Tablespace information

Current log
sequence number

Database name and database
unique identifier (DBID)

Information about data files
and online redo log files

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Each database has one unique control file, although it may maintain identical copies of it. The control
file is the root file that Oracle Database uses to find database files and to manage the state of the
database generally. The control file of an Oracle database is created at the same time as the
database.

SQL Fundamentals 3 - 15

Oracle University Student Learning Subscription Use Only

Control Files

Online Redo Log Files

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Every instance of an Oracle database has an associated redo log to protect the database in case of
an instance failure. It consists of two or more pre-allocated files that store all changes made to the
database as they occur.
The redo log for each database instance is also referred to as a redo thread.
Redo log files are filled with redo records. A redo record, also called a redo entry, is made up of a
group of change vectors, each of which is a description of a change made to a single block in the
database. For example, if you change a salary value in an employee table, you generate a redo
record. This contains change vectors that describe changes to the data segment block for the table,
the undo segment data block, and the transaction table of the undo segments.

SQL Fundamentals 3 - 16

Oracle University Student Learning Subscription Use Only

Oracle Database uses the online redo log only for recovery.

•
•
•
•

Overview of database data storage
Introduction to logical structures
Introduction to physical storage structures
Structure of relational tables

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

SQL Fundamentals 3 - 17

Oracle University Student Learning Subscription Use Only

Lesson Agenda

Relational Tables

Table: EMPLOYEES
EMPLOYEE_ID

Rows

Columns

LAST_NAME

FIRST_NAME

DEPARTMENT_ID

PAYROLL_ID

NICKNAME

100

SMITH

DANA

10

21215

Dana

310

ADAMS

TYLER

15

59877

Ty

210

CHEN

LAWRENCE

10

1101

Larry

405

GOMEZ

CARLOS

10

52

Chaz

378

LOUNGANI

NEIL

22

90386

Neil

Primary Key
Column (PK)

Foreign Key
Column (FK)

Unique Key
Column (UK)

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

A relational database management system (RDBMS) stores data in tables. Each table is given a
name by the user who creates the table. The user generally chooses a name that correlates to the
data that will be stored in the table, for example, STUDENTS, EMPLOYEES, and LOCATIONS.
When a table is created, the user also creates and names columns related to the specific
characteristics that are stored for each record.
Tables have columns and rows. In the slide example, the EMPLOYEES table stores employee
information. Each row describes an occurrence of an employee. Each column is used to store a
specific type of value, such as employee number, last name, and first name.
The EMPLOYEE_ID column is a primary key. Every employee has a unique identification number.
The value in the primary key column distinguishes each individual row. The PAYROLL_ID column is a
unique key. This means that the system does not allow two rows with the same payroll_id.
The foreign key column refers to a row in another table. In this example, department_id refers to
a row in the DEPARTMENTS table. You know that Dana Smith works in department 10. If you wanted
to know more about Dana Smith's department, you would look for the department_id = 10 row
in the DEPARTMENTS table.

SQL Fundamentals 3 - 18

Oracle University Student Learning Subscription Use Only

A table is a simple structure where data is organized and stored.

More than one tablespace can be present in a database.
a. True
b. False

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Answer: a

SQL Fundamentals 3 - 19

Oracle University Student Learning Subscription Use Only

Q

Quiz

A segment is a logical structure that can span multiple tablespaces.
a. True
b. False

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Answer: b

SQL Fundamentals 3 - 20

Oracle University Student Learning Subscription Use Only

Q

Quiz

In this lesson, you should have learned how to:
• Discuss database data storage
• Define logical structures namely data blocks, extents,
segments, and tablespaces
• Define physical storage structures namely data files, control
files, and online redo log files
• Describe the structure of relational tables

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

SQL Fundamentals 3 - 21

Oracle University Student Learning Subscription Use Only

Summary

This practice covers database storage structures by using the following:
• Crossword puzzle
• Multiple-choice questions

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

In this practice, you will learn about the database storage structures by solving a crossword puzzle
and answering multiple-choice questions.

SQL Fundamentals 3 - 22

Oracle University Student Learning Subscription Use Only

Practice 3: Overview

Lesson 4: Introduction to SQL

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Oracle University Student Learning Subscription Use Only

4

Course Roadmap
Unit 1: Relational Database and SQL
Overview

Lesson 2: Relational Database Overview

Unit 2: Retrieving and Sorting Data
Lesson 3: Database Storage Structures
Unit 3: Joins, Subqueries, and Set
Operators

Lesson 4: Introduction to SQL

Unit 4: DML and DDL

Unit 5: Managing Relational Database

You are here
Unit 6: Advance Queries and Database
Management System

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

In Unit 1, you will learn about databases and database concepts. You will be introduced to relational
databases, data storage concepts, and SQL.

SQL Fundamentals 4 - 2

Oracle University Student Learning Subscription Use Only

Lesson 1: Course Overview

After completing this lesson, you should be able to:
• List the key concepts of SQL
• List the key concepts of PL/SQL
• Discuss the use case used in this course
• Describe the database schemas that are used in this course
• Identify the available user interface environments

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

This lesson introduces you to SQL and PL/SQL. You learn about the database schema and the
tables that the course uses. The course also introduces you to tools such as SQL Developer.

SQL Fundamentals 4 - 3

Oracle University Student Learning Subscription Use Only

Objectives

•
•
•
•

Introduction to SQL
Introduction to PL/SQL
Overview of schemas and the use case used in this course
Overview of the development environments available

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

SQL Fundamentals 4 - 4

Oracle University Student Learning Subscription Use Only

Lesson Agenda

Structured query language (SQL) is:
• The ANSI standard language for operating relational databases
• Efficient, easy to learn and use
• Functionally complete (With SQL, you can define, retrieve, and manipulate
data in tables.)
SELECT department_name
FROM
departments;

Oracle
server

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

In a relational database, you do not specify the access route to the tables, and you do not need to
know how the data is arranged physically.
To access the database, you execute a SQL statement, which is the American National Standards
Institute (ANSI) standard language for operating relational databases. SQL is also compliant to ISO
Standard (SQL:1999).
SQL is a set of statements with which all programs and users access data in an Oracle Database.
Application programs and Oracle tools often allow users access to the database without using SQL
directly, but these applications, in turn, must use SQL when executing the user’s request.
SQL provides statements for a variety of tasks, including:
• Querying data
• Inserting, updating, and deleting rows in a table
• Creating, replacing, altering, and dropping objects
• Controlling access to the database and its objects
• Guaranteeing database consistency and integrity
SQL unifies all of the preceding tasks in one consistent language and enables you to work with data
at a logical level.

SQL Fundamentals 4 - 5

Oracle University Student Learning Subscription Use Only

Using SQL to Query Your Database

SELECT
INSERT
SELECT
UPDATE
INSERT
DELETE
MERGE
UPDATE
CREATE
DELETE
ALTER
MERGE
DROP
RENAME
CREATE
TRUNCATE
ALTER
COMMENT
DROP
GRANT
RENAME
REVOKE
TRUNCATE

Retrieves data from the database, enters new rows, changes existing rows, and
removes unwanted rows from tables in the database, respectively. Collectively
known as data manipulation language (DML)

COMMENT
COMMIT

Manages the changes made by DML statements. Changes to the data can be
grouped together into logical transactions

ROLLBACK
GRANT
SAVEPOINT

Data
manipulation
language
(DML)
Sets up, changes,
and removes
data structures
from tables.
Collectively known as
data definition language (DDL)

Provides or removes
access
rights to both
the Oracle(DDL)
Database and the structures
Data
definition
language
within it

Data control language (DCL)

REVOKE

COMMIT
ROLLBACK
SAVEPOINT

Transaction control

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

SQL Statements
SQL statements supported by Oracle comply with industry standards. Oracle Corporation ensures
future compliance with evolving standards by actively involving key personnel in SQL standards
committees. The industry-accepted committees are ANSI and International Standards Organization
(ISO). Both ANSI and ISO have accepted SQL as the standard language for relational databases.
Statement

Description

SELECT
INSERT
UPDATE
DELETE
MERGE
CREATE
ALTER
DROP
RENAME
TRUNCATE
COMMENT
GRANT
REVOKE

Retrieves data from the database, enters new rows, changes existing rows, and
removes unwanted rows from tables in the database, respectively. Collectively
known as data manipulation language (DML)

COMMIT
ROLLBACK
SAVEPOINT

Manages the changes made by DML statements. Changes to the data can be
grouped together into logical transactions

Sets up, changes, and removes data structures from tables. Collectively known as
data definition language (DDL)

Provides or removes access rights to both the Oracle Database and the structures
within it

SQL Fundamentals 4 - 6

Oracle University Student Learning Subscription Use Only

Statement
Description
SQL
Statements
Used in the Course

•
•
•
•

Introduction to SQL
Introduction to PL/SQL
Overview of schemas and the use case used in this course
Overview of the development environments available

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

SQL Fundamentals 4 - 7

Oracle University Student Learning Subscription Use Only

Lesson Agenda

PL/SQL:
• Stands for “Procedural Language extension to SQL”
• Is Oracle Corporation’s standard data access language for relational
databases
• Seamlessly integrates procedural constructs with SQL

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

SQL is the primary language used to access and modify data in relational databases. However, it has
its own limitations.
Consider a problem statement: For every employee retrieved, check the department ID and salary.
Depending on the department’s performance and also the employee’s salary, you may want to
provide varying bonuses to the employees.
Looking at the problem, you know that you have to execute a SQL statement, collect the data, and
apply logic to the data.
• One solution is to write a SQL statement for each department to give bonuses to the employees
in that department. Remember that you also have to check the salary component before
deciding the bonus amount. This makes it a little complicated.
• A more effective solution might include conditional statements. PL/SQL is designed to meet
such requirements. It provides a programming extension to the already-existing SQL.
PL/SQL defines a block structure for writing code. Maintaining and debugging code is made easier
with such a structure because you can easily understand the flow and execution of the program unit.
PL/SQL offers modern software engineering features such as data encapsulation, exception
handling, information hiding, and object orientation. It brings state-of-the-art programming to the
Oracle Server and toolset. PL/SQL provides all the procedural constructs that are available in any
third-generation language (3GL).

SQL Fundamentals 4 - 8

Oracle University Student Learning Subscription Use Only

Introduction to PL/SQL

•
•
•
•

Introduction to SQL
Introduction to PL/SQL
Overview of schemas and the use case used in this course
Overview of the development environments available

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

SQL Fundamentals 4 - 9

Oracle University Student Learning Subscription Use Only

Lesson Agenda

Human Resources (HR) Schema for This Course
department_id
department_name
manager_id
location_id

JOB_HISTORY
employee_id
start_date
end_date
job_id
department_id

JOBS

job_id
job_title
min_salary
max_salary

LOCATIONS

location_id
street_address
postal_code
city
state_province
country_id

EMPLOYEES

employee_id
first_name
last_name
email
phone_number
hire_date
job_id
salary
commission_pct
manager_id
department_id

COUNTRIES
country_id
country_name
region_id

REGIONS

region_id
region_name

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

The Human Resources (HR) schema is part of the Oracle Sample Schemas that can be installed in
an Oracle database. The practice sessions in this course use data from the HR schema.
The slide shows the Entity Relationship Diagram (ERD) of the HR schema. The fields marked in blue
indicate a Primary Key.
Table Descriptions
• REGIONS contains rows that represent a region such as the Americas or Asia.
• COUNTRIES contains rows for countries, each of which is associated with a region.
• LOCATIONS contains the specific address of a specific office, warehouse, or production site of a
company in a particular country.
• DEPARTMENTS shows details about the departments in which employees work. Each
department may have a relationship representing the department manager in the EMPLOYEES
table.
• EMPLOYEES contains details about each employee working for a department. Some employees
may not be assigned to any department.
• JOBS contains the job types that can be held by each employee.
• JOB_HISTORY contains the job history of the employees. If an employee changes departments
within a job or changes jobs within a department, a new row is inserted into this table with the
old job information of the employee.

SQL Fundamentals 4 - 10

Oracle University Student Learning Subscription Use Only

DEPARTMENTS

Tables Used in the Course

JOB_GRADES

DEPARTMENTS

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

The following main tables are used in this course:
• EMPLOYEES table: Gives details of all the employees
• DEPARTMENTS table: Gives details of all the departments
• JOB_GRADES table: Gives details of salaries for various grades
Apart from these tables, you will use the other tables listed in the previous slide such as the
LOCATIONS table and the JOB_HISTORY table.
Note: The structure and data for all the tables are provided in Appendix A.

SQL Fundamentals 4 - 11

Oracle University Student Learning Subscription Use Only

EMPLOYEES

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

The Academic (AD) schema is designed for this course so that all the practices in this course use
data from the AD schema. The slide shows the ERD of the AD schema. The fields marked in blue
indicate a Primary Key.
Table Descriptions
• ACADEMIC_SESSION contains rows that define various academic sessions such as Spring,
Fall, and Summer.
• DEPARTMENTS shows details about departments, which offer courses to students in a given
academic session.
• COURSE_DETAILS contains information about all the courses, each of which is associated with
an academic session and a department.
• STUDENT_DETAILS contains the details about each student enrolled in the school for an
academic session.
• PARENT_INFORMATION maintains information about the parents of the students enrolled in the
school.
• STUDENT_COURSE_DETAILS contains details about the courses that each student has enrolled
for in an academic session.
• STUDENT_ATTENDANCE contains rows to maintain the attendance details and exam eligibility of
the students.
• FACULTY_DETAILS contains details about each faculty member working in the school.
• FACULTY_COURSE_DETAILS contains details about the courses taught by various faculty
members.
• FACULTY_LOGIN_DETAILS contains rows to maintain the login information of faculty
members.
SQL Fundamentals 4 - 12

Oracle University Student Learning Subscription Use Only

Academic (AD) Schema

•
•

EXAM_TYPE contains rows to define all the exam types, such as ESSAY exams, LAB
exams, and so on.
EXAM_DETAILS contains details about the various exams conducted as part of academic
sessions.
EXAM_RESULTS contains data to maintain the results of students for all the exams they
appear in.

Oracle University Student Learning Subscription Use Only

•

SQL Fundamentals 4 - 13

•
•
•

Cloned HR account IDs are set up in the Database Cloud service for each of
you.
You are assigned one account ID for the lab practices.
On your local machine, you should have SQL Developer installed so that
you can access the Oracle Database Cloud service.

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

SQL Fundamentals 4 - 14

Oracle University Student Learning Subscription Use Only

Class Account Information

Course Environment
You need to have these installed locally:
–
–
–

•

SQL Developer 4.1.3
Java Platform (JDK)
Internet Browser (Mozilla Firefox/Internet Explorer)

On Oracle Cloud:
–

Oracle Database 12c on Database as a Service (DBaaS)

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

SQL Fundamentals 4 - 15

Oracle University Student Learning Subscription Use Only

•

•
•
•
•

Introduction to SQL
Introduction to PL/SQL
Overview of schemas and the use case used in this course
Overview of the development environments available

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

SQL Fundamentals 4 - 16

Oracle University Student Learning Subscription Use Only

Lesson Agenda

This course setup provides the following tools for developing SQL code:
• Oracle SQL Developer (used in this course)
• Oracle SQL*Plus

SQL Developer

SQL*Plus

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Oracle provides several tools that can be used to write PL/SQL code. Some of the development tools
that are available for use in this course are:
• Oracle SQL Developer: A graphical tool
• Oracle SQL*Plus: A command-line tool
Note: The code and screen examples presented in the course notes were generated from the output
in the SQL Developer environment.

SQL Fundamentals 4 - 17

Oracle University Student Learning Subscription Use Only

SQL Development Environments

•
•
•

Oracle SQL Developer is a free graphical tool that enhances productivity
and simplifies database development tasks.
You can connect to any target Oracle database schema by using standard
Oracle database authentication.
You use SQL Developer in this course.

SQL Developer

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Oracle SQL Developer is a free graphical tool designed to improve your productivity and simplify the
development of everyday database tasks. With just a few clicks, you can easily create and maintain
stored procedures, test SQL statements, and view optimizer plans.
SQL Developer, the visual tool for database development, simplifies the following tasks:
• Browsing and managing database objects
• Executing SQL statements and scripts
• Editing and debugging PL/SQL statements
• Creating reports
You can connect to any target Oracle database schema by using standard Oracle database
authentication. When you are connected, you can perform operations on objects in the database.

SQL Fundamentals 4 - 18

Oracle University Student Learning Subscription Use Only

What Is Oracle SQL Developer?

•
•
•
•
•
•

Is shipped along with Oracle Database 12c Release 1
Is developed in Java
Supports Windows, Linux, and Mac OS X platforms
Enables default connectivity using the Java Database Connectivity (JDBC)
Thin driver
Connects to Oracle Database version 9.2.0.1 and later
Connects to Oracle Database on Cloud also

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Oracle SQL Developer is shipped along with Oracle Database 12c Release 1 by default. SQL
Developer is developed in Java, leveraging the Oracle JDeveloper integrated development
environment (IDE). Therefore, it is a cross-platform tool. The tool runs on Windows, Linux, and Mac
operating system (OS) X platforms.
The default connectivity to the database is through the JDBC Thin driver, and therefore, no Oracle
Home is required. SQL Developer does not require an installer and you need to simply unzip the
downloaded file. With SQL Developer, users can connect to Oracle Databases 9.2.0.1 and later, and
all Oracle database editions, including Express Edition.
Note
• For Oracle Database 12c Release 1, you will have to download and install SQL Developer. SQL
Developer can be downloaded free from the following link:
http://www.oracle.com/technetwork/developer-tools/sql-developer/downloads/index.html
• For instructions on how to install SQL Developer, see the website at:
http://www.oracle.com/technetwork/developer-tools/sql-developer/overview/index.html

SQL Fundamentals 4 - 19

Oracle University Student Learning Subscription Use Only

Specifications of SQL Developer

You must define a connection to start
using SQL Developer for running SQL
queries on a database schema.

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

The SQL Developer interface contains three main navigation tabs:
• Connections tab: By using this tab, you can browse database objects and users to which you
have access.
• Reports tab: Identified by the Reports icon, this tab enables you to run predefined reports or
create and add your own reports.
• Files tab: Identified by the Files folder icon, this tab enables you to access files from your local
machine without having to use the File > Open menu.
General Navigation and Use
SQL Developer uses the left side for navigation to find and select objects, and the right side to
display information about selected objects. You can customize many aspects of the appearance and
behavior of SQL Developer by setting preferences.
Note: You need to define at least one connection to be able to connect to a database schema and
issue SQL queries or run procedures and functions.

SQL Fundamentals 4 - 20

Oracle University Student Learning Subscription Use Only

SQL Developer 4.1.3 Interface

The following menus contain standard entries, as well as entries for features that are specific to
SQL Developer:
• View: Contains options that affect what is displayed in the SQL Developer interface
• Navigate: Contains options for navigating to panes and for executing subprograms
• Run: Contains the Run File and Execution Profile options that are relevant when a
function or procedure is selected, and also debugging options
• Versioning: Provides integrated support for the following versioning and source control
systems—Concurrent Versions System (CVS) and Subversion
• Tools: Contains options to invoke SQL Developer tools such as SQL*Plus, Preferences,
and SQL Worksheet. It also contains options related to migrating third-party databases to
Oracle.
Note: The Run menu also contains options that are relevant when a function or procedure is
selected for debugging.

SQL Fundamentals 4 - 21

Oracle University Student Learning Subscription Use Only

Menus

•
•

You must have at least one database connection to use SQL Developer.
You can create and test connections for:
–
–
–

Multiple databases
Multiple schemas
Database on Oracle Cloud

•

SQL Developer automatically imports any connections defined in the
tnsnames.ora file on your system.

•

Each additional database connection created is listed in the Connections
Navigator hierarchy.

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

A connection is a SQL Developer object that specifies the necessary information for connecting to a
specific database as a specific user of that database. To use SQL Developer, you must have at least
one database connection, which may be existing, created, or imported.
You can create and test connections for multiple databases and for multiple schemas.
By default, the tnsnames.ora file is located in the $ORACLE_HOME/network/admin directory, but
it can also be in the directory specified by the TNS_ADMIN environment variable or registry value.
When you start SQL Developer and open the Database Connections dialog box, SQL Developer
automatically imports any connections defined in the tnsnames.ora file on your system.
Note: On Windows, if the tnsnames.ora file exists, but its connections are not being used by SQL
Developer, define TNS_ADMIN as a system environment variable.
You can export connections to an XML file so that you can reuse them.
You can create additional connections as different users to the same database or to connect to
different databases.

SQL Fundamentals 4 - 22

Oracle University Student Learning Subscription Use Only

Creating a Database Connection

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Oracle SQL*Plus is a command-line interface that enables you to submit SQL statements and
receive the results in an application or a command window.
SQL*Plus is:
• Shipped with the database
• Installed on a client and on the database server system
• Accessed by using an icon or the command line
Note
• In a Linux environment, you can launch SQL*Plus by establishing a connection to Oracle Cloud
Database instance and creating a SSH tunnel for port using the ssh utility on Linux.
• For more details on accessing SQL *Plus using the ssh utility, refer to Creating an SSH Tunnel
Using the ssh Utility on Linux on Oracle Help Center.

SQL Fundamentals 4 - 23

Oracle University Student Learning Subscription Use Only

Coding SQL in SQL*Plus

Creating a Connection to Database on Oracle Cloud
Username hr allows you to
view HR schema objects

Connection
created

3

2

Public IP of
the database
instance on
cloud

PDB service
name of the
instance on
cloud

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

To create a connection to the database on the cloud, perform the following steps:
1. On the Connections tab, right-click Connections and select New Connection.
2. In the New/Select Database Connection window, enter the connection name. Enter the
username and password of the schema that you want to connect to.
a. From the Role drop-down list, you can select either default or SYSDBA. (You choose
SYSDBA for the sys user or any user with database administrator privileges.)
b. Select the connection type as Basic.
c. Enter the connection details as follows:
i) Hostname: Public IP listed in the Oracle Cloud DBaaS for the database instance
ii) Port: 1521
iii) Service name: PDB service name of the instance on the cloud in the format given
below:
..oraclecloud.internal
d. Click Test to ensure that the connection has been set correctly.
e. Click Connect.
If you select the Save Password check box, the password is saved to an XML file. So, after you
close the SQL Developer connection and open it again, you are not prompted for the password.
3. The connection gets added in the Connections Navigator. You can expand the connection to
view the database objects and view object definitions—for example, dependencies, details, and
statistics.
SQL Fundamentals 4 - 24

Oracle University Student Learning Subscription Use Only

1

Which four of the following options are DDL statements?
a. CREATE
b. ALTER
c. TRUNCATE
d. DELETE
e. UPDATE
f. DROP

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Answer: a, b, c, f

SQL Fundamentals 4 - 25

Oracle University Student Learning Subscription Use Only

Q

Quiz

In this lesson, you should have learned how to:
• Discuss the key concepts of SQL
• Describe the database schemas that are used in the course
• Identify the available user interface environments that can be used in this
course
• Describe the salient features of Oracle Cloud
• Reference the available documentation and other resources

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

SQL Fundamentals 4 - 26

Oracle University Student Learning Subscription Use Only

Summary

This practice covers the following topics:
• Starting SQL Developer
• Creating a new database connection
• Browsing the Academic (AD) schema tables
• Setting a SQL Developer preference

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

In this practice, you use SQL Developer to execute SQL statements to examine data in the AD
schema. You also create a simple anonymous block.
Note: All written practices use SQL Developer as the development environment.

SQL Fundamentals 4 - 27

Oracle University Student Learning Subscription Use Only

Practice 4: Overview

Oracle University Student Learning Subscription Use Only

Lesson 5: Retrieving Data Using
the SQL SELECT Statement

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Oracle University Student Learning Subscription Use Only

5

Course Roadmap
Unit 1: Relational Database and SQL
Overview

You are here

Lesson 5: Retrieving Data Using SQL
SELECT Statement

Unit 2: Retrieving and Sorting Data
Lesson 6: Restricting and Sorting Data
Unit 3: Joins, Subqueries, and Set
Operators
Lesson 7: Using Single-Row Functions
Unit 4: DML and DDL
Lesson 8: Using Conversion Functions
Unit 5: Managing Relational Database
Lesson 9: Using Conditional Expressions
Unit 6: Advance Queries and Database
Management System

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

In Unit 2, you will dive into the concepts of SQL. You will learn to use the SQL SELECT statement to
retrieve data from database tables and restrict and sort the retrieved data. You will also learn about
single-row functions, conversion functions, and conditional expressions in SQL.

SQL Fundamentals 5 - 2

Oracle University Student Learning Subscription Use Only

Lesson 1: Course Overview

After completing this lesson, you should be able to:
• List the capabilities of SQL SELECT statements
• Execute a basic SELECT statement

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

To extract data from the database, you need to use the SQL SELECT statement. However, you may
need to restrict the columns that are displayed. This lesson describes the SELECT statement that is
needed to perform these actions. Further, you may want to create SELECT statements that can be
used more than once.

SQL Fundamentals 5 - 3

Oracle University Student Learning Subscription Use Only

Objectives

•
•
•
•
•

Capabilities of SQL SELECT statements
Arithmetic expressions and NULL values in the SELECT statement
Column aliases
Use of concatenation operator, literal character strings, alternative quote
operator, and the DISTINCT keyword
DESCRIBE command

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

SQL Fundamentals 5 - 4

Oracle University Student Learning Subscription Use Only

Lesson Agenda

Basic SELECT Statement

SELECT
FROM

*|{[DISTINCT] column [alias],...}
table;

FROM identifies the table containing
those columns.

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

In its simplest form, a SELECT statement must include the following:
• A SELECT clause, which specifies the columns to be displayed
• A FROM clause, which identifies the table containing the columns that are listed in the SELECT
clause
In the syntax:
SELECT
Is a keyword to select one or more columns
*
Selects all columns
DISTINCT
Suppresses duplicates
column|expression
Selects the named column or the expression
alias
Gives different headings to the selected columns
FROM table
Specifies the table containing the columns
Note: Throughout this course, the words keyword, clause, and statement are used as follows:
• A keyword refers to an individual SQL element—for example, SELECT and FROM are keywords.
• A clause is a part of a SQL statement—for example, SELECT employee_id, last_name, and
so on.
• A statement is a combination of two or more clauses—for example, SELECT * FROM
employees.

SQL Fundamentals 5 - 5

Oracle University Student Learning Subscription Use Only

SELECT identifies the columns
to be displayed.

SELECT *
FROM
departments;

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

You can display all columns of data in a table by using the SELECT keyword followed by an asterisk
(*). In the example in the slide, the DEPARTMENTS table contains four columns: DEPARTMENT_ID,
DEPARTMENT_NAME, MANAGER_ID, and LOCATION_ID. The table contains eight rows, one for each
department.
You can also display all columns in the table by listing them after the SELECT keyword. For example,
the following SQL statement (like the example in the slide) displays all columns and all rows of the
DEPARTMENTS table:
SELECT department_id, department_name, manager_id, location_id
FROM
departments;
Note: In SQL Developer, you can enter your SQL statement in a SQL Worksheet and click the
“Execute Statement” icon or press [F9] to execute the statement. The output displayed on the Results
tabbed page appears as shown in the slide.

SQL Fundamentals 5 - 6

Oracle University Student Learning Subscription Use Only

Selecting All Columns

SELECT department_id, location_id
FROM
departments;

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

You can use the SELECT statement to display specific columns of the table by specifying the column
names, separated by commas. The example in the slide displays all the department numbers and
location numbers from the DEPARTMENTS table.
In the SELECT clause, specify the columns that you want in the order in which you want them to
appear in the output. For example, to display location before department number (from left to right),
you use the following statement:
SELECT location_id, department_id
FROM
departments;

SQL Fundamentals 5 - 7

Oracle University Student Learning Subscription Use Only

Selecting Specific Columns

•
•
•
•
•
•

•

SQL statements are not case-sensitive.
SQL statements can be entered on one or more lines.
Keywords cannot be abbreviated or split across lines.
Clauses are usually placed on separate lines.
Indents are used to enhance readability.
In SQL Developer, SQL statements can be optionally terminated by a
semicolon (;). Semicolons are required when you execute multiple SQL
statements.
In SQL*Plus, you are required to end each SQL statement with a semicolon
(;).

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Writing SQL Statements
By using the following simple rules and guidelines, you can construct valid statements that are easy
to read and edit:
• SQL statements are not case-sensitive (unless indicated).
• SQL statements can be entered on one or many lines.
• Keywords cannot be split across lines or abbreviated.
• Clauses are usually placed on separate lines for readability and ease of editing.
• Indents should be used to make code more readable.
• Keywords typically are entered in uppercase; all other words, such as table names and columns
names, are entered in lowercase.
Executing SQL Statements
In SQL Developer, click the Run Script icon or press [F5] to run the command or commands in the
SQL Worksheet. You can also click the Execute Statement icon or press [F9] to run a SQL statement
in the SQL Worksheet. The Execute Statement icon executes the statement at the cursor in the Enter
SQL Statement box while the Run Script icon executes all the statements in the Enter SQL
Statement box. The Execute Statement icon displays the output of the query on the Results tabbed
page, whereas the Run Script icon shows the output on the Script Output tabbed page.

SQL Fundamentals 5 - 8

Oracle University Student Learning Subscription Use Only

Writing SQL Statements

Column Heading Defaults for Output
SQL Developer:
–
–

Default heading alignment: Left-aligned
Default heading display: Uppercase

SELECT last_name, hire_date, salary
FROM
employees;

Left-aligned

Uppercase

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

In SQL Developer, column headings are displayed in uppercase and are left-aligned. You can run the
following command to observe the output:
SELECT last_name, hire_date, salary
FROM
employees;
You can override the column heading display with an alias. Column aliases are covered later in this
lesson.

SQL Fundamentals 5 - 9

Oracle University Student Learning Subscription Use Only

•

•
•
•
•
•

Capabilities of SQL SELECT statements
Arithmetic expressions and NULL values in the SELECT statement
Column aliases
Use of concatenation operator, literal character strings, alternative quote
operator, and the DISTINCT keyword
DESCRIBE command

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

SQL Fundamentals 5 - 10

Oracle University Student Learning Subscription Use Only

Lesson Agenda

Arithmetic Expressions

Operator

Description

+

Add

-

Subtract

*

Multiply

/

Divide

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

You may need to modify the way in which data is displayed, or you may want to perform calculations
or look at what-if scenarios. All these are possible by using arithmetic expressions. An arithmetic
expression can contain column names, constant numeric values, and the arithmetic operators.
Arithmetic Operators
The slide lists the arithmetic operators that are available in SQL. You can use arithmetic operators in
any clause of a SQL statement (except the FROM clause).
Note: With the DATE and TIMESTAMP data types, you can use the addition and subtraction operators
only.

SQL Fundamentals 5 - 11

Oracle University Student Learning Subscription Use Only

Create expressions with Number and Date data by using arithmetic operators.

SELECT last_name, salary, salary + 300
FROM
employees;

…
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

The example in the slide uses the addition operator to calculate a salary increase of $300 for all
employees. The slide also displays a SALARY+300 column in the output.
Note that the resultant calculated column, SALARY+300, is not a new column in the EMPLOYEES
table; it is for display only. By default, the name of a new column comes from the calculation that
generated it—in this case, salary+300.
Note: The Oracle server ignores blank spaces before and after the arithmetic operator.
Rules of Precedence
• Multiplication and division occur before addition and subtraction.
• Operators of the same priority are evaluated from left to right.
• Parentheses are used to override the default precedence or to clarify the statement.

SQL Fundamentals 5 - 12

Oracle University Student Learning Subscription Use Only

Using Arithmetic Operators

Operator Precedence

…
SELECT last_name, salary, 12*(salary+100)
FROM
employees;

2

…
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

The first example in the slide displays the last name, salary, and annual compensation of employees.
It calculates the annual compensation by multiplying the monthly salary with 12, plus a one-time
bonus of $100. Note that multiplication is performed before addition.
Note: Use parentheses to reinforce the standard order of precedence and to improve clarity. For
example, the expression in the slide can be written as (12*salary)+100 with no change in the
result.
Using Parentheses
You can override the rules of precedence by using parentheses to specify the desired order in which
the operators are to be executed.
The second example in the slide displays the last name, salary, and annual compensation of
employees. It calculates the annual compensation as follows: adding a monthly bonus of $100 to the
monthly salary, and then multiplying that subtotal with 12. Because of the parentheses, addition takes
priority over multiplication.

SQL Fundamentals 5 - 13

Oracle University Student Learning Subscription Use Only

1

SELECT last_name, salary, 12*salary+100
FROM
employees;

Defining a Null Value

…

Null is a value that is
unavailable, unassigned,
unknown, or inapplicable.

…

Null is not the same as zero or
a blank space.

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

If a row lacks a data value for a particular column, that value is said to be NULL or to contain a null.
Columns with NULL value can be selected in a SELECT query and can be the part of an arithmetic
expression. Any arithmetic expression using NULL values results into NULL.
Columns of any data type can contain nulls. However, some constraints (NOT NULL and PRIMARY
KEY) prevent nulls from being used in a column.
In the slide example, notice that only a sales manager or sales representative can earn a commission
in the COMMISSION_PCT column of the EMPLOYEES table. Other employees are not entitled to earn
commissions. A null represents that fact.
Note: By default, SQL Developer uses the literal (null) to identify null values. However, you can set it
to something more relevant to you. To do so, select Preferences from the Tools menu. In the
Preferences dialog box, expand the Database node. Click Advanced Parameters and in the right
pane, for “Display Null value As,” enter the appropriate value.

SQL Fundamentals 5 - 14

Oracle University Student Learning Subscription Use Only

SELECT last_name, job_id, salary, commission_pct
FROM
employees;

•
•
•
•
•

Capabilities of SQL SELECT statements
Arithmetic expressions and NULL values in the SELECT statement
Column aliases
Use of concatenation operator, literal character strings, alternative quote
operator, and the DISTINCT keyword
DESCRIBE command

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

SQL Fundamentals 5 - 15

Oracle University Student Learning Subscription Use Only

Lesson Agenda

A column alias:
• Renames a column heading
• Is useful with calculations
• Immediately follows the column name (there can also be the optional AS
keyword between the column name and the alias)
• Requires double quotation marks if it contains spaces or special characters,
or if it is case-sensitive

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

When displaying the result of a query, SQL Developer normally uses the name of the selected
column as the column heading. This heading may not be descriptive and, therefore, may be difficult
to understand. You can change a column heading by using a column alias.
Specify the alias after the column in the SELECT list using blank space as a separator. By default,
alias headings appear in uppercase. If the alias contains spaces or special characters (such as -, !,
_), or if it is case-sensitive, enclose the alias in double quotation marks (“ ”).

SQL Fundamentals 5 - 16

Oracle University Student Learning Subscription Use Only

Defining a Column Alias

Using Column Aliases

…
SELECT last_name "Name" , salary*12 "Annual Salary"
FROM
employees;

…
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

The first example displays the names and the commission percentages of all the employees. Note
that the optional AS keyword has been used before the column alias name. The result of the query is
the same whether the AS keyword is used or not. Also, note that the SQL statement has the column
aliases, name and comm, in lowercase, whereas the result of the query displays the column headings
in uppercase. As mentioned in the preceding slide, column headings appear in uppercase by default.
The second example displays the last names and annual salaries of all the employees. Because
Annual Salary contains a space, it has been enclosed in double quotation marks. Note that the
column heading in the output is exactly the same as the column alias.

SQL Fundamentals 5 - 17

Oracle University Student Learning Subscription Use Only

SELECT last_name AS name, commission_pct comm
FROM
employees;

•
•
•
•
•

Capabilities of SQL SELECT statements
Arithmetic expressions and NULL values in the SELECT statement
Column aliases
Use of concatenation operator, literal character strings, alternative quote
operator, and the DISTINCT keyword
DESCRIBE command

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

SQL Fundamentals 5 - 18

Oracle University Student Learning Subscription Use Only

Lesson Agenda

A concatenation operator:
• Links columns or character strings to other columns
• Is represented by two vertical bars (||)
• Creates a resultant column that is a character expression
SELECT
FROM

last_name||job_id AS "Employees"
employees;

…
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

You can link columns to other columns, arithmetic expressions, or constant values to create a
character expression by using the concatenation operator (||). Columns on either side of the
operator are combined to make a single output column.
In the example, LAST_NAME and JOB_ID are concatenated, and given the alias Employees. Note
that the last name of the employee and the job code are combined to make a single output column.
The AS keyword before the alias name makes the SELECT clause easier to read.
Null Values with the Concatenation Operator
If you concatenate a null value with a character string, the result is a character string. LAST_NAME
|| NULL results in LAST_NAME.

SQL Fundamentals 5 - 19

Oracle University Student Learning Subscription Use Only

Concatenation Operator

•
•
•

A literal is a character, a number, or a date that is included in the SELECT
statement.
Date and character literal values must be enclosed within single quotation
marks.
Each character string is output once for each row returned.

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

A literal is a character, a number, or a date that is included in the SELECT list. It is not a column name
or a column alias. It is printed for each row returned. Literal strings of free-format text can be included
in the query result and are treated the same as a column in the SELECT list.
The date and character literals must be enclosed within single quotation marks (''); number literals
need not be enclosed in a similar manner.

SQL Fundamentals 5 - 20

Oracle University Student Learning Subscription Use Only

Literal Character Strings

SELECT last_name ||' is a '||job_id
AS "Employee Details"
FROM
employees;

…

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

The example in the slide displays the last names and job codes of all employees. The column has
the heading Employee Details. Note the spaces between the single quotation marks in the SELECT
statement. The spaces improve the readability of the output.
In the following example, the last name and salary for each employee are concatenated with a literal,
to give the returned rows more meaning:
SELECT last_name ||': 1 Month salary = '||salary Monthly
FROM
employees;

SQL Fundamentals 5 - 21

Oracle University Student Learning Subscription Use Only

Using Literal Character Strings

•
•
•

Specify your own quotation mark delimiter.
Select any delimiter.
Increase readability and usability.

SELECT department_name || q'[ Department's Manager Id: ]'
|| manager_id
AS "Department and Manager"
FROM departments;

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Many SQL statements use character literals in expressions or conditions. If the literal itself contains a
single quotation mark, you can use the quote (q) operator and select your own quotation mark
delimiter.
You can choose any convenient delimiter, single-byte or multibyte, or any of the following character
pairs: [ ], { }, ( ), or < >.
In the example shown, the string contains a single quotation mark, which is normally interpreted as a
delimiter of a character string. By using the q operator, however, brackets [ ] are used as the
quotation mark delimiters. The string between the brackets delimiters is interpreted as a literal
character string.

SQL Fundamentals 5 - 22

Oracle University Student Learning Subscription Use Only

Alternative Quote (q) Operator

Using the DISTINCT keyword

1
SELECT department_id
FROM
employees;

2
SELECT DISTINCT department_id
FROM
employees;

…
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Unless you indicate otherwise, SQL displays the results of a query without eliminating the duplicate
rows. The first example in the slide displays all the department numbers from the EMPLOYEES table.
Note that the department numbers are repeated.
To eliminate duplicate rows in the result, include the DISTINCT keyword in the SELECT clause
immediately after the SELECT keyword. In the second example in the slide, the EMPLOYEES table
actually contains 20 rows, but there are only seven unique department numbers in the table.

SQL Fundamentals 5 - 23

Oracle University Student Learning Subscription Use Only

The default display of queries is all rows, including duplicate rows.

Using DISTINCT with Multiple Columns

SELECT DISTINCT department_id, job_id
FROM
employees;

The result is a distinct
combination of columns.

…
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

You can specify multiple columns after the DISTINCT qualifier. The DISTINCT qualifier affects all
the selected columns, and the result is every distinct combination of the columns.
Syntax
SELECT
FROM

DISTINCT col1, col2, ….,coln
table;

where
col1, col2, ….,coln: The combination of columns that are to be displayed distinctly

SQL Fundamentals 5 - 24

Oracle University Student Learning Subscription Use Only

You can specify multiple columns after the DISTINCT qualifier.

•
•
•
•
•

Capabilities of SQL SELECT statements
Arithmetic expressions and NULL values in the SELECT statement
Column aliases
Use of concatenation operator, literal character strings, alternative quote
operator, and the DISTINCT keyword
DESCRIBE command

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

SQL Fundamentals 5 - 25

Oracle University Student Learning Subscription Use Only

Lesson Agenda

•

Use the DESCRIBE command to display the structure of a table.

•

Alternatively, select the table in the Connections tree and use the Columns
tab to view the table structure.
DESC[RIBE] tablename

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

You can display the structure of a table by using the DESCRIBE command. The command displays
the column names and the data types, and it shows you whether a column must contain data (that is,
whether the column has a NOT NULL constraint).
In the syntax, table name is the name of any existing table, view, or synonym that is accessible to
the user.
Using the SQL Developer GUI interface, you can select the table in the Connections tree and use the
Columns tab to view the table structure.
Note: DESCRIBE is a SQL*Plus command supported by SQL Developer. It is abbreviated as DESC.

SQL Fundamentals 5 - 26

Oracle University Student Learning Subscription Use Only

Displaying Table Structure

Using the DESCRIBE Command

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

The example in the slide displays information about the structure of the EMPLOYEES table using the
DESCRIBE command.
In the resulting display, Null indicates that the values for this column may be unknown. NOT NULL
indicates that a column must contain data. Type displays the data type for a column.
The data types are described in the following table:

Data Type

Description

NUMBER(p,s)

Number value having a maximum number of digits p, with s
digits to the right of the decimal point

VARCHAR2(s)

Variable-length character value of maximum size s

DATE

Date and time value between January 1, 4712 B.C. and
December 31, 9999 A.D.

SQL Fundamentals 5 - 27

Oracle University Student Learning Subscription Use Only

DESCRIBE employees

Identify the SELECT statements that execute successfully.
a.

SELECT first_name, last_name, job_id, salary*12
AS Yearly Sal
FROM
employees;

b.

SELECT first_name, last_name, job_id, salary*12
"yearly sal"
FROM
employees;

c.

SELECT first_name, last_name, job_id, salary AS
"yearly sal"
FROM
employees;

d.

SELECT first_name+last_name AS name, job_Id,
salary*12 yearly sal
FROM
employees;

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Answer: b, c

SQL Fundamentals 5 - 28

Q

Oracle University Student Learning Subscription Use Only

Quiz

Summary

•
•
•

Returns all rows and columns from a table
Returns specified columns from a table
Uses column aliases to display more descriptive column headings

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

In this lesson, you should have learned how to retrieve data from a database table with the SELECT
statement.
SELECT *|{[DISTINCT] column [alias],...}
FROM
table;
In the syntax:
SELECT
*
DISTINCT
column|expression
alias
FROM table

Is a keyword to select one or more columns
Selects all columns
Suppresses duplicates
Selects the named column or the expression
Gives different headings to the selected columns
Specifies the table containing the columns

SQL Fundamentals 5 - 29

Oracle University Student Learning Subscription Use Only

In this lesson, you should have learned how to write a SELECT statement that:

This practice covers the following topics:
• Selecting all data from different tables
• Describing the structure of tables
• Performing arithmetic calculations and specifying column names

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

In this practice, you write simple SELECT queries. The queries cover most of the SELECT clauses
and operations that you learned in this lesson.

SQL Fundamentals 5 - 30

Oracle University Student Learning Subscription Use Only

Practice 5: Overview

Lesson 6: Restricting and Sorting
Data

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Oracle University Student Learning Subscription Use Only

6

Course Roadmap
Unit 1: Relational Database and SQL
Overview

You are here

Lesson 5: Retrieving Data Using SQL
SELECT Statement

Unit 2: Retrieving and Sorting Data
Lesson 6: Restricting and Sorting Data
Unit 3: Joins, Subqueries, and Set
Operators
Lesson 7: Using Single-Row Functions
Unit 4: DML and DDL
Lesson 8: Using Conversion Functions
Unit 5: Managing Relational Database
Lesson 9: Using Conditional Expressions
Unit 6: Advance Queries and Database
Management System

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

In Unit 2, you will dive into the concepts of SQL. You will learn to use the SQL SELECT statement to
retrieve data from database tables and restrict and sort the retrieved data. You will also learn about
single-row functions, conversion functions, and conditional expressions in SQL.

SQL Fundamentals 6 - 2

Oracle University Student Learning Subscription Use Only

Lesson 1: Course Overview

After completing this lesson, you should be able to:
• Limit the rows that are retrieved by a query
• Sort the rows that are retrieved by a query
• Use ampersand substitution to restrict and sort output at run time

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

When retrieving data from the database, you may need to do the following:
• Restrict the rows of data that are displayed.
• Specify the order in which the rows are displayed.
This lesson explains the SQL statements that you use to perform the actions listed in the slide.

SQL Fundamentals 6 - 3

Oracle University Student Learning Subscription Use Only

Objectives

Lesson Agenda
Limiting rows with:
–
–
–

WHERE clause
Comparison operators using =, <=, BETWEEN, IN, LIKE, and NULL conditions
Logical conditions using AND, OR, and NOT operators

•
•

Rules of precedence for operators in an expression
Sorting rows using the ORDER BY clause

•
•
•

SQL row limiting clause in a query
Substitution variables
DEFINE and VERIFY commands

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

SQL Fundamentals 6 - 4

Oracle University Student Learning Subscription Use Only

•

Limiting Rows by Using a Selection

…

“Retrieve all
employees in department 90”

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

In the example in the slide, assume that you want to display all the employees in department 90. The
rows with a value of 90 in the DEPARTMENT_ID column are the only ones that are returned. This
method of restriction is the basis of the WHERE clause in SQL.

SQL Fundamentals 6 - 5

Oracle University Student Learning Subscription Use Only

EMPLOYEES

SELECT *|{[DISTINCT] column [alias],...}
FROM
table
[WHERE logical expression(s)];

Restrict the rows that are
returned by using the WHERE
clause.

The WHERE clause follows the
FROM clause.

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

You can restrict the rows that are returned from the query by using the WHERE clause. The WHERE
clause contains a condition that must be met and it directly follows the FROM clause. If the condition is
true, the row meeting the condition is returned.
In the syntax:
WHERE
logical expression

Restricts the query to rows that meet a condition
Is composed of column names, constants, and a
comparison operator. It specifies a combination of one or
more expressions and Boolean operators, and returns a
value of TRUE, FALSE, or UNKNOWN.

The WHERE clause can compare values in columns, literals, arithmetic expressions, or functions. It
consists of three elements:
• Column name
• Comparison condition
• Column name, constant, or list of values

SQL Fundamentals 6 - 6

Oracle University Student Learning Subscription Use Only

Limiting Rows That Are Selected

SELECT employee_id, last_name, job_id, department_id
FROM
employees
WHERE department_id = 90 ;

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

In the example, the SELECT statement retrieves the employee ID, last name, job ID, and department
number of all employees who are in department 90.
Note: You cannot use column alias in the WHERE clause.

SQL Fundamentals 6 - 7

Oracle University Student Learning Subscription Use Only

Using the WHERE Clause

•
•
•

Character strings and date values are enclosed within single quotation
marks.
Character values are case-sensitive and date values are format-sensitive.
The default date display format is DD-MON-RR.

SELECT last_name, job_id, department_id
FROM
employees
WHERE last_name = 'Whalen';
SELECT last_name
FROM
employees
WHERE hire_date = '17-OCT-11' ;

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Character strings and dates in the WHERE clause must be enclosed within single quotation marks
(''). Number constants, however, need not be enclosed within single quotation marks.
All character searches are case-sensitive. In the following example, no rows are returned because
the EMPLOYEES table stores all the last names in mixed case:
SELECT last_name, job_id, department_id
FROM
employees
WHERE last_name = 'WHALEN';
Oracle databases store dates in an internal numeric format, representing the century, year, month,
day, hours, minutes, and seconds. The default date display is in the DD-MON-RR format.
Note: For details about the RR format and about changing the default date format, see the lesson
titled “Using Single-Row Functions to Customize Output.” Also, you learn about the use of single-row
functions such as UPPER and LOWER to override the case sensitivity in the same lesson.

SQL Fundamentals 6 - 8

Oracle University Student Learning Subscription Use Only

Character Strings and Dates

Comparison Operators
Meaning

=

Equal to

>

Greater than

>=

Greater than or equal to

<

Less than

<=

Less than or equal to

<>

Not equal to

BETWEEN
...AND...
IN(set)
LIKE
IS NULL

Between two values (inclusive)
Match any of a list of values
Match a character pattern
Is a null value

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Comparison operators are used in conditions that compare one expression with another value or
expression. They are used in the WHERE clause in the following format:
Syntax
... WHERE expr operator value
Example
... WHERE hire_date = '01-JAN-05'
... WHERE salary >= 6000
... WHERE last_name = 'Smith'
Remember, an alias cannot be used in the WHERE clause.
Note: The symbols != and ^= can also represent the not equal to condition.

SQL Fundamentals 6 - 9

Oracle University Student Learning Subscription Use Only

Operator

SELECT last_name, salary
FROM
employees
WHERE salary <= 3000 ;

SELECT *
FROM
employees
WHERE last_name = ‘Ernst’;

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

In the first example in the slide, the SELECT statement retrieves the last name and salary from the
EMPLOYEES table for any employee whose salary is less than or equal to $3,000. Note that there is
an explicit value supplied to the WHERE clause. The explicit value of 3000 is compared to the salary
value in the SALARY column of the EMPLOYEES table.
In the second code example, the SELECT statement retrieves all rows where the last name is Ernst.
Because * is used in the SELECT statement, all fields from the EMPLOYEES table would appear in the
result set.

SQL Fundamentals 6 - 10

Oracle University Student Learning Subscription Use Only

Using Comparison Operators

Range Conditions Using the BETWEEN Operator

SELECT last_name, salary
FROM
employees
WHERE salary BETWEEN 2500 AND 3500 ;
Lower limit Upper limit

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

You can display rows based on a range of values using the BETWEEN operator. The range that you
specify contains a lower limit and an upper limit.
The SELECT statement in the slide returns rows from the EMPLOYEES table for any employee whose
salary is between $2,500 and $3,500.
Values that are specified with the BETWEEN operator are inclusive. However, you must specify the
lower limit first.
You can also use the BETWEEN operator on character values:
SELECT last_name FROM employees
WHERE last_name BETWEEN ‘King’ AND ‘Whalen’;

SQL Fundamentals 6 - 11

Oracle University Student Learning Subscription Use Only

Use the BETWEEN operator to display
rows based on a range of values.

Using the IN Operator

SELECT employee_id, last_name, salary, manager_id
FROM
employees
WHERE manager_id IN (100, 101, 201) ;

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

To test for values in a specified set of values, use the IN operator. The condition defined using the
IN operator is also known as the membership condition.
The example in the slide displays employee numbers, last names, salaries, and manager’s employee
numbers for all the employees whose manager’s employee number is 100, 101, or 201.
Note: The set of values can be specified in any random order—for example, (201,100,101).
The IN operator can be used with any data type. The following example returns a row from the
EMPLOYEES table, for any employee whose last name is included in the list of names in the WHERE
clause:
SELECT employee_id, manager_id, department_id
FROM
employees
WHERE last_name IN ('Hartstein', 'Vargas');
If characters or dates are used in a list, they must be enclosed within single quotation marks ('').

SQL Fundamentals 6 - 12

Oracle University Student Learning Subscription Use Only

Use the IN operator to test for values
in a list.

Use the LIKE operator to perform
wildcard searches of valid search
string values.

SELECT
FROM
WHERE

Search conditions can contain
either literal characters
or numbers.

first_name
employees
first_name LIKE 'S%' ;

% denotes zero or more characters.

_ denotes one character.

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

You may not always know the exact value to search for. You can select rows that match a character
pattern by using the LIKE operator. The character pattern–matching operation is referred to as a
wildcard search. Two symbols can be used to construct the search string.
Symbol

Description

%

Represents any sequence of zero or more characters

_

Represents any single character

The SELECT statement in the slide returns the first name from the EMPLOYEES table for any
employee whose first name begins with the letter “S.” Note the uppercase “S.” Consequently, names
beginning with a lowercase “s” are not returned.
The LIKE operator can be used as a shortcut for some BETWEEN comparisons. The following
example displays the last names and hire dates of all employees who joined between January, 2015
and December, 2015:
SELECT last_name, hire_date
FROM
employees
WHERE hire_date LIKE '%15';

SQL Fundamentals 6 - 13

Oracle University Student Learning Subscription Use Only

Pattern Matching Using the LIKE Operator

You can combine the two wildcard
characters (% and _) with literal
characters for pattern matching.
SELECT last_name
FROM
employees
WHERE last_name LIKE '_o%' ;

You can use the ESCAPE
identifier to search for the
actual % and _ symbols.

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

The % and _ symbols can be used in any combination with literal characters. The example in the slide
displays the names of all employees whose last names have the letter “o” as the second character.
When you need to have an exact match for the actual % and _ characters, use the ESCAPE identifier.

SQL Fundamentals 6 - 14

Oracle University Student Learning Subscription Use Only

Combining Wildcard Characters

Using NULL Conditions

SELECT last_name, manager_id
FROM
employees
WHERE manager_id IS NULL ;

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

The NULL conditions include the IS NULL condition and the IS NOT NULL condition.
The IS NULL condition tests for nulls. A null value means that the value is unavailable, unassigned,
unknown, or inapplicable. Therefore, you cannot test with =, because a null cannot be equal or
unequal to any value. The example in the slide retrieves the last_name and manager_id of all
employees who do not have a manager.
Here is another example: To display the last name, job ID, and commission for all employees who
are not entitled to receive a commission, use the following SQL statement:
SELECT last_name, job_id, commission_pct
FROM
employees
WHERE commission_pct IS NULL;

…
SQL Fundamentals 6 - 15

Oracle University Student Learning Subscription Use Only

Test for nulls with the IS NULL
operator.

Operator

Meaning

AND

Returns TRUE if both component conditions are
true

OR

Returns TRUE if either component condition is
true

NOT

Returns TRUE if the condition is false

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

A logical condition combines the results of two or more component conditions to produce a single
result based on those conditions, or it inverts the result of a single condition. A row is returned only if
the overall result of the condition is true.
Three logical operators are available in SQL:
• AND
• OR
• NOT
All the examples so far have specified only one condition in the WHERE clause. You can use several
conditions in a single WHERE clause using the AND and OR operators.

SQL Fundamentals 6 - 16

Oracle University Student Learning Subscription Use Only

Defining Conditions Using Logical Operators

Using the AND Operator

SELECT
FROM
WHERE
AND

employee_id, last_name, job_id, salary
employees
salary >= 10000
job_id LIKE '%MAN%' ;

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

In the example, both the component conditions must be true for any record to be selected. Therefore,
only those employees who have a job title that contains the string ‘MAN’ and earn $10,000 or more
are selected.
All character searches are case-sensitive, that is, no rows are returned if ‘MAN’ is not uppercase.
Further, character strings must be enclosed within quotation marks.
AND Truth Table
The following table shows the results of combining two expressions with AND:

AND
TRUE

TRUE
TRUE

FALSE
FALSE

NULL
NULL

FALSE
NULL

FALSE
NULL

FALSE
FALSE

FALSE
NULL

SQL Fundamentals 6 - 17

Oracle University Student Learning Subscription Use Only

AND requires both the
component conditions to be
true.

Using the OR Operator

SELECT
FROM
WHERE
OR

employee_id, last_name, job_id, salary
employees
salary >= 10000
job_id LIKE '%MAN%' ;

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

In the example, either component condition can be true for any record to be selected. Therefore, any
employee who has a job ID that contains the string ‘MAN’ or earns $10,000 or both is selected.
OR Truth Table
The following table shows the results of combining two expressions with OR:
OR
TRUE

TRUE
TRUE

FALSE
TRUE

NULL
TRUE

FALSE
NULL

TRUE
TRUE

FALSE
NULL

NULL
NULL

SQL Fundamentals 6 - 18

Oracle University Student Learning Subscription Use Only

OR requires at least one component condition
to be true.

SELECT last_name, job_id
FROM
employees
WHERE job_id
NOT IN ('IT_PROG', 'ST_CLERK', 'SA_REP') ;

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

The example in the slide displays the last name and job ID of all employees whose job ID is not
IT_PROG, ST_CLERK, or SA_REP.
NOT Truth Table
The following table shows the result of applying the NOT operator to a condition:
NOT

TRUE
FALSE

FALSE
TRUE

SQL Fundamentals 6 - 19

NULL
NULL

Oracle University Student Learning Subscription Use Only

Using the NOT Operator

Lesson Agenda
Limiting rows with:
–
–
–

WHERE clause
Comparison conditions using =, <=, BETWEEN, IN, LIKE, and NULL operators
Logical conditions using AND, OR, and NOT operators

•
•

Rules of precedence for operators in an expression
Sorting rows using the ORDER BY clause

•
•
•

SQL row limiting clause in a query
Substitution variables
DEFINE and VERIFY commands

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

SQL Fundamentals 6 - 20

Oracle University Student Learning Subscription Use Only

•

Operator

Meaning

1

Arithmetic operators

2

Concatenation operator

3

Comparison conditions

4

IS [NOT] NULL, LIKE, [NOT] IN

5

[NOT] BETWEEN

6

Not equal to

7

NOT logical operator

8

AND logical operator

9

OR logical operator

You can use parentheses to override rules of precedence.
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

The rules of precedence determine the order in which expressions are evaluated and calculated. The
table in the slide lists the default order of precedence. However, you can override the default order by
using parentheses around the expressions that you want to calculate first.

SQL Fundamentals 6 - 21

Oracle University Student Learning Subscription Use Only

Rules of Precedence

Rules of Precedence
SELECT last_name, department_id, salary
FROM
employees
WHERE
department_id = 60
OR
department_id = 80
AND
salary > 10000;

SELECT last_name, department_id, salary
FROM
employees
WHERE (department_id = 60
OR
department_id = 80)
AND
salary > 10000;

2

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

1. Precedence of the AND Operator: Example
In this example, there are two conditions:
- The first condition is that the department ID is 80 and the salary is greater than $10,000.
- The second condition is that the department ID is 60.
Therefore, the SELECT statement reads as follows:
“Select the row if an employee’s department ID is 80 and earns more than $10,000, or if the
employee’s department ID is 60.”
2. Using Parentheses: Example
In this example, there are two conditions:
- The first condition is that the department ID is 80 or 60.
- The second condition is that the salary is greater than $10,000.
Therefore, the SELECT statement reads as follows:
“Select the row if an employee’s department ID is 80 or 60, and if the employee earns more
than $10,000.”

SQL Fundamentals 6 - 22

Oracle University Student Learning Subscription Use Only

1

Lesson Agenda
Limiting rows with:
–
–
–

WHERE clause
Comparison conditions using =, <=, BETWEEN, IN, LIKE, and NULL operators
Logical conditions using AND, OR, and NOT operators

•
•

Rules of precedence for operators in an expression
Sorting rows using the ORDER BY clause

•
•
•

SQL row limiting clause in a query
Substitution variables
DEFINE and VERIFY commands

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

SQL Fundamentals 6 - 23

Oracle University Student Learning Subscription Use Only

•

Using the ORDER BY Clause
ASC: Ascending order, default

SELECT
last_name, job_id, department_id, hire_date
FROM
employees
ORDER BY hire_date ;

DESC: Descending order

…
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

The order of rows that are returned in a query result is undefined. The ORDER BY clause can be used
to sort the rows. You can specify an expression, an alias, or a column position as the sort condition.
You can specify multiple expressions in the order_by_clause. Oracle Database first sorts rows based
on their values for the first expression. Rows with the same value for the first expression are then
sorted based on their values for the second expression, and so on.
Syntax
SELECT
FROM
[WHERE
[ORDER BY

expr
table
condition(s)]
{column, expr, numeric_position} [ASC|DESC]];

In the syntax:
ORDER BY
Specifies the order in which the retrieved rows are displayed
ASC
Orders the rows in ascending order (this is the default order)
DESC
Orders the rows in descending order
If the ORDER BY clause is not used, the sort order is undefined, and the Oracle server may not fetch
rows in the same order for the same query twice. Use the ORDER BY clause to display the rows in a
specific order.

SQL Fundamentals 6 - 24

Oracle University Student Learning Subscription Use Only

Sort the retrieved rows with the ORDER
BY clause.

Sorting

SELECT
last_name, job_id, department_id, hire_date
FROM
employees
ORDER BY department_id DESC ;

1

Sorting by column alias
SELECT employee_id, last_name, salary*12 annsal
FROM
employees
ORDER BY annsal ;

2

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

The default sort order is ascending:
• Numeric values are displayed with the lowest values first (for example, 1 to 999).
• Date values are displayed with the earliest value first (for example, 01-JAN-12 before 01-JAN16).
• Character values are displayed in the alphabetical order (for example, “A” first and “Z” last).
• Null values are displayed last for ascending sequences and first for descending sequences.
• You can also sort by a column that is not in the SELECT list.
Examples
1. To reverse the order in which the rows are displayed, specify the DESC keyword after the
column name in the ORDER BY clause. The example in the slide sorts the result by the
department_id.
2. You can also use a column alias in the ORDER BY clause. The slide example sorts the data by
annual salary.
Note: Use the keywords NULLS FIRST or NULLS LAST to specify whether returned rows containing
null values should appear first or last in the ordering sequence.

SQL Fundamentals 6 - 25

Oracle University Student Learning Subscription Use Only

Sorting in descending order

Sorting

SELECT
last_name, job_id, department_id, hire_date
FROM
employees
ORDER BY 3;

3

Sorting by multiple columns
SELECT last_name, department_id, salary
FROM
employees
ORDER BY department_id, salary DESC;

4

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Examples
3. You can sort query results by specifying the numeric position of the column in the SELECT
clause. The example in the slide sorts the result by the department_id as this column is at
the third position in the SELECT clause.
4. You can sort query results by more than one column. You list the columns (or SELECT list
column sequence numbers) in the ORDER BY clause, delimited by commas. The results are
ordered by the first column, then the second, and so on for as many columns as the ORDER BY
clause includes. If you want any results sorted in descending order, your ORDER BY clause
must use the DESC keyword directly after the name or the number of the relevant column. The
result of the query example shown in the slide is sorted by department_id in ascending order
and also by salary in descending order.

SQL Fundamentals 6 - 26

Oracle University Student Learning Subscription Use Only

Sorting by using the column’s numeric
position

Lesson Agenda
Limiting rows with:
–
–
–

WHERE clause
Comparison conditions using =, <=, BETWEEN, IN, LIKE, and NULL operators
Logical conditions using AND, OR, and NOT operators

•
•

Rules of precedence for operators in an expression
Sorting rows using the ORDER BY clause

•
•
•

SQL row limiting clause in a query
Substitution variables
DEFINE and VERIFY commands

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

SQL Fundamentals 6 - 27

Oracle University Student Learning Subscription Use Only

•

Using SQL Row Limiting Clause in a Query

SELECT …
FROM …
[ WHERE … ]
[ ORDER BY … ]
[OFFSET offset { ROW | ROWS }]
[FETCH { FIRST | NEXT } [{ row_count | percent PERCENT }] { ROW | ROWS }
{ ONLY | WITH TIES }]

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

You specify the row_limiting_clause in the SQL SELECT statement by placing it after the
ORDER BY clause. Note that an ORDER BY clause is required if you want to sort the rows for
consistency.
• OFFSET: Use this clause to specify the number of rows to skip before row limiting begins. The
value for offset must be a number. If you specify a negative number, offset is treated as 0. If you
specify NULL or a number greater than or equal to the number of rows that are returned by the
query, 0 rows are returned.
• ROW | ROWS: Use these keywords interchangeably. They are provided for semantic clarity.
• FETCH: Use this clause to specify the number of rows or percentage of rows to return.
• FIRST | NEXT: Use these keywords interchangeably. They are provided for semantic clarity.
• row_count | percent PERCENT: Use row_count to specify the number of rows to return. Use
percent PERCENT to specify the percentage of the total number of selected rows to return. The
value for percent must be a number.
• ONLY | WITH TIES: Specify ONLY to return exactly the specified number of rows or percentage
of rows. Specify WITH TIES to return additional rows with the same sort key as the last row
fetched. If you specify WITH TIES, then you must specify the order_by_clause. If you do
not specify the order_by_clause, then no additional rows will be returned.

SQL Fundamentals 6 - 28

Oracle University Student Learning Subscription Use Only

The row_limiting_clause limits the number of rows that
are returned in the result set.

SELECT employee_id, first_name
FROM employees
ORDER BY employee_id
FETCH FIRST 5 ROWS ONLY;
SELECT employee_id, first_name
FROM employees
ORDER BY employee_id
OFFSET 5 ROWS FETCH NEXT 5 ROWS ONLY;

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

•

The first code example returns the five employees with the lowest employee_id.

•

The second code example returns the five employees with the next set of lowest
employee_id.

Note: If employee_id is assigned sequentially by the date when the employee joined the
organization, these examples give us the top 5 employees and then employees 6-10, all in terms of
seniority.

SQL Fundamentals 6 - 29

Oracle University Student Learning Subscription Use Only

SQL Row Limiting Clause: Example

Lesson Agenda
Limiting rows with:
–
–
–

WHERE clause
Comparison conditions using =, <=, BETWEEN, IN, LIKE, and NULL operators
Logical conditions using AND, OR, and NOT operators

•
•

Rules of precedence for operators in an expression
Sorting rows using the ORDER BY clause

•
•
•

SQL row limiting clause in a query
Substitution variables
DEFINE and VERIFY commands

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

SQL Fundamentals 6 - 30

Oracle University Student Learning Subscription Use Only

•

... salary = ? …
… department_id = ? …
... last_name = ? ...

I want
to query
different
values.

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

So far, all the SQL statements were executed with predetermined columns, conditions, and their
values. Suppose that you want a query that lists the employees with various jobs and not just those
whose job_ID is SA_REP. You can edit the WHERE clause to provide a different value each time you
run the command, but there is also an easier way.
By using a substitution variable in place of the exact values in the WHERE clause, you can run the
same query for different values.
You can create reports that prompt users to supply their own values to restrict the range of data
returned, by using substitution variables. You can embed substitution variables in a command file or
in a single SQL statement. A variable can be thought of as a container in which values are
temporarily stored. When the statement is run, the stored value is substituted.

SQL Fundamentals 6 - 31

Oracle University Student Learning Subscription Use Only

Substitution Variables

Substitution Variables
Use substitution variables to temporarily store values with:
–
–

•

Single-ampersand (&) substitution
Double-ampersand (&&) substitution

Use substitution variables to supplement the following:
–
–

WHERE conditions
ORDER BY clauses

–
–
–

Column expressions
Table names
Entire SELECT statements

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

You can use single-ampersand (&) substitution variables to temporarily store values.
You can also predefine variables by using the DEFINE command. DEFINE creates and assigns a
value to a variable.
Restricted Ranges of Data: Examples
• Reporting figures only for the current quarter or the specified date range
• Reporting on data relevant only to the user requesting the report
• Displaying personnel only within a given department
Other Interactive Effects
Interactive effects are not restricted to direct user interaction with the WHERE clause. The same
principles can also be used to achieve other goals, such as:
• Obtaining input values from a file rather than from a person
• Passing values from one SQL statement to another
Note: SQL Developer supports substitution variables and the DEFINE/UNDEFINE commands.

SQL Fundamentals 6 - 32

Oracle University Student Learning Subscription Use Only

•

Using the Single-Ampersand Substitution Variable

SELECT employee_id, last_name, salary, department_id
FROM
employees
WHERE employee_id = &employee_num ;

1

2

3
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

When running a report, users often want to restrict the data that is returned dynamically. SQL
Developer provides this flexibility with user variables. Use an ampersand (&) to identify each variable
in your SQL statement. However, you do not need to define the value of each variable.
Notation

Description

&user_variable

Indicates a variable in a SQL statement; if the variable does
not exist, SQL Developer prompts the user for a value. (The
new variable is discarded after it is used.)

1. The example in the slide creates a SQL Developer substitution variable for an employee
number. When the statement is executed, SQL Developer prompts the user for an employee
number.
Note: With the single ampersand, the user is prompted every time the command is executed if the
variable does not exist.
2. You enter a value and click the OK button.
3. The employee number, last name, salary, and department number for that employee is
displayed in the result.

SQL Fundamentals 6 - 33

Oracle University Student Learning Subscription Use Only

Use a variable prefixed with an ampersand (&) to prompt the user for a value:

Character and Date Values with Substitution Variables

SELECT last_name, department_id, salary*12
FROM
employees
WHERE job_id = '&job_title' ;

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

In a WHERE clause, date and character values must be enclosed within single quotation marks. The
same rule applies to the substitution variables.
Enclose the variables with single quotation marks within the SQL statement itself.
The slide shows a query to retrieve the employee names, department numbers, and annual salaries
of all employees based on the job title value of the SQL Developer substitution variable.

SQL Fundamentals 6 - 34

Oracle University Student Learning Subscription Use Only

Use single quotation marks for date and character values:

SELECT employee_id, last_name, job_id,&column_name
FROM
employees
WHERE &condition
ORDER BY &order_column ;

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

You can use the substitution variables not only in the WHERE clause of a SQL statement, but also as
substitution for column names, expressions, or text.
Example
The example in the slide displays the employee number, last name, job title, and any other column
that is specified by the user at run time, from the EMPLOYEES table. For each substitution variable in
the SELECT statement, you are prompted to enter a value, and then click OK to proceed.
If you do not enter a value for the substitution variable, you get an error when you execute the
statement in the slide.
Note: A substitution variable can be used anywhere in the SELECT statement, except as the first
word entered at the command prompt.

SQL Fundamentals 6 - 35

Oracle University Student Learning Subscription Use Only

Specifying Column Names, Expressions, and Text

SELECT
employee_id, last_name, job_id, &&column_name
FROM
employees
ORDER BY &column_name ;

Use double ampersand (&&) if you want to reuse
the variable value without prompting the user
each time.

…
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

You can use the double-ampersand (&&) substitution variable if you want to reuse the variable value
without prompting the user each time. The user sees the prompt for the value only once. In the
example in the slide, the user is asked to give the value for the column_name variable only once.
The value that is supplied by the user (department_id) is used for both display and ordering of
data. If you run the query again, you will not be prompted for the value of the variable.
SQL Developer stores the value that is supplied by using the DEFINE command; it uses it again
whenever you reference the variable name. After a user variable is in place, you need to use the
UNDEFINE command to delete it:
UNDEFINE column_name;

SQL Fundamentals 6 - 36

Oracle University Student Learning Subscription Use Only

Using the Double-Ampersand Substitution Variable

Lesson Agenda
Limiting rows with:
–
–
–

WHERE clause
Comparison conditions using =, <=, BETWEEN, IN, LIKE, and NULL operators
Logical conditions using AND, OR, and NOT operators

•
•
•

SQL row limiting clause in a query
Rules of precedence for operators in an expression
Sorting rows using the ORDER BY clause

•
•

Substitution variables
DEFINE and VERIFY commands

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

SQL Fundamentals 6 - 37

Oracle University Student Learning Subscription Use Only

•

Using the DEFINE Command
Use the UNDEFINE command
to remove a variable.

DEFINE employee_num = 200
SELECT employee_id, last_name, salary, department_id
FROM
employees
WHERE employee_id = &employee_num ;
UNDEFINE employee_num

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

The example shown creates a substitution variable for an employee number by using the DEFINE
command. At run time, the above query displays the employee number, name, salary, and
department number for the employee whose ID is 200.
Because the variable is created using the SQL Developer DEFINE command, the user is not
prompted to enter a value for the employee number. Instead, the defined variable value is
automatically substituted in the SELECT statement.
The EMPLOYEE_NUM substitution variable is present in the session until the user undefines it or exits
the SQL Developer session.

SQL Fundamentals 6 - 38

Oracle University Student Learning Subscription Use Only

Use the DEFINE command to create
and assign a value to a variable.

Using the VERIFY Command

SET VERIFY ON
SELECT employee_id, last_name, salary
FROM
employees
WHERE employee_id = &employee_num;

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

To confirm the changes in the SQL statement, use the VERIFY command. Setting SET VERIFY ON
forces SQL Developer to display the text of a command after it replaces substitution variables with
values. To see the VERIFY output, you should use the Run Script (F5) icon in the SQL Worksheet.
SQL Developer displays the text of a command after it replaces substitution variables with values, on
the Script Output tab as shown in the slide.
The example in the slide displays the new value of the EMPLOYEE_ID column in the SQL statement
followed by the output.

SQL Fundamentals 6 - 39

Oracle University Student Learning Subscription Use Only

Use the VERIFY command to toggle the display of the
substitution variable, both before and after SQL Developer
replaces substitution variables with values.

Which four of the following are valid operators for the WHERE clause?
a. >=
b. IS NULL
c. !=
d. IS LIKE
e. IN BETWEEN
f. <>

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Answer: a, b, c, f

SQL Fundamentals 6 - 40

Oracle University Student Learning Subscription Use Only

Q

Quiz

In this lesson, you should have learned how to:
• Limit the rows that are retrieved by a query
• Sort the rows that are retrieved by a query
• Use ampersand substitution to restrict and sort output at run time

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

In this lesson, you should have learned about restricting and sorting rows that are returned by the
SELECT statement. You should also have learned how to implement various operators and
conditions.
By using the substitution variables, you can add flexibility to your SQL statements. This enables the
queries to prompt for the filter condition for the rows during run time.

SQL Fundamentals 6 - 41

Oracle University Student Learning Subscription Use Only

Summary

This practice covers the following topics:
• Selecting data and changing the order of the rows
that are displayed
• Restricting rows by using the WHERE clause
• Sorting rows by using the ORDER BY clause
•

Using substitution variables to add flexibility to your
SQL SELECT statements

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

In this practice, you build more reports, including statements that use the WHERE clause and the
ORDER BY clause. You make the SQL statements more reusable and generic by including the
ampersand substitution.

SQL Fundamentals 6 - 42

Oracle University Student Learning Subscription Use Only

Practice 6: Overview

Lesson 7: Using Single-Row
Functions to Customize Output

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Oracle University Student Learning Subscription Use Only

7

Course Roadmap
Unit 1: Relational Database and SQL
Overview

Lesson 5: Retrieving Data Using SQL
SELECT Statement

Unit 2: Retrieving and Sorting Data
Lesson 6: Restricting and Sorting Data
Unit 3: Joins, Subqueries, and Set
Operators
Lesson 7: Using Single-Row Functions
Unit 4: DML and DDL
Lesson 8: Using Conversion Functions
Unit 5: Managing Relational Database
Lesson 9: Using Conditional Expressions
Unit 6: Advance Queries and Database
Management System

You are here
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

In Unit 2, you will dive into the concepts of SQL. You will learn to use the SQL SELECT statement to
retrieve data from database tables and restrict and sort the retrieved data. You will also learn about
single-row functions, conversion functions, and conditional expressions in SQL.

SQL Fundamentals 7 - 2

Oracle University Student Learning Subscription Use Only

Lesson 1: Course Overview

After completing this lesson, you should be able to:
• Describe the various types of functions available in SQL
• Use the character, number, and date functions in SELECT statements

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Functions make the basic query block more powerful, and they are used to manipulate data values.
This is the first of two lessons that explore functions. It focuses on single-row character, number, and
date functions.

SQL Fundamentals 7 - 3

Oracle University Student Learning Subscription Use Only

Objectives

•
•
•
•
•
•

Single-row SQL functions
Character functions
Nesting functions
Number functions
Working with dates
Date functions

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

SQL Fundamentals 7 - 4

Oracle University Student Learning Subscription Use Only

Lesson Agenda

Input
Function
arg 1

Output

Function performs
action

arg 2

Result
value
arg n

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Functions are a very powerful feature of SQL. They can be used to do the following:
• Perform calculations on data.
• Modify individual data items.
• Manipulate output for groups of rows.
• Format dates and numbers for display.
• Convert column data types.
SQL functions sometimes take arguments and always return a value.

SQL Fundamentals 7 - 5

Oracle University Student Learning Subscription Use Only

SQL Functions

Functions

Single-row
functions

Multiple-row
functions

Return one result
per row

Return one result
per set of rows

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

There are two types of functions:
• Single-row functions
• Multiple-row functions
Single-Row Functions
These functions operate on single rows only and return one result per row. There are different types
of single-row functions. This lesson covers the following functions:
• Character
• Number
• Date
Multiple-Row Functions
Functions can manipulate groups of rows to give one result per group of rows. These functions are
also known as group functions (covered in the lesson titled “Reporting Aggregated Data Using the
Group Functions”).
Note: For more information and a complete list of available functions and their syntax, see the
“Functions” section in Oracle Database SQL Language Reference for 12c database.

SQL Fundamentals 7 - 6

Oracle University Student Learning Subscription Use Only

Two Types of SQL Functions

Single-row functions:
• Manipulate data items
• Accept arguments and return one value
• Act on each row that is returned
• Return one result per row
• May modify the data type
• Can be nested
• Accept arguments that can be a column or an expression
function_name [(arg1, arg2,...)]

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Single-row functions are used to manipulate data items. They accept one or more arguments and
return one value for each row that is returned by the query. An argument can be one of the following:
• User-supplied constant
• Variable value
• Column name
• Expression
Features of single-row functions include:
• Act on each row that is returned in the query
• Return one result per row
• Possibly return a data value of a different type than the one that is referenced
• Possibly expect one or more arguments
• Can be used in SELECT, WHERE, and ORDER BY clauses; can be nested
In the syntax:
function_name
arg1, arg2

Is the name of the function
Is any argument to be used by the function. This can be represented by a
column name or expression.

SQL Fundamentals 7 - 7

Oracle University Student Learning Subscription Use Only

Single-Row Functions

Single-Row Functions

Single-row
functions

General

Conversion

Number

Date

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

This lesson covers the following single-row functions:
• Character functions: Accept character input and can return both character and number values
• Number functions: Accept numeric input and return numeric values
• Date functions: Operate on values of the DATE data type
The following single-row functions are discussed in the lesson titled “Using Conversion Functions and
Conditional Expressions”:
• Conversion functions: Convert a value from one data type to another
• General functions: These functions take any data type and can also handle NULLs.

SQL Fundamentals 7 - 8

Oracle University Student Learning Subscription Use Only

Character

•
•
•
•
•
•

Single-row SQL functions
Character functions
Nesting functions
Number functions
Working with dates
Date functions

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

SQL Fundamentals 7 - 9

Oracle University Student Learning Subscription Use Only

Lesson Agenda

Character Functions

Character-manipulation
functions

Case-conversion
functions

CONCAT
SUBSTR
LENGTH
INSTR
LPAD | RPAD
TRIM
REPLACE

LOWER
UPPER
INITCAP

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Single-row character functions accept character data as input and can return both character and
numeric values. Character functions can be divided into the following:
• Case-conversion functions
• Character-manipulation functions

Function

Purpose

LOWER(column|expression)

Converts alpha character values to lowercase

UPPER(column|expression)

Converts alpha character values to uppercase

INITCAP(column|expression)

Converts alpha character values to uppercase for the
first letter of each word; all other letters in lowercase

CONCAT(column1|expression1,
column2|expression2)

Concatenates the first character value to the second
character value; equivalent to concatenation operator
(||)
Returns specified characters from character value
starting at character position m, n characters long (If m
is negative, the count starts from the end of the
character value. If n is omitted, all characters to the
end of the string are returned.)

SUBSTR(column|expression,m[
,n])

Note: The functions discussed in this lesson are only some of the available functions. You can
learn about a few more functions in the next page.

SQL in the Oracle Cloud- Student Learning Subscription 7 - 10

Oracle University Student Learning Subscription Use Only

Character
functions

Purpose

LENGTH(column|expression)

Returns the number of characters in the expression

INSTR(column|expression,
’string’, [,m], [n] )

Returns the numeric position of a named string.
Optionally, you can provide a position m to start
searching, and the occurrence n of the string. m and n
default to 1, meaning start the search at the beginning
of the string and report the first occurrence.
Returns an expression left-padded to length of n
characters with the specified characters.
Returns an expression right-padded to length of n
characters with the specified characters.

LPAD(column|expression, n,
'string')
RPAD(column|expression, n,
'string')

TRIM(leading|trailing|both, Enables you to trim leading or trailing characters (or
trim_character FROM
both) from a character string. If trim_character or
trim_source)
trim_source is a character literal, you must enclose
it in single quotation marks.

REPLACE(text,
search_string,
replacement_string)

Searches a text expression for a character string and,
if found, replaces it with a specified replacement string

SQL Fundamentals 7 - 11

Oracle University Student Learning Subscription Use Only

Function

Case-Conversion Functions

Function

Result

LOWER('SQL Course')

sql course

UPPER('SQL Course')

SQL COURSE

INITCAP('SQL Course')

Sql Course

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

LOWER, UPPER, and INITCAP are the three case-conversion functions.
• LOWER: Converts mixed-case or uppercase character strings to lowercase
• UPPER: Converts mixed-case or lowercase character strings to uppercase
• INITCAP: Converts the first letter of each word to uppercase and the remaining letters to
lowercase
Example
SELECT 'The job id for '||UPPER(last_name)||' is '
||LOWER(job_id) AS "EMPLOYEE DETAILS"
FROM
employees;

SQL Fundamentals 7 - 12

Oracle University Student Learning Subscription Use Only

These functions convert the case for character strings:

Using Case-Conversion Functions

SELECT employee_id, last_name, department_id
FROM
employees
WHERE last_name = 'higgins';

SELECT employee_id, last_name, department_id
FROM
employees
WHERE LOWER(last_name) = 'higgins';

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

The slide example displays the employee number, name, and department number of employee
Higgins.
The WHERE clause of the first SQL statement specifies the employee name as higgins. Because all
the data in the EMPLOYEES table is stored in proper case, the name higgins does not find a match
in the table, and no rows are selected.
The WHERE clause of the second SQL statement specifies that the employee name in the
EMPLOYEES table is compared to higgins, after converting the LAST_NAME column to lowercase for
comparison purposes. Because both names are now lowercase, a match is found and one row is
selected. The WHERE clause can be rewritten in the following manner to produce the same result:
...WHERE last_name = 'Higgins'
The name in the output appears as it was stored in the database. To display the name in uppercase,
use the UPPER function in the SELECT statement.
SELECT employee_id, UPPER(last_name), department_id
FROM
employees
WHERE INITCAP(last_name) = 'Higgins'

SQL Fundamentals 7 - 13

Oracle University Student Learning Subscription Use Only

Display the employee number, name, and department number for employee
Higgins:

Character-Manipulation Functions

Function

Result

CONCAT('Hello', 'World')

HelloWorld

SUBSTR('HelloWorld',1,5)

Hello

LENGTH('HelloWorld')

10

INSTR('HelloWorld', 'W')

6

LPAD(salary,10,‘*')

*****24000

RPAD(salary,10,‘*')

24000*****

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

CONCAT, SUBSTR, LENGTH, INSTR, LPAD, and RPAD are the character-manipulation functions that
are covered in this lesson.
•
CONCAT: Joins values together (you are limited to using two parameters with CONCAT)
•
SUBSTR: Extracts a string of determined length
•
LENGTH: Shows the length of a string as a numeric value
•
INSTR: Finds the numeric position of a named character
•
LPAD: Returns an expression left-padded to the length of n characters with the specified
characters
•
RPAD: Returns an expression right-padded to the length of n characters with the specified
characters
Note: You can use functions such as UPPER and LOWER with ampersand substitution. For example,
use UPPER('&job_title') so that the user does not have to enter the job title in a specific case.

SQL Fundamentals 7 - 14

Oracle University Student Learning Subscription Use Only

These functions manipulate character strings:

SELECT CONCAT(CONCAT(last_name, '''s job category is '), job_id)
"Job" FROM
employees
WHERE SUBSTR(job_id, 4) = 'REP';

1

SELECT
LENGTH
FROM
WHERE

2

employee_id, CONCAT(first_name, last_name) NAME,
(last_name), INSTR(last_name, 'a') "Contains 'a'?"
employees
SUBSTR(last_name, -1, 1) = 'n';

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Examples
1. The first example in the slide displays employee last names and job IDs, joined together for all
employees who have the string REP contained in the job ID starting at the fourth position.
2. The second SQL statement in the slide displays the concatenation of first name and last name,
length of the last name, and the position for the first occurrence of the letter ‘a’ in the last name,
if any, for those employees whose last names end with the letter “n.”

SQL Fundamentals 7 - 15

Oracle University Student Learning Subscription Use Only

Using Character-Manipulation Functions

•
•
•
•
•
•

Single-row SQL functions
Character functions
Nesting functions
Number functions
Working with dates
Date functions

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

SQL Fundamentals 7 - 16

Oracle University Student Learning Subscription Use Only

Lesson Agenda

Single-row functions can be nested to
any level.

Nested functions are evaluated
from the deepest level to the
least deep level.

F3(F2(F1(col,arg1),arg2),arg3)
Step 1 = Result 1
Step 2 = Result 2
Step 3 = Result 3

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Single-row functions can be nested to any depth. Nested functions are evaluated from the innermost
level to the outermost level. Some examples follow to show you the flexibility of these functions.

SQL Fundamentals 7 - 17

Oracle University Student Learning Subscription Use Only

Nesting Functions

SELECT last_name,
UPPER(CONCAT(SUBSTR (LAST_NAME, 1, 8), '_US'))
FROM
employees
WHERE department_id = 60;

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

The example in the slide displays the last names of employees in department 60. The evaluation of
the SQL statement involves three steps:
1. The inner function retrieves the first eight characters of the last name.
Result1 = SUBSTR (LAST_NAME, 1, 8)
2. The outer function concatenates the result with _US.
Result2 = CONCAT(Result1, '_US')
3. The outermost function converts the results to uppercase.
The entire expression becomes the column heading because no column alias was given.

SQL Fundamentals 7 - 18

Oracle University Student Learning Subscription Use Only

Nesting Functions: Example

•
•
•
•
•
•

Single-row SQL functions
Character functions
Nesting functions
Number functions
Working with dates
Date Functions

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

SQL Fundamentals 7 - 19

Oracle University Student Learning Subscription Use Only

Lesson Agenda

•
•
•
•
•

ROUND: Rounds value to a specified decimal
TRUNC: Truncates value to a specified decimal
CEIL: Returns the smallest whole number greater than or equal to a specified
number
FLOOR: Returns the largest whole number equal to or less than a specified number
MOD: Returns remainder of division
Function

Result

ROUND(45.926, 2)

45.93

TRUNC(45.926, 2)

45.92

CEIL (2.83)

3

FLOOR (2.83)

2

MOD (1600, 300)

100

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Numeric functions accept numeric input and return numeric values. This section describes some of
the numeric functions.
Function

Purpose

ROUND(column|expression,
n)

Rounds the column, expression, or value to n decimal
places or, if n is omitted, no decimal places (If n is
negative, numbers to the left of decimal point are rounded.)

TRUNC(column|expression,
n)

Truncates the column, expression, or value to n decimal
places or, if n is omitted, no decimal places

MOD(m,n)

Returns the remainder of m divided by n

Note: This list contains only some of the available numeric functions.
For more information, see the “Numeric Functions” section in Oracle Database SQL Language
Reference for 12c database.

SQL Fundamentals 7 - 20

Oracle University Student Learning Subscription Use Only

Numeric Functions

Using the ROUND Function
1

SELECT ROUND(45.923,2), ROUND(45.923,0),
ROUND(45.923,-1)
3
FROM
DUAL;

1

2

3

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

The ROUND function rounds the column, expression, or value to n decimal places. If the second
argument is 0 or is missing, the value is rounded to zero decimal places. If the second argument is 2,
the value is rounded to two decimal places. Conversely, if the second argument is –2, the value is
rounded to two decimal places to the left (rounded to the nearest unit of 100).
DUAL Table
The DUAL table is owned by the user SYS and can be accessed by all users. It contains one column,
DUMMY, and one row with the value X. The DUAL table is useful when you want to return a value only
once (for example, the value of a constant, pseudocolumn, or expression that is not derived from a
table with user data). The DUAL table is generally used for completeness of the SELECT clause
syntax, because both SELECT and FROM clauses are mandatory, and several calculations do not
need to select from the actual tables.

SQL Fundamentals 7 - 21

Oracle University Student Learning Subscription Use Only

2

Using the TRUNC Function
2

SELECT TRUNC(45.923,2), TRUNC(45.923),
TRUNC(45.923,-1)
FROM
DUAL;

1

2

3

3

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

The TRUNC function truncates the column, expression, or value to n decimal places.
The TRUNC function works with arguments similar to those of the ROUND function. If the second
argument is 0 or is missing, the value is truncated to zero decimal places. If the second argument is
2, the value is truncated to two decimal places. Conversely, if the second argument is –2, the value is
truncated to two decimal places to the left. If the second argument is –1, the value is truncated to one
decimal place to the left.

SQL Fundamentals 7 - 22

Oracle University Student Learning Subscription Use Only

1

Using the MOD Function

SELECT employee_id as "Even Numbers", last_name
FROM employees
WHERE MOD(employee_id,2) = 0;

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

The MOD function finds the remainder of the first argument divided by the second argument. The slide
example displays employee records where the employee_id is an even number.
Note: The MOD function is often used to determine whether a value is odd or even.

SQL Fundamentals 7 - 23

Oracle University Student Learning Subscription Use Only

Display the employee records where the employee_id is an even number.

•
•
•
•
•
•

Single-row SQL functions
Character functions
Nesting functions
Number functions
Working with dates
Date functions

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

SQL Fundamentals 7 - 24

Oracle University Student Learning Subscription Use Only

Lesson Agenda

•
•

The Oracle Database stores dates in an internal numeric format: century, year,
month, day, hours, minutes, and seconds.
The default date display format is DD-MON-RR.
–
–

Enables you to store 21st-century dates in the 20th century by specifying only the last two
digits of the year
Enables you to store 20th-century dates in the 21st century in the same way

SELECT last_name, hire_date
FROM
employees
WHERE hire_date < '01-FEB-2016';

…
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

The Oracle Database stores dates in an internal numeric format, representing the century, year,
month, day, hours, minutes, and seconds.
The default display and input format for any date is DD-MON-RR. Valid Oracle dates are between
January 1, 4712 B.C., and December 31, 9999 A.D.
In the example in the slide, the HIRE_DATE column output is displayed in the default format DDMON-RR. However, dates are not stored in the database in this format. All the components of the date
and time are stored. So, although a HIRE_DATE such as 17-JUN-11 is displayed as day, month, and
year, there is also time and century information associated with the date. The complete date might be
June 17, 2011, 5:10:43 PM.

SQL Fundamentals 7 - 25

Oracle University Student Learning Subscription Use Only

Working with Dates

Current Year

Specified Date

RR Format

YY Format

1995

27-OCT-95

1995

1995

1995

27-OCT-17

2017

1917

2001

27-OCT-17

2017

2017

2001

27-OCT-95

1995

2095

If the specified two-digit year is:
0–49

50–99

0–49

The return date is in the
current century

The return date is in the century
before the current one

50–99

The return date is in the
century after the current one

The return date is in the current
century

If two digits of
the current
year are:

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

The RR date format is similar to the YY element, but you can use it to specify different centuries. Use
the RR date format element instead of YY so that the century of the return value varies according to
the specified two-digit year and the last two digits of the current year. The table in the slide
summarizes the behavior of the RR element.
Current Year

Given Date

Interpreted (RR)

Interpreted (YY)

1994

27-OCT-95

1995

1995

1994

27-OCT-17

2017

1917

2001

27-OCT-17

2017

2017

2048

27-OCT-52

1952

2052

2051

27-OCT-47

2147

2047

Note the values shown in the last two rows of the preceding table.
This data is stored internally as follows:
CENTURY

YEAR

MONTH

DAY

HOUR

MINUTE

SECOND

19

03

06

17

17

10

43

Centuries and the Year 2000
When a record with a date column is inserted into a table, the century information is picked up from
the SYSDATE function. However, when the date column is displayed on the screen, the century
component is not displayed (by default).
The DATE data type uses 2 bytes for the year information, one for century and one for year. The
century value is always included, whether or not it is specified or displayed. In this case, RR
determines the default value for century on INSERT.
SQL Fundamentals 7 - 26

Oracle University Student Learning Subscription Use Only

RR Date Format

Using the SYSDATE Function

•
•

Date
Time

SELECT sysdate
FROM
dual;

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

SYSDATE is a date function that returns the system date. You can use SYSDATE just as you would
use any other column name. For example, you can display the system date by selecting SYSDATE
from a table. It is customary to select SYSDATE from a public table called DUAL.
Note: SYSDATE returns the current date and time set for the operating system on which the database
resides. Therefore, if you are in a place in Australia and connected to a remote database in a location
in the United States (U.S.), the sysdate function will return the U.S. date and time. In that case, you
can use the CURRENT_DATE function that returns the current date in the session time zone.

SQL Fundamentals 7 - 27

Oracle University Student Learning Subscription Use Only

SYSDATE is a function that returns:

Using the CURRENT_DATE and CURRENT_TIMESTAMP
Functions

SELECT SESSIONTIMEZONE, CURRENT_DATE FROM DUAL;

CURRENT_TIMESTAMP returns the
current date and time from the user
session.
SELECT SESSIONTIMEZONE, CURRENT_TIMESTAMP FROM DUAL;

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

The CURRENT_DATE and CURRENT_TIMESTAMP functions return the current date and current time
stamp, respectively.
Note: The SESSIONTIMEZONE function returns the value of the current session’s time zone. The
return type is a time zone offset (a character type in the format '[+|-]TZH:TZM') or a time zone
region name, depending on how the user specified the session time zone value in the most recent
ALTER SESSION statement. The example in the slide shows that the session time zone is offset to
UTC by –5 hours. Observe that the database time zone is different from the current session’s time
zone.

SQL Fundamentals 7 - 28

Oracle University Student Learning Subscription Use Only

CURRENT_DATE returns the current date from
the user session.

• Add to or subtract a number from a date for a resultant date value.
• Subtract two dates to find the number of days between those dates.
• Add hours to a date by dividing the number of hours by 24.
You can perform the following operations:
Operation

Result

Description

date + number

Date

Adds a number of days to a date

date - number

Date

Subtracts a number of days from a date

date - date

Number of days

Subtracts one date from another

date + number/24

Date

Adds a number of hours to a date

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Because the database stores dates as numbers, you can perform calculations using arithmetic
operators such as addition and subtraction. You can add and subtract number constants as well as
dates.

SQL Fundamentals 7 - 29

Oracle University Student Learning Subscription Use Only

Arithmetic with Dates

SELECT last_name, (SYSDATE-hire_date)/7 AS WEEKS
FROM
employees
WHERE department_id = 90;

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

The example in the slide displays the last name and the number of weeks employed for all
employees in department 90. It subtracts the date on which the employee was hired from the current
date (SYSDATE) and divides the result by 7 to calculate the number of weeks that a worker has been
employed.

SQL Fundamentals 7 - 30

Oracle University Student Learning Subscription Use Only

Using Arithmetic Operators with Dates

•
•
•
•
•
•

Single-row SQL functions
Character functions
Nesting functions
Number functions
Working with dates
Date functions

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

SQL Fundamentals 7 - 31

Oracle University Student Learning Subscription Use Only

Lesson Agenda

Date-Manipulation Functions
Result

MONTH_BETWEEN

Number of months between two dates

ADD_MONTHS

Add calendar months to date

NEXT_DAY

Next occurrence date of the weekday
specified

LAST_DAY

Last day of the month

ROUND

Round date

TRUNC

Truncate date

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Date functions operate on Oracle dates. All date functions return a value of the DATE data type
except MONTHS_BETWEEN, which returns a numeric value.
•
MONTHS_BETWEEN(date1, date2): Finds the number of months between date1 and
date2. The result can be positive or negative. If date1 is later than date2, the result is
positive; if date1 is earlier than date2, the result is negative. The noninteger part of the result
represents a portion of the month.
•
ADD_MONTHS(date, n): Adds n number of calendar months to date. The value of n must be
an integer and can be negative.
•
NEXT_DAY(date, 'char'): Finds the next occurrence date of the weekday specified
('char') following date. The value of char may be a number representing a day or a
character string.
•
LAST_DAY(date): Finds the date of the last day of the month that contains date
The preceding list is a subset of the available date functions. ROUND and TRUNC number functions
can also be used to manipulate the date values as shown below:
•
ROUND(date[,'fmt']): Returns date rounded to the unit that is specified by the format
model fmt. If the format model fmt is omitted, date is rounded to the nearest day.
•
TRUNC(date[, 'fmt']): Returns date with the time portion of the day truncated to the unit
that is specified by the format model fmt. If the format model fmt is omitted, date is truncated
to the nearest day.
The format models are covered in detail in the lessons titled “Using Conversion Functions” and
“Using Conditional Expressions.”

SQL Fundamentals 7 - 32

Oracle University Student Learning Subscription Use Only

Function

Function

Result

MONTHS_BETWEEN(‘01-SEP-14’,’11-FEB-16’)

19.6774194

ADD_MONTHS (‘31-JAN-16’,1)

‘29-FEB-16’

NEXT_DAY (‘01-FEB-16’, ‘FRIDAY’)

‘05-FEB-16’

LAST_DAY (‘01-FEB-16’)

‘29-FEB-16’

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

In the example in the slide, the ADD_MONTHS function adds one month to the supplied date value “31JAN-16” and returns “29-FEB-16.” The function recognizes the year 2016 as the leap year and,
therefore, returns the last day of the February month. If you change the input date value to “31-JAN14,” the function returns “28-FEB-14.”
For example, display the employee number, hire date, number of months employed, six-month
review date, first Friday after hire date, and the last day of the hire month for all employees who have
been employed for fewer than 150 months.
SELECT employee_id, hire_date, MONTHS_BETWEEN (SYSDATE, hire_date)
TENURE, ADD_MONTHS (hire_date, 6) REVIEW, NEXT_DAY (hire_date,
'FRIDAY'), LAST_DAY(hire_date)
FROM employees WHERE MONTHS_BETWEEN (SYSDATE, hire_date) < 150;

SQL Fundamentals 7 - 33

Oracle University Student Learning Subscription Use Only

Using Date Functions

Using ROUND and TRUNC Functions with Dates

Function

Result

ROUND(SYSDATE,'MONTH')

‘01-AUG-15’

ROUND(SYSDATE,'YEAR')

‘01-JAN-16’

TRUNC(SYSDATE,'MONTH')

‘01-JUL-15’

TRUNC(SYSDATE,'YEAR')

‘01-JAN-15’

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

The ROUND and TRUNC functions can be used for number and date values. When used with dates,
these functions round or truncate to the specified format model. Therefore, you can round dates to
the nearest year or month. If the format model is month, dates 1-15 result in the first day of the
current month. Dates 16-31 result in the first day of the next month. If the format model is year,
months 1-6 result in January 1 of the current year. Months 7-12 result in January 1 of the next year.
Example
Compare the hire dates for all employees who started in 2014. Display the employee number, hire
date, and starting month using the ROUND and TRUNC functions.
SELECT employee_id, hire_date,
ROUND(hire_date, 'MONTH'), TRUNC(hire_date, 'MONTH')
FROM
employees
WHERE hire_date LIKE '%14';

SQL Fundamentals 7 - 34

Oracle University Student Learning Subscription Use Only

If SYSDATE is 18-JUL-15:

Which four of the following statements are true about single-row functions?
a. Manipulate data items
b. Accept arguments and return one value per argument
c. Act on each row that is returned
d. Return one result per set of rows
e. Never modify the data type
f. Can be nested
g. Accept arguments that can be a column or an expression

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Answer: a, c, f, g

SQL Fundamentals 7 - 35

Oracle University Student Learning Subscription Use Only

Q

Quiz

Arithmetic operation on dates always returns a date.
a. True
b. False

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Answer: b

SQL Fundamentals 7 - 36

Oracle University Student Learning Subscription Use Only

Q

Quiz

In this lesson, you should have learned how to:
• Use the various types of functions available in SQL
• Use the character, number, and date functions in SELECT statements

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

SQL Fundamentals 7 - 37

Oracle University Student Learning Subscription Use Only

Summary

This practice covers the following topics:
• Writing a query that displays the SYSDATE
• Creating queries that require the use of numeric, character, and date
functions
• Performing calculations of years and months of a course for a student

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

This practice provides a variety of exercises using different functions that are available for character,
number, and date data types.

SQL Fundamentals 7 - 38

Oracle University Student Learning Subscription Use Only

Practice 7: Overview

Lesson 8: Using Conversion
Functions

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Oracle University Student Learning Subscription Use Only

8

Course Roadmap
Unit 1: Relational Database and SQL
Overview

Lesson 5: Retrieving Data Using SQL
SELECT Statement

Unit 2: Retrieving and Sorting Data
Lesson 6: Restricting and Sorting Data
Unit 3: Joins, Subqueries, and Set
Operators
Lesson 7: Using Single-Row Functions
Unit 4: DML and DDL
Lesson 8: Using Conversion Functions
Unit 5: Managing Relational Database
Lesson 9: Using Conditional Expressions
Unit 6: Advance Queries and Database
Management System

You are here

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

In Unit 2, you will dive into the concepts of SQL. You will learn to use the SQL SELECT statement to
retrieve data from database tables and restrict and sort the retrieved data. You will also learn about
single-row functions, conversion functions, and conditional expressions in SQL.

SQL Fundamentals 8 - 2

Oracle University Student Learning Subscription Use Only

Lesson 1: Course Overview

After completing this lesson, you should be able to:
• Describe the various types of conversion functions that are available in SQL
• Use the TO_CHAR, TO_NUMBER, and TO_DATE conversion functions

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

This lesson focuses on functions that convert data from one type to another (for example, conversion
from character data to numeric data) and discusses the conditional expressions in SQL SELECT
statements.

SQL Fundamentals 8 - 3

Oracle University Student Learning Subscription Use Only

Objectives

•
•
•

Implicit and explicit data type conversion
TO_CHAR, TO_DATE, TO_NUMBER functions
General functions:
–
–
–
–

NVL
NVL2
NULLIF
COALESCE

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

SQL Fundamentals 8 - 4

Oracle University Student Learning Subscription Use Only

Lesson Agenda

Data type
conversion

Implicit data type
conversion

Explicit data type
conversion

Done by Oracle Server

Done by User

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

In addition to Oracle data types, columns of tables in an Oracle Database can be defined by using
the American National Standards Institute (ANSI), DB2, and SQL/DS data types. However, the
Oracle server internally converts such data types to Oracle data types.
In some cases, the Oracle server receives data of one data type where it expects data of a different
data type. When this happens, the Oracle server can automatically convert the data to the expected
data type. This data type conversion can be done implicitly by the Oracle server or explicitly by the
user.
Implicit data type conversions work according to the rules explained in the following slides.
Explicit data type conversions are performed by using the conversion functions. Conversion functions
convert a value from one data type to another. Generally, the form of the function names follows the
convention data type TO data type. The first data type is the input data type and the second data
type is the output.
Note: Although implicit data type conversion is available, it is recommended that you do the explicit
data type conversion to ensure the reliability of your SQL statements.

SQL Fundamentals 8 - 5

Oracle University Student Learning Subscription Use Only

Conversion Functions

Implicit Data Type Conversion

String or character should
be a valid number

From

To

VARCHAR2 or CHAR

NUMBER

VARCHAR2 or CHAR

DATE

String should be a valid
date

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

The Oracle server can automatically perform data type conversion in an expression. For example, the
expression hire_date > '01-JAN-90' results in the implicit conversion from the string '01JAN-90' to a date. Therefore, a VARCHAR2 or CHAR value can be implicitly converted to a number or
date data type in an expression.
Note: CHAR to NUMBER conversions succeed only if the character string represents a valid number.

SQL Fundamentals 8 - 6

Oracle University Student Learning Subscription Use Only

In expressions, the Oracle server can automatically convert the following:

Implicit Data Type Conversion

From

To

NUMBER

VARCHAR2 or CHAR

DATE

VARCHAR2 or CHAR

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

In general, the Oracle server uses the rule for expressions when a data type conversion is needed.
For example, the expression job_id = 2 results in the implicit conversion of the number 2 to the
string “2” because job_id is a VARCHAR(2) column.

SQL Fundamentals 8 - 7

Oracle University Student Learning Subscription Use Only

For expression evaluation, the Oracle server can automatically convert the
following:

Explicit Data Type Conversion
TO_DATE

CHARACTER

NUMBER

TO_CHAR

DATE

TO_CHAR

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

SQL provides three functions to convert a value from one data type to another:

Function

Purpose

TO_CHAR(number|date [, fmt [,
nlsparams] ] )

Converts a number or date value to a VARCHAR2
character string with the format model fmt
Number conversion: The nlsparams
parameter specifies the following characters,
which are returned by number format elements:
• Decimal character
• Group separator
• Local currency symbol
• International currency symbol

If nlsparams or any other parameter is omitted,
this function uses the default parameter values
for the session.

SQL Fundamentals 8 - 8

Oracle University Student Learning Subscription Use Only

TO_NUMBER

Purpose

TO_NUMBER(char[,fmt[,
nlsparams]])

Converts a character string containing digits to a
number in the format specified by the optional
format model fmt
The nlsparams parameter has the same purpose
in this function as in the TO_CHAR function for
number conversion.

TO_DATE(char[,fmt[,nlsparam
s]])

Converts a character string representing a date to a
date value according to fmt that is specified. If fmt
is omitted, the format is DD-MON-YY.
The nlsparams parameter has the same purpose
in this function as in the TO_CHAR function for date
conversion.

Note: The list of functions mentioned in this lesson includes only some of the available
conversion functions.
For more information, see the “Conversion Functions” section in Oracle Database SQL
Language Reference for 12c database.

SQL Fundamentals 8 - 9

Oracle University Student Learning Subscription Use Only

Function

•
•
•

Implicit and explicit data type conversion
TO_CHAR, TO_DATE, TO_NUMBER functions
General functions:
–
–
–
–

NVL
NVL2
NULLIF
COALESCE

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

SQL Fundamentals 8 - 10

Oracle University Student Learning Subscription Use Only

Lesson Agenda

Using the TO_CHAR Function with Dates
Can include any valid
date format element
Must be enclosed within
single quotation marks

TO_CHAR(date[,'format_model'])

Is separated from date
value by a comma

Has an fm element to
remove padded blanks
or suppress leading
zeros

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

TO_CHAR converts a datetime data type to a value of VARCHAR2 data type in the format specified by
the format_model. A format model is a character literal that describes the format of datetime stored in
a character string. For example, the datetime format model for the string '11-Nov-2015' is 'DDMon-YYYY'. You can use the TO_CHAR function to convert a date from its default format to the one
that you specify.
Guidelines
• The format model must be enclosed within single quotation marks and is case-sensitive.
• The format model can include any valid date format element. But be sure to separate the date
value from the format model with a comma.
• The names of days and months in the output are automatically padded with blanks.
• To remove padded blanks or to suppress leading zeros, use the fill mode fm element.
Example
SELECT employee_id, TO_CHAR(hire_date, 'MM/YY') Month_Hired
FROM
employees
WHERE last_name = 'Higgins';

SQL Fundamentals 8 - 11

Oracle University Student Learning Subscription Use Only

Is case sensitive

Element

Result

YYYY

Full year in numbers

YEAR

Year spelled out (in English)

MM

Two-digit value for the month

MONTH

Full name of the month

MON

Three-letter abbreviation of the month

DY

Three-letter abbreviation of the day of the week

DAY

Full name of the day of the week

DD

Numeric day of the month

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Element

Description

SCC or CC

Century; server prefixes B.C. date with -

Years in dates YYYY or SYYYY

Year; server prefixes B.C. date with -

YYY or YY or Y

Last three, two, or one digit of the year

Y,YYY

Year with comma in this position

IYYY, IYY, IY, I

Four-, three-, two-, or one-digit year based on the ISO
standard

SYEAR or YEAR

Year spelled out; server prefixes B.C. date with -

BC or AD

Indicates B.C. or A.D. year

B.C. or A.D.

Indicates B.C. or A.D. year using periods

Q

Quarter of year

MM

Month: two-digit value

MONTH

Name of the month padded with blanks to a length of nine
characters

MON

Name of the month, three-letter abbreviation

RM

Roman numeral month

WW or W

Week of the year or month

DDD or DD or D

Day of the year, month, or week

DAY

Name of the day padded with blanks to a length of nine
characters

DY

Name of the day; three-letter abbreviation

J

Julian day; the number of days since December 31, 4713
B.C.

IW

Weeks in the year from ISO standard (1 to 53)

SQL Fundamentals 8 - 12

Oracle University Student Learning Subscription Use Only

Elements of the Date Format Model

Elements of the Date Format Model
Use time elements to format the time portion of the date:
HH24:MI:SS AM
•

15:45:32 PM

Add character strings by enclosing them within double quotation marks:
DD "of" MONTH

•

12 of OCTOBER

Use number suffixes to spell out numbers:
ddspth

fourteenth

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Use the formats that are listed in the following tables to display time information and literals, and to
change numerals to spelled numbers:
Element

Description

AM or PM

Meridian indicator

A.M. or P.M.

Meridian indicator with periods

HH or HH12

12 hour format

HH24

24 hour format

MI

Minute (0–59)

SS

Second (0–59)

SSSSS

Seconds past midnight (0–86399)

SQL Fundamentals 8 - 13

Oracle University Student Learning Subscription Use Only

•

Element

Description

/ . ,

Punctuation is reproduced in the result.

“of the”

Quoted string is reproduced in the result.

Specifying Suffixes to Influence Number Display
Element

Description

TH

Ordinal number (for example, DDTH for 4TH)

SP

Spelled-out number (for example, DDSP for FOUR)

SPTH or THSP

Spelled-out ordinal numbers (for example, DDSPTH for
FOURTH)

SQL Fundamentals 8 - 14

Oracle University Student Learning Subscription Use Only

Other Formats

SELECT last_name,
TO_CHAR(hire_date, 'fmDD Month YYYY')
AS HIREDATE
FROM
employees;

…
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

The SQL statement in the slide displays the last names and hire dates for all the employees. The hire
date appears as 17 June 2011.
Example
Modify the example in the slide to display the dates in a format that appears as “Seventeenth of June
2011 12:00:00 AM.”
SELECT last_name,
TO_CHAR(hire_date,'fmDdspth "of" Month YYYY fmHH:MI:SS AM')
HIREDATE
FROM
employees;
Notice that the month follows the format model specified; in other words, the first letter is capitalized
and the rest are in lowercase.

SQL Fundamentals 8 - 15

Oracle University Student Learning Subscription Use Only

Using the TO_CHAR Function with Dates

Using the TO_CHAR Function with Numbers

These are some of the format elements that you can use with the TO_CHAR
function to display a number value as a character:
Element

Result

9

Represents a number

0

Forces a zero to be displayed

$

Places a floating dollar sign

L

Uses the floating local currency symbol

.

Prints a decimal point

,

Prints a comma as a thousands indicator
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

When working with number values, such as character strings, you should convert those numbers to
the character data type using the TO_CHAR function, which translates a value of NUMBER data type to
VARCHAR2 data type. This technique is especially useful with concatenation.

SQL Fundamentals 8 - 16

Oracle University Student Learning Subscription Use Only

TO_CHAR(number[, 'format_model'])

Number Format Elements

Element

Description

Example

Result

9

Numeric position (number of 9s determine display
width)

999999

1234

0

Display leading zeros

099999

001234

$

Floating dollar sign

$999999

$1234

L

Floating local currency symbol

L999999

FF1234

D

Returns the decimal character in the specified
position. The default is a period (.).

9999D99

1234.00

.

Decimal point in position specified

999999.99

1234.00

G

Returns the group separator in the specified
position. You can specify multiple group
separators in a number format model.

9G999

1,234

,

Comma in position specified

999,999

1,234

MI

Minus signs to right (negative values)

999999MI

1234-

PR

Parenthesize negative numbers

999999PR

<1234>

EEEE

Scientific notation (format must specify four Es)

99.999EEEE

1.234E+03

U

Returns in the specified position the “Euro” (or
other) dual currency

U9999

€1234

V

Multiply by 10 n times (n = number of 9s after V)

9999V99

123400

S

Returns the negative or positive value

S9999

-1234 or
+1234

B

Display zero values as blank, not 0

B9999.99

1234.00

SQL Fundamentals 8 - 17

Oracle University Student Learning Subscription Use Only

If you are converting a number to the character data type, you can use the following format
elements:

SELECT TO_CHAR(salary, '$99,999.00') SALARY
FROM
employees
WHERE last_name = 'Ernst';

Displays the salary of an
employee as a string of
characters according to the
given format model

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

•
•

The Oracle server displays a string of number signs (#) in place of a whole number whose digits
exceed the number of digits provided in the format model.
The Oracle server rounds the stored decimal value to the number of decimal places provided in
the format model.

SQL Fundamentals 8 - 18

Oracle University Student Learning Subscription Use Only

Using the TO_CHAR Function with Numbers

Using the TO_NUMBER and TO_DATE Functions

TO_NUMBER(char[, 'format_model'])
Convert a character string to a date format using
the TO_DATE function.
TO_DATE(char[, 'format_model'])

These functions have an fx modifier. This modifier specifies
the exact match for the character argument and date
format model of a TO_DATE function.
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

You may want to convert a character string to either a number or a date. To accomplish this task, use
the TO_NUMBER or TO_DATE function. The format model that you select is based on the previously
demonstrated format elements.
The fx modifier specifies the exact match for the character argument and date format model of a
TO_DATE function:
•
•
•

Punctuation and quoted text in the character argument must exactly match (except for case) the
corresponding parts of the format model.
The character argument cannot have extra blanks. Without fx, the Oracle server ignores extra
blanks.
Numeric data in the character argument must have the same number of digits as the
corresponding element in the format model. Without fx, the numbers in the character argument
can omit leading zeros.

SQL Fundamentals 8 - 19

Oracle University Student Learning Subscription Use Only

Convert a character string to a number
format using the TO_NUMBER function.

Display the name and hire date for all employees who started on May 24, 2015. There are two
spaces after the month May and before the number 24 in the following example. Because the
fx modifier is used, an exact match is required and the spaces after the word May are not
recognized:
SELECT last_name, hire_date
FROM
employees
WHERE hire_date = TO_DATE('May 24, 2015', 'fxMonth DD, YYYY');
The resulting error output looks like this:
ORA-01858: a non-numeric character was found where a numeric was
expected
01858. 00000 – “a non-numeric character was found where a numeric was
expected”
*Cause: The input data to be converted using a date format model was
incorrect. The input data did not contain a number where a number
was required by the format model.
*Action: Fix the input data or the date format model to make sure the
elements match in number and type. Then retry the operation.
To see the output, correct the query by deleting the extra space between ‘May’ and ‘24’.
SELECT last_name, hire_date
FROM
employees
WHERE hire_date = TO_DATE('May 24, 2015', 'fxMonth DD, YYYY');

SQL Fundamentals 8 - 20

Oracle University Student Learning Subscription Use Only

Example

Using the TO_CHAR and TO_DATE Functions with the
RR Date Format

SELECT last_name, TO_CHAR(hire_date, 'DD-Mon-YYYY')
FROM employees
WHERE hire_date < TO_DATE('01-Jan-10','DD-Mon-RR');

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

To find employees who were hired before 2010, the RR format can be used. Because the current year
is greater than 1999, the RR format interprets the year portion of the date from 2000 to 2050.
Alternatively, the following command results in no rows being selected because the YY format
interprets the year portion of the date in the century previous to the current one (1990).
SELECT last_name, TO_CHAR(hire_date, 'DD-Mon-yyyy')
FROM
employees
WHERE TO_DATE(hire_date, 'DD-Mon-yy') < '01-Jan-90';
Notice that no rows are retrieved from the preceding query.

SQL Fundamentals 8 - 21

Oracle University Student Learning Subscription Use Only

To find employees hired before 2010, use the RR date format, which produces
the same results whether the command is run in 1999 or now:

•
•
•

Implicit and explicit data type conversion
TO_CHAR, TO_DATE, TO_NUMBER functions
General functions:
–
–
–
–

NVL
NVL2
NULLIF
COALESCE

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

SQL Fundamentals 8 - 22

Oracle University Student Learning Subscription Use Only

Lesson Agenda

General Functions

NVL (expr1, expr2)

NULLIF (expr1, expr2)

NVL2 (expr1, expr2, expr3)

COALESCE (expr1, expr2,
..., exprn)

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

These functions work with any data type and pertain to the use of null values in the expression list.
Function

Description

NVL

Converts a null value to an actual value

NVL2

If expr1 is not null, NVL2 returns expr2. If expr1 is null, NVL2
returns expr3. The argument expr1 can have any data type.

NULLIF

Compares two expressions and returns null if they are equal; returns
the first expression if they are not equal

COALESCE

Returns the first non-null expression in the expression list

Note: For more information about the hundreds of functions available, see the “Functions” section in
Oracle Database SQL Language Reference for 12c database.

SQL Fundamentals 8 - 23

Oracle University Student Learning Subscription Use Only

The following functions work with any data type and pertain to using nulls:

NVL Function

Converts a null value to an actual value:
• Data types that can be used are date, character, and number.
• Data types must match:
–
–
–

NVL(commission_pct,0)
NVL(hire_date,'01-JAN-16')
NVL(job_id,'No Job Yet')

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

To convert a null value to an actual value, use the NVL function.
Syntax
NVL (expr1, expr2)
In the syntax:
• expr1 is the source value or expression that may contain a null
• expr2 is the target value for converting the null
You can use the NVL function with any data type, but the return value is always the same as the data
type of expr1.
NVL Conversions for Various Data Types

Data Type

Conversion Example

NUMBER

NVL(number_column,9)

DATE

NVL(date_column, '01-JAN-16')

CHAR or VARCHAR2

NVL(character_column, 'Unavailable')

SQL Fundamentals 8 - 24

Oracle University Student Learning Subscription Use Only

NVL (expr1, expr2)

1
SELECT last_name, salary, NVL(commission_pct, 0),
(salary*12) + (salary*12*NVL(commission_pct, 0)) AN_SAL
FROM employees;

2

…
1

2
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

To calculate the annual compensation of all employees, you need to multiply the monthly salary by
12 and then add the commission percentage to the result:
SELECT last_name, salary, commission_pct,
(salary*12) + (salary*12*commission_pct) AN_SAL
FROM
employees;
Notice that the annual compensation is calculated for only those employees who earn a commission.
If any column value in an expression is null, the result is null. To calculate values for all employees,
you must convert the null value to a number before applying the arithmetic operator. In the example
in the slide, the NVL function is used to convert null values to zero.

SQL Fundamentals 8 - 25

Oracle University Student Learning Subscription Use Only

Using the NVL Function

SELECT last_name, salary, commission_pct,
1
NVL2(commission_pct,
2
'SAL+COMM', 'SAL') income
FROM
employees WHERE department_id IN (50, 80);

1

2
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

The NVL2 function examines the first expression. If the first expression is not null, the NVL2 function
returns the second expression. If the first expression is null, the third expression is returned.
Syntax
NVL2(expr1, expr2, expr3)
In the syntax:
• expr1 is the source value or expression that may contain a null
• expr2 is the value that is returned if expr1 is not null
• expr3 is the value that is returned if expr1 is null
In the example shown in the slide, the COMMISSION_PCT column is examined. If a value is detected,
the text literal value of SAL+COMM is returned. If the COMMISSION_PCT column contains a null value,
the text literal value of SAL is returned.
Note: The argument expr1 can be any data type, but expr2 and expr3 should be the same data
type.

SQL Fundamentals 8 - 26

Oracle University Student Learning Subscription Use Only

Using the NVL2 Function

Using the NULLIF Function
SELECT first_name, LENGTH(first_name) "expr1",
2
last_name, LENGTH(last_name) "expr2",
NULLIF(LENGTH(first_name), LENGTH(last_name)) result
FROM
employees;

3

…
1

2

3
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

The NULLIF function compares two expressions.
Syntax
NULLIF (expr1, expr2)
In the syntax:
• NULLIF compares expr1 and expr2. If they are equal, the function returns null. If they are not,
the function returns expr1. However, you cannot specify the literal NULL for expr1.
In the example shown in the slide, the length of the first name in the EMPLOYEES table is compared
with the length of the last name in the EMPLOYEES table. When the lengths of the names are equal, a
null value is displayed. When the lengths of the names are not equal, the length of the first name is
displayed.

SQL Fundamentals 8 - 27

Oracle University Student Learning Subscription Use Only

1

COALESCE (expr1, expr2, ..., exprn)

If the first expression is not
null, the COALESCE function
returns that expression;
otherwise, it does a COALESCE
of the remaining expressions.

The advantage of the COALESCE
function over the NVL function is
that the COALESCE function can
take multiple alternative values.

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

The COALESCE function returns the first non-null expression in the list.
Syntax
COALESCE (expr1, expr2, ... exprn)
In the syntax:
• expr1 returns this expression if it is not null
• expr2 returns this expression if the first expression is null and this expression is not null
• exprn returns this expression if the preceding expressions are null
Note that all expressions must be of the same data type.

SQL Fundamentals 8 - 28

Oracle University Student Learning Subscription Use Only

Using the COALESCE Function

SELECT last_name, salary, commission_pct,
COALESCE((salary+(commission_pct*salary)), salary+2000)"New Salary"
FROM
employees;

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

In the example shown in the slide, for the employees who do not get any commission, your
organization wants to give a salary increment of $2,000 and for employees who get commission, the
query should compute the new salary that is equal to the existing salary added to the commission
amount.
Note: Examine the output. For employees who do not get any commission, the New Salary column
shows the salary incremented by $2,000 and for employees who get commission, the New Salary
column shows the computed commission amount added to the salary.

SQL Fundamentals 8 - 29

Oracle University Student Learning Subscription Use Only

Using the COALESCE Function

The TO_NUMBER function converts either character strings or date values to a
number in the format specified by the optional format model.
a. True
b. False

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Answer: b

SQL Fundamentals 8 - 30

Oracle University Student Learning Subscription Use Only

Q

Quiz

Q

Quiz

a. True
b. False

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Answer: a

SQL Fundamentals 8 - 31

Oracle University Student Learning Subscription Use Only

The NVL function can be used with any data type.

In this lesson, you should have learned how to:
• Alter date formats for display by using functions
• Convert column data types using functions
• Use NVL functions

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Remember the following:
• Conversion functions can convert character, date, and numeric values, and include TO_CHAR,
TO_DATE, and TO_NUMBER.
• There are several functions that pertain to nulls, including NVL, NVL2, NULLIF, and COALESCE.

SQL Fundamentals 8 - 32

Oracle University Student Learning Subscription Use Only

Summary

Practice 8: Overview

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

This practice provides a variety of exercises for using the TO_CHAR and TO_DATE functions.
Remember that for nested functions, the results are evaluated from the innermost function to the
outermost function.

SQL Fundamentals 8 - 33

Oracle University Student Learning Subscription Use Only

This practice covers creating queries that use TO_CHAR, TO_DATE, and other
DATE functions.

Oracle University Student Learning Subscription Use Only

Lesson 9: Using Conditional
Expressions

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Oracle University Student Learning Subscription Use Only

9

Course Roadmap
Unit 1: Relational Database and SQL
Overview

Lesson 5: Retrieving Data Using SQL
SELECT Statement

Unit 2: Retrieving and Sorting Data
Lesson 6: Restricting and Sorting Data
Unit 3: Joins, Subqueries, and Set
Operators
Lesson 7: Using Single-Row Functions
Unit 4: DML and DDL

You are
here

Lesson 8: Using Conversion Functions

Unit 5: Managing Relational Database
Lesson 9: Using Conditional Expressions
Unit 6: Advance Queries and Database
Management System

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

In Unit 2, you will dive into the concepts of SQL. You will learn to use the SQL SELECT statement to
retrieve data from database tables, and restrict and sort the retrieved data. You will also learn about
single-row functions, conversion functions, and conditional expressions in SQL.

SQL Fundamentals 9 - 2

Oracle University Student Learning Subscription Use Only

Lesson 1: Course Overview

Objectives

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

This lesson discusses the conditional expressions in SQL SELECT statements. You can use CASE or
DECODE to apply conditional expressions in a SELECT statement.

SQL Fundamentals 9 - 3

Oracle University Student Learning Subscription Use Only

After completing this lesson, you should be able to apply conditional expressions
in a SELECT statement.

Lesson Agenda
Conditional expressions:
–
–
–

CASE
Searched CASE
DECODE

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

SQL Fundamentals 9 - 4

Oracle University Student Learning Subscription Use Only

•

•

Provide the use of the IF-THEN-ELSE logic within a SQL statement

•

Use the following methods:
–
–
–

CASE expression
Searched CASE expression
DECODE function

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

The two methods that are used to implement conditional processing (IF-THEN-ELSE logic) in a SQL
statement are the CASE expression and the DECODE function.
Note: The CASE expression complies with the ANSI SQL. The DECODE function is specific to Oracle
syntax.

SQL Fundamentals 9 - 5

Oracle University Student Learning Subscription Use Only

Conditional Expressions

CASE Expression

CASE expr WHEN
[WHEN
WHEN
ELSE
END

comparison_expr1 THEN return_expr1
comparison_expr2 THEN return_expr2
comparison_exprn THEN return_exprn
else_expr]

expr and comparison_expr
must be of the same data
type.

All the return values must be
of the same data type.

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

CASE expressions allow you to use the IF-THEN-ELSE logic in SQL statements without having to
invoke procedures.
In a simple CASE expression, the Oracle server searches for the first WHEN ... THEN pair for which
expr is equal to comparison_expr and returns return_expr. If none of the WHEN ... THEN
pairs meet this condition, and if an ELSE clause exists, the Oracle server returns else_expr.
Otherwise, the Oracle server returns a null. You cannot specify the literal NULL for all the
return_exprs and the else_expr.
The expressions expr and comparison_expr must be of the same data type, which can be CHAR,
VARCHAR2, NCHAR, NVARCHAR2, NUMBER, BINARY_FLOAT, or BINARY_DOUBLE or must all have
a numeric data type. All of the return values (return_expr) must be of the same data type.

SQL Fundamentals 9 - 6

Oracle University Student Learning Subscription Use Only

Facilitates conditional inquiries by doing the work of an
IF-THEN-ELSE statement:

SELECT last_name, job_id, salary,
CASE job_id WHEN 'IT_PROG' THEN 1.10*salary
WHEN 'ST_CLERK' THEN 1.15*salary
WHEN 'SA_REP'
THEN 1.20*salary
ELSE
salary END REVISED_SALARY
FROM
employees;

CASE evaluates whether job_id is the same
as the comparison_expr('IT_PROG',
'ST_CLERK', or 'SA_REP').

…
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

In the SQL statement in the slide, the value of JOB_ID is decoded. If JOB_ID is IT_PROG, the salary
increase is 10%; if JOB_ID is ST_CLERK, the salary increase is 15%; if JOB_ID is SA_REP, the
salary increase is 20%. For all other job roles, there is no increase in salary.
The same statement can be written with the DECODE function.
Note: The column label should be in double quotation marks if it is two or more words separated by
spaces. For example, if the column label is REVISED SALARY, enclose it in double quotation marks.
Using single quotation marks returns error.

SQL Fundamentals 9 - 7

Oracle University Student Learning Subscription Use Only

Using the CASE Expression

Searched CASE Expression

WHEN
WHEN
WHEN
ELSE

condition1 THEN use_expression1
condition2 THEN use_expression2
condition3 THEN use_expression3
default_use_expression

END
CASE evaluates the conditions
independently under each WHEN option.

If no condition is true,
default_use_expression is returned.

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

In a searched CASE expression, the search occurs from left to right until an occurrence of the listed
condition is found, and then it returns the return expression. If no condition is found to be true, and if
an ELSE clause exists, the return expression in the ELSE clause is returned; otherwise, a NULL is
returned. The searched CASE evaluates the conditions independently under each of the WHEN
options.
The difference between the CASE expression and the searched CASE expression is that in a
searched CASE expression, you specify a condition or predicate instead of
a comparison_expression after the WHEN keyword.
For both simple and searched CASE expressions, all of the return_exprs must either have the
same data type CHAR, VARCHAR2, NCHAR, NVARCHAR2, NUMBER, BINARY_FLOAT, or
BINARY_DOUBLE or must all have a numeric data type.

SQL Fundamentals 9 - 8

Oracle University Student Learning Subscription Use Only

CASE

SELECT last_name,salary,
(CASE WHEN salary<5000 THEN 'Low'
WHEN salary<10000 THEN 'Medium'
WHEN salary<20000 THEN 'Good'
ELSE 'Excellent'
END) qualified_salary
FROM employees;

…
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

The code in the slide is an example of the searched CASE expression. For each row, the condition is
checked. If salary < 5000, ‘Low’ is displayed as the QUALIFIED_SALARY.

SQL Fundamentals 9 - 9

Oracle University Student Learning Subscription Use Only

Searched CASE Expression

Lesson Agenda
Conditional expressions:
–
–
–

CASE
Searched CASE
DECODE

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

SQL Fundamentals 9 - 10

Oracle University Student Learning Subscription Use Only

•

DECODE Function

DECODE(col|expression, search1, result1
[, search2, result2,...,]
[, default])

Compares column or expression with the
search, and if they are same, returns result

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

The DECODE function decodes an expression in a way similar to the IF-THEN-ELSE logic that is
used in various languages. The DECODE function decodes expression after comparing it to each
search value. If the expression is the same as search, result is returned.
If the default value is omitted, a null value is returned in case a search value does not match any of
the result values.

SQL Fundamentals 9 - 11

Oracle University Student Learning Subscription Use Only

Facilitates conditional inquiries by doing the work of a CASE expression or an
IF-THEN-ELSE statement:

SELECT last_name, job_id, salary,
DECODE(job_id, 'IT_PROG', 1.10*salary,
'ST_CLERK', 1.15*salary,
'SA_REP',
1.20*salary,
salary)
REVISED_SALARY
FROM
employees;

…

…
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

In the SQL statement in the slide, the value of JOB_ID is tested. If JOB_ID is IT_PROG, the salary
increase is 10%; if JOB_ID is ST_CLERK, the salary increase is 15%; if JOB_ID is SA_REP, the
salary increase is 20%. For all other job roles, there is no increase in salary.
The same statement can be expressed in pseudocode as an IF-THEN-ELSE statement:
IF job_id = 'IT_PROG'
THEN salary = salary*1.10
IF job_id = 'ST_CLERK'
THEN salary = salary*1.15
IF job_id = 'SA_REP'
THEN salary = salary*1.20
ELSE salary = salary

SQL Fundamentals 9 - 12

Oracle University Student Learning Subscription Use Only

Using the DECODE Function

Using the DECODE Function

SELECT last_name, salary,
DECODE (TRUNC(salary/2000, 0),
0, 0.00,
1, 0.09,
2, 0.20,
3, 0.30,
4, 0.40,
5, 0.42,
6, 0.44,
0.45) TAX_RATE
FROM
employees
WHERE department_id = 80;

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

This slide shows another example that uses the DECODE function. In this example, you determine the
tax rate for each employee in department 80 based on the monthly salary. The tax rates are as
follows:
Monthly Salary Range
Tax Rate
$0.00–1,999.99
00%
$2,000.00–3,999.99
09%
$4,000.00–5,999.99
20%
$6,000.00–7,999.99
30%
$8,000.00–9,999.99
40%
$10,000.00–11,999.99
42%
$12,200.00–13,999.99
44%
$14,000.00 or greater
45%
Note: The TRUNC function truncates the column, expression, or value to n decimal places.

SQL Fundamentals 9 - 13

Oracle University Student Learning Subscription Use Only

Display the applicable tax rate for each employee in department 80:

Q

Quiz

a. True
b. False

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Answer: a

SQL Fundamentals 9 - 14

Oracle University Student Learning Subscription Use Only

To apply IF-THEN-ELSE logic within a SQL statement, you must use CASE or
DECODE.

Which one of the following statements best describes the difference between
CASE and searched CASE?
a. CASE is used for character searches while searched CASE is used for other
data types.
b. CASE compares the expr with comparison_expr while searched CASE
evaluates a condition for each WHEN option.

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Answer: b

SQL Fundamentals 9 - 15

Oracle University Student Learning Subscription Use Only

Q

Quiz

Summary

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Remember the following:
• The IF-THEN-ELSE logic can be applied within a SQL statement by using the CASE
expression, searched CASE, or the DECODE function.

SQL Fundamentals 9 - 16

Oracle University Student Learning Subscription Use Only

In this lesson, you should have learned how to use IF-THEN-ELSE logic and
other conditional expressions in a SELECT statement.

Practice 9: Overview

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

This practice provides exercises on conditional expressions such as CASE, searched CASE, and
DECODE.

SQL Fundamentals 9 - 17

Oracle University Student Learning Subscription Use Only

This practice covers creating queries that use conditional expressions such as
CASE, searched CASE, and DECODE.

Oracle University Student Learning Subscription Use Only

Lesson 10: Reporting Aggregated
Data Using the Group Functions

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Oracle University Student Learning Subscription Use Only

10

Course Roadmap
Lesson 1: Course Overview

Lesson 10: Reporting Aggregated Data
Using the Group Functions

Unit 2: Retrieving and Sorting Data
Unit 3: Joins, Subqueries, and Set
Operators

Lesson 11: Retrieving Data from Multiple
Tables Using Joins

Unit 4: DML and DDL
Lesson 12: Using the Set Operators
Unit 5: Managing Relational Database

Unit 6: Advance Queries and Database
Management System

Lesson 13: Using Subqueries to Solve
Queries

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

In Unit 3, you will learn about using joins, subqueries, and set operators. You will learn to write
compound queries in SQL to generate customized reports using group functions, joins, and
subqueries.

SQL Fundamentals 10 - 2

Oracle University Student Learning Subscription Use Only

You are here

Unit 1: Relational Database and SQL
Overview

After completing this lesson, you should be able to:
• Define Aggregation
• Identify the available group functions
• Describe the use of group functions
• Group data by using the GROUP BY clause
• Include or exclude grouped rows by using the HAVING clause

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

This lesson further addresses functions. It focuses on obtaining summary information (such as
averages) for groups of rows. It discusses how to group rows in a table into smaller sets and how to
specify search criteria for groups of rows.

SQL Fundamentals 10 - 3

Oracle University Student Learning Subscription Use Only

Objectives

•
•

What is Data Aggregation?
Group functions:
–
–
–
–

•

Grouping rows:
–
–

•

Types and syntax
Use AVG, SUM, MIN, MAX, COUNT
Use the DISTINCT keyword within group functions
NULL values in a group function
GROUP BY clause
HAVING clause

Nesting group functions

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

SQL Fundamentals 10 - 4

Oracle University Student Learning Subscription Use Only

Lesson Agenda

•
•

Process of computing data to present it in summary form for statistical
analysis
Used to get more information about particular groups based on specific
variables, for example, age, job, or salary

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Data Aggregation is the process of computing data to present it in summary form for statistical analysis.
It is the process of compiling data for specific groups based on variables such as age, job, or salary.
The information about such groups can then be used for further processing or decision-making. For
example, you may want to know what is the average salary of employees for each department. A
college may want to collect information regarding the top scoring students, subject-wise.

SQL Fundamentals 10 - 5

Oracle University Student Learning Subscription Use Only

What Is Data Aggregation?

•
•

What is Data Aggregation?
Group functions:
–
–
–
–

•

Grouping rows:
–
–

•

Types and syntax
Use AVG, SUM, MIN, MAX, COUNT
Use the DISTINCT keyword within group functions
NULL values in a group function
GROUP BY clause
HAVING clause

Nesting group functions

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

SQL Fundamentals 10 - 6

Oracle University Student Learning Subscription Use Only

Lesson Agenda

Multiple
Rows

Group
functions

Single
Output

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Unlike single-row functions, group functions operate on sets of rows to give one result per group.
These sets may comprise the entire table or the table that is split into groups.
Note: For a complete list of the group functions, see Oracle Database SQL Language Reference for
12c database.

SQL Fundamentals 10 - 7

Oracle University Student Learning Subscription Use Only

Types of Group Functions

Group Functions

EMPLOYEES

Maximum salary in
EMPLOYEES table

…

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

For example, if you want to know the employee who gets the maximum salary, you can use the
MAX(salary) group function in your SELECT query. You can also compute the MAX(salary) for
employees belonging to each department or for each job role.

SQL Fundamentals 10 - 8

Oracle University Student Learning Subscription Use Only

Group functions operate on sets of rows to give one result per group.

Group Functions: Syntax

SELECT group_function([DISTINCT|ALL]expr)
FROM
table
[WHERE
condition];

DISTINCT makes the
function compute only
nonduplicate values.

ALL includes the
duplicates.

• All group functions ignore null values.
• Multiple group functions can be used separated by commas.

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

The group function is placed after the SELECT keyword. You may have multiple group functions
separated by commas. The data types for the functions with an expr argument may be CHAR,
VARCHAR2, NUMBER, or DATE. All group functions ignore null values. To substitute a value for null
values, use the NVL, NVL2, COALESCE, CASE, or DECODE functions, discussed previously in the
course.

SQL Fundamentals 10 - 9

Oracle University Student Learning Subscription Use Only

The group functions are
placed after the SELECT
keyword.

Function

Description

AVG([DISTINCT|ALL]n)

Average value of n, ignoring null values

COUNT([DISTINCT|ALL]n)

Number of rows (count all selected rows using *,
including duplicates and rows with nulls)

MAX([DISTINCT|ALL]expr)

Maximum value of expr, ignoring null values

MIN([DISTINCT|ALL]expr)

Minimum value of expr, ignoring null values

SUM([DISTINCT|ALL]n)

Sum values of n, ignoring null values

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Every function accepts an argument. The table in the slide identifies the options that you can use in
the syntax of some of the common group functions.
Guideline for using the group functions: DISTINCT makes the function consider only nonduplicate
values; ALL makes it consider every value, including duplicates. The default is ALL.

SQL Fundamentals 10 - 10

Oracle University Student Learning Subscription Use Only

Common Group Functions

Using the AVG and SUM Functions

SELECT AVG(salary), MAX(salary),
MIN(salary), SUM(salary)
FROM
employees
WHERE job_id LIKE '%REP%';

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

You can use the AVG, SUM, MIN, and MAX functions against the columns that store numeric data. The
example in the slide displays the average salary, highest salary, lowest salary, and sum of monthly
salaries for all sales representatives.

SQL Fundamentals 10 - 11

Oracle University Student Learning Subscription Use Only

You can use AVG and SUM for numeric data.

Using the MIN and MAX Functions

SELECT MIN(hire_date), MAX(hire_date)
FROM
employees;

Displays the most junior and the most senior employees

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

You can use the MAX and MIN functions for numeric, character, and date data types. The example in
the slide displays the most junior and most senior employees.
The following example displays the employee last name that is first and the employee last name that
is last in an alphabetic list of all employees:
SELECT MIN(last_name), MAX(last_name)
FROM
employees;
Note: The AVG and SUM functions can be used only with numeric data types.

SQL Fundamentals 10 - 12

Oracle University Student Learning Subscription Use Only

You can use MIN and MAX for numeric, character, and date data types.

Using the COUNT Function

1

SELECT COUNT(*)
FROM
employees
WHERE department_id = 50;

COUNT(expr) returns the number of rows with non-null values for expr:
2

SELECT COUNT(commission_pct)
FROM
employees
WHERE department_id = 50;

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

The COUNT function has three formats:
•
COUNT(*)
•
COUNT(expr)
•
COUNT(DISTINCT expr)
COUNT(*) returns the number of rows in a table that satisfy the criteria of the SELECT statement,
including duplicate rows and rows containing null values in any of the columns. If a WHERE clause is
included in the SELECT statement, COUNT(*) returns the number of rows that satisfy the condition in
the WHERE clause.
In contrast, COUNT(expr) returns the number of non-null values that are in the column identified by
expr.
Examples
1. The first example in the slide displays the number of employees in department 50.
2. The second example in the slide displays the number of employees in department 50 who can
earn a commission.

SQL Fundamentals 10 - 13

Oracle University Student Learning Subscription Use Only

COUNT(*) returns the number of rows in a table:

•
•

COUNT(DISTINCT expr) returns the number of distinct non-null values of
expr.
To display the number of distinct department values in the EMPLOYEES
table:
SELECT COUNT(DISTINCT department_id)
FROM
employees;

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

COUNT(DISTINCT expr) returns the number of unique, non-null values that are in the column
identified by expr.
Use the DISTINCT keyword to suppress the counting of any duplicate values in a column. The
example in the slide displays the number of distinct department values that are in the EMPLOYEES
table.

SQL Fundamentals 10 - 14

Oracle University Student Learning Subscription Use Only

Using DISTINCT in COUNT function

Group Functions and Null Values

1

SELECT AVG(commission_pct)
FROM
employees;

The NVL function forces group functions to include null values:
2

SELECT AVG(NVL(commission_pct, 0))
FROM
employees;

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

All group functions ignore null values in the column.
However, the NVL function forces group functions to include null values. The null values are
substituted by the value zero.
Examples
1. The average is calculated based on only those rows in the table in which a valid value is stored
in the COMMISSION_PCT column. The average is calculated as the total commission that is
paid to all employees divided by the number of employees receiving a commission (four).
2. The average is calculated based on all rows in the table, regardless of whether null values are
stored in the COMMISSION_PCT column. The average is calculated as the total commission that
is paid to all employees divided by the total number of employees in the company (20).

SQL Fundamentals 10 - 15

Oracle University Student Learning Subscription Use Only

Group functions ignore null values in the column:

•
•

What is Data Aggregation?
Group functions:
–
–
–
–

•

Grouping rows:
–
–

•

Types and syntax
Use AVG, SUM, MIN, MAX, COUNT
Use DISTINCT keyword within group functions
NULL values in a group function
GROUP BY clause
HAVING clause

Nesting group functions

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

SQL Fundamentals 10 - 16

Oracle University Student Learning Subscription Use Only

Lesson Agenda

Creating Groups of Data
Consider the following queries:
–

–

–

Find the average salary for each
department (Note: not the average
salary of all the employees).
Compute the sum of salaries of all the
employees with the same job in each
department.
Find the oldest employee in each job
role.

In each grocery category, find
the maximum selling brands.

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Many times you want to aggregate data based on groups and not on the whole data set. The queries
on the slide are some of the examples. So, you want to know the average salary for each
department, and not the average salary of all the employees. Similarly, in a grocery store, the store
manager may want to know which is the best-selling brand of cookies, detergent, and milk products.

SQL Fundamentals 10 - 17

Oracle University Student Learning Subscription Use Only

•

Creating Groups of Data

4400
9500

Average salary in the
EMPLOYEES table for
each department

3500

6400
10033

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Until this point in the discussion, all group functions have treated the table as one large group of
information. At times, however, you need to divide the table of information into smaller groups. This
can be done by using the GROUP BY clause.

SQL Fundamentals 10 - 18

Oracle University Student Learning Subscription Use Only

EMPLOYEES

Creating Groups of Data: GROUP BY Clause Syntax

SELECT
column, group_function(column)
FROM
table
[WHERE
condition]
[GROUP BY group_by_expression]
[ORDER BY column];

Specifies the columns whose
values determine the grouping

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

You can use the GROUP BY clause to divide the rows in a table into groups. You can then use the
group functions to return summary information for each group.
In the syntax:
group_by_expression
grouping rows

Specifies the columns whose values determine the basis for

Guidelines
• If you include a group function in a SELECT clause, you cannot select the individual column as
well, unless the individual column appears in the GROUP BY clause. You receive an error
message if you fail to include the column list in the GROUP BY clause.
• Using a WHERE clause, you can exclude rows before dividing them into groups.
• You can substitute column with an expression in the SELECT statement.
• You must include the columns in the GROUP BY clause.
• You cannot use a column alias in the GROUP BY clause.

SQL Fundamentals 10 - 19

Oracle University Student Learning Subscription Use Only

You can divide rows in a table into smaller groups by using the GROUP BY
clause.

Using the GROUP BY Clause

SELECT
department_id, AVG(salary)
FROM
employees
GROUP BY department_id ;

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

When using the GROUP BY clause, make sure that all columns in the SELECT list that are not group
functions are included in the GROUP BY clause. The example in the slide displays the department
number and the average salary for each department. Here is how this SELECT statement, containing
a GROUP BY clause, is evaluated:
• The SELECT clause specifies the columns to be retrieved, as follows:
Department number column in the EMPLOYEES table
The average of all salaries in the group that you specified in the GROUP BY clause
• The FROM clause specifies the tables that the database must access: the EMPLOYEES table.
• The WHERE clause specifies the rows to be retrieved. Because there is no WHERE clause, all
rows are retrieved by default.
• The GROUP BY clause specifies how the rows should be grouped. The rows are grouped by
department number, so the AVG function that is applied to the salary column calculates the
average salary for each department.
Note: To order the query results in ascending or descending order, include the ORDER BY clause in
the query.

SQL Fundamentals 10 - 20

Oracle University Student Learning Subscription Use Only

All the columns in the SELECT list that are not in group functions must be in the
GROUP BY clause.

Using the GROUP BY Clause

SELECT
AVG(salary)
FROM
employees
GROUP BY department_id ;

Without the department numbers, the results are not meaningful.

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

The GROUP BY column does not have to be in the SELECT clause. For example, the SELECT
statement in the slide displays the average salaries for each department without displaying the
respective department numbers. Without the department numbers, however, the results do not look
meaningful.
You can also use the group function in the ORDER BY clause:
SELECT
department_id, AVG(salary)
FROM
employees
GROUP BY department_id
ORDER BY AVG(salary);

SQL Fundamentals 10 - 21

Oracle University Student Learning Subscription Use Only

The GROUP BY column does not have to be in the SELECT list.

Grouping by More Than One Column
Add the salaries in the
EMPLOYEES table for each job,
grouped by department.

…

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Sometimes, you need to see results for groups within groups. The slide shows a report that displays
the total salary that is paid to each job title in each department.
The EMPLOYEES table is grouped first by the department number, and then by the job title within that
grouping. For example, the four stock clerks in department 50 are grouped together, and a single
result (total salary) is produced for all stock clerks in the group.
The following SELECT statement returns the result shown in the slide:
SELECT
department_id, job_id, sum(salary)
FROM
employees
GROUP BY department_id, job_id
ORDER BY job_id;

SQL Fundamentals 10 - 22

Oracle University Student Learning Subscription Use Only

EMPLOYEES

SELECT
FROM
WHERE
GROUP BY
ORDER BY

department_id, job_id, SUM(salary)
employees
department_id > 40
department_id, job_id
department_id;

The SUM function is
applied to the salary
column for all job IDs in
the result set in each
DEPARTMENT_ID group.

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

You can return summary results for groups and subgroups by listing multiple GROUP BY columns. The
GROUP BY clause groups rows but does not guarantee the order of the result set. To order the groupings,
use the ORDER BY clause.
In the example in the slide, the SELECT statement that contains a GROUP BY clause is evaluated as
follows:
• The SELECT clause specifies the column to be retrieved:
- DEPARTMENT_ID in the EMPLOYEES table
- JOB_ID in the EMPLOYEES table
- The sum of all salaries in the group that you specified in the GROUP BY clause
• The FROM clause specifies the tables that the database must access: the EMPLOYEES table.
• The WHERE clause reduces the result set to those rows where DEPARTMENT_ID is greater than 40.
• The GROUP BY clause specifies how you must group the resulting rows:
- First, the rows are grouped by the DEPARTMENT_ID.
- Second, the rows are grouped by JOB ID in the DEPARTMENT_ID groups.
• The ORDER BY clause sorts the results by DEPARTMENT_ID.
Note: The SUM function is applied to the salary column for all job IDs in the result set in each
DEPARTMENT_ID group.

SQL Fundamentals 10 - 23

Oracle University Student Learning Subscription Use Only

Using the GROUP BY Clause on Multiple Columns

Common Errors: Using Group Functions

SELECT department_id, COUNT(last_name)
FROM
employees;
A GROUP BY clause must be added to count the last
names for each department_id.
Correct SQL statement
SELECT
department_id, count(last_name)
FROM
employees
GROUP BY department_id;

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Whenever you use a mixture of individual items (DEPARTMENT_ID) and group functions (COUNT) in
the same SELECT statement, you must include a GROUP BY clause that specifies the individual items
(in this case, DEPARTMENT_ID). If the GROUP BY clause is missing, the error message “not a singlegroup group function” appears and an asterisk (*) points to the offending column. You can correct the
error in the first example in the slide by adding the GROUP BY clause:
SELECT
department_id, count(last_name)
FROM
employees
GROUP BY department_id;

SQL Fundamentals 10 - 24

Oracle University Student Learning Subscription Use Only

Any column or expression in the SELECT list that is not an aggregate function
must be in the GROUP BY clause:

Common Errors: Using Group Functions

SELECT department_id, job_id, COUNT(last_name)
FROM
employees
GROUP BY department_id;

Correct SQL statement

Either add job_id in the GROUP BY clause
or remove the job_id column from the
SELECT list.

SELECT department_id, job_id, COUNT(last_name)
FROM
employees
GROUP BY department_id, job_id;

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Any column or expression in the SELECT list that is not an aggregate function must be in the GROUP
BY clause. In the second example in the slide, JOB_ID is neither in the GROUP BY clause nor is it
being used by a group function, so there is a “not a GROUP BY expression” error. You can correct the
error in the second slide example by adding JOB_ID in the GROUP BY clause.
SELECT department_id, job_id, COUNT(last_name)
FROM
employees
GROUP BY department_id, job_id;

SQL Fundamentals 10 - 25

Oracle University Student Learning Subscription Use Only

Any column or expression in the SELECT list that is not an aggregate function
must be in the GROUP BY clause:

Common Errors: Using Group Functions
You cannot use the WHERE clause to restrict groups.
You cannot use group functions in the WHERE clause.
SELECT
FROM
WHERE
GROUP BY

department_id, AVG(salary)
employees
AVG(salary) > 8000
department_id;

With GROUP BY, use the HAVING clause to restrict groups.
(discussed in the next slide)

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

The WHERE clause cannot be used to restrict groups. The SELECT statement in the example in the
slide results in an error because it uses the WHERE clause to restrict the display of the average
salaries of those departments that have an average salary greater than $8,000.

SQL Fundamentals 10 - 26

Oracle University Student Learning Subscription Use Only

•
•

Restricting Group Results: Using the HAVING Clause
You use the HAVING clause to restrict groups
in the same way that you use the WHERE
clause to restrict the rows that you select.

…

The maximum salary per department
when it is greater than $10,000

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

You use the HAVING clause to restrict groups in the same way that you use the WHERE clause to
restrict the rows that you select. To find the maximum salary in each of the departments that have a
maximum salary greater than $10,000, you need to do the following:
1. Find the average salary for each department by grouping by department number.
2. Restrict the groups to those departments with a maximum salary greater than $10,000.

SQL Fundamentals 10 - 27

Oracle University Student Learning Subscription Use Only

EMPLOYEES

Restricting Group Results with the HAVING Clause

1. Rows are grouped.
2. The group function is applied.
3. Groups matching the HAVING clause are displayed.
SELECT
FROM
[WHERE
[GROUP BY
[HAVING
[ORDER BY

column, group_function
table
condition]
group_by_expression]
group_condition]
column];

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

You use the HAVING clause to specify the groups that are to be displayed, thus further restricting the
groups on the basis of aggregate information.
In the syntax, group_condition restricts the groups of rows returned to those groups for which the
specified condition is true.
The Oracle server performs the following steps when you use the HAVING clause:
1. Rows are grouped.
2. The group function is applied to the group.
3. The groups that match the criteria in the HAVING clause are displayed.
The HAVING clause can precede the GROUP BY clause, but it is recommended that you place the
GROUP BY clause first because it is more logical. Groups are formed and group functions are
calculated before the HAVING clause is applied to the groups in the SELECT list.
Note: The WHERE clause restricts rows, whereas the HAVING clause restricts groups.

SQL Fundamentals 10 - 28

Oracle University Student Learning Subscription Use Only

When you use the HAVING clause, the Oracle server restricts groups as follows:

SELECT
FROM
GROUP BY
HAVING

department_id, MAX(salary)
employees
department_id
MAX(salary)>10000 ;

Query Processing Steps:
1. Group the rows on department_ids.
2. Calculate the MAX(Salary) for each
department.
3. Display only those rows that match the
HAVING condition, that is, departments
with a maximum salary greater than
$10,000.

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

The example in the slide displays the department numbers and maximum salaries for those
departments with a maximum salary greater than $10,000.
You can use the GROUP BY clause without using a group function in the SELECT list. If you restrict
rows based on the result of a group function, you must have a GROUP BY clause as well as the
HAVING clause.
The following example displays the department numbers and average salaries for those departments
with a maximum salary greater than $10,000:
SELECT
department_id, AVG(salary)
FROM
employees
GROUP BY department_id
HAVING
max(salary)>10000;

SQL Fundamentals 10 - 29

Oracle University Student Learning Subscription Use Only

Using the HAVING Clause

SELECT
FROM
WHERE
GROUP BY
HAVING
ORDER BY

job_id, SUM(salary) PAYROLL
employees
job_id NOT LIKE '%REP%'
job_id
SUM(salary) > 13000
SUM(salary);

Query Processing Steps:
1. Eliminate rows with job_id as
SALES_REP.
2. Group the selected rows on job_ids.
3. Calculate the SUM(Salary) for each
job_id.
4. Select rows with sum of salary
greater than $13,000.
5. Display the rows in ascending order
of the total monthly salary.

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

The example in the slide displays the JOB_ID and total monthly salary for each job that has a total
payroll exceeding $13,000. The example excludes sales representatives and sorts the list by the total
monthly salary.

SQL Fundamentals 10 - 30

Oracle University Student Learning Subscription Use Only

Using the HAVING Clause

•
•

What is Data Aggregation?
Group functions:
–
–
–
–

•

Grouping rows:
–
–

•

Types and syntax
Use AVG, SUM, MIN, MAX, COUNT
Use DISTINCT keyword within group functions
NULL values in a group function
GROUP BY clause
HAVING clause

Nesting group functions

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

SQL Fundamentals 10 - 31

Oracle University Student Learning Subscription Use Only

Lesson Agenda

Nesting Group Functions
Group functions can be nested to a depth of two functions.
The GROUP BY clause is mandatory when nesting group functions.
Display the maximum average salary.
SELECT
MAX(AVG(salary))
FROM
employees
GROUP BY department_id;

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Group functions can be nested to a depth of two functions. The example in the slide calculates the
average salary for each DEPARTMENT_ID and then displays the maximum average salary.
Note that the GROUP BY clause is mandatory when nesting group functions. When you specify
GROUP BY on DEPARTMENT_ID, the AVG(salary) is computed for each department and then the
MAX functions returns the maximum average salary.

SQL Fundamentals 10 - 32

Oracle University Student Learning Subscription Use Only

•
•

Group functions operate on sets of rows to give one result per group.
a. True
b. False

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Answer: a

SQL Fundamentals 10 - 33

Oracle University Student Learning Subscription Use Only

Q

Quiz

Group functions process null values in the column.
a. True
b. False

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Answer: b

SQL Fundamentals 10 - 34

Oracle University Student Learning Subscription Use Only

Q

Quiz

Which one of the following clauses can you use to divide rows in a table into
smaller data sets?
a. WHERE clause
b. ORDER BY clause
c. GROUP BY clause
d. HAVING clause

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Answer: c

SQL Fundamentals 10 - 35

Oracle University Student Learning Subscription Use Only

Q

Quiz

Identify the three guidelines for the GROUP BY clause.
a. You cannot use group functions with SELECT queries having the GROUP BY
clause.
b. The GROUP BY column should be in the SELECT clause.
c. All the columns in the SELECT list that are not in group functions must be in
the GROUP BY clause.
d. You cannot use the WHERE clause to restrict groups.

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Answer: b,c,d

SQL Fundamentals 10 - 36

Oracle University Student Learning Subscription Use Only

Q

Quiz

Which one of the following clauses do you use to restrict groups formed by the
GROUP BY clause?
a. WHERE clause
b. HAVING clause

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Answer: b

SQL Fundamentals 10 - 37

Oracle University Student Learning Subscription Use Only

Q

Quiz

In this lesson, you should have learned how to:
• Use the COUNT, MAX, MIN, SUM, and AVG group functions
• Write queries that use the GROUP BY clause
• Write queries that use the HAVING clause

SELECT
FROM
[WHERE
[GROUP BY
[HAVING
[ORDER BY

column, group_function
table
condition]
group_by_expression]
group_condition]
column];

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

There are several group functions available in SQL, such as AVG, COUNT, MAX, MIN, and SUM.
You can create subgroups by using the GROUP BY clause. Further, groups can be restricted by using
the HAVING clause.
Place the HAVING and GROUP BY clauses after the WHERE clause in a statement. The order of the
GROUP BY and HAVING clauses following the WHERE clause is not important. You can have either the
GROUP BY clause or the HAVING clause first, as long as they follow the WHERE clause. Place the
ORDER BY clause at the end.
The Oracle server evaluates the clauses in the following order:
1. If the statement contains a WHERE clause, the server establishes the candidate rows.
2. The server identifies the groups that are specified in the GROUP BY clause.
3. The HAVING clause further restricts result groups that do not meet the group criteria in the
HAVING clause.
Note: For a complete list of the group functions, see Oracle Database SQL Language Reference for
12c database.

SQL Fundamentals 10 - 38

Oracle University Student Learning Subscription Use Only

Summary

This practice covers the following topics:
• Writing queries that use group functions
• Grouping by rows to achieve more than one result
• Restricting groups by using the HAVING clause

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

In this practice, you learn to use group functions and select groups of data.

SQL Fundamentals 10 - 39

Oracle University Student Learning Subscription Use Only

Practice 10: Overview

Oracle University Student Learning Subscription Use Only

Lesson 11: Retrieving Data from
Multiple Tables Using Joins

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Oracle University Student Learning Subscription Use Only

11

Course Roadmap
Lesson 1: Course Overview

Lesson 10: Reporting Aggregated Data
Using the Group Functions

Unit 2: Retrieving and Sorting Data
Unit 3: Joins, Subqueries, and Set
Operators

Lesson 11: Retrieving Data from Multiple
Tables Using Joins

Unit 4: DML and DDL
Lesson 12: Using the Set Operators
Unit 5: Managing Relational Database

Unit 6: Advance Queries and Database
Management System

Lesson 13: Using Subqueries to Solve
Queries

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

In Unit 3, you will learn about using joins, subqueries, and set operators. You will learn to write
compound queries in SQL to generate customized reports using group functions, joins, and
subqueries.`

SQL Fundamentals 11 - 2

Oracle University Student Learning Subscription Use Only

You are here

Unit 1: Relational Database and SQL
Overview

After completing this lesson, you should be able to:
• Write SELECT statements to access data from more than one table using
equijoins and nonequijoins
• Join a table to itself by using a self-join
• View data that generally does not meet a join condition by
using OUTER joins
•

Generate a Cartesian product of all rows from two or
more tables

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

This lesson explains how to obtain data from more than one table. A join is used to view information
from multiple tables. Therefore, you can join tables together to view information from more than one
table.
Note: Information about joins is found in the “SQL Queries and Subqueries: Joins” section in Oracle
Database SQL Language Reference for 12c database.

SQL Fundamentals 11 - 3

Oracle University Student Learning Subscription Use Only

Objectives

Lesson Agenda
Types of JOINS and their syntax
– Natural join
– Join with the USING clause
– Join with the ON clause
•
•
•

Self-join
Nonequijoins
OUTER joins

•

Cartesian product
– Cross join

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

SQL Fundamentals 11 - 4

Oracle University Student Learning Subscription Use Only

•

•
•
•

Different information is stored in different
tables.
Tables are linked to each other through
common attributes.
Using the common attributes, data from
multiple tables can be retrieved.

Use Join with SELECT queries to retrieve data from multiple tables.

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

In a relational database, the data in normalized form is stored in different tables. You may need to get
information from multiple tables in one report. The tables are normally linked to each other through
common attributes. Using these common attributes or columns, you can join the tables and display
the required information. View the next slide for an example.

SQL Fundamentals 11 - 5

Oracle University Student Learning Subscription Use Only

Why Join?

Obtaining Data from Multiple Tables

…
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Sometimes you need to use data from more than one table. In the example in the slide, the report
displays data from two separate tables:
• Employees IDs exist in the EMPLOYEES table.
• Job IDs exist in both the EMPLOYEES and JOBS tables.
• Job titles exist in the JOBS table.
To produce the report, you need to link the EMPLOYEES table and the JOBS table, and access data
from both of them.

SQL Fundamentals 11 - 6

Oracle University Student Learning Subscription Use Only

JOBS

EMPLOYEES

Joins that are compliant with the SQL:1999 standard include the following:
• Natural join with the NATURAL JOIN clause
• Join with the USING clause
• Join with the ON clause
• OUTER joins:
–
–
–

•

LEFT OUTER JOIN
RIGHT OUTER JOIN
FULL OUTER JOIN

Cross joins

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

To join tables, you can use a join syntax that is compliant with the SQL:1999 standard.
Note
• Before the Oracle9i release, the Oracle join syntax was different from the American National
Standards Institute (ANSI) standards. The SQL:1999–compliant join syntax does not offer any
performance benefits over the Oracle-proprietary join syntax that existed in the prior releases.
• The following slide discusses the SQL:1999 join syntax.

SQL Fundamentals 11 - 7

Oracle University Student Learning Subscription Use Only

Types of Joins

Joining Tables Using the SQL:1999 Syntax

table1.column denotes the table and the
column from which data is retrieved.
SELECT
table1.column, table2.column
FROM
table1
[NATURAL JOIN table2] |
[JOIN table2 USING (column_name)] |
[JOIN table2 ON (table1.column_name = table2.column_name)]|
[LEFT|RIGHT|FULL OUTER JOIN table2
ON (table1.column_name = table2.column_name)]|
[CROSS JOIN table2];
Inner equijoins

Outer joins: LEFT,
RIGHT, FULL

Cross join or
Cartesian product

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

In the syntax:
• table1.column denotes the table and the column from which data is retrieved
• NATURAL JOIN joins two tables based on the same column name
• JOIN table2 USING column_name performs an equijoin based on the column name
• JOIN table2 ON table1.column_name = table2.column_name performs an
equijoin based on the condition in the ON clause
• LEFT/RIGHT/FULL OUTER is used to perform OUTER joins
• CROSS JOIN returns a Cartesian product from the two tables
For more information, see the section titled “SELECT” in Oracle Database SQL Language Reference
for 12c database.

SQL Fundamentals 11 - 8

Oracle University Student Learning Subscription Use Only

Use a join to query data from more than one table:

Inner Joins
In SQL:1999, the join of two tables returning only matched rows is called an
INNER join.
1

NATURAL JOIN

2

USING clause

3

ON clause

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Joining tables with the NATURAL JOIN, USING, or ON clauses results in an INNER join. Only matched
rows are returned in an inner join.

SQL Fundamentals 11 - 9

Oracle University Student Learning Subscription Use Only

•

•
•
•

The NATURAL JOIN clause is based on all the columns that have the same
name in two tables.
It selects rows from the two tables that have equal values in all matched
columns.
If the columns having the same names have different data types, an error is
returned.
SELECT * FROM table1 NATURAL JOIN table2;

1

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

You can join tables automatically based on the columns in the two tables that have matching data
types and names. You do this by using the NATURAL JOIN keywords.
Note: The join can happen on only those columns that have the same names and data types in both
tables. If the columns have the same name but different data types, the NATURAL JOIN syntax
causes an error.

SQL Fundamentals 11 - 10

Oracle University Student Learning Subscription Use Only

Creating Natural Joins

Retrieving Records with Natural Joins

The JOBS table is joined to the
EMPLOYEES table by the
JOB_ID column.
JOB_TITLE from the JOBS
table is displayed with the
employee details.

…

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

In the example in the slide, the JOBS table is joined to the EMPLOYEES table by the JOB_ID column,
which is the only column of the same name in both tables. If other common columns were present,
the join would have used them all.
Natural Joins with a WHERE Clause
Additional restrictions on a natural join are implemented by using a WHERE clause. The following
example limits the rows of output to those with a DEPARTMENT_ID equal to 20 or 50:
SELECT department_id, department_name,
location_id, city
FROM
departments
NATURAL JOIN locations
WHERE
department_id IN (20, 50);

SQL Fundamentals 11 - 11

Oracle University Student Learning Subscription Use Only

SELECT employee_id, first_name, job_id, job_title
from employees NATURAL JOIN jobs;

•
•

If several columns have the same names but the data types do not match,
use the USING clause to specify the columns for the equijoin.
Use the USING clause to match only one column when more than one
column matches.

SELECT
table1.column, table2.column
FROM
table1
JOIN table2 USING (column_name);

2

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Natural joins use all columns with matching names and data types to join the tables. The USING
clause can be used to specify only those columns that should be used for an equijoin.

SQL Fundamentals 11 - 12

Oracle University Student Learning Subscription Use Only

Creating Joins with the USING Clause

Joining Column Names

…

Primary key
Foreign key

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

To determine an employee’s department name, you compare the value in the DEPARTMENT_ID
column in the EMPLOYEES table with the DEPARTMENT_ID values in the DEPARTMENTS table. The
relationship between the EMPLOYEES and DEPARTMENTS tables is an equijoin; that is, values in the
DEPARTMENT_ID column in both the tables must be equal. Frequently, this type of join involves
primary and foreign key complements.

SQL Fundamentals 11 - 13

Oracle University Student Learning Subscription Use Only

DEPARTMENTS

EMPLOYEES

SELECT employee_id, last_name,
location_id, department_id
FROM
employees JOIN departments
USING (department_id) ;

…

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

In the example in the slide, the DEPARTMENT_ID columns in the EMPLOYEES and DEPARTMENTS
tables are joined and thus the LOCATION_ID of the department where an employee works is shown.

SQL Fundamentals 11 - 14

Oracle University Student Learning Subscription Use Only

Retrieving Records with the USING Clause

•
•
•
•

Use table prefixes to qualify column names that are in multiple tables.
Use table prefixes to increase the speed of parsing of the statement.
Instead of full table name prefixes, use table aliases.
A table alias gives a table a shorter name:
–
–

•

Keeps SQL code smaller
Uses less memory

Use column aliases to distinguish columns that have identical names, but
reside in different tables.

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

When joining two or more tables, you need to qualify the names of the columns with the table name
to avoid ambiguity. Without the table prefixes, the DEPARTMENT_ID column in the SELECT list could
be from either the DEPARTMENTS table or the EMPLOYEES table. It is necessary to add the table
prefix to execute your query. If there are no common column names between the two tables, there is
no need to qualify the columns. However, using the table prefix increases the speed of parsing of the
statement, because you tell the Oracle server exactly where to find the columns.
However, qualifying column names with table names can be time consuming, particularly if the table
names are lengthy. Instead, you can use table aliases. Just as a column alias gives a column another
name, a table alias gives a table another name. Table aliases help to keep SQL code smaller,
therefore, using less memory.
The table name is specified in full, followed by a space, and then the table alias. For example, the
EMPLOYEES table can be given an alias of e, and the DEPARTMENTS table an alias of d.
Guidelines
• Table aliases can be up to 30 characters in length, but shorter aliases are better than longer
ones.
• If a table alias is used for a particular table name in the FROM clause, that table alias must be
substituted for the table name throughout the SELECT statement.
• Table aliases should be meaningful.
• The table alias is valid for only the current SELECT statement.

SQL Fundamentals 11 - 15

Oracle University Student Learning Subscription Use Only

Qualifying Ambiguous Column Names

•
•

Do not qualify a column that is used in the NATURAL join or a join with a
USING clause.
If the same column is used elsewhere in the SQL statement, do not alias it.
SELECT l.city, d.department_name
FROM
locations l JOIN departments d
USING (location_id)
WHERE d.location_id = 1400;
Prefix the remaining
columns with a table alias;
otherwise, you get the
“column ambiguously
defined” error.

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

When joining with the USING clause, you cannot qualify a column that is used in the USING clause
itself. Furthermore, if that column is used anywhere in the SQL statement, you cannot alias it. For
example, in the query mentioned in the slide, you should not alias the location_id column in the
WHERE clause because the column is used in the USING clause.
The columns that are referenced in the USING clause should not have a qualifier (table name or
alias) anywhere in the SQL statement. For example, the following statement is valid:
SELECT l.city, d.department_name
FROM
locations l JOIN departments d USING (location_id)
WHERE location_id = 1400;
The columns that are common in both the tables, but not used in the USING clause, must be prefixed
with a table alias; otherwise, you get the “column ambiguously defined” error.
In the following statement, manager_id is present in both the employees and departments table;
if manager_id is not prefixed with a table alias, it gives a “column ambiguously defined” error.
The following statement is valid:
SELECT first_name, d.department_name, d.manager_id
FROM
employees e JOIN departments d USING (department_id)
WHERE department_id = 50;

SQL Fundamentals 11 - 16

Oracle University Student Learning Subscription Use Only

Using Table Aliases with the USING Clause

•
•
•
•

The join condition for the natural join is basically an equijoin of all columns
with the same name.
Use the ON clause to specify arbitrary conditions or specify columns to join.
The join condition is separated from other search conditions.
The ON clause makes code easy to understand.
SELECT
table1.column, table2.column
FROM
table1
JOIN table2 ON (table1.column_name = table2.column_name);

3

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Use the ON clause to specify a join condition. With this, you can specify join conditions separate from
any search or filter conditions in the WHERE clause.

SQL Fundamentals 11 - 17

Oracle University Student Learning Subscription Use Only

Creating Joins with the ON Clause

SELECT e.employee_id, e.last_name, e.department_id,
d.department_id, d.location_id
FROM
employees e JOIN departments d
ON
(e.department_id = d.department_id);

…
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

In this example, the DEPARTMENT_ID columns in the EMPLOYEES and DEPARTMENTS table are
joined using the ON clause. Wherever a department ID in the EMPLOYEES table equals a department
ID in the DEPARTMENTS table, the row is returned. The table alias is necessary to qualify the
matching column_names.
You can also use the ON clause to join columns that have different names. The parentheses around
the joined columns, as in the example in the slide (e.department_id = d.department_id), is
optional. So, even ON e.department_id = d.department_id will work.
Note: When you use the Execute Statement icon to run the query, SQL Developer suffixes a ‘_1’ to
differentiate between the two department_ids.

SQL Fundamentals 11 - 18

Oracle University Student Learning Subscription Use Only

Retrieving Records with the ON Clause

SELECT
FROM
JOIN
ON
JOIN
ON

employee_id, city, department_name
employees e
departments d
d.department_id = e.department_id
locations l
d.location_id = l.location_id;

…
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

A three-way join is a join of three tables. Here, the first join to be performed is EMPLOYEES JOIN
DEPARTMENTS. The first join condition can reference columns in EMPLOYEES and DEPARTMENTS but
cannot reference columns in LOCATIONS. The second join condition can reference columns from all
three tables.
Note: The code example in the slide can also be accomplished with the USING clause:
SELECT e.employee_id, l.city, d.department_name
FROM employees e
JOIN departments d
USING (department_id)
JOIN locations l
USING (location_id);

SQL Fundamentals 11 - 19

Oracle University Student Learning Subscription Use Only

Creating Three-Way Joins

Applying Additional Conditions to a Join

SELECT e.employee_id, e.last_name, e.department_id,
d.department_id, d.location_id
FROM
employees e JOIN departments d
ON
(e.department_id = d.department_id)
AND
e.manager_id = 149 ;

Or
SELECT e.employee_id, e.last_name, e.department_id,
d.department_id, d.location_id
FROM
employees e JOIN departments d
ON
(e.department_id = d.department_id)
WHERE
e.manager_id = 149 ;

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

You can apply additional conditions to the join.
The example shown in the slide performs a join on the EMPLOYEES and DEPARTMENTS tables and, in
addition, displays only employees who have a manager ID of 149. To add additional conditions to the
ON clause, you can add AND clauses. Alternatively, you can use a WHERE clause to apply additional
conditions.
Both the queries produce the same output.

SQL Fundamentals 11 - 20

Oracle University Student Learning Subscription Use Only

Use the AND clause or the WHERE clause to apply additional conditions:

Lesson Agenda
Types of JOINS and their syntax
–
–
–

Natural join
Join with the USING clause
Join with the ON clause

•
•
•

Self-join
Nonequijoins
OUTER joins

•

Cartesian product
–

Cross join

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

SQL Fundamentals 11 - 21

Oracle University Student Learning Subscription Use Only

•

Joining a Table to Itself

…

EMPLOYEES (MANAGER)

…
MANAGER_ID in the WORKER table is equal to
EMPLOYEE_ID in the MANAGER table.

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Sometimes, you need to join a table to itself. To find the name of each employee’s manager, you
need to join the EMPLOYEES table to itself, or perform a self-join. For example, to find the name of
Ernst’s manager, you need to perform the following steps:
• Find Ernst in the EMPLOYEES table by looking at the LAST_NAME column.
• Find the manager number for Ernst by looking at the MANAGER_ID column. Ernst’s manager
number is 103.
• Find the name of the manager with EMPLOYEE_ID 103 by looking at the LAST_NAME column.
Hunold’s employee number is 103, so Hunold is Ernst’s manager.
In this process, you look in the table twice. The first time you look in the table to find Ernst in the
LAST_NAME column and the MANAGER_ID value of 103. The second time you look in the
EMPLOYEE_ID column to find 103 and the LAST_NAME column to find Hunold.

SQL Fundamentals 11 - 22

Oracle University Student Learning Subscription Use Only

EMPLOYEES (WORKER)

SELECT worker.last_name emp, manager.last_name mgr
FROM
employees worker JOIN employees manager
ON
(worker.manager_id = manager.employee_id);

The same EMPLOYEES table is referred to as
‘worker’ and ‘manager’ using table alias.
Using the column alias, you differentiate
between the employee and the corresponding
manager in the output.

…

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

The ON clause can also be used to join columns that have different names, within the same table or
in a different table.
The example shown is a self-join of the EMPLOYEES table, based on the EMPLOYEE_ID and
MANAGER_ID columns. In this process, you look in the table twice. The first time you look in the table
to find Ernst in the LAST_NAME column and the MANAGER_ID value of 103. The second time you look
in the EMPLOYEE_ID column to find 103 and the LAST_NAME column to find Hunold.

SQL Fundamentals 11 - 23

Oracle University Student Learning Subscription Use Only

Self-Joins Using the ON Clause

Lesson Agenda
Types of JOINS and their syntax
–
–
–

Natural join
Join with the USING clause
Join with the ON clause

•
•
•

Self-join
Nonequijoins
OUTER joins

•

Cartesian product
–

Cross join

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

SQL Fundamentals 11 - 24

Oracle University Student Learning Subscription Use Only

•

Nonequijoins

EMPLOYEES

…

JOB_GRADES

The JOB_GRADES table defines the LOWEST_SAL and
HIGHEST_SAL range of values for each GRADE_LEVEL.
Therefore, the GRADE_LEVEL column can be used to
assign grades to each employee.

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

A nonequijoin is a join condition containing something other than an equality operator.
The relationship between the EMPLOYEES table and the JOB_GRADES table is an example of a
nonequijoin. The SALARY column in the EMPLOYEES table ranges between the values in the
LOWEST_SAL and HIGHEST_SAL columns of the JOB_GRADES table. Therefore, each employee can
be graded based on their salary. The relationship is obtained using an operator other than the
equality (=) operator.

SQL Fundamentals 11 - 25

Oracle University Student Learning Subscription Use Only

A nonequijoin is a join condition containing something other than an
equality operator, for example, a BETWEEN operator.

SELECT e.last_name, e.salary, j.grade_level
FROM
employees e JOIN job_grades j
ON
e.salary
BETWEEN j.lowest_sal AND j.highest_sal;

…
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

The example in the slide creates a nonequijoin to evaluate an employee’s salary grade. The salary
must be between any pair of the low and high salary ranges.
It is important to note that all employees appear exactly once when this query is executed. No
employee is repeated in the list. There are two reasons for this:
• None of the rows in the JOB_GRADES table contain grades that overlap. That is, the salary
value for an employee can lie only between the low-salary and high-salary values of one of the
rows in the salary grade table.
• All of the employees’ salaries lie within the limits provided by the job grade table. That is, no
employee earns less than the lowest value contained in the LOWEST_SAL column or more than
the highest value contained in the HIGHEST_SAL column.
Note: Other conditions (such as <= and >=) can be used, but BETWEEN is the simplest. Remember
to specify the low value first and the high value last when using the BETWEEN condition. The Oracle
server translates the BETWEEN condition to a pair of AND conditions. Therefore, using BETWEEN has
no performance benefits, but should be used only for logical simplicity.
Table aliases have been specified in the slide example for performance reasons, not because of
possible ambiguity.

SQL Fundamentals 11 - 26

Oracle University Student Learning Subscription Use Only

Retrieving Records with Nonequijoins

Lesson Agenda
Types of JOINS and their syntax
–
–
–

Natural join
Join with the USING clause
Join with the ON clause

•
•
•

Self-join
Nonequijoins
OUTER joins

•

Cartesian product
–

Cross join

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

SQL Fundamentals 11 - 27

Oracle University Student Learning Subscription Use Only

•

Returning Records with No Direct Match Using OUTER
Joins

There are no employees in department
190.
Employee “Grant” does not have a
department_ID; therefore is not seen in
the equijoin result.

Equijoin with EMPLOYEES

…

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

If a row does not satisfy a join condition, the row does not appear in the query result.
In the slide example, a simple equijoin condition is used on the EMPLOYEES and DEPARTMENTS
tables to return the result on the right. The result set does not contain the following:
• Department ID 190, because there are no employees with that department ID recorded in the
EMPLOYEES table
•

The employee with the last name of Grant, because this employee has not been assigned a
department ID

To return the department record that does not have any employees, or employees that do not have
an assigned department, you can use an OUTER join.

SQL Fundamentals 11 - 28

Oracle University Student Learning Subscription Use Only

DEPARTMENTS

•
•

•

In SQL:1999, the join of two tables returning only matched rows is called an
INNER join.
A join between two tables that returns the results of the INNER join as well
as the unmatched rows from the left (or right) table is called a left (or right)
OUTER join.
A join between two tables that returns the results of an INNER join as well
as the results of a left and right join is a full OUTER join.

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Joining tables with the NATURAL JOIN, USING, or ON clauses results in an INNER join. Any
unmatched rows are not displayed in the output. To return the unmatched rows, you can use an
OUTER join. An OUTER join returns all rows that satisfy the join condition and also returns some or all
of those rows from one table for which no rows from the other table satisfy the join condition.
There are three types of OUTER joins:
•
LEFT OUTER
•
RIGHT OUTER
•
FULL OUTER

SQL Fundamentals 11 - 29

Oracle University Student Learning Subscription Use Only

INNER Versus OUTER Joins

SELECT e.last_name, e.department_id, d.department_name
FROM
employees e LEFT OUTER JOIN departments d
ON
(e.department_id = d.department_id) ;

…

LEFT OUTER JOIN shows the
employee “Grant” who does not
have a department ID.

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

This query retrieves all the rows in the EMPLOYEES table, which is the table on the left, even if there
is no match in the DEPARTMENTS table.

SQL Fundamentals 11 - 30

Oracle University Student Learning Subscription Use Only

LEFT OUTER JOIN

SELECT e.last_name, d.department_id, d.department_name
FROM
employees e RIGHT OUTER JOIN departments d
ON
(e.department_id = d.department_id) ;

RIGHT OUTER JOIN
shows the department that
has no employees.

…

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

This query retrieves all the rows in the DEPARTMENTS table, which is the table on the right, even if
there is no match in the EMPLOYEES table.

SQL Fundamentals 11 - 31

Oracle University Student Learning Subscription Use Only

RIGHT OUTER JOIN

SELECT e.last_name, d.department_id, d.department_name
FROM
employees e FULL OUTER JOIN departments d
ON
(e.department_id = d.department_id) ;

…

FULL OUTER JOIN shows all the
rows from the two tables, even if
there is no match.

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

This query retrieves all the rows in the EMPLOYEES table, even if there is no match in the
DEPARTMENTS table. It also retrieves all the rows in the DEPARTMENTS table, even if there is no
match in the EMPLOYEES table.

SQL Fundamentals 11 - 32

Oracle University Student Learning Subscription Use Only

FULL OUTER JOIN

Lesson Agenda
Types of JOINS and their syntax
–
–
–

Natural join
Join with the USING clause
Join with the ON clause

•
•
•

Self-join
Nonequijoins
OUTER joins

•

Cartesian product
–

Cross join

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

SQL Fundamentals 11 - 33

Oracle University Student Learning Subscription Use Only

•

•
•

A Cartesian product is a join of every row of one table to every row of
another table.
It generates a large number of rows and the result is rarely useful.

Always include a valid join condition unless you have a specific need to
combine all rows from all tables.

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

A Cartesian product tends to generate a large number of rows and the result is rarely useful. You
should, therefore, always include a valid join condition unless you have a specific need to combine all
rows from all tables.
Cartesian products are useful for some tests when you need to generate a large number of rows to
simulate a reasonable amount of data.

SQL Fundamentals 11 - 34

Oracle University Student Learning Subscription Use Only

Cartesian Products

Generating a Cartesian Product
DEPARTMENTS (8 rows)

…

Cartesian product:
20 x 8 = 160 rows

…
…
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

A Cartesian product is generated if a join condition is omitted. The example in the slide displays the
employee last name and the department name from the EMPLOYEES and DEPARTMENTS tables.
Because no join condition was specified, all rows (20 rows) from the EMPLOYEES table are joined
with all rows (8 rows) in the DEPARTMENTS table, thereby generating 160 rows in the output.

SQL Fundamentals 11 - 35

Oracle University Student Learning Subscription Use Only

EMPLOYEES (20 rows)

•
•

A CROSS JOIN is a JOIN operation that produces the Cartesian product of
two tables.
To create a Cartesian product, specify the CROSS JOIN in your SELECT
statement.
SELECT last_name, department_name
FROM
employees
CROSS JOIN departments ;

…

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

The example in the slide produces a Cartesian product of the EMPLOYEES and DEPARTMENTS tables.
It is a good practice to explicitly state CROSS JOIN in your SELECT statement when you intend to
create a Cartesian product. Therefore, it is very clear that you intend for this to happen and it is not
the result of missing joins.

SQL Fundamentals 11 - 36

Oracle University Student Learning Subscription Use Only

Creating Cross Joins

Which of the following clauses of the JOIN syntax can you use to perform inner
equijoins?
a. CROSS JOIN
b. NATURAL JOIN
c. USING clause
d. ON clause
e. LEFT OUTER JOIN

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Answer: b, c, d

SQL Fundamentals 11 - 37

Oracle University Student Learning Subscription Use Only

Q

Quiz

If you join a table to itself, what kind of join are you using?
a. Nonequijoin
b. Left OUTER join
c. Self-join
d. Natural join
e. Cartesian product

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Answer: c

SQL Fundamentals 11 - 38

Oracle University Student Learning Subscription Use Only

Q

Quiz

Which type of join specifies a join condition containing operators other than the
equality operator?
a. Nonequijoin
b. CROSS JOIN

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Answer: a

SQL Fundamentals 11 - 39

Oracle University Student Learning Subscription Use Only

Q

Quiz

In this lesson, you should have learned how to:
• Write SELECT statements to access data from more than one table using
equijoins and nonequijoins
• Join a table to itself by using a self-join
• View data that generally does not meet a join condition by
using OUTER joins
•

Generate a Cartesian product of all rows from two or
more tables

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

There are multiple ways to join tables.
Types of Joins
• Equijoins
• Nonequijoins
• OUTER joins
•
•
•
•

Self-joins
Cross joins
Natural joins
Full (or two-sided) OUTER joins

Cartesian Products
A Cartesian product results in the display of all combinations of rows. This is done by either omitting
the WHERE clause or specifying the CROSS JOIN clause.
Table Aliases
• Table aliases speed up database access.
• They can help to keep SQL code smaller by conserving memory.
• They are sometimes mandatory to avoid column ambiguity.

SQL Fundamentals 11 - 40

Oracle University Student Learning Subscription Use Only

Summary

This practice covers the following topics:
• Joining tables using an equijoin
• Performing outer and self-joins
• Adding conditions

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

This practice is intended to give you experience in extracting data from more than one table using the
SQL:1999–compliant joins.

SQL Fundamentals 11 - 41

Oracle University Student Learning Subscription Use Only

Practice 11: Overview

Oracle University Student Learning Subscription Use Only

Lesson 12: Using the Set Operators

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Oracle University Student Learning Subscription Use Only

12

Course Roadmap
Lesson 1: Course Overview

Unit 2: Retrieving and Sorting Data

Lesson 10: Reporting Aggregated Data
Using the Group Functions

Unit 3: Joins, Subqueries, and Set
Operators

Lesson 11: Retrieving Data from Multiple
Tables Using Joins

Unit 4: DML and DDL
Lesson 12: Using the Set Operators
Unit 5: Managing Relational Database

Unit 6: Advance Queries and Database
Management System

Lesson 13: Using Subqueries to Solve
Queries

You are here.
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

In Unit 3, you learn about using joins, subqueries, and set operators. You also learn to write
compound queries in SQL to generate customized reports by using group functions, joins, and
subqueries.

SQL Fundamentals 12 - 2

Oracle University Student Learning Subscription Use Only

Unit 1: Relational Database and SQL
Overview

After completing this lesson, you should be able to do the following:
• Describe set operators
• Use a set operator to combine multiple queries into a single query
• Control the order of rows returned

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

In this lesson, you learn how to write queries by using set operators.

SQL Fundamentals 12 - 3

Oracle University Student Learning Subscription Use Only

Objectives

•
•
•
•
•
•
•

Set operators: Types and guidelines
Tables used in this lesson
UNION and UNION ALL operators
INTERSECT operator
MINUS operator
Matching the SELECT statements
Using the ORDER BY clause in set operations

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

SQL Fundamentals 12 - 4

Oracle University Student Learning Subscription Use Only

Lesson Agenda

Set Operators
A

B

A

B

A

B
INTERSECT

A

Using SET operators, you can
combine the results of two or more
queries into one result.
Queries containing set operators are
called compound queries.

B
MINUS

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Set operators combine the results of two or more component queries into one result. Queries
containing set operators are called compound queries.
All set operators have equal precedence. If a SQL statement contains multiple set operators, the
Oracle server evaluates them from left (top) to right (bottom), if no parentheses explicitly specify
another order. You should use parentheses to specify the order of evaluation explicitly in queries that
use the INTERSECT operator with other set operators.

SQL Fundamentals 12 - 5

Oracle University Student Learning Subscription Use Only

UNION/UNION ALL

•

The expressions in the SELECT lists must match in number.

•

The data type of each column in the subsequent query must match the data
type of its corresponding column in the first query.
Parentheses can be used to alter the sequence of execution.
The ORDER BY clause can appear only at the very end of the statement.

•
•

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

•

•
•

The expressions in the SELECT lists of the queries must match in number and data type.
Queries that use the UNION, UNION ALL, INTERSECT, and MINUS operators must have the
same number and data type of columns in their SELECT list. The data type of the columns in the
SELECT list of the queries in the compound query may not be exactly the same. The column in
the second query must be in the same data type group (such as numeric or character) as the
corresponding column in the first query.
Set operators can be used in subqueries.
You should use parentheses to specify the order of evaluation in queries that use the
INTERSECT operator with other set operators. This ensures compliance with emerging SQL
standards that will give the INTERSECT operator greater precedence than the other set
operators.

SQL Fundamentals 12 - 6

Oracle University Student Learning Subscription Use Only

Set Operator Rules

•

Duplicate rows are automatically eliminated except in UNION ALL.

•
•

Column names from the first query appear in the result.
The output is sorted in ascending order by default except in UNION ALL.

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

When a query uses set operators, the Oracle server eliminates duplicate rows automatically except in
the case of the UNION ALL operator. The column names in the output are decided by the column list
in the first SELECT statement. By default, the output is sorted in ascending order of the first column of
the SELECT clause.
The corresponding expressions in the SELECT lists of the component queries of a compound query
must match in number and data type. If component queries select character data, the data type of the
return values is determined as follows:
• If both queries select values of CHAR data type, of equal length, the returned values have the
CHAR data type of that length. If the queries select values of CHAR with different lengths, the
returned value is VARCHAR2 with the length of the larger CHAR value.
• If either or both of the queries select values of VARCHAR2 data type, the returned values have
the VARCHAR2 data type.
If component queries select numeric data, the data type of the return values is determined by numeric
precedence. If all queries select values of the NUMBER type, the returned values have the NUMBER
data type. In queries that use set operators, the Oracle server does not perform implicit conversion
across data type groups. Therefore, if the corresponding expressions of component queries resolve
to both character data and numeric data, the Oracle server returns an error.

SQL Fundamentals 12 - 7

Oracle University Student Learning Subscription Use Only

Oracle Server and Set Operators

•
•
•
•
•
•
•

Set operators: Types and guidelines
Tables used in this lesson
UNION and UNION ALL operators
INTERSECT operator
MINUS operator
Matching the SELECT statements
Using the ORDER BY clause in set operations

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

SQL Fundamentals 12 - 8

Oracle University Student Learning Subscription Use Only

Lesson Agenda

The tables used in this lesson are:
• EMPLOYEES: Provides details of all current employees
• RETIRED_EMPLOYEES: Provides details of all past employees

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Two tables are used in this lesson: the EMPLOYEES table and the RETIRED_EMPLOYEES table.
You are already familiar with the EMPLOYEES table that stores employee details such as a unique
identification number, email address, job identification (such as ST_CLERK, SA_REP, and so on),
salary, manager, and so on.
RETIRED_EMPLOYEES stores the details of employees who have left the company.
The structure of and data from the EMPLOYEES and RETIRED_EMPLOYEES tables are shown on the
following pages.

SQL Fundamentals 12 - 9

Oracle University Student Learning Subscription Use Only

Tables Used in This Lesson

Oracle University Student Learning Subscription Use Only

DESCRIBE employees

SQL Fundamentals 12 - 10

DESCRIBE retired_employees

SQL Fundamentals 12 - 11

Oracle University Student Learning Subscription Use Only

SELECT employee_id, last_name, job_id, hire_date, department_id
FROM employees;

Oracle University Student Learning Subscription Use Only

SELECT * FROM retired_employees;

SQL Fundamentals 12 - 12

•
•
•
•
•
•
•

Set operators: Types and guidelines
Tables used in this lesson
UNION and UNION ALL operators
INTERSECT operator
MINUS operator
Matching the SELECT statements
Using the ORDER BY clause in set operations

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

SQL Fundamentals 12 - 13

Oracle University Student Learning Subscription Use Only

Lesson Agenda

UNION Operator
B

The UNION operator returns rows from both queries after eliminating
duplications.

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

The UNION operator returns all rows that are selected by either query. Use the UNION operator to
return all rows from multiple tables and eliminate any duplicate rows.
Guidelines
• The number of columns being selected must be the same.
• The data types of the columns being selected must be in the same data type group (such as
numeric or character).
• The names of the columns need not be identical.
• UNION operates over all the columns being selected.
• NULL values are not ignored during duplicate checking.
• By default, the output is sorted in ascending order of the columns of the SELECT clause.

SQL Fundamentals 12 - 14

Oracle University Student Learning Subscription Use Only

A

Using the UNION Operator

SELECT
FROM
UNION
SELECT
FROM

job_id
employees
job_id
retired_employees

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

The UNION operator eliminates any duplicate records. If records that occur in both the EMPLOYEES
and the RETIRED_EMPLOYEES tables are identical, the records are displayed only once.

SQL Fundamentals 12 - 15

Oracle University Student Learning Subscription Use Only

Display the job details of all current and retired employees. Display each job only
once.

UNION ALL Operator
B

The UNION ALL operator returns rows from both queries, including all
duplications.

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Use the UNION ALL operator to return all rows from multiple queries.
Guidelines
The guidelines for UNION and UNION ALL are the same, with the following two exceptions that
pertain to UNION ALL: Unlike UNION, duplicate rows are not eliminated and the output is not sorted
by default.

SQL Fundamentals 12 - 16

Oracle University Student Learning Subscription Use Only

A

Using the UNION ALL Operator

SELECT job_id, department_id
FROM
employees
UNION ALL
SELECT job_id, department_id
FROM
retired_employees
ORDER BY job_id;

…
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

In the example, 35 rows are selected. The combination of the two tables totals to 35 rows. The
UNION ALL operator does not eliminate duplicate rows. UNION returns all distinct rows selected by
either query. UNION ALL returns all rows selected by either query, including all duplicates. Consider
the query in the slide, now written with the UNION clause:
SELECT job_id,department_id
FROM
employees
UNION
SELECT job_id,department_id
FROM
retired_employees
ORDER BY job_id;
The preceding query returns 19 rows. This is because it eliminates all the duplicate rows.

SQL Fundamentals 12 - 17

Oracle University Student Learning Subscription Use Only

Display the jobs and departments of all current and previous employees.

•
•
•
•
•
•
•

Set operators: Types and guidelines
Tables used in this lesson
UNION and UNION ALL operators
INTERSECT operator
MINUS operator
Matching the SELECT statements
Using the ORDER BY clause in set operations

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

SQL Fundamentals 12 - 18

Oracle University Student Learning Subscription Use Only

Lesson Agenda

INTERSECT Operator
B

The INTERSECT operator returns rows that are common to both queries.

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Use the INTERSECT operator to return all rows that are common to multiple queries.
Guidelines
• The number of columns and the data types of the columns being selected by the SELECT
statements in the queries must be identical in all the SELECT statements used in the query. The
names of the columns, however, need not be identical.
• Reversing the order of the intersected tables does not alter the result.
• INTERSECT does not ignore NULL values.

SQL Fundamentals 12 - 19

Oracle University Student Learning Subscription Use Only

A

Using the INTERSECT Operator

SELECT manager_id,department_id
FROM
employees
INTERSECT
SELECT manager_id,department_id
FROM
retired_employees

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

In the example in the slide, the query returns only those records that have the same values in the
selected columns in both tables.

SQL Fundamentals 12 - 20

Oracle University Student Learning Subscription Use Only

Display the common manager IDs and department IDs of current and previous
employees.

•
•
•
•
•
•
•

Set operators: Types and guidelines
Tables used in this lesson
UNION and UNION ALL operators
INTERSECT operator
MINUS operator
Matching the SELECT statements
Using the ORDER BY clause in set operations

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

SQL Fundamentals 12 - 21

Oracle University Student Learning Subscription Use Only

Lesson Agenda

MINUS Operator
B

The MINUS operator returns all the distinct rows selected by the first query, but
not present in the second query result set.

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Use the MINUS operator to return all distinct rows selected by the first query, but not present in the
second query result set (the first SELECT statement MINUS the second SELECT statement).
Note: The number of columns must be the same and the data types of the columns being selected by
the SELECT statements in the queries must belong to the same data type group in all the SELECT
statements used in the query. The names of the columns, however, need not be identical.

SQL Fundamentals 12 - 22

Oracle University Student Learning Subscription Use Only

A

Using the MINUS Operator

SELECT employee_id, job_id
FROM employees
WHERE department_id = 80
MINUS
SELECT employee_id, job_id
FROM retired_employees
WHERE department_id = 90;

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

In the example in the slide, the employee IDs in the RETIRED_EMLOYEES table are subtracted from
those in the EMPLOYEES table. The results set displays the employees remaining after the
subtraction; they are represented by rows that exist in the EMPLOYEES table, but do not exist in the
RETIRED_EMPLOYEES table. These are the records of employees who work in the sales department.

SQL Fundamentals 12 - 23

Oracle University Student Learning Subscription Use Only

Display the employee IDs and job IDs of those employees who work in the sales
department.

•
•
•
•
•
•
•

Set operators: Types and guidelines
Tables used in this lesson
UNION and UNION ALL operators
INTERSECT operator
MINUS operator
Matching the SELECT statements
Using the ORDER BY clause in set operations

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

SQL Fundamentals 12 - 24

Oracle University Student Learning Subscription Use Only

Lesson Agenda

Matching the SELECT Statements

SELECT location_id, department_name "Department",
TO_CHAR(NULL) "Warehouse location"
FROM departments
UNION
SELECT location_id, TO_CHAR(NULL) "Department",
state_province
FROM locations;

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Because the expressions in the SELECT lists of the queries must match in number, you can use
dummy columns and the data type conversion functions to comply with this rule. To match the
column list explicitly, you can insert NULL columns at the missing positions so as to match the count
and data type of the selected columns in each SELECT statement. In the slide, the name Warehouse
location is given as the dummy column heading. The TO_CHAR function is used in the first query to
match the VARCHAR2 data type of the state_province column that is retrieved by the second
query. Similarly, the TO_CHAR function in the second query is used to match the VARCHAR2 data type
of the department_name column that is retrieved by the first query.

SQL Fundamentals 12 - 25

Oracle University Student Learning Subscription Use Only

You must match the data type (using the TO_CHAR function or any other
conversion functions) when columns do not exist in one or the other table.

Matching the SELECT Statement: Example

SELECT first_name, job_id, TO_DATE(hire_date)"HIRE_DATE"
FROM employees
UNION
SELECT first_name, job_id, TO_DATE(null)"HIRE_DATE"
FROM retired_employees;

…

…

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

The EMPLOYEES and RETIRED_EMPLOYEES tables have several columns in common (for example,
EMPLOYEE_ID, JOB_ID, and DEPARTMENT_ID). But what if you want the query to display the
FIRST_NAME, JOB_ID, and HIRE_DATE by using the UNION operator, knowing that HIRE_DATE
exists only in the EMPLOYEES table?
The code example in the slide matches the FIRST_NAME and JOB_ID columns in the EMPLOYEES
and RETIRED_EMPLOYEES tables. NULL is added to the RETIRED_EMPLOYEES SELECT statement
to match the HIRE_DATE column in the EMPLOYEES SELECT statement.
In the results shown in the slide, each row in the output that corresponds to a record from the
RETIRED_EMPLOYEES table contains a NULL in the HIRE_DATE column.

SQL Fundamentals 12 - 26

Oracle University Student Learning Subscription Use Only

Using the UNION operator, display the employee name, department_id, and
location_id of all employees.

•
•
•
•
•
•
•

Set operators: Types and guidelines
Tables used in this lesson
UNION and UNION ALL operators
INTERSECT operator
MINUS operator
Matching the SELECT statements
Using the ORDER BY clause in set operations

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

SQL Fundamentals 12 - 27

Oracle University Student Learning Subscription Use Only

Lesson Agenda

•
•
•
•

The ORDER BY clause can appear only once at the end of the compound
query.
Component queries cannot have individual ORDER BY clauses.
The ORDER BY clause recognizes only the columns of the first SELECT
query.
By default, the first column of the first SELECT query is used to sort the
output in ascending order.

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

The ORDER BY clause can be used only once in a compound query. If used, the ORDER BY clause
must be placed at the end of the query. The ORDER BY clause accepts the column name or an alias.
By default, the output is sorted in ascending order of the first column of the first SELECT query.
Note: The ORDER BY clause does not recognize the column names of the second SELECT query. To
avoid confusion over column names, it is a common practice to ORDER BY column positions.
For example, in the following statement, the output will be shown in ascending order of job_id.
SELECT employee_id, job_id,salary
FROM
employees
UNION
SELECT employee_id, job_id,0
FROM
retired_employees
ORDER BY 2;
If you omit ORDER BY, by default, the output will be sorted in ascending order of employee_id. You
cannot use the columns from the second query to sort the output.

SQL Fundamentals 12 - 28

Oracle University Student Learning Subscription Use Only

Using the ORDER BY Clause in Set Operations

Q

Quiz

b. Parentheses may not be used to alter the sequence of execution.
c. The data type of each column in the second query must match the data type
of its corresponding column in the first query.
d. The ORDER BY clause can be used only once in a compound query, unless a
UNION ALL operator is used.

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Answer: a, c

SQL Fundamentals 12 - 29

Oracle University Student Learning Subscription Use Only

Identify two set operator guidelines.
a. The expressions in the SELECT lists must match in number.

Identify the set operator that returns all the distinct rows selected by the first
query, but not present in the second query result set.
a. INTERSECT
b. UNION
c. MINUS
d. UNION ALL

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Answer: c

SQL Fundamentals 12 - 30

Oracle University Student Learning Subscription Use Only

Q

Quiz

In this lesson, you should have learned how to use:
• UNION to return all distinct rows
• UNION ALL to return all rows, including duplicates
• INTERSECT to return all rows that are shared by both queries
• MINUS to return all distinct rows that are selected by the first
query, but not by the second
• ORDER BY only at the very end of the statement

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

•
•
•
•
•
•

The UNION operator returns all the distinct rows selected by each query in the compound query.
Use the UNION operator to return all rows from multiple tables and eliminate any duplicate rows.
Use the UNION ALL operator to return all rows from multiple queries. Unlike with the UNION
operator, duplicate rows are not eliminated and the output is not sorted by default.
Use the INTERSECT operator to return all rows that are common to multiple queries.
Use the MINUS operator to return rows returned by the first query that are not present in the
second query.
Remember to use the ORDER BY clause only at the very end of the compound statement.
Make sure that the corresponding expressions in the SELECT lists match in number and data
type.

SQL Fundamentals 12 - 31

Oracle University Student Learning Subscription Use Only

Summary

In this practice, you create reports by using:
• The UNION operator
• The INTERSECT operator
• The MINUS operator

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

In this practice, you write queries by using the set operators.

SQL Fundamentals 12 - 32

Oracle University Student Learning Subscription Use Only

Practice 12: Overview

Lesson 13: Using Subqueries to
Solve Queries

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Oracle University Student Learning Subscription Use Only

13

Course Roadmap
Lesson 1: Course Overview

Lesson 10: Reporting Aggregated Data
Using the Group Functions

Unit 2: Retrieving and Sorting Data
Unit 3: Joins, Subqueries, and Set
Operators

Lesson 11: Retrieving Data from Multiple
Tables Using Joins

Unit 4: DML and DDL
Lesson 12: Using the Set Operators
Unit 5: Managing Relational Database
Lesson 13: Using Subqueries to Solve
Queries

Unit 6: Advance Queries and Database
Management System

You are here
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

In Unit 3, you will learn about using joins, subqueries, and set operators. You will learn to write
compound queries in SQL to generate customized reports using group functions, joins, and
subqueries.

SQL Fundamentals 13 - 2

Oracle University Student Learning Subscription Use Only

Unit 1: Relational Database and SQL
Overview

After completing this lesson, you should be able to:
• Define subqueries
• Describe the types of problems that the subqueries can solve
• List the types of subqueries
• Write single-row, multiple-row, multiple-column subqueries

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

In this lesson, you learn about the more advanced features of the SELECT statement. You can write
subqueries in the WHERE clause of another SQL statement to obtain values based on an unknown
conditional value. This lesson also covers single-row subqueries, multiple-row subqueries, and
multiple-column subqueries.

SQL Fundamentals 13 - 3

Oracle University Student Learning Subscription Use Only

Objectives

•
•

Subquery: Types, syntax, and guidelines
Single-row subqueries:
–
–

•

Multiple-row subqueries
–

•
•

Group functions in a subquery
HAVING clause with subqueries
Using ALL or ANY operator

Multiple-column subqueries
Null values in a subquery

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

SQL Fundamentals 13 - 4

Oracle University Student Learning Subscription Use Only

Lesson Agenda

Using a Subquery to Solve a Problem

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Suppose you want to write a query to find out the names of all employees who were hired after
Davies.
To solve this problem, you need two queries: one query to find when Davies was hired, and a second
query to find who were hired after Davies.
You can solve this problem by combining the two queries, placing one query inside the other query.
The inner query (or subquery) returns a value that is used by the outer query (or main query).

SQL Fundamentals 13 - 5

Oracle University Student Learning Subscription Use Only

Who is hired after Davies?

•
•

The subquery (inner query) executes before the main query (outer query).
The result of the subquery is used by the main query.
SELECT
FROM
WHERE

select_list
table
expr operator
(SELECT select_list
FROM
table);

In a SELECT statement, subqueries can be placed in:
• WHERE clause
• HAVING clause
• FROM clause

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

A subquery is a SELECT statement that is embedded in the clause of another SELECT statement.
You can build powerful statements out of simple ones by using subqueries. They can be very useful
when you need to select rows from a table with a condition that depends on the data in the table
itself.
You can place the subquery in a number of SQL clauses, including the following:
•
WHERE clause
•
HAVING clause
•
FROM clause
In the syntax:
operator includes a comparison condition such as >, =, or IN
The subquery is often referred to as a nested SELECT, sub-SELECT, or inner SELECT statement. The
subquery generally executes first, and its output is used to complete the query condition for the main
(or outer) query.

SQL Fundamentals 13 - 6

Oracle University Student Learning Subscription Use Only

Subquery Syntax

SELECT last_name, hire_date
29-JAN-13
FROM
employees
WHERE hire_date > (SELECT hire_date
FROM
employees
WHERE last_name = 'Davies');

The inner query returns the hire date of
‘Davies’. The outer query returns the
last name and hire date of employees
hired after ‘Davies’.

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

In the slide, the inner query determines the hire date of the employee Davies. The outer query takes
the result of the inner query and uses this result to display all the employees who were hired after
Davies.

SQL Fundamentals 13 - 7

Oracle University Student Learning Subscription Use Only

Using a Subquery

•
•

•

Enclose subqueries in parentheses.
Place subqueries on the right side of the comparison condition for
readability. (However, the subquery can appear on either side of the
comparison operator.)
Use single-row operators with single-row subqueries and multiple-row
operators with multiple-row subqueries.

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

•
•
•

A subquery must be enclosed in parentheses.
Place the subquery on the right side of the comparison condition for readability. However, the
subquery can appear on either side of the comparison operator.
Two classes of comparison conditions are used in subqueries: single-row operators and
multiple-row operators.

SQL Fundamentals 13 - 8

Oracle University Student Learning Subscription Use Only

Rules and Guidelines for Using Subqueries

Types of Subqueries
Single-row subquery
Main query
Subquery

•

Returns

ST_CLERK

Multiple-row subquery
Main query
Subquery

Returns

ST_CLERK
SA_MAN

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

•
•

Single-row subqueries: Queries that return only one row from the inner SELECT statement
Multiple-row subqueries: Queries that return more than one row from the inner SELECT
statement

Note: There are also multiple-column subqueries, which are queries that return more than one
column from the inner SELECT statement. This is not covered in this lesson. For more information,
refer to the Oracle Database SQL Language Reference for 12c database.

SQL Fundamentals 13 - 9

Oracle University Student Learning Subscription Use Only

•

•
•

Subquery: Types, syntax, and guidelines
Single-row subqueries:
–
–

•

Multiple-row subqueries
–

•
•

Group functions in a subquery
HAVING clause with subqueries
Using ALL or ANY operator

Multiple-column subqueries
Null values in a subquery

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

SQL Fundamentals 13 - 10

Oracle University Student Learning Subscription Use Only

Lesson Agenda

•
•

Return only one row
Use single-row comparison operators
Operator

Meaning

=

Equal to

>

Greater than

>=

Greater than or equal to

<

Less than

<=

Less than or equal to

<>

Not equal to

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

A single-row subquery is one that returns one row from the inner SELECT statement. This type of
subquery uses a single-row operator. The slide gives a list of single-row operators.

SQL Fundamentals 13 - 11

Oracle University Student Learning Subscription Use Only

Single-Row Subqueries

Single-Row Subqueries: Example

SELECT last_name, job_id
FROM
employees
ST_CLERK
WHERE job_id =
(SELECT job_id
FROM
employees
WHERE employee_id = 141);

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

The example query uses the equal to (=) operator . The subquery returns the job_id of the employee
141. The main query displays the employees who have the same job_id.

SQL Fundamentals 13 - 12

Oracle University Student Learning Subscription Use Only

Display the employees whose job ID is the same as that of employee 141.

SELECT last_name, job_id, salary
FROM
employees
SA_REP
WHERE job_id =
(SELECT job_id
FROM
employees
WHERE last_name = 'Taylor')
AND

salary >

8600
(SELECT salary
FROM
employees
WHERE last_name = 'Taylor');

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

A SELECT statement can be considered as a query block. The example in the slide displays
employees who do the same job as “Taylor,” but earn more salary than him.
The example consists of three query blocks: the outer query and two inner queries. The inner query
blocks are executed first, producing the query results SA_REP and 8600, respectively. The outer
query block is then processed and uses the values that were returned by the inner queries to
complete its search conditions.
Both inner queries return single values (SA_REP and 8600, respectively), so this SQL statement is
called a single-row subquery.
Note: The outer and inner queries can get data from different tables.

SQL Fundamentals 13 - 13

Oracle University Student Learning Subscription Use Only

Executing Single-Row Subqueries

SELECT last_name, job_id, salary
FROM
employees
WHERE salary =
2500
(SELECT MIN(salary)
FROM
employees);

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

You can display data from a main query by using a group function in a subquery to return a single
row. The subquery is in parentheses and is placed after the comparison condition.
The example in the slide displays the employee last name, job ID, and salary of all employees whose
salary is equal to the minimum salary. The MIN group function returns a single value (2500) to the
outer query.

SQL Fundamentals 13 - 14

Oracle University Student Learning Subscription Use Only

Using Group Functions in a Subquery

HAVING Clause with Subqueries
The Oracle server executes the subqueries first.
The Oracle server returns results into the HAVING clause of the main query.
SELECT
FROM
GROUP BY
HAVING

department_id, MIN(salary)
employees
department_id
4200
MIN(salary) >
(SELECT MIN(salary)
FROM
employees
WHERE department_id = 60);

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

You can use subqueries not only in the WHERE clause, but also in the HAVING clause. The Oracle
server executes the subquery and the results are returned into the HAVING clause of the main query.
The SQL statement in the slide displays all the departments that have a minimum salary greater than
that of department 60.
Example
Find the job with the lowest average salary.
SELECT
job_id, AVG(salary)
FROM
employees
GROUP BY job_id
HAVING
AVG(salary) = (SELECT
MIN(AVG(salary))
FROM
employees
GROUP BY job_id);

SQL Fundamentals 13 - 15

Oracle University Student Learning Subscription Use Only

•
•

SELECT employee_id, last_name
FROM
employees
WHERE salary =
(SELECT
MIN(salary)
FROM
employees
GROUP BY department_id);
Single-row operator with
multiple-row subquery
To correct this error, change the
= operator to IN.

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

A common error with subqueries occurs when more than one row is returned for a single-row
subquery.
In the SQL statement in the slide, the subquery contains a GROUP BY clause, which implies that the
subquery will return multiple rows, one for each group that it finds. In this case, the results of the
subquery are 4400, 6000, 2500, 4200, 7000, 17000, and 8300.
The outer query takes those results and uses them in its WHERE clause. The WHERE clause contains
an equal (=) operator, a single-row comparison operator that expects only one value. The = operator
cannot accept more than one value from the subquery and, therefore, generates the error.
To correct this error, change the = operator to IN.

SQL Fundamentals 13 - 16

Oracle University Student Learning Subscription Use Only

What Is Wrong with This Statement?

SELECT last_name, job_id
FROM
employees
WHERE job_id =
(SELECT job_id
FROM
employees
WHERE last_name = 'Haas');
The subquery returns no rows
because there is no employee
named “Haas.”

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Another common problem with subqueries occurs when no rows are returned by the inner query.
In the SQL statement in the slide, the subquery contains a WHERE clause. Presumably, the intention
is to find the employee whose name is Haas. The statement is correct, but it selects no rows when
executed because there is no employee named Haas. Therefore, the subquery returns no rows.
The outer query takes the results of the subquery (null) and uses these results in its WHERE clause.
The outer query finds no employee with a job ID equal to NULL, and so returns no rows. If a job
existed with a value of null, the row is not returned because comparison of two null values yields a
null; therefore, the WHERE condition is not true.

SQL Fundamentals 13 - 17

Oracle University Student Learning Subscription Use Only

No Rows Returned by the Inner Query

•
•

Subquery: Types, syntax, and guidelines
Single-row subqueries:
–
–

•

Multiple-row subqueries
–

•
•

Group functions in a subquery
HAVING clause with subqueries
Use IN, ALL, or ANY

Multiple-column subqueries
Null values in a subquery

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

SQL Fundamentals 13 - 18

Oracle University Student Learning Subscription Use Only

Lesson Agenda

•
•

Return more than one row
Use multiple-row comparison operators
Operator

Meaning

IN

Equal to any member in the list

ANY

Must be preceded by =, !=, >, <, <=, >=. It returns
TRUE if at least one element exists in the result set of the
subquery for which the relation is TRUE.

ALL

Must be preceded by =, !=, >, <, <=, >=. It returns
TRUE if the relation is TRUE for all elements in the result set
of the subquery.

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Subqueries that return more than one row are called multiple-row subqueries. You use a multiple-row
operator, instead of a single-row operator, with a multiple-row subquery. The multiple-row operator
expects one or more values.

SQL Fundamentals 13 - 19

Oracle University Student Learning Subscription Use Only

Multiple-Row Subqueries

Using the IN Operator in Multiple-Row Subqueries
department_id

MIN(salary)
employees
department_id);

The main query appears to the Oracle server as shown below:
SELECT last_name, salary, department_id
FROM
employees
WHERE salary IN
(2500, 4200, 4400, 6000, 7000,
8300, 8600, 17000);

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

The example finds the employees who earn the same salary as the minimum salary for each
department.
The inner query is executed first, producing a query result. The main query block is then processed
and uses the values that were returned by the inner query to complete its search condition.

SQL Fundamentals 13 - 20

Oracle University Student Learning Subscription Use Only

SELECT last_name, salary,
FROM
employees
WHERE salary IN
(SELECT
FROM
GROUP BY

SELECT employee_id, last_name, job_id, salary
FROM
employees
9000, 6000, 4200
WHERE salary < ANY
(SELECT salary
FROM
employees
WHERE job_id = 'IT_PROG')
AND
job_id <> 'IT_PROG';

…

Displays employees who are
not IT programmers and
whose salary is less than that
of any IT programmer

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

The ANY operator (and its synonym, the SOME operator) compares a value to each value returned by
a subquery. The slide example displays employees who are not IT programmers and whose salary is
less than that of any IT programmer. The maximum salary that a programmer earns is $9,000.
• ANY means more than the minimum.
• =ANY is equivalent to IN.

SQL Fundamentals 13 - 21

Oracle University Student Learning Subscription Use Only

Using the ANY Operator in Multiple-Row Subqueries

SELECT employee_id, last_name, job_id, salary
FROM
employees
9000, 6000, 4200
WHERE salary < ALL
(SELECT salary
FROM
employees
WHERE job_id = 'IT_PROG')
AND
job_id <> 'IT_PROG';

Displays employees who are not IT
programmers and whose salary is
less than all the IT programmers

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

The ALL operator compares a value to every value returned by a subquery. The example in the slide
displays employees whose salary is less than the salary of all employees with a job ID of IT_PROG
and whose job is not IT_PROG.
>ALL means more than the maximum and  ALL.
Notice that the null value as part of the results set of a subquery is not a problem if you use the IN
operator. The IN operator is equivalent to =ANY. For example, to display the employees who have
subordinates, use the following SQL statement:
SELECT emp.last_name
FROM
employees emp
WHERE emp.employee_id IN
(SELECT mgr.manager_id
FROM
employees mgr);
Alternatively, a WHERE clause can be included in the subquery to display all employees who do not
have any subordinates:
SELECT last_name FROM employees
WHERE employee_id NOT IN
(SELECT manager_id
FROM
employees
WHERE manager_id IS NOT NULL);
SQL Fundamentals 13 - 27

Oracle University Student Learning Subscription Use Only

Null Values in a Subquery

Using a subquery is equivalent to performing two sequential queries and using
the result of the first query as the search values in the second query.
a. True
b. False

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Answer: a

SQL Fundamentals 13 - 28

Oracle University Student Learning Subscription Use Only

Q

Quiz

In which of the following clauses of the SELECT statement can a subquery be
nested?
a. WHERE clause
b. HAVING clause
c. FROM clause
d. ORDER BY clause

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Answer: a, b, c

SQL Fundamentals 13 - 29

Oracle University Student Learning Subscription Use Only

Q

Quiz

Identify the multiple-row operators.
a. IN
b. ANY
c. ALL
d. <>

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Answer: a, b, c

SQL Fundamentals 13 - 30

Oracle University Student Learning Subscription Use Only

Q

Quiz

If a single-row subquery returns a null value to the equal to (=) operator, the
main query does not return any rows because comparison of two null values
yields a null.
a. True
b. False

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Answer: a

SQL Fundamentals 13 - 31

Oracle University Student Learning Subscription Use Only

Q

Quiz

In this lesson, you should have learned how to:
• Define subqueries
• Identify the types of problems that the subqueries can solve
• Write single-row, multiple-row, multiple-column subqueries

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

In this lesson, you should have learned how to use subqueries. A subquery is a SELECT statement
that is embedded in the clause of another SQL statement. Subqueries are useful when a query is
based on a search criterion with unknown intermediate values.
Subqueries have the following characteristics:
• Can pass one row of data to a main statement that contains a single-row operator, such as =,
<>, >, >=, <, or <=
•
•
•

Can pass multiple rows of data to a main statement that contains a multiple-row operator, such
as IN
Are processed first by the Oracle server, after which the WHERE or HAVING clause uses the
results
Can contain group functions

SQL Fundamentals 13 - 32

Oracle University Student Learning Subscription Use Only

Summary

This practice covers the following topics:
• Creating subqueries to query values based on unknown criteria
• Using subqueries to find out the values that exist in one set of data and not
in another

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

In this practice, you write simple queries using nested SELECT statements.
For practice questions, you may want to create the inner query first. Make sure that it runs and
produces the data that you anticipate before you code the outer query.

SQL Fundamentals 13 - 33

Oracle University Student Learning Subscription Use Only

Practice 13: Overview

Oracle University Student Learning Subscription Use Only

Lesson 14: Introduction to Data
Manipulation Language

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Oracle University Student Learning Subscription Use Only

14

Course Roadmap
Lesson 1: Course Overview

You are here

Unit 2: Retrieving and Sorting Data
Unit 3: Joins, Subqueries, and Set
Operators

Lesson 14: Introduction to Data
Manipulation Language

Unit 4: DML and DDL

Lesson 15: Introduction to Data Definition
Language

Unit 5: Managing Relational Database
Lesson 16: Managing Tables using DML
Statements
Unit 6: Advance Queries and Database
Management System

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

In Unit 4, you will learn about Data Manipulation Language (DML) and Data Definition Language
(DDL). Using DML statements, you will learn to update and manage data in the tables. Using DDL
statements, you will learn to create tables, remove tables, and so on.

SQL Fundamentals 14 - 2

Oracle University Student Learning Subscription Use Only

Unit 1: Relational Database and SQL
Overview

After completing this lesson, you should be able to:
• Describe each data manipulation language (DML) statement
• Control database transactions by using the COMMIT, SAVEPOINT, and
ROLLBACK statements

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

In this lesson, you learn how to use DML statements to insert rows into a table, update existing rows
in a table, and delete existing rows from a table. You also learn how to control database transactions
with the COMMIT, SAVEPOINT, and ROLLBACK statements.

SQL Fundamentals 14 - 3

Oracle University Student Learning Subscription Use Only

Objectives

Lesson Agenda
Adding new rows in a table
–

•

Changing data in a table
–

•

INSERT statement
UPDATE statement

Removing rows from a table
–
–

DELETE statement
TRUNCATE statement

•

Database transaction control using COMMIT, ROLLBACK,
and SAVEPOINT

•

Read Consistency

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

SQL Fundamentals 14 - 4

Oracle University Student Learning Subscription Use Only

•

DML
You write and execute a DML statement for:
–
–
–

•

Adding new rows to a table
Modifying existing rows in a table
Removing existing rows from a table

A transaction consists of a collection of DML
statements that forms a logical unit of work.

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

DML is a core part of SQL. When you want to add, update, or delete data in the database, you
execute a DML statement. A collection of DML statements that forms a logical unit of work is called a
transaction.
Consider a banking database. When a bank customer transfers money from a savings account to a
checking account, the transaction might consist of three separate operations: decreasing the savings
account, increasing the checking account, and recording the transaction in the transaction journal.
The Oracle server must guarantee that all the three SQL statements are performed to maintain the
accounts in proper balance. When something prevents one of the statements in the transaction from
executing, the other statements of the transaction must be undone.
Note
• Most of the DML statements in this lesson assume that no constraints on the table are violated.
Constraints are discussed later in this course.
• In SQL Developer, click the Run Script icon or press [F5] to run the DML statements. The
feedback messages will be shown in the Script Output pane.

SQL Fundamentals 14 - 5

Oracle University Student Learning Subscription Use Only

•

Adding a New Row to a Table

Insert a new row into the
DEPARTMENTS table.

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

SQL Fundamentals 14 - 6

Oracle University Student Learning Subscription Use Only

New row

DEPARTMENTS

INSERT Statement Syntax
Add new rows to a table by using the INSERT statement:
Names of the
columns to populate
INSERT INTO
VALUES

Name of the table
(should already exist)

table [(column [, column...])]
(value [, value...]);

Corresponding values for
the columns
With this syntax, only one row is inserted at a time.

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

You can add new rows to a table by issuing the INSERT statement. The syntax is explained in the
slide. The table should already exist before you run the INSERT statement to insert rows in it.
Note: This statement with the VALUES clause adds only one row at a time to a table.

SQL Fundamentals 14 - 7

Oracle University Student Learning Subscription Use Only

•

•
•
•

Insert a new row containing values for each column.
List values in the default order of the columns in the table.
Optionally, list the columns in the INSERT clause.
INSERT INTO departments(department_id,
department_name, manager_id, location_id)
VALUES (70, 'Public Relations', 100, 1700);

•

Enclose character and date values within single quotation marks.

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Because you can insert a new row that contains values for each column, the column list is not
required in the INSERT clause. However, if you do not use the column list, the values must be listed
according to the default order of the columns in the table, and a value must be provided for each
column. To view the column order of the table, use the following command:
DESCRIBE departments
For clarity, use the column list in the INSERT clause.
Enclose character and date values within single quotation marks; however, it is not recommended
that you enclose numeric values within single quotation marks.

SQL Fundamentals 14 - 8

Oracle University Student Learning Subscription Use Only

Inserting New Rows

Inserting Rows with Null Values
Implicit method: Omit the column from the column list.
INSERT INTO
VALUES

•

departments (department_id,
department_name)
(30, 'Purchasing');

Explicit method: Specify the NULL keyword in the VALUES clause. Or enter
empty string ('') in the VALUES list for character strings and dates.
INSERT INTO
VALUES

departments
(100, 'Finance', NULL, NULL);

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Be sure that you can use null values in the targeted column by verifying the Null status with the
DESCRIBE command.
The Oracle server automatically enforces all data types, data ranges, and data integrity constraints.
Any column that is not listed explicitly obtains a null value in the new row, unless you have default
values for the missing columns that are used.
Common errors that can occur during user input are checked in the following order:
• Mandatory value missing for a NOT NULL column
• Duplicate value violating any unique or primary key constraint
• Any value violating a CHECK constraint
• Referential integrity maintained for foreign key constraint
• Data type mismatches or values too wide to fit in a column
Note: Use of the column list is recommended because it makes the INSERT statement more
readable and reliable, and less prone to mistakes.

SQL Fundamentals 14 - 9

Oracle University Student Learning Subscription Use Only

•

•
•

The SYSDATE function records the current date and time.
The CURRENT_DATE function records the current date in the session time
zone.
INSERT INTO employees (employee_id,
first_name, last_name,
email, phone_number,
hire_date, job_id, salary,
commission_pct, manager_id,
department_id)
VALUES
(113,
'Louis', 'Popp',
'LPOPP', '515.124.4567',
CURRENT_DATE, 'AC_ACCOUNT', 6900,
NULL, 205, 110);

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

You can use functions to enter special values in your table.
The slide example records information for employee Popp in the EMPLOYEES table. It supplies the
current date and time in the HIRE_DATE column. It uses the CURRENT_DATE function that returns the
current date in the session time zone (if you use SYSDATE, it records the current date and time set
at the database server). You can also use the USER function when inserting rows in a table. The
USER function records the current username.
Confirming Additions to the Table
SELECT employee_id, last_name, job_id, hire_date, commission_pct
FROM
employees
WHERE employee_id = 113;

SQL Fundamentals 14 - 10

Oracle University Student Learning Subscription Use Only

Inserting Special Values

Inserting Specific Date and Time Values
Add a new employee.
INSERT INTO employees
VALUES
(114,
'Den', 'Raphealy',
'DRAPHEAL', '515.127.4561',
TO_DATE('FEB 3, 2012', 'MON DD, YYYY'),
'SA_REP', 11000, 0.2, 100, 60);

•

Verify your addition.

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

The DD-MON-RR format is generally used to insert a date value. With the RR format, the system
provides the correct century automatically.
You may also supply the date value in the DD-MON-YYYY or in the MON DD, YYYY format. This is
recommended because it clearly specifies the century and does not depend on the internal RR format
logic of specifying the correct century.
If a date must be entered in a format other than the default format (for example, with another century
or a specific time), you must use the TO_DATE function.
The example in the slide records information for employee Raphealy in the EMPLOYEES table. It sets
the HIRE_DATE column to be February 3, 2012.

SQL Fundamentals 14 - 11

Oracle University Student Learning Subscription Use Only

•

Creating a Script
Use the & substitution in a SQL statement to prompt for values.
& is a placeholder for the variable value.
INSERT INTO departments
(department_id, department_name, location_id)
VALUES
(&department_id, '&department_name',&location);

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

You can save commands with substitution variables to a file and execute the commands in the file.
The example in the slide records information for a department in the DEPARTMENTS table.
Run the script file and you are prompted for input for each of the ampersand (&) substitution
variables. After entering a value for the substitution variable, click the OK button. The values that you
input are then substituted into the statement. This enables you to run the same script file over and
over, but supply a different set of values each time you run it.

SQL Fundamentals 14 - 12

Oracle University Student Learning Subscription Use Only

•
•

Copying Rows from Another Table
To add rows derived from an existing table:
INSERT INTO table [ column (, column) ] subquery;
Name of the
table

•

Columns to
populate data

Subquery that
returns rows to
the table

To create a copy of all the rows of a table:
INSERT INTO copy_emp
SELECT *
FROM EMPLOYEES;

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

You can use the INSERT statement to add rows to a table where the values are derived from existing
tables.
In place of the VALUES clause, use a subquery. Zero or more rows are added depending on the
number of rows returned by the subquery.
In the example, the copy_emp table must have been created before running the INSERT statement.

SQL Fundamentals 14 - 13

Oracle University Student Learning Subscription Use Only

•

Copying Rows from Another Table
INSERT statement with a subquery:
INSERT INTO sales_reps(id, name, salary, commission_pct)
SELECT employee_id, last_name, salary, commission_pct
FROM
employees
WHERE job_id LIKE '%REP%';

•
•
•

Do not use the VALUES clause.
Match the number of columns and their data types in the INSERT clause to
those in the subquery.
Inserts all the rows returned by the subquery in the sales_reps table.

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

In the example in the slide, for the INSERT INTO statement to work, you must have already created
the sales_reps table using the CREATE TABLE statement. CREATE TABLE is discussed in the next
lesson titled “Introduction to Data Definition Language.”
Note that in this INSERT statement, you do not use the VALUES clause. Instead, you add a subquery.
The number of columns and their data types in the column list of the INSERT clause must match the
number of values and their data types in the subquery. Zero or more rows are added depending on
the number of rows returned by the subquery.

SQL Fundamentals 14 - 14

Oracle University Student Learning Subscription Use Only

•

Lesson Agenda
Adding new rows in a table
–

•

Changing data in a table
–

•

INSERT statement
UPDATE statement

Removing rows from a table
–
–

DELETE statement
TRUNCATE statement

•

Database transaction control using COMMIT, ROLLBACK,
and SAVEPOINT

•

Read Consistency

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

SQL Fundamentals 14 - 15

Oracle University Student Learning Subscription Use Only

•

Changing Data in a Table

Change the department number for employees in department 60 to department 80.

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

SQL Fundamentals 14 - 16

Oracle University Student Learning Subscription Use Only

EMPLOYEES

UPDATE Statement Syntax
Modify existing values in a table with the UPDATE statement:
Table in which you want
to make changes
UPDATE
SET
[WHERE
Column that needs
to be updated

Value to change to

table
column = value [, column = value, ...]
condition];
Identifies the rows to be updated and is composed of
column names, expressions, constants, subqueries, and
comparison operators

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

You can modify the existing values in a table by using the UPDATE statement. You can update more
than one row at a time (if required). You specify a condition to identify the rows to be updated.
The condition is composed of column names, expressions, constants, subqueries, and
comparison operators.
Confirm the update operation by querying the table to display the updated rows.
For more information, see the section on “UPDATE” in Oracle Database SQL Language Reference for
12c database.
Note: In general, use the primary key column in the WHERE clause to identify a single row for update.
Using other columns can unexpectedly cause several rows to be updated. For example, identifying a
single row in the EMPLOYEES table by name may return more than one employee having the same
name.

SQL Fundamentals 14 - 17

Oracle University Student Learning Subscription Use Only

•

Updating Rows in a Table
Values for a specific row or rows are modified if you specify the WHERE
clause:
UPDATE employees
SET
department_id = 50
WHERE employee_id = 113;

•

Values for all the rows in the table are modified if you omit the WHERE
clause:
UPDATE
SET

copy_emp
department_id = 110;

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

The UPDATE statement modifies the values of a specific row or rows if the WHERE clause is specified.
The example in the slide shows the transfer of employee 113 (Popp) to department 50.
If you omit the WHERE clause, values for all the rows in the table are modified. Examine the updated
rows in the COPY_EMP table.
SELECT last_name, department_id
FROM
copy_emp;
Note: The COPY_EMP table has the same data as the EMPLOYEES table.

SQL Fundamentals 14 - 18

Oracle University Student Learning Subscription Use Only

•

Updating Rows in a Table
Specify SET column_name = NULL to update a column value to NULL.

UPDATE employees
SET
job_id = 'IT_PROG', commission_pct = NULL
WHERE employee_id = 114;

Employee 114 ‘s JOB_ID is updated to IT_PROG and the
commission field is set to NULL.

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

The slide example shows how you can update multiple columns for a single record and also shows
how you can set NULL value for a column.

SQL Fundamentals 14 - 19

Oracle University Student Learning Subscription Use Only

•

Updating Two Columns with a Subquery

UPDATE
SET

employees
(job_id,salary)

WHERE

employee_id

= (SELECT
FROM
WHERE
= 103;

job_id,salary
employees
employee_id = 205)

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

You can update multiple columns in the SET clause of an UPDATE statement by writing multiple
subqueries. The syntax is as follows:
UPDATE table
SET
column =
(SELECT column
FROM table
WHERE condition)
[ ,
column =
(SELECT column
FROM table
WHERE condition)]
[WHERE condition ] ;

SQL Fundamentals 14 - 20

Oracle University Student Learning Subscription Use Only

Update employee 103’s job and salary to match those of employee 205.

Updating Rows Based on Another Table

UPDATE
SET

copy_emp
department_id

=

WHERE

job_id

=

(SELECT department_id
FROM employees
WHERE employee_id = 100)
(SELECT job_id
FROM employees
WHERE employee_id = 200);

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

You can use subqueries in the UPDATE statements to update values in a table. The example in the
slide updates the COPY_EMP table based on the values from the EMPLOYEES table. It changes the
department number of all employees with employee 200’s job ID to employee 100’s current
department number.

SQL Fundamentals 14 - 21

Oracle University Student Learning Subscription Use Only

Use the subqueries in the UPDATE statements to update row values in a table
based on values from another table:

Lesson Agenda
Adding new rows in a table
–

•

Changing data in a table
–

•

INSERT statement
UPDATE statement

Removing rows from a table
–
–

DELETE statement
TRUNCATE statement

•

Database transaction control using COMMIT, ROLLBACK,
and SAVEPOINT

•

Read Consistency

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

SQL Fundamentals 14 - 22

Oracle University Student Learning Subscription Use Only

•

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

The Contracting department has been removed from the DEPARTMENTS table (assuming no
constraints on the DEPARTMENTS table are violated), as shown by the graphic in the slide.

SQL Fundamentals 14 - 23

Oracle University Student Learning Subscription Use Only

Removing a Row from a Table

DELETE Statement

DELETE [FROM] table
[WHERE
condition];
Identifies the rows to be deleted using column
names, expressions, constants, subqueries, and
comparison operators

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

You can remove existing rows from a table by using the DELETE statement.
Note: If no rows are deleted, the message “0 rows deleted” is returned (in the Script Output pane in
SQL Developer).
For more information, see the section on “DELETE” in Oracle Database SQL Language Reference for
12c database.

SQL Fundamentals 14 - 24

Oracle University Student Learning Subscription Use Only

You can remove existing rows from a table by using the DELETE statement:

Deleting Rows from a Table
Specific rows are deleted if you specify the WHERE clause:
DELETE FROM departments
WHERE department_name = 'Finance';

•

All rows in the table are deleted if you omit the WHERE clause:
DELETE FROM

copy_emp;

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

You can delete specific rows by specifying the WHERE clause in the DELETE statement. The first
example in the slide deletes the Finance department from the DEPARTMENTS table. You can confirm
the delete operation by displaying the deleted rows using the SELECT statement.
SELECT *
FROM
departments
WHERE
department_name = 'Finance';
However, if you omit the WHERE clause, all rows in the table are deleted. The second example in the
slide deletes all rows from the COPY_EMP table, because no WHERE clause was specified.
Example
Remove rows identified in the WHERE clause.
DELETE FROM employees WHERE employee_id = 114;
DELETE FROM

departments WHERE department_id IN (30, 40);

SQL Fundamentals 14 - 25

Oracle University Student Learning Subscription Use Only

•

Deleting Rows Based on Another Table

DELETE FROM employees
WHERE department_id IN
(SELECT department_id
FROM
departments
WHERE department_name
LIKE '%Public%');

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

You can use the subqueries to delete rows from a table based on values from another table. The
example in the slide deletes all the employees in a department, where the department name contains
the string Public.
The subquery searches the DEPARTMENTS table to find the department number based on the
department name containing the string Public. The subquery then feeds the department number to
the main query, which deletes rows of data from the EMPLOYEES table based on this department
number.

SQL Fundamentals 14 - 26

Oracle University Student Learning Subscription Use Only

Use the subqueries in the DELETE statements to remove rows from a table
based on values from another table:

•
•
•

Removes all rows from a table, leaving the table empty and the table
structure intact
Is a data definition language (DDL) statement rather than a DML statement;
cannot easily be undone
Syntax:
TRUNCATE TABLE table_name;

•

Example:
TRUNCATE TABLE copy_emp;

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

A more efficient method of emptying a table is by using the TRUNCATE statement.
You can use the TRUNCATE statement to quickly remove all rows from a table or cluster. Removing
rows with the TRUNCATE statement is faster than removing them with the DELETE statement because
the TRUNCATE statement is a DDL statement and generates no rollback information. Rollback
information is covered later in this lesson.
If the table is the parent of a referential integrity constraint, you cannot truncate the table. You need to
disable the constraint before issuing the TRUNCATE statement. Disabling constraints is covered in the
lesson titled “Introduction to DDL Statements.”

SQL Fundamentals 14 - 27

Oracle University Student Learning Subscription Use Only

TRUNCATE Statement

Lesson Agenda
Adding new rows in a table
–

•

Changing data in a table
–

•

INSERT statement
UPDATE statement

Removing rows from a table
–
–

DELETE statement
TRUNCATE statement

•

Database transaction control using COMMIT, ROLLBACK,
and SAVEPOINT

•

Read Consistency

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

SQL Fundamentals 14 - 28

Oracle University Student Learning Subscription Use Only

•

Withdraw cash.
If the ATM machine dispenses the cash, debit the account; commit it.
If it fails to dispense the cash, roll back the debit account transaction.

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

The Oracle server ensures data consistency based on transactions. Transactions give you more
flexibility and control when changing data, and they ensure data consistency in the event of user
process failure or system failure.
Transactions consist of DML statements that constitute one consistent change to the data. For
example, a transfer of funds between two accounts should include the debit in one account and the
credit to another account of the same amount. Both actions should either fail or succeed together; the
credit should not be committed without the debit.

SQL Fundamentals 14 - 29

Oracle University Student Learning Subscription Use Only

Database Transaction: Example

Database Transactions

Type of transaction

Description

DML

Consists of any number of DML
statements that the Oracle server treats
as a single entity or a logical unit of work

DDL

Consists of only one DDL statement

Data control language (DCL)

Consists of only one DCL statement

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

The table lists the three types of database transactions. A DML database transaction is a set of DML
operations that form a logical unit of work. A DDL database transaction consists of only one
statement because when a DDL statement is executed, it is automatically committed as a single
transaction. A DCL database transaction consists of creating users, roles, and privileges.

SQL Fundamentals 14 - 30

Oracle University Student Learning Subscription Use Only

A database transaction can be of the following types:

•
•

Begin when the first DML SQL statement is executed.
End with one of the following events:
–

A COMMIT or ROLLBACK statement is issued.

–
–
–

A DDL or DCL statement executes (automatic commit).
The user exits SQL Developer or SQL*Plus.
The system crashes.

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

When does a database transaction start and end?
A transaction begins when the first DML statement is encountered and ends when one of the
following occurs:
• A COMMIT or ROLLBACK statement is issued.
• A DDL statement, such as CREATE, is issued.
•
•
•

A DCL statement is issued.
The user exits SQL Developer or SQL*Plus.
The machine fails or the system crashes.

After one transaction ends, the next executable SQL statement automatically starts the next
transaction.
A DDL statement or a DCL statement is automatically committed and, therefore, implicitly ends a
transaction.

SQL Fundamentals 14 - 31

Oracle University Student Learning Subscription Use Only

Database Transactions: Start and End

Advantages of COMMIT and ROLLBACK Statements

•
•
•

Ensure data consistency
Preview data changes before making the changes permanent
Group logically related operations
COMMIT

End your current transaction and make permanent all
changes performed in the transaction

ROLLBACK

Undo work done in the current transaction

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

With the COMMIT and ROLLBACK statements, you have control over making changes to the data
permanent.
•
COMMIT ends the current transaction by making all pending data changes permanent.
•
ROLLBACK ends the current transaction by discarding all pending data changes.

SQL Fundamentals 14 - 32

Oracle University Student Learning Subscription Use Only

With COMMIT and ROLLBACK statements, you can:

Explicit Transaction Control Statements

SAVEPOINT name

SAVEPOINT name marks a savepoint within the current
transaction.

ROLLBACK TO
SAVEPOINT name

ROLLBACK TO  rolls back the current
transaction to the specified savepoint.

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

You can control the logic of transactions by using the COMMIT, SAVEPOINT, and ROLLBACK
statements. A SAVEPOINT identifies a point in a transaction to which you can later roll back.
SAVEPOINT name marks a savepoint within the current transaction.
ROLLBACK TO  rolls back the current transaction to the specified savepoint, thereby
discarding any changes and/or savepoints that were created after the savepoint to which you are
rolling back.
If you omit the TO SAVEPOINT clause, the ROLLBACK statement rolls back the entire transaction.
Because savepoints are logical, there is no way to list the savepoints that you have created.
Note: You cannot COMMIT to a SAVEPOINT. SAVEPOINT is not ANSI-standard SQL.

SQL Fundamentals 14 - 33

Oracle University Student Learning Subscription Use Only

You can control the logic of transactions by using the COMMIT, SAVEPOINT, and
ROLLBACK statements.

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

You can control the logic of transactions by using the COMMIT, SAVEPOINT, and ROLLBACK
statements. After creating a SAVEPOINT A, if you performed an INSERT and an UPDATE, and then
realized you wanted to undo the change, you can roll back the transactions to SAVEPOINT A. If you
use only ROLLBACK, it will undo all the transactions up to the last COMMIT.

SQL Fundamentals 14 - 34

Oracle University Student Learning Subscription Use Only

Explicit Transaction Control Statements

•
•

Create a marker in the current transaction by using the SAVEPOINT
statement.
Roll back to that marker by using the ROLLBACK TO SAVEPOINT statement.
UPDATE...
SAVEPOINT update_done;
INSERT...
ROLLBACK TO update_done;

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

You can create a marker in the current transaction by using the SAVEPOINT statement, which divides
the transaction into smaller sections. You can discard the changes done after the SAVEPOINT marker
by using the ROLLBACK TO SAVEPOINT statement.
Note that if you create a second savepoint with the same name as an earlier savepoint, the earlier
savepoint is deleted.

SQL Fundamentals 14 - 35

Oracle University Student Learning Subscription Use Only

Rolling Back Changes to a Marker

Implicit Transaction Processing
An automatic commit occurs in the following circumstances:
–
–

•

A DDL statement is issued.
A DCL statement is issued.

An automatic rollback occurs when there is an abnormal termination of SQL
Developer or a system failure.

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

System Failures
When a transaction is interrupted by a system failure, the entire transaction is automatically rolled
back. This prevents the error from causing unwanted changes to the data and returns the tables to
the state at the time of the last commit. In this way, the Oracle server protects the integrity of the
tables.
In SQL Developer, a normal exit from the session is accomplished by selecting Exit from the File
menu. In SQL*Plus, a normal exit is accomplished by entering the EXIT command at the prompt.

SQL Fundamentals 14 - 36

Oracle University Student Learning Subscription Use Only

•

Setting AutoCommit in SQL Developer
Go to Tools > Preferences > Database
> Advanced.
–

•

•

Select the Autocommit check box.

If this option is selected, a commit
operation is automatically performed
after each DML statement executed
using the SQL Worksheet.
If this option is not selected, a commit
operation is not performed until you
execute a COMMIT statement.

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

To enable Autocommit, perform the following:
•
•

In the Tools menu, select Preferences. In the Preferences dialog box, expand Database and
select Advanced.
In the right pane, select the Autocommit check box. Click OK.

If this option is selected, a commit operation is automatically performed after each INSERT,
UPDATE, or DELETE statement executed using the SQL Worksheet. If this option is not selected, a
commit operation is not performed until you execute a COMMIT statement.
Note: In SQL*Plus, the AUTOCOMMIT command can be toggled ON or OFF. If set to ON, each
individual DML statement is committed as soon as it is executed. You cannot roll back the changes. If
set to OFF, the COMMIT statement can still be issued explicitly.

SQL Fundamentals 14 - 37

Oracle University Student Learning Subscription Use Only

•

•

When the Autocommit option is not selected (default) and you exit SQL
Developer by selecting File > Exit or by closing the window, the following
pop-up window appears:

•

You can decide to commit or roll back the changes.

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

When the Autocommit option is not selected (default) and you exit SQL Developer either by using the
File > Exit option or by closing the window, a pop-up window is displayed. It prompts you to select
either rollback or commit.
If the Autocommit option is selected, any DML operations are committed as soon as they are
executed, so this pop-up window does not show up when you exit SQL Developer.

SQL Fundamentals 14 - 38

Oracle University Student Learning Subscription Use Only

Commit/Rollback on Exiting SQL Developer

•
•
•
•

Data manipulation operations primarily affect the database buffer; therefore,
the previous state of the data can be recovered.
The current session can review the results of the DML operations by using
the SELECT statement.
Other sessions cannot view the results of the DML statements issued by the
current session.
The affected rows are locked; other session cannot change the data in the
affected rows.

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Every data change made during the transaction is temporary until the transaction is committed.
The state of the data before COMMIT or ROLLBACK statements are issued can be described as
follows:
• Data manipulation operations primarily affect the database buffer; therefore, the previous state
of the data can be recovered.
• The current session can review the results of the data manipulation operations by querying the
tables.
• Other sessions cannot view the results of the data manipulation operations made by the current
session. The Oracle server institutes read consistency to ensure that each session sees data as
it existed at the last commit.
• The affected rows are locked; other session cannot change the data in the affected rows.

SQL Fundamentals 14 - 39

Oracle University Student Learning Subscription Use Only

State of Data Before COMMIT or ROLLBACK

•
•
•
•
•

Data changes are saved in the database.
The previous state of the data is overwritten.
All sessions can view the results.
Locks on the affected rows are released; those rows are available for other
sessions to manipulate.
All savepoints are erased.

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Make all pending changes permanent by using the COMMIT statement. Here is what happens after a
COMMIT statement:
•
•
•
•
•

Data changes are written to the database.
The previous state of the data is no longer available with normal SQL queries.
All sessions can view the results of the transaction.
The locks on the affected rows are released; the rows are now available for other sessions to
perform new data changes.
All savepoints are erased.

SQL Fundamentals 14 - 40

Oracle University Student Learning Subscription Use Only

State of Data After COMMIT

COMMIT: Example
Make the changes:
DELETE FROM EMPLOYEES
WHERE employee_id=113;
INSERT INTO departments
VALUES (290, 'Corporate Tax', NULL, 1700);

•

Commit the changes:
COMMIT;

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

In the example in the slide, a row is deleted from the EMPLOYEES table and a new row is inserted into
the DEPARTMENTS table. The changes are saved by issuing the COMMIT statement.
Example
Remove departments 290 and 300 from the DEPARTMENTS table and update a row in the
EMPLOYEES table. Save the data change.
DELETE FROM departments
WHERE department_id IN (290, 300);
UPDATE employees
SET
department_id = 80
WHERE employee_id = 206;
COMMIT;

SQL Fundamentals 14 - 41

Oracle University Student Learning Subscription Use Only

•

State of Data After ROLLBACK

•
•
•

Data changes are undone.
Previous state of the data is restored.
Locks on the affected rows are released.

DELETE FROM copy_emp;
ROLLBACK ;

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Discard all pending changes by using the ROLLBACK statement, which results in the following:
•
•
•

Data changes are undone.
The previous state of the data is restored.
Locks on the affected rows are released.

SQL Fundamentals 14 - 42

Oracle University Student Learning Subscription Use Only

Discard all pending changes by using the ROLLBACK statement:

ROLLBACK: Example

ROLLBACK;
Rollback complete.
DELETE FROM test WHERE
1 row deleted.

id = 100;

SELECT * FROM
test WHERE
No rows selected.

id = 100;

COMMIT;
Commit complete.

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

While attempting to remove a record from the TEST table, you may accidentally empty the table.
However, you can correct the mistake, reissue a proper statement, and make the data change
permanent.

SQL Fundamentals 14 - 43

Oracle University Student Learning Subscription Use Only

DELETE FROM test;
4 rows deleted.

•
•
•
•

If a single DML statement fails during execution, only that statement is rolled
back.
The Oracle server implements an implicit savepoint.
All other changes are retained.
The user should terminate transactions explicitly by executing a COMMIT or
ROLLBACK statement.

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

A part of a transaction can be discarded through an implicit rollback if a statement execution error is
detected. If a single DML statement fails during execution of a transaction, its effect is undone by a
statement-level rollback. Note that in such a case, the changes made by the previous DML
statements in the transaction are not discarded. They can be committed or rolled back explicitly by
the user.
The Oracle server issues an implicit commit before and after any DDL statement. So, even if your
DDL statement does not execute successfully, you cannot roll back the previous statement because
the server issued a commit.
Terminate your transactions explicitly by executing a COMMIT or ROLLBACK statement.

SQL Fundamentals 14 - 44

Oracle University Student Learning Subscription Use Only

Statement-Level Rollback

Lesson Agenda
Adding new rows in a table
–

•

Changing data in a table
–

•

INSERT statement
UPDATE statement

Removing rows from a table
–
–

DELETE statement
TRUNCATE statement

•

Database transaction control using COMMIT, ROLLBACK,
and SAVEPOINT

•

Read Consistency

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

SQL Fundamentals 14 - 45

Oracle University Student Learning Subscription Use Only

•

•
•
•

Read consistency guarantees a consistent view of the data at all times.
Changes made by one user do not conflict with the changes made by
another user.
Read consistency ensures that, on the same data:
–
–
–

•

Readers do not wait for writers
Writers do not wait for readers
Writers wait for writers

Read consistency is automatically implemented by:
–

Keeping a partial copy of the database in the undo segments.

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Database users access the database in two ways:
• Read operations (SELECT statement)
• Write operations (INSERT, UPDATE, DELETE statements)
You need read consistency so that the following occur:
• The database reader and writer are ensured a consistent view of the data.
• Readers do not view data that is in the process of being changed.
• Writers are ensured that the changes to the database are done in a consistent manner.
• Changes made by one writer do not disrupt or conflict with the changes being made by another
writer.
The purpose of read consistency is to ensure that each user sees data as it existed at the last
commit, before a DML operation started.
Note: The same user can log in to different sessions. Each session maintains read consistency in the
manner described above, even if they are the same users.

SQL Fundamentals 14 - 46

Oracle University Student Learning Subscription Use Only

Read Consistency

Read consistency is an automatic implementation. It keeps a partial copy of the database in the undo
segments. The read-consistent image is constructed from the committed data in the table and the old
data that is being changed and is not yet committed from the undo segment.

All readers, except the one who issued the change, see the database as it existed before the
changes started; they view the undo segment’s “snapshot” of the data.
Before the changes are committed to the database, only the user who is modifying the data sees the
database with the alterations. Everyone else sees the snapshot in the undo segment. This
guarantees that readers of the data read consistent data that is not currently undergoing change.
When a DML statement is committed, the change made to the database becomes visible to anyone
issuing a SELECT statement after the commit is done. The space occupied by the old data in the
undo segment file is freed for reuse.
If the transaction is rolled back, the changes are undone:
• The original, older version of the data in the undo segment is written back to the table.
• All users see the database as it existed before the transaction began.
FOR UPDATE clause in a SELECT statement
By default, Oracle implicitly (automatically) locks many data structures for you. However, you can
request specific data locks on rows or tables when you need to override default locking. Explicit
locking lets you share or deny access to a table for the duration of a transaction or ensure multitable
and multiquery read consistency.
When you issue a SELECT statement against the database to query some records, no locks are
placed on the selected rows. In general, this is required because the number of records locked at any
given time is (by default) kept to the absolute minimum: only those records that have been changed
but not yet committed are locked. Even then, others will be able to read those records as they
appeared before the change (the “before image” of the data). There are times, however, when you
may want to lock a set of records even before you change them in your program. Oracle offers the
FOR UPDATE clause of the SELECT statement to perform this locking. This is mainly useful when you
are selecting rows within a PL/SQL code.
When you issue a SELECT...FOR UPDATE statement, the relational database management system
(RDBMS) automatically obtains exclusive row-level locks on all the rows identified by the SELECT
statement, thereby holding the records “for your changes only.” No one else will be able to change
any of these records until you perform a ROLLBACK or a COMMIT.
You can append the optional keyword NOWAIT to the FOR UPDATE clause to tell the Oracle server not
to wait if the table has been locked by another user. In this case, control will be returned immediately
to your program or to your SQL Developer environment so that you can perform other work, or simply
wait for a period of time before trying again. Without the NOWAIT clause, your process will block until
the table is available, when the locks are released by the other user through the issue of a COMMIT or
a ROLLBACK command.

SQL Fundamentals 14 - 47

Oracle University Student Learning Subscription Use Only

When an insert, update, or delete operation is made on the database, the Oracle server takes a copy
of the data before it is changed and writes it to an undo segment.

Which of the following steps do you need to perform to copy rows from an
existing table to a new table?
a. In place of the VALUES clause, you write a subquery.
b. Make sure the table is already created.
c. Match the number of columns and their data types in the INSERT clause to
those in the subquery.
d. Use * if you want to copy all the rows.
e. All of the above.

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Answer: e

SQL Fundamentals 14 - 48

Oracle University Student Learning Subscription Use Only

Q

Quiz

Q

Quiz

DELETE FROM copy_emp;
TRUNCATE TABLE copy_emp;

a. True
b. False

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Answer: b

SQL Fundamentals 14 - 49

Oracle University Student Learning Subscription Use Only

The following statements produce the same results:

Which two of the following statements, when executed, lead to an implicit
COMMIT?
a. CREATE TABLE statement
b. CREATE USER statement
c. INSERT statement
d. UPDATE statement

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Answer: a, b

SQL Fundamentals 14 - 50

Oracle University Student Learning Subscription Use Only

Q

Quiz

To enable Autocommit, you should go to Tools > Preferences > Database >
Advanced, and select the Autocommit check box.
a. True
b. False

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Answer: a

SQL Fundamentals 14 - 51

Oracle University Student Learning Subscription Use Only

Q

Quiz

Summary
In this lesson, you should have learned how to use the following statements:
Description

INSERT

Adds a new row to the table

UPDATE

Modifies existing rows in the table

DELETE

Removes existing rows from the table

TRUNCATE

Removes all rows from the table

COMMIT

Makes all pending changes permanent

SAVEPOINT

Rolls back the changes to the savepoint

ROLLBACK

Discards all pending data changes

FOR UPDATE clause in SELECT

Locks rows identified by the SELECT query

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

In this lesson, you should have learned how to manipulate data in the Oracle database by using the
INSERT, UPDATE, DELETE, and TRUNCATE statements. You should have also learned how to control
data changes by using the COMMIT, SAVEPOINT, and ROLLBACK statements. You also learned how
to use the FOR UPDATE clause of the SELECT statement to lock rows for your changes only.
Remember that the Oracle server guarantees a consistent view of data at all times.

SQL Fundamentals 14 - 52

Oracle University Student Learning Subscription Use Only

Function

This practice covers the following topics:
• Inserting rows into a table
• Updating and deleting rows in the table
• Controlling database transactions

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

In this practice, you add rows to a table, update and delete data from the table, and control your
transactions.

SQL Fundamentals 14 - 53

Oracle University Student Learning Subscription Use Only

Practice 14: Overview

Oracle University Student Learning Subscription Use Only

Lesson 15: Introduction to Data
Definition Language

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Oracle University Student Learning Subscription Use Only

15

Course Roadmap
Lesson 1: Course Overview

You are here

Unit 2: Retrieving and Sorting Data
Unit 3: Joins, Subqueries, and Set
Operators

Lesson 14: Introduction to Data
Manipulation Language

Unit 4: DML and DDL

Lesson 15: Introduction to Data Definition
Language

Unit 5: Managing Relational Database
Lesson 16: Managing Tables using DML
Statements
Unit 6: Advance Queries and Database
Management System

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

In Unit 4, you will learn about Data Manipulation Language (DML) and Data Definition Language
(DDL). Using DML statements, you will learn to update and manage data in the tables. Using DDL
statements, you will learn to create tables, remove tables, etc.

SQL Fundamentals 15 - 2

Oracle University Student Learning Subscription Use Only

Unit 1: Relational Database and SQL
Overview

After completing this lesson, you should be able to:
• Categorize the main database objects
• Review the table structure
• List the data types that are available for columns
• Create a simple table
• Explain how constraints are created at the time of
table creation

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

In this lesson, you are introduced to the data definition language (DDL) statements. You learn the
basics of how to create simple tables. The data types available in Oracle database are shown and
schema concepts are introduced. Constraints are discussed in this lesson. Exception messages that
are generated from violating constraints during DML operations are shown and explained.

SQL Fundamentals 15 - 3

Oracle University Student Learning Subscription Use Only

Objectives

Lesson Agenda
Database objects
–

Naming rules

•

CREATE TABLE statement

•
•

Data types
Overview of constraints: NOT NULL, UNIQUE,
PRIMARY KEY, FOREIGN KEY, and CHECK

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

SQL Fundamentals 15 - 4

Oracle University Student Learning Subscription Use Only

•

Database Objects

Description

Table

Is the basic unit of storage; composed of
rows

View

Logically represents subsets of data from
one or more tables

Sequence
Index
Synonym

Generates numeric values
Improves the performance of some queries
Gives alternative names to objects

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

The Oracle database can contain multiple data structures. Each structure should be outlined in the
database design so that it can be created during the build stage of database development.
• Table: Stores data
• View: Is a subset of data from one or more tables
• Sequence: Generates numeric values
• Index: Improves the performance of some queries
• Synonym: Gives alternative names to objects
Oracle Table Structures
• Tables can be created at any time, even when users are using the database.
• You do not need to specify the size of a table. The size is ultimately defined by the amount of
space allocated to the database as a whole. It is important, however, to estimate how much
space a table will use over time.
• The table structure can be modified online.
Note: More database objects are available, but are not covered in this course.

SQL Fundamentals 15 - 5

Oracle University Student Learning Subscription Use Only

Object

Table names and column names must:
• Begin with a letter
• Be 1–30 characters long
• Contain only A–Z, a–z, 0–9, _, $, and #
• Not duplicate the name of another object owned by the same user
• Not be an Oracle server–reserved word

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

You name database tables and columns according to the standard rules for naming any Oracle
database object.
• Table names and column names must begin with a letter and be 1–30 characters long.
• Names must contain only the characters A–Z, a–z, 0–9, _ (underscore), $, and # (legal
characters, but their use is discouraged).
• Names must not duplicate the name of another object owned by the same Oracle server user.
• Names must not be an Oracle server–reserved word.
- You may also use quoted identifiers to represent the name of an object. A quoted identifier
begins and ends with double quotation marks (“”). If you name a schema object using a
quoted identifier, you must use the double quotation marks whenever you refer to that
object. Quoted identifiers can be reserved words, although this is not recommended.
Naming Guidelines
Use descriptive names for tables and other database objects.
Note: Names are not case-sensitive. For example, EMPLOYEES is treated the same as eMPloyees
or eMpLOYEES. However, quoted identifiers are case-sensitive.
For more information, see the “Schema Object Names and Qualifiers” section in the Oracle Database
SQL Language Reference for 12c database.

SQL Fundamentals 15 - 6

Oracle University Student Learning Subscription Use Only

Naming Rules

Lesson Agenda
Database objects
–

Naming rules

•

CREATE TABLE statement

•
•

Data types
Overview of constraints: NOT NULL, UNIQUE, PRIMARY
KEY, FOREIGN KEY, and CHECK

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

SQL Fundamentals 15 - 7

Oracle University Student Learning Subscription Use Only

•

•

You must have:
–

The CREATE TABLE privilege

–

A storage area

Schema is the same as
the owner’s name;
specify the table name.

CREATE TABLE [schema.]table
(column datatype [DEFAULT expr][, ...]);
Specifies default value if
omitted in the INSERT
statement

Specify the column name, data
type, and size.

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

You create tables to store data by executing the SQL CREATE TABLE statement. This statement is
one of the DDL statements that are a subset of the SQL statements used to create, modify, or
remove Oracle Database structures. These statements have an immediate effect on the database
and they also record information in the data dictionary.
To create a table, a user must have the CREATE TABLE privilege and a storage area in which to
create objects. The database administrator (DBA) uses data control language (DCL) statements to
grant privileges to users.
Note: The CREATE ANY TABLE privilege is needed to create a table in any schema other than the
user’s schema.

SQL Fundamentals 15 - 8

Oracle University Student Learning Subscription Use Only

CREATE TABLE Statement

Creating Tables
Create the table:
CREATE TABLE dept
(deptno
dname
loc
create_date

•

NUMBER(2),
VARCHAR2(14),
VARCHAR2(13),
DATE DEFAULT SYSDATE);

Confirm table creation:

DESCRIBE dept

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

The example in the slide creates the DEPT table with four columns: DEPTNO, DNAME, LOC, and
CREATE_DATE. The CREATE_DATE column has a default value. If a value is not provided for an
INSERT statement, the system date is automatically inserted.
To confirm that the table was created, run the DESCRIBE command.
Because creating a table is a DDL statement, an automatic commit takes place when this statement
is executed.
Note: You can view the list of tables that you own by querying the data dictionary. Example:
select table_name from user_tables;
Using data dictionary views, you can also find information about other database objects such as
views and indexes.

SQL Fundamentals 15 - 9

Oracle University Student Learning Subscription Use Only

•

Lesson Agenda
Database objects
–

Naming rules

•

CREATE TABLE statement

•
•

Data types
Overview of constraints: NOT NULL, UNIQUE, PRIMARY
KEY, FOREIGN KEY, and CHECK

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

SQL Fundamentals 15 - 10

Oracle University Student Learning Subscription Use Only

•

Data Types
Description

VARCHAR2(size)

Variable-length character data

CHAR(size)

Fixed-length character data

NUMBER(p, s)

Variable-length numeric data

DATE

Date and time values

LONG

Variable-length character data (up to 2 GB)

CLOB

Maximum size is (4 gigabytes - 1) *
(DB_BLOCK_SIZE).

RAW and LONG RAW

Raw binary data

BLOB

Maximum size is (4 gigabytes - 1) *
(DB_BLOCK_SIZE initialization parameter (8 TB
to 128 TB)).

BFILE

Binary data stored in an external file (up to 4 GB)

ROWID

A base-64 number system representing the
unique address of a row in its table

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

When you identify a column for a table, you need to provide a data type for the column. There are
several data types available:
Data Type

Description

VARCHAR2(size)

Variable-length character data (A maximum size must be
specified; minimum size is 1.)
Maximum size is:
• 32767 bytes if MAX_SQL_STRING_SIZE = EXTENDED
• 4000 bytes if MAX_SQL_STRING_SIZE = LEGACY

CHAR [(size)]

Fixed-length character data of length size bytes (Default and
minimum size is 1; maximum size is 2,000.)

NUMBER [(p,s)]

Number having precision p and scale s (Precision is the total
number of decimal digits and scale is the number of digits to
the right of the decimal point; precision can range from 1 to
38, and scale can range from –84 to 127.)

DATE

Date and time values to the nearest second between January
1, 4712 B.C., and December 31, 9999 A.D.

SQL Fundamentals 15 - 11

Oracle University Student Learning Subscription Use Only

Data Type

Description

LONG

Variable-length character data (up to 2 GB)

CLOB

A character large object containing single-byte or
multibyte characters. Maximum size is (4 gigabytes - 1) *
(DB_BLOCK_SIZE); stores national character set data.

NCLOB

A character large object containing Unicode characters.
Both fixed-width and variable-width character sets are
supported, both using the database national character
set. Maximum size is (4 gigabytes - 1) * (database block
size); stores national character set data.

RAW(size)

Raw binary data of length size bytes. You must
specify size for a RAW value. Maximum size is:
32767 bytes if MAX_SQL_STRING_SIZE = EXTENDED
4000 bytes if MAX_SQL_STRING_SIZE = LEGACY

LONG RAW

Raw binary data of variable length up to 2 gigabytes

BLOB

A binary large object. Maximum size is (4 gigabytes - 1) *
(DB_BLOCK_SIZE initialization parameter (8 TB to 128
TB)).

BFILE

Binary data stored in an external file (up to 4 GB)

ROWID

Base 64 string representing the unique address of a row
in its table. This data type is primarily for values returned
by the ROWID pseudocolumn.

TIMESTAMP

This is a datetime data type. Enables storage of time as a
date with fractional seconds. It stores the year, month,
day, hour, minute, and second value of the DATE data
type, as well as the fractional seconds value.
There are several variations of this data type such as
WITH TIMEZONE and WITH LOCALTIMEZONE.

Guidelines
• A LONG column is not copied when a table is created using a subquery.
• A LONG column cannot be included in a GROUP BY or an ORDER BY clause.
• Only one LONG column can be used per table.
• No constraints can be defined on a LONG column.
• You might want to use a CLOB column rather than a LONG column.

SQL Fundamentals 15 - 12

Oracle University Student Learning Subscription Use Only

Data Type

DEFAULT Option
Specify a default value for a column when specifying the CREATE TABLE
statement.
... hire_date DATE DEFAULT SYSDATE, ...

•
•
•

Literal values, expressions, or SQL functions are legal values.
Another column’s name or a pseudocolumn are illegal values.
The default data type must match the column data type.
CREATE TABLE hire_dates
(id
NUMBER(8),
hire_date DATE DEFAULT SYSDATE);

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

When you define a table, you can specify that a column should be given a default value by using the
DEFAULT option. This option prevents null values from entering the columns when a row is inserted
without a value for the column. The default value can be a literal, an expression, or a SQL function
(such as SYSDATE or USER), but the value cannot be the name of another column or a
pseudocolumn (such as NEXTVAL or CURRVAL). The default expression must match the data type of
the column.
Consider the following examples:
INSERT INTO hire_dates values(45, NULL);
The preceding statement will insert the null value rather than the default value.
INSERT INTO hire_dates(id) values(35);
The preceding statement will insert SYSDATE for the HIRE_DATE column.
Note: In SQL Developer, click the Run Script icon or press F5 to run the DDL statements. The
feedback messages will be shown in the Script Output pane.

SQL Fundamentals 15 - 13

Oracle University Student Learning Subscription Use Only

•

Lesson Agenda
Database objects
–

Naming rules

•

CREATE TABLE statement

•
•

Data types
Overview of constraints: NOT NULL, UNIQUE,
PRIMARY KEY, FOREIGN KEY, and CHECK

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

SQL Fundamentals 15 - 14

Oracle University Student Learning Subscription Use Only

•

•
•

Constraints enforce rules at the table level.
Constraints ensure the consistency and integrity of the database.
Constraint

Description

NOT NULL

Specifies that the column cannot contain a
null value

UNIQUE

Specifies a column or combination of
columns whose values must be unique for
all rows in the table

PRIMARY KEY

Uniquely identifies each row of the table

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

The Oracle server uses constraints to prevent invalid data entry into tables.
You can use constraints to do the following:
• Enforce rules on the data in a table whenever a row is inserted, updated, or deleted from that
table. The constraint must be satisfied for the operation to succeed.
• Prevent the dropping of a table if there are dependencies from other tables.
• Provide rules for Oracle tools, such as Oracle Developer.

SQL Fundamentals 15 - 15

Oracle University Student Learning Subscription Use Only

Including Constraints

Constraint

Description

FOREIGN KEY

Establishes and enforces a referential
integrity between the column and a column
of the referenced table such that values in
one table match the values in another table

CHECK

Specifies a condition that must be true

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

SQL Fundamentals 15 - 16

Oracle University Student Learning Subscription Use Only

Including Constraints

•
•

You can name a constraint or the Oracle server generates a name by using
the SYS_Cn format.
Create a constraint at either of the following times:
–
–

•
•

At the same time as the creation of the table
After the creation of the table

Define a constraint at the column or table level.
View a constraint in the data dictionary.

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

All constraints are stored in the data dictionary. Constraints are easy to reference if you give them a
meaningful name. Constraint names must follow the standard object-naming rules, except that the
name cannot be the same as another object owned by the same user. If you do not name your
constraint, the Oracle server generates a name with the format SYS_Cn, where n is an integer so that
the constraint name is unique.
Constraints can be defined at the time of table creation or after the creation of the table. You can
define a constraint at the column or table level. Functionally, a table-level constraint is the same as a
column-level constraint.
For more information, see the section on “Constraints” in Oracle Database SQL Language Reference
for 12c database.

SQL Fundamentals 15 - 17

Oracle University Student Learning Subscription Use Only

Constraint Guidelines

Defining Constraints
Syntax:
CREATE TABLE [schema.]table
(column datatype [DEFAULT expr]
[column_constraint],
...
[table_constraint][,...]);
Is an integrity constraint as part of
the table definition

Is an integrity
constraint as part of
the column definition

Functionally, a column-level constraint is the same as a table-level constraint.
NOT NULL constraints can be defined only at the column level.

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

The slide gives the syntax for defining constraints when creating a table. You can create constraints
at either the column level or the table level. Constraints defined at the column level are included
when the column is defined. Table-level constraints are defined at the end of the table definition, and
must refer to the column or columns to which the constraint pertains in a set of parentheses. It is
mainly the syntax that differentiates the two; otherwise, functionally, a column-level constraint is the
same as a table-level constraint.
NOT NULL constraints can be defined only at the column level.
Constraints that apply to more than one column must be defined at the table level.

SQL Fundamentals 15 - 18

Oracle University Student Learning Subscription Use Only

•

Defining Constraints
Column-level constraint syntax:
column [CONSTRAINT constraint_name] constraint_type,

•

Table-level constraint syntax:
column,...
[CONSTRAINT constraint_name] constraint_type
(column, ...),

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

The slide shows the syntax for defining the constraints at column and table level.

SQL Fundamentals 15 - 19

Oracle University Student Learning Subscription Use Only

•

Defining Constraints
Example of a column-level constraint:

1

CREATE TABLE employees(
employee_id NUMBER(6)
CONSTRAINT emp_emp_id_pk PRIMARY KEY,
first_name
VARCHAR2(20),
...);

•

Example of a table-level constraint:

2

CREATE TABLE employees(
employee_id NUMBER(6),
first_name
VARCHAR2(20),
...
job_id
VARCHAR2(10) NOT NULL,
CONSTRAINT emp_emp_id_pk
PRIMARY KEY (EMPLOYEE_ID));

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Constraints are usually created at the same time as the table. Constraints can be added to a table
after its creation and also be temporarily disabled.
Both examples in the slide create a primary key constraint on the EMPLOYEE_ID column of the
EMPLOYEES table.
1. The first example uses the column-level syntax to define the constraint.
2. The second example uses the table-level syntax to define the constraint.

SQL Fundamentals 15 - 20

Oracle University Student Learning Subscription Use Only

•

NOT NULL Constraint

Primary Key enforces
NOT NULL constraint

NOT NULL
constraint

Absence of NOT NULL constraint (Any row
can contain a null value for this column.)

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

The NOT NULL constraint ensures that the column contains no null values. Columns without the NOT
NULL constraint can contain null values by default. NOT NULL constraints must be defined at the
column level. In the EMPLOYEES table, the EMPLOYEE_ID column inherits a NOT NULL constraint
because it is defined as a primary key; otherwise, the LAST_NAME, EMAIL, HIRE_DATE, and JOB_ID
columns have the NOT NULL constraint enforced on them.

SQL Fundamentals 15 - 21

Oracle University Student Learning Subscription Use Only

Ensures that null values are not permitted for the column:

UNIQUE Constraint

…

INSERT INTO
CDAVIES

Not allowed: already exists

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

A UNIQUE key integrity constraint requires that every value in a column or a set of columns (key) be
unique—that is, no two rows of a table can have duplicate values in a specified column or a set of
columns. The column (or set of columns) included in the definition of the UNIQUE key constraint is
called the unique key. If the UNIQUE constraint comprises more than one column, that group of
columns is called a composite unique key.
UNIQUE constraints enable the input of nulls unless you also define NOT NULL constraints for the
same columns. In fact, any number of rows can include nulls for columns without the NOT NULL
constraints because nulls are not considered equal to anything. A null in a column (or in all columns
of a composite UNIQUE key) always satisfies a UNIQUE constraint.
Note: Because of the search mechanism for the UNIQUE constraints on more than one column, you
cannot have identical values in the non-null columns of a partially null composite UNIQUE key
constraint.

SQL Fundamentals 15 - 22

Oracle University Student Learning Subscription Use Only

UNIQUE
constraint

UNIQUE Constraint

CREATE TABLE employees(
employee_id
NUMBER(6),
last_name
VARCHAR2(25) NOT NULL,
email
VARCHAR2(25),
salary
NUMBER(8,2),
commission_pct
NUMBER(2,2),
hire_date
DATE NOT NULL,
...
CONSTRAINT emp_email_uk UNIQUE(email));

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

UNIQUE constraints can be defined at the column level or the table level. You define the constraint at
the table level when you want to create a composite unique key. A composite key is defined when a
single attribute cannot uniquely identify a row. In that case, you can have a unique key that is
composed of two or more columns, the combined value of which is always unique and can identify
rows.
The example in the slide applies the UNIQUE constraint to the EMAIL column of the EMPLOYEES
table. The name of the constraint is EMP_EMAIL_UK.
Note: The Oracle server enforces the UNIQUE constraint by implicitly creating a unique index on the
unique key column or columns.

SQL Fundamentals 15 - 23

Oracle University Student Learning Subscription Use Only

Defined at either the table level or the column level:

PRIMARY KEY Constraint

INSERT INTO
50
null

Not allowed: already exists
Not allowed: cannot contain a null value

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

A PRIMARY KEY constraint creates a primary key for the table. Only one primary key can be created
for each table. The PRIMARY KEY constraint is a column or a set of columns that uniquely identifies
each row in a table. This constraint enforces the uniqueness of the column or column combination,
and ensures that no column that is part of the primary key can contain a null value.
Note: Because uniqueness is part of the primary key constraint definition, the Oracle server enforces
the uniqueness by implicitly creating a unique index on the primary key column or columns.

SQL Fundamentals 15 - 24

Oracle University Student Learning Subscription Use Only

PRIMARY KEY

FOREIGN KEY Constraint
DEPARTMENTS:
PRIMARY KEY

INSERT INTO
Not allowed: DOES NOT
EXIST IN PARENT TABLE
Allowed

DEPARTMENT_ID: 30

DEPARTMENT_ID: 60

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

The FOREIGN KEY (or referential integrity) constraint designates a column or a combination of
columns as a foreign key, and establishes a relationship with a primary key or a unique key in the
same table or a different table.
In the example in the slide, DEPARTMENT_ID has been defined as the foreign key in the EMPLOYEES
table (dependent or child table); it references the DEPARTMENT_ID column of the DEPARTMENTS
table (the referenced or parent table).
Guidelines
• A foreign key value must match an existing value in the parent table or be NULL.
•

Foreign keys are based on data values and are purely logical, rather than physical, pointers.

SQL Fundamentals 15 - 25

Oracle University Student Learning Subscription Use Only

EMPLOYEES:FOREIGN KEY

FOREIGN KEY Constraint

CREATE TABLE employees(
employee_id
NUMBER(6),
last_name
VARCHAR2(25) NOT NULL,
email
VARCHAR2(25),
salary
NUMBER(8,2),
commission_pct
NUMBER(2,2),
hire_date
DATE NOT NULL,
...
department_id
NUMBER(4),
CONSTRAINT emp_dept_fk FOREIGN KEY (department_id)
REFERENCES departments(department_id),
CONSTRAINT emp_email_uk UNIQUE(email));

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

FOREIGN KEY constraints can be defined at the column or table level. A composite foreign key must
be created by using the table-level definition.
The example in the slide defines a FOREIGN KEY constraint on the DEPARTMENT_ID column of the
EMPLOYEES table, using table-level syntax. The name of the constraint is EMP_DEPT_FK.
The foreign key can also be defined at the column level, provided that the constraint is based on a
single column. The syntax differs in that the keywords FOREIGN KEY do not appear. Example:
CREATE TABLE employees
(...
department_id NUMBER(4) CONSTRAINT emp_deptid_fk
REFERENCES departments(department_id),
...
)

SQL Fundamentals 15 - 26

Oracle University Student Learning Subscription Use Only

Defined at either the table level or the column level:

•
•
•
•

FOREIGN KEY: Defines the column in the child table at the table-constraint
level
REFERENCES: Identifies the table and column in the parent table
ON DELETE CASCADE: Deletes the dependent rows in the child table when a
row in the parent table is deleted
ON DELETE SET NULL: Converts dependent foreign key values to null

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

The foreign key is defined in the child table, and the table containing the referenced column is the
parent table. The foreign key is defined using a combination of the following keywords:
• FOREIGN KEY is used to define the column in the child table at the table-constraint level.
• REFERENCES identifies the table and the column in the parent table.
• ON DELETE CASCADE indicates that when a row in the parent table is deleted, the dependent
rows in the child table are also deleted.
• ON DELETE SET NULL indicates that when a row in the parent table is deleted, the foreign key
values are set to null.
The default behavior is called the restrict rule, which disallows the update or deletion of referenced
data.
Without the ON DELETE CASCADE or the ON DELETE SET NULL options, a row in the parent table
cannot be deleted if it is referenced in the child table. Additionally, these keywords cannot be used in
column-level syntax.

SQL Fundamentals 15 - 27

Oracle University Student Learning Subscription Use Only

FOREIGN KEY Constraint: Keywords

•
•

Defines a condition that each row must satisfy
Cannot reference columns from other tables
..., salary
NUMBER(2)
CONSTRAINT emp_salary_min
CHECK (salary > 0),...

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

The CHECK constraint defines a condition that each row must satisfy. To satisfy the constraint, each
row in the table must make the condition either TRUE or unknown (due to a null).
The condition can use the same constructs as the query conditions except the queries that refer to
other values in other rows.
A single column can have multiple CHECK constraints that refer to the column in its definition. There is
no limit to the number of CHECK constraints that you can define on a column.
CHECK constraints can be defined at the column level or the table level.
CREATE TABLE employees
(...
salary NUMBER(8,2) CONSTRAINT emp_salary_min
CHECK (salary > 0),
...

SQL Fundamentals 15 - 28

Oracle University Student Learning Subscription Use Only

CHECK Constraint

CREATE TABLE teach_emp (
empno
NUMBER(5) PRIMARY KEY,
ename
VARCHAR2(15) NOT NULL,
job
VARCHAR2(10),
mgr
NUMBER(5),
hiredate
DATE DEFAULT (sysdate),
photo
BLOB,
sal
NUMBER(7,2),
deptno
NUMBER(3) NOT NULL
CONSTRAINT admin_dept_fkey REFERENCES
departments(department_id));

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

SQL Fundamentals 15 - 29

Oracle University Student Learning Subscription Use Only

CREATE TABLE: Example

UPDATE employees
SET
department_id = 55
WHERE department_id = 110;

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

When you have constraints in place on columns, an error is returned if you try to violate the constraint
rule. For example, if you try to update a record with a value that is tied to an integrity constraint, an
error is returned.
In the example in the slide, department 55 does not exist in the parent table, DEPARTMENTS, and so
you receive the “parent key not found” violation ORA-02291.

SQL Fundamentals 15 - 30

Oracle University Student Learning Subscription Use Only

Violating Constraints

Violating Constraints

DELETE FROM departments
WHERE department_id = 60;

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

If you attempt to delete a record with a value that is tied to an integrity constraint, an error is returned.
The example in the slide tries to delete department 60 from the DEPARTMENTS table, but it results in
an error because that department number is used as a foreign key in the EMPLOYEES table. If the
parent record that you attempt to delete has child records, you receive the “child record found”
violation ORA-02292.
The following statement works because there are no employees in department 70:
DELETE FROM departments
WHERE department_id = 70;

SQL Fundamentals 15 - 31

Oracle University Student Learning Subscription Use Only

You cannot delete a row containing a primary key that is used as a foreign key in
another table.

Q

Quiz

a. True
b. False

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Answer: a

SQL Fundamentals 15 - 32

Oracle University Student Learning Subscription Use Only

While creating a table, you can specify the default value for the columns, which
is the value to be inserted if the value is omitted in the INSERT statement.

Which constraint can only be specified at the column level?
a. PRIMARY KEY
b. NOT NULL
c. CHECK
d. FOREIGN KEY

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Answer: b

SQL Fundamentals 15 - 33

Oracle University Student Learning Subscription Use Only

Q

Quiz

Q

Quiz

a. True
b. False

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Answer: a

SQL Fundamentals 15 - 34

Oracle University Student Learning Subscription Use Only

A foreign key value must match an existing value in the parent table or be NULL.

In this lesson, you should have learned how to:
• Categorize the main database objects
• Review the table structure
• List the data types that are available for columns
• Create a simple table by using the CREATE TABLE statement
•

Explain how constraints are added at the time of table
creation

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

In this lesson, you should have learned how to use the CREATE TABLE statement to create a table
and include constraints.

SQL Fundamentals 15 - 35

Oracle University Student Learning Subscription Use Only

Summary

This practice covers the following topics:
• Creating new tables
• Verifying that tables exist
• Defining various table and column constraints

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

You create new tables by using the CREATE TABLE statement and confirm that the new tables were
added to the database.
Note: For all DDL and DML statements, click the Run Script icon (or press F5) to execute the query
in SQL Developer. Thus, you get to see the feedback messages in the Script Output pane. For
SELECT queries, continue to click the Execute Statement icon or press F9 to get the formatted output
in the Results pane.

SQL Fundamentals 15 - 36

Oracle University Student Learning Subscription Use Only

Practice 15: Overview

Lesson 16: Managing Tables Using
DML Statements

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Oracle University Student Learning Subscription Use Only

16

Course Roadmap
Lesson 1: Course Overview

Unit 2: Retrieving and Sorting Data
Unit 3: Joins, Subqueries, and Set
Operators

Lesson 14: Introduction to Data
Manipulation Language

Unit 4: DML and DDL

Lesson 15: Introduction to Data Definition
Language

Unit 5: Managing Relational Database
Lesson 16: Managing Tables using DML
Statements
Unit 6: Advance Queries and Database
Management System

You are here
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

In Unit 4, you will learn about Data Manipulation Language (DML) and Data Definition Language
(DDL). Using DML statements, you will learn to update and manage data in the tables. Using DDL
statements, you will learn to create tables, remove tables, etc.

SQL Fundamentals 16 - 2

Oracle University Student Learning Subscription Use Only

Unit 1: Relational Database and SQL
Overview

After completing this lesson, you should be able to:
• Create a table using the CREATE TABLE AS statement
• Add, modify, and drop columns by using the ALTER TABLE statement
• Drop tables using the DROP TABLE statement

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

In this lesson, you learn more about managing database objects. You learn how to create a table
using a subquery. You learn the basics of altering and dropping tables.

SQL Fundamentals 16 - 3

Oracle University Student Learning Subscription Use Only

Objectives

•
•
•

Creating a table using a subquery
ALTER TABLE statement
DROP TABLE statement

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

SQL Fundamentals 16 - 4

Oracle University Student Learning Subscription Use Only

Lesson Agenda

Creating a Table Using a Subquery
Create a table and insert rows by combining the CREATE TABLE statement
and the AS subquery option.
SELECT statement that defines
the set of rows to be inserted
into the new table

CREATE TABLE table
[(column, column...)]
AS subquery;

•
•

Match the number of specified columns to the number of subquery columns.
Define columns with column names and default values.

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

A second method for creating a table is to apply the AS subquery clause, which both creates the
table and inserts rows returned from a subquery.
Guidelines
• The table is created with the specified column names, and the rows retrieved by the SELECT
statement are inserted into the table.
• The column definition can contain only the column name and default value.
• If column specifications are given, the number of columns must equal the number of columns in
the subquery SELECT list.
• If no column specifications are given, the column names of the table are the same as the
column names in the subquery. To specify different column names, enclose them in a
parenthesis following the table name. For example:
- CREATE TABLE emp (id, name) AS subquery
• The column data type definitions and the NOT NULL constraint are passed to the new table.
Note that only the explicit NOT NULL constraint will be inherited. The PRIMARY KEY column will
not pass the NOT NULL feature to the new column. Any other constraint rules are not passed to
the new table. However, you can add constraints in the column definition.

SQL Fundamentals 16 - 5

Oracle University Student Learning Subscription Use Only

•

CREATE TABLE
dept80
AS
SELECT employee_id, last_name,
salary*12 ANNSAL,
hire_date
FROM
employees
WHERE
department_id = 80;

DESCRIBE dept80

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

The example in the slide creates a table named DEPT80, which contains details of all the employees
working in department 80. Notice that the data for the DEPT80 table comes from the EMPLOYEES
table.
You can verify the existence of a database table and check the column definitions by using the
DESCRIBE command.
However, be sure to provide a column alias when selecting an expression. The expression
SALARY*12 is given the alias ANNSAL. Without the alias, the following error is generated:

SQL Fundamentals 16 - 6

Oracle University Student Learning Subscription Use Only

Creating a Table Using a Subquery

•
•
•

Creating a table using a subquery
ALTER TABLE statement
DROP TABLE statement

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

SQL Fundamentals 16 - 7

Oracle University Student Learning Subscription Use Only

Lesson Agenda

ALTER TABLE Statement

•
•
•
•
•

Add a new column
Modify an existing column definition
Define a default value for a new column
Drop a column
Change table to read-only status

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

After you create a table, you may need to change the table structure for any of the following reasons:
• You omitted a column.
• Your column definition or its name needs to be changed.
• You need to remove columns.
• You want to put the table into read-only mode.
You can do this by using the ALTER TABLE statement.

SQL Fundamentals 16 - 8

Oracle University Student Learning Subscription Use Only

Use the ALTER TABLE statement to:

ALTER TABLE Statement

Specify the default value for a
column.
ALTER TABLE table
ADD|MODIFY
(column datatype [DEFAULT expr]
[, column datatype]...)
DROP (column [, column] …);

ADD, MODIFY, or DROP
specify the type of modification.

When adding or modifying,
specify the column and its data
type and size.

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

You can add columns to a table, modify columns, and drop columns from a table by using the ALTER
TABLE statement.

SQL Fundamentals 16 - 9

Oracle University Student Learning Subscription Use Only

Use the ALTER TABLE statement to add, modify, or drop columns:

Adding a Column
You use the ADD clause to add columns:
ALTER TABLE dept80
ADD (job_id VARCHAR2(9));

•

The new column becomes the last column:

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Guidelines for Adding a Column
• You can add or modify columns.
• You cannot specify where the column should appear. The new column becomes the last column.
The example in the slide adds a column named JOB_ID to the DEPT80 table. The JOB_ID column
becomes the last column in the table.
Note: If a table already contains rows when a column is added, the new column is initially null or
takes the default value for all the rows. You can add a mandatory NOT NULL column to a table that
contains data in the other columns only if you specify a default value. You can add a NOT NULL
column to an empty table without the default value.

SQL Fundamentals 16 - 10

Oracle University Student Learning Subscription Use Only

•

Modifying a Column
You can change a column’s data type, size, and default value.
ALTER TABLE dept80
MODIFY(last_name VARCHAR2(30));

•

A change to the default value affects only subsequent insertions to the table.

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

You can modify a column definition by using the ALTER TABLE statement with the MODIFY clause.
Column modification can include changes to a column’s data type, size, and default value.
Guidelines
• You can increase the width or precision of a numeric column.
• You can increase the width of character columns.
• You can decrease the width of a column if:
- The column contains only null values
- The table has no rows
- The decrease in column width is not less than the existing values in that column
• You can change the data type if the column contains only null values. The exception to this is
CHAR-to-VARCHAR2 conversions, which can be done with data in the columns.
• You can convert a CHAR column to the VARCHAR2 data type or convert a VARCHAR2 column to
the CHAR data type only if the column contains null values or if you do not change the size.
•

A change to the default value of a column affects only subsequent insertions to the table.

SQL Fundamentals 16 - 11

Oracle University Student Learning Subscription Use Only

•

Dropping a Column

ALTER TABLE dept80
DROP (job_id);

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

You can drop a column from a table by using the ALTER TABLE statement with the DROP clause.
Guidelines
• The column may or may not contain data.
• Using the ALTER TABLE DROP statement, only one column can be dropped at a time.
• The table must have at least one column remaining in it after it is altered.
• After a column is dropped, it cannot be recovered.
• A primary key that is referenced by another column cannot be dropped, unless the cascade
option is added.
Dropping a column can take a while if the column has a large number of values. In this case, it may
be better to set it as unused and drop it when there are fewer users on the system to avoid extended
locks. You use the SET UNUSED option to mark one or more columns as unused. You use the DROP
UNUSED COLUMNS option to remove the columns that are marked as unused.
DROP UNUSED COLUMNS Option
You can use this statement when you want to reclaim the extra disk space from the unused columns
in the table. If the table contains no unused columns, the statement returns with no errors.
ALTER TABLE dept80
SET
UNUSED (last_name);
ALTER TABLE dept80
DROP UNUSED COLUMNS;
Note: Certain columns can never be dropped, such as columns that form part of the partitioning key
of a partitioned table or columns that form part of the PRIMARY KEY of an index-organized table.
SQL Fundamentals 16 - 12

Oracle University Student Learning Subscription Use Only

Use the DROP clause to drop columns that you no longer need from the table:

Read-Only Tables

•
•

Put a table in read-only mode, which prevents DDL or DML changes during
table maintenance
Put the table back into read/write mode
ALTER TABLE employees READ ONLY;
-- perform table maintenance and then
-- return table back to read/write mode
ALTER TABLE employees READ WRITE;

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

You can specify READ ONLY to place a table in read-only mode. When the table is in READ ONLY
mode, you cannot issue any DML statements that affect the table or any SELECT ... FOR UPDATE
statements. You can issue DDL statements as long as they do not modify any data in the table.
Operations on indexes associated with the table are allowed when the table is in READ ONLY mode.
Specify READ/WRITE to return a read-only table to read/write mode.
Note: You can drop a table that is in READ ONLY mode. The DROP command is executed only in the
data dictionary, so access to the table contents is not required. The space used by the table will not
be reclaimed until the tablespace is made read/write again, and the required changes can be made to
the block segment headers, and so on.

SQL Fundamentals 16 - 13

Oracle University Student Learning Subscription Use Only

You can use the ALTER TABLE syntax to:

•
•
•

Creating a table using a subquery
ALTER TABLE statement
DROP TABLE statement

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

SQL Fundamentals 16 - 14

Oracle University Student Learning Subscription Use Only

Lesson Agenda

•
•
•

Moves a table to the recycle bin
Removes the table and all its data entirely if the PURGE clause is specified
Invalidates dependent objects and removes object privileges on the table

DROP TABLE dept80;

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

The DROP TABLE statement moves a table to the recycle bin or removes the table and all its
data from the database entirely. Unless you specify the PURGE clause, the DROP TABLE
statement does not result in space being released back to the tablespace for use by other
objects, and the space continues to count toward the user’s space quota. Dropping a table
invalidates the dependent objects and removes object privileges on the table.
When you drop a table, the database loses all the data in the table and all the indexes
associated with it.
Syntax
DROP TABLE table [PURGE]
In the syntax, table is the name of the table.
Guidelines
• All data is deleted from the table.
• Any views and synonyms remain, but are invalid.
• Any pending transactions are committed.
• Only the creator of the table or a user with the DROP ANY TABLE privilege can remove a table.
Note: You cannot rollback the DROP TABLE statement. Use the FLASHBACK TABLE statement to
restore a dropped table from the recycle bin.

SQL Fundamentals 16 - 15

Oracle University Student Learning Subscription Use Only

Dropping a Table

Q

Quiz

CREATE TABLE
dept20
AS
SELECT employee_id, last_name,
salary*0.5 BONUS,
hire_date
FROM
employees
WHERE
department_id = 20;

a. Creates a table named DEPT20, which contains details of all the employees
working in department 20, with their bonus salary details
b. Gives an error because the table does not exist
c. Creates the DEPT20 table and inserts the query statement as the data
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Answer: a

SQL Fundamentals 16 - 16

Oracle University Student Learning Subscription Use Only

What does the following statement do?

Which one of the following statements describes the difference between ALTER
TABLE DROP and DROP TABLE?
a. ALTER TABLE DROP is used to drop an unused column while DROP TABLE
is used to delete the whole table.
b. ALTER TABLE DROP drops the data from a column while DROP TABLE
invalidates a table.

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Answer: a

SQL Fundamentals 16 - 17

Oracle University Student Learning Subscription Use Only

Q

Quiz

In this lesson, you should have learned how to:
• Create a table by using a subquery
• Use the ALTER TABLE and DROP TABLE statements

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

In this lesson, you should have learned how to:
• Create a table using a subquery
• Add, modify, and delete a column from a table
• Drop a table

SQL Fundamentals 16 - 18

Oracle University Student Learning Subscription Use Only

Summary

This practice covers the following topics:
• Creating a new table by using the CREATE TABLE AS syntax
• Verifying that tables exist
• Altering tables
–
–

•
•

Adding columns
Dropping columns

Setting a table to read-only status
Dropping tables

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

In this practice, you create new tables by using the CREATE TABLE AS statement. You also alter
and drop tables.
Note: For all DDL and DML statements, click the Run Script icon (or press F5) to execute the query
in SQL Developer. Thus, you get to see the feedback messages in the Script Output pane. For
SELECT queries, continue to click the Execute Statement icon or press F9 to get the formatted output
in the Results pane.

SQL Fundamentals 16 - 19

Oracle University Student Learning Subscription Use Only

Practice 16: Overview

Oracle University Student Learning Subscription Use Only

Lesson 17: Introduction to Data
Dictionary Views

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Oracle University Student Learning Subscription Use Only

17

Course Roadmap
Lesson 1: Course Overview

Unit 1: Relational Database and SQL
Overview
Unit 2: Retrieving and Sorting Data

Lesson 17: Introduction to Data Dictionary
Views

Unit 3: Joins, Subqueries, and Set
Operators

Lesson 18: Creating Views

Unit 4: DML and DDL

Lesson 19: Creating Sequences,
Synonyms and Indexes

Unit 5: Managing Relational Database

Unit 6: Advance Queries and Database
Management System

Lesson 20: Managing Constraints,
Temporary Tables and External Tables

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

In Unit 5, you will be introduced to views. You will also learn to query data dictionary views. You will
learn to create sequences, synonyms and indexes. You will also learn to manage constraints and
tables.

SQL Fundamentals 17 - 2

Oracle University Student Learning Subscription Use Only

You are here

After completing this lesson, you should be able to:
• Use the data dictionary views to research data on your objects
• Query various data dictionary views

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

In this lesson, you are introduced to data dictionary views. You learn that the dictionary views can be
used to retrieve metadata and create reports about your schema objects.

SQL Fundamentals 17 - 3

Oracle University Student Learning Subscription Use Only

Objectives

•
•

Introduction to data dictionary
Querying the dictionary views for the following:
–
–
–

•

Table information
Column information
Constraint information

Adding a comment to a table and querying the
dictionary views for comment information

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

SQL Fundamentals 17 - 4

Oracle University Student Learning Subscription Use Only

Lesson Agenda

•
•
•

Users create and maintain business data in user tables.
Oracle Database creates and maintains data about users’ data in a
collection of tables or views known as the Data Dictionary.
The data dictionary is structured in tables and views, just like other database
data.
Oracle Server
Tables containing
business data:
EMPLOYEES
DEPARTMENTS
LOCATIONS
JOB_HISTORY
...

Data dictionary views:
DICTIONARY
USER_OBJECTS
USER_TABLES
USER_TAB_COLUMNS
...

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

User tables are tables created by the users and contain business data, such as EMPLOYEES. There is
another collection of tables and views in the Oracle database known as the data dictionary. This
collection is created and maintained by the Oracle Server and contains information about the
database. The data dictionary is structured in tables and views, just like other database data.

SQL Fundamentals 17 - 5

Oracle University Student Learning Subscription Use Only

Data Dictionary

•
•

Important tool for end users, application developers, and database
administrators to find information about their data
You use SQL statements to query the read-only dictionary tables and views.

• Definition of schema objects
• Default values for columns
• Information about integrity
constraints
• Oracle usernames and their
privileges and roles information
• General database information

Oracle Server

Data dictionary
views:
DICTIONARY
USER_OBJECTS
USER_TABLES
USER_TAB_COLUMNS
...

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Not only is the data dictionary central to every Oracle database, but it is also an important tool for all
users, from end users to application designers and database administrators.
You use SQL statements to access the data dictionary. Because the data dictionary is read-only, you
can issue only queries against its tables and views.
You can query the dictionary views that are based on the dictionary tables to find information such
as:
• Definitions of all schema objects in the database (tables, views, indexes, synonyms,
sequences, procedures, functions, packages, triggers, and so on)
• Default values for columns
• Integrity constraint information
• Names of Oracle users
• Privileges and roles that each user has been granted
• Other general database information

SQL Fundamentals 17 - 6

Oracle University Student Learning Subscription Use Only

Data Dictionary

•
•

The Oracle server writes and reads from a set of base tables.
Users access the views that provide useful information decoded from these
base tables; views hide the complexity from the users.

Oracle
Server

• SYS owns the data dictionary.

SYS

Consists of:
• Base tables
• User-accessible views

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Underlying base tables store information about the associated database. Only the Oracle Server
should write to and read from these tables. You rarely access them directly.
There are several views that summarize and display the information stored in the base tables of the
data dictionary. These views decode the base table data into useful information (such as user or
table names) using joins and WHERE clauses to simplify the information. Most users are given access
to the views rather than the base tables.
The Oracle user SYS owns all base tables and user-accessible views of the data dictionary. No
Oracle user should ever alter (UPDATE, DELETE, or INSERT) any rows or schema objects contained
in the SYS schema, because such activity can compromise data integrity.

SQL Fundamentals 17 - 7

Oracle University Student Learning Subscription Use Only

Data Dictionary Structure

Data Dictionary Structure

View Prefix

Purpose

USER

User’s view (what is in your schema; what you own)

ALL

Expanded user’s view (what you can access)

DBA

Database administrator’s view (what is in everyone’s schemas)

V$

Performance-related data

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

The data dictionary consists of sets of views. In many cases, a set consists of three views containing
similar information and distinguished from each other by their prefixes. For example, there is a view
named USER_OBJECTS, another named ALL_OBJECTS, and a third named DBA_OBJECTS.
These three views contain similar information about objects in the database, except that the scope is
different. USER_OBJECTS contains information about objects that you own or you created.
ALL_OBJECTS contains information about all objects to which you have access. DBA_OBJECTS
contains information about all objects that are owned by all users. For views that are prefixed with
ALL or DBA, there is usually an additional column in the view named OWNER to identify who owns the
object.
There is also a set of views that is prefixed with v$. These views are dynamic in nature and hold
information about performance. Dynamic performance tables are not true tables, and they should not
be accessed by most users. However, database administrators can query and create views on the
tables and grant access to those views to other users. This course does not go into details about
these views.

SQL Fundamentals 17 - 8

Oracle University Student Learning Subscription Use Only

View naming convention:

How to Use the Dictionary Views

DESCRIBE DICTIONARY

SELECT *
FROM
dictionary
WHERE table_name = 'USER_OBJECTS';

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

To familiarize yourself with the dictionary views, you can use the dictionary view named
DICTIONARY. It contains the name and short description of each dictionary view to which you have
access.
You can write queries to search for information about a particular view name, or you can search the
COMMENTS column for a word or phrase.
The SELECT statement retrieves information about the dictionary view named USER_OBJECTS. The
USER_OBJECTS view contains information about all the objects that you own.
You can write queries to search the COMMENTS column for a word or phrase. For example, the
following query returns the names of the tables that you have access to in which the COMMENTS
column contains the word employees:
SELECT table_name,comments
FROM user_tab_comments
WHERE LOWER(comments) LIKE '%employees%';
Note: The names in the data dictionary are in uppercase.
You will learn to add comments to a table or column by using the COMMENT statement later in this
lesson.

SQL Fundamentals 17 - 9

Oracle University Student Learning Subscription Use Only

Start with DICTIONARY. It contains the names and descriptions of the dictionary
tables and views.

USER_OBJECTS:
• Query USER_OBJECTS to see all the objects that you own.
• Query USER_OBJECTS to obtain a listing of all object names and types in
your schema, as well as the following information:
–
–
–

Date created
Date of last modification
Status (valid or invalid)

ALL_OBJECTS:
• Query ALL_OBJECTS to see all the objects to which you have access.

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

You can query the USER_OBJECTS view to see the names and types of all the objects in your
schema. There are several columns in this view:
• OBJECT_NAME: Name of the object
• OBJECT_ID: Dictionary object number of the object
• OBJECT_TYPE: Type of object (such as TABLE, VIEW, INDEX, SEQUENCE)
• CREATED: Time stamp for the creation of the object
• LAST_DDL_TIME: Time stamp for the last modification of the object resulting from a data
definition language (DDL) command
• STATUS: Status of the object (VALID, INVALID, or N/A)
• GENERATED: Was the name of this object system-generated? (Y|N)
Note: This is not a complete listing of the columns. For a complete listing, see “USER_OBJECTS” in
the Oracle® Database Reference 12c Release 1.
You can also query the ALL_OBJECTS view to see a listing of all objects to which you have access.

SQL Fundamentals 17 - 10

Oracle University Student Learning Subscription Use Only

USER_OBJECTS and ALL_OBJECTS Views

SELECT object_name, object_type, created, status
FROM
user_objects
ORDER BY object_type;

The CAT view displays
names of all your
INDEX, TABLE,
CLUSTER, VIEW,
SYNONYM, SEQUENCE, or
UNDEFINED objects.

…
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

The example shows the names, types, dates of creation, and status of all objects that are owned by
this user.
The OBJECT_TYPE column holds the values of either TABLE, VIEW, SEQUENCE, INDEX,
PROCEDURE, FUNCTION, PACKAGE, or TRIGGER.
The STATUS column holds a value of VALID, INVALID, or N/A. Although tables are always valid, the
views, procedures, functions, packages, and triggers may be invalid.
The CAT View
For a simplified query and output, you can query the CAT view. This view contains only two columns:
TABLE_NAME and TABLE_TYPE. It provides the names of all your INDEX, TABLE, CLUSTER, VIEW,
SYNONYM, SEQUENCE, or UNDEFINED objects.
Note: CAT is a synonym for USER_CATALOG—a view that lists tables, views, synonyms, and
sequences owned by the user.

SQL Fundamentals 17 - 11

Oracle University Student Learning Subscription Use Only

USER_OBJECTS View

•
•

Introduction to data dictionary
Querying the dictionary views for the
following:
–
–
–

•

Table information
Column information
Constraint information

Adding a comment to a table and querying the
dictionary views for comment information

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

SQL Fundamentals 17 - 12

Oracle University Student Learning Subscription Use Only

Lesson Agenda

Table Information

DESCRIBE user_tables

SELECT table_name
FROM
user_tables;

The TAB view is a
synonym of the
USER_TABLES view.

…

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

You can use the USER_TABLES view to obtain the names of all your tables. The USER_TABLES view
contains information about your tables. In addition to providing the table name, it contains detailed
information about the storage.
The TABS view is a synonym of the USER_TABLES view. You can query it to see a listing of tables
that you own:
SELECT table_name
FROM tabs;
Note: For a complete listing of the columns in the USER_TABLES view, see “USER_TABLES” in the
Oracle® Database Reference 12c Release 1.
You can also query the ALL_TABLES view to see a listing of all tables to which you have access.

SQL Fundamentals 17 - 13

Oracle University Student Learning Subscription Use Only

USER_TABLES: Provides information about your tables

Column Information

DESCRIBE user_tab_columns

…
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

You can query the USER_TAB_COLUMNS view to find detailed information about the columns in your
tables. Although the USER_TABLES view provides information about your table names and storage,
detailed column information is found in the USER_TAB_COLUMNS view.
This view contains information such as:
• Column names
• Column data types
• Length of data types
• Precision and scale for NUMBER columns
• Whether nulls are allowed (Is there a NOT NULL constraint on the column?)
• Default value
Note: For a complete listing and description of the columns in the USER_TAB_COLUMNS view, see
“USER_TAB_COLUMNS” in the Oracle® Database Reference 12c Release 1.

SQL Fundamentals 17 - 14

Oracle University Student Learning Subscription Use Only

USER_TAB_COLUMNS: Provides detailed information about the columns in your
tables

SELECT column_name, data_type, data_length,
data_precision, data_scale, nullable
FROM
user_tab_columns
WHERE table_name = 'EMPLOYEES';

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

By querying the USER_TAB_COLUMNS table, you can find details about your columns such as the
names, data types, data type lengths, null constraints, and default value for a column.
The example shown in the slide displays the columns, data types, data lengths, and null constraints
for the EMPLOYEES table. Note that this information is similar to the output from the DESCRIBE
command.
To view information about columns set as unused, you use the USER_UNUSED_COL_TABS dictionary
view.
Note: Names of the objects in Data Dictionary are in uppercase.

SQL Fundamentals 17 - 15

Oracle University Student Learning Subscription Use Only

Column Information

•
•

USER_CONSTRAINTS describes the constraint definitions on your tables.
USER_CONS_COLUMNS describes columns that are owned by you and that
are specified in constraints.

USER_CONSTRAINTS

USER_CONS_COLUMNS

…
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

You can find out the names of your constraints, the type of constraint, the table name to which the
constraint applies, the condition for check constraints, foreign key constraint information, deletion rule
for foreign key constraints, the status, and many other types of information about your constraints.
Note: For a complete listing and description of the columns in the USER_CONSTRAINTS view, see
“USER_CONSTRAINTS” in the Oracle® Database Reference 12c Release 1.

SQL Fundamentals 17 - 16

Oracle University Student Learning Subscription Use Only

Constraint Information

SELECT constraint_name, constraint_type,
search_condition, r_constraint_name,
delete_rule, status
FROM
user_constraints
WHERE table_name = 'EMPLOYEES';

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

In the example shown in the slide, the USER_CONSTRAINTS view is queried to find the names, types,
check conditions, name of the unique constraint that the foreign key references, deletion rule for a
foreign key, and status for constraints on the EMPLOYEES table.
The CONSTRAINT_TYPE can be:
• C (check constraint on a table, or NOT NULL)
• P (primary key)
• U (unique key)
• R (referential integrity)
• V (with check option, on a view)
• O (with read-only, on a view)
The DELETE_RULE can be:
• CASCADE: If the parent record is deleted, the child records are also deleted.
• SET NULL: If the parent record is deleted, change the respective child records to null.
• NO ACTION: A parent record can be deleted only if no child records exist.
The STATUS can be:
• ENABLED: Constraint is active.
• DISABLED: Constraint is not active.

SQL Fundamentals 17 - 17

Oracle University Student Learning Subscription Use Only

USER_CONSTRAINTS: Example

SELECT constraint_name, column_name
FROM
user_cons_columns
WHERE table_name = 'EMPLOYEES';

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

To find the names of the columns to which a constraint applies, query the USER_CONS_COLUMNS
dictionary view. This view tells you the name of the owner of a constraint, the name of the constraint,
the table that the constraint is on, the names of the columns with the constraint, and the original
position of the column or attribute in the definition of the object.
Note: A constraint may apply to more than one column.
You can also write a join between USER_CONSTRAINTS and USER_CONS_COLUMNS to create
customized output from both tables.

SQL Fundamentals 17 - 18

Oracle University Student Learning Subscription Use Only

Querying USER_CONS_COLUMNS

•
•

Introduction to data dictionary
Querying the dictionary views for the
following:
–
–
–

•

Table information
Column information
Constraint information

Adding a comment to a table and querying the
dictionary views for comment information

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

SQL Fundamentals 17 - 19

Oracle University Student Learning Subscription Use Only

Lesson Agenda

Adding Comments to a Table
You can add comments to a table or column by using the COMMENT
statement:
COMMENT ON TABLE employees
IS 'Employee Information';
COMMENT ON COLUMN employees.first_name
IS 'First name of the employee';

•

Comments can be viewed through the data dictionary views:
–
–
–
–

ALL_COL_COMMENTS
USER_COL_COMMENTS
ALL_TAB_COMMENTS
USER_TAB_COMMENTS

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

You can add a comment of up to 4,000 bytes about a column, table, view, or snapshot by using the
COMMENT statement. The comment is stored in the data dictionary and can be viewed in one of the
following data dictionary views in the COMMENTS column:
• ALL_COL_COMMENTS
• USER_COL_COMMENTS
• ALL_TAB_COMMENTS
• USER_TAB_COMMENTS
Syntax
COMMENT ON {TABLE table | COLUMN table.column}
IS 'text';
In the syntax:
• table
• column
• text

Is the name of the table
Is the name of the column in a table
Is the text of the comment

You can drop a comment from the database by setting it to empty string (''):
COMMENT ON TABLE employees IS '';

SQL Fundamentals 17 - 20

Oracle University Student Learning Subscription Use Only

•

Oracle users should read and write row or schema information to the base tables
contained in the SYS schema.
a. True
b. False

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Answer: b

SQL Fundamentals 17 - 21

Oracle University Student Learning Subscription Use Only

Q

Quiz

Which of the following types of information do the dictionary views that are
based on the dictionary tables contain?
a. Definitions of all the schema objects in the database
b. Default values for the columns
c. Integrity constraint information
d. Privileges and roles that each user has been granted
e. All of the above

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Answer: e

SQL Fundamentals 17 - 22

Oracle University Student Learning Subscription Use Only

Q

Quiz

In this lesson, you should have learned how to find information about your
objects through the following dictionary views:
• DICTIONARY
• USER_OBJECTS
• USER_TABLES
• USER_TAB_COLUMNS
• USER_CONSTRAINTS
• USER_CONS_COLUMNS

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

In this lesson, you learned about some of the dictionary views that are available to you. You can use
these dictionary views to find information about your tables, constraints, views, sequences, and
synonyms.

SQL Fundamentals 17 - 23

Oracle University Student Learning Subscription Use Only

Summary

This practice covers the following topics:
• Querying the dictionary views for table and column information
• Querying the dictionary views for constraint information

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

In this practice, you query the dictionary views to find information about objects in your schema.

SQL Fundamentals 17 - 24

Oracle University Student Learning Subscription Use Only

Practice 17: Overview

Lesson 18: Creating Views

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Oracle University Student Learning Subscription Use Only

18

Course Roadmap
Lesson 1: Course Overview

You are here.

Unit 2: Retrieving and Sorting Data

Lesson 17: Introduction to Data Dictionary
Views

Unit 3: Joins, Subqueries, and Set
Operators

Lesson 18: Creating Views

Unit 4: DML and DDL

Lesson 19: Creating Sequences,
Synonyms, and Indexes

Unit 5: Managing Relational Database

Unit 6: Advance Queries and Database
Management System

Lesson 20: Managing Constraints,
Temporary Tables, and External Tables

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

In Unit 5, you are introduced to views. You learn to:
• Query data dictionary views
• Create sequences, synonyms, and indexes
• Manage constraints and tables

SQL Fundamentals 18 - 2

Oracle University Student Learning Subscription Use Only

Unit 1: Relational Database and SQL
Overview

After completing this lesson, you should be able to:
• Create simple and complex views
• Retrieve data from views
• Query the data dictionary for view information

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

In this lesson, you are introduced to views, and you learn the basics of creating and using views.

SQL Fundamentals 18 - 3

Oracle University Student Learning Subscription Use Only

Objectives

•
•
•
•

Overview of views
Creating, modifying, and retrieving data from a view
Data Manipulation Language (DML) operations on a view
Dropping a view

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

SQL Fundamentals 18 - 4

Oracle University Student Learning Subscription Use Only

Lesson Agenda

Database Objects
Description

Table

Is the basic unit of storage; composed of rows

View

Logically represents subsets of data from one or more tables

Sequence
Index
Synonym

Generates numeric values
Improves the performance of some queries
Gives alternative names to objects

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

There are several other objects in a database in addition to tables.
With views, you can present and hide data from the tables.
Many applications require the use of unique numbers as primary key values. You can either build
code into the application to handle this requirement or use a sequence to generate unique numbers.
If you want to improve the performance of data retrieval queries, you should consider creating an
index. You can also use indexes to enforce uniqueness on a column or a collection of columns.
You can provide alternative names for objects by using synonyms.

SQL Fundamentals 18 - 5

Oracle University Student Learning Subscription Use Only

Object

A view:
• Is a schema object
• Presents logical
subsets of data
• Is a stored SELECT
statement based on a
table or another view
• Contains no data of
its own

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

You can present logical subsets or combinations of data by creating views of tables. A view is a
schema object, a stored SELECT statement based on a table or another view. A view contains no
data of its own, but is like a window through which data from tables can be viewed or changed. The
tables on which a view is based are called base tables. The view is stored as a SELECT statement in
the data dictionary.

SQL Fundamentals 18 - 6

Oracle University Student Learning Subscription Use Only

Views

Advantages of Views

Provides data
independence

Hides the complexity
of queries

Presents different views of the same data
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

•
•

•
•

Views restrict access to data because they display selected columns from the table.
Views can be used to make simple queries to retrieve the results of complicated queries. For
example, views can be used to query information from multiple tables without the user knowing
how to write a join statement.
Views provide data independence for ad hoc users and application programs. One view can be
used to retrieve data from several tables.
Views provide groups of users access to data according to their particular criteria.

For more information, see the “CREATE VIEW” section in Oracle Database SQL Language Reference
for Oracle Database 12c.

SQL Fundamentals 18 - 7

Oracle University Student Learning Subscription Use Only

Restricts access to data

Feature

Simple Views

Complex Views

Number of tables

One

One or more

Contain functions

No

Yes

Contain groups of data

No

Yes

DML operations through a view

Yes

Not always

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

There are two classifications for views: simple and complex. The basic difference is related to the
DML (INSERT, UPDATE, and DELETE) operations.
•

•

A simple view is one that:
- Derives data from only one table
- Contains no functions or groups of data
- Usually performs DML operations through the view
A complex view is one that:
- Derives data from many tables
- Contains functions or groups of data
- Does not always allow DML operations through the view

SQL Fundamentals 18 - 8

Oracle University Student Learning Subscription Use Only

Simple Views and Complex Views

•
•
•
•

Overview of views
Creating, modifying, and retrieving data from a view
Data Manipulation Language (DML) operations on a view
Dropping a view

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

SQL Fundamentals 18 - 9

Oracle University Student Learning Subscription Use Only

Lesson Agenda

Creating a View

Embed a
subquery to
create a view.

Creates the view only if the base
tables exist(default)

CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW view
[(alias[, alias]...)]
AS subquery
[WITH CHECK OPTION [CONSTRAINT constraint]]
[WITH READ ONLY [CONSTRAINT constraint]];

Specifies that only those rows that
are accessible to the view can be
inserted or updated

Ensures that no
DML operations
can be performed
on the view

Name of
the view

Specify the name of the
READ ONLY or CHECK
OPTION constraint.

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

You can create a view by embedding a subquery in the CREATE VIEW statement.
In the syntax:
OR REPLACE
Re-creates the view if it already exists. You can use this clause to
change the definition of an existing view without dropping, re-creating,
and regranting the object privileges previously granted on it.
FORCE
Creates the view whether or not the base tables exist
NOFORCE
Creates the view only if the base tables exist (This is the default.)
view
Is the name of the view
alias
Specifies names for the expressions selected by the view’s query (The
number of aliases must match the number of expressions selected by the
view.)
subquery
Is a complete SELECT statement (You can use aliases for the columns in
the SELECT list.)
WITH CHECK OPTION
Specifies that only those rows that are accessible to the view can be
inserted or updated
Constraint
Is the name assigned to the CHECK OPTION or READ ONLY constraint.
If you do not specify this, the system automatically assigns the
constraint a name of the form SYS_Cn, where n is an integer that makes
the constraint name unique within the database.
WITH READ ONLY
Ensures that no DML operations can be performed on this view
Note: In SQL Developer, click the Run Script icon or press F5 to run the data definition language
(DDL) statements. The feedback messages will be shown on the Script Output tabbed page.

SQL Fundamentals 18 - 10

Oracle University Student Learning Subscription Use Only

Re-creates a view if it already
exists; used to re-define an existing
view

Creating a View
Create the EMPVU80 view, which contains details of the employees in
department 80:
CREATE VIEW
empvu80
AS SELECT employee_id, last_name, salary
FROM
employees
WHERE
department_id = 80;

•

Describe the structure of the view:
DESCRIBE empvu80;

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

The example in the slide creates a view that contains the employee number, last name, and salary
for each employee in department 80.
You can display the structure of the view by using the DESCRIBE command.
Guidelines
• The subquery that defines a view can contain complex SELECT syntax, including joins, groups,
and subqueries.
• If you do not specify a constraint name for the view that is created with the WITH CHECK
OPTION, the system assigns a default name in the SYS_Cn format.
• You can use the OR REPLACE option to change the definition of the view without dropping and
re-creating it, or regranting the object privileges previously granted on it.

SQL Fundamentals 18 - 11

Oracle University Student Learning Subscription Use Only

•

Creating a View
Create a view by using column aliases in the subquery:
CREATE VIEW salvu50
AS SELECT employee_id ID_NUMBER, last_name NAME,
salary*12 ANN_SALARY
FROM
employees
WHERE
department_id = 50;

•

Select the columns from this view by using the given alias names.

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

You can control the column names by including column aliases in the subquery.
The example in the slide creates a view containing the employee number (EMPLOYEE_ID) with the
alias ID_NUMBER, name (LAST_NAME) with the alias NAME, and annual salary (SALARY) with the
alias ANN_SALARY for every employee in department 50.
Alternatively, you can use an alias after the CREATE statement and before the SELECT subquery.
The number of aliases listed must match the number of expressions selected in the subquery.
CREATE OR REPLACE VIEW salvu50 (ID_NUMBER, NAME, ANN_SALARY)
AS SELECT employee_id, last_name, salary*12
FROM
employees
WHERE
department_id = 50;

SQL Fundamentals 18 - 12

Oracle University Student Learning Subscription Use Only

•

Retrieving Data from a View
SELECT name, ann_salary FROM salvu50;

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

You can retrieve data from a view as you would from any table. You can display either the contents of
the entire view or just specific rows and columns. You select the columns from the view by using the
given alias names.

SQL Fundamentals 18 - 13

Oracle University Student Learning Subscription Use Only

SELECT * FROM salvu50;

•

Modify the EMPVU80 view by using a CREATE OR REPLACE VIEW clause.

•

Add an alias for each column name in the same order as the columns in the
subquery.
CREATE OR REPLACE VIEW empvu80
(id_number, name, sal, department_id)
AS SELECT employee_id, first_name || ' '
|| last_name, salary, department_id
FROM
employees
WHERE
department_id = 80;

Note that the employee’s first_name
and last_name columns are
concatenated as the name column in
the view.
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

With the REPLACE option, a view can be created even if one exists with this name already, thus
replacing the old version of the view for its owner. This means that the view can be altered without
dropping, re-creating, and regranting object privileges.
Note: When assigning column aliases in the CREATE OR REPLACE VIEW clause, remember that the
aliases are listed in the same order as the columns in the subquery.

SQL Fundamentals 18 - 14

Oracle University Student Learning Subscription Use Only

Modifying a View

Creating a Complex View

CREATE OR REPLACE VIEW dept_sum_vu
(name, minsal, maxsal, avgsal)
AS SELECT
d.department_name, MIN(e.salary),
MAX(e.salary),AVG(e.salary)
FROM
employees e JOIN departments d
USING
(department_id)
GROUP BY d.department_name;

Structure of the view

Data from the view

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

The example in the slide creates a complex view of department names, minimum salaries, maximum
salaries, and the average salaries by department. Note that alternative names have been specified
for the view. This is a requirement if any column of the view is derived from a function or an
expression.
You can view the structure of the view by using the DESCRIBE command. Display the contents of the
view by issuing a SELECT statement.
SELECT * FROM
dept_sum_vu;

SQL Fundamentals 18 - 15

Oracle University Student Learning Subscription Use Only

Create a complex view that contains group functions to display values from two
tables:

View Information
DESCRIBE user_views

2

SELECT view_name FROM user_views;

…
3

SELECT text FROM user_views
WHERE view_name = 'EMP_DETAILS_VIEW';

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

After your view is created, you can query the data dictionary view called USER_VIEWS to see the
name of the view and the view definition. The text of the SELECT statement that constitutes your view
is stored in a LONG column. The TEXT_LENGTH column is the number of characters in the SELECT
statement. By default, when you select from a LONG column, only the first 80 characters of the
column’s value are displayed. To see more than 80 characters in SQL*Plus, use the SET LONG
command:
SET LONG 1000
In the examples in the slide:
1. The USER_VIEWS columns are displayed. Note that this is a partial listing.
2. The names of your views are retrieved
3. The SELECT statement for the EMP_DETAILS_VIEW is displayed from the dictionary
Data Access Using Views
When you access data by using a view, the Oracle server performs the following operations:
• It retrieves the view definition from the data dictionary table USER_VIEWS.
•
•

It checks access privileges for the view base table.
It converts the view query into an equivalent operation on the underlying base table or tables.
That is, data is retrieved from, or an update is made to, the base tables.

SQL Fundamentals 18 - 16

Oracle University Student Learning Subscription Use Only

1

•
•
•
•

Overview of views
Creating, modifying, and retrieving data from a view
Data Manipulation Language (DML) operations on a view
Dropping a view

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

SQL Fundamentals 18 - 17

Oracle University Student Learning Subscription Use Only

Lesson Agenda

•
•

You can usually perform DML operations on
simple views.
You cannot remove a row if the view contains the following:
–
–
–
–

Group functions
A GROUP BY clause
The DISTINCT keyword
The pseudocolumn ROWNUM keyword

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

•
•

You can perform DML operations on data through a view if those operations follow certain rules.
You can remove a row from a view unless it contains any of the following:
- Group functions
- A GROUP BY clause
- The DISTINCT keyword
- The pseudocolumn ROWNUM keyword

SQL Fundamentals 18 - 18

Oracle University Student Learning Subscription Use Only

Rules for Performing DML Operations on a View

You cannot modify data in a view if it contains:
• Group functions
• A GROUP BY clause
• The DISTINCT keyword
• The pseudocolumn ROWNUM keyword
•

Expressions

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

You can modify data through a view unless it contains any of the conditions mentioned in the slide.

SQL Fundamentals 18 - 19

Oracle University Student Learning Subscription Use Only

Rules for Performing DML Operations on a View

You cannot add data through a view if the view includes:
• Group functions
• A GROUP BY clause
• The DISTINCT keyword
• The pseudocolumn ROWNUM keyword
•
•

Columns defined by expressions
NOT NULL columns without a default value in the base tables that are not
selected by the view

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

You can add data through a view unless it contains any of the items listed in the slide. You cannot
add data to a view if the view contains NOT NULL columns without default values in the base table. All
the required values must be present in the view. Remember that you are adding values directly to the
underlying table through the view.
For more information, see the “CREATE VIEW” section in Oracle Database SQL Language Reference
for Oracle Database 12c.

SQL Fundamentals 18 - 20

Oracle University Student Learning Subscription Use Only

Rules for Performing DML Operations on a View

Using the WITH CHECK OPTION Clause
You can ensure that DML operations performed on the view stay in the
domain of the view by using the WITH CHECK OPTION clause:
CREATE OR REPLACE VIEW empvu20
AS SELECT *
FROM
employees
WHERE
department_id = 20
WITH CHECK OPTION CONSTRAINT empvu20_ck ;

•

Any attempt to INSERT a row with a department_id other than 20 or to
UPDATE the department number for any row in the view fails because it
violates the WITH CHECK OPTION.

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

It is possible to perform referential integrity checks through views. You can also enforce constraints at
the database level. The view can be used to protect data integrity, but the use is very limited.
The WITH CHECK OPTION clause specifies that INSERTs and UPDATEs performed through the view
cannot create rows that the view cannot select. Therefore, it enables integrity constraints and data
validation checks to be enforced on data being inserted or updated. If there is an attempt to perform
DML operations on rows that the view has not selected, an error is displayed, along with the
constraint name if it has been specified.

SQL Fundamentals 18 - 21

Oracle University Student Learning Subscription Use Only

•

Using the WITH CHECK OPTION Clause
Attempt to update department_id to 10 for employee_id 201 returns an
error:
UPDATE empvu20
SET
department_id = 10
WHERE employee_id = 201;

•

Error is returned because if the department number were to change to 10,
the view would no longer be able to see that employee.

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

With the WITH CHECK OPTION clause, the view can see only the employees in department 20 and
does not allow the department number for those employees to be changed through the view.

SQL Fundamentals 18 - 22

Oracle University Student Learning Subscription Use Only

•

•
•

You can ensure that no DML operations occur by adding the WITH READ
ONLY option to your view definition.
Any attempt to perform a DML operation on any row in the view results in an
Oracle server error.

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

You can ensure that no DML operations occur on your view by creating it with the WITH READ ONLY
option. The example in the next slide modifies the EMPVU10 view to prevent any DML operations on
the view.

SQL Fundamentals 18 - 23

Oracle University Student Learning Subscription Use Only

Denying DML Operations

CREATE OR REPLACE VIEW empvu10
(employee_number, employee_name, job_title)
AS SELECT employee_id, last_name, job_id
FROM
employees
WHERE
department_id = 10
WITH READ ONLY ;

DELETE FROM empvu10
WHERE employee_number = 200;

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Any attempt to remove a row from a view with a read-only constraint results in an error.
Similarly, any attempt to insert a row or modify a row by using a view with a read-only constraint
results in the same error.

SQL Fundamentals 18 - 24

Oracle University Student Learning Subscription Use Only

Denying DML Operations

•
•
•
•

Overview of views
Creating, modifying, and retrieving data from a view
Data Manipulation Language (DML) operations on a view
Dropping a view

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

SQL Fundamentals 18 - 25

Oracle University Student Learning Subscription Use Only

Lesson Agenda

•
•

You can remove a view without losing the underlying base tables.
The Drop View statement removes only the view definition from the
database.
DROP VIEW view;
DROP VIEW empvu80;

•

Views or other applications based on the deleted view become invalid.

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

You use the DROP VIEW statement to remove a view. The statement removes the view definition from
the database. However, dropping views has no effect on the tables on which the view was based.
Alternatively, views or other applications based on the deleted views become invalid. Only the creator
or a user with the DROP ANY VIEW privilege can remove a view.
In the syntax, view is the name of the view.

SQL Fundamentals 18 - 26

Oracle University Student Learning Subscription Use Only

Removing a View

Views store the selected data rows from the underlying base tables.
a. True
b. False

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Answer: b

SQL Fundamentals 18 - 27

Oracle University Student Learning Subscription Use Only

Q

Quiz

Q

Quiz

a. True
b. False

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Answer: a

SQL Fundamentals 18 - 28

Oracle University Student Learning Subscription Use Only

You cannot add data through a view if the view includes a GROUP BY clause.

In the CREATE VIEW statement syntax, which one of the following options
enables you to change the definition of an existing view without dropping or
re-creating it.
a. FORCE/NO FORCE
b. WITH CHECK OPTION
c. CREATE OR REPLACE

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Answer: c

SQL Fundamentals 18 - 29

Oracle University Student Learning Subscription Use Only

Quiz

You can query the data dictionary view called USER_VIEWS to see the names of
the views and view definitions.
a. True
b. False

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Answer: a

SQL Fundamentals 18 - 30

Oracle University Student Learning Subscription Use Only

Quiz

In this lesson, you should have learned how to:
• Create, use, and remove views
• Query the data dictionary for view information

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

In this lesson, you should have learned about views.

SQL Fundamentals 18 - 31

Oracle University Student Learning Subscription Use Only

Summary

This practice covers the following topics:
• Creating a simple view
• Creating a complex view
• Creating a view with a check constraint
• Attempting to modify data in the view
• Querying the dictionary views for view information
• Removing views

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

The practice provides you with a variety of exercises in creating, using, querying data dictionary
views for view information, and removing views.

SQL Fundamentals 18 - 32

Oracle University Student Learning Subscription Use Only

Practice 18: Overview

Lesson 19: Creating Sequences,
Synonyms, and Indexes

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Oracle University Student Learning Subscription Use Only

19

Course Roadmap
Lesson 1: Course Overview

You are here

Unit 2: Retrieving and Sorting Data

Lesson 17: Introduction to Data Dictionary
Views

Unit 3: Joins, Subqueries, and Set
Operators

Lesson 18: Creating Views

Unit 4: DML and DDL

Lesson 19: Creating Sequences,
Synonyms, and Indexes

Unit 5: Managing Relational Database

Unit 6: Advance Queries and Database
Management System

Lesson 20: Managing Constraints,
Temporary Tables, and External Tables

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

In Unit 5, you are introduced to views. You learn to:
•
•

Query data dictionary views
Create sequences, synonyms, and indexes

•

Manage constraints and tables

SQL Fundamentals 19 - 2

Oracle University Student Learning Subscription Use Only

Unit 1: Relational Database and SQL
Overview

After completing this lesson, you should be able to:
• Create, maintain, and use sequences
• Create private and public synonyms
• Create and maintain indexes
• Query various data dictionary views to find information for
sequences, synonyms, and indexes

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

In this lesson, you are introduced to the sequence, synonyms, and index objects. You learn the
basics of creating and using sequences, synonyms, and indexes.

SQL Fundamentals 19 - 3

Oracle University Student Learning Subscription Use Only

Objectives

Lesson Agenda
Overview of sequences:
–
–
–
–

•

Overview of synonyms
–

•

Creating, using, and modifying a sequence
Caching sequence values
NEXTVAL and CURRVAL pseudocolumns
SQL column defaulting using a sequence
Creating and dropping synonyms

Overview of indexes
–
–
–
–
–

Creating indexes
Using the CREATE TABLE statement
Creating function-based indexes
Creating multiple indexes on the same set of columns
Removing indexes
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

SQL Fundamentals 19 - 4

Oracle University Student Learning Subscription Use Only

•

Database Objects
Description

Table

Is the basic unit of storage; composed of rows

View

Logically represents subsets of data from one or more tables

Sequence
Index
Synonym

Generates numeric values
Improves the performance of some queries
Gives alternative names to objects

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

There are several other objects in a database in addition to tables.
With views, you can present and hide data from the tables.
Many applications require the use of unique numbers as primary key values. You can either build
code into the application to handle this requirement or use a sequence to generate unique numbers.
If you want to improve the performance of data retrieval queries, you should consider creating an
index. You can also use indexes to enforce uniqueness on a column or a collection of columns.
You can provide alternative names for objects by using synonyms.

SQL Fundamentals 19 - 5

Oracle University Student Learning Subscription Use Only

Object

•
•

Tables belonging to other users are not in the user’s schema.
You should use the owner’s name as a prefix to those tables.

USERA
SELECT *
FROM userB.employees;

USERB
SELECT *
FROM userA.employees;

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

A schema is a collection of logical structures of data or schema objects. A schema is owned by a
database user and has the same name as that user. Each user owns a single schema.
Schema objects can be created and manipulated with SQL and include tables, views, synonyms,
sequences, stored procedures, indexes, clusters, and database links.
If a table does not belong to the user, the owner’s name must be prefixed to the table. For example, if
there are schemas named USERA and USERB, and both have an EMPLOYEES table, if USERA wants
to access the EMPLOYEES table that belongs to USERB, USERA must prefix the table name with the
schema name:
SELECT *
FROM
userb.employees;
If USERB wants to access the EMPLOYEES table that is owned by USERA, USERB must prefix the table
name with the schema name:
SELECT *
FROM
usera.employees;

SQL Fundamentals 19 - 6

Oracle University Student Learning Subscription Use Only

Referencing Another User’s Tables

A sequence:
• Can automatically generate unique numbers
• Is a shareable object
• Can be used to create a primary key value
• Replaces application code
• Speeds up the efficiency of accessing sequence
values when cached in memory

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

A sequence is a user-created database object that can be shared by multiple users to generate
integers. You can define a sequence to generate unique values or to recycle and use the same
numbers again.
A typical usage for sequences is to create a primary key value, which must be unique for each row. A
sequence is generated and incremented (or decremented) by an internal Oracle routine. This can be
a time-saving object, because it can reduce the amount of application code needed to write a
sequence-generating routine.
Sequence numbers are stored and generated independent of tables. Therefore, the same sequence
can be used for multiple tables.

SQL Fundamentals 19 - 7

Oracle University Student Learning Subscription Use Only

Sequence

CREATE SEQUENCE Statement: Syntax

First sequence
number to be
generated
Specifies whether the
sequence continues to
generate values after
reaching its maximum
or minimum value

CREATE SEQUENCE [ schema. ] sequence
[ { START WITH|INCREMENT BY } integer
| { MAXVALUE integer | NOMAXVALUE }
| { MINVALUE integer | NOMINVALUE }
| { CYCLE | NOCYCLE }
| { CACHE integer | NOCACHE }
| { ORDER | NOORDER }
];

Specifies the
interval between
sequence numbers
Specifies how many
values the Oracle
Server pre-allocates
and keeps in memory

Specify ORDER to guarantee that sequence
numbers are generated in order of request.
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Automatically generate sequential numbers by using the CREATE SEQUENCE statement.
In the syntax:
Sequence
START WITH n
INCREMENT BY n
MAXVALUE n
NOMAXVALUE

MINVALUE n
NOMINVALUE

Is the name of the sequence generator
Specifies the first sequence number to be generated (If this clause is
omitted, the sequence starts with 1.)
Specifies the interval between sequence numbers, where n is an
integer (If this clause is omitted, the sequence increments by 1.)
Specifies the maximum value the sequence can generate
Specifies a maximum value of 10^27 for an ascending
sequence and –1 for a descending sequence (This is the default
option.)
Specifies the minimum sequence value
Specifies a minimum value of 1 for an ascending
sequence and –(10^26) for a descending sequence (This is the
default option.)

SQL Fundamentals 19 - 8

Oracle University Student Learning Subscription Use Only

Define a sequence to generate sequential numbers automatically:

Specify ORDER to guarantee that sequence numbers are
generated in order of request. This clause is useful if you
are using the sequence numbers as time stamps.

NOORDER

Specify NOORDER if you do not want to guarantee that
sequence numbers are generated in order of request. This
is the default.

CYCLE | NOCYCLE

Specifies whether the sequence continues to generate
values after reaching its maximum or minimum value
(NOCYCLE is the default option.)

CACHE n | NOCACHE

Specifies how many values the Oracle Server preallocates and keeps in memory (By default, the Oracle
server caches 20 values.)

SQL Fundamentals 19 - 9

Oracle University Student Learning Subscription Use Only

ORDER

•
•

Create a sequence named DEPT_DEPTID_SEQ to be used for the primary
key of the DEPARTMENTS table.
Do not use the CYCLE option.
CREATE SEQUENCE dept_deptid_seq
START WITH 280
INCREMENT BY 10
MAXVALUE 9999
NOCACHE;

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

The example in the slide creates a sequence named DEPT_DEPTID_SEQ to be used for the
DEPARTMENT_ID column of the DEPARTMENTS table. The sequence starts at 280 and increments by
10, its maximum value is 9999, and it does not allow caching.
Do not use the CYCLE option if the sequence is used to generate primary key values, unless you
have a reliable mechanism that purges old rows faster than the sequence cycles.
For more information, see the “CREATE SEQUENCE” section in the Oracle Database SQL Language
Reference for Oracle Database 12c.
Note: The sequence is not tied to a table. Generally, you should name the sequence after its
intended use. However, the sequence can be used anywhere, regardless of its name.

SQL Fundamentals 19 - 10

Oracle University Student Learning Subscription Use Only

Creating a Sequence: Example

•
•
•

NEXTVAL returns the next available sequence value. It returns a unique
value every time it is referenced, even for different users.
CURRVAL obtains the current sequence value.
NEXTVAL must be issued for that sequence before CURRVAL contains a
value.

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

After you create your sequence, sequential numbers are generated for use in your tables. Reference
the sequence values by using the NEXTVAL and CURRVAL pseudocolumns.
The NEXTVAL pseudocolumn is used to extract successive sequence numbers from a specified
sequence. You must qualify NEXTVAL with the sequence name. When you reference
sequence.NEXTVAL, a new sequence number is generated and the current sequence number is
placed in CURRVAL.
The CURRVAL pseudocolumn is used to refer to a sequence number that the current user has just
generated. However, NEXTVAL must be used to generate a sequence number in the current user’s
session before CURRVAL can be referenced. You must qualify CURRVAL with the sequence name.
When you reference sequence.CURRVAL, the last value returned to that user’s process is
displayed.

SQL Fundamentals 19 - 11

Oracle University Student Learning Subscription Use Only

NEXTVAL and CURRVAL Pseudocolumns

You can use NEXTVAL and CURRVAL in the following contexts:
• The SELECT list of a SELECT statement that is not part of a subquery
• The SELECT list of a subquery in an INSERT statement
• The VALUES clause of an INSERT statement
• The SET clause of an UPDATE statement
You cannot use NEXTVAL and CURRVAL in the following contexts:
• The SELECT list of a view
• A SELECT statement with the DISTINCT keyword
• A SELECT statement with the GROUP BY, HAVING, or ORDER BY clauses
• A subquery in a SELECT, DELETE, or UPDATE statement
For more information, see the “Pseudocolumns” and “CREATE SEQUENCE” sections in Oracle
Database SQL Language Reference for Oracle Database 12c.

SQL Fundamentals 19 - 12

Oracle University Student Learning Subscription Use Only

Rules for Using NEXTVAL and CURRVAL

Using a Sequence
Insert a new department named “Support” in location ID 2500:
INSERT INTO departments(department_id,
department_name, location_id)
VALUES
(dept_deptid_seq.NEXTVAL,
'Support', 2500);

•

View the current value for the DEPT_DEPTID_SEQ sequence:
SELECT
FROM

dept_deptid_seq.CURRVAL
dual;

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

The example in the slide inserts a new department in the DEPARTMENTS table. It uses the
DEPT_DEPTID_SEQ sequence to generate a new department number as follows.
You can view the current value of the sequence by using sequence_name.CURRVAL, as shown in the
second example in the slide.
Suppose that you now want to hire employees to staff the new department. The INSERT statement to
be executed for all new employees can include the following code:
INSERT INTO employees (employee_id, department_id, ...)
VALUES (employees_seq.NEXTVAL, dept_deptid_seq .CURRVAL, ...);
Note: The preceding example assumes that a sequence called EMPLOYEE_SEQ has already been
created to generate new employee numbers.

SQL Fundamentals 19 - 13

Oracle University Student Learning Subscription Use Only

•

•

•

The SQL syntax for column defaults allows .nextval and
.currval as a SQL column defaulting expression for
numeric columns, where  is an Oracle database sequence.
The DEFAULT expression can include the sequence pseudocolumns
CURRVAL and NEXTVAL, as long as the sequence exists and you have the
privileges necessary to access it.
CREATE SEQUENCE s1 START WITH 1;
CREATE TABLE emp (a1 NUMBER DEFAULT s1.NEXTVAL NOT
NULL, a2 VARCHAR2(10));
INSERT INTO emp (a2) VALUES ('john');
INSERT INTO emp (a2) VALUES ('mark');
SELECT * FROM emp;

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

The SQL syntax for column defaults has been enhanced so that it allows .nextval
and .currval as a SQL column defaulting expression for numeric columns, where
 is an Oracle database sequence.
The DEFAULT expression can include the sequence pseudocolumns CURRVAL and NEXTVAL, as
long as the sequence exists and you have the privileges necessary to access it. The user that is
inserting into a table must have access privileges to the sequence. If the sequence is dropped,
subsequent insert DMLs where expr is used for defaulting will result in a compilation error.
In the slide example, sequence s1 is created, which starts from 1.

SQL Fundamentals 19 - 14

Oracle University Student Learning Subscription Use Only

SQL Column Defaulting Using a Sequence

•
•

Caching sequence values in memory gives faster access to those values.
Gaps in sequence values can occur when:
–
–
–

A rollback occurs
The system crashes
A sequence is used in another table

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

You can cache sequences in memory to provide faster access to those sequence values. The cache
is populated the first time you refer to the sequence. Each request for the next sequence value is
retrieved from the cached sequence. After the last sequence value is used, the next request for the
sequence pulls another cache of sequences into memory.
Gaps in the Sequence
Although sequence generators issue sequential numbers without gaps, this action occurs
independently of a commit or rollback. Therefore, if you roll back a statement containing a sequence,
the number is lost.
Another event that can cause gaps in the sequence is a system crash. If the sequence caches values
in memory, those values are lost if the system crashes.
Because sequences are not tied directly to tables, the same sequence can be used for multiple
tables. However, if you do so, each table can contain gaps in the sequential numbers.

SQL Fundamentals 19 - 15

Oracle University Student Learning Subscription Use Only

Caching Sequence Values

Modifying a Sequence

ALTER SEQUENCE dept_deptid_seq
INCREMENT BY 20
MAXVALUE 999999
NOCACHE
NOCYCLE;

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

If you reach the MAXVALUE limit for your sequence, no additional values from the sequence are
allocated and you receive an error indicating that the sequence exceeds MAXVALUE. To continue to
use the sequence, you can modify it by using the ALTER SEQUENCE statement.
Syntax
ALTER SEQUENCE
sequence
[INCREMENT BY n]
[{MAXVALUE n | NOMAXVALUE}]
[{MINVALUE n | NOMINVALUE}]
[{CYCLE | NOCYCLE}]
[{CACHE n | NOCACHE}];
In the syntax, sequence is the name of the sequence generator.
For more information, see the section on “ALTER SEQUENCE” in Oracle Database SQL Language
Reference for Oracle Database 12c.

SQL Fundamentals 19 - 16

Oracle University Student Learning Subscription Use Only

You can change the increment value, maximum value, minimum value, cycle
option, or cache option:

•

You must be the owner or have the ALTER privilege for the sequence.

•
•

Only future sequence numbers are affected.
The sequence must be dropped and re-created to restart the sequence at a
different number.
Some validation is performed.
To remove a sequence, use the DROP statement:

•
•

DROP SEQUENCE dept_deptid_seq;

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

•
•
•
•

•

You must be the owner or have the ALTER privilege for the sequence to modify it. You must be
the owner or have the DROP ANY SEQUENCE privilege to remove it.
Only future sequence numbers are affected by the ALTER SEQUENCE statement.
The START WITH option cannot be changed by using ALTER SEQUENCE. The sequence must
be dropped and re-created to restart the sequence at a different number.
Some validation is performed. For example, a new MAXVALUE that is less than the current
sequence number cannot be imposed.
ALTER SEQUENCE dept_deptid_seq
INCREMENT BY 20
MAXVALUE 90
NOCACHE
NOCYCLE;
The error:
SQL Error: ORA-04009: MAXVALUE cannot be made to be less than the current value
04009. 00000 - "MAXVALUE cannot be made to be less than the current value"
*Cause: the current value exceeds the given MAXVALUE
*Action: make sure that the new MAXVALUE is larger than the current value

SQL Fundamentals 19 - 17

Oracle University Student Learning Subscription Use Only

Guidelines for Modifying a Sequence

Sequence Information
The USER_SEQUENCES view describes all the sequences that you own.
Verify your sequence values in the USER_SEQUENCES data dictionary table.
SELECT sequence_name, min_value, max_value,
increment_by, last_number
FROM user_sequences;

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

The USER_SEQUENCES view describes all the sequences that you own. When you create a
sequence, you specify criteria that are stored in the USER_SEQUENCES view. The columns in this
view are:
• SEQUENCE_NAME: Name of the sequence
• MIN_VALUE: Minimum value of the sequence
• MAX_VALUE: Maximum value of the sequence
• INCREMENT_BY: Value by which the sequence is incremented
• CYCLE_FLAG: Whether sequence wraps around on reaching the limit
• ORDER_FLAG: Whether sequence numbers are generated in order
• CACHE_SIZE: Number of sequence numbers to cache
• LAST_NUMBER: Last sequence number written to disk. If a sequence uses caching, the number
written to disk is the last number placed in the sequence cache. This number is likely to be
greater than the last sequence number that was used. The LAST_NUMBER column displays the
next available sequence number if NOCACHE is specified.
After creating your sequence, it is documented in the data dictionary. Because a sequence is a
database object, you can identify it in the USER_OBJECTS data dictionary table.
You can also confirm the settings of the sequence by selecting from the USER_SEQUENCES data
dictionary view.

SQL Fundamentals 19 - 18

Oracle University Student Learning Subscription Use Only

•
•

Lesson Agenda
Overview of sequences:
–
–
–
–

•

Overview of synonyms
–

•

Creating, using, and modifying a sequence
Caching sequence values
NEXTVAL and CURRVAL pseudocolumns
SQL column defaulting using a sequence
Creating and dropping synonyms

Overview of indexes
–
–
–
–
–

Creating indexes
Using the CREATE TABLE statement
Creating function-based indexes
Creating multiple indexes on the same set of columns
Removing indexes
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

SQL Fundamentals 19 - 19

Oracle University Student Learning Subscription Use Only

•

A synonym:
• Is a database object
• Can be created to give an alternative name to a
table or to another database object
• Requires no storage other than its definition in
the data dictionary
• Is useful for hiding the identity and location of an
underlying schema object

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Synonyms are database object that enable you to call a table by another name.
You can create synonyms to give an alternative name to a table or to another database object. For
example, you can create a synonym for a table or view, sequence, PL/SQL program unit, userdefined object type, or another synonym.
Because a synonym is simply an alias, it requires no storage other than its definition in the data
dictionary.
Synonyms can simplify SQL statements for database users. Synonyms are also useful for hiding the
identity and location of an underlying schema object.

SQL Fundamentals 19 - 20

Oracle University Student Learning Subscription Use Only

Synonyms

Simplify access to objects by creating a synonym (another name for an object).
With synonyms, you can:
• Create an easier reference to a table that is owned by another user
• Shorten lengthy object names
Creates a synonym that is
accessible to all users
CREATE [PUBLIC] SYNONYM synonym
FOR
object;
Identifies the object for which the
synonym is created

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

To refer to a table that is owned by another user, you need to prefix the table name with the name of
the user who created it, followed by a period. Creating a synonym eliminates the need to qualify the
object name with the schema, and provides you with an alternative name for a table, view, sequence,
procedure, or other objects. This method can be especially useful with lengthy object names, such as
views.
In the syntax:
PUBLIC
synonym
object

Creates a synonym that is accessible to all users
Is the name of the synonym to be created
Identifies the object for which the synonym is created

Guidelines
• The object cannot be contained in a package.
• A private synonym name must be distinct from all other objects that are owned by the same
user.
• To create a PUBLIC synonym, you must have the CREATE PUBLIC SYNONYM system privilege.
For more information, see the section on “CREATE SYNONYM” in Oracle Database SQL Language
Reference for Oracle Database 12c.

SQL Fundamentals 19 - 21

Oracle University Student Learning Subscription Use Only

Creating a Synonym for an Object

Creating and Removing Synonyms
Create a shortened name for the DEPT_SUM_VU view:
CREATE SYNONYM d_sum
FOR dept_sum_vu;

•

Drop a synonym:
DROP SYNONYM d_sum;

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Creating a Synonym
The slide example creates a synonym for the DEPT_SUM_VU view for quicker reference.
The database administrator can create a public synonym that is accessible to all users. The following
example creates a public synonym named DEPT for Alice’s DEPARTMENTS table:
CREATE PUBLIC SYNONYM dept
FOR
alice.departments;
Removing a Synonym
To remove a synonym, use the DROP SYNONYM statement. Only the database administrator can drop
a public synonym.
DROP PUBLIC SYNONYM dept;
For more information, see the section on “DROP SYNONYM” in Oracle Database SQL Language
Reference for Oracle Database 12c.

SQL Fundamentals 19 - 22

Oracle University Student Learning Subscription Use Only

•

Synonym Information
The USER_SYNONYMS dictionary view describes private synonyms
(synonyms that you own).
SELECT *
FROM
user_synonyms;

•

You can query ALL_SYNONYMS to find out the names of all the synonyms
that are available to you and the objects on which these synonyms apply.

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

The USER_SYNONYMS dictionary view describes private synonyms (synonyms that you own).
You can query this view to find your synonyms. You can query ALL_SYNONYMS to find out the names
of all the synonyms that are available to you and the objects on which these synonyms apply.
The columns in this view are:
• SYNONYM_NAME: Name of the synonym
• TABLE_OWNER: Owner of the object that is referenced by the synonym
• TABLE_NAME: Name of the table or view that is referenced by the synonym
• DB_LINK: Name of the database link reference (if any)
• ORIGIN_CON_ID: The ID of the container where the data originates. Refer to the documentation
for more information about this.

SQL Fundamentals 19 - 23

Oracle University Student Learning Subscription Use Only

•

Lesson Agenda
Overview of sequences:
–
–
–
–

•

Overview of synonyms
–

•

Creating, using, and modifying a sequence
Caching sequence values
NEXTVAL and CURRVAL pseudocolumns
SQL column defaulting using a sequence
Creating and dropping synonyms

Overview of indexes
–
–
–
–
–

Creating indexes
Using the CREATE TABLE statement
Creating function-based indexes
Creating multiple indexes on the same set of columns
Removing indexes
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

SQL Fundamentals 19 - 24

Oracle University Student Learning Subscription Use Only

•

An index:
• Is a schema object
• Can be used by the Oracle Server to speed up the
retrieval of rows by using a pointer
• Can reduce disk input/output (I/O) by using a rapid
path access method to locate data quickly
• Is dependent on the table that it indexes
• Is used and maintained automatically by the Oracle
Server

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

An Oracle Server index is a schema object that can speed up the retrieval of rows by using a pointer,
and improves the performance of some queries. Indexes can be created explicitly or automatically. If
you do not have an index on the column, a full table scan occurs.
An index provides direct and fast access to the rows in a table. Its purpose is to reduce disk I/O by
using an indexed path to locate data quickly. An index is used and maintained automatically by the
Oracle Server. After an index is created, no direct activity is required by the user.
Indexes are logically and physically independent of the data in the objects with which they are
associated. This means that they can be created or dropped at any time, and have no effect on the
base tables or other indexes.
Note: When you drop a table, the corresponding indexes are also dropped.
For more information, see the section on “Schema Objects: Indexes” in Oracle Database Concepts
12c Release 1.

SQL Fundamentals 19 - 25

Oracle University Student Learning Subscription Use Only

Indexes

•

Automatically: A unique index is created automatically when you define a
PRIMARY KEY or UNIQUE constraint in a table definition.

•

Manually: You can create unique or nonunique indexes on columns to
speed up access to the rows.

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

You can create two types of indexes.
• Unique index: The Oracle Server automatically creates this index when you define a column in
a table to have a PRIMARY KEY or a UNIQUE constraint. The name of the index is the name that
is given to the constraint.
• Nonunique index: This is an index that a user can create. For example, you can create the
FOREIGN KEY column index for a join in a query to improve the speed of retrieval.
Note: You can manually create a unique index, but it is recommended that you create a unique
constraint, which implicitly creates a unique index.

SQL Fundamentals 19 - 26

Oracle University Student Learning Subscription Use Only

How Are Indexes Created?

Creating an Index
Create an index on one or more columns:
Name of the column in the
table to be indexed

CREATE [UNIQUE]INDEX index
ON table (column[, column]...);

•

Improve the speed of query access to the LAST_NAME column in the
EMPLOYEES table:
CREATE INDEX emp_last_name_idx
ON employees(last_name);

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Create an index on one or more columns by issuing the CREATE INDEX statement.
In the syntax:
• index
• table
• Column

Is the name of the index
Is the name of the table
Is the name of the column in the table to be indexed

Specify UNIQUE to indicate that the value of the column (or columns) on which the index is based
must be unique. Specify BITMAP to indicate that the index is to be created with a bitmap for each
distinct key, rather than indexing each row separately. Bitmap indexes store the rowids associated
with a key value as a bitmap.
For more information, see the section on “CREATE INDEX” in Oracle Database SQL Language
Reference for Oracle Database 12c.

SQL Fundamentals 19 - 27

Oracle University Student Learning Subscription Use Only

•

CREATE TABLE NEW_EMP
(employee_id NUMBER(6)
PRIMARY KEY USING INDEX
(CREATE INDEX emp_id_idx ON
NEW_EMP(employee_id)),
first_name VARCHAR2(20),
last_name
VARCHAR2(25));

SELECT INDEX_NAME, TABLE_NAME
FROM
USER_INDEXES
WHERE TABLE_NAME = 'NEW_EMP';

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

In the example in the slide, the CREATE INDEX clause is used with the CREATE TABLE statement to
create a PRIMARY KEY index explicitly. You can name your indexes at the time of PRIMARY KEY
creation to be different from the name of the PRIMARY KEY constraint.
You can query the USER_INDEXES data dictionary view for information about your indexes.
The following example illustrates the database behavior if the index is not explicitly named:
CREATE TABLE EMP_UNNAMED_INDEX
(employee_id NUMBER(6) PRIMARY KEY ,
first_name VARCHAR2(20),
last_name VARCHAR2(25));
SELECT INDEX_NAME, TABLE_NAME
FROM
USER_INDEXES
WHERE TABLE_NAME = 'EMP_UNNAMED_INDEX';

Observe that the Oracle Server gives a generic name to the index that is created for the PRIMARY
KEY column.

SQL Fundamentals 19 - 28

Oracle University Student Learning Subscription Use Only

CREATE INDEX with the CREATE TABLE Statement

Step 1: Create the table:
CREATE TABLE NEW_EMP2
(employee_id NUMBER(6),
first_name VARCHAR2(20),
last_name
VARCHAR2(25)
);
Step 2: Create the index:
CREATE INDEX emp_id_idx2 ON
new_emp2(employee_id);
Step 3: Create the PRIMARY KEY:
ALTER TABLE new_emp2 ADD PRIMARY KEY (employee_id) USING
INDEX emp_id_idx2;

SQL Fundamentals 19 - 29

Oracle University Student Learning Subscription Use Only

You can also use an existing index for your PRIMARY KEY column—for example, when you
are expecting a large data load and want to speed up the operation. You may want to disable
the constraints while performing the load, and then enable them, in which case having a
unique index on the PRIMARY KEY will still cause the data to be verified during the load.
Therefore, you can first create a nonunique index on the column that is designated as
PRIMARY KEY, and then create the PRIMARY KEY column and specify that it should use the
existing index. The following examples illustrate this process:

•
•

A function-based index is based on expressions.
The index expression is built from table columns, constants, SQL functions,
and user-defined functions.
CREATE INDEX upper_dept_name_idx
ON dept2(UPPER(department_name));

SELECT *
FROM
dept2
WHERE UPPER(department_name) = 'SALES';

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Function-based indexes that are defined with the UPPER(column_name)or LOWER(column_name)
keywords allow non-case-sensitive searches. For example, consider the following index:
CREATE INDEX upper_last_name_idx ON emp2 (UPPER(last_name));
This facilitates processing queries such as:
SELECT * FROM emp2 WHERE UPPER(last_name) = 'KING';
The Oracle Server uses the index only when that particular function is used in a query. For example,
the following statement may use the index, but without the WHERE clause, the Oracle Server may
perform a full table scan:
SELECT
*
FROM
employees
WHERE
UPPER (last_name) IS NOT NULL
ORDER BY UPPER (last_name);
Note: For creating a function-based index, you need the QUERY REWRITE system privilege. The
QUERY_REWRITE_ENABLED initialization parameter must be set to TRUE for a function-based index
to be used.
The Oracle Server treats indexes with columns marked DESC as function-based indexes. The
columns marked DESC are sorted in descending order.

SQL Fundamentals 19 - 30

Oracle University Student Learning Subscription Use Only

Function-Based Indexes

•
•

You can create multiple indexes on the same set of columns.
Multiple indexes can be created on the same set of columns if:
–
–
–

•

The indexes are of different types
The indexes use different partitioning
The indexes have different uniqueness properties

Only one of the multiple indexes can be visible at a time.

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

You can create multiple indexes on the same set of columns if the indexes are of different types, use
different partitioning, or have different uniqueness properties. For example, you can create a B-tree
index and a bitmap index on the same set of columns.
Similarly, you can create both a unique and a nonunique index on the same set of columns.
When you have multiple indexes on the same set of columns, only one of these indexes can be
visible at a time.

SQL Fundamentals 19 - 31

Oracle University Student Learning Subscription Use Only

Creating Multiple Indexes on the Same Set of Columns

CREATE INDEX emp_id_name_ix1
ON employees(employee_id, first_name);

ALTER INDEX emp_id_name_ix1 INVISIBLE;

CREATE BITMAP INDEX emp_id_name_ix2
ON employees(employee_id, first_name);

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

The code example in the slide shows the creation of a B-tree index, emp_id_name_ix1, on the
employee_id and first_name columns of the employees table in the HR schema. After the
creation of the index, it is altered to make it invisible. Then a bitmap index is created on the
employee_id and first_name columns of the employees table in the HR schema. The bitmap
index, emp_id_name_ix2, is visible by default.

SQL Fundamentals 19 - 32

Oracle University Student Learning Subscription Use Only

Creating Multiple Indexes on the Same Set of Columns:
Example

•
•

USER_INDEXES provides information about your indexes.
USER_IND_COLUMNS describes columns of indexes owned by you and
columns of indexes on your tables.
SELECT index_name, table_name, uniqueness
FROM
user_indexes
WHERE table_name = 'EMPLOYEES';

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

You query the USER_INDEXES view to find out the names of your indexes, the table name on which
the index is created, and whether the index is unique.
Some of the columns of this view are:
• INDEX_NAME: Name of the index
• INDEX_TYPE: Type of index (NORMAL, BITMAP, FUNCTION-BASED NORMAL, FUNCTIONBASED BITMAP, or DOMAIN)
• TABLE_NAME: Name of the indexed object
• TABLE_OWNER: Owner of the indexed object
• TABLE_TYPE: Type of the indexed object (for example, TABLE, CLUSTER)
• UNIQUENESS: Whether the index is UNIQUE or NONUNIQUE
In the slide example, the USER_INDEXES view is queried to find the name of the index, name of the
table on which the index is created, and whether the index is unique.

SQL Fundamentals 19 - 33

Oracle University Student Learning Subscription Use Only

Index Information

For example, the emp_test table and LNAME_IDX index are created by using the following code:
CREATE TABLE emp_test AS SELECT * FROM employees;
CREATE INDEX lname_idx ON emp_test(last_name);
SELECT index_name, column_name,table_name
FROM
user_ind_columns
WHERE index_name = 'LNAME_IDX';

Note: For a complete listing and description of the columns in the USER_INDEXES view, see
“USER_INDEXES” in the Oracle Database Reference 12c Release 1.

SQL Fundamentals 19 - 34

Oracle University Student Learning Subscription Use Only

The USER_IND_COLUMNS dictionary view provides information such as the name of the index, name
of the indexed table, name of a column within the index, and the column’s position within the index.
Use the DESCRIBE command to view the structure of the views.

Removing an Index
Remove an index from the data dictionary by using the DROP INDEX
command:
DROP INDEX index;

•

Remove the emp_last_name_idx index from the data dictionary:
DROP INDEX emp_last_name_idx;

•

To drop an index, you must be the owner of the index or have the DROP ANY
INDEX privilege.

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

You cannot modify indexes. To change an index, you must drop it, and then re-create it.
Remove an index definition from the data dictionary by issuing the DROP INDEX statement. To drop
an index, you must be the owner of the index or have the DROP ANY INDEX privilege.
In the syntax, index is the name of the index.
You can drop an index by using the ONLINE keyword.
DROP INDEX emp_indx ONLINE;
ONLINE: Specify ONLINE to indicate that DML operations on the table are allowed while dropping the
index.
Note: If you drop a table, indexes and constraints are automatically dropped but views remain.

SQL Fundamentals 19 - 35

Oracle University Student Learning Subscription Use Only

•

Which one of the following clauses of the CREATE SEQUENCE statement
specifies the interval between the sequence numbers?
a. START WITH
b. INCREMENT BY
c. CYCLE
d. CACHE

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Answer: b

SQL Fundamentals 19 - 36

Oracle University Student Learning Subscription Use Only

Q

Quiz

The sequence must be dropped and re-created to restart the sequence at a
different number.
a. True
b. False

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Answer: a

SQL Fundamentals 19 - 37

Oracle University Student Learning Subscription Use Only

Q

Quiz

Indexes must be created manually and serve to speed up access to rows in a
table.
a. True
b. False

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Answer: b
Note: Indexes are designed to speed up query performance. However, not all indexes are created
manually. The Oracle Server automatically creates an index when you define a column in a table to
have a PRIMARY KEY or a UNIQUE constraint.

SQL Fundamentals 19 - 38

Oracle University Student Learning Subscription Use Only

Q

Quiz

You use the following view to find out the names of your indexes, the table name
on which the index is created, and whether the index is unique.
a. USER_INDEXES
b. USER_SEQUENCES
c. USER_IND_COLUMNS
d. USER_SYNONYMS

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Answer: a

SQL Fundamentals 19 - 39

Oracle University Student Learning Subscription Use Only

Q

Quiz

In this lesson, you should have learned how to:
• Automatically generate sequence numbers by using a sequence generator
• Use synonyms to provide alternative names for objects
• Create indexes to improve the speed of query retrieval
• Find information about your objects through the following
dictionary views:
–
–
–

USER_SEQUENCES
USER_SYNONYMS
USER_INDEXES and USER_IND_COLUMNS

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

In this lesson, you should have learned about database objects such as sequences, indexes, and
synonyms.

SQL Fundamentals 19 - 40

Oracle University Student Learning Subscription Use Only

Summary

This practice covers the following topics:
• Creating sequences
• Using sequences
• Querying the dictionary views for sequence information
• Creating synonyms
• Querying the dictionary views for synonyms information
• Creating indexes
• Querying the dictionary views for indexes information

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

This lesson’s practice provides you with a variety of exercises in creating and using a sequence, an
index, and a synonym. You also learn how to query the data dictionary views for sequence, synonym,
and index information.

SQL Fundamentals 19 - 41

Oracle University Student Learning Subscription Use Only

Practice 19: Overview

Oracle University Student Learning Subscription Use Only

Lesson 20: Managing Constraints,
Temporary Tables, and External
Tables

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Oracle University Student Learning Subscription Use Only

20

Course Roadmap
Lesson 1: Course Overview

Unit 2: Retrieving and Sorting Data
Lesson 17: Introduction to Data Dictionary
Views

Unit 3: Joins, Subqueries, and Set
Operators

Lesson 18: Creating Views

Unit 4: DML and DDL

Lesson 19: Creating Sequences,
Synonyms, and Indexes

Unit 5: Managing Relational Database

Lesson 20: Managing Constraints,
Temporary Tables, and External Tables

Unit 6: Advance Queries and Database
Management System

You are here.
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

In Unit 5, you are introduced to views. You learn to:
• Query data dictionary views
• Create sequences, synonyms, and indexes
• Manage constraints and tables

SQL Fundamentals 20 - 2

Oracle University Student Learning Subscription Use Only

Unit 1: Relational Database and SQL
Overview

After completing this lesson, you should be able to:
• Manage constraints
• Create and use temporary tables
• Create external tables

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

This lesson contains information about managing constraints. You also learn about temporary tables
and external tables.

SQL Fundamentals 20 - 3

Oracle University Student Learning Subscription Use Only

Objectives

Lesson Agenda
Managing constraints:
–
–
–

•
•

Adding and dropping a constraint
Enabling and disabling a constraint
Deferring constraints

Creating and using temporary tables
Creating external tables

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

SQL Fundamentals 20 - 4

Oracle University Student Learning Subscription Use Only

•

Adding a Constraint Syntax

•
•
•

Add or drop a constraint
Enable or disable constraints
Add a NOT NULL constraint by using the MODIFY clause
ALTER TABLE 
ADD [CONSTRAINT ]
type ();

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

You can add a constraint for existing tables by using the ALTER TABLE statement with the ADD
clause.
In the syntax:
table
constraint
type
column

Is the name of the table
Is the name of the constraint
Is the constraint type
Is the name of the column affected by the constraint

The constraint name syntax is optional, although recommended. If you do not name your constraints,
the system generates constraint names.
Guidelines
• You can add, drop, enable, or disable a constraint, but you cannot modify its structure.
• You can add a NOT NULL constraint to an existing column by using the MODIFY clause of the
ALTER TABLE statement.
Note: You can define a NOT NULL column only if the table is empty or if the column has a value for
every row.

SQL Fundamentals 20 - 5

Oracle University Student Learning Subscription Use Only

Use the ALTER TABLE statement to:

Adding a Constraint

ALTER TABLE emp2
MODIFY employee_id PRIMARY KEY;

ALTER TABLE emp2
ADD CONSTRAINT emp_mgr_fk
FOREIGN KEY(manager_id)
REFERENCES emp2(employee_id);

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

The first example in the slide modifies the EMP2 table to add a PRIMARY KEY constraint on the
EMPLOYEE_ID column. Note that because no constraint name is provided, the constraint is
automatically named by the Oracle Server. The second example in the slide creates a FOREIGN KEY
constraint on the EMP2 table. The constraint ensures that a manager exists as a valid employee in
the EMP2 table.

SQL Fundamentals 20 - 6

Oracle University Student Learning Subscription Use Only

Add a FOREIGN KEY constraint to the EMP2 table indicating that a manager must
already exist as a valid employee in the EMP2 table.

•
•

The DROP CONSTRAINT clause enables you to drop an integrity constraint
from a database.
Remove the manager constraint from the EMP2 table:
ALTER TABLE emp2
DROP CONSTRAINT emp_mgr_fk;

•

Remove the PRIMARY KEY constraint on the DEPT2 table and drop the
associated FOREIGN KEY constraint on the EMP2.DEPARTMENT_ID column:
ALTER TABLE emp2
DROP PRIMARY KEY CASCADE;

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

The DROP CONSTRAINT clause enables you to drop an integrity constraint from a database.
To drop a constraint, you can identify the constraint name from the USER_CONSTRAINTS and
USER_CONS_COLUMNS data dictionary views. Then use the ALTER TABLE statement with the DROP
clause. The CASCADE option of the DROP clause causes any dependent constraints also to be
dropped.
Syntax
ALTER TABLE
table
DROP PRIMARY KEY | UNIQUE (column) |
CONSTRAINT
constraint [CASCADE];
In the syntax:
table
Is the name of the table
column
Is the name of the column affected by the constraint
constraint Is the name of the constraint
When you drop an integrity constraint, that constraint is no longer enforced by the Oracle Server and
is no longer available in the data dictionary.

SQL Fundamentals 20 - 7

Oracle University Student Learning Subscription Use Only

Dropping a Constraint

Dropping a CONSTRAINT ONLINE

ALTER TABLE myemp2
DROP CONSTRAINT emp_name_pk ONLINE;

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

You can also drop a constraint by using an ONLINE keyword. Use the ALTER TABLE statement with
the DROP clause. The ONLINE option of the DROP clause indicates that DML operations on the table
are allowed while dropping the constraint.

SQL Fundamentals 20 - 8

Oracle University Student Learning Subscription Use Only

/

You can specify the ONLINE keyword to indicate that DML operations on the
table are allowed while dropping the constraint.

ON DELETE Clause
Use the ON DELETE CASCADE clause to delete child rows when a parent
key is deleted:
ALTER TABLE dept2 ADD CONSTRAINT dept_lc_fk
FOREIGN KEY (location_id)
REFERENCES locations(location_id) ON DELETE CASCADE;

•

Use the ON DELETE SET NULL clause to set the child row value to null
when a parent key is deleted:
ALTER TABLE emp2 ADD CONSTRAINT emp_dt_fk
FOREIGN KEY (Department_id)
REFERENCES departments(department_id) ON DELETE SET NULL;

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

ON DELETE
By using the ON DELETE clause, you can determine how Oracle Database handles referential
integrity if you remove a referenced primary or unique key value.
ON DELETE CASCADE
The ON DELETE CASCADE action allows parent key data that is referenced from the child table to be
deleted, but not updated. When data in the parent key is deleted, all the rows in the child table that
depend on the deleted parent key values are also deleted. To specify this referential action, include
the ON DELETE CASCADE option in the definition of the FOREIGN KEY constraint.
ON DELETE SET NULL
When data in the parent key is deleted, the ON DELETE SET NULL action causes all the rows in the
child table that depend on the deleted parent key value to be converted to null.
If you omit this clause, Oracle does not allow you to delete referenced key values in the parent table
that have dependent rows in the child table.

SQL Fundamentals 20 - 9

Oracle University Student Learning Subscription Use Only

•

Cascading Constraints
The CASCADE CONSTRAINTS clause:
–
–
–

Is used along with the DROP COLUMN clause
Drops all referential integrity constraints that refer to the PRIMARY and UNIQUE
keys defined on the dropped columns
Drops all multicolumn constraints defined on the dropped columns

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

This statement illustrates the usage of the CASCADE CONSTRAINTS clause. Assume that the TEST1
table is created as follows:
CREATE TABLE test1 (
col1_pk NUMBER PRIMARY KEY,
col2_fk NUMBER,
col1 NUMBER,
col2 NUMBER,
CONSTRAINT fk_constraint FOREIGN KEY (col2_fk) REFERENCES
test1,
CONSTRAINT ck1 CHECK (col1_pk > 0 and col1 > 0),
CONSTRAINT ck2 CHECK (col2_fk > 0));
An error is returned for the following statements:
ALTER TABLE test1 DROP (col1_pk);
—col1_pk is a parent key.
ALTER TABLE test1 DROP (col1); —col1 is referenced by the multicolumn
constraint, ck1.

SQL Fundamentals 20 - 10

Oracle University Student Learning Subscription Use Only

•

Cascading Constraints

ALTER TABLE emp2
DROP COLUMN employee_id CASCADE CONSTRAINTS;

Drops the employee_id column, the PRIMARY KEY constraint, and any
FOREIGN KEY constraints referencing the PRIMARY KEY constraint for
the EMP2 table

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

In the slide example, the ALTER TABLE statement drops the EMPLOYEE_ID column, the PRIMARY
KEY constraint, and any FOREIGN KEY constraints referencing the PRIMARY KEY constraint for the
EMP2 table.
If all the columns referenced by the constraints defined on the dropped columns are also dropped,
CASCADE CONSTRAINTS is not required. For example, assuming that no other referential constraints
from other tables refer to the COL1_PK column, it is valid to submit the following statement without
the CASCADE CONSTRAINTS clause for the TEST1 table created on the previous page:
ALTER TABLE test1 DROP (col1_pk, col2_fk, col1);
• Enabling a PRIMARY KEY constraint that was disabled with the CASCADE option does not
enable any FOREIGN KEYs that are dependent on the PRIMARY KEY.
• To enable a UNIQUE or PRIMARY KEY constraint, you must have the privileges necessary to
create an index on the table.

SQL Fundamentals 20 - 11

Oracle University Student Learning Subscription Use Only

Example:

Renaming Table Columns and Constraints
Use the RENAME TABLE clause of the ALTER TABLE statement to rename
tables.
a

ALTER TABLE marketing RENAME to new_marketing;

•

Use the RENAME COLUMN clause of the ALTER TABLE statement to rename
table columns.
ALTER TABLE new_marketing RENAME COLUMN team_id
TO id;

•

b

Use the RENAME CONSTRAINT clause of the ALTER TABLE statement to
rename any existing constraint for a table.
ALTER TABLE new_marketing RENAME CONSTRAINT mktg_pk
TO new_mktg_pk;

c

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

The RENAME TABLE clause allows you to rename an existing table in any schema (except the
schema SYS).To rename a table, you must either be the database owner or the table owner.
When you rename a table column, the new name must not conflict with the name of any existing
column in the table. You cannot use any other clauses in conjunction with the RENAME COLUMN
clause.
The slide examples use the marketing table with the PRIMARY KEY mktg_pk defined on the id
column.
CREATE TABLE marketing (team_id NUMBER(10),
target VARCHAR2(50),
CONSTRAINT mktg_pk PRIMARY KEY(team_id));
Example “a” shows that the marketing table is renamed new_marketing. Example “b” shows that
the id column of the new_marketing table is renamed mktg_id and example “c” shows that
mktg_pk is renamed new_mktg_pk.
When you rename any existing constraint for a table, the new name must not conflict with any of your
existing constraint names. You can use the RENAME CONSTRAINT clause to rename systemgenerated constraint names.

SQL Fundamentals 20 - 12

Oracle University Student Learning Subscription Use Only

•

•
•

Execute the DISABLE clause of the ALTER TABLE statement to deactivate
an integrity constraint.
Apply the CASCADE option to disable the primary key and it will disable all
dependent FOREIGN KEY constraints automatically as well.
ALTER TABLE emp2
DISABLE CONSTRAINTS emp_dt_fk;

ALTER TABLE dept3
DISABLE primary key CASCADE;

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

You can disable a constraint, without dropping it or re-creating it, by using the ALTER TABLE
statement with the DISABLE clause. You can also disable the primary key or unique key by using the
CASCADE option.
Syntax
ALTER TABLE table
DISABLE CONSTRAINT constraint [CASCADE];
In the syntax:
table
constraint

Is the name of the table
Is the name of the constraint

Guidelines
• You can use the DISABLE clause in both the CREATE TABLE statement and the ALTER TABLE
statement.
• The CASCADE clause disables dependent integrity constraints.
• Disabling a UNIQUE or PRIMARY KEY constraint removes the unique index.

SQL Fundamentals 20 - 13

Oracle University Student Learning Subscription Use Only

Disabling Constraints

Enabling Constraints
Activate an integrity constraint that is currently disabled in the table
definition by using the ENABLE clause.
ALTER TABLE
emp2
ENABLE CONSTRAINT emp_dt_fk;

•

A UNIQUE index is automatically created if you enable a UNIQUE key or a
PRIMARY KEY constraint.

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

You can enable a constraint without dropping it or re-creating it by using the ALTER TABLE statement
with the ENABLE clause.
Syntax
ALTER TABLE
table
ENABLE CONSTRAINT constraint;
In the syntax:
table
constraint

Is the name of the table
Is the name of the constraint

Guidelines
• If you enable a constraint, the constraint applies to all the data in the table. All the data in the
table must comply with the constraint.
• If you enable a UNIQUE key or a PRIMARY KEY constraint, a UNIQUE or PRIMARY KEY index is
created automatically. If an index already exists, it can be used by these keys.
• You can use the ENABLE clause in both the CREATE TABLE statement and the ALTER TABLE
statement.

SQL Fundamentals 20 - 14

Oracle University Student Learning Subscription Use Only

•

An integrity constraint defined on a table can be in one of the following states:
• ENABLE VALIDATE
• ENABLE NOVALIDATE
• DISABLE VALIDATE
• DISABLE NOVALIDATE
ALTER TABLE dept3
ENABLE NOVALIDATE PRIMARY KEY;

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

You can enable or disable integrity constraints at the table level by using the CREATE TABLE or
ALTER TABLE statement. You can also set constraints to VALIDATE or NOVALIDATE, in any
combination with ENABLE or DISABLE, where:
• ENABLE ensures that all incoming data conforms to the constraint
• DISABLE allows incoming data, regardless of whether it conforms to the constraint
• VALIDATE ensures that existing data conforms to the constraint
• NOVALIDATE means that some existing data may not conform to the constraint
ENABLE VALIDATE is the same as ENABLE. The constraint is checked and is guaranteed to hold for
all rows. ENABLE NOVALIDATE means that the constraint is checked, but it does not have to be true
for all rows. This allows existing rows to violate the constraint, while ensuring that all new or modified
rows are valid. In an ALTER TABLE statement, ENABLE NOVALIDATE resumes constraint checking
on disabled constraints without first validating all the data in the table. DISABLE NOVALIDATE is the
same as DISABLE. The constraint is not checked and is not necessarily true. DISABLE VALIDATE
disables the constraint, drops the index on the constraint, and disallows any modification of the
constrained columns.

SQL Fundamentals 20 - 15

Oracle University Student Learning Subscription Use Only

Constraint States

Constraints can have the following attributes:
• DEFERRABLE or NOT DEFERRABLE
• INITIALLY DEFERRED or INITIALLY IMMEDIATE
ALTER TABLE dept4
ADD CONSTRAINT dept4_id_pk
PRIMARY KEY (department_id)
DEFERRABLE INITIALLY DEFERRED;

Deferring constraint on
creation

SET CONSTRAINTS dept4_id_pk IMMEDIATE;
ALTER SESSION
SET CONSTRAINTS= IMMEDIATE;

Changing a specific
constraint attribute

Changing all constraints
for a session

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

You can defer checking constraints for validity until the end of the transaction. A constraint is deferred
if the system does not check whether the constraint is satisfied, until a COMMIT statement is
submitted. If a deferred constraint is violated, the database returns an error and the transaction is not
committed; it is rolled back. If a constraint is immediate (not deferred), it is checked at the end of each
statement. If it is violated, the statement is rolled back immediately. If a constraint causes an action
(for example, DELETE CASCADE), that action is always taken as part of the statement that caused it,
whether the constraint is deferred or immediate. Use the SET CONSTRAINTS statement to specify, for
a particular transaction, whether a deferrable constraint is checked following each data manipulation
language (DML) statement or when the transaction is committed. To create deferrable constraints,
you must create a nonunique index for that constraint.
You can define constraints as either deferrable or NOT DEFERRABLE (default), and either initially
deferred or INITIALLY IMMEDIATE (default). These attributes can be different for each constraint.
Usage scenario: Company policy dictates that department number 40 should be changed to 45.
Changing the DEPARTMENT_ID column affects the employees assigned to this department.
Therefore, you make the PRIMARY KEY and FOREIGN KEYs deferrable and initially deferred. You
update both department and employee information, and at the time of commit, all the rows are
validated.

SQL Fundamentals 20 - 16

Oracle University Student Learning Subscription Use Only

Deferring Constraints

INITIALLY DEFERRED

Waits until the transaction ends to check
the constraint

INITIALLY IMMEDIATE

Checks the constraint at the end of the
statement execution

CREATE TABLE emp_new_sal (salary NUMBER
CONSTRAINT sal_ck
CHECK (salary > 100)
DEFERRABLE INITIALLY IMMEDIATE);

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

A constraint that is defined as deferrable can be specified as either INITIALLY DEFERRED or
INITIALLY IMMEDIATE. The INITIALLY IMMEDIATE clause is the default.
In the slide example:
• The sal_ck constraint is created as DEFERRABLE INITIALLY IMMEDIATE
After creating the emp_new_sal table, as shown in the slide, you attempt to insert values into the
table and observe the results.
Example 1: Insert a row that violates sal_ck. In the CREATE TABLE statement, sal_ck is specified
as an initially immediate constraint. This means that the constraint is verified immediately after the
INSERT statement and you observe an error.
INSERT INTO emp_new_sal VALUES(90);

Example 2: In the following CREATE TABLE statement, bonus_ck is specified as deferrable and
also initially deferred constraint. Insert a row that violates bonus_ck. Observe that the constraint is
not verified until you COMMIT or set the constraint state back to immediate.

SQL Fundamentals 20 - 17

Oracle University Student Learning Subscription Use Only

Difference Between INITIALLY DEFERRED
and INITIALLY IMMEDIATE

CREATE TABLE emp_new_bonus (
bonus NUMBER
CONSTRAINT bonus_ck
CHECK (bonus > 0 )

INSERT INTO emp_new_bonus VALUES(-1);

The row insertion is successful. But you observe an error when you commit the transaction.
COMMIT;

The commit failed due to constraint violation. Therefore, at this point, the transaction is rolled
back by the database.
Set the DEFERRED status to all constraints that can be deferred. Note that you can also set the
DEFERRED status to a single constraint if required.
SET CONSTRAINTS ALL DEFERRED;
Now, if you attempt to insert a row that violates the sal_ck or the bonus_ck constraint, the
statement is executed successfully. However, you observe an error when you commit the
transaction. The transaction fails and is rolled back. This is because the constraints are checked
upon COMMIT.
You can set the IMMEDIATE status for the constraints that were set as DEFERRED .
SET CONSTRAINTS ALL IMMEDIATE;
You observe an error if you attempt to insert a row that violates either sal_ck or bonus_ck.
Note: If you create a table without specifying constraint deferability, the constraint is checked
immediately at the end of each statement. For example, with the CREATE TABLE statement of
the newemp_details table, if you do not specify the newemp_det_pk constraint deferability,
the constraint is checked immediately.
CREATE TABLE newemp_details(emp_id NUMBER, emp_name
VARCHAR2(20),CONSTRAINT newemp_det_pk PRIMARY KEY(emp_id));
When you attempt to defer the newemp_det_pk constraint that is not deferrable, you observe
the following error:
SET CONSTRAINT newemp_det_pk DEFERRED;

SQL Fundamentals 20 - 18

Oracle University Student Learning Subscription Use Only

DEFERRABLE INITIALLY DEFERRED );

When you drop a table:
• It is renamed and placed in the recycle bin
• Space is not released immediately
• Can be recovered by using the FLASHBACK TABLE statement
With the PURGE clause, the table is not placed in the recycle bin. It is dropped
and the space associated with it is released in a single step.

DROP TABLE emp_new_sal PURGE;

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Oracle Database provides a feature for dropping tables. When you drop a table, the database does
not immediately release the space associated with the table. Rather, the database renames the table
and places it in a recycle bin, where it can later be recovered with the FLASHBACK TABLE statement
if you find that you dropped the table in error. If you want to immediately release the space
associated with the table at the time you issue the DROP TABLE statement, include the PURGE clause
as shown in the statement in the slide.
Specify PURGE only if you want to drop the table and release the space associated with it in a single
step. If you specify PURGE, the database does not place the table and its dependent objects into the
recycle bin.
Using this clause is equivalent to first dropping the table, and then purging it from the recycle bin.
This clause saves you one step in the process. It also provides enhanced security if you want to
prevent sensitive material from appearing in the recycle bin.

SQL Fundamentals 20 - 19

Oracle University Student Learning Subscription Use Only

DROP TABLE … PURGE

Lesson Agenda
Managing constraints:
–
–
–

•
•

Adding and dropping a constraint
Enabling and disabling a constraint
Deferring constraints

Creating and using temporary tables
Creating external tables

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

SQL Fundamentals 20 - 20

Oracle University Student Learning Subscription Use Only

•

When
session/transaction
completes

A temporary table holds data only
for the duration of a transaction or
session. For example, a shopping
cart in an online application can be
a temporary table.

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

A temporary table is a table that holds data that exists only for the duration of a transaction or
session. Data in a temporary table is private to the session, which means that each session can see
and modify only its own data.
Temporary tables are useful in applications where a result set must be buffered. For example, a
shopping cart in an online application can be a temporary table. Each item is represented by a row in
the temporary table. While you are shopping in an online store, you can keep on adding or removing
items from your cart. During the session, this cart data is private. After you finalize your shopping and
make the payments, the application moves the row for the chosen cart to a permanent table. At the
end of the session, the data in the temporary table is automatically dropped.
Because temporary tables are statically defined, you can create indexes for them. The indexes that
are created on temporary tables are also temporary. The data in the index has the same session or
transaction scope as the data in the temporary table. You can also create a view or trigger on a
temporary table.

SQL Fundamentals 20 - 21

Oracle University Student Learning Subscription Use Only

Temporary Tables

CREATE GLOBAL TEMPORARY TABLE cart(n NUMBER,d DATE)
ON COMMIT DELETE ROWS;

CREATE GLOBAL TEMPORARY TABLE emp_details
ON COMMIT PRESERVE ROWS AS
SELECT * FROM employees
WHERE hire_date = SYSDATE;

1

2

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

To create a temporary table, you can use the following command:
CREATE GLOBAL TEMPORARY TABLE tablename
ON COMMIT [PRESERVE | DELETE] ROWS
By associating one of the following settings with the ON COMMIT clause, you can decide whether the
data in the temporary table is transaction-specific (default) or session-specific.
1. DELETE ROWS: As shown in example 1 in the slide, the DELETE ROWS setting creates a
temporary table that is transaction-specific. A session becomes bound to the temporary table
with a transaction’s first insert into the table. The binding goes away at the end of the
transaction. The database truncates the table (deletes all rows) after each commit.
2. PRESERVE ROWS: As shown in example 2 in the slide, the PRESERVE ROWS setting creates a
temporary table that is session-specific. Each HR representative session can store its own
employees data for the day in the table. When an HR person performs the first insert on the
emp_details table, his or her session gets bound to the emp_details table. This binding
goes away at the end of the session or by issuing a TRUNCATE of the table in the session. The
database truncates the table when you terminate the session.
When you create a temporary table in an Oracle database, you create a static table definition. Like
permanent tables, temporary tables are defined in the data dictionary. However, temporary tables
and their indexes do not automatically allocate a segment when created. Instead, temporary
segments are allocated when data is first inserted. Until data is loaded in a session, the table appears
empty.

SQL Fundamentals 20 - 22

Oracle University Student Learning Subscription Use Only

Creating a Temporary Table

Lesson Agenda
Managing constraints:
–
–
–

•
•

Adding and dropping a constraint
Enabling and disabling a constraint
Deferring constraints

Creating and using temporary tables
Creating external tables

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

SQL Fundamentals 20 - 23

Oracle University Student Learning Subscription Use Only

•

•
•

Are read-only tables whose metadata is stored in the database but the data
is stored externally in flat files
Can be queried and joined directly and in parallel without the need for
loading the data in the database
No DML operations are possible on external tables.

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

An external table is a read-only table whose metadata is stored in the database but whose data is
stored outside the database. This external table definition can be thought of as a view that is used for
running any SQL query against external data without requiring that the external data first be loaded
into the database. The external table data can be queried and joined directly and in parallel without
requiring that the external data first be loaded in the database. You can use SQL, PL/SQL, and Java
to query the data in an external table. External tables are useful for querying flat files.
The main difference between external tables and regular tables is that externally organized tables are
read-only. No DML operations are possible, and no indexes can be created on them. However, you
can create an external table, and thus unload data, by using the CREATE TABLE AS SELECT
command.
The Oracle Server provides two major access drivers for external tables. One, the loader access
driver (or ORACLE_LOADER), is used for reading data from external files whose format can be
interpreted by the SQL*Loader utility. Note that not all SQL*Loader functionality is supported with
external tables. The ORACLE_DATAPUMP access driver can be used to both import and export data
by using a platform-independent format. The ORACLE_DATAPUMP access driver writes rows from a
SELECT statement to be loaded into an external table as part of a CREATE TABLE
...ORGANIZATION EXTERNAL...AS SELECT statement. You can then use SELECT to read data
out of that data file. You can also create an external table definition on another system and use that
data file. This allows data to be moved between Oracle databases.

SQL Fundamentals 20 - 24

Oracle University Student Learning Subscription Use Only

External Tables

Creating a Directory for the External Table

CREATE OR REPLACE DIRECTORY emp_dir
AS '/…/emp_dir';
GRANT READ ON DIRECTORY emp_dir TO ;

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Use the CREATE DIRECTORY statement to create a directory object. A directory object specifies an
alias for a directory on the server’s file system where an external data source resides. You can use
directory names when referring to an external data source, rather than hard code the operating
system path name, for greater file management flexibility.
You must have the CREATE ANY DIRECTORY system privileges to create directories. When you
create a directory, you are automatically granted the READ and WRITE object privileges and can grant
READ and WRITE privileges to other users and roles. The DBA can also grant these privileges to
other users and roles.
A user needs READ privileges on the directory used by the external table in order to access the flat
file and WRITE privileges for writing to the log, bad, and discard files.
In addition, a WRITE privilege is necessary when the external table framework is being used to
unload data.
Oracle also provides the ORACLE_DATAPUMP type, with which you can unload data (that is, read data
from a table in the database and insert it into an external table), and then reload it into an Oracle
database. This is a one-time operation that can be performed when the table is created. After the
creation and initial population, you cannot update, insert, or delete any rows.
Note: The emp.dat file is saved at /home/oracle/emp_dir folder location on your database file
system. A directory object emp_dir is already created and you have been granted READ and WRITE
privileges on the same.

SQL Fundamentals 20 - 25

Oracle University Student Learning Subscription Use Only

Create a DIRECTORY object that corresponds to the directory on the file system
where the external data source resides.

In the syntax:
OR REPLACE

Specify OR REPLACE to re-create the directory database object if it already
exists. You can use this clause to change the definition of an existing directory
without dropping, re-creating, and regranting the database object privileges
that were previously granted on the directory. Users who were previously
granted privileges on a redefined directory can continue to access the directory
without requiring that the privileges be regranted.

directory

Specify the name of the directory object to be created. The maximum length of
the directory name is 30 bytes. You cannot qualify a directory object with a
schema name.

'path_name'

Specify the full path name of the operating system directory to be accessed. The
path name is case-sensitive.

SQL Fundamentals 20 - 26

Oracle University Student Learning Subscription Use Only

Syntax
CREATE [OR REPLACE] DIRECTORY AS 'path_name';

Creating an External Table

Indicates the access
driver,
ORACLE_LOADER(default)
or ORACLE_DATAPUMP

Enables you to assign values
for specific parameters of
the access driver used

CREATE TABLE 
(  , … )
ORGANIZATION EXTERNAL
(TYPE 
DEFAULT DIRECTORY 
ACCESS PARAMETERS
(… ) )
LOCATION ('')
REJECT LIMIT [0 |  | UNLIMITED];

Specify the
directory
object that
references
the external
data source.

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

You create external tables by using the ORGANIZATION EXTERNAL clause of the CREATE TABLE
statement. You are not, in fact, creating a table. Rather, you are creating metadata in the data
dictionary that you can use to access external data. You use the ORGANIZATION clause to specify
the order in which the data rows of the table are stored. By specifying EXTERNAL in the
ORGANIZATION clause, you indicate that the table is a read-only table located outside the database.
Note that the external files must already exist outside the database.
TYPE  indicates the access driver of the external table. The access driver
is the application programming interface (API) that interprets the external data for the database. If you
do not specify TYPE, Oracle uses the default access driver, ORACLE_LOADER. The other option is
ORACLE_DATAPUMP.
You use the DEFAULT DIRECTORY clause to specify one or more Oracle database directory objects
that correspond to directories on the file system where the external data sources may reside.
The optional ACCESS PARAMETERS clause enables you to assign values to the parameters of the
specific access driver for this external table.

SQL Fundamentals 20 - 27

Oracle University Student Learning Subscription Use Only

Use the ORGANIZATION EXTERNAL clause to create external tables.

Use the LOCATION clause to specify one external locator for each external data source. Usually,
 is a file, but it need not be.

CREATE TABLE 
ORGANIZATION EXTERNAL (TYPE ORACLE_DATAPUMP
DEFAULT DIRECTORY …
ACCESS PARAMETERS (… )
LOCATION (…)
PARALLEL 4
REJECT LIMIT UNLIMITED
AS
SELECT * FROM ;
An external table does not describe any data that is stored in the database. It does not describe how
data is stored in the external source. Instead, it describes how the external table layer must present
the data to the server. It is the responsibility of the access driver and the external table layer to do the
necessary transformations required on the data in the data file so that it matches the external table
definition.
When the database server accesses data in an external source, it calls the appropriate access driver
to get the data from the external source in a form that the database server expects.
It is important to remember that the description of data in the data source is separate from the
definition of the external table. The source file can contain more or fewer fields than there are
columns in the table. Also, the data types for fields in the data source can be different from the
columns in the table. The access driver takes care of ensuring that the data from the data source is
processed so that it matches the definition of the external table.

SQL Fundamentals 20 - 28

Oracle University Student Learning Subscription Use Only

The REJECT LIMIT clause enables you to specify how many conversion errors can occur during a
query of the external data before an Oracle error is returned and the query is aborted. The default
value is 0.
The syntax for using the ORACLE_DATAPUMP access driver is as follows:

CREATE TABLE oldemp (fname char(25), lname CHAR(25))
ORGANIZATION EXTERNAL
(TYPE ORACLE_LOADER
DEFAULT DIRECTORY emp_dir
ACCESS PARAMETERS
(RECORDS DELIMITED BY NEWLINE
FIELDS(fname POSITION ( 1:20) CHAR,
lname POSITION (22:41) CHAR))
LOCATION ('emp.dat'));

emp_dir is the directory object that is
created by using the CREATE DIRECTORY
statement.

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Assume that there is a flat file that has records in the following format:
10,jones,11-Dec-1934
20,smith,12-Jun-1972
Records are delimited by new lines. The file is /home/oracle/emp_dir/emp.dat.
To convert this file as the data source for an external table whose metadata will reside in the
database, you must perform the following steps:
1. Create a directory object, emp_dir, as follows:
CREATE DIRECTORY emp_dir AS '/home/oracle/emp_dir' ;
2. Run the CREATE TABLE command shown in the slide.
The example in the slide illustrates the table specification to create an external table for the file,
emp.dat, that is located at /home/oracle/emp_dir folder and is referenced by the emp_dir
directory object.
After the CREATE TABLE command executes successfully, the OLDEMP external table can be
described and queried in the same way as a relational table.
SELECT * FROM oldemp;

Note: A directory object with the name emp_dir already exists in this course setup. To run the
CREATE DIRECTORY code shown above, use a different name.
SQL Fundamentals 20 - 29

Oracle University Student Learning Subscription Use Only

Creating an External Table by Using ORACLE_LOADER

You can also perform the unload and reload operations with external tables by using the
ORACLE_DATAPUMP access driver.
The following example illustrates the table specification to create an external table by using the
ORACLE_DATAPUMP access driver. Data is then populated into the two files: emp1.exp and
emp2.exp.
To populate data read from the EMPLOYEES table into an external table, you must run the following
CREATE TABLE command:
CREATE TABLE emp_ext
(employee_id, first_name, last_name)
ORGANIZATION EXTERNAL
(
TYPE ORACLE_DATAPUMP
DEFAULT DIRECTORY emp_dir
LOCATION
('emp1.exp','emp2.exp')
)
PARALLEL
AS
SELECT employee_id, first_name, last_name
FROM
employees;
You can query the external table by executing the following code:
SELECT * FROM emp_ext;
Note: In the context of external tables, loading data refers to the act of data being read from an
external table and loaded into a table in the database. Unloading data refers to the act of reading
data from a table and inserting it into an external table.

SQL Fundamentals 20 - 30

Oracle University Student Learning Subscription Use Only

In the example, the TYPE specification is given only to illustrate its use. ORACLE_LOADER is the
default access driver if not specified. The ACCESS PARAMETERS option provides values to the
parameters of the specific access driver, which are interpreted by the access driver, not by the Oracle
Server.
Note: For this course, the emp_dir directory object has already been created. However, if you want
you can create a new directory object pointing to the same location, /home/oracle/emp_dir
and run the CREATE TABLE command shown in the slide. You do not need to grant yourself the READ
privileges because you are the owner of the directory object.

Which one of the following clauses would you use with the DROP COLUMN
statement to drop all referential integrity constraints that refer to the PRIMARY
and UNIQUE keys defined on the dropped columns?
a. ON DELETE CASCADE
b. CASCADE CONSTRAINTS

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Answer: b

SQL Fundamentals 20 - 31

Oracle University Student Learning Subscription Use Only

Q

Quiz

ENABLE NOVALIDATE allows existing rows to violate the constraint, while
ensuring that all new or modified rows are valid.
a. True
b. False

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Answer: a

SQL Fundamentals 20 - 32

Oracle University Student Learning Subscription Use Only

Q

Quiz

You can decide whether the data in a temporary table is transaction-specific
(default) or session-specific by associating the following settings with the ON
COMMIT clause
(select all that apply):
a. PRESERVE ROWS
b. DELETE ROWS
c. DEFER ROWS
d. PURGE

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Answer: a, b

SQL Fundamentals 20 - 33

Oracle University Student Learning Subscription Use Only

Q

Quiz

Q

Quiz

a. True
b. False

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Answer: a

SQL Fundamentals 20 - 34

Oracle University Student Learning Subscription Use Only

You create external tables by using the ORGANIZATION EXTERNAL clause of the
CREATE TABLE statement.

In this lesson, you should have learned how to:
• Manage constraints
• Create and use temporary tables
• Create and use external tables

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

In this lesson, you learned how to perform the following tasks for schema object management:
• Alter tables to add or modify columns or constraints.
• Create and use temporary tables.
• Use the ORGANIZATION EXTERNAL clause of the CREATE TABLE statement to create an
external table. An external table is a read-only table whose metadata is stored in the database
but whose data is stored outside the database.
• Use external tables to query data without first loading it into the database.

SQL Fundamentals 20 - 35

Oracle University Student Learning Subscription Use Only

Summary

This practice covers the following topics:
• Adding and dropping constraints
• Deferring constraints
• Creating external tables

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

In this practice, you use the ALTER TABLE command to add, drop, and defer constraints. You also
create external tables.

SQL Fundamentals 20 - 36

Oracle University Student Learning Subscription Use Only

Practice 20: Overview

Lesson 21: Using Advanced
Subqueries

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Oracle University Student Learning Subscription Use Only

21

Course Roadmap
You are here

Lesson 1: Course Overview

Unit 2: Retrieving and Sorting Data

Lesson 21: Using Advanced Subqueries

Unit 3: Joins, Subqueries, and Set
Operators

Lesson 22: Manipulating Data by Using
Advanced Subqueries

Unit 4: DML and DDL

Lesson 23: Controlling User Access

Unit 5: Managing Relational Database

Lesson 24: Advanced Data Manipulation

Unit 6: Advance Queries and Database
Management System

Lesson 25: Managing Multiple Timezones

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

In Unit 6, you will be introduced to some advanced features of SQL. You will learn to write advanced
subqueries. You will learn to create users and manage users. You will also learn about managing
multiple timezones.

SQL Fundamentals 21 - 2

Oracle University Student Learning Subscription Use Only

Unit 1: Relational Database and SQL
Overview

After completing this lesson, you should be able to:
• Write a multiple-column subquery
• Use scalar subqueries in SQL
• Solve problems with correlated subqueries
• Use the EXISTS and NOT EXISTS operators
• Use the WITH clause

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

In this lesson, you learn how to write multiple-column subqueries and subqueries in the FROM clause
of a SELECT statement. You also learn how to solve problems by using scalar, correlated subqueries
and by using the WITH clause.

SQL Fundamentals 21 - 3

Oracle University Student Learning Subscription Use Only

Objectives

•
•
•
•
•
•

Retrieving data by using a subquery as a source
Writing a multiple-column subquery
Using scalar subqueries in SQL
Solving problems with correlated subqueries
Using the EXISTS and NOT EXISTS operators
Using the WITH clause

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

SQL Fundamentals 21 - 4

Oracle University Student Learning Subscription Use Only

Lesson Agenda

SELECT department_name, city
FROM
departments
NATURAL JOIN (SELECT l.location_id, l.city, l.country_id
FROM
locations l
JOIN
countries c
ON(l.country_id = c.country_id)
JOIN regions
USING(region_id)
WHERE region_name = 'Europe');

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

You can use a subquery in the FROM clause of a SELECT statement, which is very similar to how
views are used. A subquery in the FROM clause of a SELECT statement is also called an inline view.
A subquery in the FROM clause of a SELECT statement defines a data source for that particular
SELECT statement, and only that SELECT statement. As with a database view, the SELECT statement
in the subquery can be as simple or as complex as you like.
When a database view is created, the associated SELECT statement is stored in the data dictionary.
In situations where you do not have the necessary privileges to create database views, or when you
would like to test the suitability of a SELECT statement to become a view, you can use an inline view.
With inline views, you can have all the code needed to support the query in one place. This means
that you can avoid the complexity of creating a separate database view. The example in the slide
shows how to use an inline view to display the department name and the city in Europe. The
subquery in the FROM clause fetches the location ID, city name, and the country by joining three
different tables. The output of the inner query is considered as a table for the outer query. The inner
query is similar to that of a database view but does not have any physical name.

SQL Fundamentals 21 - 5

Oracle University Student Learning Subscription Use Only

Retrieving Data by Using a Subquery as a Source

Note: You learned how to create database views in the lesson titled “Creating Views.”

SQL Fundamentals 21 - 6

Oracle University Student Learning Subscription Use Only

You can display the same output as in the example in the slide by performing the following
two steps:
1. Create a database view:
CREATE OR REPLACE VIEW european_cities
AS
SELECT l.location_id, l.city, l.country_id
FROM
locations l
JOIN
countries c
ON(l.country_id = c.country_id)
JOIN regions USING(region_id)
WHERE region_name = 'Europe';
2. Join the EUROPEAN_CITIES view with the DEPARTMENTS table:
SELECT department_name, city
FROM
departments
NATURAL JOIN european_cities;

•
•
•
•
•
•

Retrieving data by using a subquery as a source
Writing a multiple-column subquery
Using scalar subqueries in SQL
Solving problems with correlated subqueries
Using the EXISTS and NOT EXISTS operators
Using the WITH clause

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

SQL Fundamentals 21 - 7

Oracle University Student Learning Subscription Use Only

Lesson Agenda

Main query
WHERE (MANAGER_ID, DEPARTMENT_ID)

IN

Subquery
100
102
124

90
60
50

Each row of the main query is compared to values from a multiple-row and
multiple-column subquery.

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

So far, you have written single-row subqueries and multiple-row subqueries where only one column
is returned by the inner SELECT statement and this is used to evaluate the expression in the parent
SELECT statement. If you want to compare two or more columns, you must write a compound WHERE
clause by using logical operators. Using multiple-column subqueries, you can combine duplicate
WHERE conditions into a single WHERE clause.
Syntax
SELECT
column, column, ...
FROM table
WHERE(column, column, ...) IN
(SELECT column, column, ...
FROM
table
WHERE condition);
The graphic in the slide illustrates that the values of MANAGER_ID and DEPARTMENT_ID from the
main query are being compared with the MANAGER_ID and DEPARTMENT_ID values retrieved by the
subquery. Because the number of columns that are being compared is more than one, the example
qualifies as a multiple-column subquery.
Note: Before you run the examples in the next few slides, you need to create the empl_demo table
and populate data into it by using the lab_06_insert_empdata.sql file.

SQL Fundamentals 21 - 8

Oracle University Student Learning Subscription Use Only

Multiple-Column Subqueries

Multiple-column comparisons involving subqueries can be:
• Pairwise comparisons
• Nonpairwise comparisons

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Pairwise Versus Nonpairwise Comparisons
Multiple-column comparisons involving subqueries can be nonpairwise comparisons or pairwise
comparisons. If you consider the example “Display the details of employees who work in the same
department, and have the same manager, as ‘Daniel’?,” you get the correct result with the following
statement:
SELECT first_name, last_name, manager_id, department_id
FROM empl_demo
WHERE manager_id IN (SELECT manager_id
FROM empl_demo
WHERE first_name = 'Daniel')
AND department_id IN (SELECT department_id
FROM empl_demo
WHERE first_name = 'Daniel');
There is only one “Daniel” in the EMPL_DEMO table (Daniel Faviet, who is managed by employee 108
and works in department 100). However, if the subqueries return more than one row, the result might
not be correct. For example, if you run the same query but substitute “John” for “Daniel,” you get an
incorrect result. This is because the combination of department_id and manager_id is important.
To get the correct result for this query, you need a pairwise comparison.

SQL Fundamentals 21 - 9

Oracle University Student Learning Subscription Use Only

Column Comparisons

Pairwise Comparison Subquery

SELECT employee_id, manager_id, department_id
FROM employees
WHERE (manager_id, department_id) IN
(SELECT manager_id, department_id
FROM employees
WHERE employee_id IN (174, 199))
AND employee_id NOT IN (174,199);

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

The example in the slide shows a pairwise comparison of columns. It compares the values in the
MANAGER_ID column and the DEPARTMENT_ID column of each row in the EMPLOYEES table with the
values in the MANAGER_ID column and the DEPARTMENT_ID column for employees with
EMPLOYEE_ID 199 or 174.
First, the subquery to retrieve the MANAGER_ID and DEPARTMENT_ID values for employees with
EMPLOYEE_ID 199 or 174 is executed. These values are compared with the MANAGER_ID column
and the DEPARTMENT_ID column of each row in the EMPLOYEES table. If the values match, the row
is displayed. In the output, the records of employees with EMPLOYEE_ID 199 or 174 will not be
displayed. The output of the query is shown in the slide.

SQL in the Oracle Cloud- Student Learning Subscription 21 - 10

Oracle University Student Learning Subscription Use Only

Display the details of employees who are managed by the same manager and
work in the same department as employees with EMPLOYEE_ID 199 or 174.

Display the details of employees who are managed by the same manager as
employees with EMPLOYEE_ID 174 or 141 and work in the same department as
employees with EMPLOYEE_ID 174 or 141.
SELECT employee_id, manager_id, department_id
FROM employees
WHERE manager_id IN
(SELECT manager_id
FROM employees
WHERE employee_id IN (174,141))
AND department_id IN
(SELECT department_id
FROM employees
WHERE employee_id IN (174,141))
AND employee_id NOT IN(174,141);

…
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

The example in the slide shows a nonpairwise comparison of columns. It displays the EMPLOYEE_ID,
MANAGER_ID, and DEPARTMENT_ID of any employee whose manager ID matches any of the
manager IDs of employees whose employee IDs are either 174 or 141 and DEPARTMENT_ID
matches any of the department IDs of employees whose employee IDs are either 174 or 141.
First, the subquery to retrieve the MANAGER_ID values for employees with EMPLOYEE_ID 174 or 141
is executed. Similarly, the second subquery to retrieve the DEPARTMENT_ID values for employees
with EMPLOYEE_ID 174 or 141 is executed. The retrieved values of the MANAGER_ID and
DEPARTMENT_ID columns are compared with the MANAGER_ID and DEPARTMENT_ID columns for
each row in the EMPLOYEES table. If the MANAGER_ID column of the row in the EMPLOYEES table
matches with any of the values of the MANAGER_ID retrieved by the inner subquery and if the
DEPARTMENT_ID column of the row in the EMPLOYEES table matches with any of the values of the
DEPARTMENT_ID retrieved by the second subquery, the record is displayed.

SQL Fundamentals 21 - 11

Oracle University Student Learning Subscription Use Only

Nonpairwise Comparison Subquery

•
•
•
•
•
•

Retrieving data by using a subquery as a source
Writing a multiple-column subquery
Using scalar subqueries in SQL
Solving problems with correlated subqueries
Using the EXISTS and NOT EXISTS operators
Using the WITH clause

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

SQL Fundamentals 21 - 12

Oracle University Student Learning Subscription Use Only

Lesson Agenda

•
•

A scalar subquery expression is a subquery that returns exactly one column
value from one row.
Scalar subqueries can be used in:
–
–
–

The condition and expression part of DECODE and CASE
All clauses of SELECT except GROUP BY
The SET clause and WHERE clause of an UPDATE statement

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

A subquery that returns exactly one column value from one row is also referred to as a scalar
subquery. Multiple-column subqueries that are written to compare two or more columns, using a
compound WHERE clause and logical operators, do not qualify as scalar subqueries.
The value of a scalar subquery expression is the value of the select list item of the subquery. If the
subquery returns 0 rows, the value of the scalar subquery expression is NULL. If the subquery returns
more than one row, the Oracle Server returns an error. The Oracle Server has always supported the
usage of a scalar subquery in a SELECT statement. You can use scalar subqueries in:
• The condition and expression part of DECODE and CASE
• All clauses of SELECT except GROUP BY
• The SET clause and WHERE clause of an UPDATE statement
However, scalar subqueries are not valid expressions in the following places:
• In the RETURNING clause of data manipulation language (DML) statements
•
•
•
•

As the basis of a function-based index
In GROUP BY clauses and CHECK constraints
In CONNECT BY clauses
In statements that are unrelated to queries, such as CREATE PROFILE

SQL Fundamentals 21 - 13

Oracle University Student Learning Subscription Use Only

Scalar Subquery Expressions

Scalar Subqueries: Examples
Scalar subqueries in CASE expressions:
SELECT employee_id, last_name,
(CASE
20
WHEN department_id =
(SELECT department_id
FROM departments
WHERE location_id = 1800)
THEN 'Canada' ELSE 'USA' END) location
FROM
employees;

•

Scalar subqueries in a SELECT statement:
select department_id, department_name,
(select count(*)
from
employees e
where e.department_id = d.department_id) as emp_count
from
departments d;

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

The first example in the slide demonstrates that scalar subqueries can be used in CASE
expressions. The inner query returns the value 20, which is the department ID of the department
whose location ID is 1800. The CASE expression in the outer query uses the result of the inner query
to display the employee ID, last names, and a value of Canada or USA, depending on whether the
department ID of the record retrieved by the outer query is 20.
The second example in the slide demonstrates that scalar subqueries can be used in SELECT
statements.

SQL Fundamentals 21 - 14

Oracle University Student Learning Subscription Use Only

•

•
•
•
•
•
•

Retrieving data by using a subquery as a source
Writing a multiple-column subquery
Using scalar subqueries in SQL
Solving problems with correlated subqueries
Using the EXISTS and NOT EXISTS operators
Using the WITH clause

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

SQL Fundamentals 21 - 15

Oracle University Student Learning Subscription Use Only

Lesson Agenda

Correlated Subqueries

GET
candidate row from outer query

EXECUTE
inner query by using candidate row value

USE
values from inner query to qualify or disqualify
candidate row

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

The Oracle Server performs a correlated subquery when the subquery references a column from a
table referred to in the parent statement. A correlated subquery is evaluated once for each row
processed by the parent statement. The parent statement can be a SELECT, UPDATE, or DELETE
statement.
Nested Subqueries Versus Correlated Subqueries
With a normal nested subquery, the inner SELECT query runs first and executes once, returning
values to be used by the main query. A correlated subquery, however, executes once for each
candidate row considered by the outer query. That is, the inner query is driven by the outer query.
Nested Subquery Execution
• The inner query executes first and finds a value.
• The outer query executes once, using the value from the inner query.
Correlated Subquery Execution
• Get a candidate row (fetched by the outer query).
• Execute the inner query by using the value of the candidate row.
• Use the values resulting from the inner query to qualify or disqualify the candidate.
• Repeat until no candidate row remains.

SQL Fundamentals 21 - 16

Oracle University Student Learning Subscription Use Only

Correlated subqueries are used for row-by-row processing. Each subquery is
executed once for every row of the outer query.

Correlated Subqueries

SELECT column1, column2, ...
FROM
table1
Outer_table
WHERE column1 operator
(SELECT column1, column2
FROM
table2
WHERE
expr1 = Outer_table
.expr2);

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

A correlated subquery is one way of reading every row in a table and comparing values in each row
against related data. It is used whenever a subquery must return a different result or set of results for
each candidate row considered by the main query. That is, you use a correlated subquery to answer
a multipart question whose answer depends on the value in each row processed by the parent
statement.
The Oracle Server performs a correlated subquery when the subquery references a column from a
table in the parent query.
Note: You can use the ANY and ALL operators in a correlated subquery.

SQL Fundamentals 21 - 17

Oracle University Student Learning Subscription Use Only

The subquery references a column from a table in the parent query.

Using Correlated Subqueries: Example 1

SELECT last_name, salary, department_id
FROM
employees outer_table
WHERE salary >
(SELECT AVG(salary)
FROM
employees inner_table
WHERE inner_table.department_id =
outer_table.department_id);
Each time a row from
the outer query
is processed, the
inner query is
evaluated.

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

The example in the slide finds employees who earn more than the average salary in their
department. In this case, the correlated subquery specifically computes the average salary for each
department.
Because both the outer query and inner query use the EMPLOYEES table in the FROM clause, an alias
is given to EMPLOYEES in the outer SELECT statement for clarity. The alias makes the entire SELECT
statement more readable. Without the alias, the query would not work properly because the inner
statement would not be able to distinguish the inner table column from the outer table column.
The correlated subquery performs the following steps for each row of the EMPLOYEES table:
1. The department_id of the row is determined.
2. The department_id is then used to evaluate the parent query.
3. If the salary in that row is greater than the average salary of the departments of that row, the row
is returned.
The subquery is evaluated once for each row of the EMPLOYEES table.

SQL Fundamentals 21 - 18

Oracle University Student Learning Subscription Use Only

Find all employees who earn more than the average salary in their department.

Using Correlated Subqueries: Example 2

SELECT department_id, employee_id, salary
FROM EMPLOYEES e
WHERE 1 =
(SELECT COUNT(DISTINCT salary)
FROM EMPLOYEES
WHERE e.department_id = department_id
AND e.salary <= salary)

….
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

The example in the slide displays the details of the highest earning employees in each department.
The Oracle Server evaluates a correlated subquery as follows:
1. Select a row from the table specified in the outer query. This will be the current candidate row.
2. Store the value of the column referenced in the subquery from this candidate row. (In the
example in the slide, the column referenced in the subquery is e.salary.)
3. Perform the subquery with its condition referencing the value from the outer query’s candidate
row. (In the example in the slide, the COUNT(DISTINCT salary) group function is evaluated
based on the value of the E.SALARY column obtained in step 2.)
4. Evaluate the WHERE clause of the outer query on the basis of the results of the subquery
performed in step 3. This determines whether the candidate row is selected for output. (In the
example, the number of times an employee has changed jobs, evaluated by the subquery, is
compared with 2 in the WHERE clause of the outer query. If the condition is satisfied, that
employee record is displayed.)
5. Repeat the procedure for the next candidate row of the table, and so on, until all the rows in the
table have been processed.
The correlation is established by using an element from the outer query in the subquery. In this
example, you compare EMPLOYEE_ID from the table in the subquery with EMPLOYEE_ID from the
table in the outer query.

SQL Fundamentals 21 - 19

Oracle University Student Learning Subscription Use Only

Display details of the highest earning employee in each department.

•
•
•
•
•
•

Retrieving data by using a subquery as a source
Writing a multiple-column subquery
Using scalar subqueries in SQL
Solving problems with correlated subqueries
Using the EXISTS and NOT EXISTS operators
Using the WITH clause

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

SQL Fundamentals 21 - 20

Oracle University Student Learning Subscription Use Only

Lesson Agenda

•
•

The EXISTS operator tests for existence of rows in the results set of the
subquery.
If a subquery row value is found:
–
–

•

The search does not continue in the inner query
The condition is flagged TRUE

If a subquery row value is not found:
–

The condition is flagged FALSE

–

The search continues in the inner query

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

With nesting SELECT statements, all logical operators are valid. In addition, you can use the EXISTS
operator. This operator is frequently used with correlated subqueries to test whether a value retrieved
by the outer query exists in the results set of the values retrieved by the inner query. If the subquery
returns at least one row, the operator returns TRUE. If the value does not exist, it returns FALSE.
Accordingly, NOT EXISTS tests whether a value retrieved by the outer query is not a part of the
results set of the values retrieved by the inner query.

SQL Fundamentals 21 - 21

Oracle University Student Learning Subscription Use Only

Using the EXISTS Operator

SELECT employee_id, last_name, job_id, department_id
FROM
employees outer
WHERE EXISTS ( SELECT NULL
FROM
employees
WHERE manager_id =
outer.employee_id);

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

The EXISTS operator ensures that the search in the inner query does not continue when at least one
match is found for the manager and employee number by the condition:
WHERE manager_id = outer.employee_id
Note that the inner SELECT query does not need to return a specific value; so a constant can be
selected.

SQL Fundamentals 21 - 22

Oracle University Student Learning Subscription Use Only

Using the EXISTS Operator

SELECT department_id, department_name
FROM departments d
WHERE NOT EXISTS (SELECT NULL
FROM
employees
WHERE department_id = d.department_id);

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Using the NOT EXISTS Operator
Alternative Solution
A NOT IN construct can be used as an alternative for a NOT EXISTS operator, as shown in the
following example:
SELECT department_id, department_name
FROM
departments
WHERE department_id NOT IN (SELECT department_id
FROM
employees);
However, NOT IN evaluates to FALSE if any member of the set is a NULL value. Therefore, your
query will not return any rows even if there are rows in the departments table that satisfy the
WHERE condition.

SQL Fundamentals 21 - 23

Oracle University Student Learning Subscription Use Only

Finding All Departments That Do Not Have Any
Employees

•
•
•
•
•
•

Retrieving data by using a subquery as a source
Writing a multiple-column subquery
Using scalar subqueries in SQL
Solving problems with correlated subqueries
Using the EXISTS and NOT EXISTS operators
Using the WITH clause

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

SQL Fundamentals 21 - 24

Oracle University Student Learning Subscription Use Only

Lesson Agenda

•
•
•

Using the WITH clause, you can use the same query block in a SELECT
statement when it occurs more than once within a complex query.
The WITH clause retrieves the results of a query block and stores it in the
user’s temporary tablespace.
The WITH clause may improve performance.

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Using the WITH clause, you can define a query block before using it in a query. The WITH clause
(formally known as subquery_factoring_clause) enables you to reuse the same query block in
a SELECT statement when it occurs more than once within a complex query. This is particularly
useful when a query has many references to the same query block and there are joins and
aggregations.
Using the WITH clause, you can reuse the same query when it is costly to evaluate the query block
and it occurs more than once within a complex query. Using the WITH clause, the Oracle Server
retrieves the results of a query block and stores it in the user’s temporary tablespace. This can
improve performance.
WITH Clause Benefits
• Makes the query easy to read
• Evaluates a clause only once, even if it appears multiple times in the query
• In most cases, may improve performance for large queries

SQL Fundamentals 21 - 25

Oracle University Student Learning Subscription Use Only

WITH Clause

WITH CNT_DEPT AS
(
SELECT department_id,
COUNT(1) NUM_EMP
FROM EMPLOYEES
GROUP BY department_id
)
SELECT employee_id,
SALARY/NUM_EMP
FROM EMPLOYEES E
JOIN CNT_DEPT C
ON (e.department_id = c.department_id);

…
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

The SQL code in the slide is an example of a situation in which you can improve performance and
write SQL more simply by using the WITH clause. The query creates the query name as CNT_DEPT,
and then uses it in the body of the main query. Here, you perform a math operation by dividing the
salary of an employee with the total number of employees in each department. Internally, the WITH
clause is resolved either as an inline view or a temporary table. The optimizer chooses an
appropriate resolution depending on the cost or benefit of temporarily storing the results of the WITH
clause.
WITH Clause Usage Notes
• It is used only with SELECT statements.
• A query name is visible to all WITH element query blocks (including their subquery blocks) that
are defined after it and the main query block itself (including its subquery blocks).
• When the query name is the same as an existing table name, the parser searches from the
inside out, and the query block name takes precedence over the table name.
• The WITH clause can hold more than one query. Each query is then separated by a comma.

SQL Fundamentals 21 - 26

Oracle University Student Learning Subscription Use Only

WITH Clause: Example

Recursive WITH Clause

•
•
•
•

Enables formulation of recursive queries
Creates a query with a name, called the Recursive WITH element name
Contains two types of query block members: an anchor and a recursive
Is ANSI-compatible

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

The WITH clause has been extended to enable formulation of recursive queries.
Recursive WITH defines a recursive query with a name, the Recursive WITH element name. The
Recursive WITH element definition must contain at least two query blocks: an anchor member and a
recursive member. There can be multiple anchor members, but there can be only a single recursive
member. The anchor member must appear before the recursive member, and it cannot reference
query_name. The anchor member can be composed of one or more query blocks combined by the
set operators, for example, UNION ALL, UNION, INTERSECT, or MINUS. The recursive member must
follow the anchor member and must reference query_name exactly once. You must combine the
recursive member with the anchor member by using the UNION ALL set operator.
The Recursive WITH clause complies with the American National Standards Institute (ANSI)
standard.
Recursive WITH can be used to query hierarchical data such as organization charts.

SQL Fundamentals 21 - 27

Oracle University Student Learning Subscription Use Only

The Recursive WITH clause:

Recursive WITH Clause: Example

WITH Reachable_From (Source, Destin, TotalFlightTime) AS
(
SELECT Source, Destin, Flight_time
FROM Flights
UNION ALL
SELECT incoming.Source, outgoing.Destin,
incoming.TotalFlightTime+outgoing.Flight_time
FROM Reachable_From incoming, Flights outgoing
WHERE incoming.Destin = outgoing.Source
)
SELECT Source, Destin, TotalFlightTime
FROM Reachable_From;

2

3
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Example 1 in the slide displays records from a FLIGHTS table that describes flights between two
cities.
Using the query in example 2, you query the FLIGHTS table to display the total flight time between
any source and destination. The WITH clause in the query, which is named Reachable From, has a
UNION ALL query with two branches. The first branch is the anchor branch, which selects all the rows
from the Flights table. The second branch is the recursive branch. It joins the contents of
Reachable From to the Flights table to find other cities that can be reached, and adds these to
the content of Reachable From. The operation finishes when no more rows are found by the
recursive branch.
Example 3 displays the result of the query that selects everything from the WITH clause element
Reachable From.
For details, see:
• Oracle Database SQL Language Reference 12c Release 1.0
• Oracle Database Data Warehousing Guide 12c Release 1.0

SQL Fundamentals 21 - 28

Oracle University Student Learning Subscription Use Only

1

FLIGHTS Table

Q

Quiz

a.
b.

True
False

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Answer: b

SQL Fundamentals 21 - 29

Oracle University Student Learning Subscription Use Only

With a correlated subquery, the inner SELECT statement drives the outer
SELECT statement.

In this lesson, you should have learned how to:
• Write a multiple-column subquery
• Use scalar subqueries in SQL
• Solve problems with correlated subqueries
• Use the EXISTS and NOT EXISTS operators
• Use the WITH clause

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

You can use multiple-column subqueries to combine multiple WHERE conditions in a single WHERE
clause. Column comparisons in a multiple-column subquery can be pairwise comparisons or
nonpairwise comparisons.
You can use a subquery to define a table to be operated on by a containing query.
Scalar subqueries can be used in:
• The condition and expression part of DECODE and CASE
• All clauses of SELECT except GROUP BY
• The SET clause and WHERE clause of the UPDATE statement
The Oracle Server performs a correlated subquery when the subquery references a column from a
table referred to in the parent statement. A correlated subquery is evaluated once for each row
processed by the parent statement. The parent statement can be a SELECT statement. Using the
WITH clause, you can reuse the same query when it is costly to re-evaluate the query block and it
occurs more than once within a complex query.

SQL Fundamentals 21 - 30

Oracle University Student Learning Subscription Use Only

Summary

This practice covers the following topics:
• Creating multiple-column subqueries
• Writing correlated subqueries
• Using the EXISTS operator
•
•

Using scalar subqueries
Using the WITH clause

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

In this practice, you write multiple-column subqueries, and correlated and scalar subqueries. You
also solve problems by writing the WITH clause.

SQL Fundamentals 21 - 31

Oracle University Student Learning Subscription Use Only

Practice 21: Overview

Oracle University Student Learning Subscription Use Only

Lesson 22: Manipulating Data by
Using Advanced Subqueries

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Oracle University Student Learning Subscription Use Only

22

Course Roadmap
Lesson 1: Course Overview

Unit 2: Retrieving and Sorting Data

Lesson 21: Using Advanced Subqueries

Unit 3: Joins, Subqueries, and Set
Operators

Lesson 22: Manipulating Data by Using
Advanced Subqueries

Unit 4: DML and DDL

Lesson 23: Controlling User Access

Unit 5: Managing Relational Database

Lesson 24: Advanced Data Manipulation

Unit 6: Advance Queries and Database
Management System

Lesson 25: Managing Multiple Timezones

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

In Unit 6, you will be introduced to some advanced features of SQL. You will learn to write advanced
subqueries. You will learn to create users and manage users. You will also learn about managing
multiple timezomes.

SQL Fundamentals 22 - 2

Oracle University Student Learning Subscription Use Only

You are here

Unit 1: Relational Database and SQL
Overview

After completing this lesson, you should be able to:
• Use advanced subqueries to manipulate data
• Insert values by using a subquery as a target
• Use the WITH CHECK OPTION keyword on DML statements
• Use correlated subqueries to update and delete rows

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

In this lesson, you learn how to manipulate data in the Oracle database by using subqueries. You
also learn how to solve problems by using correlated subqueries.

SQL Fundamentals 22 - 3

Oracle University Student Learning Subscription Use Only

Objectives

•
•
•
•

Using subqueries to manipulate data
Inserting values by using a subquery as a target
Using the WITH CHECK OPTION keyword on DML statements
Using correlated subqueries to update and delete rows

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

SQL Fundamentals 22 - 4

Oracle University Student Learning Subscription Use Only

Lesson Agenda

You can use subqueries in data manipulation language (DML) statements to:
• Retrieve data by using an inline view
• Copy data from one table to another
• Update data in one table based on the values of another table
• Delete rows from one table based on rows in another table

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Subqueries can be used to retrieve data from a table that you can use as input to an INSERT into a
different table. Thus, you can easily copy large volumes of data from one table to another with a
single SELECT statement. Similarly, you can use subqueries to perform mass updates and deletes by
using them in the WHERE clause of the UPDATE and DELETE statements. You can also use
subqueries in the FROM clause of a SELECT statement. This is called an inline view.
Note: You learned how to update and delete rows based on another table in the lesson titled
“Managing Tables Using DML Statements.”

SQL Fundamentals 22 - 5

Oracle University Student Learning Subscription Use Only

Using Subqueries to Manipulate Data

•
•
•
•

Using subqueries to manipulate data
Inserting values by using a subquery as a target
Using the WITH CHECK OPTION keyword on DML statements
Using correlated subqueries to update and delete rows

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

SQL Fundamentals 22 - 6

Oracle University Student Learning Subscription Use Only

Lesson Agenda

INSERT INTO (SELECT l.location_id, l.city, l.country_id
FROM
loc l
JOIN
countries c
ON(l.country_id = c.country_id)
JOIN regions USING(region_id)
WHERE region_name = 'Europe')
VALUES (3300, 'Cardiff', 'UK');

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

You can use a subquery in place of the table name in the INTO clause of the INSERT statement. The
SELECT list of this subquery must have the same number of columns as the column list of the
VALUES clause. Any rules on the columns of the base table must be followed in order for the INSERT
statement to work successfully. For example, you cannot put in a duplicate location ID or leave out a
value for a mandatory NOT NULL column.
This use of subqueries helps you to avoid having to create a view only for performing an INSERT.
The example in the slide uses a subquery in place of LOC to create a record for a new European city.
Note: You can also perform the INSERT operation on the EUROPEAN_CITIES view by using the
following code:
INSERT INTO european_cities
VALUES (3300,'Cardiff','UK');
For the example in the slide, the loc table is created by running the following statement:
CREATE TABLE loc AS SELECT * FROM locations;

SQL Fundamentals 22 - 7

Oracle University Student Learning Subscription Use Only

Inserting by Using a Subquery as a Target

Inserting by Using a Subquery as a Target

SELECT location_id, city, country_id
FROM
loc;

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

The example in the slide shows that the insert via the inline view created a new record in the base
table LOC.
The following example shows the results of the subquery that was used to identify the table for the
INSERT statement.
SELECT l.location_id, l.city, l.country_id
FROM
loc l
JOIN
countries c
ON(l.country_id = c.country_id)
JOIN regions USING(region_id)
WHERE region_name = 'Europe‘;

SQL Fundamentals 22 - 8

Oracle University Student Learning Subscription Use Only

Verify the results.

•
•
•
•

Using subqueries to manipulate data
Inserting values by using a subquery as a target
Using the WITH CHECK OPTION keyword on DML statements
Using correlated subqueries to update and delete rows

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

SQL Fundamentals 22 - 9

Oracle University Student Learning Subscription Use Only

Lesson Agenda

Using the WITH CHECK OPTION Keyword on DML
Statements

INSERT INTO ( SELECT location_id, city, country_id
FROM
loc
WHERE country_id IN
(SELECT country_id
FROM countries
NATURAL JOIN regions
WHERE region_name = 'Europe')
WITH CHECK OPTION )
VALUES (3600, 'Washington', 'US');
Error report:
SQL Error: ORA-01402: view WITH CHECK OPTION where-clause violation
01402. 00000 - "view WITH CHECK OPTION where-clause violation"
*Cause:
*Action:

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Specify the WITH CHECK OPTION keyword to indicate that if a subquery is used in place of a table in
an INSERT, UPDATE, or DELETE statement, changes that will produce rows that are not included in
the subquery will not be permitted to that table.
The example in the slide shows how to use an inline view with WITH CHECK OPTION. The INSERT
statement prevents the creation of records in the LOC table for a city that is not in Europe.
The following example executes successfully because of the changes in the VALUES list.
INSERT INTO (SELECT location_id, city, country_id
FROM
loc
WHERE country_id IN
(SELECT country_id
FROM countries
NATURAL JOIN regions
WHERE region_name = 'Europe')
WITH CHECK OPTION)
VALUES (3500, 'Berlin', 'DE');

SQL Fundamentals 22 - 10

Oracle University Student Learning Subscription Use Only

The WITH CHECK OPTION keyword prohibits you from changing rows that are
not in the subquery.

To prevent the creation of a non-European city, you can also use a database view by
performing the following steps:
1. Create a database view:
CREATE OR REPLACE VIEW european_cities
AS
SELECT location_id, city, country_id
FROM
locations
WHERE country_id in
(SELECT country_id
FROM countries
NATURAL JOIN regions
WHERE region_name = 'Europe')
WITH CHECK OPTION;
2. Verify results by inserting data:
INSERT INTO european_cities
VALUES (3400,'New York','US');
The second step produces the same error as shown in the slide.

SQL Fundamentals 22 - 11

Oracle University Student Learning Subscription Use Only

The use of an inline view with the WITH CHECK OPTION provides an easy method to prevent
changes to the table.

•
•
•
•

Using subqueries to manipulate data
Inserting values by using a subquery as a target
Using the WITH CHECK OPTION keyword on DML statements
Using correlated subqueries to update and delete rows

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

SQL Fundamentals 22 - 12

Oracle University Student Learning Subscription Use Only

Lesson Agenda

Correlated UPDATE

UPDATE table1 alias1
SET
column = (SELECT expression
FROM
table2 alias2
WHERE alias1.column =
alias2.column);

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

In the case of an UPDATE statement, you can use a correlated subquery to update rows in one table
based on rows from another table.

SQL Fundamentals 22 - 13

Oracle University Student Learning Subscription Use Only

Use a correlated subquery to update rows in one table based on rows from
another table.

•
•

Denormalize the EMPL6 table by adding a column to store the department
name.
Populate the table by using a correlated update.
ALTER TABLE empl6
ADD(department_name VARCHAR2(25));
UPDATE empl6 e
SET
department_name =
(SELECT department_name
FROM
departments d
WHERE e.department_id = d.department_id);

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

The example in the slide denormalizes the EMPL6 table by adding a column to store the department
name, and then populates the table by using a correlated update.
Another example for a correlated update is as follows.
Problem Statement
The REWARDS table has a list of employees who have exceeded expectations in their performance.
Use a correlated subquery to update the rows in the EMPL6 table based on the rows from the
REWARDS table:
UPDATE empl6
SET
salary = (SELECT empl6.salary + rewards.pay_raise
FROM
rewards
WHERE employee_id =
empl6.employee_id
AND payraise_date =
(SELECT MAX(payraise_date)
FROM
rewards
WHERE employee_id = empl6.employee_id))
WHERE empl6.employee_id
IN
(SELECT employee_id FROM rewards);

SQL Fundamentals 22 - 14

Oracle University Student Learning Subscription Use Only

Using Correlated UPDATE

SQL Fundamentals 22 - 15

Oracle University Student Learning Subscription Use Only

This example uses the REWARDS table. The REWARDS table has the following columns:
EMPLOYEE_ID, PAY_RAISE, and PAYRAISE_DATE. Every time an employee gets a pay
raise, a record with details such as the employee ID, the amount of the pay raise, and the
date of receipt of the pay raise is inserted into the REWARDS table. The REWARDS table can
contain more than one record for an employee. The PAYRAISE _DATE column is used to
identify the most recent pay raise received by an employee.
In the example, the SALARY column in the EMPL6 table is updated to reflect the latest pay
raise received by an employee. This is done by adding the current salary of the employee with
the corresponding pay raise from the REWARDS table.

Correlated DELETE

DELETE FROM table1 alias1
WHERE column operator
(SELECT expression
FROM
table2 alias2
WHERE alias1.column = alias2.column);

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

In the case of a DELETE statement, you can use a correlated subquery to delete only those rows that
also exist in another table. If you decide that you will maintain only the last four job history records in
the JOB_HISTORY table, when an employee transfers to a fifth job, you delete the oldest
JOB_HISTORY row by looking up the JOB_HISTORY table for MIN(START_DATE) for the employee.
The following code illustrates how the preceding operation can be performed by using a correlated
DELETE:
DELETE FROM job_history JH
WHERE employee_id =
(SELECT employee_id
FROM employees E
WHERE JH.employee_id = E.employee_id
AND START_DATE =
(SELECT MIN(start_date)
FROM job_history JH
WHERE JH.employee_id = E.employee_id)
AND 5 > (SELECT COUNT(*)
FROM job_history JH
WHERE JH.employee_id = E.employee_id
GROUP BY EMPLOYEE_ID
HAVING COUNT(*) >= 4));

SQL Fundamentals 22 - 16

Oracle University Student Learning Subscription Use Only

Use a correlated subquery to delete rows in one table based on rows from
another table.

Using Correlated DELETE

DELETE FROM empl6 E
WHERE employee_id =
(SELECT employee_id
FROM
emp_history
WHERE employee_id = E.employee_id);

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Example
Two tables are used in this example. They are:
• The EMPL6 table, which provides details of all current employees
• The EMP_HISTORY table, which provides details of previous employees
EMP_HISTORY contains data about previous employees, so it would be erroneous if the same
employee’s record existed in both the EMPL6 and EMP_HISTORY tables. You can delete such
erroneous records by using the correlated subquery shown in the slide.

SQL Fundamentals 22 - 17

Oracle University Student Learning Subscription Use Only

Use a correlated subquery to delete only those rows from the EMPL6 table that
also exist in the EMP_HISTORY table.

In this lesson, you should have learned how to:
• Manipulate data by using subqueries
• Insert values by using a subquery as a target
• Use the WITH CHECK OPTION keyword on DML statements
• Use correlated subqueries with UPDATE and DELETE statements

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

In this lesson, you should have learned how to manipulate data in the Oracle database by using
subqueries. You learn how to use the WITH CHECK OPTION keyword on DML statements and use
correlated subqueries with UPDATE and DELETE statements.

SQL Fundamentals 22 - 18

Oracle University Student Learning Subscription Use Only

Summary

This practice covers the following topics:
• Using subqueries to manipulate data
• Inserting values by using a subquery as a target
• Using the WITH CHECK OPTION keyword on DML statements
• Using correlated subqueries to update and delete rows

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

In this practice, you learn the concepts of manipulating data by using subqueries, WITH CHECK
OPTION, and correlated subqueries to UPDATE and DELETE rows.

SQL Fundamentals 22 - 19

Oracle University Student Learning Subscription Use Only

Practice 22: Overview

Oracle University Student Learning Subscription Use Only

Lesson 23: Controlling User Access

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Oracle University Student Learning Subscription Use Only

23

Course Roadmap
Lesson 1: Course Overview

Unit 2: Retrieving and Sorting Data

You are
here

Unit 3: Joins, Subqueries, and Set
Operators
Unit 4: DML and DDL

Lesson 21: Using Advanced Subqueries
Lesson 22: Manipulating Data by Using
Advanced Subqueries
Lesson 23: Controlling User Access

Unit 5: Managing Relational Database

Lesson 24: Advanced Data Manipulation

Unit 6: Advance Queries and Database
Management System

Lesson 25: Managing Multiple Timezones

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

In Unit 6, you will be introduced to some advanced features of SQL. You will learn to write advanced
subqueries. You will learn to create users and manage users. You will also learn about managing
multiple timezomes.

SQL Fundamentals 23 - 2

Oracle University Student Learning Subscription Use Only

Unit 1: Relational Database and SQL
Overview

After completing this lesson, you should be able to:
• Differentiate system privileges from object privileges
• Grant privileges on tables
• Grant roles
• Distinguish between privileges and roles
• Describe Oracle Cloud service administration roles

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

In this lesson, you learn how to control database access to specific objects and add new users with
different levels of access privileges.

SQL Fundamentals 23 - 3

Oracle University Student Learning Subscription Use Only

Objectives

•
•
•
•
•

System privileges
Creating a role
Object privileges
Revoking object privileges
Oracle Cloud Service administration roles

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

SQL Fundamentals 23 - 4

Oracle University Student Learning Subscription Use Only

Lesson Agenda

Database Security
Database security can be classified as:
System Security

Data Security

Access and use of the database at the
system level such as
username/password security, disk space
allocation, and system operations
Access and use of the database objects
and the allowed actions

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

You must provide a basic level of database security. There must be some rules to control user
access to data and to limit the kinds of SQL statements that users can execute. When creating a
user, you grant those abilities (in the form of privileges) to enable the user to connect to the database,
to run queries and make updates, to create schema objects, and more.
Database security can be classified into two categories: system security and data security. System
security covers access and use of the database at the system level, such as the username and
password, the disk space allocated to users, and the system operations that users can perform. Data
security covers access and use of the database objects and the actions that specific users can
perform on the objects.
For more information, see the Oracle Database 2 Day DBA reference manual for Oracle
Database12c.

SQL Fundamentals 23 - 5

Oracle University Student Learning Subscription Use Only

•

Database
administrator

Administrator

Username and password
Privileges

Users

Users

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

In a multiple-user environment, you want to maintain security of database access and use. With
Oracle Server database security, you can do the following:
• Control database access.
• Give access to specific objects in the database.
• Confirm the given and received privileges with the Oracle data dictionary.

SQL Fundamentals 23 - 6

Oracle University Student Learning Subscription Use Only

Controlling User Access

Privileges
Privileges
• Right to execute
particular actions
using SQL statements
Administrator

System Privileges
• Ability to perform a
particular action
within the database
system, or to perform
an action on schema
objects

Object Privileges
• Ability to perform
specific actions on
the user schema
objects

Schemas
• Collection of
database objects
• Owned by a
database user

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

A privilege is the right to execute particular SQL statements. The database administrator (DBA) is a
high-level user with the ability to create users and grant users access to the database and its objects.
Users require system privileges to gain access to the database and object privileges to manipulate
the content of the objects in the database. Users can also be given the privilege to grant additional
privileges to other users or to roles, which are named groups of related privileges.
Schemas
A schema is a collection of objects such as tables, views, and sequences. The schema is owned by a
database user and has the same name as that user.
A system privilege is the right to perform a particular action within the database system, or to perform
an action on any schema objects of a particular type. An object privilege provides the user the ability
to perform a particular action on a specific schema object.
For more information, see the Oracle Database 2 Day DBA reference manual for Oracle
Database12c.

SQL Fundamentals 23 - 7

Oracle University Student Learning Subscription Use Only

Manages

•
•

More than 200 privileges are available.
The DBA has high-level system privileges.

New User

Administrator

•
•
•
•

Creating new users
Removing users
Removing tables
Backing up tables

User

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

More than 200 distinct system privileges are available for users and roles. Typically, system
privileges are provided by the DBA.
The table SYSTEM_PRIVILEGE_MAP contains all the system privileges available, based on the
version release. This table is also used to map privilege type numbers to type names.

SQL Fundamentals 23 - 8

Oracle University Student Learning Subscription Use Only

System Privileges

Typical DBA Privileges
Operations Authorized

CREATE USER

Grantee can create other Oracle users.

DROP USER

Grantee can drop another user.

DROP ANY TABLE

Grantee can drop a table in any schema.

BACKUP ANY TABLE

Grantee can back up any table in any schema
with the export utility.

SELECT ANY TABLE

Grantee can query tables, views, or
materialized views in any schema.

CREATE ANY TABLE

Grantee can create tables in any schema.

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

The DBA (Database Administrator) is a predefined role in Oracle Database. Any user who is
assigned the DBA role has almost all the rights, system and object, on the database system.
The DBA is a user who performs most administrative functions, including creating users and granting
privileges; creating and granting roles; and creating, modifying, and deleting schema objects. This
role grants all system privileges.

SQL Fundamentals 23 - 9

Oracle University Student Learning Subscription Use Only

System Privilege

Creating Users

CREATE USER user
IDENTIFIED BY
password;

Example:
CREATE USER demo
IDENTIFIED BY demo;

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

The DBA creates a user by executing the CREATE USER statement. The user does not have any
privileges at this point. The DBA can then grant privileges to that user. These privileges determine
what the user can do at the database level.
The slide gives the abridged syntax for creating a user.
In the syntax:
user
Password

Is the name of the user to be created
Specifies that the user must log in with this password

For more information, see the Oracle Database SQL Language Reference for Oracle Database12c.
Note: Starting with Oracle Database 11g, passwords are case-sensitive.

SQL Fundamentals 23 - 10

Oracle University Student Learning Subscription Use Only

The DBA creates users with the CREATE USER statement.

•

After a user is created, the DBA can grant specific
system privileges to that user.
GRANT privilege [, privilege...]
TO user [, user| role, PUBLIC...];

•

Is the name of the user,
the name of the role, or
PUBLIC (which
designates that every
user is granted the
privilege)

An application developer, for example, requires the
following system privileges:
CREATE SESSION

Connect to the database.

CREATE TABLE

Create tables in the user’s schema.

CREATE SEQUENCE

Create a sequence in the user’s
schema.

CREATE VIEW

Create a view in the user’s schema.

CREATE PROCEDURE

Create a stored procedure, function,
or package in the user’s schema.

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Typical User Privileges
After the DBA creates a user, the DBA can assign privileges to that user. Without these basic system
privileges, the new user can barely perform any database tasks.
In the syntax:
privilege
user|role|PUBLIC

Is the system privilege to be granted
Is the name of the user, the name of the role, or PUBLIC (which
designates that every user is granted the privilege)
Note: Current system privileges can be found in the SESSION_PRIVS dictionary view. Data
dictionary is a collection of tables and views created and maintained by the Oracle Server. These
data dictionary views contain information about the database.

SQL Fundamentals 23 - 11

Oracle University Student Learning Subscription Use Only

User System Privileges

Granting System Privileges

GRANT
TO

create session, create table,
create sequence, create view
demo;

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

The DBA uses the GRANT statement to allocate system privileges to the user. After the user has been
granted the privileges, the user can immediately use those privileges.
In the example in the slide, the demo user has been assigned the privileges to create sessions,
tables, sequences, and views.

SQL Fundamentals 23 - 12

Oracle University Student Learning Subscription Use Only

The DBA can grant specific system privileges to a user.

•
•
•
•
•

System privileges
Creating a role
Object privileges
Revoking object privileges
Oracle Cloud Service administration roles

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

SQL Fundamentals 23 - 13

Oracle University Student Learning Subscription Use Only

Lesson Agenda

Users
Manager
Privileges
Allocating privileges
without a role

Allocating privileges
with a role

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

A role is a named group of related privileges that can be granted to a user. This method makes it
easier to revoke and maintain privileges.
A user can have access to several roles, and several users can be assigned the same role. Roles are
typically created for a database application.
Creating and Assigning a Role
First, the DBA must create the role. Then the DBA can assign privileges to the role and assign the
role to users.
After the role is created, the DBA can use the GRANT statement to assign the role to users as well as
assign privileges to the role. A role is not a schema object; therefore, any user can add privileges to a
role.

SQL Fundamentals 23 - 14

Oracle University Student Learning Subscription Use Only

What Is a Role?

Role: Syntax

Users
CREATE ROLE role;

Manager
Privileges
Allocating privileges
with a role
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Syntax
CREATE

ROLE role;

In the syntax:
role Is the name of the role to be created
Oracle provides the following predefined roles:
• CONNECT: Required to connect to the database. You should grant this role to any user that
needs to access the database.
• RESOURCE: Required to create, modify, and delete schema objects in the user’s schema. You
should grant this role to users who create schema objects. This role grants a subset of the
create object system privileges.
• DBA: Required to perform most administrative functions, including creating users and roles;
granting privileges and roles; and creating, modifying, and deleting schema objects in any
schema. This role grants all system privileges.
Note: Users SYS and SYSTEM have the privileges to start or shut down the database instance.
These privileges are not included in the DBA role.

SQL Fundamentals 23 - 15

Oracle University Student Learning Subscription Use Only

CONNECT, RESOURCE, and DBA are predefined Oracle Database Roles.

Creating and Granting Privileges to a Role
Create a role:

1

CREATE ROLE manager;

•

Grant privileges to a role:
2
GRANT create table, create view
TO manager;

•

Grant a role to users:
3
GRANT manager TO alice;

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Creating a Role
The example in the slide creates a manager role and then enables the manager to create tables and
views. It then grants user alice the role of a manager. Now alice can create tables and views.
If users have multiple roles granted to them, they receive all the privileges associated with all the
roles.

SQL Fundamentals 23 - 16

Oracle University Student Learning Subscription Use Only

•

Changing Your Password
The DBA creates your user account and initializes your password.
You can change your password by using the ALTER USER statement.
ALTER USER user
IDENTIFIED BY password;

•

Example:
ALTER USER demo
IDENTIFIED BY employ;

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

The DBA creates an account and initializes a password for every user. You can change your
password by using the ALTER USER statement.
The slide example shows how the demo user changes the password by using the ALTER USER
statement.
For more information, see the Oracle Database SQL Language Reference for Oracle Database 12c.

SQL Fundamentals 23 - 17

Oracle University Student Learning Subscription Use Only

•
•

•
•
•
•
•

System privileges
Creating a role
Object privileges
Revoking object privileges
Oracle Cloud Service administration roles

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

SQL Fundamentals 23 - 18

Oracle University Student Learning Subscription Use Only

Lesson Agenda

•
•

Right to perform a particular action on a specific table, view, sequence, or
procedure
Vary from object to object

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

An object privilege is a privilege or right to perform a particular action on a specific table, view,
sequence, or procedure. Each object has a particular set of grantable privileges. Different object
privileges are available for different types of schema objects.

SQL Fundamentals 23 - 19

Oracle University Student Learning Subscription Use Only

Object Privileges

Object Privileges
Object Privilege

Table

View

Sequence

DELETE
INDEX
INSERT
REFERENCES
SELECT
UPDATE

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Each object has a particular set of grantable privileges. The table in the slide lists the privileges for
various objects. Note that the only privileges that apply to a sequence are SELECT and ALTER.
A SELECT privilege can be restricted by creating a view with a subset of columns and granting the
SELECT privilege only on the view. A privilege granted on a synonym is converted to a privilege on
the base table referenced by the synonym.
Note: With the REFERENCES privilege, you can ensure that other users can create FOREIGN KEY
constraints that reference your table.

SQL Fundamentals 23 - 20

Oracle University Student Learning Subscription Use Only

ALTER

•
•

An owner has all the privileges on the object.
An owner can grant specific privileges on the objects to other users.
Object privilege to be granted

Specifies ALL object
privileges

GRANT object_priv|ALL [(columns)]
ON
object
TO
{user|role|PUBLIC}
[WITH GRANT OPTION];

Enables the grantee to grant the object
privileges to other users and roles

Identifies to whom the privilege
is given; PUBLIC gives to all
users

Column from table or
view on which privileges
are granted

Table, view, sequence,
or procedure on which
privileges are granted

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Granting Object Privileges
A user automatically has all object privileges for schema objects contained in the user’s schema. A
user can grant any object privilege on any schema object that the user owns to any other user or role.
If the grant includes WITH GRANT OPTION, the grantee can further grant the object privilege to other
users; otherwise, the grantee can use the privilege but cannot grant it to other users.

SQL Fundamentals 23 - 21

Oracle University Student Learning Subscription Use Only

Object Privileges

Granting Object Privileges
Grant query privileges on the EMPLOYEES table:
GRANT
ON
TO

•

select
employees
demo;

Grant privileges to update specific columns to users and roles:
GRANT
ON
TO

update (department_name, location_id)
departments
demo, manager;

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Guidelines
•

To grant privileges on an object, the object must be in your own schema, or you must have
been granted the object privileges WITH GRANT OPTION.

An object owner can grant any object privilege on the object to any other user or role of the
database.
• The owner of an object automatically acquires all object privileges on that object.
The first example in the slide grants the demo user the privilege to query your EMPLOYEES table. The
second example grants UPDATE privileges on specific columns in the DEPARTMENTS table to demo
and to the manager role.
•

For example, if your schema is oraxx, and the demo user now wants to use a SELECT statement to
obtain data from your EMPLOYEES table, the syntax he or she must use is:
SELECT * FROM oraxx.employees;
Alternatively, the demo user can create a synonym for the table and issue a SELECT statement from
the synonym:
CREATE SYNONYM emp FOR oraxx.employees;
SELECT * FROM emp;
Note: DBAs generally allocate system privileges; any user who owns an object can grant object
privileges.

SQL Fundamentals 23 - 22

Oracle University Student Learning Subscription Use Only

•

Passing On Your Privileges
Give a user authority to pass along privileges:
GRANT
ON
TO
WITH

•

select, insert
departments
demo
GRANT OPTION;

Allow all users on the system to query data from the DEPARTMENTS table:
GRANT select
ON
departments
TO
PUBLIC;

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

WITH GRANT OPTION
A privilege that is granted with the WITH GRANT OPTION clause can be passed on to other users
and roles by the grantee. Object privileges granted with the WITH GRANT OPTION clause are
revoked when the grantor’s privilege is revoked. You can specify WITH GRANT OPTION only when
granting to a user or to PUBLIC, not when granting to a role.
The grantor must meet one or more of the following criteria. The grantor:
• Must be the object owner or must have object access with GRANT OPTION from the user
• Must have the GRANT ANY OBJECT PRIVILEGE system privilege and an object privilege on
the object
The example in the slide gives the demo user access to your DEPARTMENTS table with the privileges
to query the table and add rows to the table. The example also shows that demo can give others
these privileges.
PUBLIC Keyword
An owner of a table can grant access to all users by using the PUBLIC keyword. The second
example allows all users on the system to query data from the DEPARTMENTS table.

SQL Fundamentals 23 - 23

Oracle University Student Learning Subscription Use Only

•

Confirming Granted Privileges
Description

ROLE_SYS_PRIVS

System privileges granted to roles

ROLE_TAB_PRIVS

Table privileges granted to roles

USER_ROLE_PRIVS

Roles accessible by the user

USER_SYS_PRIVS

System privileges granted to the user

USER_TAB_PRIVS_MADE

Object privileges granted on the user’s objects

USER_TAB_PRIVS_RECD

Object privileges granted to the user

USER_COL_PRIVS_MADE

Object privileges granted on the columns of the user’s objects

USER_COL_PRIVS_RECD

Object privileges granted to the user on specific columns

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

If you attempt to perform an unauthorized operation, such as deleting a row from a table for which
you do not have the DELETE privilege, the Oracle server does not permit the operation to take place.
If you receive the Oracle server error message “Table or view does not exist,” you have done either
of the following:
• Named a table or view that does not exist
• Attempted to perform an operation on a table or view for which you do not have the appropriate
privilege
The data dictionary is organized in tables and views and contains information about the database.
You can access the data dictionary to view the privileges that you have. The table in the slide
describes various data dictionary views.
You learn about data dictionary views in the lesson titled “Introduction to Data Dictionary Views.”
Note: The ALL_TAB_PRIVS_MADE dictionary view describes all the object grants made by the user
or made on the objects owned by the user.

SQL Fundamentals 23 - 24

Oracle University Student Learning Subscription Use Only

Data Dictionary View

•
•
•
•
•

System privileges
Creating a role
Object privileges
Revoking object privileges
Oracle Cloud Service administration roles

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

SQL Fundamentals 23 - 25

Oracle University Student Learning Subscription Use Only

Lesson Agenda

•
•

You use the REVOKE statement to revoke privileges granted to other users.
Privileges granted to others through the WITH GRANT OPTION clause are
also revoked.

REVOKE {privilege [, privilege...]|ALL}
ON
object
FROM
{user[, user...]|role|PUBLIC};

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

You can remove privileges granted to other users by using the REVOKE statement. When you use the
REVOKE statement, the privileges that you specify are revoked from the users you name and from
any other users to whom those privileges were granted by the revoked user.
For more information, see the Oracle Database SQL Language Reference for Oracle Database12c.
Note: If a user leaves the company and you revoke his or her privileges, you must regrant any
privileges that this user granted to other users. If you drop the user account without revoking
privileges from it, the system privileges granted by this user to other users are not affected by this
action.

SQL Fundamentals 23 - 26

Oracle University Student Learning Subscription Use Only

Revoking Object Privileges

Revoking Object Privileges

REVOKE
ON
FROM

select, insert
departments
demo;

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

The example in the slide revokes the SELECT and INSERT privileges given to the demo user on the
DEPARTMENTS table.
Note: If a user is granted a privilege with the WITH GRANT OPTION clause, that user can also grant
the privilege with the WITH GRANT OPTION clause, so that a long chain of grantees is possible, but
no circular grants (granting to a grant ancestor) are permitted. If the owner revokes a privilege from a
user who granted the privilege to other users, the revoking cascades to all the privileges granted.
For example, if user A grants a SELECT privilege on a table to user B including the WITH GRANT
OPTION clause, user B can grant to user C the SELECT privilege with the WITH GRANT OPTION
clause as well, and user C can then grant to user D the SELECT privilege. If user A revokes privileges
from user B, the privileges granted to users C and D are also revoked.

SQL Fundamentals 23 - 27

Oracle University Student Learning Subscription Use Only

Revoke the SELECT and INSERT privileges given to the demo user on the
DEPARTMENTS table.

•
•
•
•
•

System privileges
Creating a role
Object privileges
Revoking object privileges
Oracle Cloud Service administration roles

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

SQL Fundamentals 23 - 28

Oracle University Student Learning Subscription Use Only

Lesson Agenda

Oracle Cloud Service Administration Roles
Tasks

Buyer

• Controls the buying process
• Designates the initial account
administrator for the Oracle Cloud service

Account Administrator

• Activates and creates identity domains
• Monitors status and usage of services

Identity Administrator

• Creates and manages users who access
the Oracle Cloud services
• Assigns and manages user roles

Service Administrator

• Administers an Oracle Cloud service
• Monitors the service status and usage

Cloud
Administrators

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

With the Oracle Database as a Service cloud technology, various Oracle Cloud user roles have
originated. The slide describes the user roles and the privileges associated with each role.
A user can be assigned more than one role. A role may include privileges that let the user purchase
an Oracle Cloud service, manage one or more Oracle Cloud services, or manage the accounts of the
users who can access a service.
These roles are not predefined.
When Oracle Cloud services are provisioned in an identity domain, Oracle Cloud automatically
populates the My Services application with several roles and several user accounts. These roles:
• Are based on the type of Oracle Cloud service being provisioned
• Include both administrative roles and non-administrative roles
• Grant certain privileges to the users based on the role assigned to them. Users can be assigned
more than one role.
There are many concepts and details associated with this topic that are out of the scope of this
course. For more information, refer to the Oracle Cloud Help Center at:
https://docs.oracle.com/cloud/latest/

SQL Fundamentals 23 - 29

Oracle University Student Learning Subscription Use Only

Roles

Which one of the following is a collection of objects such as tables, views, and
sequences, that is owned by a database user and has the same name?
a. Administrator
b. Schema
c. Privilege
d. Role

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Answer: b

SQL Fundamentals 23 - 30

Oracle University Student Learning Subscription Use Only

Q

Quiz

A database role can only be created by a user with DBA privileges.
a. True
b. False

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Answer: a

SQL Fundamentals 23 - 31

Oracle University Student Learning Subscription Use Only

Q

Quiz

Which command can you use to change your password?
a. ALTER USER
b. REVOKE
c. GRANT

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Answer: a

SQL Fundamentals 23 - 32

Oracle University Student Learning Subscription Use Only

Q

Quiz

Which of the following statements are true?
a. After a user creates an object, the user can pass along any of the available
object privileges to other users by using the GRANT statement.
b. Users cannot view the privileges granted to them and those that are granted
on their objects.

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Answer: a

SQL Fundamentals 23 - 33

Oracle University Student Learning Subscription Use Only

Q

Quiz

In this lesson, you should have learned how to:
• Differentiate system privileges from object privileges
• Grant privileges on tables
• Grant roles
• Distinguish between privileges and roles

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

DBAs establish initial database security for users by assigning privileges to the users.
• The DBA creates users who must have a password. The DBA is also responsible for
establishing the initial system privileges for a user.
• After the user has created an object, the user can pass along any of the available object
privileges to other users or to all users by using the GRANT statement.
• A DBA can create roles by using the CREATE ROLE statement to pass along a collection of
system or object privileges to multiple users. Roles make granting and revoking privileges
easier to maintain.
• Users can change their passwords by using the ALTER USER statement.
• You can remove privileges from users by using the REVOKE statement.
•

With data dictionary views, users can view the privileges granted to them and those that are
granted on their objects.

SQL Fundamentals 23 - 34

Oracle University Student Learning Subscription Use Only

Summary

This practice covers the following topics:
• Creating a new user
• Granting the user system privileges through a pre-defined role
• Granting the user privileges to your table
• Accessing data in the new users SQL Developer session

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

In this practice, you learn how to grant other users privileges to your table and how to modify another
user’s table through the privileges granted to you.

SQL Fundamentals 23 - 35

Oracle University Student Learning Subscription Use Only

Practice 23: Overview

Oracle University Student Learning Subscription Use Only

Lesson 24: Advanced Data
Manipulation

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Oracle University Student Learning Subscription Use Only

24

Course Roadmap
Lesson 1: Course Overview

Unit 2: Retrieving and Sorting Data

Lesson 21: Using Advanced Subqueries

Unit 3: Joins, Subqueries, and Set
Operators

Lesson 22: Manipulating Data by Using
Advanced Subqueries

Unit 4: DML and DDL

Lesson 23: Controlling User Access

Unit 5: Managing Relational Database

Lesson 24: Advanced Data Manipulation

Unit 6: Advance Queries and Database
Management System

Lesson 25: Managing Multiple Timezones

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

In Unit 6, you will be introduced to some advanced features of SQL. You will learn to write advanced
subqueries. You will learn to create users and manage users. You will also learn about managing
multiple timezomes.

SQL Fundamentals 24 - 2

Oracle University Student Learning Subscription Use Only

You are here

Unit 1: Relational Database and SQL
Overview

After completing this lesson, you should be able to:
• Specify explicit default values in the INSERT and UPDATE statements
• Describe the features of multitable INSERTs
• Use the following types of multitable INSERTs:
–
–
–
–

•
•
•

Unconditional INSERT
Conditional INSERT ALL
Conditional INSERT FIRST
Pivoting INSERT

Merge rows in a table
Perform flashback operations
Track changes made to data over a period of time

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

In this lesson, you learn how to use the DEFAULT keyword in INSERT and UPDATE statements to
identify a default column value. You also learn about multitable INSERT statements, the MERGE
statement, performing flashback operations, and tracking changes in the database.

SQL Fundamentals 24 - 3

Oracle University Student Learning Subscription Use Only

Objectives

Lesson Agenda
Specifying explicit default values in INSERT and UPDATE statements
Using the following types of multitable INSERTs:
–
–
–
–

•
•
•

Unconditional INSERT
Conditional INSERT ALL
Conditional INSERT FIRST
Pivoting INSERT

Merging rows in a table
Performing flashback operations
Tracking changes to data over a period of time

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

SQL Fundamentals 24 - 4

Oracle University Student Learning Subscription Use Only

•
•

Use the DEFAULT keyword
as a column value where a
default column value is
desired.

This allows the user to control where
and when the default value should be
applied to data.

DEFAULT

Explicit defaults can be used
in INSERT and UPDATE
statements.

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

The DEFAULT keyword can be used in INSERT and UPDATE statements to identify a default column
value. If no default value exists, a null value is used.
The DEFAULT option saves you from having to hard code the default value in your programs or query
the dictionary to find it, as was done before this feature was introduced. Hard-coding the default is a
problem if the default changes, because the code consequently needs changing. Accessing the
dictionary is not usually done in an application; therefore, this is a very important feature.

SQL Fundamentals 24 - 5

Oracle University Student Learning Subscription Use Only

Explicit Default Feature: Overview

Using Explicit Default Values
DEFAULT with INSERT:

INSERT INTO deptm3
(department_id, department_name, manager_id)
VALUES (300, 'Engineering', DEFAULT);
•

DEFAULT with UPDATE:

UPDATE deptm3
SET manager_id = DEFAULT
WHERE department_id = 10;

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Specify DEFAULT to set the column to the value that was previously specified as the default value for
the column. If no default value for the corresponding column has been specified, the Oracle Server
sets the column to null.
In the first example in the slide, the INSERT statement uses a default value for the MANAGER_ID
column. If no default value is defined for the column, a null value is inserted instead.
The second example uses the UPDATE statement to set the MANAGER_ID column to a default value
for department 10. If no default value is defined for the column, it changes the value to null.
Note: When creating a table, you can specify a default value for a column. This is discussed in the
lesson titled “Introduction to Data Definition Language.”

SQL Fundamentals 24 - 6

Oracle University Student Learning Subscription Use Only

•

Lesson Agenda
Specifying explicit default values in INSERT and UPDATE statements
Using the following types of multitable INSERTs:
–
–
–
–

•
•
•

Unconditional INSERT
Conditional INSERT ALL
Conditional INSERT FIRST
Pivoting INSERT

Merging rows in a table
Performing flashback operations
Tracking changes to data over a period of time

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

SQL Fundamentals 24 - 7

Oracle University Student Learning Subscription Use Only

•
•

Multitable INSERT Statements: Overview

Target_a
Sourcetab

Subquery

INSERT ALL
INTO target_a VALUES(…,…,…)
INTO target_b VALUES(…,…,…)
INTO target_c VALUES(…,…,…)
SELECT …
FROM sourcetab
WHERE …;

Target_b

Target_c

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

In a multitable INSERT statement, you insert computed rows derived from the rows returned from the
evaluation of a subquery into one or more tables.
Multitable INSERT statements are useful in a data warehouse scenario. You need to load your data
warehouse regularly so that it can serve its purpose of facilitating business analysis. To do this, data
from one or more operational systems must be extracted and copied into the warehouse. The
process of extracting data from the source system and bringing it into the data warehouse is
commonly called ETL, which stands for extraction, transformation, and loading.
During extraction, the desired data must be identified and extracted from many different sources,
such as database systems and applications. After extraction, the data must be physically transported
to the target system or an intermediate system for further processing. Depending on the chosen
means of transportation, some transformations can be done during this process. For example, a SQL
statement that directly accesses a remote target through a gateway can concatenate two columns as
part of the SELECT statement.
After data is loaded into the Oracle database, data transformations can be executed by using SQL
operations. A multitable INSERT statement is one of the techniques for implementing SQL data
transformations.

SQL Fundamentals 24 - 8

Oracle University Student Learning Subscription Use Only

Multitable Insert

•
•
•

Use the INSERT…SELECT statement to insert rows into multiple tables as
part of a single DML statement.
Multitable INSERT statements are used in data warehousing systems to
transfer data from one or more operational sources to a set of target tables.
They provide significant performance improvement:
–

Single DML versus multiple INSERT…SELECT statements

–

Single DML versus a procedure to perform multiple inserts by
using the IF...THEN syntax

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Multitable INSERT statements offer the benefits of the INSERT ... SELECT statement when multiple
tables are involved as targets. Without multitable INSERT, you had to deal with n independent
INSERT ... SELECT statements, thus processing the same source data n times and increasing the
transformation workload n times.
As with the existing INSERT ... SELECT statement, the new statement can be parallelized and used
with the direct-load mechanism for faster performance.
Each record from any input stream, such as a nonrelational database table, can now be converted
into multiple records for a more relational database table environment. To alternatively implement this
functionality, you were required to write multiple INSERT statements.

SQL Fundamentals 24 - 9

Oracle University Student Learning Subscription Use Only

Multitable INSERT Statements: Overview

The different types of multitable INSERT statements are:
• Unconditional INSERT
• Conditional INSERT ALL
• Conditional INSERT FIRST
• Pivoting INSERT

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

You use different clauses to indicate the type of INSERT to be executed. The types of multitable
INSERT statements are:
• Unconditional INSERT: For each row returned by the subquery, a row is inserted into each of
the target tables.
• Conditional INSERT ALL: For each row returned by the subquery, a row is inserted into each
target table if the specified condition is met.
• Conditional INSERT FIRST: For each row returned by the subquery, a row is inserted into the
very first target table in which the condition is met.
• Pivoting INSERT: This is a special case of the unconditional INSERT ALL.

SQL Fundamentals 24 - 10

Oracle University Student Learning Subscription Use Only

Types of Multitable INSERT Statements

Multitable INSERT Statements
Syntax for multitable INSERT:
{ ALL
{ insert_into_clause [ values_clause ]}...
| conditional_insert_clause
} subquery

•

conditional_insert_clause:
[ ALL | FIRST ]
WHEN condition THEN insert_into_clause
[ values_clause ]
[ insert_into_clause [ values_clause ]]…
[ ELSE insert_into_clause
[ values_clause ]
[ insert_into_clause [ values_clause ]]…
]
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

The slide displays the generic format for multitable INSERT statements.
Unconditional INSERT: ALL into_clause
Specify ALL followed by multiple insert_into_clauses to perform an unconditional multitable
INSERT. The Oracle Server executes each insert_into_clause once for each row returned by
the subquery.
Conditional INSERT: conditional_insert_clause
Specify the conditional_insert_clause to perform a conditional multitable INSERT. The
Oracle Server filters each insert_into_clause through the corresponding WHEN condition, which
determines whether that insert_into_clause is executed. A single multitable INSERT statement
can contain up to 127 WHEN clauses.
Conditional INSERT: ALL
If you specify ALL, the Oracle Server evaluates each WHEN clause regardless of the results of the
evaluation of any other WHEN clause. For each WHEN clause whose condition evaluates to true, the
Oracle Server executes the corresponding INTO clause list.
Conditional INSERT: FIRST
If you specify FIRST, the Oracle Server evaluates each WHEN clause in the order in which it appears
in the statement. If the first WHEN clause evaluates to true, the Oracle Server executes the
corresponding INTO clause and skips subsequent WHEN clauses for the given row.

SQL Fundamentals 24 - 11

Oracle University Student Learning Subscription Use Only

•

Conditional INSERT: ELSE Clause

Restrictions on Multitable INSERT Statements
• You can perform multitable INSERT statements only on tables, and not on views or materialized
views.
• You cannot perform a multitable INSERT on a remote table.
• You cannot specify a table collection expression when performing a multitable INSERT.
• In a multitable INSERT, all insert_into_clauses cannot combine to specify more than 999
target columns.

SQL Fundamentals 24 - 12

Oracle University Student Learning Subscription Use Only

For a given row, if no WHEN clause evaluates to true:
• If you have specified an ELSE clause, the Oracle Server executes the INTO clause list
associated with the ELSE clause
• If you did not specify an ELSE clause, the Oracle Server takes no action for that row

Unconditional INSERT ALL
Select the EMPLOYEE_ID, HIRE_DATE, SALARY, and MANAGER_ID values
from the EMPLOYEES table for those employees whose EMPLOYEE_ID is
greater than 200.
• Insert these values into the SAL_HISTORY and MGR_HISTORY tables by
using a multitable INSERT.
INSERT ALL
INTO sal_history VALUES(EMPID,HIREDATE,SAL)
INTO mgr_history VALUES(EMPID,MGR,SAL)
SELECT employee_id EMPID, hire_date HIREDATE,
salary SAL, manager_id MGR
FROM employees
WHERE employee_id > 200;

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

The example in the slide inserts rows into both the SAL_HISTORY and the MGR_HISTORY tables.
The SELECT statement retrieves the details of employee ID, hire date, salary, and manager ID of
those employees whose employee ID is greater than 200 from the EMPLOYEES table. The details of
the employee ID, hire date, and salary are inserted into the SAL_HISTORY table. The details of
employee ID, manager ID, and salary are inserted into the MGR_HISTORY table.
This INSERT statement is referred to as an unconditional INSERT because no further restriction is
applied to the rows that are retrieved by the SELECT statement. All the rows retrieved by the SELECT
statement are inserted into the two tables: SAL_HISTORY and MGR_HISTORY. The VALUES clause in
the INSERT statements specifies the columns from the SELECT statement that must be inserted into
each of the tables. Each row returned by the SELECT statement results in two insertions: one for the
SAL_HISTORY table and one for the MGR_HISTORY table.
A total of 12 rows were inserted:
SELECT COUNT(*) total_in_sal FROM sal_history;
SELECT COUNT(*) total_in_mgr FROM mgr_history;

SQL Fundamentals 24 - 13

Oracle University Student Learning Subscription Use Only

•

Hired before
2015
EMP_HISTORY
Employees

With sales
commission
EMP_SALES

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

For all employees in the EMPLOYEES table, if an employee was hired before 2015, insert that
employee record into employee history. If the employee earns a sales commission, insert the record
information into the EMP_SALES table. The SQL statement is shown on the next page.

SQL Fundamentals 24 - 14

Oracle University Student Learning Subscription Use Only

Conditional INSERT ALL: Example

Conditional INSERT ALL
INSERT

ALL

INTO emp_history VALUES(EMPID,HIREDATE,SAL)
WHEN COMM IS NOT NULL THEN
INTO emp_sales VALUES(EMPID,COMM,SAL)
SELECT employee_id EMPID, hire_date HIREDATE,
salary SAL, commission_pct COMM
FROM

employees;

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

The example in the slide is similar to the example in the previous slide because it inserts rows into
both the EMP_HISTORY and EMP_SALES tables. The SELECT statement retrieves details such as
employee ID, hire date, salary, and commission percentage for all employees from the EMPLOYEES
table. Details such as employee ID, hire date, and salary are inserted into the EMP_HISTORY table.
Details such as employee ID, commission percentage, and salary are inserted into the EMP_SALES
table.
This INSERT statement is referred to as a conditional INSERT ALL because a further restriction is
applied to the rows that are retrieved by the SELECT statement. From the rows that are retrieved by
the SELECT statement, only those rows in which the hire date is before 2015 are inserted in the
EMP_HISTORY table. Similarly, only those rows where the value of commission percentage is not null
are inserted in the EMP_SALES table.
SELECT count(*) FROM emp_history;
Result:

15 rows fetched.
SELECT count(*) FROM emp_sales;

Result:

4 rows fetched.

SQL Fundamentals 24 - 15

Oracle University Student Learning Subscription Use Only

WHEN HIREDATE < '01-JAN-15' THEN

You can also optionally use the ELSE clause with the INSERT ALL statement.

INSERT ALL
WHEN job_id IN
(select job_id FROM jobs WHERE job_title LIKE '%Manager%') THEN
INTO managers2(last_name,job_id,SALARY)
VALUES (last_name,job_id,SALARY)
WHEN SALARY>10000 THEN
INTO richpeople(last_name,job_id,SALARY)
VALUES (last_name,job_id,SALARY)
ELSE
INTO poorpeople VALUES (last_name,job_id,SALARY)
SELECT * FROM employees;
Result:
24 rows inserted

SQL Fundamentals 24 - 16

Oracle University Student Learning Subscription Use Only

Example:

Scenario: If an employee
salary is 2,000, the record
is inserted into the
SAL_LOW table only.

Salary < 5,000
SAL_LOW
5000 <= Salary
<= 10,000
SAL_MID

EMPLOYEES
Otherwise
SAL_HIGH
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

For all employees in the EMPLOYEES table, insert employee information into the first target table that
meets the condition. In the example, if an employee has a salary of 2,000, the record is inserted into
the SAL_LOW table only. The SQL statement is shown on the next page.

SQL Fundamentals 24 - 17

Oracle University Student Learning Subscription Use Only

Conditional INSERT FIRST: Example

Conditional INSERT FIRST
INSERT FIRST

INTO sal_low VALUES (employee_id, last_name, salary)
WHEN salary between 5000 and 10000 THEN
INTO sal_mid VALUES (employee_id, last_name, salary)
ELSE
INTO sal_high VALUES (employee_id, last_name, salary)
SELECT employee_id, last_name, salary
FROM employees;

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

The SELECT statement retrieves details such as employee ID, last name, and salary for every
employee in the EMPLOYEES table. For each employee record, the information is inserted into the
very first target table that meets the condition.
This INSERT statement is referred to as a conditional INSERT FIRST. The WHEN salary < 5000
condition is evaluated first. If this first WHEN clause evaluates to true, the Oracle Server executes the
corresponding INTO clause and inserts the record into the SAL_LOW table. It skips subsequent WHEN
clauses for this row.
If the row does not satisfy the first WHEN condition (WHEN salary < 5000), the next condition (WHEN
salary between 5000 and 10000) is evaluated. If this condition evaluates to true, the record is
inserted into the SAL_MID table, and the last condition is skipped.
If neither the first condition (WHEN salary < 5000) nor the second condition (WHEN salary
between 5000 and 10000) evaluates to true, the Oracle Server executes the corresponding
INTO clause for the ELSE clause.

SQL Fundamentals 24 - 18

Oracle University Student Learning Subscription Use Only

WHEN salary < 5000 THEN

A total of 20 rows are inserted:
SELECT count(*) low FROM sal_low;

SELECT count(*) mid FROM sal_mid;
6 rows fetched.

SELECT count(*) high FROM sal_high;
8 rows fetched.

SQL Fundamentals 24 - 19

Oracle University Student Learning Subscription Use Only

6 rows fetched.

Pivoting INSERT

Emp_ID

Week_ID

MON

TUES

WED

THUR

FRI

176

6

2000

3000

4000

5000

6000

Employee_ID

WEEK

SALES

176

6

2000

176

6

3000

176

6

4000

176

6

5000

176

6

6000

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Pivoting is an operation in which you must build a transformation such that each record from any
input stream, such as a nonrelational database table, must be converted into multiple records for a
more relational database table environment.
Suppose you receive a set of sales records from a nonrelational database table:
SALES_SOURCE_DATA, in the following format:
EMPLOYEE_ID, WEEK_ID, SALES_MON, SALES_TUE, SALES_WED,
SALES_THUR, SALES_FRI
You want to store these records in the SALES_INFO table in a more typical relational format:
EMPLOYEE_ID, WEEK, SALES
To solve this problem, you must build a transformation such that each record from the original
nonrelational database table, SALES_SOURCE_DATA, is converted into five records for the data
warehouse’s SALES_INFO table. This operation is commonly referred to as pivoting.
The solution to this problem is shown on the next page.

SQL Fundamentals 24 - 20

Oracle University Student Learning Subscription Use Only

Convert the set of sales records from the nonrelational database table to the
relational format.

INSERT ALL
INTO sales_info VALUES (employee_id,week_id,sales_MON)
INTO sales_info VALUES (employee_id,week_id,sales_TUE)
INTO sales_info VALUES (employee_id,week_id,sales_WED)
INTO sales_info VALUES (employee_id,week_id,sales_THUR)
INTO sales_info VALUES (employee_id,week_id, sales_FRI)
SELECT EMPLOYEE_ID, week_id, sales_MON, sales_TUE,
sales_WED, sales_THUR,sales_FRI
FROM sales_source_data;

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

In the example in the slide, the sales data is received from the nonrelational database table,
SALES_SOURCE_DATA, which includes details of the sales performed by a sales representative on
each day of a week, for a week with a particular week ID.
DESC SALES_SOURCE_DATA

SQL Fundamentals 24 - 21

Oracle University Student Learning Subscription Use Only

Pivoting INSERT

SELECT * FROM SALES_SOURCE_DATA;

SELECT * FROM sales_info;

Observe in the preceding example that by using a pivoting INSERT, one row from the
SALES_SOURCE_DATA table is converted into five records for the relational table, SALES_INFO.

SQL Fundamentals 24 - 22

Oracle University Student Learning Subscription Use Only

DESC SALES_INFO

Lesson Agenda
Specifying explicit default values in INSERT and UPDATE statements
Using the following types of multitable INSERTs:
–
–
–
–

•
•
•

Unconditional INSERT
Conditional INSERT ALL
Conditional INSERT FIRST
Pivoting INSERT

Merging rows in a table
Performing flashback operations
Tracking changes to data over a period of time

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

SQL Fundamentals 24 - 23

Oracle University Student Learning Subscription Use Only

•
•

•
•

Provides the ability to conditionally update, insert, or delete data in a
database table
Performs an UPDATE if the row exists, and an INSERT if it is a new row:
–
–
–

Avoids separate updates
Increases performance and ease of use
Is useful in data warehousing applications

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

The Oracle Server supports the MERGE statement for INSERT, UPDATE, and DELETE operations.
Using this statement, you can update, insert, or delete a row conditionally in a table, thus avoiding
multiple DML statements. The decision whether to perform update, insert, or delete in the target table
is based on a condition in the ON clause.
You must have the INSERT and UPDATE object privileges on the target table and the SELECT object
privilege on the source table. To specify the DELETE clause of merge_update_clause, you must
also have the DELETE object privilege on the target table.
The MERGE statement is deterministic. You cannot update the same row of the target table multiple
times in the same MERGE statement.
An alternative approach is to use PL/SQL loops and multiple DML statements. The MERGE statement,
however, is easy to use and more simply expressed as a single SQL statement.
The MERGE statement is suitable in a number of data warehousing applications. For example, in a
data warehousing application, you may need to work with data coming from multiple sources, some
of which may be duplicates. With the MERGE statement, you can conditionally add or modify rows.

SQL Fundamentals 24 - 24

Oracle University Student Learning Subscription Use Only

MERGE Statement

MERGE Statement Syntax

MERGE INTO table_name table_alias
USING (table|view|sub_query) alias
ON (join condition)
WHEN MATCHED THEN
UPDATE SET
col1 = col1_val,
col2 = col2_val
WHEN NOT MATCHED THEN
INSERT (column_list)
VALUES (column_values);
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Merging Rows
You can update existing rows, and insert new rows conditionally by using the MERGE statement.
Using the MERGE statement, you can delete obsolete rows at the same time as you update rows in a
table. To do this, you include a DELETE clause with its own WHERE clause in the syntax of the MERGE
statement.
In the syntax:
INTO clause
USING clause
ON clause
WHEN MATCHED |

Specifies the target table you are updating or inserting into
Identifies the source of the data to be updated or inserted; can be
a table, view, or subquery
The condition on which the MERGE operation either updates or
inserts
Instructs the server on how it should respond to the results of the join
condition

WHEN NOT MATCHED
Note: For more information, see Oracle Database SQL Language Reference for Oracle Database
12c.

SQL Fundamentals 24 - 25

Oracle University Student Learning Subscription Use Only

You can conditionally insert, update, or delete rows in a table by using the
MERGE statement.

Insert or update rows in the COPY_EMP3 table to match the EMPLOYEES table.
MERGE INTO copy_emp3 c
USING (SELECT * FROM EMPLOYEES ) e
ON (c.employee_id = e.employee_id)
WHEN MATCHED THEN
UPDATE SET
c.first_name = e.first_name,
c.last_name = e.last_name,
...
DELETE WHERE (E.COMMISSION_PCT IS NOT NULL)
WHEN NOT MATCHED THEN
INSERT VALUES(e.employee_id, e.first_name, e.last_name,
e.email, e.phone_number, e.hire_date, e.job_id,
e.salary, e.commission_pct, e.manager_id,
e.department_id);

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

MERGE INTO copy_emp3 c
USING (SELECT * FROM EMPLOYEES ) e
ON (c.employee_id = e.employee_id)
WHEN MATCHED THEN
UPDATE SET
c.first_name = e.first_name,
c.last_name = e.last_name,
c.email = e.email,
c.phone_number = e.phone_number,
c.hire_date = e.hire_date,
c.job_id = e.job_id,
c.salary = e.salary*2,
c.commission_pct = e.commission_pct,
c.manager_id = e.manager_id,
c.department_id = e.department_id
DELETE WHERE (E.COMMISSION_PCT IS NOT NULL)
WHEN NOT MATCHED THEN

SQL Fundamentals 24 - 26

Oracle University Student Learning Subscription Use Only

Merging Rows: Example

The COPY_EMP3 table is created by using the following code:
CREATE TABLE COPY_EMP3 AS SELECT * FROM EMPLOYEES
WHERE SALARY<10000;
Then query the COPY_EMP3 table.
SELECT employee_id, salary, commission_pct FROM COPY_EMP3;
Observe that in the output, there are some employees with SALARY < 10000 and there are two
employees with COMMISSION_PCT.
The example in the slide matches the EMPLOYEE_ID in the COPY_EMP3 table to the EMPLOYEE_ID
in the EMPLOYEES table. If a match is found, the row in the COPY_EMP3 table is updated to match the
row in the EMPLOYEES table and the salary of the employee is doubled. The records of the two
employees with values in the COMMISSION_PCT column are deleted. If a match is not found, rows
are inserted into the COPY_EMP3 table.

SQL Fundamentals 24 - 27

Oracle University Student Learning Subscription Use Only

INSERT VALUES(e.employee_id, e.first_name, e.last_name,
e.email, e.phone_number, e.hire_date, e.job_id,
e.salary, e.commission_pct, e.manager_id,
e.department_id);

TRUNCATE TABLE copy_emp3;
SELECT * FROM copy_emp3;
no rows selected
MERGE INTO copy_emp3 c
USING (SELECT * FROM EMPLOYEES ) e
ON (c.employee_id = e.employee_id)
WHEN MATCHED THEN
UPDATE SET
c.first_name = e.first_name,
c.last_name = e.last_name,
...
DELETE WHERE (E.COMMISSION_PCT IS NOT NULL)
WHEN NOT MATCHED THEN
INSERT VALUES(e.employee_id, e.first_name, ...
SELECT * FROM copy_emp3;
20 rows selected.
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

The examples in the slide show that the COPY_EMP3 table is empty. The c.employee_id =
e.employee_id condition is evaluated. The condition returns false—there are no matches. The
logic falls into the WHEN NOT MATCHED clause, and the MERGE command inserts the rows of the
EMPLOYEES table into the COPY_EMP3 table. This means that the COPY_EMP3 table now has exactly
the same data as in the EMPLOYEES table.
SELECT employee_id, salary, commission_pct from copy_emp3;

SQL Fundamentals 24 - 28

Oracle University Student Learning Subscription Use Only

Merging Rows: Example

Lesson Agenda
Specifying explicit default values in INSERT and UPDATE statements
Using the following types of multitable INSERTs:
–
–
–
–

•
•
•

Unconditional INSERT
Conditional INSERT ALL
Conditional INSERT FIRST
Pivoting INSERT

Merging rows in a table
Performing flashback operations
Tracking changes to data over a period of time

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

SQL Fundamentals 24 - 29

Oracle University Student Learning Subscription Use Only

•
•

•
•
•

Enables you to recover tables to a specified point in time with a single
statement
Restores table data along with associated indexes and constraints
Enables you to revert the table and its contents to a certain point in time or
System Change Number (SCN)

SCN

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Oracle Flashback Table enables you to recover tables to a specified point in time with a single
statement. You can restore table data along with the associated indexes and constraints while the
database is online, undoing changes to only the specified tables.
The Flashback Table feature is similar to a self-service repair tool. For example, if a user accidentally
deletes important rows from a table, and wants to recover the deleted rows, you can use the
FLASHBACK TABLE statement to restore the table to the time before the deletion and see the missing
rows in the table.
When using the FLASHBACK TABLE statement, you can revert the table and its contents to a certain
time or to an SCN.
Note: The SCN is an integer value associated with each change to the database. It is a unique
incremental number in the database. Every time you commit a transaction, a new SCN is recorded.

SQL Fundamentals 24 - 30

Oracle University Student Learning Subscription Use Only

FLASHBACK TABLE Statement

FLASHBACK TABLE Statement
Repair tool for accidental table modifications
–
–
–

•

Restores a table to an earlier point in time
Offers ease of use, availability, and fast execution
Is performed in place

Syntax:
FLASHBACK TABLE [ schema. ] table [, [ schema.
] table ]... TO { { { SCN | TIMESTAMP } expr |
RESTORE POINT restore_point } [ { ENABLE |
DISABLE } TRIGGERS ] | BEFORE DROP [ RENAME TO
table ] } ;

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Self-Service Repair Facility
Oracle Database provides a SQL data definition language (DDL) command, FLASHBACK TABLE, to
restore the state of a table to an earlier point in time in case it is inadvertently deleted or modified.
The FLASHBACK TABLE command is a self-service repair tool to restore data in a table along with the
associated attributes such as indexes or views. This is done, while the database is online, by rolling
back only subsequent changes to the given table. Compared to traditional recovery mechanisms, this
feature offers significant benefits such as ease of use, availability, and faster restoration. It also takes
the burden off the DBA to find and restore application-specific properties. The flashback table feature
does not address physical corruption caused because of a bad disk.
Syntax
You can invoke a FLASHBACK TABLE operation on one or more tables, even on tables in different
schemas. You specify the point in time to which you want to revert by providing a valid time stamp.
By default, database triggers are disabled during the flashback operation for all the tables that are
involved. You can override this default behavior by specifying the ENABLE TRIGGERS clause.
Note: For more information about recycle bin and flashback semantics, refer to Oracle Database
Administrator’s Guide for Oracle Database 12c.

SQL Fundamentals 24 - 31

Oracle University Student Learning Subscription Use Only

•

Using the FLASHBACK TABLE Statement

SELECT original_name, operation, droptime FROM
recyclebin;
…

FLASHBACK TABLE emp3 TO BEFORE DROP;

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Syntax and Examples
The example restores the EMP3 table to a state before a DROP statement.
The recycle bin is actually a data dictionary table containing information about dropped objects.
Dropped tables and any associated objects—such as, indexes, constraints, nested tables, and so
on—are not removed and still occupy space. They continue to count against user space quotas until
specifically purged from the recycle bin, or until they must be purged by the database because of
tablespace space constraints.
Each user can be thought of as an owner of a recycle bin because, unless a user has the SYSDBA
privilege, the only objects that the user has access to in the recycle bin are those that the user owns.
A user can view his or her objects in the recycle bin by using the following statement:
SELECT * FROM RECYCLEBIN;
When you drop a user, any objects belonging to that user are not placed in the recycle bin and any
objects in the recycle bin are purged.
You can purge the recycle bin with the following statement:
PURGE RECYCLEBIN;

SQL Fundamentals 24 - 32

Oracle University Student Learning Subscription Use Only

DROP TABLE emp3;

Lesson Agenda
Specifying explicit default values in INSERT and UPDATE statements
Using the following types of multitable INSERTs:
–
–
–
–

•
•
•

Unconditional INSERT
Conditional INSERT ALL
Conditional INSERT FIRST
Pivoting INSERT

Merging rows in a table
Performing flashback operations
Tracking changes to data over a period of time

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

SQL Fundamentals 24 - 33

Oracle University Student Learning Subscription Use Only

•
•

Tracking Changes in Data

SELECT
…

Versions of retrieved rows
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

You may discover that, somehow, data in a table has been inappropriately changed. To research
this, you can use multiple flashback queries to view row data at specific points in time. You can use
Oracle Flashback Query to retrieve data as it existed at an earlier time. More efficiently, you can use
the Flashback Version Query feature to view all changes to a row over a period of time. This feature
enables you to append a VERSIONS clause to a SELECT statement that specifies a System Change
Number (SCN) or the time stamp range within which you want to view changes to row values. The
query also can return associated metadata, such as the transaction responsible for the change.
Further, after you identify an erroneous transaction, you can use the Flashback Transaction Query
feature to identify other changes that were done by the transaction. You then have the option of using
the Flashback Table feature to restore the table to a state before the changes were made.
You can use a query on a table with a VERSIONS clause to produce all the versions of all the rows
that exist, or ever existed, between the time the query was issued and the undo_retention
seconds before the current time. undo_retention is an initialization parameter, which is an
autotuned parameter. A query that includes a VERSIONS clause is referred to as a version query. The
result of a version query behaves as though the WHERE clause were applied to the versions of the
rows. The version query returns versions of the rows only across transactions.
System change number (SCN): The Oracle server assigns an SCN to identify the redo records for
each committed transaction.

SQL Fundamentals 24 - 34

Oracle University Student Learning Subscription Use Only

Version
query

Flashback Query: Example

UPDATE employees3 SET salary = 4000
WHERE last_name = 'Matos';
SELECT salary FROM employees3
WHERE last_name = 'Matos';
SELECT salary FROM employees3
AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL '1' MINUTE)
WHERE last_name = 'Matos';
1

2

3

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

To use Oracle Flashback Query, use a SELECT statement with an AS OF clause. Oracle Flashback
Query retrieves data as it existed at some time in the past. The query explicitly references a past time
through a time stamp or System Change Number (SCN). It returns committed data that was current
at that point in time.
In the example in the slide, the salary for employee “Matos” is retrieved (1). The salary for employee
“Matos” is increased to 4000 (2). To learn what the value was before the update, you can use the
Flashback Query(3).
Oracle Flashback Query can be used in the following scenarios:
• Recovering lost data or undoing incorrect, committed changes. For example, if you mistakenly
delete or update rows, and then commit them, you can immediately undo the mistake.
• Comparing current data with the corresponding data at some time in the past. For example, you
can run a daily report that shows the change in data from yesterday. You can compare
individual rows of table data or find intersections or unions of sets of rows.
• Checking the state of transactional data at a particular time

SQL Fundamentals 24 - 35

Oracle University Student Learning Subscription Use Only

SELECT salary FROM employees3
WHERE last_name = 'Matos';

SELECT salary FROM employees3
WHERE employee_id = 107;

1

UPDATE employees3 SET salary = salary * 1.30
WHERE employee_id = 107;

2

COMMIT;
SELECT salary FROM employees3
VERSIONS BETWEEN SCN MINVALUE AND MAXVALUE
WHERE employee_id = 107;
1

3

3

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

In the example in the slide, the salary for employee 107 is retrieved (1). The salary for employee 107
is increased by 30 percent and this change is committed (2). The different versions of salary are
displayed (3).
The VERSIONS clause does not change the plan of the query. For example, if you run a query on a
table that uses the index access method, the same query on the same table with a VERSIONS clause
continues to use the index access method. The versions of the rows returned by the version query
are versions of the rows across transactions. The VERSIONS clause has no effect on the
transactional behavior of a query. This means that a query on a table with a VERSIONS clause still
inherits the query environment of the ongoing transaction.
The default VERSIONS clause can be specified as VERSIONS BETWEEN {SCN|TIMESTAMP}
MINVALUE AND MAXVALUE. The VERSIONS clause is a SQL extension only for queries. You can
have DML and DDL operations that use a VERSIONS clause within subqueries. The row version
query retrieves all the committed versions of the selected rows. Changes made by the current active
transaction are not returned. The version query retrieves all incarnations of the rows. This essentially
means that the versions returned include deleted and subsequent reinserted versions of the rows.
The row access for a version query can be defined in one of the following two categories:
• ROWID-based row access: In the case of ROWID-based access, all versions of the specified
ROWID are returned irrespective of the row content. This essentially means that all versions of
the slot in the block indicated by the ROWID are returned.
• All other row access: For all other row access, all versions of the rows are returned.

SQL Fundamentals 24 - 36

Oracle University Student Learning Subscription Use Only

Flashback Version Query: Example

SELECT versions_starttime "START_DATE",
versions_endtime
"END_DATE",
salary
FROM
employees3
VERSIONS BETWEEN SCN MINVALUE
AND MAXVALUE
WHERE last_name = 'Lorentz';

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

You can use the VERSIONS BETWEEN clause to retrieve all versions of the rows that exist or have
ever existed between the time the query was issued and a point back in time.
If the undo retention time is less than the lower bound time or the SCN of the BETWEEN clause, the
query retrieves versions up to the undo retention time only. The time interval of the BETWEEN clause
can be specified as an SCN interval or a wall-clock interval. This time interval is closed at both the
lower and the upper bounds.
In the example, Lorentz’s salary changes are retrieved. The NULL value for END_DATE for the first
version indicates that this was the existing version at the time of the query. The NULL value for
START_DATE for the last version indicates that this version was created at a time before the undo
retention time.

SQL Fundamentals 24 - 37

Oracle University Student Learning Subscription Use Only

VERSIONS BETWEEN Clause

When you use the INSERT or UPDATE command, the DEFAULT keyword saves
you from hard-coding the default value in your programs or querying the
dictionary to find it.
a. True
b. False

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Answer: a

SQL Fundamentals 24 - 38

Oracle University Student Learning Subscription Use Only

Q

Quiz

In all the cases, when you execute a DROP TABLE command, the database
renames the table and places it in the recycle bin, from where it can later be
recovered by using the FLASHBACK TABLE statement.
a. True
b. False

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Answer: b

SQL Fundamentals 24 - 39

Oracle University Student Learning Subscription Use Only

Q

Quiz

In this lesson, you should have learned how to:
• Specify explicit default values in INSERT and UPDATE statements
• Describe the features of multitable INSERTs
• Use the following types of multitable INSERTs:
–
–
–
–

•
•
•

Unconditional INSERT
Conditional INSERT ALL
Conditional INSERT FIRST
Pivoting INSERT

Merge rows in a table
Perform flashback operations
Track changes to data over a period of time
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

In this lesson, you also should have learned about multitable INSERT statements, the MERGE
statement, and tracking changes in the database.

SQL Fundamentals 24 - 40

Oracle University Student Learning Subscription Use Only

Summary

Lesson 25: Managing Multiple Time
Zones

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Oracle University Student Learning Subscription Use Only

25

Course Roadmap
Lesson 1: Course Overview

Unit 2: Retrieving and Sorting Data

Lesson 21: Using Advanced Subqueries

Unit 3: Joins, Subqueries, and Set
Operators

Lesson 22: Manipulating Data by Using
Advanced Subqueries

Unit 4: DML and DDL

Lesson 23: Controlling User Access

Unit 5: Managing Relational Database

Lesson 24: Advanced Data Manipulation

Unit 6: Advance Queries and Database
Management System

Lesson 25: Managing Multiple Timezones

You are here
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

In Unit 6, you will be introduced to some advanced features of SQL. You will learn to write advanced
subqueries. You will learn to create users and manage users. You will also learn about managing
multiple timezones.

SQL Fundamentals 25 - 2

Oracle University Student Learning Subscription Use Only

Unit 1: Relational Database and SQL
Overview

After completing this lesson, you should be able to:
• Use data types similar to DATE that store fractional seconds and track time
zones
• Use data types that store the difference between two datetime values
• Use the following datetime functions:
–
–
–
–
–
–

CURRENT_DATE
CURRENT_TIMESTAMP
LOCALTIMESTAMP
DBTIMEZONE
SESSIONTIMEZONE
EXTRACT

–
–
–
–
–

TZ_OFFSET
FROM_TZ
TO_TIMESTAMP
TO_YMINTERVAL
TO_DSINTERVAL

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

In this lesson, you learn how to use data types similar to DATE that store fractional seconds and track
time zones. This lesson also addresses some of the datetime functions available in the Oracle
database.

SQL Fundamentals 25 - 3

Oracle University Student Learning Subscription Use Only

Objectives

•
•
•

CURRENT_DATE, CURRENT_TIMESTAMP, and LOCALTIMESTAMP
INTERVAL data types
Using the following functions:
–
–
–
–
–
–

EXTRACT
TZ_OFFSET
FROM_TZ
TO_TIMESTAMP
TO_YMINTERVAL
TO_DSINTERVAL

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

SQL Fundamentals 25 - 4

Oracle University Student Learning Subscription Use Only

Lesson Agenda

+07:00

-08:00

+02:00

+10:00

-05:00

The image represents the time for each
time zone when Greenwich time is 12:00.
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

The hours of the day are measured by earth’s rotation. The time of day at any particular moment
depends on where you are. When it is noon in Greenwich, England, it is midnight along the
International Date Line. The earth is divided into 24 time zones, one for each hour of the day. The
time along the prime meridian in Greenwich, England, is known as Greenwich Mean Time (GMT).
GMT is now known as Coordinated Universal Time (UTC). UTC is the time standard against which all
other time zones in the world are referenced. It is the same all year round and is not affected by
summer time or daylight saving time. The meridian line is an imaginary line that runs from the North
Pole to the South Pole. It is known as zero longitude and it is the line from which all other lines of
longitude are measured. All time is measured relative to UTC and all places have a latitude (their
distance north or south of the equator) and a longitude (their distance east or west of the Greenwich
meridian).

SQL Fundamentals 25 - 5

Oracle University Student Learning Subscription Use Only

Time Zones

TIME_ZONE Session Parameter

•
•
•
•

An absolute offset
Database time zone
OS local time zone
A named region
ALTER
ALTER
ALTER
ALTER

SESSION
SESSION
SESSION
SESSION

SET
SET
SET
SET

TIME_ZONE
TIME_ZONE
TIME_ZONE
TIME_ZONE

=
=
=
=

'-05:00';
dbtimezone;
local;
'America/New_York';

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

The Oracle database supports storing the time zone in your date and time data, as well as fractional
seconds. The ALTER SESSION command can be used to change the time zone values in a user’s
session. The time zone values can be set to an absolute offset, a named time zone, a database time
zone, or the local time zone.

SQL Fundamentals 25 - 6

Oracle University Student Learning Subscription Use Only

TIME_ZONE may be set to:

CURRENT_DATE, CURRENT_TIMESTAMP,
and LOCALTIMESTAMP
CURRENT_DATE:
–
–

•

CURRENT_TIMESTAMP:
–
–

•

Returns the current date from the user session
Has a data type of DATE
Returns the current date and time from the user session
Has a data type of TIMESTAMP WITH TIME ZONE

LOCALTIMESTAMP:
–
–

Returns the current date and time from the user session
Has a data type of TIMESTAMP

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

The CURRENT_DATE and CURRENT_TIMESTAMP functions return the current date and current time
stamp, respectively. The data type of CURRENT_DATE is DATE. The data type of
CURRENT_TIMESTAMP is TIMESTAMP WITH TIME ZONE. The values returned display the time zone
displacement of the SQL session that is executing the functions. Time zone displacement is the
difference (in hours and minutes) between local time and UTC. The TIMESTAMP WITH TIME ZONE
data type has the format:
TIMESTAMP [ (fractional_seconds_precision) ] WITH TIME ZONE
where fractional_seconds_precision optionally specifies the number of digits in the fractional
part of the SECOND datetime field and can be a number in the range 0 through 9. The default is 6.
The LOCALTIMESTAMP function returns the current date and time in the session time zone. The
difference between LOCALTIMESTAMP and CURRENT_TIMESTAMP is that LOCALTIMESTAMP returns
a TIMESTAMP value, whereas CURRENT_TIMESTAMP returns a TIMESTAMP WITH TIME ZONE value.
These functions are national language support (NLS)–sensitive—that is, the results will be in the
current NLS calendar and datetime formats.
Note: The SYSDATE function returns the current date and time as a DATE data type. You learned
how to use the SYSDATE function in the lesson titled “Using Single-Row Functions to Customize
Output.”

SQL Fundamentals 25 - 7

Oracle University Student Learning Subscription Use Only

•

The TIME_ZONE parameter is set to –5:00, and then SELECT statements for
each date and time are executed to compare differences.
ALTER SESSION
SET NLS_DATE_FORMAT = 'DD-MON-YYYY HH24:MI:SS';
ALTER SESSION SET TIME_ZONE = '-5:00';
SELECT SESSIONTIMEZONE, CURRENT_DATE FROM DUAL;

1

SELECT SESSIONTIMEZONE, CURRENT_TIMESTAMP FROM DUAL; 2
SELECT SESSIONTIMEZONE, LOCALTIMESTAMP FROM DUAL;

3

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

The ALTER SESSION command sets the date format of the session to
'DD-MON-YYYY HH24:MI:SS'—that is, day of month (1–31)-abbreviated name of month-4-digit
year hour of day (0–23):minute (0–59):second (0–59).
The example in the slide illustrates that the session is altered to set the TIME_ZONE parameter to –
5:00. Then the SELECT statement for CURRENT_DATE, CURRENT_TIMESTAMP, and
LOCALTIMESTAMP is executed to observe the differences in format.
Note: The TIME_ZONE parameter specifies the default local time zone displacement for the current
SQL session. TIME_ZONE is a session parameter only; it is not an initialization parameter. The
TIME_ZONE parameter is set as follows:
TIME_ZONE = '[+ | -] hh:mm'
The format mask ([+ | -] hh:mm) indicates the hours and minutes before or after UTC.

SQL Fundamentals 25 - 8

Oracle University Student Learning Subscription Use Only

Comparing Date and Time in a Session’s Time Zone

Comparing Date and Time in a Session’s Time Zone

1
2

3

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

In this case, the CURRENT_DATE function returns the current date in the session’s time zone, the
CURRENT_TIMESTAMP function returns the current date and time in the session’s time zone as a
value of the data type TIMESTAMP WITH TIME ZONE, and the LOCALTIMESTAMP function returns the
current date and time in the session’s time zone.
Note: The code example output may vary depending on when the command is run.

SQL Fundamentals 25 - 9

Oracle University Student Learning Subscription Use Only

Results of queries:

DBTIMEZONE and SESSIONTIMEZONE
Display the value of the database time zone:
SELECT DBTIMEZONE FROM DUAL;

•

Display the value of the session’s time zone:
SELECT SESSIONTIMEZONE FROM DUAL;

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

The DBA sets the database’s default time zone by specifying the SET TIME_ZONE clause of the
CREATE DATABASE statement. If omitted, the default database time zone is the operating system
time zone. The database time zone cannot be changed for a session with an ALTER SESSION
statement.
The DBTIMEZONE function returns the value of the database time zone. The return type is a time
zone offset (a character type in the format: '[+|-]TZH:TZM') or a time zone region name,
depending on how the user specified the database time zone value in the most recent CREATE
DATABASE or ALTER DATABASE statement. The example in the slide shows that the database time
zone is set to “–05:00,” because the TIME_ZONE parameter is in the format:
TIME_ZONE = '[+ | -] hh:mm'
The SESSIONTIMEZONE function returns the value of the current session’s time zone. The return
type is a time zone offset (a character type in the format '[+|-]TZH:TZM') or a time zone region
name, depending on how the user specified the session time zone value in the most recent ALTER
SESSION statement. The example in the slide shows that the session time zone is offset to UTC by –
5 hours. Observe that the database time zone is different from the current session’s time zone.

SQL Fundamentals 25 - 10

Oracle University Student Learning Subscription Use Only

•

Data Type

Fields

TIMESTAMP

Year, Month, Day, Hour, Minute,
Second with fractional seconds

TIMESTAMP WITH TIME ZONE

Same as the TIMESTAMP data type;
also includes:
TIMEZONE_HOUR, and
TIMEZONE_MINUTE or
TIMEZONE_REGION

TIMESTAMP WITH LOCAL TIME
ZONE

Same as the TIMESTAMP data type;
also includes a time zone offset in its
value

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

The TIMESTAMP data type is an extension of the DATE data type.
TIMESTAMP (fractional_seconds_ precision)
This data type contains the year, month, and day values of date, as well as the hour, minute, and
second values of time, where significant fractional seconds precision is the number of digits in the
fractional part of the SECOND datetime field. The accepted values of significant
fractional_seconds_precision are 0 through 9. The default is 6.
TIMESTAMP (fractional_seconds_precision) WITH TIME ZONE
This data type contains all values of TIMESTAMP as well as the time zone displacement value.
TIMESTAMP (fractional_seconds_precision) WITH LOCAL TIME ZONE
This data type contains all values of TIMESTAMP, with the following exceptions:
• Data is normalized to the database time zone when it is stored in the database.
• When the data is retrieved, users see the data in the session time zone.

SQL Fundamentals 25 - 11

Oracle University Student Learning Subscription Use Only

TIMESTAMP Data Types

TIMESTAMP Fields
Valid Values

YEAR

–4712 to 9999 (excluding year 0)

MONTH

01 to 12

DAY

01 to 31

HOUR

00 to 23

MINUTE

00 to 59

SECOND

00 to 59.9(N) where 9(N) is precision

TIMEZONE HOUR

–12 to 14

TIMEZONE MINUTE

00 to 59

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Each datetime data type is composed of several of the fields listed in the slide. Datetimes are
mutually comparable and assignable only if they have the same datetime fields.

SQL Fundamentals 25 - 12

Oracle University Student Learning Subscription Use Only

Datetime Field

A
-- when hire_date is
of type DATE
SELECT hire_date
FROM emp4;

B
ALTER TABLE emp4
MODIFY hire_date
TIMESTAMP(7);
SELECT hire_date
FROM emp4;

…

…
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

TIMESTAMP Data Type: Example
In the slide, example A shows data from the hire_date column of the EMP4 table when the data
type of the column is DATE. In example B, the table is altered and the data type of the hire_date
column is changed to TIMESTAMP. The output shows the differences in display. You can convert
from DATE to TIMESTAMP when the column has data, but you cannot convert from DATE or
TIMESTAMP to TIMESTAMP WITH TIME ZONE unless the column is empty.
You can specify fractional seconds precision for a time stamp. If none are specified, as in this
example, it defaults to 6.
For example, the following statement sets the fractional seconds precision as 7:
ALTER TABLE emp4
MODIFY hire_date TIMESTAMP(7);
Note: The Oracle DATE data type, by default, looks like what is shown in the example in the slide.
However, the date data type also contains additional information such as hours, minutes, seconds,
AM, and PM. To obtain the date in this format, you can apply a format mask or a function to the date
value.

SQL Fundamentals 25 - 13

Oracle University Student Learning Subscription Use Only

Difference Between DATE and TIMESTAMP

CREATE TABLE web_orders
(order_date TIMESTAMP WITH TIME ZONE,
delivery_time TIMESTAMP WITH LOCAL TIME ZONE);
INSERT INTO web_orders values
(current_date, current_timestamp + 2);
SELECT * FROM web_orders;

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

In the example in the slide, a new table web_orders is created with a column of data type
TIMESTAMP WITH TIME ZONE and a column of data type TIMESTAMP WITH LOCAL TIME ZONE.
This table is populated whenever a web_order is placed. The time stamp and time zone for the user
placing the order are inserted based on the CURRENT_DATE value. The local time stamp and time
zone are populated by inserting two days from the CURRENT_TIMESTAMP value into it every time an
order is placed. When a web-based company guarantees shipping, it can estimate its delivery time
based on the time zone of the person placing the order.
Note: The code example output may vary as per the time of run of the command.

SQL Fundamentals 25 - 14

Oracle University Student Learning Subscription Use Only

Comparing TIMESTAMP Data Types

•
•
•

CURRENT_DATE, CURRENT_TIMESTAMP, and LOCALTIMESTAMP
INTERVAL data types
Using the following functions:
–
–
–
–
–
–

EXTRACT
TZ_OFFSET
FROM_TZ
TO_TIMESTAMP
TO_YMINTERVAL
TO_DSINTERVAL

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

SQL Fundamentals 25 - 15

Oracle University Student Learning Subscription Use Only

Lesson Agenda

•
•

INTERVAL data types are used to store the difference between two datetime
values.
There are two classes of intervals:
–
–

•

Year-month
Day-time

The precision of the interval is:
–
–

The actual subset of fields that constitutes an interval
Specified in the interval qualifier

Data Type

Fields

INTERVAL YEAR TO MONTH

Year, Month

INTERVAL DAY TO SECOND

Days, Hour, Minute, Second with fractional seconds

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

INTERVAL data types are used to store the difference between two datetime values. There are two
classes of intervals: year-month intervals and day-time intervals. A year-month interval is made up of
a contiguous subset of fields of YEAR and MONTH, whereas a day-time interval is made up of a
contiguous subset of fields consisting of DAY, HOUR, MINUTE, and SECOND. The actual subset of
fields that constitute an interval is called the precision of the interval and is specified in the interval
qualifier. Because the number of days in a year is calendar-dependent, the year-month interval is
NLS-dependent, whereas day-time interval is NLS-independent.
The interval qualifier may also specify the leading field precision, which is the number of digits in the
leading or only field, and in case the trailing field is SECOND, it may also specify the fractional
seconds precision, which is the number of digits in the fractional part of the SECOND value. If not
specified, the default value for leading field precision is 2 digits, and the default value for fractional
seconds precision is 6 digits.
INTERVAL YEAR (year_precision) TO MONTH
This data type stores a period of time in years and months, where year_precision is the number
of digits in the YEAR datetime field. The accepted values are 0 through 9. The default is 6.
INTERVAL DAY (day_precision) TO SECOND (fractional_seconds_precision)
This data type stores a period of time in days, hours, minutes, and seconds, where day_precision
is the maximum number of digits in the DAY datetime field (accepted values are 0 through 9; the
default is 2), and fractional_seconds_precision is the number of digits in the fractional part of
the SECOND field. The accepted values are 0 through 9. The default is 6.

SQL Fundamentals 25 - 16

Oracle University Student Learning Subscription Use Only

INTERVAL Data Types

INTERVAL Field
YEAR

Valid Values for Interval

MONTH
DAY
HOUR
MINUTE
SECOND

00 to 11

Any positive or negative integer
Any positive or negative integer
00 to 23
00 to 59
00 to 59.9(N) where 9(N) is precision

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

INTERVAL YEAR TO MONTH can have fields of YEAR and MONTH.
INTERVAL DAY TO SECOND can have fields of DAY, HOUR, MINUTE, and SECOND.
The actual subset of fields that constitute an item of either type of interval is defined by an interval
qualifier, and this subset is known as the precision of the item.
Year-month intervals are mutually comparable and assignable only with other year-month intervals,
and day-time intervals are mutually comparable and assignable only with other day-time intervals.

SQL Fundamentals 25 - 17

Oracle University Student Learning Subscription Use Only

INTERVAL Fields

CREATE TABLE warranty
(prod_id number, warranty_time INTERVAL YEAR(3) TO
MONTH);
INSERT INTO warranty VALUES (123, INTERVAL '8' MONTH);
INSERT INTO warranty VALUES (155, INTERVAL '200'
YEAR(3));
INSERT INTO warranty VALUES (678, '200-11');
SELECT * FROM warranty;

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

INTERVAL YEAR TO MONTH stores a period of time by using the YEAR and MONTH datetime fields.
Specify INTERVAL YEAR TO MONTH as follows:
INTERVAL YEAR [(year_precision)] TO MONTH
where year_precision is the number of digits in the YEAR datetime field. The default value of
year_precision is 2.
Restriction: The leading field must be more significant than the trailing field. For example, INTERVAL
'0-1' MONTH TO YEAR is not valid.
Examples
• INTERVAL '123-2' YEAR(3) TO MONTH
Indicates an interval of 123 years, 2 months
• INTERVAL '123' YEAR(3)
Indicates an interval of 123 years, 0 months
• INTERVAL '300' MONTH(3)
Indicates an interval of 300 months
• INTERVAL '123' YEAR
Returns an error because the default precision is 2, and '123' has 3

SQL Fundamentals 25 - 18

Oracle University Student Learning Subscription Use Only

INTERVAL YEAR TO MONTH: Example

SQL Fundamentals 25 - 19

Oracle University Student Learning Subscription Use Only

The Oracle database supports two interval data types: INTERVAL YEAR TO MONTH and INTERVAL
DAY TO SECOND; the column type, PL/SQL argument, variable, and return type must be one of the
two. However, for interval literals, the system recognizes other American National Standards Institute
(ANSI) interval types such as INTERVAL '2' YEAR or INTERVAL '10' HOUR. In these cases, each
interval is converted to one of the two supported types.
In the example in the slide, a WARRANTY table is created, which contains a warranty_time column
that takes the INTERVAL YEAR(3) TO MONTH data type. Different values are inserted into it to
indicate years and months for various products. When these rows are retrieved from the table, you
see a year value separated from the month value by a (-).

CREATE TABLE lab
( exp_id number, test_time INTERVAL DAY(2) TO SECOND);
INSERT INTO lab VALUES (100012, '90 00:00:00');
INSERT INTO lab VALUES (56098,
INTERVAL '6 03:30:16' DAY

TO SECOND);

SELECT * FROM lab;

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

In the example in the slide, you create the lab table with a test_time column of the INTERVAL
DAY TO SECOND data type. You then insert into it the value '90 00:00:00' to indicate 90 days and
0 hours, 0 minutes, and 0 seconds, and INTERVAL '6 03:30:16' DAY TO SECOND to indicate 6
days, 3 hours, 30 minutes, and 16 seconds. The SELECT statement shows how this data is displayed
in the database.

SQL Fundamentals 25 - 20

Oracle University Student Learning Subscription Use Only

INTERVAL DAY TO SECOND Data Type: Example

•
•
•

CURRENT_DATE, CURRENT_TIMESTAMP, and LOCALTIMESTAMP
INTERVAL data types
Using the following functions:
–
–
–
–
–
–

EXTRACT
TZ_OFFSET
FROM_TZ
TO_TIMESTAMP
TO_YMINTERVAL
TO_DSINTERVAL

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

SQL Fundamentals 25 - 21

Oracle University Student Learning Subscription Use Only

Lesson Agenda

EXTRACT
Display all employees who were hired after 2010.
SELECT last_name, employee_id, hire_date
FROM employees
WHERE EXTRACT(YEAR FROM TO_DATE(hire_date, 'DD-MON-RR')) > 2010
ORDER BY hire_date;

•

Display the MONTH component from HIRE_DATE for those employees whose
MANAGER_ID is 100.
SELECT last_name, hire_date,
EXTRACT (MONTH FROM HIRE_DATE)
FROM employees
WHERE manager_id = 100;

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

The EXTRACT expression extracts and returns the value of a specified datetime field from a datetime
or interval value expression. You can extract any of the components mentioned in the following
syntax by using the EXTRACT function. The syntax of the EXTRACT function is:
SELECT EXTRACT( { YEAR | MONTH | DAY | HOUR | MINUTE | SECOND
| TIMEZONE_HOUR
| TIMEZONE_MINUTE
| TIMEZONE_REGION
| TIMEZONE_ABBR }
FROM { expr } )
When you extract a TIMEZONE_REGION or TIMEZONE_ABBR (abbreviation), the value returned is a
string containing the appropriate time zone name or abbreviation. When you extract any of the other
values, the value returned is a date in the Gregorian calendar. When extracting from a datetime with
a time zone value, the value returned is in UTC.
In the first example in the slide, the EXTRACT function is used to select all employees who were hired
after 2010. In the second example in the slide, the EXTRACT function is used to extract MONTH from
the HIRE_DATE column of the EMPLOYEES table for those employees who report to the manager
whose EMPLOYEE_ID is 100.

SQL Fundamentals 25 - 22

Oracle University Student Learning Subscription Use Only

•

TZ_OFFSET

SELECT TZ_OFFSET('US/Eastern'),
TZ_OFFSET('Canada/Yukon'),
TZ_OFFSET('Europe/London')
FROM DUAL;

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

The TZ_OFFSET function returns the time zone offset corresponding to the value entered. The return
value is dependent on the date when the statement is executed. For example, if the TZ_OFFSET
function returns a value –08:00, this value indicates that the time zone where the command was
executed is eight hours behind UTC. You can enter a valid time zone name, a time zone offset from
UTC (which simply returns itself), or the keyword SESSIONTIMEZONE or DBTIMEZONE. The syntax of
the TZ_OFFSET function is:
TZ_OFFSET({ 'time_zone_name'| '{ + | - } hh : mi'
| SESSIONTIMEZONE
| DBTMEZONE
})
The Fold Motor Company has its headquarters in Michigan, USA, which is in the US/Eastern time
zone. The company president, Mr. Fold, wants to have a conference call with the vice president of
Canadian operations and the vice president of European operations, who are in the Canada/Yukon
and Europe/London time zones, respectively. Mr. Fold wants to know the time in each of these
places to make sure that his senior management will be available to attend the meeting. His
secretary, Mr. Scott, helps by issuing the queries shown in the example and gets the following
results:
• The 'US/Eastern' time zone is four hours behind UTC.
• The 'Canada/Yukon' time zone is seven hours behind UTC.
• The 'Europe/London' time zone is one hour ahead of UTC.

SQL Fundamentals 25 - 23

Oracle University Student Learning Subscription Use Only

Display the time zone offset for the 'US/Eastern', 'Canada/Yukon‘, and
'Europe/London' time zones:

Oracle University Student Learning Subscription Use Only

For a listing of valid time zone name values, you can query the V$TIMEZONE_NAMES dynamic
performance view.
SELECT * FROM V$TIMEZONE_NAMES;

…

SQL Fundamentals 25 - 24

FROM_TZ

SELECT FROM_TZ(TIMESTAMP
'2000-07-12 08:00:00', 'Australia/North')
FROM DUAL;

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

The FROM_TZ function converts a TIMESTAMP value to a TIMESTAMP WITH TIME ZONE value.
The syntax of the FROM_TZ function is as follows:
FROM_TZ(timestamp_value, time_zone_value)
where time_zone_value is a character string in the format 'TZH:TZM' or a character expression
that returns a string in TZR (time zone region) with an optional TZD format. TZD is an abbreviated
time zone string with daylight saving information. TZR represents the time zone region in datetime
input strings. Examples are 'Australia/North', 'PST' for US/Pacific standard time, 'PDT' for
US/Pacific daylight time, and so on.
The example in the slide converts a TIMESTAMP value to TIMESTAMP WITH TIME ZONE.
Note: To see a listing of valid values for the TZR and TZD format elements, query the
V$TIMEZONE_NAMES dynamic performance view.

SQL Fundamentals 25 - 25

Oracle University Student Learning Subscription Use Only

Display the TIMESTAMP value '2000-07-12 08:00:00' as a TIMESTAMP
WITH TIME ZONE value for the 'Australia/North' time zone region.

TO_TIMESTAMP

SELECT TO_TIMESTAMP ('2016-03-06 11:00:00',
'YYYY-MM-DD HH:MI:SS')
FROM DUAL;

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

The TO_TIMESTAMP function converts a string of CHAR, VARCHAR2, NCHAR, or NVARCHAR2 data type
to a value of the TIMESTAMP data type. The syntax of the TO_TIMESTAMP function is:
TO_TIMESTAMP(char [, fmt [, 'nlsparam' ] ])
The optional fmt specifies the format of char. If you omit fmt, the string must be in the default
format of the TIMESTAMP data type. The optional nlsparam specifies the language in which month
and day names, and abbreviations, are returned. The argument can have the following form:
'NLS_DATE_LANGUAGE = language'
If you omit nlsparams, the function uses the default date language for your session.
The example in the slide converts a character string to a value of TIMESTAMP.
Note: You use the TO_TIMESTAMP_TZ function to convert a string of CHAR, VARCHAR2, NCHAR, or
NVARCHAR2 data type to a value of the TIMESTAMP WITH TIME ZONE data type. For more
information about this function, see Oracle Database SQL Language Reference for Oracle Database
12c.

SQL Fundamentals 25 - 26

Oracle University Student Learning Subscription Use Only

Display the character string '2016-03-06 11:00:00'
as a TIMESTAMP value:

TO_YMINTERVAL

SELECT hire_date,
hire_date + TO_YMINTERVAL('01-02') AS
HIRE_DATE_YMININTERVAL
FROM
employees
WHERE department_id = 20;

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

The TO_YMINTERVAL function converts a character string of CHAR, VARCHAR2, NCHAR, or
NVARCHAR2 data type to an INTERVAL YEAR TO MONTH data type. The INTERVAL YEAR TO MONTH
data type stores a period of time by using the YEAR and MONTH datetime fields. The format of
INTERVAL YEAR TO MONTH is as follows:
INTERVAL YEAR [(year_precision)] TO MONTH
where year_precision is the number of digits in the YEAR datetime field. The default value of
year_precision is 2.
The syntax of the TO_YMINTERVAL function is:
TO_YMINTERVAL (char)
where char is the character string to be converted.
The example in the slide calculates a date that is one year and two months after the hire date for
employees working in department 20 of the EMPLOYEES table.

SQL Fundamentals 25 - 27

Oracle University Student Learning Subscription Use Only

Display a date that is one year and two months after the hire date for employees
working in the department with DEPARTMENT_ID 20.

TO_DSINTERVAL

SELECT last_name,
TO_CHAR(hire_date, 'mm-dd-yy:hh:mi:ss') hire_date,
TO_CHAR(hire_date +
TO_DSINTERVAL('100 10:00:00'),
'mm-dd-yy:hh:mi:ss') hiredate2
FROM employees;

…
Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

TO_DSINTERVAL converts a character string of the CHAR, VARCHAR2, NCHAR, or NVARCHAR2 data
type to an INTERVAL DAY TO SECOND data type.
In the example in the slide, the date 100 days and 10 hours after the hire date is obtained.

SQL Fundamentals 25 - 28

Oracle University Student Learning Subscription Use Only

Display a date that is 100 days and 10 hours after the hire date for all
employees.

Daylight Saving Time (DST)
Start of Daylight Saving:
–
–

•

Time jumps from 01:59:59 AM to 03:00:00 AM.
Values from 02:00:00 AM to 02:59:59 AM are not valid.

End of Daylight Saving:
–
–

Time jumps from 02:00:00 AM to 01:00:01 AM.
Values from 01:00:01 AM to 02:00:00 AM are ambiguous because they are
visited twice.

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Most western nations advance the clock ahead by one hour during the summer months. This period
is called daylight saving time. Daylight saving time lasts from the start of Daylight Saving to the end of
Daylight Saving in most of the United States, Mexico, and Canada. The nations of the European
Union observe daylight saving time, but they call it the summer time period. Europe’s summer time
period begins a week earlier than its North American counterpart, but ends at the same time.
The Oracle database automatically determines, for any given time zone region, whether daylight
saving time is in effect and returns local time values accordingly. The datetime value is sufficient for
the Oracle database to determine whether daylight saving time is in effect for a given region in all
cases except boundary cases. A boundary case occurs during the period when daylight saving time
goes into or out of effect. For example, in the US/Eastern region, when daylight saving time goes into
effect, the time changes from 01:59:59 AM to 03:00:00 AM. The one-hour interval between 02:00:00
AM and 02:59:59 AM. does not exist. When daylight saving time goes out of effect, the time changes
from 02:00:00 AM back to 01:00:01 AM, and the one-hour interval between 01:00:01 AM and
02:00:00 AM is repeated.

SQL Fundamentals 25 - 29

Oracle University Student Learning Subscription Use Only

•

ERROR_ON_OVERLAP_TIME

For example, daylight saving time ends on October 31, at 02:00:01 AM. The overlapped periods are:
• 10/31/2016 01:00:01 AM to 10/31/2016 02:00:00 AM (EDT)
• 10/31/2016 01:00:01 AM to 10/31/2016 02:00:00 AM (EST)
If you input a datetime string that occurs in one of these two periods, you need to specify the time
zone abbreviation (for example, EDT or EST) in the input string for the system to determine the
period. Without this time zone abbreviation, the system does the following:
If the ERROR_ON_OVERLAP_TIME parameter is FALSE, it assumes that the input time is standard
time (for example, EST). Otherwise, an error is raised.

SQL Fundamentals 25 - 30

Oracle University Student Learning Subscription Use Only

ERROR_ON_OVERLAP_TIME is a session parameter to notify the system to issue an error when it
encounters a datetime that occurs in the overlapped period and no time zone abbreviation was
specified to distinguish the period.

Q

Quiz

a.
b.
c.
d.

A relative offset
Database time zone
OS local time zone
A named region

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Answer: b, c, d

SQL Fundamentals 25 - 31

Oracle University Student Learning Subscription Use Only

The TIME_ZONE session parameter may be set to:

In this lesson, you should have learned how to:
• Use data types similar to DATE that store fractional seconds and track time
zones
• Use data types that store the difference between two datetime values
• Use the following datetime functions:
–
–
–
–
–
–

CURRENT_DATE
CURRENT_TIMESTAMP
LOCALTIMESTAMP
DBTIMEZONE
SESSIONTIMEZONE
EXTRACT

–
–
–
–
–

TZ_OFFSET
FROM_TZ
TO_TIMESTAMP
TO_YMINTERVAL
TO_DSINTERVAL

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

This lesson addressed some of the datetime functions available in the Oracle database.

SQL Fundamentals 25 - 32

Oracle University Student Learning Subscription Use Only

Summary



Source Exif Data:
File Type                       : PDF
File Type Extension             : pdf
MIME Type                       : application/pdf
PDF Version                     : 1.6
Linearized                      : No
Encryption                      : Standard V2.3 (128-bit)
User Access                     : Print, Extract, Print high-res
Has XFA                         : No
XMP Toolkit                     : Adobe XMP Core 5.2-c001 63.139439, 2010/09/27-13:37:26
Create Date                     : 2016:05:19 10:58:36+05:30
Modify Date                     : 2016:05:19 13:54:48+05:30
Metadata Date                   : 2016:05:19 13:54:48+05:30
Producer                        : iText 5.0.6 (c) 1T3XT BVBA
Format                          : application/pdf
Document ID                     : uuid:dd52ec9f-b49d-46c4-9813-98505c217181
Instance ID                     : uuid:85de2a00-dd35-45ea-8e11-a97187952d4c
Page Layout                     : SinglePage
Page Mode                       : UseOutlines
Page Count                      : 838
EXIF Metadata provided by EXIF.tools

Navigation menu