Uploaded by Martin White

ha150-hana compress

advertisement
HA150
SQL Basics for HANA
Material Number: 50119271
SQL Basics For HANA – Agenda
Motivation And Basic Concepts
Reading Data From A Table Or View
Exercises 1 - 19
Aggregating Data
Exercises 20 - 29
Reading Data From Multiple Tables Part I
Exercises 30 - 40
Reading Data From Multiple Tables Part II
Exercises 41 - 45
Understanding NULL Values
Changing Data Stored in Tables
Exercises 46 - 53
Defining How Data Is Stored
Exercises 54 - 58
Using Views For Data Access
Exercises 59 - 60
Defining Data Access
Database Transactions
©
2013 SAP AG. All rights reserved.
2
SQL Basics For HANA Course
The SQL Basics course is designed to ...

Explain basic concepts in the database world
and the Relational Database Model

Refresh and deepen SQL knowledge, especially
for developing on HANA database systems
The SQL Basics course is not designed to ...

Explain implementation details of SAP HANA

Supersede official SAP HANA documentation

Solve specific development problems

Serve as a basis for decision-making for
development projects
©
2013 SAP AG. All rights reserved.
3
Unit 1
Motivation & Basic Concepts
4
Unit 1: Motivation And Basic Concepts
Learning Objectives
After completing this unit, you will be able to:
• List some database models
• Understand the motivation for and foundation of the relational model
• Understand why learning SQL is important when dealing with HANA
• Understand how the relation model and SQL are related
• List the three sub-languages of SQL
• Understand the sample database used throughout the course
© 2013 SAP AG. All rights reserved.
5
Basic Concepts
What are the terms
•
Database
•
Database System
•
Database Management System ?
©
2013 SAP AG. All rights reserved.
6
DBS = DB + DBMS

The Database Management System (DBMS) manages the database


Every access to the database (create, read, insert, update, delete) goes exclusively
through the DBMS
The DBMS exercises complete control over the database

Database (DB) = structured collection of "records"

Database System (DBS) = specific database + DBMS
©
2013 SAP AG. All rights reserved.
7
DBS = DB + DBMS
User / Application
DBMS
DBS
DB
©
2013 SAP AG. All rights reserved.
8
DBS = DB + DBMS

„What Database do you use?“ 

„Which Database Management System do you use?“ 

„We are using HANA as Database.“ 

„We are using SAP HANA as Database Management System.“ 

In everyday life, these terms are usually used incorrectly …
©
2013 SAP AG. All rights reserved.
9
Basics Concepts
3 Level Schema Architecture
©
2013 SAP AG. All rights reserved.
10
3 Level Schema Architecture
Objective: Changes at a lower level should not affect a higher level (if possible)
Application/User
External Schema 1
Application/User
…
External Schema n
Conceptual Schema
Internal Schema
©
2013 SAP AG. All rights reserved.
External Level
Conceptual Level
Internal Level
11
3 Level Schema Architecture
The address book should not display salary data
 External Level (VIEW)
An Employee has a D-Number, name, and salary and is assigned to a
department
 Conceptual Level (TABLE)
The board mostly accesses employee data according to descending order
of salary (which has to be very fast)
 Internal Level (INDEX)
©
2013 SAP AG. All rights reserved.
12
Basic Concepts
Which Database Models are
available?
©
2013 SAP AG. All rights reserved.
13
Database Models

Hierarchical Database Model

Network Database Model

Relational Database Model

Object-relational Database Model

Object-oriented Database Model

XML-based Database Model

…
©
2013 SAP AG. All rights reserved.
14
Basic Concepts
Relational Database Model
©
2013 SAP AG. All rights reserved.
15
Relational Database Model
Invented in the late 1960s by Edgar F. Codd (1923-2003)
 IBM Almaden Research Lab in San Jose (California)
First prototype in the mid-1970s
• "System R", IBM San Jose
Relational DBMS products (selection)
•
•
•
•
©
Oracle (since 1979)
IBM DB2 (since 1983)
SQL Server (since 1989)
SAP HANA (since 2011)
2013 SAP AG. All rights reserved.
16
Relational Database Model
Initial Development Goals (1960s):
 Simple but mathematically profound database model
– Easy to understand but still mathematically precise
 Simple but mathematically-based database language
– Easy to learn, but semantics still described with mathematical precision
– Provable equivalence of two queries
 Integrity monitoring largely by the DBMS
 Storage & retrieval of data is the responsibility of the DBMS (and not of the user)
– Descriptive language rather than navigation (optimizer selects optimal execution strategy)
 Clean separation between conceptual and internal schema
©
2013 SAP AG. All rights reserved.
17
Basic Concepts
Why is the Relational Database
Model actually called
Relational Database Model?
©
2013 SAP AG. All rights reserved.
18
Relations
A relation (in the sense of mathematics) is the subset of the Cartesian product
of sets
R⊆AxBxC
©
2013 SAP AG. All rights reserved.
19
Comparative Relations (=,≠,<,≤,>,≥)
N = {1, 2, 3, 4, 5}
N × N = {(1,1), (1,2), (1,3), (1,4), (1,5),
(2,1), (2,2), (2,3), (2,4), (2,5),
(3,1), (3,2), (3,3), (3,4), (3,5),
(4,1), (4,2), (4,3), (4,4), (4,5),
(5,1), (5,2), (5,3), (5,4), (5,5)}
©
2013 SAP AG. All rights reserved.
20
Comparative Relations (=,≠,<,≤,>,≥)
≤ ⊆ N × N
≤ ⊆ {(1,1),
(2,1),
(3,1),
(4,1),
(5,1),
(1,2),
(2,2),
(3,2),
(4,2),
(5,2),
(1,3),
(2,3),
(3,3),
(4,3),
(5,3),
(1,4),
(2,4),
(3,4),
(4,4),
(5,4),
(1,5),
(2,5),
(3,5),
(4,5),
(5,5)}
≤ = {(1,1), (1,2), (1,3), (1,4), (1,5),
(2,2), (2,3), (2,4), (2,5), (3,3),
(3,4), (3,5), (4,4), (4,5), (5,5)}
(2,3) ϵ ≤
2 ≤ 3
©
2013 SAP AG. All rights reserved.
21
Relations
PersNumber = {P036407, P040824, P052867, …}
Name
= {Ben, Paul, Raja, …}
HiringYear = {2001, 2008, 2010, …}
PersNumber × Name × HiringYear=
{(P036407,Ben,2001),
(P036407,Ben,2008),
(P036407,Paul,2001),
(P036407,Paul,2008),
(P035607,Raja,2001),
(P036407,Raja,2008),
(P040824,Ben,2001),
(P040824,Ben,2008),
(P040824,Paul,2001),
(P040824,Paul,2008),
(P040824,Raja,2001),
(P040824,Raja,2008),
(P052867,Ben,2001),
(P052867,Jim,2008),
(P052867,Paul,2001),
(P052867,Vishal,2008),
(P052867,Raja,2001),
(P052867,Werner,2008),
©
2013 SAP AG. All rights reserved.
(P036407,Ben,2010),
(P036407,Paul,2010),
(P036407,Raja,2010),
(P040824,Ben,2010),
(P040824,Paul,2010),
(P040824,Raja,2010),
(P052867,Ben,2010),
(P052867,Paul,2010),
(P052867,Raja,2010), …}
22
Relations
Employee ⊆ PersNumber × Name × HiringYear
Employee ⊆ {(P036407,Ben,2001),
(P036407,Paul,2001),
(P035607,Raja,2001),
(P040824,Ben,2001),
(P040824,Paul,2001),
(P040824,Raja,2001),
(P052867,Ben,2001),
(P052867,Paul,2001),
(P052867,Raja,2001),
(P036407,Ben,2008),
(P036407,Paul,2008),
(P036407,Raja,2008),
(P040824,Ben,2008),
(P040824,Paul,2008),
(P040824,Raja,2008),
(P052867,Jim,2008),
(P052867,Vishal,2008),
(P052867,Werner,2008),
(P036407,Ben,2010),
(P036407,Paul,2010),
(P036407,Raja,2010),
(P040824,Ben,2010),
(P040824,Paul,2010),
(P040824,Raja,2010),
(P052867,Ben,2010),
(P052867,Paul,2010),
(P052867,Raja,2010), …}
Employee= {(P036407,Paul,2001), (P040824,Ben,2008), (P052867,Raja,2010)}
©
2013 SAP AG. All rights reserved.
23
Relations & Tables
A relation can be represented as a table
Employee= {(P036407,Paul,2001), (P040824,Ben,2008), (P052867,Raja,2010)}
Employee
©
2013 SAP AG. All rights reserved.
PersNumber
Name
HiringYear
P036407
P040824
P052867
Paul
Ben
Raja
2001
2008
2010
24
Basic Concepts
Which languages ​are available for
the Relational Database Model?
©
2013 SAP AG. All rights reserved.
25
Relational Languages
Relational Algebra


Formal basis for DBMS internal query optimization
6 basic operations (selection, projection, cross join, union, difference, rename)
Relational Calculus

Tuple variables and quantifiers
SQL

©
Standardized and used in practice
2013 SAP AG. All rights reserved.
26
Why SQL?
Why SQL is important?
Why it is worth working with SQL
©
2013 SAP AG. All rights reserved.
27
Why SQL? → Reasons #1 and #2
In almost every business application
scenario, the data is managed using
database systems.
The most significant are database
systems based on the relational data
model and using SQL (Structured
Query Language) as a database
language.
SQL is a widely-established,
powerful, standardized database
language many application
programmers have experience in.
There is (so far) no other database
language that has all the
advantages mentioned.
SAP HANA is a relational data
base management system
and
SAP HANA supports SQL
©
2013 SAP AG. All rights reserved.
28
Why SQL?
Different application architectures and development models are possible with
SAP HANA
Data Marts with SAP HANA
Standalone HANA Apps
BI Tools, MS Excel, Web
Browser …
Standalone Application
SAP HANA clients
Traditional DBMS
©
2013 SAP AG. All rights reserved.
HANA Content /
Database Tables
HANA Content /
Database Tables
SAP HANA
Schema replication
SAP HANA
BI 4.0 (optional)
Semantic Layer
29
Why SQL?
Different application architectures and development models are possible with
SAP HANA
HANA as primary Database
HANA as Accelerator (secondary DB)
(for AS ABAP)
SAP GUI, Browser-based GUI
SAP GUI, Browser-based GUI
SAP Application Server
SAP Application Server
replication
Data
SAP HANA
ABAP
Schema
ABAP Schema /
Database Tables
SAP HANA
E.g. CRM on HANA – NW 7.40
Aggregation Levels
Traditional DBMS
©
2013 SAP AG. All rights reserved.
30
Why SQL? → Reason #3
HANA supports an extended version of SQL
No matter which HANA-based architecture or
development model you work with, it is likely that
using HANA SQL will be beneficial.
©
2013 SAP AG. All rights reserved.
31
SQL
SQL Features
©
2013 SAP AG. All rights reserved.
32
SQL Features
 SQL is standardized
– No uncontrolled growth with respect to syntax and semantics
 SQL is descriptive (rather than procedural)
– The "what" and not "how" is described
 SQL execution is optimized
– SQL statement is first parsed and optimized, and then executed
– Optimizer determines optimal execution plan (at least in theory)
 SQL is multi-set oriented (and not single record-based)
– Using a single SQL statement multiple table rows can be read, modified or
deleted in one go
©
2013 SAP AG. All rights reserved.
33
SQL Language Elements
SQL language elements can be divided into three categories:

DML = Data Manipulation Language
SELECT, INSERT, UPDATE, DELETE

DDL = Data Definition Language
CREATE, ALTER, DROP, RENAME

DCL = Data Control Language
GRANT, REVOKE
©
2013 SAP AG. All rights reserved.
34
SQL
SQL is standardized!
©
2013 SAP AG. All rights reserved.
35
SQL Standard: History
1970s
SEQUEL (Structured English Query Language) as a language for "System R"
• "System R" was the first relational prototype developed by IBM in San Jose
End of 1970
Renaming of SEQUEL into SQL (Structured Query Language)
1982
American National Standards Institute (ANSI) begins with standardization of SQL
1986
First version of the SQL standard is adopted (as ANSI) SQL-86 ("SQL0“)
1987
International Organization for Standardization (ISO) does SQL standard (ISO standard)
1989
SQL-89 ("SQL1")
1992
SQL-92 ("SQL2"), 3 attenuation levels: Entry Level, Intermediate Level, Full Level
1999
SQL:1999 ("SQL3")
2003
SQL:2003 ("SQL4"), "SQL/XML:2006" 2006 official standard part of SQL:2003
2008
SQL:2008 ("SQL5"), officially: "ISO/IEC 9075:2008" and "DIN 9075" (> 3,000 pages)
©
2013 SAP AG. All rights reserved.
36
SQL
SQL ≠ relational
©
2013 SAP AG. All rights reserved.
37
SQL
SQL is the most important database language for relational database model.
Although SQL is based on the relational database model, it deviates in
important points from the "purely relational" model:

No (primary) key required


NULL values ​are allowed


3-valued logic required ("A = A" need not be TRUE)
The language is not closed



©
Duplicates (identical rows) allowed (multi-sets instead of sets)
Order of the result rows may be relevant (ORDER BY)
Anonymous result columns allowed
Duplicate result column names allowed
2013 SAP AG. All rights reserved.
38
Database Objects
What can be found in the
database?
©
2013 SAP AG. All rights reserved.
39
Database Objects
The table is the primary database object - but not the only one.
Apart from tables a database usually contains:





©
Views to simplify and limit data access
Indexes to speed up (certain) read accesses
Constraints to ensure data consistency
Stored procedures for more complex tasks
Triggers to selectively respond to particular events
2013 SAP AG. All rights reserved.
40
Basic Concepts
What is a table?
©
2013 SAP AG. All rights reserved.
41
Tables
A (database) table represents a relation
(but: multi-set of rows instead of set of tuples)
Employee PersNumber
Name
HiringYear
P036407
Paul
2001
P040824
Ben
2008
P052867
Raja
2010
Employee = {(P036407,Paul,2001), (P040824,Ben,2008), (P052867,Raja,2010)}
©
2013 SAP AG. All rights reserved.
42
Tables
A table consists of rows and columns

A table can therefore be represented two-dimensionally
A table represents a relation (with multi-sets property)

©
A table represents a (unordered) multi-set of points in n-dimensional space:
 Each point of the multi-set corresponds to a table row
 Each of the n dimensions is equivalent to a table column
2013 SAP AG. All rights reserved.
43
Table rows as points in space
Name
Paul
HiringYear
Raja
(P040824, Ben, 2008)
2010
2008
Ben
2001
PersNumber
P030407
©
2013 SAP AG. All rights reserved.
P040824
P052867
44
Projection on the plane
Projection list
Name
SELECT PersNumber, Name
FROM Employee
WHERE PersNumber = 'P040824';
Paul
HiringYear
Raja
(P030824, Ben, 2008)
2010
2008
Ben
(P040824, Ben)
2001
PersNumber
P036407
©
2013 SAP AG. All rights reserved.
P040824
P052867
45
Projection on an axis
Projection list
Name
SELECT Name
FROM Employee
WHERE PersNumber = 'P040824';
Paul
HiringYear
Raja
(P040824, Ben, 2008)
2010
2008
Ben
2001
PersNumber
P036407
©
2013 SAP AG. All rights reserved.
P040824
P052867
46
Basic Concepts
What are the components of a
(database) table?
©
2013 SAP AG. All rights reserved.
47
Tables
Table-Name
Primary Key
Column Name
Employee PersNumber Name
P036407
Paul
Table Row
P040824
Ben
P052867
Raja
HiringYear
2001
2008
2010
(Table Column) value
(Table) Column
©
2013 SAP AG. All rights reserved.
48
Basic Concepts
What is a key?
©
2013 SAP AG. All rights reserved.
49
Key
Key = is a set of columns which serves to uniquely identify any row in the table.
The ability to uniquely identify rows must apply in principle
(and not only for the rows existing at a certain point in time).
Employee PersNumber Name
P036407
Paul
P040824
Ben
P052867
Raja
©
2013 SAP AG. All rights reserved.
HiringYear
2001
2008
2010
50
Multi-column Keys
A key can consist of multiple columns
Employee Name Country City BuildingNr Block Floor Room SeatNr
Mr A
DE
WDF
03
A
5
29
1
Ms B
DE
WDF
03
A
5
29
2
Ms C
DE
WDF
03
A
5
29
3
…
…
…
…
…
…
…
…
 In this example the key consists of 7 columns
 1 Key (not 7 keys)!
©
2013 SAP AG. All rights reserved.
51
Multiple Keys
There may be more than one key
Employee PNumber Name TaxID
Passport
ID
Plate
Number
ChasisNr
CarLicense
ID
SWIFT
IBAN
P000815
…
…
…
HD-MM 815
…
…
…
…
P004711
…
…
…
HD-ML 4711
…
…
…
…
P012345
…
…
…
HD-OI 2345
…
…
…
…
…
…
…
…
…
…
…
…
…
 Here are 7 keys (provided there are no joint accounts)
 Just 1 key is selected as Primary Key
©
2013 SAP AG. All rights reserved.
52
Basic Concepts
What is a Foreign-Key?
©
2013 SAP AG. All rights reserved.
53
Foreign-Keys
Foreign-Key = set of columns, which is a (primary) key in an(other) table
•
The foreign-key can refer to its own table
•
It is not necessary to share the same name(s)
•
The foreign-key can contain only those values ​that occur as a (primary) key value in
another table (in addition and if applicable, NULL values ​are allowed)
•
The foreign-key is usually not a key!
Employee
©
DNumber
D010000
D010001
D010002
D010003
D010004
D010005
2013 SAP AG. All rights reserved.
Name
Mr A
Ms B
Mr C
Ms D
Mr E
Ms F
DepartmentNR
A01
A01
A02
A02
A02
A03
Foreign-key Relationship
Department DNr
Function
A01 HANA-Development
A02
HANA-Sales
A03
HANA-Training
A04 ABAP-Development
54
Foreign-Keys
A Foreign-Key can consist of multiple columns
Publication PaperID
Topic
P001 In-Memory
P002
Column
Store
P003
Row Store
P004
SQL & XML
P005
XML & SQL
P006
DB
Recovery
Uni
HPI
HPI
StudentID
12345
12345
HPI
FSU
FSU
FSU
77777
12345
12345
77777
Student
Uni StudentID Name FirstName
HPI
12345
A
B
HPI
77777
C
D
FSU
12345
E
F
FSU
77777
G
H
 This example shows 1 Foreign-Key built on 2 columns
©
2013 SAP AG. All rights reserved.
55
Foreign-Keys
There can be multiple Foreign-Keys
Vendor
VID
L1
L2
L3
…
©
Name
Heidelberg
Paper
Wiesloch Paper
Walldorf Paper
…
2013 SAP AG. All rights reserved.
Delivery VID PNr Year Quantity
L1
L1
L1
L1
L2
L2
L3
…
A1
A1
A1
A2
A1
A2
A1
…
2010
2011
2012
2012
2011
2011
2012
…
320
570
925
102
577
100
999
…
Product PNr Description
A1 Sticky Notes
A2
Printing
Paper
A3
Envelopes
…
…
56
Foreign-Keys
The foreign-key can refer to its own table
Employee
©
2013 SAP AG. All rights reserved.
DNumber
D010000
D010001
D010002
D010003
D010004
D010005
D010006
D010007
Name
Mr A
Ms B
Mr C
Ms D
Mr E
Ms F
Mr G
Ms H
DNumberManager
D010007
D010007
D010004
D010002
D010002
D010005
D010005
57
Example Scenario
Fictional vehicle registration office
as an example scenario
©
2013 SAP AG. All rights reserved.
58
Example: Registration Office
 The database of a fictional registration office will serve as the basis for further explanations.
 The tables in this database have been specifically tailored to the SQL course and are not
an example of good database design.




©
The officials working in the fictional registration office have a manager.
Each vehicle is registered for exactly one owner (or is unregistered).
There is a list of vehicles that have been reported stolen.
Owners, who have at least three vehicles registered, are assigned to one or multiple
contacts.
2013 SAP AG. All rights reserved.
59
Example: Registration Office
Official(PNr, Name, Overtime, Salary, Manager)
Contact(PersNumber, OwnerID)
Owner(OwnerID, Name, Birthday, City)
Car(CarID, PlateNumber, Brand, Color, HP, Owner)
Stolen(PlateNumber, reported_at)
©
2013 SAP AG. All rights reserved.
60
Officials
Official
©
PNr
Name
P01
Mr A
P02
Salary
Manager
10
A09
P04
Mr B
10
A10
P04
P03
Ms C
20
A09
P04
P04
Ms D
NULL
A12
P09
P05
Mr E
10
A08
P08
P06
Mr F
18
A09
P08
P07
Ms G
22
A11
P08
P08
Ms H
NULL
A13
P09
P09
Mr I
NULL
A14
NULL
2013 SAP AG. All rights reserved.
Overtime
61
Owner
Owner
©
2013 SAP AG. All rights reserved.
OwnerID
Name
Birthday
City
H01
Ms T
20.06.1934
Wiesloch
H02
Ms U
11.05.1966
Hockenheim
H03
SAP AG
NULL
Walldorf
H04
HDM AG
NULL
Heidelberg
H05
Mr V
21.04.1952
Leimen
H06
Ms W
01.06.1957
Wiesloch
H07
IKEA
NULL
Walldorf
H08
Mr X
30.08.1986
Walldorf
H09
Ms Y
10.02.1986
Sinsheim
H10
Mr Z
03.02.1986
Ladenburg
62
Contact
Contact
©
2013 SAP AG. All rights reserved.
PersNumber
OwnerID
P01
H03
P01
H04
P01
H07
P04
H03
P04
H04
P08
H04
P08
H07
P09
H03
63
Cars
Car
©
CarID
PlateNumber
Brand
Color
F01
F02
F03
F04
F05
F06
F07
F08
F09
F10
HD-V 106
HD-VW 4711
HD-JA 1972
HD-AL 1002
HD-MM 3206
HD-VW 1999
HD-ML 3206
HD-IK 1002
HD-UP 13
HD-MT 507
Fiat
VW
BMW
Mercedes
Mercedes
Audi
Audi
VW
Skoda
BMW
red
black
blue
white
black
yellow
blue
black
red
black
75
120
184
136
170
260
116
160
105
140
H06
H03
H03
H07
H03
H05
H03
H07
H02
H04
F11
F12
F13
F14
F15
F16
F17
F18
F19
F20
HD-MM 208
HD-XY 4711
HD-IK 1001
HD-MM 1977
HD-MB 3030
NULL
HD-Y 333
HD-MQ 2006
HD-VW 2012
NULL
BMW
Skoda
Renault
Mercedes
Skoda
Opel
Audi
Renault
VW
Audi
green
red
red
white
black
green
orange
red
black
green
184
105
136
170
136
120
184
90
125
184
H02
H04
H07
H03
H03
NULL
H09
H03
H01
NULL
2013 SAP AG. All rights reserved.
HP
Owner
64
Stolen Cars
Stolen
©
PlateNumber
reported_at
HD-VW 1999
20.06.2012
HD-V 106
01.06.2012
HD-Y 333
21.05.2012
2013 SAP AG. All rights reserved.
65
Registration Office & EU
 A new (fictional) European Union directive requires that the information about which vehicle
is registered to which owner, has to be stored in a central transnational database.
 The vehicle identification number (CarID) is unique across the EU,
but not the Owner ID.
Owner_EU(Country, OwnerID, Name, Birthday, City)
Car_EU(CarID, PlateNumber, Brand, Color, HP, Country, Owner)
©
2013 SAP AG. All rights reserved.
66
Owner (EU-wide)
Owner_EU
©
Country
OwnerID
Name
Birthday
City
D
H01
Ms T
20.06.1934
Wiesloch
D
H02
Ms U
11.05.1966
Hockenheim
D
H03
SAP AG
NULL
Walldorf
D
H04
HDM AG
NULL
Heidelberg
D
H05
Mr V
21.04.1952
Leimen
D
H06
Ms W
01.06.1957
Wiesloch
D
H07
IKEA
NULL
Walldorf
D
H08
Mr X
30.08.1986
Walldorf
D
H09
Ms Y
10.02.1986
Sinsheim
D
H10
Mr Z
03.02.1986
Ladenburg
A
H01
Ms O
21.05.1977
Wien
A
H02
Mr P
02.08.1977
Salzburg
E
H01
Señor Q
18.02.1925
Madrid
E
H02
Señora R
27.02.1927
Barcelona
2013 SAP AG. All rights reserved.
67
Cars (EU-wide)
Car_EU
©
CarID
F01
F02
F03
F04
F05
F06
F07
F08
F09
F10
F11
F12
F13
F14
F15
F16
F17
F18
F19
F20
F21
F22
F23
F24
2013 SAP AG. All rights reserved.
PlateNumber
HD-V 106
HD-VW 4711
HD-JA 1972
HD-AL 1002
HD-MM 3206
HD-VW 1999
HD-ML 3206
HD-IK 1002
HD-UP 13
HD-MT 507
HD-MM 208
HD-XY 4711
HD-IK 1001
HD-MM 1977
HD-MB 3030
NULL
HD-Y 333
HD-MQ 2006
HD-VW 2012
NULL
W-302 ML
S-215 MM
1409 EMM
3206 MLM
Brand
Fiat
VW
BMW
Mercedes
Mercedes
Audi
Audi
VW
Skoda
BMW
BMW
Skoda
Renault
Mercedes
Skoda
Opel
Audi
Renault
VW
Audi
Mercedes
VW
Audi
VW
Color
red
black
blue
white
black
yellow
blue
black
red
black
green
red
red
white
black
green
orange
red
black
green
black
silvern
blue
black
HP
75
120
184
136
170
260
116
160
105
140
184
105
136
170
136
120
184
90
125
184
170
184
116
170
Country
D
D
D
D
D
D
D
D
D
D
D
D
D
D
D
NULL
D
D
D
NULL
A
A
E
E
Owner
H06
H03
H03
H07
H03
H05
H03
H07
H02
H04
H02
H04
H07
H03
H03
NULL
H09
H03
H01
NULL
H01
H02
H01
H02
68
Unit 1: Motivation And Basic Concepts
Summary
You should now be able to:
• List some database models
•
•
•
•
•
Understand the motivation for and foundation of the relational model
Understand why learning SQL is important when dealing with HANA
Understand how the relation model and SQL are related
List the three sub-languages of SQL
Understand the sample database used throughout the course
© 2012 SAP AG. All rights reserved.
Internal
6969
Unit 2
Reading data from a table or view
70
Unit 2: Reading Data From A Table Or View
After completing this unit, you will be able to:
• Write simple database queries using SQL‘s SELECT statement
• Project columns in and out of queries using the SELECT clause
• Avoid duplicates in SELECT statement result sets
• Include columns based on conditions
• Use built-in functions in column lists and WHERE clauses
• Limit results sets to the first N rows
• Ensure a specific order in SELECT statement result sets
• Restrict the result set using the WHERE clause
© 2013 SAP AG. All rights reserved.
Internal
7171
Reading Database Access
Which SQL statement can be used
for reading data from a table or
view?
©
2013 SAP AG. All rights reserved.
72
Reading Database Access
SELECT … FROM … WHERE …
 It
is used to read from a table or view

The SELECT statement is the central construct
for read access to data (database) with SQL

The SELECT statement can include the following (optional) clauses:
WHERE, GROUP BY, HAVING, ORDER BY
©
2013 SAP AG. All rights reserved.
73
Reading Database Access
The SELECT statement
©
2013 SAP AG. All rights reserved.
74
SELECT Statement
SELECT
FROM
WHERE
GROUP BY
HAVING
ORDER BY
©
2013 SAP AG. All rights reserved.
Column, Column, COUNT(*)
Table
Condition
Column, Column
Group_Condition
Column ASC, Column DESC;
75
SELECT
SELECT clause
©
2013 SAP AG. All rights reserved.
76
SELECT Clause
You can specify a single column in the projection list:
SELECT Name
FROM Official;
©
2013 SAP AG. All rights reserved.
NAME
---Mr A
Mr B
Ms C
Ms D
Mr E
Mr F
Ms G
Ms H
Mr I
77
SELECT Clause
You can specify multiple columns in the projection list:
SELECT PNr, Name, Salary
FROM Official;
©
2013 SAP AG. All rights reserved.
PNR
--P01
P02
P03
P04
P05
P06
P07
P08
P09
NAME
---Mr A
Mr B
Ms C
Ms D
Mr E
Mr F
Ms G
Ms H
Mr I
Salary
-----A09
A10
A09
A12
A08
A09
A11
A13
A14
78
SELECT Clause
The sequence of the columns in the projection list is relevant:
SELECT PNr, Name
FROM Official;
PNR
--P01
P02
P03
P04
…
©
NAME
---Mr A
Mr B
Ms C
Ms D
…
2013 SAP AG. All rights reserved.
SELECT Name, PNr
FROM Official;
NAME
---Mr A
Mr B
Ms C
Ms D
…
PNR
--P01
P02
P03
P04
…
79
SELECT Clause
The same column can appear several times in the projection list:
We do not recommend using this option
SELECT PNr, PNr, PNr
FROM Official;
©
2013 SAP AG. All rights reserved.
PNR
--P01
P02
P03
P04
P05
P06
P07
P08
P09
PNR
--P01
P02
P03
P04
P05
P06
P07
P08
P09
PNR
--P01
P02
P03
P04
P05
P06
P07
P08
P09
80
SELECT Clause
An asterisk (*) in the projection list represents "all columns“:
SELECT *
FROM Official;
PNR
--P01
P02
P03
P04
…
©
2013 SAP AG. All rights reserved.
NAME
---Mr A
Mr B
Ms C
Ms D
…
OVERTIME
-------10
10
20
?
…
SALARY
-----A09
A10
A09
A12
…
MANAGER
------P04
P04
P04
P09
…
81
SELECT Clause
Columns can be specified in the projection list in addition to the asterisk (*):
We do not recommend using this option
SELECT PNr, *, Name
FROM Official;
PNR
--P01
P02
P03
P04
…
©
PNR
--P01
P02
P03
P04
…
NAME
---Mr A
Mr B
Ms C
Ms D
…
2013 SAP AG. All rights reserved.
OVERTIME
-------10
10
20
?
…
SALARY
-----A09
A10
A09
A12
…
MANAGER
------P04
P04
P04
P09
…
NAME
---Mr A
Mr B
Ms C
Ms D
…
82
SELECT Clause
The asterisk (*) can be used multiple times in the projection list:
We do not recommend using this option
SELECT *, *, *
FROM Official;
PNR
NAME
OVERTIME
SALARY
MANAGER
PNR
NAME
OVERTIME
SALARY
MANAGER
PNR
NAME
OVERTIME
SALARY
MANAGER
---
----
--------
------
-------
---
----
--------
------
-------
---
----
--------
------
-------
P01
Mr A
10
A09
P04
P01
Mr A
10
A09
P04
P01
Mr A
10
A09
P04
P02
Mr B
10
A10
P04
P02
Mr B
10
A10
P04
P02
Mr B
10
A10
P04
P03
Ms C
20
A09
P04
P03
Ms C
20
A09
P04
P03
Ms C
20
A09
P04
P04
Ms D
?
A12
P09
P04
Ms D
?
A12
P09
P04
Ms D
?
A12
P09
P05
Mr E
10
A08
P08
P05
Mr E
10
A08
P08
P05
Mr E
10
A08
P08
P06
Mr F
18
A09
P08
P06
Mr F
18
A09
P08
P06
Mr F
18
A09
P08
P07
Ms G
22
A11
P08
P07
Ms G
22
A11
P08
P07
Ms G
22
A11
P08
P08
Ms H
?
A13
P09
P08
Ms H
?
A13
P09
P08
Ms H
?
A13
P09
P09
Mr I
?
A14
?
P09
Mr I
?
A14
?
P09
Mr I
?
A14
?
©
2013 SAP AG. All rights reserved.
83
SELECT Clause
You can generate additional “artificial” result columns:
SELECT 'Today', Name, 'has been assigned to salary group',
Salary
FROM Official;
'Today'
------Today
Today
Today
Today
Today
…
©
NAME
---Mr A
Mr B
Ms C
Ms D
Mr E
…
2013 SAP AG. All rights reserved.
'has been assigned to salary group'
----------------------------------has been assigned to salary group
has been assigned to salary group
has been assigned to salary group
has been assigned to salary group
has been assigned to salary group
…
SALARY
-----A09
A10
A09
A12
A08
…
84
SELECT Clause
The additional artificial result column can have a numeric type:
SELECT 'The working week of', Name, 'amounts to', 40, 'hours.'
FROM Official;
'The working week of'
--------------------The working week of
The working week of
The working week of
The working week of
The working week of
The working week of
The working week of
The working week of
The working week of
©
2013 SAP AG. All rights reserved.
NAME
---Mr A
Mr B
Ms C
Ms D
Mr E
Mr F
Ms G
Ms H
Mr I
'amounts to'
-----------amounts to
amounts to
amounts to
amounts to
amounts to
amounts to
amounts to
amounts to
amounts to
40
-40
40
40
40
40
40
40
40
40
'hours'.
-------hours.
hours.
hours.
hours.
hours.
hours.
hours.
hours.
hours.
85
SELECT Clause
The projection list may only contain artificial result columns:
SELECT 'Good Morning!'
FROM Official;
©
2013 SAP AG. All rights reserved.
'Good Morning!'
--------------Good Morning!
Good Morning!
Good Morning!
Good Morning!
Good Morning!
Good Morning!
Good Morning!
Good Morning!
Good Morning!
86
SELECT Clause
If the projection list only contains artificial result columns, you can use the special
table “Dummy” as reference:
SELECT 'Good Morning!'
FROM Dummy;
'Good Morning!'
--------------Good Morning!
The “DUMMY“ table contains one column and one row:
SELECT *
FROM Dummy;
©
2013 SAP AG. All rights reserved.
DUMMY
----X
87
SELECT Clause
SELECT a, 'b', "c", 1, '2', "3"
FROM "4";
a
©
A
…
…
…
'b'
--b
b
b
c
…
…
…
1
1
1
1
'2'
--2
2
2
3
…
…
…
Existing column named “A“ (“A“ as capital letter)
'b'
Artificial result column with string “b“ as value in each row
"c"
Existing column named “c“ (“c“ as lower case letter)
1
Artificial result column with 1 as numeric value in each row
'2'
Artificial result column with string “2“ as value in each row
"3"
Existing column named “3“
"4"
Existing table named “4“
2013 SAP AG. All rights reserved.
88
SELECT Clause
The projection list can have computed columns.
If a NULL value is used in an arithmetic operation, the result is also a NULL value:
SELECT Name, Overtime * 60
FROM Official;
©
2013 SAP AG. All rights reserved.
NAME
---Mr A
Mr B
Ms C
Ms D
Mr E
Mr F
Ms G
Ms H
Mr I
OVERTIME*60
----------600
600
1200
?
600
1080
1320
?
?
89
SELECT Clause
0 * NULL results in NULL (and not 0):
SELECT Name, Overtime, Overtime * 0
FROM Official;
NAME
---Mr A
Mr B
Ms C
Ms D
Mr E
Mr F
Ms G
Ms H
Mr I
©
2013 SAP AG. All rights reserved.
OVERTIME
-------10
10
20
?
10
18
22
?
?
OVERTIME*0
---------0
0
0
?
0
0
0
?
?
90
SELECT Clause
You can explicitly name computed result columns:
SELECT Name, Overtime * 60 AS Overminutes
FROM Official;
NAME
---Mr A
Mr B
Ms C
Ms D
…
©
2013 SAP AG. All rights reserved.
OVERMINUTES
----------600
600
1200
?
…
91
SELECT Clause
Quotation marks are required, if the result column name should include lowercase
letters:
SELECT Name, Overtime * 60 AS "Overminutes"
FROM Official;
NAME
---Mr A
Mr B
Ms C
Ms D
…
©
2013 SAP AG. All rights reserved.
Overminutes
----------600
600
1200
?
…
92
SELECT Clause
Quotation marks are also required, if the result column name should contain blanks:
SELECT Name, Overtime * 60 AS "overtime minutes"
FROM Official;
NAME
---Mr A
Mr B
Ms C
Ms D
…
©
2013 SAP AG. All rights reserved.
overtime minutes
---------------600
600
1200
?
…
93
SELECT Clause
You can also rename non-calculated result columns:
SELECT PNr AS PersNumber,
Salary AS "Salary Group"
FROM Official;
PERSNUMBER
---------P01
P02
P03
P04
…
©
2013 SAP AG. All rights reserved.
Salary Group
-----------A09
A10
A09
A12
…
94
SELECT Clause
In the (re)naming of result columns the keyword "AS“ can be omitted:
SELECT PNr PersNumber, Salary "Salary Group"
FROM Official;
PERSNUMBER
---------P01
P02
P03
P04
…
©
2013 SAP AG. All rights reserved.
Salary Group
-----------A09
A10
A09
A12
…
95
SELECT Clause
You can use existing column names for (re)naming of result columns:
SELECT PNr Salary, Salary PNr
FROM Official;
©
2013 SAP AG. All rights reserved.
SALARY
-----P01
P02
P03
P04
P05
P06
P07
P08
P09
PNR
--A09
A10
A09
A12
A08
A09
A11
A13
A14
96
SELECT Clause
Multiple result columns can have the same name:
We do not recommend using this option
SELECT PNr AS xyz, Name AS xyz, Salary AS xyz
FROM Official;
XYZ
--P01
P02
P03
P04
…
©
2013 SAP AG. All rights reserved.
XYZ
---Mr A
Mr B
Ms C
Ms D
…
XYZ
--A09
A10
A09
A12
…
97
SELECT Clause


You can use functions in the projection list.
The corresponding result columns can be named explicitly.
 Which owner is born in which year?
SELECT Name, YEAR(Birthday)
AS "Year of Birth"
FROM Owner;
©
2013 SAP AG. All rights reserved.
NAME
-----Ms T
Ms U
SAP AG
HDM AG
Mr V
Ms W
IKEA
Mr X
Ms Y
Mr Z
Year of Birth
------------1934
1966
?
?
1952
1957
?
1986
1986
1986
98
SELECT Clause
 When were vehicle owners first allowed to drive a car in Germany?
SELECT Name, ADD_YEARS(Birthday, 18)
AS "18th Birthday"
FROM Owner;
NAME
-----Ms T
Ms U
SAP AG
HDM AG
Mr V
Ms W
IKEA
Mr X
Ms Y
Mr Z
©
2013 SAP AG. All rights reserved.
18th Birthday
------------1952-06-20
1984-05-11
?
?
1970-04-21
1975-06-01
?
2004-08-30
2004-02-10
2004-02-03
99
SELECT Clause
Function calls can be nested
 On which day is the owner’s 18th birthday?
SELECT Name,
DAYNAME
( ADD_YEARS
(Birthday,
ROUND(ABS(-18.2))
)
) AS Weekday
FROM Owner;
©
2013 SAP AG. All rights reserved.
NAME
-----Ms T
Ms U
SAP AG
HDM AG
Mr V
Ms W
IKEA
Mr X
Ms Y
Mr Z
WEEKDAY
------FRIDAY
FRIDAY
?
?
TUESDAY
SUNDAY
?
MONDAY
TUESDAY
TUESDAY
100
Functions
Which functions are provided
by SAP HANA?
©
2013 SAP AG. All rights reserved.
101
Functions
SAP HANA provides following functions (selection):
©
Function
Explanation
YEAR(Date)
year
ADD_YEARS(Date, n)
n years later
DAYNAME(Date)
weekday (English)
CURRENT_DATE
current date
ABS(Number)
absolute value
ROUND(Number)
rounding
SQRT(Number)
square root
UPPER(String)
convert to upper case
SUBSTR(String, Start, Length)
cut out of a string (substring)
LENGTH(String)
length of a string
2013 SAP AG. All rights reserved.
102
SELECT Clause
You can qualify the column name by adding the table name:
SELECT Official.Name
FROM Official;
©
2013 SAP AG. All rights reserved.
NAME
---Mr A
Mr B
Ms C
Ms D
Mr E
Mr F
Ms G
Ms H
Mr I
103
SELECT Clause
The qualification with the table name is also allowed,
if the output table has to contain all columns:
SELECT Official.*
FROM Official;
PNR
--P01
P02
P03
P04
…
©
2013 SAP AG. All rights reserved.
NAME
---Mr A
Mr B
Ms C
Ms D
…
OVERTIME
-------10
10
20
?
…
SALARY
-----A09
A10
A09
A12
…
MANAGER
------P04
P04
P04
P09
…
104
SELECT Clause
The projection list can include a mix of qualified and unqualified column names:
SELECT Name, Official.PNr
FROM Official;
©
2013 SAP AG. All rights reserved.
NAME
---Mr A
Mr B
Ms C
Ms D
Mr E
Mr F
Ms G
Ms H
Mr I
PNR
--P01
P02
P03
P04
P05
P06
P07
P08
P09
105
Tuple Variables Or Table Aliases
Using Tuple Variables, also known
as Table Aliases
©
2013 SAP AG. All rights reserved.
106
Tuple Variables aka Table Aliases
You can use tuple variables in the projection list.
Tuple variables are defined in the FROM clause and also referred to as table
aliases in SAP HANA (and most other DBMSs).
SELECT o.Name, o.PNr
FROM Official o;
You can use the (optional) key word AS
in the definition of a tuple variable:
SELECT o.Name, o.PNr
FROM Official AS o;
©
2013 SAP AG. All rights reserved.
NAME
---Mr A
Mr B
Ms C
Ms D
Mr E
Mr F
Ms G
Ms H
Mr I
PNR
--P01
P02
P03
P04
P05
P06
P07
P08
P09
107
Tuple Variables aka Table Aliases
Despite having defined table aliases
the projection list may contain unqualified column names:
SELECT Name, PNr
FROM Official o;
A mix of qualified and unqualified column names is possible:
SELECT o.Name, PNr
FROM Official o;
©
2013 SAP AG. All rights reserved.
NAME
---Mr A
Mr B
Ms C
Ms D
Mr E
Mr F
Ms G
Ms H
Mr I
PNR
--P01
P02
P03
P04
P05
P06
P07
P08
P09
108
Tuple Variables aka Table Aliases
If a table alias is defined in the FROM clause, you are not allowed to use the
corresponding table name for qualification of a column name:
SELECT Official.Name
FROM Official o;
SELECT Official.Name
FROM Official;
SELECT o.Name
FROM Official o;
SELECT o.Name
FROM Official;
SELECT Name
FROM Official o;
SELECT Name
FROM Official;
©
2013 SAP AG. All rights reserved.
109
Case Differentiation
Can the projection list contain
columns that are based on a case
differentiation?
©
2013 SAP AG. All rights reserved.
110
Case Differentiation
The projection list can contain columns that are based on a case differentiation
These columns can be named explicitly:
SELECT *,
CASE
WHEN
WHEN
ELSE
END AS
FROM Car;
©
2013 SAP AG. All rights reserved.
HP < 120 THEN 'low'
HP >= 120 AND HP < 180 THEN 'medium'
'high'
Rating
111
Case Differentiation
CARID
----F01
F02
F03
F04
F05
F06
F07
F08
F09
F10
F11
F12
F13
F14
F15
F16
F17
F18
F19
F20
©
PLATENUMBER
----------HD-V 106
HD-VW 4711
HD-JA 1972
HD-AL 1002
HD-MM 3206
HD-VW 1999
HD-ML 3206
HD-IK 1002
HD-UP 13
HD-MT 507
HD-MM 208
HD-XY 4711
HD-IK 1001
HD-MM 1977
HD-MB 3030
?
HD-Y 333
HD-MQ 2006
HD-VW 2012
?
2013 SAP AG. All rights reserved.
BRAND
-------Fiat
VW
BMW
Mercedes
Mercedes
Audi
Audi
VW
Skoda
BMW
BMW
Skoda
Renault
Mercedes
Skoda
Opel
Audi
Renault
VW
Audi
COLOR
-----red
black
blue
white
black
yellow
blue
black
red
black
green
red
red
white
black
green
orange
red
black
green
HP
--75
120
184
136
170
260
116
160
105
140
184
105
136
170
136
120
184
90
125
184
OWNER
----H06
H03
H03
H07
H03
H05
H03
H07
H02
H04
H02
H04
H07
H03
H03
?
H09
H03
H01
?
RATING
-----low
medium
high
medium
medium
high
low
medium
low
medium
high
low
medium
medium
medium
medium
high
low
medium
high
112
Case Differentiation
If a case differentiation does not correspond to any of the
listed cases, a NULL value is returned:
SELECT CarID,
CASE Color
WHEN 'red'
WHEN 'green'
WHEN 'yellow'
WHEN 'blue'
WHEN 'white'
WHEN 'black'
END AS Color
FROM Car;
©
2013 SAP AG. All rights reserved.
THEN
THEN
THEN
THEN
THEN
THEN
'FF0000'
'00FF00'
'FFFF00'
'0000FF'
'FFFFFF'
'000000'
CARID
----F01
F02
F03
F04
F05
F06
F07
F08
F09
F10
F11
F12
F13
F14
F15
F16
F17
F18
F19
F20
COLOR
-----FF0000
000000
0000FF
FFFFFF
000000
FFFF00
0000FF
000000
FF0000
000000
00FF00
FF0000
FF0000
FFFFFF
000000
00FF00
?
FF0000
000000
00FF00
113
Case Differentiation
Both the THEN and the ELSE branch can contain references to table columns:
SELECT CarID,
CASE
WHEN PlateNumber IS NOT NULL THEN PlateNumber
ELSE 'The Car is not registered!'
END AS PlateNumber,
CASE Brand
WHEN 'Mercedes' THEN 'Mercedes-Benz'
WHEN 'VW' THEN 'Volkswagen'
ELSE Brand
END AS Brand,
Color, HP
FROM Car;
©
2013 SAP AG. All rights reserved.
114
Case Differentiation
CARID
----F01
F02
F03
F04
F05
F06
F07
F08
F09
F10
F11
F12
F13
F14
F15
F16
F17
F18
F19
F20
©
PLATENUMBER
-------------------------HD-V 106
HD-VW 4711
HD-JA 1972
HD-AL 1002
HD-MM 3206
HD-VW 1999
HD-ML 3206
HD-IK 1002
HD-UP 13
HD-MT 507
HD-MM 208
HD-XY 4711
HD-IK 1001
HD-MM 1977
HD-MB 3030
The Car is not registered!
HD-Y 333
HD-MQ 2006
HD-VW 2012
The Car is not registered!
2013 SAP AG. All rights reserved.
BRAND
------------Fiat
Volkswagen
BMW
Mercedes-Benz
Mercedes-Benz
Audi
Audi
Volkswagen
Skoda
BMW
BMW
Skoda
Renault
Mercedes-Benz
Skoda
Opel
Audi
Renault
Volkswagen
Audi
COLOR
-----red
black
blue
white
black
yellow
blue
black
red
black
green
red
red
white
black
green
orange
red
black
green
HP
--75
120
184
136
170
260
116
160
105
140
184
105
136
170
136
120
184
90
125
184
115
Duplicate Elimination
SELECT DISTINCT
©
2013 SAP AG. All rights reserved.
116
Duplicate Elimination
A table with a primary key does not contain duplicates
SELECT *
FROM Car;
CARID
----…
F04
F05
…
F09
…
F14
F15
…
©
2013 SAP AG. All rights reserved.
PLATENUMBER
----------…
HD-AL 1002
HD-MM 3206
…
HD-UP 13
…
HD-MM 1977
HD-MB 3030
…
BRAND
-------…
Mercedes
Mercedes
…
Skoda
…
Mercedes
Skoda
…
COLOR
----…
white
black
…
red
…
white
black
…
HP
--…
136
170
…
105
…
170
136
…
OWNER
----…
H07
H03
…
H02
…
H03
H03
…
117
Duplicate Elimination
Duplicates can occur when a key column is not included in the projection list:
SELECT Brand
FROM Car;
©
2013 SAP AG. All rights reserved.
BRAND
-------…
Mercedes
Mercedes
…
Skoda
…
Mercedes
Skoda
…
118
Duplicate Elimination
If duplicate elimination is not intended,
you can specify the keyword ALL:
SELECT ALL Brand
FROM Car;
©
2013 SAP AG. All rights reserved.
BRAND
-------…
Mercedes
Mercedes
…
Skoda
…
Mercedes
Skoda
…
119
Duplicate Elimination
The keyword
DISTINCT ensures that the result table contains no duplicates:
SELECT DISTINCT Brand
FROM Car;
©
2013 SAP AG. All rights reserved.
BRAND
-------Fiat
VW
BMW
Mercedes
Audi
Skoda
Renault
Opel
120
Duplicate Elimination
NULL values ​are treated in duplicate elimination as "normal" values
The result table contains (at most) one row that consists entirely of NULL values:
SELECT DISTINCT Overtime
FROM Official;
©
2013 SAP AG. All rights reserved.
OVERTIME
-------10
20
?
18
22
121
Duplicate Elimination
The "duplicate" term always refers to full result rows:
SELECT Brand, Color
FROM Car;
Duplicates
©
2013 SAP AG. All rights reserved.
BRAND
-------…
Mercedes
Mercedes
Skoda
Skoda
Mercedes
Skoda
…
COLOR
----…
white
black
red
red
white
black
…
122
Duplicate Elimination
If a projection list contains multiple columns, DISTINCT always refers to the
combination of all these columns:
SELECT DISTINCT Brand, Color
FROM Car;
©
2013 SAP AG. All rights reserved.
BRAND
-------…
Mercedes
Mercedes
Skoda
Skoda
…
COLOR
----…
white
black
red
black
…
123
Duplicate Elimination
DISTINCT can also be used if the result table should contain all the columns
If the (source) table has a (primary) key DISTINCT is not required:
SELECT DISTINCT *
FROM Car;
CARID
----…
F04
F05
…
F09
…
F14
F15
…
©
2013 SAP AG. All rights reserved.
PLATENUMBER
----------…
HD-AL 1002
HD-MM 3206
…
HD-UP 13
…
HD-MM 1977
HD-MB 3030
…
BRAND
-------…
Mercedes
Mercedes
…
Skoda
…
Mercedes
Skoda
…
COLOR
----…
white
black
…
red
…
white
black
…
HP
--…
136
170
…
105
…
170
136
…
OWNER
----…
H07
H03
…
H02
…
H03
H03
…
124
Sorting
ORDER BY
©
2013 SAP AG. All rights reserved.
125
Sorting
The result table can be sorted by a specific column:
SELECT Brand, Color
FROM Car
ORDER BY Brand;
©
2013 SAP AG. All rights reserved.
BRAND
-------Audi
Audi
Audi
Audi
BMW
BMW
BMW
Fiat
Mercedes
Mercedes
Mercedes
Opel
Renault
Renault
Skoda
Skoda
Skoda
VW
VW
VW
COLOR
-----yellow
blue
orange
green
blue
black
green
red
white
black
white
green
red
red
red
red
black
black
black
black
126
Sorting
A descending sorting is possible:
SELECT Brand, Color
FROM Car
ORDER BY Brand DESC;
©
2013 SAP AG. All rights reserved.
BRAND
-------VW
VW
VW
Skoda
Skoda
Skoda
Renault
Renault
Opel
Mercedes
Mercedes
Mercedes
Fiat
BMW
BMW
BMW
Audi
Audi
Audi
Audi
COLOR
-----black
black
black
black
red
red
red
red
green
white
black
white
red
green
black
blue
green
orange
blue
yellow
127
Sorting
To sort ascending apply the optional keyword
SELECT Brand, Color
FROM Car
ORDER BY Brand ASC;
©
2013 SAP AG. All rights reserved.
ASC:
BRAND
-------Audi
Audi
Audi
Audi
BMW
BMW
BMW
Fiat
Mercedes
Mercedes
Mercedes
Opel
Renault
Renault
Skoda
Skoda
Skoda
VW
VW
VW
COLOR
-----yellow
blue
orange
green
blue
black
green
red
white
black
white
green
red
red
red
red
black
black
black
black
128
Sorting
The sorting can be applied using a column
that does not appear in the projection list:
SELECT Brand, Color
FROM Car
ORDER BY PlateNumber;
©
2013 SAP AG. All rights reserved.
BRAND
-------Opel
Audi
Renault
Mercedes
VW
BMW
Skoda
Audi
Mercedes
BMW
Mercedes
Renault
BMW
Skoda
Fiat
Audi
VW
VW
Skoda
Audi
COLOR
-----green
green
red
white
black
blue
black
blue
white
green
black
red
black
red
red
yellow
black
black
red
orange
129
Sorting
You can sort using a combination of columns:
SELECT Brand, Color
FROM Car
ORDER BY Brand ASC, Color DESC;
©
2013 SAP AG. All rights reserved.
BRAND
-------Audi
Audi
Audi
Audi
BMW
BMW
BMW
Fiat
Mercedes
Mercedes
Mercedes
Opel
Renault
Renault
Skoda
Skoda
Skoda
VW
VW
VW
COLOR
-----yellow
orange
green
blue
green
blue
black
red
white
white
black
green
red
red
red
red
black
black
black
black
130
Sorting
Instead of the column names in the ORDER BY clause,
the column numbers (based on the projection list) can be used:
SELECT Brand, Color
FROM Car
ORDER BY 1 ASC, 2 DESC;
©
2013 SAP AG. All rights reserved.
BRAND
-------Audi
Audi
Audi
Audi
BMW
BMW
BMW
Fiat
Mercedes
Mercedes
Mercedes
Opel
Renault
Renault
Skoda
Skoda
Skoda
VW
VW
VW
COLOR
-----yellow
orange
green
blue
green
blue
black
red
white
white
black
green
red
red
red
red
black
black
black
black
131
Sorting
If result columns are named explicitly,
you can refer to the new name for sorting:
SELECT Brand AS Manufacturer, Color
FROM Car
ORDER BY Manufacturer ASC, Color DESC;
©
2013 SAP AG. All rights reserved.
MANUFACTURER
-----------Audi
Audi
Audi
Audi
BMW
BMW
BMW
Fiat
Mercedes
Mercedes
Mercedes
Opel
Renault
Renault
Skoda
Skoda
Skoda
VW
VW
VW
COLOR
-----yellow
orange
green
blue
green
blue
black
red
white
white
black
green
red
red
red
red
black
black
black
black
132
Sorting
If result columns are explicitly renamed, you can still
reference the original name in the ORDER BY clause:
SELECT Brand AS Manufacturer, Color
FROM Car
ORDER BY Brand ASC, Color DESC;
©
2013 SAP AG. All rights reserved.
MANUFACTURER
-----------Audi
Audi
Audi
Audi
BMW
BMW
BMW
Fiat
Mercedes
Mercedes
Mercedes
Opel
Renault
Renault
Skoda
Skoda
Skoda
VW
VW
VW
COLOR
-----yellow
orange
green
blue
green
blue
black
red
white
white
black
green
red
red
red
red
black
black
black
black
133
Sorting
You can sort based on calculated values.
 Sorting criteria: How much is the power below 200 kW?
SELECT CarID, Brand, HP
FROM Car
ORDER BY 200 - HP / 1.36 ASC;
©
2013 SAP AG. All rights reserved.
CARID
----F06
F03
F11
F17
F20
F05
F14
F08
F10
F04
F13
F15
F19
F02
F16
F07
F09
F12
F18
F01
BRAND
-------Audi
BMW
BMW
Audi
Audi
Mercedes
Mercedes
VW
BMW
Mercedes
Renault
Skoda
VW
VW
Opel
Audi
Skoda
Skoda
Renault
Fiat
HP
--260
184
184
184
184
170
170
160
140
136
136
136
125
120
120
116
105
105
90
75
134
Sorting
You can reference functions in the ORDER BY clause:
SELECT Name, Birthday
FROM Owner
ORDER BY YEAR(Birthday) DESC, Name ASC;
NAME
-----Mr X
Mr Z
Ms Y
Ms U
Ms W
Mr V
Ms T
HDM AG
IKEA
SAP AG
©
2013 SAP AG. All rights reserved.
BIRTHDAY
---------1986-08-30
1986-02-03
1986-02-10
1966-05-11
1957-06-01
1952-04-21
1934-06-20
?
?
?
135
Top-n Clause
How many rows are in the result
set?
©
2013 SAP AG. All rights reserved.
136
Top-n Clause
You can determine how many rows should be included in the query result
(maximum).
 What are the ten most powerful vehicles (based on horse power)?
SELECT TOP 10 CarID, Brand, Color, HP
FROM Car
CARID BRAND
ORDER BY 4 DESC;
----- -------F06
F20
F17
F11
F03
F14
F05
F08
F10
F15
©
2013 SAP AG. All rights reserved.
Audi
Audi
Audi
BMW
BMW
Mercedes
Mercedes
VW
BMW
Skoda
COLOR
-----yellow
green
orange
green
blue
white
black
black
black
black
HP
--260
184
184
184
184
170
170
160
140
136
137
Top-n Clause
You can also use the Top-n Clause if the result table should include all columns.
 What are the 5 most powerful vehicles (based on horse power)?
SELECT TOP 5 *
FROM Car
ORDER BY HP DESC;
CARID
----F06
F20
F17
F11
F03
©
2013 SAP AG. All rights reserved.
PLATENUMBER
----------HD-VW 1999
?
HD-Y 333
HD-MM 208
HD-JA 1972
BRAND
----Audi
Audi
Audi
BMW
BMW
COLOR
-----yellow
green
orange
green
blue
HP
--260
184
184
184
184
OWNER
----H05
?
H09
H02
H03
138
Top-n Clause
You can combine the Top-n Clause with the keyword DISTINCT.
 What are the 7 highest HP values?
SELECT TOP 7 DISTINCT HP
FROM Car
ORDER BY 1 DESC;
©
2013 SAP AG. All rights reserved.
HP
--260
184
170
160
140
136
125
139
Top-n Clause
No error is thrown if you request more rows than available.
The result set will not be filled with additional, “artificial” rows.
 570 different colors are requested:
SELECT TOP 570 DISTINCT Color
FROM Car;
©
2013 SAP AG. All rights reserved.
COLOR
-----red
black
blue
white
yellow
green
orange
140
Top-n Clause
It is possible to request 0 result rows.
In this case the result set does not contain any row.
 Zero colors are requested:
SELECT TOP 0 Color
FROM Car;
©
2013 SAP AG. All rights reserved.
COLOR
-----
141
Limit And Offset Clause
You can use the Limit clause as alternative to the Top-n clause.
The Limit clause comes at the very end of the SELECT statement.
 What are the 5 most powerful vehicles (based on horse power)?
SELECT *
FROM Car
ORDER BY HP DESC
LIMIT 5;
CARID
----F06
F20
F17
F11
F03
©
2013 SAP AG. All rights reserved.
PLATENUMBER
----------HD-VW 1999
?
HD-Y 333
HD-MM 208
HD-JA 1972
BRAND
----Audi
Audi
Audi
BMW
BMW
COLOR
-----yellow
green
orange
green
blue
HP
--260
184
184
184
184
OWNER
----H05
?
H09
H02
H03
142
Limit And Offset Clause
The Limit clause can be combined with the Offset clause to skip records.
This allows you to read result sets “page by page”.
 What are the next 5 most powerful vehicles (based on horse power)?
SELECT *
FROM Car
ORDER BY HP DESC
LIMIT 5
CARID
OFFSET 5;
----F78
F77
F14
F05
F07
©
2013 SAP AG. All rights reserved.
PLATENUMBER
----------HD-MT 2510
HD-MT 2509
HD-MM 1977
HD-MM 3206
HD-IK 1002
BRAND
-------?
?
Mercedes
Mercedes
VW
COLOR
-----green
red
white
black
black
HP
--260
184
184
184
184
OWNER
----?
?
H03
H03
H07
143
WHERE Clause
Which rows are included in the
result set?
©
2013 SAP AG. All rights reserved.
144
WHERE Clause
The WHERE clause is used to filter rows.
It is used to extract only those rows that fulfill a specified criterion.
SELECT PlateNumber, Brand, Color
FROM Car
WHERE Brand = 'BMW';
PLATENUMBER
----------HD-JA 1972
HD-MT 507
HD-MM 208
©
2013 SAP AG. All rights reserved.
BRAND
----BMW
BMW
BMW
COLOR
----blue
black
green
145
WHERE Clause
You can reference numeric columns in the WHERE clause.
SELECT HP, Brand, Color
FROM Car
WHERE HP >= 170;
©
2013 SAP AG. All rights reserved.
HP
--184
170
260
184
170
184
184
BRAND
-------BMW
Mercedes
Audi
BMW
Mercedes
Audi
Audi
COLOR
-----blue
black
yellow
green
white
orange
green
146
WHERE Clause
You can reference a column in the WHERE clause
that is not included in the projection list.
SELECT Brand, Color
FROM Car
WHERE HP >= 170;
©
2013 SAP AG. All rights reserved.
BRAND
-------BMW
Mercedes
Audi
BMW
Mercedes
Audi
Audi
COLOR
-----blue
black
yellow
green
white
orange
green
147
WHERE Clause
You can check for NULL
in the WHERE clause:
SELECT CarID, Brand, Color
FROM Car
WHERE PlateNumber IS NULL;
CARID
----F16
F20
©
2013 SAP AG. All rights reserved.
BRAND
----Opel
Audi
COLOR
----green
green
148
WHERE Clause
You can check for IS
in the WHERE clause:
NOT NULL
SELECT CarID, Brand, Color
FROM Car
WHERE PlateNumber IS NOT NULL;
©
2013 SAP AG. All rights reserved.
CARID
----F01
F02
F03
F04
F05
F06
F07
F08
F09
F10
F11
F12
F13
F14
F15
F17
F18
F19
BRAND
-------Fiat
VW
BMW
Mercedes
Mercedes
Audi
Audi
VW
Skoda
BMW
BMW
Skoda
Renault
Mercedes
Skoda
Audi
Renault
VW
COLOR
-----red
black
blue
white
black
yellow
blue
black
red
black
green
red
red
white
black
orange
red
black
149
WHERE Clause
You can check if values are included IN a value-list.
SELECT Brand, Color
FROM Car
WHERE Color IN ('red', 'blue', 'orange');
BRAND
------Fiat
BMW
Audi
Skoda
Skoda
Renault
Audi
Renault
©
2013 SAP AG. All rights reserved.
COLOR
-----red
blue
blue
red
red
red
orange
red
150
WHERE Clause
You can check if values are included in an interval.
SELECT PlateNumber, Brand, Color, HP
FROM Car
WHERE HP BETWEEN 140 AND 170;
PLATENUMBER
----------HD-MM 3206
HD-IK 1002
HD-MT 507
HD-MM 1977
©
2013 SAP AG. All rights reserved.
BRAND
-------Mercedes
VW
BMW
Mercedes
COLOR
----black
black
black
white
HP
--170
160
140
170
151
WHERE Clause
You can reference calculated values in the WHERE clause.
We do not recommend this option for performance reasons.
 Which cars have a power of at least 125 kW?
SELECT CarID, Brand, HP
FROM Car
WHERE HP / 1.36 >= 125;
©
2013 SAP AG. All rights reserved.
CARID
----F03
F05
F06
F11
F14
F17
F20
BRAND
-------BMW
Mercedes
Audi
BMW
Mercedes
Audi
Audi
HP
--184
170
260
184
170
184
184
152
WHERE Clause
You can use functions in the WHERE clause.
SELECT *
FROM Owner
WHERE YEAR(Birthday) = 1986;
OWNERID
------H08
H09
H10
©
2013 SAP AG. All rights reserved.
NAME
---Mr X
Ms Y
Mr Z
BIRTHDAY
---------1986-08-30
1986-02-10
1986-02-03
CITY
--------Walldorf
Sinsheim
Ladenburg
153
WHERE Clause
You can use search patterns in the WHERE clause.
SELECT PlateNumber, Brand, Color, HP
FROM Car
WHERE PlateNumber LIKE '%MM%';
PLATENUMBER
----------HD-MM 3206
HD-MM 208
HD-MM 1977
©
2013 SAP AG. All rights reserved.
BRAND
-------Mercedes
BMW
Mercedes
COLOR
----black
green
white
HP
--170
184
170
154
LIKE Predicate
The wildcard character % (percentage sign) represents any string
containing no, one, or multiple characters.
The wildcard character _ (underscore) represents any single character.
WHERE MyColumn LIKE 'M%'
String starting with “M“
WHERE MyColumn LIKE 'M _'
String of two characters starting with “M“
WHERE MyColumn LIKE '%M'
String ending with “M“
WHERE MyColumn LIKE '%M%'
String containing “M“
WHERE MyColumn LIKE '_ _ _'
String with length 3
WHERE MyColumn LIKE '_ _ _ _T_M%'
“T“ on fifth and “M“ on seventh position
©
2013 SAP AG. All rights reserved.
155
LIKE Predicate
If you want to search for the percentage sign (%) or underscore (_) itself, you have
to place an ESCAPE character in front.
You can choose the ESCAPE character (with some restrictions).
LIKE '$%%' ESCAPE '$'
String starting with a percentage sign
LIKE '$_ _' ESCAPE '$'
String of two characters
starting with an underscore
LIKE '%$%' ESCAPE '$'
String ending with a percentage sign
LIKE '%$%%' ESCAPE '$'
String containing a percentage sign
LIKE '%$_$%%' ESCAPE '$'
String containing an underscore followed by a
percentage sign
LIKE '_ _ _ _ $%_ $ _%' ESCAPE '$'
“%“ on fifth and “_“ on seventh position.
©
2013 SAP AG. All rights reserved.
156
LIKE Predicate
If you need to search for the escape character within a string, you need to put the
escape character in front of itself to mask it.
LIKE '$%%$$' ESCAPE '$'
String starting with a percentage sign
and ending with $
LIKE '$_%$$%$_' ESCAPE '$'
String starting and ending with an underscore
and containing the escape character $
LIKE '%$%$$%' ESCAPE '$'
String containing a percentage sign
followed by $
LIKE '%$_%$$' ESCAPE '$'
String containing an underscore and
ending with $
LIKE '_ _ _ _ $%_ $$%' ESCAPE '$'
“%“ on fifth and “$“ on seventh position
©
2013 SAP AG. All rights reserved.
157
WHERE Clause
You can use compound WHERE clauses.
SELECT PlateNumber, Brand, Color
FROM Car
WHERE Brand = 'Skoda' AND Color = 'red';
PLATENUMBER
----------HD-UP 13
HD-XY 4711
©
2013 SAP AG. All rights reserved.
BRAND
----Skoda
Skoda
COLOR
----red
red
158
WHERE Clause
You can reference the same column multiple times.
SELECT PlateNumber, Brand, Color
FROM Car
WHERE Brand = 'Skoda' OR Brand = 'BMW';
PLATENUMBER
----------HD-JA 1972
HD-UP 13
HD-MT 507
HD-MM 208
HD-XY 4711
HD-MB 3030
©
2013 SAP AG. All rights reserved.
BRAND
----BMW
Skoda
BMW
BMW
Skoda
Skoda
COLOR
----blue
red
black
green
red
black
159
WHERE Clause
You can use brackets.
SELECT PlateNumber, Brand, Color
FROM Car
WHERE (Brand = 'Skoda' OR Brand = 'BMW')
AND Color = 'black';
PLATENUMBER
----------HD-MT 507
HD-MB 3030
©
2013 SAP AG. All rights reserved.
BRAND
----BMW
Skoda
COLOR
----black
black
160
WHERE Clause
 The license plate started with "HD" for Heidelberg
 I'm sure I saw an "M"
 I clearly remember the digits "2" and "6"
 The "2" was definitely left of the "6"
 Between the "2" and the "6" was exactly one digit
 It was neither Skoda, nor a VW
 The car was blue or green
CARID
----F07
PLATENUMBER
----------HD-ML 3206
BRAND
----Audi
COLOR
----blue
HP
--116
SELECT *
FROM Car
WHERE PlateNumber LIKE 'HD-%M% %2_6%'
AND Brand <> 'Skoda' AND Brand <> 'VW'
AND (Color = 'blue' OR Color = 'green');
©
2013 SAP AG. All rights reserved.
OWNER
----H03
161
Operator Precedence
What is the precedence of the
different operators?
©
2013 SAP AG. All rights reserved.
162
Operator Precedence
The operators have the precedence indicated by the table below:
Precedence
Operator
Explanation
Highest
()
parentheses
‒
unary minus
*, /
multiplication, division
+, ‒
addition, subtraction
=, <, <=, >, >=, <>, IS NULL, LIKE,
BETWEEN
Lowest
©
2013 SAP AG. All rights reserved.
comparison
NOT
logical negation
AND
conjunction
OR
disjunction
163
Unit 2: Reading Data From A Table And View
Summary
You should now be able to:
• Write simple database queries using SQL‘s SELECT statement
•
•
•
•
•
•
•
©
Project columns in and out of queries using the SELECT clause
Avoid duplicates in SELECT statement result sets
Include columns based on conditions
Use built-in functions in column lists and WHERE clauses
Limit results sets to the first N rows
Ensure a specific order in SELECT statement result sets
Restrict the result set using the WHERE clause
2013 SAP AG. All rights reserved.
164
Unit 3
Aggregating Data
165
Unit 3: Aggregating Data
Learning Objectives
After completing this unit, you will be able to:
• Determine aggregated values on table columns using a single
SELECT statement
• List the aggregate functions supported by HANA
• Determine such aggregated values for groups of rows, using the
GROUP BY clause
• Filter such groups using the HAVING clause
©
2013 SAP AG. All rights reserved.
166
Aggregate Expressions
Calculations across multiple rows
©
2013 SAP AG. All rights reserved.
167
Aggregate Expressions
Count(*)

You can calculate the number of rows in the result set using COUNT .

Rows containing only NULL values are included.
 What is the quantity of cars with the brand “Audi“?
SELECT COUNT(*)
FROM Car
WHERE Brand = 'Audi';
©
2013 SAP AG. All rights reserved.
COUNT(*)
-------4
168
Count(*)
Aggregate Expressions
You can explicitly name columns created by aggregate expressions.
 What is the quantity of cars with the brand “Audi“?
SELECT COUNT(*) AS "Quantity of Audi"
FROM Car
WHERE Brand = 'Audi';
Quantity of Audi
---------------4
©
2013 SAP AG. All rights reserved.
169
Aggregate Expressions
Count(<column>)


You can calculate the number of values within a single column.
NULL values are not included.

You can only use a single column as parameter of COUNT.
 How many cars are registered to an owner?
 This does not calculate the number of different owners!
SELECT COUNT(Owner)
FROM Car;
©
2013 SAP AG. All rights reserved.
COUNT(OWNER)
-----------18
170
Aggregate Expressions


Count(DISTINCT <column>)
You can calculate the number of different NOT-NULL-values of a certain
column.
You can use only a single column as parameter for COUNT DISTINCT.
NULL values are not included.
 How many different owners have a registered car?
SELECT COUNT(DISTINCT Owner)
FROM Car;
COUNT(DISTINCT OWNER)
--------------------8
©
2013 SAP AG. All rights reserved.
171
Aggregate Expressions
SELECT *
FROM T;
SELECT S
FROM T;
S
?
?
?
X
X
SELECT COUNT(*)
FROM T;
COUNT(*)
-------5
SELECT COUNT(S)
FROM T;
COUNT(S)
-------2
SELECT COUNT(DISTINCT *)
FROM T;
SELECT COUNT(DISTINCT S)
FROM T;
©
2013 SAP AG. All rights reserved.
COUNT(DISTINCT S)
----------------1
172
Aggregate Expressions
MIN/MAX(<column>)
You can calculate the minimum or maximum value in a column.
 What is the horsepower range of the registered cars?
SELECT MIN(HP), MAX(HP)
FROM Car;
©
2013 SAP AG. All rights reserved.
MIN(HP)
------75
MAX(HP)
------260
173
Aggregate Expressions
You can combine aggregate expressions and “normal” functions.
In which year was the youngest owner born?
SELECT MAX(YEAR(Birthday)) AS Year
FROM Owner;
YEAR
---1986
SELECT YEAR(MAX(Birthday)) AS Year
FROM Owner;
©
2013 SAP AG. All rights reserved.
174
Aggregate Expressions
The sequence of nested functions can be relevant.
 What is the lowest or highest HP value?
SELECT ABS(MAX(0 - HP))
FROM Car;
SELECT MAX(ABS(0 - HP))
FROM Car;
©
2013 SAP AG. All rights reserved.
ABS(MAX(0-HP))
-------------75
MAX(ABS(0-HP))
-------------260
175
Aggregate Expressions
The WHERE clause is included in the minimum and maximum calculation.
 What is the horsepower range of BMWs?
SELECT MIN(HP), MAX(HP)
FROM Car
WHERE Brand = 'BMW';
©
2013 SAP AG. All rights reserved.
MIN(HP)
------140
MAX(HP)
------184
176
Aggregate Expressions




SUM(<column>)
You can sum up the values in a column.
The WHERE clause is included in the summation.
NULL values in the column are ignored.
Individual NULL values contained in the column do not result in NULL for the sum.
(as long as there is at least one numeric value)
 What is the sum of horsepower for all Audis?
SELECT SUM(HP)
FROM Car
WHERE Brand = 'Audi';
©
2013 SAP AG. All rights reserved.
SUM(HP)
------744
177
Aggregate Expressions





You can sum up the distinct values of a column.
The WHERE clause is included in the summation.
NULL values of the column are ignored.
Individual NULL values contained in the column do not result in NULL for the sum.
(as long as there is at least one numeric value)
If a value occurs multiple times, it is still counted only once when summing
SELECT SUM(DISTINCT HP)
FROM Car
WHERE Brand = 'Audi';
©
SUM(DISTINCT <column>)
2013 SAP AG. All rights reserved.
SUM(DISTINCT HP)
---------------560
178
Aggregate Expressions




AVG(<column>)
You can calculate the average of all values in a column.
The WHERE clause is included in the calculation.
NULL values in the column are completely ignored
(in the numerator and denominator)
Individual NULL values contained in the column do not result in NULL for the average.
 What is the average horsepower of Audi?
SELECT AVG(HP)
FROM Car
WHERE Brand = 'Audi';
©
2013 SAP AG. All rights reserved.
AVG(HP)
------186
179
Aggregate Expressions





AVG(DISTINCT <column>)
You can calculate the average of all distinct values in a column.
The WHERE clause is included in the calculation.
NULL values in the column are completely ignored
(in the numerator and denominator)
Individual NULL values contained in the column do not result in NULL for the average.
If a value occurs multiple times, it is still counted only once for the average calculation.
SELECT AVG(DISTINCT HP)
FROM Car
WHERE Brand = 'Audi';
AVG(DISTINCT HP)
----------------------------------186.6666666666666666666666666666667
©
2013 SAP AG. All rights reserved.
180
Aggregate Expressions
Which aggregate expressions are
available in SAP HANA?
©
2013 SAP AG. All rights reserved.
181
Aggregate Expressions
SAP HANA provides the following aggregate expressions:
©
2013 SAP AG. All rights reserved.
Aggregate Name
Description
COUNT
Count
MIN
Minimum
MAX
Maximum
SUM
Sum
AVG
Average
STDDEV
Standard Deviation
VAR
Variance
182
Group By
GROUP BY
©
2013 SAP AG. All rights reserved.
183
Group By



A table can be divided into (disjoint) groups of rows
A group is represented in the query result by a single row
Aggregate expressions will be evaluated separately for each group
 What is the number of cars per brand?
SELECT Brand, COUNT(*)
FROM Car
GROUP BY Brand;
©
2013 SAP AG. All rights reserved.
BRAND
-------Fiat
VW
BMW
Mercedes
Audi
Skoda
Renault
Opel
COUNT(*)
-------1
3
3
3
4
3
2
1
184
Group By

What is the highest horse power value per brand?
SELECT Brand, MAX(HP)
FROM Car
GROUP BY Brand;
©
2013 SAP AG. All rights reserved.
BRAND
-------Fiat
VW
BMW
Mercedes
Audi
Skoda
Renault
Opel
MAX(HP)
------75
160
184
170
260
136
136
120
185
Group By
NULL values of the GROUP BY column are treated as “normal” values creating a
single group.
 How often a certain overtime value occurs?
SELECT Overtime, COUNT(*) AS Frequency
FROM Official
GROUP BY Overtime;
OVERTIME FREQUENCY
-------10
20
?
18
22
©
2013 SAP AG. All rights reserved.
--------3
1
3
1
1
186
Group By
You can combine GROUP BY with ORDER BY for sorting.
SELECT
FROM
GROUP BY
ORDER BY
©
2013 SAP AG. All rights reserved.
Brand, MAX(HP)
Car
Brand
2 DESC, 1 ASC;
BRAND
-------Audi
BMW
Mercedes
VW
Renault
Skoda
Opel
Fiat
MAX(HP)
------260
184
170
160
136
136
120
75
187
Group By
You can use functions in the GROUP BY clause.

What is the number of owners per year of birth?
SELECT
FROM
GROUP BY
ORDER BY
YEAR(Birthday), COUNT(*)
Owner
YEAR(Birthday)
2 DESC, 1 ASC;
YEAR(BIRTHDAY)
-------------?
1986
1934
1952
1957
1966
©
2013 SAP AG. All rights reserved.
COUNT(*)
-------3
3
1
1
1
1
188
Group By
The WHERE clause is processed before the grouping.
 What is the number of black cars per brand?
 Only brands with black cars are included into the result set.
SELECT
FROM
WHERE
GROUP BY
©
Brand, COUNT(*)
Car
Color = 'black'
Brand;
2013 SAP AG. All rights reserved.
BRAND
-------VW
Mercedes
BMW
Skoda
COUNT(*)
-------3
1
1
1
189
Group By
You can use a combination of columns in the GROUP BY clause.
SELECT Brand, Color, COUNT(*)
FROM Car
GROUP BY Brand, Color;
©
2013 SAP AG. All rights reserved.
BRAND
-------Fiat
VW
BMW
Mercedes
Mercedes
Audi
Audi
Skoda
BMW
BMW
Renault
Skoda
Opel
Audi
Audi
COLOR
-----red
black
blue
white
black
yellow
blue
red
black
green
red
black
green
orange
green
COUNT(*)
-------1
3
1
2
1
1
1
2
1
1
2
1
1
1
1
190
Group By
You can explicitly rename result columns in combination with GROUP BY.
SELECT Brand AS Manufacturer, Color, COUNT(*) AS "# of cars"
FROM Car
GROUP BY Brand, Color;
MANUFACTURER
-----------Fiat
VW
BMW
Mercedes
Mercedes
Audi
Audi
Skoda
BMW
BMW
Renault
…
©
2013 SAP AG. All rights reserved.
COLOR
-----red
black
blue
white
black
yellow
blue
red
black
green
red
…
# of cars
--------1
3
1
2
1
1
1
2
1
1
2
…
191
HAVING Clause
What groups are included in the
query result?
©
2013 SAP AG. All rights reserved.
192
HAVING
Using the HAVING clause you can specify which conditions a group must meet to
be included in the result set.
 Which combinations of brand and color occur at least twice?
SELECT
FROM
GROUP BY
HAVING
Brand, Color, COUNT(*)
Car
Brand, Color
COUNT(*) >= 2;
BRAND
-------VW
Mercedes
Skoda
Renault
©
2013 SAP AG. All rights reserved.
COLOR
----black
white
red
red
COUNT(*)
-------3
2
2
2
193
HAVING
The HAVING condition can reference columns not included in the projection list.
 What is the number of brand-color combinations, where at least one car has less
than 120 HP?
 We want to analyze based on the quantity of all cars, not only the cars with less
than 120 HP.
SELECT
FROM
GROUP BY
HAVING
Brand, Color, COUNT(*)
Car
Brand, Color
MIN(HP) < 120;
BRAND
------Fiat
Audi
Skoda
Renault
©
2013 SAP AG. All rights reserved.
COLOR
----red
blue
red
red
COUNT(*)
-------1
1
2
2
194
SELECT statement





What is the number of cars per brand, which are black or red?
Rename the Brand column to "Manufacturer"
Display only those manufacturers with at least 2 cars
Sort the result set first descending by number of cars
Sort the result set second ascending by manufacturer.
SELECT
FROM
WHERE
GROUP BY
HAVING
ORDER BY
©
c.Brand AS "Manufacturer", COUNT(*)
Car c
Color IN ('black', 'red')
Brand
COUNT(*) >= 2
Manufacturer
2 DESC, Brand ASC;
2013 SAP AG. All rights reserved.
-----------Skoda
VW
Renault
COUNT(*)
-------3
3
2
195
Unit 3: Aggregating Data
Summary
You should now be able to:
• Determine aggregated values on table columns using a single
SELECT statement
• List the aggregate functions supported by HANA
• Determine such aggregated values for groups of rows, using the
GROUP BY clause
• Filter such groups using the HAVING clause
©
2013 SAP AG. All rights reserved.
196
Unit 4
Reading Data From Multiple Tables
Part I
197
Unit 4: Reading Data From Multiple Tables Part I
Learning Objectives
After completing this unit, you will be able to:
• Merge the result of several select statements using the
UNION statement
•
•
•
©
Combine data from several tables when querying data
using JOIN constructs
List the various types of Joins
Explain the differences between the various types of Joins, and
apply the right type of Join depending on the problem
2013 SAP AG. All rights reserved.
198
Access to multiple tables
How can I read data from multiple
tables and views?
©
2013 SAP AG. All rights reserved.
199
Access to multiple tables
For read access to multiple database tables / views the
following options are available:
 Combination of results from several partial queries (UNION)
 UNION ALL vs. UNION
 Combination of several tables (JOIN)
 CROSS JOIN vs. INNER JOIN vs. OUTER JOIN
 Implicit JOIN vs. Explicit JOIN
 Nested queries (Sub Query)
 Uncorrelated Sub Query vs. Correlated Sub Query
©
2013 SAP AG. All rights reserved.
200
UNION [ALL]
Combination of results from
several partial queries
©
2013 SAP AG. All rights reserved.
201
UNION [ALL]
SELECT Column, Column, Column
FROM Table
WHERE Condition
UNION ALL
SELECT Column, Column, Column
FROM Table
WHERE Condition;
©
2013 SAP AG. All rights reserved.
202
UNION [ALL]
You can combine the result tables of multiple queries using UNION [ALL].



The individual result tables must have the same number of columns.
The corresponding result columns must have compatible data types.
The column names of the resulting output table are based on the
first SELECT statement.
SELECT PNr, Name
FROM Official
WHERE Salary = 'A09'
UNION ALL
SELECT OwnerID, Name
FROM Owner
WHERE Birthday >= '1977-05-21';
©
2013 SAP AG. All rights reserved.
PNR
--P01
P03
P06
H08
H09
H10
NAME
---Mr A
Ms C
Mr F
Mr X
Ms Y
Mr Z
203
UNION [ALL]
 Almost the same statement as on the previous slide – but with a changed sequence of
partial queries.
 The column names of the resulting output table are based on the
first SELECT statement.
SELECT OwnerID, Name
FROM Owner
WHERE Birthday >= '1977-05-21'
UNION ALL
SELECT PNr, Name
FROM Official
WHERE Salary = 'A09';
©
2013 SAP AG. All rights reserved.
OWNERID
------H08
H09
H10
P01
P03
P06
NAME
---Mr X
Ms Y
Mr Z
Mr A
Ms C
Mr F
204
UNION [ALL]
With UNION [ALL] you can also explicitly rename the result columns.
SELECT OwnerID AS "Person ID", Name
FROM Owner
WHERE Birthday >= '1977-05-21'
UNION ALL
SELECT PNr, Name
FROM Official
WHERE Salary = 'A09';
©
2013 SAP AG. All rights reserved.
Person ID
--------H08
H09
H10
P01
P03
P06
NAME
---Mr X
Ms Y
Mr Z
Mr A
Ms C
Mr F
205
UNION ALL
If the results of multiple partial queries overlap, the overall result includes duplicates
with UNION ALL.
SELECT PlateNumber, Brand, Color
FROM Car
WHERE Brand = 'Mercedes'
UNION ALL
SELECT PlateNumber, Brand, Color
FROM Car
WHERE Color = 'white';
Duplicates
©
2013 SAP AG. All rights reserved.
PLATENUMBER
----------HD-AL 1002
HD-MM 3206
HD-MM 1977
HD-AL 1002
HD-MM 1977
BRAND
-------Mercedes
Mercedes
Mercedes
Mercedes
Mercedes
COLOR
----white
black
white
white
white
206
UNION
You use UNION instead of UNION ALL to eliminate duplicates.
SELECT
FROM
WHERE
UNION
SELECT
FROM
WHERE
PlateNumber, Brand, Color
Car
Brand = 'Mercedes'
PlateNumber, Brand, Color
Car
Color = 'white';
PLATENUMBER
----------HD-AL 1002
HD-MM 3206
HD-MM 1977
©
2013 SAP AG. All rights reserved.
BRAND
-------Mercedes
Mercedes
Mercedes
COLOR
----white
black
white
207
UNION [ALL]
You can use UNION [ALL] to combine result tables of multiple partial queries.
SELECT
FROM
WHERE
UNION
SELECT
FROM
WHERE
UNION
SELECT
FROM
WHERE
©
PlateNumber, Brand, Color
Car
Brand = 'BMW'
PlateNumber, Brand, Color
Car
Color = 'yellow'
PlateNumber, Brand, Color
Car
Color = 'orange';
2013 SAP AG. All rights reserved.
PLATENUMBER
----------HD-JA 1972
HD-MT 507
HD-MM 208
HD-VW 1999
HD-Y 333
BRAND
----BMW
BMW
BMW
Audi
Audi
COLOR
-----blue
black
green
yellow
orange
208
Joining Tables
Joining tables
©
2013 SAP AG. All rights reserved.
209
Joining Tables
With JOIN semantics you can distinguish between:
 CROSS JOIN
 INNER JOIN
 OUTER JOIN
–
LEFT OUTER JOIN
–
RIGHT OUTER JOIN
–
FULL OUTER JOIN
With JOIN syntax you can distinguish between:
 Implicit JOIN
 Explicit JOIN
©
2013 SAP AG. All rights reserved.
210
Joining Tables
CROSS JOIN
(Cartesian Product)
©
2013 SAP AG. All rights reserved.
211
CROSS JOIN


Each row of the left table is connected to each row of the right table.
There is no CROSS JOIN join condition.
L
©
…
…
…
…
…
…
X
1
2
3
4
5
2013 SAP AG. All rights reserved.
…
…
…
…
…
…
…
…
…
…
…
…
R
…
…
…
…
…
…
Y
3
4
5
6
7
…
…
…
…
…
…
…
…
…
…
…
…
212
CROSS JOIN
SELECT Column, Column, Column
FROM Table, Table
WHERE Condition;
SELECT Column, Column, Column
FROM Table CROSS JOIN Table
WHERE Condition;
©
2013 SAP AG. All rights reserved.
213
Implicit CROSS JOIN
Each row of a table is connected to each row of the other table.
 The result set contains 10 * 20 = 200 rows
SELECT *
FROM Owner, Car;
OWNERID
------H01
H02
H03
…
H01
H02
H03
…
H01
H02
H03
…
H10
©
2013 SAP AG. All rights reserved.
NAME
-----Ms T
Ms U
SAP AG
…
Ms T
Ms U
SAP AG
…
Ms T
Ms U
SAP AG
…
Mr Z
BIRTHDAY
---------1934-06-20
1966-05-11
?
…
1934-06-20
1966-05-11
?
…
1934-06-20
1966-05-11
?
…
1986-02-03
CITY
---------Wiesloch
Hockenheim
Walldorf
…
Wiesloch
Hockenheim
Walldorf
…
Wiesloch
Hockenheim
Walldorf
…
Ladenburg
CARID
----F01
F01
F01
…
F02
F02
F02
…
F03
F03
F03
…
F20
PLATENUMBER
----------HD-V 106
HD-V 106
HD-V 106
…
HD-VW 4711
HD-VW 4711
HD-VW 4711
…
HD-JA 1972
HD-JA 1972
HD-JA 1972
…
?
BRAND
----Fiat
Fiat
Fiat
…
VW
VW
VW
…
BMW
BMW
BMW
…
Audi
COLOR
----red
red
red
…
black
black
black
…
blue
blue
blue
…
green
HP
--75
75
75
…
120
120
120
…
184
184
184
…
184
OWNER
----H06
H06
H06
…
H03
H03
H03
…
H03
H03
H03
…
?
214
Explicit CROSS JOIN
Each row of a table is connected to each row of the other table.
 The result set contains 10 * 20 = 200 rows
SELECT *
FROM Owner CROSS JOIN Car;
OWNERID
------H01
H02
H03
…
H01
H02
H03
…
H01
H02
H03
…
H10
©
2013 SAP AG. All rights reserved.
NAME
-----Ms T
Ms U
SAP AG
…
Ms T
Ms U
SAP AG
…
Ms T
Ms U
SAP AG
…
Mr Z
BIRTHDAY
---------1934-06-20
1966-05-11
?
…
1934-06-20
1966-05-11
?
…
1934-06-20
1966-05-11
?
…
1986-02-03
CITY
---------Wiesloch
Hockenheim
Walldorf
…
Wiesloch
Hockenheim
Walldorf
…
Wiesloch
Hockenheim
Walldorf
…
Ladenburg
CARID
----F01
F01
F01
…
F02
F02
F02
…
F03
F03
F03
…
F20
PLATENUMBER
----------HD-V 106
HD-V 106
HD-V 106
…
HD-VW 4711
HD-VW 4711
HD-VW 4711
…
HD-JA 1972
HD-JA 1972
HD-JA 1972
…
?
BRAND
----Fiat
Fiat
Fiat
…
VW
VW
VW
…
BMW
BMW
BMW
…
Audi
COLOR
----red
red
red
…
black
black
black
…
blue
blue
blue
…
green
HP
--75
75
75
…
120
120
120
…
184
184
184
…
184
OWNER
----H06
H06
H06
…
H03
H03
H03
…
H03
H03
H03
…
?
215
CROSS JOIN
You can specify a WHERE clause for the implicit and explicit CROSS JOIN.
SELECT *
FROM Owner, Car
WHERE HP > 250;
OWNERID
------H01
H02
H03
H04
H05
H06
H07
H08
H09
H10
©
NAME
-----Ms T
Ms U
SAP AG
HDM AG
Mr V
Ms W
IKEA
Mr X
Ms Y
Mr Z
2013 SAP AG. All rights reserved.
BIRTHDAY
---------1934-06-20
1966-05-11
?
?
1952-04-21
1957-06-01
?
1986-08-30
1986-02-10
1986-02-03
SELECT *
FROM Owner CROSS JOIN Car
WHERE HP > 250;
CITY
---------Wiesloch
Hockenheim
Walldorf
Heidelberg
Leimen
Wiesloch
Walldorf
Walldorf
Sinsheim
Ladenburg
CARID
----F06
F06
F06
F06
F06
F06
F06
F06
F06
F06
PLATENUMBER
----------HD-VW 1999
HD-VW 1999
HD-VW 1999
HD-VW 1999
HD-VW 1999
HD-VW 1999
HD-VW 1999
HD-VW 1999
HD-VW 1999
HD-VW 1999
BRAND
----Audi
Audi
Audi
Audi
Audi
Audi
Audi
Audi
Audi
Audi
COLOR
-----yellow
yellow
yellow
yellow
yellow
yellow
yellow
yellow
yellow
yellow
HP
--260
260
260
260
260
260
260
260
260
260
OWNER
----H05
H05
H05
H05
H05
H05
H05
H05
H05
H05
216
CROSS JOIN
You can join a table to itself.

The result set contains 20 * 20 = 400 rows
SELECT *
FROM Owner, Car
WHERE HP > 250;
CARID
----F01
F01
F01
…
F02
F02
F02
…
F03
F03
F03
…
F20
©
PLATENUMBER
----------HD-V 106
HD-V 106
HD-V 106
…
HD-VW 4711
HD-VW 4711
HD-VW 4711
…
HD-JA 1972
HD-JA 1972
HD-JA 1972
…
?
2013 SAP AG. All rights reserved.
BRAND
----Fiat
Fiat
Fiat
…
VW
VW
VW
…
BMW
BMW
BMW
…
Audi
COLOR
----red
red
red
…
black
black
black
…
blue
blue
blue
…
green
SELECT *
FROM Owner CROSS JOIN Car
WHERE HP > 250;
HP
--75
75
75
…
120
120
120
…
184
184
184
…
184
OWNER
----H06
H06
H06
…
H03
H03
H03
…
H03
H03
H03
…
?
CARID
----F01
F02
F03
…
F01
F02
F03
…
F01
F02
F03
…
F20
PLATENUMBER
----------HD-V 106
HD-VW 4711
HD-JA 1972
…
HD-V 106
HD-VW 4711
HD-JA 1972
…
HD-V 106
HD-VW 4711
HD-JA 1972
…
?
BRAND
----Fiat
VW
BMW
…
Fiat
VW
BMW
…
Fiat
VW
BMW
…
Audi
COLOR
----red
black
blue
…
red
black
blue
…
red
black
blue
…
green
HP
--75
120
184
…
75
120
184
…
75
120
184
…
184
OWNER
----H06
H03
H03
…
H06
H03
H03
…
H06
H03
H03
…
?
217
CROSS JOIN
You can combine more than two tables.
 The result set contains 10 * 20 * 3 = 600 rows
SELECT *
FROM Owner CROSS JOIN
Car
CROSS JOIN
Stolen;
SELECT *
FROM Owner,
Car,
Stolen;
OWNERID
------H01
H01
H01
…
H01
H01
H01
…
H02
H02
H02
…
H10
©
NAME
---Ms T
Ms T
Ms T
…
Ms T
Ms T
Ms T
…
Ms U
Ms U
Ms U
…
Mr Z
BIRTHDAY
---------1934-06-20
1934-06-20
1934-06-20
…
1934-06-20
1934-06-20
1934-06-20
…
1966-05-11
1966-05-11
1966-05-11
…
1986-02-03
2013 SAP AG. All rights reserved.
CITY
---------Wiesloch
Wiesloch
Wiesloch
…
Wiesloch
Wiesloch
Wiesloch
…
Hockenheim
Hockenheim
Hockenheim
…
Ladenburg
CARID
----F01
F01
F01
…
F02
F02
F02
…
F01
F01
F01
…
F20
PLATENUMBER
----------HD-V 106
HD-V 106
HD-V 106
…
HD-VW 4711
HD-VW 4711
HD-VW 4711
…
HD-V 106
HD-V 106
HD-V 106
…
?
BRAND
----Fiat
Fiat
Fiat
…
VW
VW
VW
…
Fiat
Fiat
Fiat
…
Audi
COLOR
----red
red
red
…
black
black
black
…
red
red
red
…
green
HP
--75
75
75
…
120
120
120
…
75
75
75
…
184
OWNER
----H06
H06
H06
…
H03
H03
H03
…
H06
H06
H06
…
?
PLATENUMBER
----------HD-VW 1999
HD-V 106
HD-Y 333
…
HD-VW 1999
HD-V 106
HD-Y 333
…
HD-VW 1999
HD-V 106
HD-Y 333
…
HD-Y 333
REGISTERED_AT
------------2012-06-20
2012-06-01
2012-05-21
…
2012-06-20
2012-06-01
2012-05-21
…
2012-06-20
2012-06-01
2012-05-21
…
2012-05-21
218
Joining Tables
INNER JOIN
©
2013 SAP AG. All rights reserved.
219
INNER JOIN
One row of the left table and one row of the right table are always joined to a
common result row - provided that the JOIN condition is fulfilled.
JOIN Condition: L.X

L
©
…
…
…
…
…
…
X
1
2
3
4
5
2013 SAP AG. All rights reserved.
…
…
…
…
…
…
= R.Y
…
…
…
…
…
…
R
…
…
…
…
…
…
Y
3
4
5
6
7
…
…
…
…
…
…
…
…
…
…
…
…
220
INNER JOIN
SELECT Column, Column, Column
FROM Table, Table
WHERE JOIN_Condition AND Supplementary_Condition;
SELECT Column, Column, Column
FROM Table JOIN Table ON JOIN_Condition
WHERE Supplementary_Condition;
©
2013 SAP AG. All rights reserved.
221
Implicit INNER JOIN
One row of a table and one row of another table are always connected to a
common result row - provided that the JOIN condition is fulfilled.
 The JOIN condition is part of the WHERE clause
 To whom which car is registered?
SELECT *
FROM Owner, Car
WHERE OwnerID = Owner;
OWNERID
------H06
H03
H03
H07
H03
…
©
NAME
-----Ms W
SAP AG
SAP AG
IKEA
SAP AG
…
BIRTHDAY
---------1957-06-01
?
?
?
?
…
2013 SAP AG. All rights reserved.
CITY
-------Wiesloch
Walldorf
Walldorf
Walldorf
Walldorf
…
CARID
----F01
F02
F03
F04
F05
…
PLATENUMBER
----------HD-V 106
HD-VW 4711
HD-JA 1972
HD-AL 1002
HD-MM 3206
…
BRAND
-------Fiat
VW
BMW
Mercedes
Mercedes
…
COLOR
----red
black
blue
white
black
…
HP
--75
120
184
136
170
…
OWNER
----H06
H03
H03
H07
H03
…
222
Explicit INNER JOIN

One row of a table and one row of another table are always connected to a common result
row - provided that the JOIN condition is fulfilled.
 The JOIN condition is part of the JOIN operation (and not of the WHERE clause)
 To whom is which car registered?
SELECT *
FROM Owner INNER JOIN Car ON OwnerID = Owner;
OWNERID
------H06
H03
H03
H07
H03
…
©
NAME
-----Ms W
SAP AG
SAP AG
IKEA
SAP AG
…
BIRTHDAY
---------1957-06-01
?
?
?
?
…
2013 SAP AG. All rights reserved.
CITY
-------Wiesloch
Walldorf
Walldorf
Walldorf
Walldorf
…
CARID
----F01
F02
F03
F04
F05
…
PLATENUMBER
----------HD-V 106
HD-VW 4711
HD-JA 1972
HD-AL 1002
HD-MM 3206
…
BRAND
-------Fiat
VW
BMW
Mercedes
Mercedes
…
COLOR
----red
black
blue
white
black
…
HP
--75
120
184
136
170
…
OWNER
----H06
H03
H03
H07
H03
…
223
Explicit INNER JOIN


You can simply write "JOIN“ instead of "INNER JOIN“.
The INNER JOIN is the most important JOIN variant (and therefore the default)
 To whom is which car registered?
SELECT *
FROM Owner JOIN Car ON OwnerID = Owner;
OWNERID
------H06
H03
H03
H07
H03
…
©
NAME
-----Ms W
SAP AG
SAP AG
IKEA
SAP AG
…
BIRTHDAY
---------1957-06-01
?
?
?
?
…
2013 SAP AG. All rights reserved.
CITY
-------Wiesloch
Walldorf
Walldorf
Walldorf
Walldorf
…
CARID
----F01
F02
F03
F04
F05
…
PLATENUMBER
----------HD-V 106
HD-VW 4711
HD-JA 1972
HD-AL 1002
HD-MM 3206
…
BRAND
-------Fiat
VW
BMW
Mercedes
Mercedes
…
COLOR
----red
black
blue
white
black
…
HP
--75
120
184
136
170
…
OWNER
----H06
H03
H03
H07
H03
…
224
Implicit INNER JOIN
You can specify certain columns in the projection list also for the implicit JOIN.
 To whom is which car registered?
SELECT Name, Brand, Color
FROM Owner, Car
WHERE OwnerID = Owner;
©
2013 SAP AG. All rights reserved.
NAME
-----Ms W
SAP AG
SAP AG
IKEA
SAP AG
Mr V
SAP AG
IKEA
Ms U
HDM AG
Ms U
HDM AG
IKEA
SAP AG
SAP AG
Ms Y
SAP AG
Ms T
BRAND
-------Fiat
VW
BMW
Mercedes
Mercedes
Audi
Audi
VW
Skoda
BMW
BMW
Skoda
Renault
Mercedes
Skoda
Audi
Renault
VW
COLOR
-----red
black
blue
white
black
yellow
blue
black
red
black
green
red
red
white
black
orange
red
black
225
Explicit INNER JOIN
You can specify certain columns in the projection list also for the explicit JOIN.
 To whom is which car registered?
SELECT Name, Brand, Color
FROM Owner JOIN Car
ON OwnerID = Owner;
©
2013 SAP AG. All rights reserved.
NAME
-----Ms W
SAP AG
SAP AG
IKEA
SAP AG
Mr V
SAP AG
IKEA
Ms U
HDM AG
Ms U
HDM AG
IKEA
SAP AG
SAP AG
Ms Y
SAP AG
Ms T
BRAND
-------Fiat
VW
BMW
Mercedes
Mercedes
Audi
Audi
VW
Skoda
BMW
BMW
Skoda
Renault
Mercedes
Skoda
Audi
Renault
VW
COLOR
-----red
black
blue
white
black
yellow
blue
black
red
black
green
red
red
white
black
orange
red
black
226
Implicit INNER JOIN
You can also use table aliases or tuple variables in the projection list for the
implicit JOIN.


The JOIN condition can also refer to table aliases or tuple variables.
If column names are not unique, you must qualify them
NAME
with the table aliases or tuple variables.
-----Ms W
 To whom is which car registered?
SAP AG
SELECT o.Name, c.Brand, c.Color
FROM Owner o, Car c
WHERE o.OwnerID = c.Owner;
©
2013 SAP AG. All rights reserved.
SAP AG
IKEA
SAP AG
Mr V
SAP AG
IKEA
Ms U
HDM AG
Ms U
HDM AG
IKEA
SAP AG
SAP AG
Ms Y
SAP AG
Ms T
BRAND
-------Fiat
VW
BMW
Mercedes
Mercedes
Audi
Audi
VW
Skoda
BMW
BMW
Skoda
Renault
Mercedes
Skoda
Audi
Renault
VW
COLOR
-----red
black
blue
white
black
yellow
blue
black
red
black
green
red
red
white
black
orange
red
black
227
Explicit INNER JOIN
You can use table aliases or tuple variables in the projection list for the
explicit JOIN.


The JOIN condition can also refer to table aliases or tuple variables.
If column names are not unique, you must qualify them
NAME
with the table aliases or tuple variables.
-----Ms W
 To whom is which car registered?
SAP AG
SELECT o.Name, c.Brand, c.Color
FROM Owner o JOIN Car c
ON o.OwnerID = c.Owner;
©
2013 SAP AG. All rights reserved.
SAP AG
IKEA
SAP AG
Mr V
SAP AG
IKEA
Ms U
HDM AG
Ms U
HDM AG
IKEA
SAP AG
SAP AG
Ms Y
SAP AG
Ms T
BRAND
-------Fiat
VW
BMW
Mercedes
Mercedes
Audi
Audi
VW
Skoda
BMW
BMW
Skoda
Renault
Mercedes
Skoda
Audi
Renault
VW
COLOR
-----red
black
blue
white
black
yellow
blue
black
red
black
green
red
red
white
black
orange
red
black
228
Implicit INNER JOIN
You do not have to include a column from every involved table in the
projection list.

Besides the JOIN condition the WHERE clause can contain additional
conditions.
 To whom is a black car registered (at least one)?
SELECT DISTINCT o.Name
FROM Owner o, Car c
WHERE o.OwnerID = c.Owner
AND c.Color = 'black';
©
2013 SAP AG. All rights reserved.
NAME
-----Ms T
SAP AG
HDM AG
IKEA
229
Explicit INNER JOIN
You do not need to include a column from every involved table in the
projection list.
 In addition to the JOIN condition you can specify a WHERE clause.
 To whom is a black car registered (at least one)?
SELECT DISTINCT o.Name
FROM Owner o JOIN Car c
ON o.OwnerID = c.Owner
WHERE c.Color = 'black';
©
2013 SAP AG. All rights reserved.
NAME
-----Ms T
SAP AG
HDM AG
IKEA
230
Implicit INNER JOIN
You can explicitly rename result columns for the implicit JOIN.
 Sorting the result table is also possible
 To whom is a black car registered (at least one)?
SELECT DISTINCT o.Name AS "Owners' name"
FROM Owner o, Car c
WHERE o.OwnerID = c.Owner
AND c.Color = 'black'
ORDER BY o.Name;
Owners'
name
-----------HDM AG
IKEA
Ms T
SAP AG
©
2013 SAP AG. All rights reserved.
231
Explicit INNER JOIN
You can explicitly rename result columns for the explicit JOIN.
 Sorting the result table is also possible
 To whom is a black car registered (at least one)?
SELECT DISTINCT o.Name AS "Owners' name"
FROM Owner o JOIN Car c
ON o.OwnerID = c.Owner
WHERE c.Color = 'black'
ORDER BY o.Name;
Owners'
name
-----------HDM AG
IKEA
Ms T
SAP AG
©
2013 SAP AG. All rights reserved.
232
Implicit INNER JOIN
You can add a GROUP BY clause for the implicit Join.
 How many black cars are registered to which owner?
SELECT
FROM
WHERE
GROUP BY
ORDER BY
o.Name, COUNT(*) AS "# black cars"
Owner o, Car c
o.OwnerID = c.Owner AND c.Color = 'black'
o.OwnerID, o.Name
2 DESC, 1 ASC;
NAME
-----SAP AG
HDM AG
IKEA
Ms T
©
2013 SAP AG. All rights reserved.
# black cars
-----------3
1
1
1
233
Explicit INNER JOIN
You can add a GROUP BY clause for the explicit Join.
 How many black cars are registered to which owner?
SELECT o.Name, COUNT(*) AS "# black cars"
FROM Owner o JOIN Car c
ON o.OwnerID = c.Owner
WHERE c.Color = 'black'
GROUP BY o.OwnerID, o.Name
ORDER BY 2 DESC, 1 ASC;
NAME
# black
-----SAP AG
HDM AG
IKEA
Ms T
©
2013 SAP AG. All rights reserved.
cars
-----------3
1
1
1
234
Implicit INNER JOIN
You can build the JOIN condition on multiple columns for the implicit JOIN.
 To whom within the EU is a black car registered (at least one)?
SELECT DISTINCT o.Name AS "Owners' name"
FROM Owner_EU o, Car_EU c
WHERE o.Country = c.Country
AND o.OwnerID = c.Owner
AND c.Color = 'black'
Owners' name
ORDER BY o.Name;
-----------HDM AG
IKEA
Ms O
Ms T
SAP AG
Señora R
©
2013 SAP AG. All rights reserved.
235
Explicit INNER JOIN
You can build the JOIN condition on multiple columns for the explicit JOIN.
 To whom within the EU is a black car registered (at least one)?
SELECT DISTINCT o.Name AS "Owners' name"
FROM Owner_EU o JOIN Car_EU c
ON o.Country = c.Country
AND o.OwnerID = c.Owner
WHERE c.Color = 'black'
Owners' name
ORDER BY o.Name;
-----------HDM AG
IKEA
Ms O
Ms T
SAP AG
Señora R
©
2013 SAP AG. All rights reserved.
236
Implicit INNER JOIN
You can join a table to itself.
 Who is the manager of which employee?
SELECT e.Name AS Employee, m.Name AS Manager
FROM Official e, Official m
WHERE e.Manager = m.PNr;
EMPLOYEE
-------Mr A
Mr B
Ms C
Ms D
Mr E
Mr F
Ms G
Ms H
©
2013 SAP AG. All rights reserved.
MANAGER
------Ms D
Ms D
Ms D
Mr I
Ms H
Ms H
Ms H
Mr I
237
Explicit INNER JOIN
You can join a table to itself also for the explicit JOIN.
 Who is the manager of which employee?
SELECT e.Name AS Employee, m.Name AS Manager
FROM Official e JOIN Official m
ON e.Manager = m.PNr;
EMPLOYEE
-------Mr A
Mr B
Ms C
Ms D
Mr E
Mr F
Ms G
Ms H
©
2013 SAP AG. All rights reserved.
MANAGER
------Ms D
Ms D
Ms D
Mr I
Ms H
Ms H
Ms H
Mr I
238
Implicit INNER JOIN
You can combine more than two tables.
 To whom is which stolen car registered?
SELECT o.Name, c.Brand, c.Color, c.PlateNumber
FROM Owner o, Car c, Stolen s
WHERE o.OwnerID = c.Owner
AND c.PlateNumber = s.PlateNumber;
NAME
---Ms W
Mr V
Ms Y
©
2013 SAP AG. All rights reserved.
BRAND
----Fiat
Audi
Audi
COLOR
-----red
yellow
orange
PLATENUMBER
----------HD-V 106
HD-VW 1999
HD-Y 333
239
Explicit INNER JOIN
You can combine more than two tables also for the explicit JOIN.
 To whom is which stolen car registered?
SELECT o.Name, c.Brand, c.Color, c.PlateNumber
FROM Owner o
JOIN Car c ON o.OwnerID = c.Owner
JOIN Stolen s ON c.PlateNumber = s.PlateNumber;
NAME
---Ms W
Mr V
Ms Y
©
2013 SAP AG. All rights reserved.
BRAND
----Fiat
Audi
Audi
COLOR
-----red
yellow
orange
PLATENUMBER
----------HD-V 106
HD-VW 1999
HD-Y 333
240
Explicit INNER JOIN
You can use different comparison operators other than EQUAL
in the JOIN condition.
 Which owner is older than which other owner?
SELECT o.Name AS "older", y.Name AS "younger"
FROM Owner o JOIN Owner y
ON o.Birthday < y.Birthday;
©
2013 SAP AG. All rights reserved.
older
----Ms T
Ms T
Ms T
Ms T
Ms T
Ms T
Ms U
Ms U
Ms U
Mr V
Mr V
Mr V
Mr V
Mr V
Ms W
Ms W
Ms W
Ms W
Ms Y
Mr Z
Mr Z
younger
------Ms U
Mr V
Ms W
Mr X
Ms Y
Mr Z
Mr X
Ms Y
Mr Z
Ms U
Ms W
Mr X
Ms Y
Mr Z
Ms U
Mr X
Ms Y
Mr Z
Mr X
Mr X
Ms Y
241
Explicit INNER JOIN
You can use calculations in the JOIN condition.
 Which car has at least three times the power than which other car?
SELECT m.*, l.*
FROM Car m JOIN Car l ON m.HP >= l.HP * 3;
CARID
----F06
©
PLATENUMBER
----------HD-VW 1999
2013 SAP AG. All rights reserved.
BRAND
----Audi
COLOR
-----yellow
HP
--260
OWNER
----H05
CARID
----F01
PLATENUMBER
----------HD-V 106
BRAND
----Fiat
COLOR
----red
HP
-75
OWNER
----H06
242
Explicit INNER JOIN
You can use functions in the JOIN condition.
 Which owner was born in the same year as which other owner?
SELECT o1.Name, o1.Birthday, o2.Name, o2.Birthday
FROM Owner o1 JOIN Owner o2
ON YEAR(o1.Birthday) = YEAR(o2.Birthday)
AND o1.OwnerID < o2.OwnerID;
NAME
---Mr X
Mr X
Ms Y
©
2013 SAP AG. All rights reserved.
BIRTHDAY
---------1986-08-30
1986-08-30
1986-02-10
NAME
---Ms Y
Mr Z
Mr Z
BIRTHDAY
---------1986-02-10
1986-02-03
1986-02-03
243
Joining Tables
OUTER JOIN
©
2013 SAP AG. All rights reserved.
244
OUTER JOIN
The OUTER JOIN has three sub types:
 LEFT OUTER JOIN
 RIGHT OUTER JOIN
 FULL OUTER JOIN
 For all three sub types of the OUTER JOIN SAP HANA only provides the explicit syntax
variant.
©
2013 SAP AG. All rights reserved.
245
LEFT OUTER JOIN


One row of a table and one row of another table are always connected to a common result
row - provided the JOIN condition is fulfilled.
In addition, rows of the left table without matching row in the right table are copied to the
query result. The missing values ​(from the right table) are filled with NULL values.
L
©
…
…
…
…
…
…
X
1
2
3
4
5
2013 SAP AG. All rights reserved.
…
…
…
…
…
…
…
…
…
…
…
…
NULL NULL NULL NULL
R
…
…
…
…
…
…
Y
3
4
5
6
7
…
…
…
…
…
…
…
…
…
…
…
…
246
RIGHT OUTER JOIN


One row of a table and one row of another table are always connected to a common result
row - provided that the JOIN condition is fulfilled.
In addition, rows of the right table without matching row in the left table are copied to the
query result. The missing values ​(from the left table) are filled with NULL values.
L
…
…
…
…
…
…
X
1
2
3
4
5
…
…
…
…
…
…
…
…
…
…
…
…
NULL NULL NULL NULL
©
2013 SAP AG. All rights reserved.
R
…
…
…
…
…
…
Y
3
4
5
6
7
…
…
…
…
…
…
…
…
…
…
…
…
247
FULL OUTER JOIN


One row of a table and one row of another table are always connected to a common result
row - provided that the JOIN condition is fulfilled.
In addition, rows of both tables without matching records are copied to the query result. The
missing values ​(from the other table) are filled with NULL values.
L
…
…
…
…
…
…
X
1
2
3
4
5
…
…
…
…
…
…
…
…
…
…
…
…
NULL NULL NULL NULL
©
2013 SAP AG. All rights reserved.
NULL NULL NULL NULL
R
…
…
…
…
…
…
Y
3
4
5
6
7
…
…
…
…
…
…
…
…
…
…
…
…
248
OUTER JOIN
SELECT Column, Column, Column
FROM Table LEFT OUTER JOIN Table ON JOIN_Condition
WHERE Additional_Condition;
SELECT Column, Column, Column
FROM Table RIGHT OUTER JOIN Table ON JOIN_Condition
WHERE Additional_Condition;
SELECT Column, Column, Column
FROM Table FULL OUTER JOIN Table ON JOIN_Condition
WHERE Additional_Condition;
©
2013 SAP AG. All rights reserved.
249
LEFT OUTER JOIN
 Which car is registered to which individual or company?
 Individuals and companies that currently do not have a car
registered should be included.
 Cars without a registration should not be included in the result.
SELECT Name, CarID, Brand
FROM Owner LEFT OUTER JOIN Car
ON OwnerID = Owner;
©
2013 SAP AG. All rights reserved.
NAME
-----Ms T
Ms U
Ms U
SAP AG
SAP AG
SAP AG
SAP AG
SAP AG
SAP AG
SAP AG
HDM AG
HDM AG
Mr V
Ms W
IKEA
IKEA
IKEA
Mr X
Ms Y
Mr Z
CARID
----F19
F09
F11
F02
F03
F18
F05
F15
F07
F14
F12
F10
F06
F01
F13
F08
F04
?
F17
?
BRAND
-------VW
Skoda
BMW
VW
BMW
Renault
Mercedes
Skoda
Audi
Mercedes
Skoda
BMW
Audi
Fiat
Renault
VW
Mercedes
?
Audi
?
250
RIGHT OUTER JOIN
 Which car is registered to which individual or company?
 Cars without a registration should be included.
 Individuals and companies that currently do not have a car
registered should not be included in the result.
SELECT Name, CarID, Brand
FROM Owner RIGHT OUTER JOIN Car
ON OwnerID = Owner;
©
2013 SAP AG. All rights reserved.
NAME
-----Ms W
SAP AG
SAP AG
IKEA
SAP AG
Mr V
SAP AG
IKEA
Ms U
HDM AG
Ms U
HDM AG
IKEA
SAP AG
SAP AG
?
Ms Y
SAP AG
Ms T
?
CARID
----F01
F02
F03
F04
F05
F06
F07
F08
F09
F10
F11
F12
F13
F14
F15
F16
F17
F18
F19
F20
BRAND
-------Fiat
VW
BMW
Mercedes
Mercedes
Audi
Audi
VW
Skoda
BMW
BMW
Skoda
Renault
Mercedes
Skoda
Opel
Audi
Renault
VW
Audi
251
FULL OUTER JOIN
 Which car is registered to which individual or company?
 Individuals and companies that currently do not have a car
registered should be included.
 Cars without a registration should be included in the result .
SELECT Name, CarID, Brand
FROM Owner FULL OUTER JOIN Car
ON OwnerID = Owner;
©
2013 SAP AG. All rights reserved.
NAME
-----Ms W
SAP AG
SAP AG
IKEA
SAP AG
Mr V
SAP AG
IKEA
Ms U
HDM AG
Ms U
HDM AG
IKEA
SAP AG
SAP AG
?
Ms Y
SAP AG
Ms T
?
Mr X
Mr Z
CARID
----F01
F02
F03
F04
F05
F06
F07
F08
F09
F10
F11
F12
F13
F14
F15
F16
F17
F18
F19
F20
?
?
BRAND
-------Fiat
VW
BMW
Mercedes
Mercedes
Audi
Audi
VW
Skoda
BMW
BMW
Skoda
Renault
Mercedes
Skoda
Opel
Audi
Renault
VW
Audi
?
?
252
LEFT OUTER JOIN
For the LEFT OUTER JOIN you can also add a WHERE clause in
addition to the JOIN condition.
 Which car is registered to which individual?
 Assume that companies don’t have a birthday.
 Individuals that currently do not have a car registered should be
included.
 Cars without a registration should not be included in the result.
SELECT Name, CarID, Brand
FROM Owner LEFT OUTER JOIN Car
ON OwnerID = Owner
WHERE Birthday IS NOT NULL;
©
2013 SAP AG. All rights reserved.
NAME
-----Ms T
Ms U
Ms U
SAP AG
SAP AG
SAP AG
SAP AG
SAP AG
SAP AG
SAP AG
HDM AG
HDM AG
Mr V
Ms W
IKEA
IKEA
IKEA
Mr X
Ms Y
Mr Z
CARID
----F19
F09
F11
F02
F03
F18
F05
F15
F07
F14
F12
F10
F06
F01
F13
F08
F04
?
F17
?
BRAND
-------VW
Skoda
BMW
VW
BMW
Renault
Mercedes
Skoda
Audi
Mercedes
Skoda
BMW
Audi
Fiat
Renault
VW
Mercedes
?
Audi
?
253
RIGHT OUTER JOIN
For the RIGHT OUTER JOIN you can also add a WHERE clause
in addition to the JOIN condition.
 Which car is registered to which individual?
 Individuals who currently do not have a car registered should
be excluded. (Realized by RIGHT OUTER JOIN)
 Cars without a registration should not be included in the result.
(Realized by the WHERE clause)
SELECT Name, CarID, Brand
FROM Owner RIGHT OUTER JOIN Car
ON OwnerID = Owner
WHERE Birthday IS NOT NULL;
©
2013 SAP AG. All rights reserved.
NAME
-----Ms W
SAP AG
SAP AG
IKEA
SAP AG
Mr V
SAP AG
IKEA
Ms U
HDM AG
Ms U
HDM AG
IKEA
SAP AG
SAP AG
?
Ms Y
SAP AG
Ms T
?
CARID
----F01
F02
F03
F04
F05
F06
F07
F08
F09
F10
F11
F12
F13
F14
F15
F16
F17
F18
F19
F20
BRAND
-------Fiat
VW
BMW
Mercedes
Mercedes
Audi
Audi
VW
Skoda
BMW
BMW
Skoda
Renault
Mercedes
Skoda
Opel
Audi
Renault
VW
Audi
254
FULL OUTER JOIN
For the FULL OUTER JOIN you can also add a WHERE clause
in addition to the JOIN condition.
 Which car is registered to which individual?
 Individuals that currently do not have a car registered should
be included.
 Cars without a registration should not be included in the result.
(Realized by the WHERE clause)
SELECT Name, CarID, Brand
FROM Owner FULL OUTER JOIN Car
ON OwnerID = Owner
WHERE Birthday IS NOT NULL;
©
2013 SAP AG. All rights reserved.
NAME
-----Ms W
SAP AG
SAP AG
IKEA
SAP AG
Mr V
SAP AG
IKEA
Ms U
HDM AG
Ms U
HDM AG
IKEA
SAP AG
SAP AG
?
Ms Y
SAP AG
Ms T
?
Mr X
Mr Z
CARID
----F01
F02
F03
F04
F05
F06
F07
F08
F09
F10
F11
F12
F13
F14
F15
F16
F17
F18
F19
F20
?
?
BRAND
-------Fiat
VW
BMW
Mercedes
Mercedes
Audi
Audi
VW
Skoda
BMW
BMW
Skoda
Renault
Mercedes
Skoda
Opel
Audi
Renault
VW
Audi
?
?
255
LEFT OUTER JOIN
You can LEFT OUTER JOIN a table with itself
 Who is the manager of which employee?
 Employees without a manager should be included.
 Only Managers with employees should be included.
EMPLOYEE
-------Mr A
Mr B
Ms C
Ms D
Mr E
Mr F
Ms G
Ms H
Mr I
MANAGER
------Ms D
Ms D
Ms D
Mr I
Ms H
Ms H
Ms H
Mr I
?
SELECT e.Name AS Employee, m.Name AS Manager
FROM Official e LEFT OUTER JOIN Official m
ON e.Manager = m.PNr;
©
2013 SAP AG. All rights reserved.
256
RIGHT OUTER JOIN
You can RIGHT OUTER JOIN a table with itself
 Who is the manager of which employee?
 The MANAGER column should also include officials
that are not managing employees.
 The EMPLOYEE column should only include officials with a
manager assigned.
SELECT e.Name AS Employee,
m.Name AS Manager
FROM Official e
RIGHT OUTER JOIN Official m
ON e.Manager = m.PNr;
©
2013 SAP AG. All rights reserved.
EMPLOYEE
-------?
?
?
Mr A
Mr B
Ms C
?
?
?
Mr E
Mr F
Ms G
Ms D
Ms H
MANAGER
------Mr A
Mr B
Ms C
Ms D
Ms D
Ms D
Mr E
Mr F
Ms G
Ms H
Ms H
Ms H
Mr I
Mr I
257
FULL OUTER JOIN
You can FULL OUTER JOIN a table with itself
 Who is the manager of which employee?
 The EMPLOYEE column should include officials without a
manager.
 The MANAGER column should also include officials
that are not managing employees.
SELECT e.Name AS Employee,
m.Name AS Manager
FROM Official e
FULL OUTER JOIN Official m
ON e.Manager = m.PNr;
©
2013 SAP AG. All rights reserved.
EMPLOYEE
-------Mr A
Mr B
Ms C
Ms D
Mr E
Mr F
Ms G
Ms H
Mr I
?
?
?
?
?
?
MANAGER
------Ms D
Ms D
Ms D
Mr I
Ms H
Ms H
Ms H
Mr I
?
Mr A
Mr B
Ms C
Mr E
Mr F
Ms G
258
LEFT/RIGHT/FULL OUTER JOIN
You can also …
 Project to certain columns
 Reference table aliases or tuple
variables in the projection list.
 Use table aliases or tuple variables in
the JOIN condition.
 Explicitly rename result columns.
 Sort the query result.
 Add a GROUP BY clause.
 Use aggregate expressions.
 eliminate duplicates by using
DISTINCT.
 Specify a JOIN condition on multiple
columns.
 Use any comparison operator in the
JOIN condition.
 JOIN a table with itself.
 JOIN more than two tables.
©
2013 SAP AG. All rights reserved.
and:
 You have to qualify column names with the
table alias or with a tuple variable if the
column names are not unique.
 You do not need to include a column from
every table involved in the JOIN into the
projection list.
259
Unit 4: Reading Data From Multiple Tables Part I
Summary
You should now be able to:
•
Merge the result of several select statements using the
UNION statement
• Combine data from several tables when querying data
using JOIN constructs
•
•
©
List the various types of Joins
Explain the differences between the various types of Joins, and apply
the right type of Join depending on the problem
2013 SAP AG. All rights reserved.
260
Unit 5
Reading Data From Multiple Tables
Part II
261
Unit 5: Reading Data From Multiple Tables Part II
Learning Objectives
After completing this unit, you will be able to:
• Use sub-queries to query data from multiple tables in a single select
statement
• Explain the difference between uncorrelated and correlated subqueries
©
2013 SAP AG. All rights reserved.
262
Nested Queries
Nested Queries
©
2013 SAP AG. All rights reserved.
263
Nested Queries
 In addition to UNION and JOIN, Nested Queries also provide the option of reading from
multiple tables and views.
 Nested Queries contain a so called “Sub Query”.
©
2013 SAP AG. All rights reserved.
264
Sub Query
What is a sub query?
©
2013 SAP AG. All rights reserved.
265
Sub Query

A sub query is a query (SELECT-FROM-WHERE statement) that is used in
another query (SELECT-FROM-WHERE statement).
The "other Query" – containing the sub query - is called the "outer query".
In this context the Sub Query is also referred to as "inner query".


Outer
Query
©
2013 SAP AG. All rights reserved.
SELECT PlateNumber, Brand, Color
Sub Query
FROM Car
WHERE Owner IN ( SELECT OwnerID
FROM Owner
WHERE City = 'Wiesloch');
266
Sub Query
When is a sub query useful?
©
2013 SAP AG. All rights reserved.
267
Sub Query
A sub query is useful if ...
 It makes the SELECT statement more "readable" - for example, because the use of nested
queries is the "obvious way"
 The SELECT statement has a better performance – however, with a "perfect" optimizer, this
should not be the case.
 The formulation of the SELECT statement is not possible (or only extremely cumbersome)
without a sub query - which can be particularly the case for aggregate expressions.
©
2013 SAP AG. All rights reserved.
268
Sub Query
What is the difference between an
uncorrelated and a correlated
sub ​query?
©
2013 SAP AG. All rights reserved.
269
Sub Query
An uncorrelated sub ​query makes no reference to the outer query.
SELECT *
FROM Car
WHERE Owner IN (SELECT OwnerID
FROM Owner
WHERE City = 'Wiesloch');
A correlated sub ​query refers to the outer query.
SELECT *
FROM Car c
WHERE EXISTS (SELECT *
FROM Owner o
WHERE o.OwnerID = c.Owner
AND o.City = 'Wiesloch');
©
2013 SAP AG. All rights reserved.
270
Sub Query
Uncorrelated sub queries
©
2013 SAP AG. All rights reserved.
271
Uncorrelated Sub Query
SELECT Column, Column, Column
FROM Table
WHERE Column IN (SELECT Column
FROM Table
WHERE Condition);
©
2013 SAP AG. All rights reserved.
272
Uncorrelated Sub Query
You can use IN, if the outer value should be included in the result set of the sub query.
 Which cars are registered to an owner from Wiesloch?
SELECT *
FROM Car
WHERE Owner IN (SELECT OwnerID
FROM Owner
WHERE City = 'Wiesloch');
CARID
----F01
F19
©
2013 SAP AG. All rights reserved.
PLATENUMBER
----------HD-V 106
HD-VW 2012
BRAND
----Fiat
VW
COLOR
----red
black
HP
--75
125
OWNER
----H06
H01
273
Uncorrelated Sub Query
You can use =
ANY, if the outer value should match any result value of the sub query.
 Which cars are registered to an owner from Wiesloch?
SELECT *
FROM Car
WHERE Owner = ANY (SELECT OwnerID
FROM Owner
WHERE City = 'Wiesloch');
CARID
----F01
F19
©
2013 SAP AG. All rights reserved.
PLATENUMBER
----------HD-V 106
HD-VW 2012
BRAND
----Fiat
VW
COLOR
----red
black
HP
--75
125
OWNER
----H06
H01
274
Uncorrelated Sub Query
“= ANY” is equivalent to “IN”.
So, where is the value of “= ANY” ?
©
2013 SAP AG. All rights reserved.
275
Uncorrelated Sub Query
= ANY is equivalent to IN,
but you can use ANY with other comparison operators:
= ANY
The external value matches any value of the sub query.
< ANY
The external value is less than any value of the sub query.
<= ANY
> ANY
©
The external value is less or equal than any value of the sub query.
The external value is greater than any value of the sub query.
>= ANY
The external value is greater or equal than any value of the sub query.
<> ANY
The external value is different to any value of the sub query.
2013 SAP AG. All rights reserved.
276
Uncorrelated Sub Query
You can use > ANY, if the external value should be greater than any value of the
sub query.

Which officials have more than the minimum overtime hours?
SELECT Name, Overtime
FROM Official
WHERE Overtime > ANY (SELECT Overtime
FROM Official);
NAME
---Ms C
Mr F
Ms G
©
2013 SAP AG. All rights reserved.
OVERTIME
-------20
18
22
277
Uncorrelated Sub Query
You can use > instead of > ANY, if the sub query results in only a single value.

Which officials have more than the minimum overtime hours?
SELECT Name, Overtime
FROM Official
WHERE Overtime > (SELECT MIN(Overtime)
FROM Official);
NAME
---Ms C
Mr F
Ms G
©
2013 SAP AG. All rights reserved.
OVERTIME
-------20
18
22
278
Uncorrelated Sub Query
You can use < ALL, if the outer value should be less than all result values of the
sub query (other comparison operators are possible)
= ALL
The external value matches each result value of the sub query.
(This option is quite useful, as the sub query result can contain duplicates.)
< ALL
The external value is less than all values of the sub query.
<= ALL
> ALL
©
The external value is less or equal than all values of the sub query.
The external value is greater than all values of the sub query.
>= ALL
The external value is greater or equal than all values of the sub query.
<> ALL
The external value is different to all values of the sub query.
2013 SAP AG. All rights reserved.
279
Uncorrelated Sub Query
You can use <= ALL, if the outer value should be less or equal than all result
values of the sub query (other comparison operators are possible)
 Which officials have the fewest overtime hours?
SELECT Name, Overtime
FROM Official
WHERE Overtime <= ALL (SELECT Overtime
FROM Official
WHERE Overtime IS NOT NULL);
NAME
---Mr A
Mr B
Mr E
©
OVERTIME
-------10
10
10
2013 SAP AG. All rights reserved.
280
Uncorrelated Sub Query
You can use
<=
instead of
<= ALL, if the sub query results in only a single value.
 Which officials have the fewest overtime hours?
 For the example below = would be possible instead of <= as well.
SELECT Name, Overtime
FROM Official
WHERE Overtime <= (SELECT MIN(Overtime)
FROM Official);
NAME
---Mr A
Mr B
Mr E
©
OVERTIME
-------10
10
10
2013 SAP AG. All rights reserved.
281
Uncorrelated Sub Query
You can use functions in a sub query.
 Which owners were born in the same year as the youngest owner?
SELECT *
FROM Owner
WHERE YEAR(Birthday) = (SELECT MAX(YEAR(Birthday))
FROM Owner);
OWNERID
------H08
H09
H10
©
2013 SAP AG. All rights reserved.
NAME
---Mr X
Ms Y
Mr Z
BIRTHDAY
---------1986-08-30
1986-02-10
1986-02-03
CITY
--------Walldorf
Sinsheim
Ladenburg
282
Uncorrelated Sub Query
 To whom is (at least) one blue car registered?
SELECT Name
FROM Owner
WHERE OwnerID IN (SELECT Owner
FROM Car
WHERE Color = 'blue');
NAME
-----SAP AG
©
2013 SAP AG. All rights reserved.
283
Uncorrelated Sub Query
You can use multiple columns in the sub query.
 To whom within the EU is (at least) one blue car registered?
SELECT Name
FROM Owner_EU
WHERE (Country, OwnerID) IN (SELECT Country, Owner
FROM Car_EU
WHERE Color = 'blue');
NAME
------SAP AG
Señor Q
©
2013 SAP AG. All rights reserved.
284
Uncorrelated Sub Query
You can use the same table in both the FROM clause of the outer query and in the
FROM clause of the sub query.
 What is the name of Mr A’s manager?
SELECT Name
FROM Official
WHERE PNr IN (SELECT Manager
FROM Official
WHERE Name = 'Mr A');
NAME
---Ms D
©
2013 SAP AG. All rights reserved.
285
Uncorrelated Sub Query
The WHERE clause of a sub query can contain another sub query.
 Who are the owners of stolen cars?
SELECT Name
FROM Owner
WHERE OwnerID IN
( SELECT Owner
FROM Car
WHERE PlateNumber IN
( SELECT PlateNumber FROM Stolen )
);
NAME
---Mr V
Ms W
Ms Y
©
2013 SAP AG. All rights reserved.
286
Uncorrelated Sub Query
You can combine JOIN and Sub Query.
To whom is the most powerful car per brand registered?
SELECT DISTINCT Brand, Name
FROM Owner RIGHT OUTER JOIN Car
ON OwnerID = Owner
WHERE (Brand, HP) IN
( SELECT Brand, MAX(HP)
FROM Car
GROUP BY Brand )
ORDER BY Brand ASC, Name ASC;
©
2013 SAP AG. All rights reserved.
BRAND
-------Audi
BMW
BMW
Fiat
Mercedes
Opel
Renault
Skoda
VW
NAME
-----Mr V
Ms U
SAP AG
Ms W
SAP AG
?
IKEA
SAP AG
IKEA
287
Uncorrelated Sub Query


A sub query is usually part of the WHERE clause.
But you can also use a sub query in the FROM clause.
 Which blue cars have less than 120 HP?
SELECT *
FROM (SELECT
FROM
WHERE
WHERE Power <
PlateNumber, HP AS Power
Car
Color = 'blue')
120;
PLATENUMBER
----------HD-ML 3206
©
2013 SAP AG. All rights reserved.
POWER
----116
288
Uncorrelated Sub Query


A sub query is usually part of the WHERE clause.
But you can also use a sub query in the SELECT clause.
 What is the HP deviation of each car when compared to the most powerful yellow car?
SELECT CarID, Brand,
(SELECT MAX(HP)
FROM Car
WHERE Color = 'yellow') - HP AS Deviation
FROM Car
ORDER BY 3 DESC;
CARID
----F01
F18
F09
…
F06
©
2013 SAP AG. All rights reserved.
BRAND
------Fiat
Renault
Skoda
…
Audi
DEVIATION
--------185
170
155
…
0
289
Sub Query
Correlated sub queries
©
2013 SAP AG. All rights reserved.
290
Correlated Sub Query
SELECT Column, Column, Column
FROM Table Tuple-Variable
WHERE EXISTS (SELECT *
FROM Table
WHERE Condition);
©
2013 SAP AG. All rights reserved.
291
Correlated Sub Query


A correlated sub ​query refers to the outer query.
Using EXISTS you can check that the query result of the sub query is not empty.
 Which vehicles are registered to an owner from Wiesloch?
SELECT *
FROM Car c
WHERE EXISTS (SELECT *
FROM Owner o
WHERE o.City = 'Wiesloch' AND o.OwnerID = c.Owner);
CARID
----F01
F19
©
2013 SAP AG. All rights reserved.
PLATENUMBER
----------HD-V 106
HD-VW 2012
BRAND
----Fiat
VW
COLOR
----red
black
HP
--75
125
OWNER
----H06
H01
292
Correlated Sub Query
Even with a correlated sub query, you can omit tuple variables if the column names
are unique.
 What vehicles are registered to an owner from Wiesloch?
SELECT *
FROM Car
WHERE EXISTS (SELECT *
FROM Owner
WHERE City = 'Wiesloch' AND OwnerID = Owner);
CARID
----F01
F19
©
2013 SAP AG. All rights reserved.
PLATENUMBER
----------HD-V 106
HD-VW 2012
BRAND
----Fiat
VW
COLOR
----red
black
HP
--75
125
OWNER
----H06
H01
293
Correlated Sub Query
Using NOT EXISTS you can check if the result of the sub query is empty.
 Which cars are not reported as stolen?
SELECT CarID
FROM Car c
WHERE NOT EXISTS (SELECT *
FROM Stolen s
WHERE s.PlateNumber = c.PlateNumber);
©
2013 SAP AG. All rights reserved.
CARID
----F02
F03
F04
F05
F07
F08
F09
F10
F11
F12
F13
F14
F15
F16
F18
F19
F20
294
Correlated Sub Query
You can use the same table in both the FROM clause of the outer query and the
FROM clause of the correlated sub query.
 Which vehicle has the most HP?
SELECT *
FROM Car c1
WHERE NOT EXISTS (SELECT *
FROM Car c2
WHERE c2.HP > c1.HP);
CARID
----F06
©
2013 SAP AG. All rights reserved.
PLATENUMBER
----------HD-VW 1999
BRAND
----Audi
COLOR
-----yellow
HP
--260
OWNER
----H05
295
Correlated Sub Query
Even when using a correlated sub ​query,
you can for example use ">= ALL"
 How much horsepower has the most powerful car
of each brand?
SELECT DISTINCT Brand, HP
FROM Car c1
WHERE c1.HP >= ALL (SELECT c2.HP
FROM Car c2
WHERE c2.Brand = c1.Brand);
©
2013 SAP AG. All rights reserved.
BRAND
-------Fiat
BMW
Mercedes
Audi
VW
Renault
Skoda
Opel
HP
--75
184
170
260
160
136
136
120
296
Correlated Sub Query
The WHERE clause of a correlated sub query
can contain an additional correlated sub query.
 To whom (at least) one stolen car is registered?
SELECT o.Name
FROM Owner o
WHERE EXISTS
( SELECT
FROM
WHERE
AND
NAME
---Mr V
Ms W
Ms Y
*
Car c
c.Owner = o.OwnerID
EXISTS ( SELECT *
FROM Stolen s
WHERE s.PlateNumber = c.PlateNumber )
);
©
2013 SAP AG. All rights reserved.
297
Correlated Sub Query
You can also use a correlated sub query in the SELECT clause.
 How much horsepower each car is lacking
compared to the most powerful car of the same brand?
SELECT CarID, Brand, (SELECT MAX(HP)
FROM Car c2
WHERE c2.Brand = c1.Brand) - HP
AS Difference
FROM Car c1;
CARID BRAND
DIFFERENCE
----F01
F02
F03
F04
F05
F06
F07
…
F20
©
2013 SAP AG. All rights reserved.
-------Fiat
VW
BMW
Mercedes
Mercedes
Audi
Audi
…
Audi
---------0
40
0
34
0
0
144
…
76
298
Sub Query
Using Nested Queries you also can …








©
Restrict the projection list to certain columns
Explicitly rename the result columns
Sort the query result
Use grouping
Include aggregate expressions
Eliminate duplicates using DISTINCT
Involve the same table multiple times
Involve more than two tables
2013 SAP AG. All rights reserved.
299
Unit 5: Reading Data From Multiple Tables Part II
Summary
You should now be able to:
•
Merge the result of several select statements using the
UNION statement
• Combine data from several tables when querying data
using JOIN constructs
•
•
©
List the various types of Joins
Explain the differences between the various types of Joins, and apply
the right type of Join depending on the problem
2013 SAP AG. All rights reserved.
300
Unit 6
Understanding NULL values
301
Unit 6: Understanding NULL Values
Learning Objectives
After completing this unit, you will be able to:
• Explain how to interpret NULL values in databases
• Understand why the presences of NULL values can lead to
unexpected query results
• Analyze if two seemingly equivalent SQL statements return different
results because of NULL values
©
2013 SAP AG. All rights reserved.
302
NULL Values
What is a NULL value?
©
2013 SAP AG. All rights reserved.
303
NULL Values
A NULL value signals that the corresponding value is unknown or does not
exist.
 The NULL value is a special value reserved by the DBMS.
– For numeric data types the NULL value is not equal to 0.
– For string based data types the NULL value is not equal to an empty string or to the
space character.
A NULL value is used, …
– If the corresponding value exists in principle, but is (temporarily or permanently)
unknown (such as a birthday of a person)
– If the corresponding value does not exist (for example the owner of an unregistered
car).
©
2013 SAP AG. All rights reserved.
304
NULL Values
How are NULL values created?
©
2013 SAP AG. All rights reserved.
305
NULL Values
NULL values are “created” when reading rows (SELECT statement)
 If the source table already contains NULL values
 When using outer joins
NULL values are created in a table when inserting rows (INSERT statement) if
 No value for a column is provided, NULL values are allowed and no default
value is defined
 A NULL value is explicitly specified for a column and NULL values are allowed
NULL values are created in a table when changing rows (UPDATE statement) if
 A NULL value is explicitly specified for a column and NULL values are allowed
NULL values are created in a table when when adding a column (ALTER TABLE
statement), if
 The table has at least one row, NULL values are allowed for the added column
and no default value is defined for the added column.
©
2013 SAP AG. All rights reserved.
306
NULL Values
NULL values enforce a trivalent
logic
©
2013 SAP AG. All rights reserved.
307
NULL Values
 By allowing NULL values a third truth value is necessary.
 In addition to "true" and “false" there is also the truth value "unknown“ in SQL .
 Any comparison with a NULL value results in the truth value "unknown“.
– This applies to all comparison operators: =, >, >=, <, <=, <>
©
A
A=7
A <> 7
A >= 6
5
false
true
false
7
true
false
true
NULL
unknown
unknown
unknown
2013 SAP AG. All rights reserved.
308
Trivalent Logic: NOT
©
2013 SAP AG. All rights reserved.
X
NOT X
true
false
false
true
unknown
unknown
309
Trivalent Logic: AND
©
X
Y
X AND Y
true
true
true
true
false
false
true
unknown
unknown
false
true
false
false
false
false
false
unknown
false
unknown
true
unknown
unknown
false
false
unknown
unknown
unknown
2013 SAP AG. All rights reserved.
310
Trivalent Logic: OR
©
X
Y
X OR Y
true
true
true
true
false
true
true
unknown
true
false
true
true
false
false
false
false
unknown
unknown
unknown
true
true
unknown
false
unknown
unknown
unknown
unknown
2013 SAP AG. All rights reserved.
311
Trivalent Logic
The trivalent logic has only one
more truth value, so where is the
problem?
©
2013 SAP AG. All rights reserved.
312
Trivalent Logic
39 = 19,683 binary logical operators are conceivable
©
X
Y
X op Y
true
true
true / false / unknown
true
false
true / false / unknown
true
unknown
true / false / unknown
false
true
true / false / unknown
false
false
true / false / unknown
false
unknown
true / false / unknown
unknown
true
true / false / unknown
unknown
false
true / false / unknown
unknown
unknown
true / false / unknown
2013 SAP AG. All rights reserved.
313
NULLs & Trivalent Logic
Many "obviously true" statements are no longer necessarily true!!!
 A=A
 (A < 5) OR ( A >= 5)
 (A = ‘Walldorf’) OR (A <> ‘Walldorf’)
 A+1>A
 A * A >= 0
 0*A=0
 2*A=A+A
 MAXIMUM >= ALL ( set of all values)
 MINIMUM <= ALL ( set of all values)
 A OR (NOT A)
©
2013 SAP AG. All rights reserved.
314
NULL Values
 Do the following two SQL queries have the same result?
SELECT Name, Overtime
FROM Official
WHERE Overtime <= 10 OR Overtime > 10;
SELECT Name, Overtime
FROM Official;
©
2013 SAP AG. All rights reserved.
315
NULL Values
 The two SQL queries have different results!
 Only officials where Overtime IS NOT NULL applies:
SELECT Name, Overtime
FROM Official
WHERE Overtime <= 10 OR Overtime > 10;
 All officials (including those with: Overtime IS NULL )
SELECT Name, Overtime
FROM Official;
©
2013 SAP AG. All rights reserved.
NAME
---Mr A
Mr B
Ms C
Mr E
Mr F
Ms G
OVERTIME
-------10
10
20
10
18
22
NAME
---Mr A
Mr B
Ms C
Ms D
Mr E
Mr F
Ms G
Ms H
Mr I
OVERTIME
-------10
10
20
?
10
18
22
?
?
316
NULL Values
 Do the following two SQL queries have the same result?
SELECT *
FROM Official
WHERE PNr <> ALL (SELECT PNr
FROM Official
WHERE Overtime = Overtime);
SELECT *
FROM Official
WHERE Overtime IS NULL;
©
2013 SAP AG. All rights reserved.
317
NULL Values
 The two SQL queries have the same result!
SELECT *
FROM Official
WHERE PNr <> ALL (SELECT PNr
FROM Official
WHERE Overtime = Overtime);
SELECT *
FROM Official
WHERE Overtime IS NULL;
©
2013 SAP AG. All rights reserved.
PNR
--P04
P08
P09
NAME
---Ms D
Ms H
Mr I
OVERTIME
-------?
?
?
SALARY
-----A12
A13
A14
MANAGER
------P09
P09
?
318
NULL Values
 The sub query returns all personnel numbers of the officials, where
the number of overtime hours is known.
SELECT *
FROM Official
WHERE PNr <> ALL (SELECT PNr
FROM Official
WHERE Overtime = Overtime);
©
2013 SAP AG. All rights reserved.
PNR
--P01
P02
P03
P05
P06
P07
319
NULL Values
 The outer SELECT query returns all officials, whose PersNumber differs from all
PersNumbers of the sub query.
 So the outer SELECT query returns all officials, whose PersNumber differs from the
PersNumbers of those officials whose overtime is known.
 So the outer SELECT query returns all officials whose overtime is unknown.
SELECT *
FROM Official
WHERE PNr <> ALL (SELECT PNr
FROM Official
WHERE Overtime = Overtime);
PNR
--P04
P08
P09
©
2013 SAP AG. All rights reserved.
NAME
---Ms D
Ms H
Mr I
OVERTIME
-------?
?
?
SALARY
-----A12
A13
A14
MANAGER
------P09
P09
?
320
NULL Values
 Do the following two SQL queries have the same result?
SELECT Name, Overtime
FROM Official
WHERE Overtime >= ALL (SELECT Overtime
FROM Official);
SELECT Name, Overtime
FROM Official
WHERE Overtime = (SELECT MAX(Overtime)
FROM Official);
©
2013 SAP AG. All rights reserved.
321
NULL Values
 The two SQL queries have different results!
SELECT Name, Overtime
The
FROM Official
WHERE Overtime >= ALL (SELECT Overtime
FROM Official);
SELECT Name, Overtime
FROM Official
WHERE Overtime = (SELECT MAX(Overtime)
FROM Official);
©
2013 SAP AG. All rights reserved.
query result is empty.
NAME
---Ms G
OVERTIME
-------22
322
NULL Values
 The sub query also returns NULL values.
SELECT Name, Overtime
FROM Official
WHERE Overtime >= ALL (SELECT Overtime
FROM Official);
OVERTIME
-------10
10
20
?
10
18
22
?
?
 Hence there is no value which is greater or equal to all sub query values!
SELECT Name, Overtime
The
FROM Official
WHERE Overtime >= ALL (SELECT Overtime
FROM Official);
©
2013 SAP AG. All rights reserved.
query result is empty.
323
NULL Values
 Do the following two SQL queries have the same result?
SELECT Name, Overtime
FROM Official
WHERE Overtime >= ALL (SELECT Overtime
FROM Official
WHERE Overtime IS NOT NULL);
SELECT Name, Overtime
FROM Official
WHERE Overtime = (SELECT MAX(Overtime)
FROM Official);
©
2013 SAP AG. All rights reserved.
324
NULL Values
 For the existing data, both queries return the same result.
SELECT Name, Overtime
FROM Official
WHERE Overtime >= ALL (SELECT Overtime
FROM Official
WHERE Overtime IS NOT
NAME
---Ms G
SELECT Name, Overtime
FROM Official
WHERE Overtime = (SELECT MAX(Overtime)
FROM Official);
NAME
---Ms G
©
2013 SAP AG. All rights reserved.
OVERTIME
-------22
NULL);
OVERTIME
-------22
325
NULL Values
 But: If the overtime values were unknown for all officials ,
the two SQL queries would return different results!
NAME
---Mr A
Mr B
Ms C
Ms D
Mr E
Mr F
Ms G
Ms H
Mr I
SELECT Name, Overtime
FROM Official
WHERE Overtime >= ALL (SELECT Overtime
FROM Official
WHERE Overtime IS NOT NULL);
SELECT Name, Overtime
FROM Official
WHERE Overtime = (SELECT MAX(Overtime)
FROM Official);
©
2013 SAP AG. All rights reserved.
OVERTIME
-------?
?
?
?
?
?
?
?
?
The query result is empty.
326
NULL Values
 The result of the sub query is empty.
 Hence the WHERE clause of the outer query is fulfilled for all rows.
SELECT Name, Overtime
FROM Official
WHERE Overtime >= ALL (SELECT Overtime
FROM Official
WHERE Overtime IS NOT NULL);
NAME
---Mr A
Mr B
Ms C
Ms D
Mr E
Mr F
Ms G
Ms H
Mr I
OVERTIME
-------?
?
?
?
?
?
?
?
?
 The sub query returns a NULL value.
 So the WHERE clause of the outer query is not fulfilled for any row.
SELECT Name, Overtime
FROM Official
WHERE Overtime = (SELECT MAX(Overtime)
FROM Official);
©
2013 SAP AG. All rights reserved.
The query result is empty.
327
Unit 6: Understanding NULL Values
Summary
You should now be able to:
•
Explain how to interpret NULL values in databases
• Understand why the presences of NULL values can lead to
unexpected query results
• Analyze if two seemingly equivalent SQL statements return different
results because of NULL values
©
2013 SAP AG. All rights reserved.
328
Unit 7
Changing Data Stored In Tables
329
Unit 7: Changing Data Stored In Tables
Learning Objectives
After completing this unit, you will be able to:
• Add rows to database tables using SQL
• Change existing rows of a database table
• Remove existing rows from a database table
©
2013 SAP AG. All rights reserved.
330
Changing Database Access
Which SQL statements can be
used to insert, change or delete
data?
©
2013 SAP AG. All rights reserved.
331
Changing Database Access
INSERT statement
 New rows are inserted into a table
UPDATE statement
 Existing table rows are changed
DELETE statement
 Existing table rows are deleted
©
2013 SAP AG. All rights reserved.
332
Changing Database Access
INSERT statement
©
2013 SAP AG. All rights reserved.
333
INSERT
INSERT INTO Table VALUES (Value, Value, Value);
INSERT INTO Table(Column, Column) VALUES (Value, Value);
INSERT INTO Table SELECT … FROM … WHERE …;
©
2013 SAP AG. All rights reserved.
334
INSERT
Using INSERT you can specify a value for each column.

If the sequence of the values corresponds to the sequence of columns, you do not need to
list the column names.
 The order of the columns above mentioned is set implicitly when you create the table.
 Insert a new row into the Official table:
INSERT INTO Official
VALUES ('P10', 'Ms J', 20, 'A10',
PNR
--…
P10
©
NAME
---…
Ms J
OVERTIME
-------…
20
2013 SAP AG. All rights reserved.
SALARY
-----…
A10
'P04');
MANAGER
------…
P04
335
INSERT
Using INSERT you can specify a value for each column.

If the sequence of the values does not match the sequence of the corresponding columns,
you must list the column names in the correct sequence of the values.
 Insert a new row into the Official table:
INSERT INTO Official( Salary, Overtime, Name, PNr, Manager)
VALUES ('A12', 50, 'Mr K', 'P11', 'P09');
PNR
--…
P11
©
NAME
---…
Mr K
OVERTIME
-------…
50
2013 SAP AG. All rights reserved.
SALARY
-----…
A12
MANAGER
------…
P09
336
INSERT
You do not have to specify a value for each column of the INSERT.


You must list the column names in the correct sequence for each column, where you
specify a value.
Missing values will be replaced by NULL or the default value of the column
 Insert a new row into the Official table:
INSERT INTO Official(PNr, Name) VALUES ('P12', 'Ms L');
PNR
--…
P12
©
NAME
---…
Ms L
OVERTIME
-------…
?
2013 SAP AG. All rights reserved.
SALARY
-----…
A06
MANAGER
------…
?
337
INSERT
You can explicitly specify NULL values (for certain columns) for the INSERT.
 Insert a new row into the Official table:
INSERT INTO Official VALUES ('P13', 'Mr M', NULL, NULL, NULL);
PNR
--…
P13
©
NAME
---…
Mr M
OVERTIME
-------…
?
2013 SAP AG. All rights reserved.
SALARY
-----…
?
MANAGER
------…
?
338
INSERT
You can INSERT data read from another table.
 INSERT all owner IDs and names from city Wiesloch into the Official table:
INSERT INTO Official(PNr, Name)
SELECT OwnerID, Name
FROM Owner
WHERE City = 'Wiesloch';
PNR
--…
H01
H06
©
NAME
---…
Ms T
Ms W
OVERTIME
-------…
?
?
2013 SAP AG. All rights reserved.
SALARY
-----…
A06
A06
MANAGER
------…
?
?
339
Changing Database Access
The UPDATE statement
©
2013 SAP AG. All rights reserved.
340
UPDATE
UPDATE Table
SET Column = Value,
Column = Value,
Column = Value
WHERE Condition;
©
2013 SAP AG. All rights reserved.
341
UPDATE
You can use the UPDATE statement to change all rows in a table.
 The overtime value of all officials should be increased by 10:
UPDATE Official
SET Overtime = Overtime + 10;
PNR
--P01
P02
P03
P04
P05
…
©
2013 SAP AG. All rights reserved.
NAME
---Mr A
Mr B
Ms C
Ms D
Mr E
…
OVERTIME
-------20
20
30
?
20
…
SALARY
-----A09
A10
A09
A12
A08
…
MANAGER
------P04
P04
P04
P09
P08
…
342
UPDATE
You can use the UPDATE statement to change only certain rows in a table
by adding a WHERE clause.
 The overtime value of officials in salary group “A09” should be doubled:
UPDATE Official
SET Overtime = Overtime * 2
WHERE Salary = 'A09';
PNR
--P01
P02
P03
P04
…
©
2013 SAP AG. All rights reserved.
NAME
---Mr A
Mr B
Ms C
Ms D
…
OVERTIME
-------20
10
40
?
…
SALARY
-----A09
A10
A09
A12
…
MANAGER
------P04
P04
P04
P09
…
343
UPDATE
You can use the UPDATE statement to change values of multiple columns.
 The overtime value of officials in salary group “A09” should be tripled.
In addition their salary group should be changed to “A10”.
UPDATE Official
SET Overtime = Overtime * 3,
Salary = 'A10'
WHERE Salary = 'A09';
PNR
--P01
P02
P03
…
©
2013 SAP AG. All rights reserved.
NAME
---Mr A
Mr B
Ms C
…
OVERTIME
-------30
10
60
…
SALARY
-----A10
A10
A10
…
MANAGER
------P04
P04
P04
…
344
UPDATE
You can use an uncorrelated sub query on the WHERE clause of the UPDATE
statement.
 Officials who are contacts for the car owners are moved to salary group “A15”.
UPDATE Official
SET Salary = 'A15'
WHERE PNr IN (SELECT PersNumber
FROM Contact);
PNR
--…
P07
P08
P09
©
2013 SAP AG. All rights reserved.
NAME
---…
Ms G
Ms H
Mr I
OVERTIME
-------…
22
?
?
SALARY
-----…
A11
A15
A15
MANAGER
------…
P08
P09
?
345
UPDATE
You can use a correlated sub query on the WHERE clause of the UPDATE
statement.
 Officials who are contacts for the car owners are moved to salary group “A15”.
UPDATE Official o
SET Salary = 'A15'
WHERE EXISTS (SELECT *
FROM Contact c
WHERE c.PersNumber = o.PNr);
PNR
--…
P07
P08
P09
©
2013 SAP AG. All rights reserved.
NAME
---…
Ms G
Ms H
Mr I
OVERTIME
-------…
22
?
?
SALARY
-----…
A11
A15
A15
MANAGER
------…
P08
P09
?
346
UPDATE



Usually a sub query is part of the WHERE clause.
You can also use a (correlated or uncorrelated) sub query in the SET clause.
For the following SQL statement we assume, that the table Car has an additional column
Ownername.
UPDATE Car c
SET Ownername = (SELECT o.Name
FROM Owner o
WHERE o.OwnerID = c.Owner);
CARID
----F01
F02
F03
…
©
2013 SAP AG. All rights reserved.
PLATENUMBER
----------HD-V 106
HD-VW 4711
HD-JA 1972
…
BRAND
----Fiat
VW
BMW
…
COLOR
----red
black
blue
…
HP
--75
120
184
…
OWNER
----H06
H03
H03
…
OWNERNAME
--------Ms W
SAP AG
SAP AG
…
347
Changing Database Access
The DELETE statement
©
2013 SAP AG. All rights reserved.
348
DELETE
DELETE
FROM Table
WHERE Condition;
©
2013 SAP AG. All rights reserved.
349
DELETE
You can DELETE all rows in a table:
 Delete all entries from table Car:
DELETE
FROM Car;
CARID
PLATENUMBER
BRAND
COLOR
HP
OWNER
-----
-----------
-----
-----
--
-----
©
2013 SAP AG. All rights reserved.
350
DELETE
You can DELETE selected rows from a table:
 Delete all cars with horsepower less than 180 :
DELETE
FROM Car
WHERE HP < 180;
CARID
----F03
F06
F11
F17
F20
©
PLATENUMBER
----------HD-JA 1972
HD-VW 1999
HD-MM 208
HD-Y 333
?
2013 SAP AG. All rights reserved.
BRAND
----BMW
Audi
BMW
Audi
Audi
COLOR
-----blue
yellow
green
orange
green
HP
--184
260
184
184
84
OWNER
----H03
H05
H02
H09
?
351
DELETE
You can use an uncorrelated sub query
in the DELETE statement.
 Delete all cars that are reported as stolen.
DELETE
FROM Car
WHERE PlateNumber IN (SELECT PlateNumber
FROM Stolen);
©
2013 SAP AG. All rights reserved.
CARID
----F02
F03
F04
F05
F07
F08
F09
F10
F11
F12
F13
F14
F15
F16
F18
F19
F20
PLATENUMBER
----------HD-VW 4711
HD-JA 1972
HD-AL 1002
HD-MM 3206
HD-ML 3206
HD-IK 1002
HD-UP 13
HD-MT 507
HD-MM 208
HD-XY 4711
HD-IK 1001
HD-MM 1977
HD-MB 3030
?
HD-MQ 2006
HD-VW 2012
?
352
DELETE
CARID
----F02
 Delete all cars that are reported as stolen.
F03
F04
F05
DELETE
F07
FROM Car c
F08
WHERE EXISTS (SELECT *
F09
FROM Stolen s
F10
WHERE s.PlateNumber = c.PlateNumber); F11
F12
F13
F14
F15
F16
F18
F19
F20
You can use a correlated sub query in the DELETE statement.
©
2013 SAP AG. All rights reserved.
PLATENUMBER
----------HD-VW 4711
HD-JA 1972
HD-AL 1002
HD-MM 3206
HD-ML 3206
HD-IK 1002
HD-UP 13
HD-MT 507
HD-MM 208
HD-XY 4711
HD-IK 1001
HD-MM 1977
HD-MB 3030
?
HD-MQ 2006
HD-VW 2012
?
353
Unit 7: Changing Data Stored In Tables
Summary
You should now be able to:
• Add rows to database tables using SQL
• Change existing rows of a database table
• Remove existing rows from a database table
©
2013 SAP AG. All rights reserved.
354
Unit 8
Defining How Data Is Stored
355
Unit 8: Defining How Data Is Stored
Learning Objectives
After completing this unit, you will be able to:
• List the most important data types SAP HANA supports
• Create new database tables in HANA
• Change such tables, e.g. by adding, removing or renaming columns
©
2013 SAP AG. All rights reserved.
356
Data Definition
Which data types are available
in SAP HANA?
©
2013 SAP AG. All rights reserved.
357
Data Types
SAP HANA provides the following Data Types …
 Numeric types
– TINYINT, SMALLINT, INTEGER, BIGINT, SMALLDECIMAL, DECIMAL, REAL, DOUBLE
 Character string types
– VARCHAR, NVARCHAR, ALPHANUM, SHORTTEXT
 Date time types
– DATE, TIME, SECONDDATE, TIMESTAMP
 Binary types
– VARBINARY
 Large object types
– BLOB, CLOB, NCLOB, TEXT
©
2013 SAP AG. All rights reserved.
358
Data Types
SAP HANA data types for integer values:
TINYINT
©
0 to 255
SMALLINT
-32,768 to 32,767
INTEGER
-2,147,483,648 to 2,147,483,647
BIGINT
-9,223,372,036,854,775,808 to
9,223,372,036,854,775,807
2013 SAP AG. All rights reserved.
359
Data Types
SAP HANA data types for fixed-point values:
DECIMAL(p,s) The DECIMAL(p, s) data type specifies a fixed-point
decimal number with precision p and scale s.
The precision is the total number of significant digits.
The scale is the number of digits from the decimal point to
the least significant digit.
Precision: p (1 ≤ p ≤ 34)
Scale: s decimals (-6,111 ≤ s ≤ 6,176)

0.0000259

259
2590000

1.0000259

123.4567
©
2013 SAP AG. All rights reserved.
→
→
→
→
→
DECIMAL(3,7)
DECIMAL(3,0)
DECIMAL(3,-4)
DECIMAL(8,7)
DECIMAL(7,4)
360
Data Types
SAP HANA data types for floating-point values:
©
SMALLDECIMAL
Floating-point decimal number
Precision: variable (1 to 16)
Scale: variable (-369 to 368)
DECIMAL
Floating-point decimal number
Precision: variable (1 to 34)
Scale: variable (-6,111 to 6,176 )
REAL
Floating-point binary number (32 Bit)
DOUBLE
Floating-point binary number (64 Bit)
2013 SAP AG. All rights reserved.
361
Data Types
When using numeric data types please note that ...

DECIMAL(3,7) is suitable for storing fixed-point decimals numbers with a precision of 3
and a scale of 7, while DECIMAL is used to store floating point decimal numbers with
variable precision and variable scale.

Certain decimal values ​(for example, 0.2 and 0.4) using binary-based floating-point numbers
(REAL or DOUBLE) cannot be represented in an exact way.

Therefore columns of type REAL or DOUBLE should not be used in WHERE or JOIN
conditions.
•
•
•
©
0.4 is stored in a REAL column as 0.4000000059604645
10*(0.04/0.2) results in REAL value 1.9999998807907104 (instead of 2)
10*(0.04/0.2) results in DOUBLE value 1.9999999999999998 (instead of 2)
2013 SAP AG. All rights reserved.
362
Data Types
SAP HANA data types for character strings:
VARCHAR(n)
©
ASCII character string with maximum length n (n ≤ 5,000)
NVARCHAR(n)
Unicode character string with maximum length n (n ≤ 5,000)
ALPHANUM(n)
Alphanumeric character string with maximum length n (n ≤ 127)
SHORTTEXT(n)
Unicode character string with maximum length n (n ≤ 5,000)
Special data type supporting text- and string-search features (e. g.
Fuzzy Search) based on NVARCHAR(n)
2013 SAP AG. All rights reserved.
363
Data Types
SAP HANA data types for date and time:
©
DATE
Consists of year, month, day
'2012-05-21'
TIME
Consists of hour, minute, second
'18:00:57'
SECONDDATE
Combination of data and time
'2012-05-21 18:00:57'
TIMESTAMP
Precision: ten millionth of a second
'2012-05-21 18:00:57.1234567'
2013 SAP AG. All rights reserved.
364
Data Types
SAP HANA data types for binary data:
VARBINARY(n)
Binary data, maximum length n Bytes (n ≤ 5,000)
CREATE COLUMN TABLE MyTable ("VARBINARY-Column" VARBINARY(8));
INSERT INTO MyTable VALUES (TO_BINARY('Walldorf'));
INSERT INTO MyTable VALUES (TO_BINARY('SAP'));
INSERT INTO MyTable VALUES (x'00075341500700FF');
SELECT * FROM MyTable;
©
2013 SAP AG. All rights reserved.
VARBINARY-Column
---------------57616C6C646F7266
534150
00075341500700FF
365
Data Types
SAP HANA data types for large objects:
©
CLOB
Long ASCII character string (maximum 2 GB)
NCLOB
Long Unicode character string (maximum 2 GB)
BLOB
Large binary data (maximum 2 GB)
TEXT
Long Unicode character string (maximum 2 GB)
Special data type supporting text- and string-search features (e. g.
Fuzzy Search) based on NCLOB
2013 SAP AG. All rights reserved.
366
Data Types
 The term LOB data type (LOB = large object) is used as a generic term for data types such
as CLOB (character large object) or BLOB (binary large object).
 When using LOB data types it is important to note that ...
•
•
•
•
•
•
•
•
©
LOB columns can not be part of the primary key
LOB columns can not be used in the ORDER BY clause
LOB columns can not be used in the GROUP BY clause
LOB columns may not be part of the JOIN condition (explicit JOIN)
LOB columns can not be used as an argument for an aggregate function
LOB columns can not be used in the SELECT DISTINCT clause
LOB columns can not occur in an UNION statement
LOB columns can not be part of a database index
2013 SAP AG. All rights reserved.
367
Data Definition
Which SQL statements can be
used to create, change, rename
and delete tables?
©
2013 SAP AG. All rights reserved.
368
Data Definition
CREATE COLUMN TABLE
 A new (empty) table is created.
ALTER TABLE
 The definition of an existing table is changed .
RENAME TABLE
 An existing table is renamed.
DROP TABLE
 An existing table is deleted.
©
2013 SAP AG. All rights reserved.
369
Data Definition
CREATE COLUMN TABLE
©
2013 SAP AG. All rights reserved.
370
CREATE COLUMN TABLE
CREATE COLUMN TABLE Table
(Column Data_Type,
Column Data_Type,
Column Data_Type NOT NULL,
Column Data_Type NOT NULL,
Column Data_Type DEFAULT Default_Value,
Column Data_Type NOT NULL DEFAULT Default_Value,
PRIMARY KEY(Column, Column));
©
2013 SAP AG. All rights reserved.
371
CREATE COLUMN TABLE


It is not mandatory to define a primary key.
If you do not define a key, the table con contain duplicates.
CREATE COLUMN TABLE Official
(PNr
VARCHAR(3),
Name
VARCHAR(20),
Overtime
INTEGER,
Salary
VARCHAR(3),
Manager
VARCHAR(3));
©
2013 SAP AG. All rights reserved.
372
CREATE COLUMN TABLE

Table names and column names usually do not distinguish between uppercase and
lowercase letters.
 If you want to distinguish between uppercase and lowercase letters, you must use double
quotes.
 We recommend not to use the option of lowercase letters.
CREATE COLUMN
("PNr"
"Name"
"Overtime"
"Salary"
"Manager"
©
2013 SAP AG. All rights reserved.
TABLE "Official"
VARCHAR(3),
VARCHAR(20),
INTEGER,
VARCHAR(3),
VARCHAR(3));
373
CREATE COLUMN TABLE
 Normally, table and column names may not contain spaces.
 If table or column names should contain spaces, you must use double quotes.
 We recommend not to use the option of spaces in table or column names.
CREATE COLUMN TABLE "Our Officials"
("Official PersNumber" VARCHAR(3),
"Official Name"
VARCHAR(20),
"Overtime Hours"
INTEGER,
"Salary Group"
VARCHAR(3),
"Manager PersNumber"
VARCHAR(3));
©
2013 SAP AG. All rights reserved.
374
CREATE COLUMN TABLE

If double quotes are used, table and column names may be different, but only by the use
of upper and lower case.
 We do not recommend using this option.
CREATE COLUMN TABLE "Don’t do it"
("sap" INTEGER,
"saP" INTEGER,
"sAp" INTEGER,
"sAP" INTEGER,
"Sap" INTEGER,
"SaP" INTEGER,
"SAp" INTEGER,
"SAP" INTEGER);
©
2013 SAP AG. All rights reserved.
375
CREATE COLUMN TABLE
 If double quotes are used, table and column names can solely consist of spaces.
 We do not recommend using this option.
CREATE COLUMN TABLE " "
(" "
INTEGER,
" "
INTEGER,
"
"
INTEGER,
"
"
INTEGER);
SELECT " ", "
FROM " "
WHERE " " = "
©
2013 SAP AG. All rights reserved.
", "
"
";
376
CREATE COLUMN TABLE
Condition
"1" = "2"
The value of the column named "1" must match the value of the column
named "2"
(based on the same row).
"2" = '3'
The value of the column named "2" must match the character string '3'
(based on a certain row).
"3" = 4
©
Explanation
2013 SAP AG. All rights reserved.
The numeric value of column named "3" must be equal to 4
(based on a certain row).
377
CREATE COLUMN TABLE



You can define a primary key.
If a primary key is defined, the table does not contain duplicates.
You can use the primary key definition as part of the column definition,
if the primary key consists of only one column.
CREATE COLUMN TABLE Official
(PNr
VARCHAR(3) PRIMARY KEY,
Name
VARCHAR(20),
Overtime
INTEGER,
Salary
VARCHAR(3),
Manager
VARCHAR(3));
©
2013 SAP AG. All rights reserved.
378
CREATE COLUMN TABLE


You can use a separate PRIMARY KEY clause.
You can define a maximum of one primary key per table.
CREATE COLUMN TABLE Official
(PNr
VARCHAR(3),
Name
VARCHAR(20),
Overtime
INTEGER,
Salary
VARCHAR(3),
Manager
VARCHAR(3),
PRIMARY KEY(PNr));
©
2013 SAP AG. All rights reserved.
379
CREATE COLUMN TABLE


You must use a separate PRIMARY KEY clause
to define a multi-column primary key.
For all columns of the PRIMARY KEY NULL values are (implicitly) prohibited.
CREATE COLUMN TABLE Owner_EU
(Country
VARCHAR(3),
OwnerID
VARCHAR(3),
Name
VARCHAR(20),
Birthday
DATE,
City
VARCHAR(20),
PRIMARY KEY(Country, OwnerID));
©
2013 SAP AG. All rights reserved.
380
CREATE COLUMN TABLE

When defining a column you can specify that no NULL values are allowed ​by adding the
words NOT NULL

For primary key columns, NULL values are ​implicitly prohibited.
For these columns, adding NOT NULL is permitted but not required.
CREATE COLUMN TABLE Official
(PNr
VARCHAR(3),
Name
VARCHAR(20) NOT NULL,
Overtime INTEGER,
Salary
VARCHAR(3) NOT NULL,
Manager VARCHAR(3),
PRIMARY KEY(PNr));
©
2013 SAP AG. All rights reserved.
381
CREATE COLUMN TABLE

You can define a default value for a column by adding DEFAULT <value>.

The default value is used during INSERT, if no value is specified for the corresponding
column.
The default value will not be used during INSERT, if a NULL value is explicitly specified.

CREATE COLUMN TABLE Official
(PNr
VARCHAR(3),
Name
VARCHAR(20),
Overtime INTEGER DEFAULT 0,
Salary
VARCHAR(3) DEFAULT 'A06',
Manager VARCHAR(3),
PRIMARY KEY(PNr));
©
2013 SAP AG. All rights reserved.
382
CREATE COLUMN TABLE


NULL values ​are not excluded when setting a default value.
Hence the words NOT NULL can also be useful for columns that do have a default
value set.
The order of the key words "DEFAULT" and "NOT NULL" is irrelevant.
CREATE COLUMN TABLE Official
(PNr
VARCHAR(3),
Name
VARCHAR(20),
Overtime INTEGER NOT NULL DEFAULT 0,
Salary
VARCHAR(3) DEFAULT 'A06' NOT NULL,
Manager VARCHAR(3),
PRIMARY KEY(PNr));
©
2013 SAP AG. All rights reserved.
383
CREATE COLUMN TABLE

When defining a column, you can specify that this column must not contain double values
by adding UNIQUE .

In contrast to the PRIMARY
KEY, UNIQUE allows NULL values.
CREATE COLUMN TABLE Car
(CarID
VARCHAR(3) PRIMARY KEY,
PlateNumber
VARCHAR(10) UNIQUE,
Brand
VARCHAR(20),
Color
VARCHAR(10),
HP
INTEGER,
Owner
VARCHAR(3));
©
2013 SAP AG. All rights reserved.
384
CREATE COLUMN TABLE

NULL values ​are not excluded when setting UNIQUE .
Hence the words

NOT NULL can also be useful for columns defined as UNIQUE .
The order of the key word “UNIQUE" and "NOT NULL" is irrelevant
CREATE COLUMN TABLE Car
(CarID
VARCHAR(3) PRIMARY KEY,
PlateNumber
VARCHAR(10) UNIQUE NOT NULL,
Brand
VARCHAR(20),
Color
VARCHAR(10),
HP
INTEGER,
Owner
VARCHAR(3));
©
2013 SAP AG. All rights reserved.
385
CREATE COLUMN TABLE


It is possible to prohibit duplicate values for more than one column.
Therefore you can define several keys for one and the same table.
 Using
UNIQUE
two single-column keys are defined:
CREATE COLUMN TABLE Car
(CarID
VARCHAR(3) PRIMARY KEY,
PlateNumber
VARCHAR(10),
Brand
VARCHAR(20) UNIQUE,
Color
VARCHAR(10) UNIQUE,
HP
INTEGER,
Owner
VARCHAR(3));
©
2013 SAP AG. All rights reserved.
386
CREATE COLUMN TABLE
You can use a separate
 Using
UNIQUE
UNIQUE
clause for the key definition.
two single-column keys are defined:
CREATE COLUMN TABLE Car
(CarID
VARCHAR(3) PRIMARY KEY,
PlateNumber
VARCHAR(10),
Brand
VARCHAR(20),
Color
VARCHAR(10),
HP
INTEGER,
Owner
VARCHAR(3),
UNIQUE(Brand),
UNIQUE(Color));
©
2013 SAP AG. All rights reserved.
387
CREATE COLUMN TABLE
You must use a separate
UNIQUE
clause to define a multi-column key.
 Using UNIQUE a two-column key is defined:
CREATE COLUMN TABLE Car
(CarID
VARCHAR(3) PRIMARY KEY,
PlateNumber
VARCHAR(10),
Brand
VARCHAR(20),
Color
VARCHAR(10),
HP
INTEGER,
Owner
VARCHAR(3),
UNIQUE(Brand, Color));
©
2013 SAP AG. All rights reserved.
388
Data Definition
ALTER TABLE
©
2013 SAP AG. All rights reserved.
389
ALTER TABLE
ALTER TABLE Table
ADD (Column Data_Type,
Column Data_Type NOT NULL DEFAULT Default_Value);
ALTER TABLE Table
DROP (Column, Column, Column);
ALTER TABLE Table
ALTER (Column Data_Type DEFAULT Default_Value,
Column Data_Type NULL);
©
2013 SAP AG. All rights reserved.
390
ALTER TABLE

You can ADD columns to an existing table.

You can use NOT NULL only if the table is empty or if you define a DEFAULT value in
addition.
Newly added columns are filled with NULL values, or – if available – with the
corresponding default value.

ALTER TABLE Official
ADD (RemainderDays INTEGER,
AnnualLeave
INTEGER NOT NULL DEFAULT 30);
©
2013 SAP AG. All rights reserved.
391
ALTER TABLE
DROP

You can


You cannot drop columns that are part of the primary key.
Also for tables without a primary key at least one column must be left.
columns from an existing table.
ALTER TABLE Official
DROP (Salary,
Manager,
Name);
©
2013 SAP AG. All rights reserved.
392
ALTER TABLE




You can change the definition of an existing column.
For columns without a default value, you can specify one.
For columns with a default value, you can change the existing value.
The new (or first time) defined default value only affects newly inserted rows.

For columns that do not allow NULL values​​ so far, NULL values ​can be allowed.
ALTER TABLE Official
ALTER (Overtime
Salary
Name
©
2013 SAP AG. All rights reserved.
INTEGER DEFAULT 7,
VARCHAR(3) DEFAULT 'A01',
VARCHAR(20) NULL);
393
ALTER TABLE



For columns with a default value you can delete the existing default value.
The deletion of the default value only affects newly inserted rows.
Already existing values of a table are not affected by the deletion of the default value.
ALTER TABLE Official
ALTER (Salary VARCHAR(3) DEFAULT NULL);
©
2013 SAP AG. All rights reserved.
394
ALTER TABLE


You can change the data type of existing columns. Type compatibility must be ensured.
For string-based data types the new data type must have at least the same maximum
length (in comparison to the old data type).
 VARCHAR(20) → VARCHAR(25) is allowed, but not
VARCHAR(25) → VARCHAR(20)
ALTER TABLE Official
ALTER (Name
Salary
©
2013 SAP AG. All rights reserved.
VARCHAR(25),
VARCHAR(5));
395
ALTER TABLE



You can delete the definition of the primary key.
Only the primary key property is deleted.
The corresponding columns of the (previous) primary key are not deleted.
ALTER TABLE Official
DROP PRIMARY KEY;
©
2013 SAP AG. All rights reserved.
396
ALTER TABLE



You can subsequently define a primary key for a table without one.
The corresponding columns must not contain NULL values.
The key property must not be violated by the existing data.
ALTER TABLE Official
ADD PRIMARY KEY(PNr);
©
2013 SAP AG. All rights reserved.
397
Data Definition
RENAME TABLE
©
2013 SAP AG. All rights reserved.
398
RENAME TABLE
RENAME TABLE old_name TO new_name;
©
2013 SAP AG. All rights reserved.
399
RENAME TABLE
RENAME

You can


The table you want to rename can be empty or can contain data.
The new table name must be different to the old table name.
an existing table.
RENAME TABLE Official TO Employee;
©
2013 SAP AG. All rights reserved.
400
Data Definition
DROP TABLE
©
2013 SAP AG. All rights reserved.
401
DROP TABLE
DROP TABLE Table;
©
2013 SAP AG. All rights reserved.
402
DROP TABLE
DROP

You can


The table you want to drop can be empty or contain data.
Both, the table content and the table itself will be deleted.
an existing table.
DROP TABLE Official;
©
2013 SAP AG. All rights reserved.
403
Data Definition
Renaming a table column
©
2013 SAP AG. All rights reserved.
404
Data Definition
RENAME COLUMN
 An existing table column is renamed.
 This statement is used to "permanently" rename a column of an existing table
(by which the table definition is changed).
 Hence, we are not simply renaming a column of the query-result
(for which the keyword "AS" can be used in the SELECT clause).
©
2013 SAP AG. All rights reserved.
405
Data Definition
RENAME COLUMN
©
2013 SAP AG. All rights reserved.
406
RENAME COLUMN
RENAME COLUMN Table.Column TO new_Column_Name;
©
2013 SAP AG. All rights reserved.
407
RENAME COLUMN



You can (subsequently) rename a table column.
The respective table can be empty or can contain data.
The new column name must be different to the old column name.
 Column “PNr“ of Table “Official“ is renamed into “PersNumber“:
RENAME COLUMN Official.PNr TO PersNumber;
©
2013 SAP AG. All rights reserved.
408
Unit 8: Defining Data And Access Control
Summary
You should now be able to:
•
List the most important data types SAP HANA supports
• Create new database tables in HANA
• Change such tables, e.g. by adding, removing or renaming columns
©
2013 SAP AG. All rights reserved.
409
Unit 9
Using Views for Data Access
410
Unit 9: Using Views For Data Access
Learning Objectives
After completing this unit, you will be able to:
• Describe the use cases for and advantages
of using database views
• Define database views using SQL
• Query data through views
• Delete database views using SQL
©
2013 SAP AG. All rights reserved.
411
Data Definition
Why do we need views?
What are the advantages of the
view concept?
©
2013 SAP AG. All rights reserved.
412
Advantages of Views
 Decoupling applications from lower levels (relative to the 3 level schema
architecture)
– Changes to the conceptual schema (such as adding new columns of the table) have no
effect on application
 Tailored views, individually customized for the users and their tasks
– The user (or application programmer) does not know the entire database structure in
detail - but the excerpt that is relevant to them.
 Simplification of queries
– Complex queries referencing views are easier to formulate, provided that the view
provides an appropriate pre-selection of data.
 Possibility of access restriction
– Views can be used to realize value-dependent access privileges (for example, managers
can access only the data of their employees).
©
2013 SAP AG. All rights reserved.
413
Data Definition
Leveraging Views
©
2013 SAP AG. All rights reserved.
414
VIEWs
 Example of a view containing only red cars:
CREATE VIEW
SELECT
FROM
WHERE
redCars AS
CarID, Color, PlateNumber, HP AS Power
Car
Color = 'red';
CARID
----F01
F09
F12
F13
F18
©
2013 SAP AG. All rights reserved.
COLOR
----red
red
red
red
red
PLATENUMBER
----------HD-V 106
HD-UP 13
HD-XY 4711
HD-IK 1001
HD-MQ 2006
POWER
----75
105
105
136
90
415
VIEWs
You can select data from a view in the same way you select from a “normal” table.
 Which red cars have more than 100 HP?
SELECT
FROM
WHERE
ORDER BY
CarID, PlateNumber, Power
redCars
Power > 100
Power DESC, CarID ASC;
CARID
----F13
F09
F12
©
2013 SAP AG. All rights reserved.
PLATENUMBER
----------HD-IK 1001
HD-UP 13
HD-XY 4711
POWER
----136
105
105
416
VIEWs
You can INSERT new rows into a view.

The new rows are not inserted into the view, but into the underlying base table!
INSERT INTO redCars
VALUES ('F77', 'red', 'HD-MT 2509', 170);
SELECT * FROM Car;
CARID
----F01
F02
F03
…
F18
F19
F20
F77
©
2013 SAP AG. All rights reserved.
PLATENUMBER
----------HD-V 106
HD-VW 4711
HD-JA 1972
…
HD-MQ 2006
HD-VW 2012
?
HD-MT 2509
BRAND
------Fiat
VW
BMW
…
Renault
VW
Audi
?
COLOR
----red
black
blue
…
red
black
green
red
HP
--75
120
184
…
90
125
184
170
OWNER
----H06
H03
H03
…
H03
H01
?
?
417
VIEWs
You can UPDATE rows in a view.

The rows are not changed in the view, but in the underlying base table!
UPDATE redCars
SET Power = 120
WHERE Power < 120;
SELECT * FROM Car;
©
2013 SAP AG. All rights reserved.
CARID
----F01
…
F07
F08
F09
F10
F11
F12
F13
…
F18
…
PLATENUMBER
----------HD-V 106
…
HD-ML 3206
HD-IK 1002
HD-UP 13
HD-MT 507
HD-MM 208
HD-XY 4711
HD-IK 1001
…
HD-MQ 2006
…
BRAND
------Fiat
…
Audi
VW
Skoda
BMW
BMW
Skoda
Renault
…
Renault
…
COLOR
----red
…
blue
black
red
black
green
red
red
…
red
…
HP
--120
…
116
160
120
140
184
120
136
…
120
…
OWNER
----H06
…
H03
H07
H02
H04
H02
H04
H07
…
H03
…
418
VIEWs
You can DELETE rows from a view.

The rows are not deleted from the view, but from the underlying base table!
DELETE
FROM redCars
WHERE Power < 125;
SELECT * FROM Car;
©
2013 SAP AG. All rights reserved.
CARID
----F01
…
F07
F08
F09
F10
F11
F12
F13
…
F18
…
PLATENUMBER
----------HD-V 106
…
HD-ML 3206
HD-IK 1002
HD-UP 13
HD-MT 507
HD-MM 208
HD-XY 4711
HD-IK 1001
…
HD-MQ 2006
…
BRAND
------Fiat
…
Audi
VW
Skoda
BMW
BMW
Skoda
Renault
…
Renault
…
COLOR
----red
…
blue
black
red
black
green
red
red
…
red
…
HP
--120
…
116
160
120
140
184
120
136
…
120
…
OWNER
----H06
…
H03
H07
H02
H04
H02
H04
H07
…
H03
…
419
Data Definition
Which SQL statements can I use
to create or delete views?
©
2013 SAP AG. All rights reserved.
420
Data Definition
CREATE VIEW
 Creates a new view.
DROP VIEW
 Deletes an existing view.
©
2013 SAP AG. All rights reserved.
421
Data Definition
CREATE VIEW
©
2013 SAP AG. All rights reserved.
422
CREATE VIEW
CREATE VIEW
SELECT
FROM
WHERE
©
2013 SAP AG. All rights reserved.
View AS
Column, Column, Column
Table
Condition;
423
CREATE VIEW

You can restrict a view to specific columns of the
underlying base table.
CREATE VIEW Autos AS
SELECT Brand, Color, HP
FROM Car;
©
2013 SAP AG. All rights reserved.
BRAND
-------Fiat
VW
BMW
Mercedes
Mercedes
Audi
Audi
VW
Skoda
BMW
BMW
Skoda
Renault
Mercedes
Skoda
Opel
Audi
Renault
VW
Audi
COLOR
-----red
black
blue
white
black
yellow
blue
black
red
black
green
red
red
white
black
green
orange
red
black
green
HP
--75
120
184
136
170
260
116
160
105
140
184
105
136
170
136
120
184
90
125
184
424
CREATE VIEW

You can restrict a view to specific rows of the underlying base table.
CREATE VIEW
SELECT
FROM
WHERE
Audis AS
Brand, Color, HP
Car
Brand = 'Audi';
BRAND
----Audi
Audi
Audi
Audi
©
2013 SAP AG. All rights reserved.
COLOR
-----yellow
blue
orange
green
HP
--260
116
184
184
425
CREATE VIEW

You can restrict a view to a certain amount of rows:
CREATE VIEW
SELECT
FROM
WHERE
"Top3 Audis" AS
TOP 3 Brand, Color, HP
Car
Brand = 'Audi';
BRAND
----Audi
Audi
Audi
©
2013 SAP AG. All rights reserved.
COLOR
-----yellow
blue
orange
HP
--260
116
184
426
CREATE VIEW

The columns of a view can have different names than the columns of the underlying base
table.
CREATE VIEW
SELECT
FROM
WHERE
Audis (Manufacturer, Color, Power) AS
Brand, Color, HP
Car
Brand = 'Audi';
MANUFACTURER
-----------Audi
Audi
Audi
Audi
©
2013 SAP AG. All rights reserved.
COLOR
-----yellow
blue
orange
green
POWER
----260
116
184
184
427
CREATE VIEW

You can (and should) rename the columns in the SELECT clause
CREATE VIEW
SELECT
FROM
WHERE
Audis AS
Brand AS Manufacturer, Color, HP AS Power
Car
Brand = 'Audi';
MANUFACTURER
-----------Audi
Audi
Audi
Audi
©
2013 SAP AG. All rights reserved.
COLOR
-----yellow
blue
orange
green
POWER
----260
116
184
184
428
CREATE VIEW


If you rename columns in both the CREATE VIEW clause and in the SELECT clause, the
name of the CREATE VIEW clause "wins“.
We recommend renaming columns only in the SELECT clause.
CREATE VIEW
SELECT
FROM
WHERE
Audis (Manufacturer, Color, Power) AS
Brand AS Description, Color, HP AS HorsePower
Car
Brand = 'Audi';
MANUFACTURER
-----------Audi
Audi
Audi
Audi
©
2013 SAP AG. All rights reserved.
COLOR
-----yellow
blue
orange
green
POWER
----260
116
184
184
429
CREATE VIEW

A view can contain duplicates.
CREATE VIEW Colors AS
SELECT Color
FROM Car;
©
2013 SAP AG. All rights reserved.
COLOR
-----red
black
blue
white
black
yellow
blue
black
red
black
green
red
red
white
black
green
orange
red
black
green
430
CREATE VIEW


You can use DISTINCT in the view definition.
Thus the view does not contain duplicates.
CREATE VIEW Colors AS
SELECT DISTINCT Color
FROM Car;
©
2013 SAP AG. All rights reserved.
COLOR
-----red
black
blue
white
yellow
green
orange
431
CREATE VIEW




You can use ORDER BY in the view definition.
From a theoretical perspective the use of ORDER BY is highly questionable, because the
rows of a view are unsorted!
There is no guarantee that the specified ORDER BY sorting is taken into account when
reading the view.
We recommend avoiding ORDER BY in the view definition.
CREATE VIEW
SELECT
FROM
ORDER BY
©
2013 SAP AG. All rights reserved.
Colors AS
DISTINCT Color
Car
Color;
COLOR
-----blue
yellow
green
orange
red
black
white
432
CREATE VIEW

You can use calculated columns in a view.
CREATE VIEW
SELECT
FROM
WHERE
Audis AS
CarID, Color, ROUND(HP / 1.35962162, 0) AS "kW"
Car
Brand = 'Audi';
CARID
----F06
F07
F17
F20
©
2013 SAP AG. All rights reserved.
COLOR
-----yellow
blue
orange
green
kW
--191
85
135
135
433
CREATE VIEW

You can use functions in the view definition.
CREATE VIEW OwnerOverview AS
SELECT Name, YEAR(Birthday) AS YearOfBirth
FROM Owner;
NAME
-----Ms T
Ms U
SAP AG
HDM AG
Mr V
Ms W
IKEA
Mr X
Ms Y
Mr Z
©
2013 SAP AG. All rights reserved.
YEAROFBIRTH
----------1934
1966
?
?
1952
1957
?
1986
1986
1986
434
CREATE VIEW

You can use GROUP BY and aggregate expressions in the view definition.
CREATE VIEW
SELECT
FROM
GROUP BY
HAVING
Cars AS
Brand, COUNT(*) AS Quantity
Car
Brand
COUNT(*) > 2;
BRAND
-------VW
BMW
Mercedes
Audi
Skoda
©
2013 SAP AG. All rights reserved.
QUANTITY
-------3
3
3
4
3
435
CREATE VIEW

You can use UNION [ALL] in the view definition.
CREATE VIEW Persons AS
SELECT OwnerID AS "Pers ID", Name
FROM Owner
WHERE Birthday >= '1977-05-21'
UNION ALL
SELECT PNr, Name
FROM Official
WHERE Salary = 'A09';
©
2013 SAP AG. All rights reserved.
Pers ID
------H08
H09
H10
P01
P03
P06
NAME
---Mr X
Ms Y
Mr Z
Mr A
Ms C
Mr F
436
CREATE VIEW

You can use (any) JOIN in the view definition.
CREATE VIEW
SELECT
FROM
WHERE
StolenCars AS
c.PlateNumber, c.Brand, c.Color
Car c, Stolen s
c.PlateNumber = s.PlateNumber;
PLATENUMBER
----------HD-V 106
HD-VW 1999
HD-Y 333
©
2013 SAP AG. All rights reserved.
BRAND
----Fiat
Audi
Audi
COLOR
-----red
yellow
orange
437
CREATE VIEW

You can use an uncorrelated sub query in the view definition.
CREATE VIEW
SELECT
FROM
WHERE
StolenCars AS
PlateNumber, Brand, Color
Car
PlateNumber IN (SELECT PlateNumber
FROM Stolen);
PLATENUMBER
----------HD-V 106
HD-VW 1999
HD-Y 333
©
2013 SAP AG. All rights reserved.
BRAND
----Fiat
Audi
Audi
COLOR
-----red
yellow
orange
438
CREATE VIEW

You can use a correlated sub query in the view definition.
CREATE VIEW
SELECT
FROM
WHERE
StolenCars AS
c.PlateNumber,
Car c
EXISTS (SELECT
FROM
WHERE
c.Brand, c.Color
*
Stolen s
s.PlateNumber = c.PlateNumber);
PLATENUMBER
----------HD-V 106
HD-VW 1999
HD-Y 333
©
2013 SAP AG. All rights reserved.
BRAND
----Fiat
Audi
Audi
COLOR
-----red
yellow
orange
439
CREATE VIEW

You can define a view based on another view.
CREATE VIEW
SELECT
FROM
WHERE
Volkswagen AS
CarID, PlateNumber, Color, HP
Car
Brand = 'VW';
CREATE VIEW
SELECT
FROM
WHERE
blackVolkswagen AS
CarID, PlateNumber, HP
Volkswagen
Color = 'black';
©
2013 SAP AG. All rights reserved.
CARID
----F02
F08
F19
PLATENUMBER
----------HD-VW 4711
HD-IK 1002
HD-VW 2012
HP
--120
160
125
440
Data Definition
DROP VIEW
©
2013 SAP AG. All rights reserved.
441
DROP VIEW
DROP VIEW View;
©
2013 SAP AG. All rights reserved.
442
DROP VIEW



You can drop an existing view.
Only the view definition is deleted.
The underlying data of the view is not deleted.
DROP VIEW redCars;
©
2013 SAP AG. All rights reserved.
443
Views and Changeability
Is it always possible to change the
data of the underlying table by
referencing a view?
©
2013 SAP AG. All rights reserved.
444
Views and Changeability
Referencing a view, the rows of the underlying base table cannot be changed if (at
minimum) any of the following statements is true:
 The view definition contains a calculation in the projection list (such as HP / 1.36).
 The view definition uses a function in the projection list (such as YEAR).
 The view definition uses DISTINCT to eliminate duplicates.
 The view definition contains the TOP n clause to restrict the number of rows to n.
 The view definition uses an aggregate function in the projection list (such as MAX).
 The view definition is based on a GROUP BY clause.
 The view definition uses UNION.
 The view definition contains an (implicit or explicit) JOIN.
 The view definition uses a sub query in the projection list.
©
2013 SAP AG. All rights reserved.
445
Unit 9: Using Views For Data Access
Summary
You should now be able to:
• Describe the use cases for and advantages
of using database views
• Define database views using SQL
• Query data through views
• Delete database views using SQL
©
2013 SAP AG. All rights reserved.
446
Unit 10
Defining Data Access
447
Unit 10: Defining Data Access
Learning Objectives
After completing this unit, you will be able to:
• Access tables in other schemas (assuming suitable permissions)
• Control how other users can access data in your own schema
• Explain when database indexes make sense even in HANA
• Create and delete database indexes using SQL
© 2013
SAP AG. All rights reserved.
448
Data Definition
Why are there no naming
collisions when multiple users
create the same table or view?
© 2013
SAP AG. All rights reserved.
449
Schemata
Please note: The following information applies to direct (SQL-based) work on
SAP HANA - but not to database access using ABAP!
 User 1 creates table “Car”.
 User 2 also creates table “Car”.
 Why is there no naming collision?
 The name of the database object (table, view etc.) implicitly contains
a schema name as prefix: <schema name>.<given Name>
 “USER1.Car” ≠ “USER2.Car”
© 2013
SAP AG. All rights reserved.
450
Schemata
 When creating a user an identically named schema is created implicitly.
 By default a user works in his own schema (and namespace).
 You can explicitly specify the schema name if necessary.
 Which brand has (at least) one black car?
SELECT
FROM
WHERE
ORDER BY
© 2013
DISTINCT User1.Car.Brand
User1.Car
User1.Car.Color = 'black'
User1.Car.Brand;
SAP AG. All rights reserved.
BRAND
-------BMW
Mercedes
Skoda
VW
451
Schemata
 Queries across multiple schemata are possible.
 To whom is (at least) one black car registered?
SELECT DISTINCT Schema1.Owner.Name
FROM Schema1.Owner, Schema2.Car
WHERE Schema1.Owner.OwnerID = Schema2.Car.Owner
AND Schema2.Car.Color = 'black';
NAME
-----SAP AG
IKEA
HDM AG
Ms T
© 2013
SAP AG. All rights reserved.
452
Access Control
How can I define
who has access to which data?
© 2013
SAP AG. All rights reserved.
453
Access Control
To specify who can access which data, you can use the following two main (SQL
based) options. They can be used in combination:
 Create views that represent a portion of the data:
– You provide a view that contains only the owners of CityA to a user for whom the owners
outside of CityA are not relevant.
 Grant specific access permissions to selected users:
– You grant read only permissions to a user, who should be able to read the owner data but
not to change it.
© 2013
SAP AG. All rights reserved.
454
Access Control
Which SQL statements can I use
for access control?
© 2013
SAP AG. All rights reserved.
455
Access Control
GRANT
 You can selectively grant access permissions to a user (or role).
REVOKE
 You can selectively revoke access permissions from a user (or role).
© 2013
SAP AG. All rights reserved.
456
Access Control
The SQL statement GRANT
© 2013
SAP AG. All rights reserved.
457
GRANT
GRANT Privilege,
Privilege
ON Database_Object
TO Database_User
WITH GRANT OPTION;
© 2013
SAP AG. All rights reserved.
458
GRANT

You can define which user is allowed to SELECT from which table.

By adding the WITH GRANT OPTION the recipient of the privilege (grantee) is
allowed to grant this privilege to other users (without losing it).
 User1 is allowed to read (SELECT) from table Official of schema Schema2.
 User1 is allowed to grant this SELECT privilege to other users.
GRANT
ON
TO
WITH
© 2013
SELECT
Schema2.Official
User1
GRANT OPTION;
SAP AG. All rights reserved.
459
GRANT

You can exactly specify which user is allowed to INSERT rows into which table.

The INSERT privilege does not necessarily require the SELECT privilege.

The INSERT privilege does not automatically include the SELECT privilege.
 User1 is allowed to INSERT rows into table Owner of schema Schema2.
As User 1 has no SELECT privilege, he is not allowed to read the rows he has inserted.
GRANT INSERT ON Schema2.Owner TO User1;
© 2013
SAP AG. All rights reserved.
460
GRANT

You can exactly specify which user is allowed to UPDATE rows of which table.

The UPDATE privilege does not necessarily require the SELECT privilege.

The UPDATE privilege does not automatically include the SELECT privilege.
 User1 is allowed to UPDATE table Car_EU of schema Schema2.
 Because User1 has no SELECT privileges for the table Car_EU the WHERE clause of his
UPDATE statement cannot contain a reference to the columns of this table.
GRANT UPDATE ON Schema2.Car_EU TO User1;
© 2013
SAP AG. All rights reserved.
461
GRANT

You can exactly specify which user is allowed to DELETE rows from which table.

The DELETE privilege does not necessarily require the SELECT privilege.

The DELETE privilege does not automatically include the SELECT privilege.
 User1 is allowed to DELETE rows from table Stolen of schema Schema2.
 Because User1 has no SELECT privileges for the table Stolen the WHERE clause of his
DELETE statement cannot contain a reference to the columns of this table.
GRANT DELETE ON Schema2.Stolen TO User1;
© 2013
SAP AG. All rights reserved.
462
GRANT
 You can assign multiple privileges for the same database object by using a
single GRANT statement.
 User1 is allowed to SELECT, INSERT, UPDATE, DELETE on table
Contact of schema Schema2.
 User1 is allowed to grant these privileges to other users
(in whole or in part).
GRANT
ON
TO
WITH
© 2013
SELECT, INSERT, UPDATE, DELETE
Schema2.Contact
User1
GRANT OPTION;
SAP AG. All rights reserved.
463
GRANT
You can assign privileges for all tables and views of a schema by using a single GRANT
statement.
 User1 is allowed to SELECT from all tables and views of schema Schema2.
 User1 is allowed to grant this privilege to other users (for all or selected tables or views).

GRANT
ON
TO
WITH
© 2013
SELECT
SCHEMA Schema2
User1
GRANT OPTION;
SAP AG. All rights reserved.
464
GRANT
Depending on the granularity (or the type of database object) you can
assign different access privileges to users.
Granularity
Access Privileges
(single) Schema
SELECT, INSERT, UPDATE, DELETE, DROP, ALTER,
CREATE ANY
(single) Table
SELECT, INSERT, UPDATE, DELETE, DROP, ALTER
(single) View
SELECT, INSERT, UPDATE, DELETE, DROP
© 2013
SAP AG. All rights reserved.
465
Access Control
The SQL statement REVOKE
© 2013
SAP AG. All rights reserved.
466
REVOKE
REVOKE Privilege,
Privilege,
Privilege
ON Database_Object
FROM Database_User;
© 2013
SAP AG. All rights reserved.
467
REVOKE

Using the REVOKE statement you can selectively revoke access privileges from a user.
 User1 will no longer be allowed to read from table Official of schema Schema2 (assuming
that this privilege is not granted by other privileges)
REVOKE SELECT
ON Schema2.Official
FROM User1;
© 2013
SAP AG. All rights reserved.
468
REVOKE

You can revoke multiple privileges for the same database object by using a single
REVOKE statement
 User1 will no longer be allowed to SELECT, INSERT, UPDATE, DELETE from
table Contact of schema Schema2
(assuming that these privileges are not granted by other privileges)
REVOKE SELECT, INSERT, UPDATE, DELETE
ON Schema2.Contact
FROM User1;
© 2013
SAP AG. All rights reserved.
469
REVOKE

Access privileges on different hierarchical levels of database objects are independent.
 Despite the REVOKE statement User1 still has read access to the table Official of schema
Schema2 , because he still has a (not withdrawn) read permission on the entire schema
Schema2 .
GRANT SELECT
ON SCHEMA Schema2
TO User1;
REVOKE SELECT
ON Schema2.Official
FROM User1;
© 2013
SAP AG. All rights reserved.
470
REVOKE

The independence of access privileges at various hierarchical levels is also valid in the
contrary case.

Despite the REVOKE statement User1 still has read access to the table Official of schema
Schema2 , because he still has a (not withdrawn) read permission on the table.
GRANT SELECT
ON Schema2.Official
TO User1;
REVOKE SELECT
ON SCHEMA Schema2
FROM User1;
© 2013
SAP AG. All rights reserved.
471
Access Paths
What is a database index?
© 2013
SAP AG. All rights reserved.
472
Access Paths
 An index (plural: indexes or indices) is an access path.
 An index may speed up search and sorting.
– Index access instead of "full table scan" or "full column scan"
– Index usage with HANA COLUMN TABLES only in exceptional cases
 An index usually slows down inserts, update and deletion.
 An index has no influence on the query result.
– Effect "only" on performance
 Indexes are not covered by the SQL standard.
– CREATE / DROP INDEX are strictly speaking no SQL statements.
© 2013
SAP AG. All rights reserved.
473
HANA: Why Indexes on Column Store?
– Sorted dictionary of values
– (Bit-)Vector of value IDs
Are indexes necessary to
speed up data access?
© 2013
SAP AG. All rights reserved.
Column „Name“
conceptual
Column “Name” – internal representation
Value ID vector
Dictionary
Miller
4
0
Baker
Jones
1
1
Jones
Millman
5
2
John
Zsuwalski
772
3
Johnson
Baker
0
4
Miller
Miller
4
5
Millman
John
2
Miller
4
Johnson
3
Jones
1
…
…
sorted
 HANA stores data in
columns, not rows
 Columns are stored as
…
772
Zsuwalski
…
474
HANA: Table Scan With Value ID
 Value ID lookup is fast
Dictionary
–
WHERE Name =
'Zsuwalski'
 Row ID lookup can still
involve “full column scan”
– No issue for most value ID
vectors, even less if sorted
– But may be slow for very large
value ID vectors
© 2013
SAP AG. All rights reserved.
binary search on dictionary
– binary search on sorted
dictionary
Value ID vector
ID
Value
Row ID
Value ID
0
Baker
0
4
1
Jones
1
1
2
John
2
5
3
Johnson
3
772
4
Miller
4
0
5
Millman
772
full column scan
with value ID
…
…
254621
772
Zsuwalski
…
…
…
475
HANA: Inverted Index on Column Store
 An inverted index can be reasonable in exceptional cases
if column scan performance is not sufficient
WHERE Name =
'Zsuwalski'
© 2013
SAP AG. All rights reserved.
binary search on dictionary
Dictionary
Inverted Index
Value ID vector
ID
Value
Value ID
Rows
Row ID
Value ID
0
Baker
0
56756
0
4
1
Jones
1
345,
76876
…
…
3
772
…
772
Zsuwalski
…
…
…
772
3, 254621
…
…
…
254621
772
…
…
476
Access Paths
Which SQL statements can I use
to create a database index?
© 2013
SAP AG. All rights reserved.
477
Access Paths
CREATE INDEX
 A new database index is created.
DROP INDEX
 An existing database index is deleted.
© 2013
SAP AG. All rights reserved.
478
Access Paths
CREATE INDEX
© 2013
SAP AG. All rights reserved.
479
Access Paths
CREATE INDEX Access_Path
ON Table (Column, Column);
CREATE UNIQUE INDEX Access_Path
ON Table (Column, Column);
© 2013
SAP AG. All rights reserved.
480
CREATE INDEX


To speed up the read access you can create an index on a table column.
The respective table can be empty or contain data.
 An index on column PlateNumber of table Car will be created:
CREATE INDEX PlateNumberIndex
ON Car (PlateNumber);
© 2013
SAP AG. All rights reserved.
481
CREATE INDEX

You can create a UNIQUE INDEX to ensure that the corresponding column cannot
contain duplicate values.

Unlike PRIMARY KEY, UNIQUE INDEX does not prohibit NULL values.

A UNIQUE INDEX can only be created when the column contains no duplicate values.
 In table Car no duplicated plate numbers are allowed:
CREATE UNIQUE INDEX PlateNumberIndex
ON Car (PlateNumber);
© 2013
SAP AG. All rights reserved.
482
CREATE INDEX
You can create multiple indexes on the same table.
 A single-column index is created on column Brand of table Car.
 A single-column index is created on column Color of the same table.
CREATE INDEX BrandsIndex
ON Car (Brand);
CREATE INDEX ColorsIndex
ON Car (Color);
© 2013
SAP AG. All rights reserved.
483
CREATE INDEX
You can create a multi-column index.
 Here a two-column index is created:
CREATE INDEX BrandsColorsCombinationsIndex
ON Car (Brand, Color);
© 2013
SAP AG. All rights reserved.
484
CREATE INDEX

By applying a multi-column UNIQUE INDEX, the relevant combination of columns can
be defined as key.

In contrast to the PRIMARY KEY, UNIQUE INDEX does not prohibit NULL values in
the key columns.

You can only create a multi-column UNIQUE INDEX, if the relevant column
combination does not contain duplicates.
Here, the value ​uniqueness of Country and PlateNumber combinations is enforced:

CREATE UNIQUE INDEX CountryPlateNumberCombiIndex
ON Car_EU (Country, PlateNumber);
© 2013
SAP AG. All rights reserved.
485
Access Paths
DROP INDEX
© 2013
SAP AG. All rights reserved.
486
Access Paths
DROP INDEX Access_Path;
© 2013
SAP AG. All rights reserved.
487
DROP INDEX



You can drop an existing index.
Only the access path (index) is deleted.
The underlying data of the index is not deleted.
 DROP INDEX does not syntactically distinguish between NON-UNIQUE and UNIQUE
indexes.
DROP INDEX PlateNumberIndex;
© 2013
SAP AG. All rights reserved.
488
Unit 10: Defining Data Access
Summary
You should now be able to:
•
Access tables in other schemas (assuming suitable permissions)
• Control how other users can access data in your own schema
• Explain when database indexes make sense even in HANA
• Create and delete database indexes using SQL
© 2013
SAP AG. All rights reserved.
489
Unit 11
Database Transactions
490
Unit 11: Database Transactions
Learning Objectives
After completing this unit, you will be able to:
• Explain what a database transaction is and why it is needed
• Explain the acronym ACID
• Finish database transactions in HANA using SQL statements
• Describe issues that arise if transactions are not mutually isolated
• Understand how classical database systems synchronize
concurrent transactions
• Understand how HANA synchronizes concurrent transactions
© 2013
SAP AG. All rights reserved.
491
Database Transactions
•
Transaction (TA) = Sequence of associated database operations (SQL
statements) for which the ACID requirements must be met.
•
All database operations always take place within transactions (in the
extreme case, each operation has its own transaction).
•
•
•
•
A
C
I
D
© 2013
=
=
=
=
Atomicity
Consistency
Isolation
Durability
SAP AG. All rights reserved.
492
Database Transactions
• Atomicity (A): A transaction is either executed completely or not at all.
 For Example: Transfer from Account1 to Account2
• Consistency (C): A transaction will bring the database from one consistent state to
an(other) consistent state.
 During a transaction inconsistent states are possible, for example account transfers or marriage registration.
• Isolation (I): The database changes performed within a transaction shall only be visible to
the outside after the completion of the transaction
Important only for multi-user operations. Problematic if changes of canceled transactions can be seen.
• Durability (D): If a transaction is successfully completed (COMMIT), all changes from the
transaction must permanently stay even in case of failures, or can be restored
automatically.
For example: Booking a deposit
© 2013
SAP AG. All rights reserved.
493
Database Transactions
•
The ACID requirements must be ensured by the DBMS (not trivial).
•
The DBMS must provide mechanisms/automation for:
 Logging & Recovery for A + D
 Synchronization for I (such as locks)
 Integrity control for C
•
ACID requirements „cost“:
 With respect to the DBMS implementation effort
 With regard to performance at runtime
© 2013
SAP AG. All rights reserved.
494
Database Transactions
Which SQL statements can I use
to start a transaction?
© 2013
SAP AG. All rights reserved.
495
Database Transactions
SAP HANA does not provide a SQL statement to explicitly start a transaction.
A transaction is implicitly started, if
the previous transaction was canceled or successfully completed
(or there is no previous transaction)
AND
one of the following SQL statements is executed
SELECT
INSERT
UPDATE
DELETE
The transaction begins directly before the SQL statement, by which it is implicitly started.
© 2013
SAP AG. All rights reserved.
496
Database Transactions
Which SQL statements can I use
to finish a transaction?
© 2013
SAP AG. All rights reserved.
497
Database Transactions
COMMIT
 The currently running transaction should be completed successfully.
 The durability requirement must be ensured.
ROLLBACK
 The currently running transaction should be canceled.
 The atomicity requirement must be ensured.
© 2013
SAP AG. All rights reserved.
498
Database Transactions
DELETE FROM Car;
COMMIT;
INSERT INTO Car(CarID)
INSERT INTO Car(CarID)
INSERT INTO Car(CarID)
COMMIT;
INSERT INTO Car(CarID)
INSERT INTO Car(CarID)
INSERT INTO Car(CarID)
ROLLBACK;
INSERT INTO Car(CarID)
INSERT INTO Car(CarID)
INSERT INTO Car(CarID)
COMMIT;
SELECT CarID FROM Car;
© 2013
SAP AG. All rights reserved.
VALUES ('F01');
VALUES ('F02');
VALUES ('F03');
VALUES ('F04');
VALUES ('F05');
VALUES ('F06');
VALUES ('F07');
VALUES ('F08');
VALUES ('F09');
CARID
----F01
F02
F03
F07
F08
F09
499
Database Transactions
DELETE FROM Car;
COMMIT;
INSERT INTO Car(CarID) VALUES
INSERT INTO Car(CarID) VALUES
INSERT INTO Car(CarID) VALUES
CREATE COLUMN TABLE T(S INT);
INSERT INTO Car(CarID) VALUES
INSERT INTO Car(CarID) VALUES
INSERT INTO Car(CarID) VALUES
ROLLBACK;
INSERT INTO Car(CarID) VALUES
INSERT INTO Car(CarID) VALUES
INSERT INTO Car(CarID) VALUES
COMMIT;
SELECT CarID FROM Car;
© 2013
SAP AG. All rights reserved.
Certain SQL statements
cause an implicit COMMIT
('F01');
('F02');
('F03');
('F04');
('F05');
('F06');
('F07');
('F08');
('F09');
CARID
----F01
F02
F03
F07
F08
F09
500
Multi-user Mode
Multi-user operations
are absolutely necessary - but not
without problems
© 2013
SAP AG. All rights reserved.
501
Multi-user Mode
Multi-user mode is absolutely necessary!
•
If the transactions took place strictly in sequence one after another, this
would be a huge waste of resources, since waiting times could not be
used.
•
•
•
Waiting for user input
Waiting for disk access (for classical DBMS products)
Waiting times caused by the application program
Multiple transaction must run time-shared (“interlocked”)
•
When this happens in an uncontrolled manner (for example without
synchronization), many problems can occur.
•
The problems can be divided into 5 different error classes
(see following slides)
© 2013
SAP AG. All rights reserved.
502
Uncontrolled Multi-user Mode 1/5
Lost-update Problem
 The changes of a transaction are overwritten by another transaction and therefore lost.
Point in time
Transaction 1
t1
Read x
t2
t3
Read x
x := x + 5,000;
x := x – 100;
t4
t5
t6
© 2013
SAP AG. All rights reserved.
Transaction 2
Write x
Write x
503
Uncontrolled Multi-user Mode 2/5
Inconsistent Analyses
 A transaction sees an apparent inconsistency, since it refers to two different consistent
database states.
Point in time
Transaction 1
t1
Read marital status of Mandy
(Result: “unmarried”)
t2
Change marital status of Mandy
to “married”
t3
Change marital status of Thomas
to “married”
t4
© 2013
Transaction 2
SAP AG. All rights reserved.
Read marital status of Thomas
(Result: “married”)
504
Uncontrolled Multi-user Mode 3/5
Phantom Problem (“malicious”, as it cannot be prevented by row-locking)
 A transaction sees an apparent inconsistency, since another transaction inserted a new
row in the meantime.
Point in time
t1
Transaction 2
Read all SAP employees
t2
Insert Mr Z as a new SAP employee
t3
Register Mr Z as course participant
t4
© 2013
Transaction 1
SAP AG. All rights reserved.
Read all course participants
(Mr Z is a participant of an
internal course, though he
apparently seems to be no SAP
employee!)
505
Uncontrolled Multi-user Mode 4/5
Non-repeatable read
 During the same transaction different results are obtained for repeated reading of the
same facts.
Point in time
Transaction 1
t1
Read salary of Mr A
t2
t3
© 2013
SAP AG. All rights reserved.
Transaction 2
Raise salary of Mr A
Read salary of Mr A
506
Uncontrolled Multi-user Mode 5/5
Dependency on uncommitted changes (Dirty reads)
 A transaction sees and uses a state that officially never existed.
Point in time
Transaction 1
t1
Raise salary to
€ 10,000,000.-
t2
Read salary
t3
Donate € 5,000,000.-
t4
COMMIT;
t5
© 2013
Transaction 2
SAP AG. All rights reserved.
ROLLBACK;
(transaction canceled)
507
Synchronisation
 To avoid the problems shown before, multi-user mode must be controlled or
synrchonized
– Synchronization = time based coordination of processes
 A common option for synchronization is the use of locking
– Locks are the most important (but not the only) way
– “Multi-version Concurrency Control" can also be used
– Alternatively, there is the “Optimistic Synchronization Method“
 The goal of synchronization is the logical single-user mode with physical
multi-user mode.
© 2013
SAP AG. All rights reserved.
508
Logical Single-user Mode
What does logical single-user
mode with physical multi-user
mode mean?
© 2013
SAP AG. All rights reserved.
509
Logical Single-user Mode
The user should have the impression of being the only active user of the
database.
This goal cannot be reached to 100%.
 If access to a (currently locked) object takes longer, the users will suspect that they are not
alone.
 If the transaction is aborted by the DBMS to resolve a deadlock, the users will suspect that
they are not alone.
Externally there should be the impression that the transactions are strictly
executed in series (that means one after another - Serializability criterion)
 In reality: time-shared processing of several transactions
– But the impression of serial processing should be created
© 2013
SAP AG. All rights reserved.
510
Serializability
What is the Serializability
Criterion?
© 2013
SAP AG. All rights reserved.
511
Serializability
 Serializability = There is a serial execution order of the transactions that
has the same result
– Result in terms of database state or database content
 Serializability is therefore a correctness criterion for the "correct" execution
of the synchronization (that means for the "right" control of the multi-user
mode)
 Ensuring Serializability is the responsibility of the DBMS
(and not of the user or of the application program)
 What Serializability means, you can best understand with reference to a
concrete example … (see following slides).
© 2013
SAP AG. All rights reserved.
512
Transaction 1
UPDATE Official
SET Overtime = Overtime + 2
WHERE PNr = 'P07';
UPDATE Official
SET Overtime = Overtime + 2
WHERE PNr = 'P07';
COMMIT;
© 2013
SAP AG. All rights reserved.
513
Transaction 2
--Rounding to full ten
UPDATE Official
SET Overtime = ROUND(Overtime, -1)
WHERE PNr = 'P07';
SELECT *
FROM Contact;
COMMIT;
© 2013
SAP AG. All rights reserved.
514
Transaction 3
UPDATE Official
SET Overtime = Overtime * 4
WHERE PNr = 'P07';
UPDATE Official
SET Overtime = Overtime / 2
WHERE PNr = 'P07';
COMMIT;
© 2013
SAP AG. All rights reserved.
515
Effect of the 3 Transactions
TA1 increases the overtime value by 4
1a) o = o + 2;
1b) o = o + 2;
TA2 rounds the overtime value to full ten
2a) o = round(o);
2b) read access;
TA3 doubles the overtime value
3a) o = o * 4;
3b) o = o / 2;
© 2013
SAP AG. All rights reserved.
516
Serial Execution



TA1 increases the overtime value by 4
TA2 rounds the overtime value to full ten
TA3 doubles the overtime value
TA1 → TA2 → TA3
22 → 26 → 30 → 60
TA1 → TA3 → TA2
22 → 26 → 52 → 50
TA2 → TA1 → TA3
22 → 20 → 24 → 48
TA2 → TA3 → TA1
22 → 20 → 40 → 44
TA3 → TA1 → TA2
22 → 44 → 48 → 50
TA3 → TA2 → TA1
22 → 44 → 40 → 44

Initial value = 22
Correct result (according to Serializability): 44, 48, 50 und 60
© 2013
SAP AG. All rights reserved.
517
Incorrect Interleaving
Initial Value
22
1.
(1a)
o = o + 2;
24
2.
(2a)
o = round(o);
20
3.
(2b)
read access;
20
4.
(3a)
o = o * 4;
80
5.
(1b)
o = o + 2;
82
6.
(3b)
o = o / 2;
41

The interleaving shown above is incorrect, because the result (41)
does not correspond to any value that can occur in serial execution
(44, 48, 50 and 60)
© 2013
SAP AG. All rights reserved.
518
Correct Interleaving
Initial Value
22
1.
(3a)
o = o * 4;
88
2.
(2a)
o = round(o);
90

3.
(1a)
o = o + 2;
92
4.
(3b)
o = o / 2;
46
5.
(2b)
read access;
46
6.
(1b)
o = o + 2;
48
© 2013
SAP AG. All rights reserved.
The interleaving shown here is
correct, because the result (48)
corresponds to one of the values
that can occur by serial execution
(44, 48, 50 and 60).
519
Multi-user Mode
What are Isolation Levels?
© 2013
SAP AG. All rights reserved.
520
Isolation Levels
Isolation Levels define …
•
Whether rows that are read, inserted, updated, or deleted by a transaction
are available to other transactions running in parallel.
•
Whether read, insert, update, or delete activities of another transaction
running in parallel have an impact on the current transaction.
•
Which problems of uncontrolled multi-user mode may occur and which
problems must be prevented (by the DBMS)
© 2013
SAP AG. All rights reserved.
521
Isolation Levels
 4 isolation levels are defined by the SQL Standard in such a way that
each level defines which problems may occur and which problems must be prevented by the
DBMS.
Isolation Level
Uncommitted
Dependency (Dirty
Reads)
Non-repeatable Reads
Phantom Problem
0
READ UNCOMMITTED
possible
possible
possible
1
READ COMMITTED
impossible
possible
possible
2
REPEATABLE READ
impossible
impossible
possible
3
SERIALIZABLE
impossible
impossible
impossible
© 2013
SAP AG. All rights reserved.
522
Multi-user Mode
Which SQL statement can I use to
define the isolation level?
© 2013
SAP AG. All rights reserved.
523
Multi-user Mode
SET TRANSACTION ISOLATION LEVEL




A certain isolation level is set.
You must set the isolation level before the transaction starts.
The isolation level is only valid for a single (i.e. next to run) transaction.
If different isolation levels are set before the transaction starts, only the last
setting is decisive.
 The isolation level “SERIALIZABLE” guarantees serializability.
© 2013
SAP AG. All rights reserved.
524
Multi-user Mode
SET TRANSACTION
ISOLATION LEVEL
© 2013
SAP AG. All rights reserved.
525
Isolation Levels
SET TRANSACTION ISOLATION LEVEL IsolationLevel;
© 2013
SAP AG. All rights reserved.
526
Isolation Levels
 According to the SQL Standard isolation level SERIALIZABLE is the
default.
 In SAP HANA the isolation level READ COMITTED is the default.
 It is not possible to set isolation level READ UNCOMMITED in
SAP HANA.
 You can set the remaining three isolation levels as follows:
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
© 2013
SAP AG. All rights reserved.
527
Synchronization
How do classical DBMS products
synchronize the multi-user mode?
© 2013
SAP AG. All rights reserved.
528
Classical Synchronization
 Classical DBMS products usually use locking for multi-user mode synchronization.
 Database objects (schemata, tables, rows) are locked prior to any access (and therefore
cannot or only in a limited way be used by other transactions).
 Locks are set and released by the DBMS.
 User or applications do not need to care of the locks (automation of the DBMS).
© 2013
SAP AG. All rights reserved.
529
Synchronization
How does SAP HANA synchronize
its multi-user mode?
© 2013
SAP AG. All rights reserved.
530
Synchronization in SAP HANA
The consistency of write access is ensured by X-locks
 The affected rows are locked “as usual”.
The consistency of read access is ensured by “Multi Version Concurrency Control“ (MVCC)
 No S-locks are set when reading rows .
 By default, all SELECT statements of the same transaction see the same (possibly
obsolete) consistent version of the database state (≈ isolation level REPEATABLE READ).
 This version contains all changes that were committed before the start of the transaction
(together with all changes done by the transaction itself).
This is called “transaction-level snapshot isolation”.
 Write access for other transactions running in parallel creates a new version of the
database state (which is not visible to the transaction mentioned above.)
 Isolation level READ COMMITED corresponds to statement-level snapshot isolation
© 2013
SAP AG. All rights reserved.
531
Multi-Version Concurreny Control – An Example
Timeline of 5 transactions T1-T5
accessing same record „item D“
T2
T4
T5 starts after T3 is committed
 sees V2
When T4 ends (last transaction that still
sees V1), V1 becomes obsolete
© 2013
SAP AG. All rights reserved.
V2 open
V1 open
committed
read
read
insert
update
T5
item D
versions

T3
T1 writes V1 of item D
T3 starts and writes V2.
V1 still remains visible for transactions
that started before T3 ends.
 With „transaction-level“ snapshot
isolation, T2 and T4 keep seeing V1 of
item D (≈ repeatable read)

commit
Tx T1
read


commit
committed
out-dated
532
Write Locks & Snapshot Isolation – Additional Remarks
 Snapshot Isolation can lead to
updates a transaction that
started earlier doesn’t see
 Transaction-level snapshot
isolation increases probability of
conflicts on application level
© 2013
SAP AG. All rights reserved.
Transaction T1
write
write
read
re-read
Transaction T2
data record versions
 Primary key & uniqueness
constraints are checked
considering all existing versions
 Deadlock situations can not be
prevented
commit
V3
V2
V1
Committed
Committed
533
Unit 11: Database Transactions
Summary
You should now be able to:
•
Explain what a database transaction is and why it is needed
• Explain the acronym ACID
• Finish database transactions in HANA using SQL statements
• Describe issues that arise if transactions are not mutually isolated
•
Understand how classical database systems synchronize concurrent
transactions
• Understand how HANA synchronizes concurrent transactions
© 2013
SAP AG. All rights reserved.
534
Summary
535
Summary
Motivation And Basic Concepts
Reading Data From A Table Or View
Aggregating Data
Reading Data From Multiple Tables
Changing Data Stored in Tables
Defining How Data Is Stored
Using Views For Data Access
Defining Data Access
Understanding NULL Values
Database Transactions
© 2013
SAP AG. All rights reserved.
536
Open Questions
© 2013
SAP AG. All rights reserved.
537
Done!
© 2013
SAP AG. All rights reserved.
538
Meta Data
How can I access meta data?
© 2013
SAP AG. All rights reserved.
539
Accessing Meta Data


The DBMS provides metadata views (catalog views).
This is a requirement of the SQL standard.
You can use SQL to read the meta data.

Which tables belong to schema Schema1?
SELECT Table_Name
FROM Sys.Tables
WHERE Schema_Name = 'SCHEMA1';
© 2013
SAP AG. All rights reserved.
TABLE_NAME
---------CONTACT
OFFICIAL
OWNER
STOLEN
OWNER_EU
CAR
CAR_EU
540
Accessing Meta Data
 Which columns are in table Car of schema Schema1?
SELECT
FROM
WHERE
ORDER BY
Column_Name, Position, Data_Type_Name
Sys.Table_Columns
Schema_Name = 'SCHEMA1' AND Table_Name ='CAR'
Position;
COLUMN_NAME
----------CARID
PLATENUMBER
BRAND
COLOR
HP
OWNER
© 2013
SAP AG. All rights reserved.
POSITION
-------1
2
3
4
5
6
DATA_TYPE_NAME
-------------VARCHAR
VARCHAR
VARCHAR
VARCHAR
INTEGER
VARCHAR
541
Accessing Meta Data
 How many columns do the tables of schema Schema1 have?
SELECT
FROM
WHERE
GROUP BY
ORDER BY
Table_Name, COUNT(*) AS NumColumns
Sys.Table_Columns
Schema_Name = 'SCHEMA1'
Table_Name
2
TABLE_NAME
---------CONTACT
STOLEN
OWNER
OWNER
OWNER_EU
CAR
CAR_EU
© 2013
SAP AG. All rights reserved.
NUMCOLUMNS
---------2
2
4
5
5
6
7
542
Accessing Meta Data
 Which tables of schema Schema1 have the fewest columns?
SELECT
FROM
WHERE
GROUP BY
HAVING
TABLE_NAME
---------CONTACT
STOLEN
© 2013
Table_Name, COUNT(*) AS NumColumns
Sys.Table_Columns
Schema_Name = 'SCHEMA1'
Table_Name
COUNT(*) = (SELECT TOP 1 COUNT(*)
FROM Sys.Table_Columns
WHERE Schema_Name = 'SCHEMA1'
GROUP BY Table_Name
ORDER BY 1);
NUMCOLUMNS
---------2
2
SAP AG. All rights reserved.
543
Accessing Meta Data
 Which tables of schema Schema1 have the most columns?
SELECT
FROM
WHERE
GROUP BY
HAVING
TABLE_NAME
---------CAR_EU
© 2013
Table_Name, COUNT(*) AS NumColumns
Sys.Table_Columns
Schema_Name = 'SCHEMA1'
Table_Name
COUNT(*) = (SELECT TOP 1 COUNT(*)
FROM Sys.Table_Columns
WHERE Schema_Name = 'SCHEMA1'
GROUP BY Table_Name
ORDER BY 1 DESC);
NUMCOLUMNS
---------7
SAP AG. All rights reserved.
544
Meta Data
Which meta data views are
available?
© 2013
SAP AG. All rights reserved.
545
Accessing Meta Data
 There are several meta data views …
Meta Data View
Information contained
Sys.Tables
Which tables are available?
Sys.Table_Columns
Which columns are in the tables?
Sys.Views
Which views are available?
Sys.View_Columns
Which columns are in the views?
Sys.Indexes
Which indexes are available?
Sys.Index_Columns
Which columns are in the indexes?
© 2013
SAP AG. All rights reserved.
546
© 2013 SAP AG. All rights reserved.
No part of this publication may be reproduced or transmitted in any form or for any purpose without the express permission of SAP AG.
The information contained herein may be changed without prior notice.
Some software products marketed by SAP AG and its distributors contain proprietary software components of other software vendors.
National product specifications may vary.
These materials are provided by SAP AG and its affiliated companies ("SAP Group") for informational purposes only, without representation or
warranty of any kind, and SAP Group shall not be liable for errors or omissions with respect to the materials. The only warranties for SAP Group
products and services are those that are set forth in the express warranty statements accompanying such products and services, if any. Nothing
herein should be construed as constituting an additional warranty.
SAP and other SAP products and services mentioned herein as well as their respective logos are trademarks or registered trademarks of SAP AG in
Germany and other countries.
Please see http://www.sap.com/corporate-en/legal/copyright/index.epx#trademark for additional trademark information and notices.
© 2013
SAP AG. All rights reserved.
547
Download
Study collections