Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                

SQL Notes Detail 1 PDF

Download as pdf or txt
Download as pdf or txt
You are on page 1of 184

SQL

SQL = Structured Query Language (sometimes called sequel).

SQL is an ANSI/ISO standard language for querying and manipulating


relational DBMSs.

Designed to be a human readable language comprising:

data definition facilities

database modification operations

database query operations, including:

relational algebra, set operations, aggregation, grouping, ...

F-1
SQL (cont.)

SQL was developed at IBM (San Jose Lab) during the 1970s, and
standardised in 1986.

DBMSs typically implement the SQL2 standard (aka SQL-92).

Unfortunately, they also:

implement a (large) subset of the standard

extend the standard in various useful ways

SQL (in some form) looks likely to survive in the next generation of
database systems.

In these slides, we try to use only standard (portable) SQL2.

F-2
SQL (cont.)

Since SQL2, there have been three new proposed standards:

SQL:1999 added e.g.

boolean and BLOB types, arrays/rows, ...

procedures programming constructs, triggers

recursive queries

OO-like objects, inheritance, ...

SQL:2003 ...

standardised some SQL:1999 extensions

added a standard for meta-data (catalogues)


F-3
standardised stored procedures (SQL/PSM)

defined interfaces to C, Java, XML, object systems, ...

SQL:2006 added additional support for XML.


SQL (cont.)

Major DBMSs (Oracle, DB2, SQLServer, PostgreSQL MySQL):

implement most/all of SQL2

implement much of SQL:1999

implement some of SQL:2003

omit difficult-to-implement features e.g. assertions

PostgreSQL ...

implements almost all of SQL2 (see documentation)

does not implement: recursive queries, assertions

provides non-standard mechanisms for: updatable views

currently has PLpgSQL, will also have SQL/PSM soon


F-4
SQL (cont.)

SQL provides high-level, declarative access to data.

However, SQL is not a Turing-complete programming language.

Applications typically embed evaluation of SQL queries into PLs:

Java and the JDBC API

PHP/Perl/Tcl and their various DBMS bindings

RDBMS-specific programming languages


(e.g. Oracles PL/SQL, PostgreSQLs PLpgSQL)

C and low-level library interfaces to DBMS engine


(e.g. Oracles OCI, PostgreSQLs libpq)

F-5
SQL (cont.)

SQLs query sub-language is based on relational algebra.

Relational algebra:

formal language of expressions mapping tablestables

comprising three basic operations ...

select: filter table rows via a condition on attributes

project: filter table columns by name

join: combines two tables via a condition

along with set operations (union, intersection, difference)

and a variety of aggregates (including aggregations)


F-6
SQL (cont.)

Example relational algebra operations:

t u v x y
R 1 a 2.5 S h 1
1 b 1.7 j 2
2 a 3.0 k 3
2 b 2.4

t u v
select[t=1](R) 1 a 2.5
1 b 1.7

t
project[t](R) 1
2

t u v x y
join[t=y](R,S) 1 a 2.5 h 1
1 b 1.7 h 1
2 a 3.0 j 2
2 b 2.4 j 2

F-7
Example Databases

In order to demonstrate aspects of SQL, we use two databases:

bank: customers, accounts, branches, ...

beer: beers, bars, drinkers, ...

These databases are available for you to play with.

F-8
Example Database #1

ER design for a simple banking application:

branchName addr assets

HeldAt Branch HasHome

Account OwnedBy Customer

accountNo balance customerNo name address

F-9
Example Database #1 (cont.)

Relational schema corresponding to the ER design:

Foreign Key Primary Key


Account branchName accountNo balance

Foreign Key
Primary Key Owner account customer
Branch branchName address assets Foreign Key

Customer name address customerNo homeBranch


Primary Key Foreign Key

F-10
Example Database #1 (cont.)

We will use the following instance of this schema:

Branch relation/table instance:


branchName | address | assets
------------+----------------+--------
Clovelly | Clovelly Rd. | 1000
Coogee | Coogee Bay Rd. | 40000
Maroubra | Anzac Pde. | 17000
Randwick | Alison Rd. | 20000
UNSW | near Library | 3000

Customer relation/table instance:


name | address | customerNo | homebranch
--------+----------------+------------+------------
Adam | Belmore Rd. | 12345 | Randwick
Bob | Rainbow St. | 32451 | Coogee
Chuck | Clovelly Rd. | 76543 | Clovelly
David | Anzac Pde. | 82199 | UNSW
George | Anzac Pde. | 81244 | Maroubra
Graham | Malabar Rd. | 92754 | Maroubra
Greg | Coogee Bay Rd. | 22735 | Coogee
Jack | High St. | 12666 | Randwick
F-11
Example Database #1 (cont.)

Account relation/table instance:


branchName | accountNo | balance
------------+-----------+---------
UNSW | U-245 | 1000
UNSW | U-291 | 2000
Randwick | R-245 | 20000
Coogee | C-123 | 15000
Coogee | C-124 | 25000
Clovelly | Y-123 | 1000
Maroubra | M-222 | 5000
Maroubra | M-225 | 12000

Owner relation/table instance:


account | customer
---------+----------
U-245 | 12345
U-291 | 12345
U-291 | 12666
R-245 | 12666
C-123 | 32451
C-124 | 22735
Y-123 | 76543
M-222 | 92754
M-225 | 12345
F-12
Example Database #2

ER design for beers/bars/drinkers database:

name manf price

Likes Beers Sells

Drinkers Frequents Bars

name addr phone name addr license

F-13
Example Database #2 (cont.)

Relational schema corresponding to the ER design:

Beers name manf

Sells bar beer price

Likes drinker beer

Bars name addr licence

Frequents drinker bar

Drinkers name addr phone

F-14
Example Database #2 (cont.)

We will use the following instance of this schema:

Bars relation/table instance:


name | addr | license
------------------+-----------+---------
Australia Hotel | The Rocks | 123456
Coogee Bay Hotel | Coogee | 966500
Lord Nelson | The Rocks | 123888
Marble Bar | Sydney | 122123
Regent Hotel | Kingsford | 987654
Royal Hotel | Randwick | 938500

Drinkers relation/table instance:


name | addr | phone
--------+----------+------------
Adam | Randwick | 9385-4444
Gernot | Newtown | 9415-3378
John | Clovelly | 9665-1234
Justin | Mosman | 9845-4321

F-15
Example Database #2 (cont.)

Beers relation/table instance:


name | manf
---------------------+---------------
80/- | Caledonian
Bigfoot Barley Wine | Sierra Nevada
Burragorang Bock | George IV Inn
Crown Lager | Carlton
Fosters Lager | Carlton
Invalid Stout | Carlton
Melbourne Bitter | Carlton
New | Tooheys
Old | Tooheys
Old Admiral | Lord Nelson
Pale Ale | Sierra Nevada
Premium Lager | Cascade
Red | Tooheys
Sheaf Stout | Tooheys
Sparkling Ale | Coopers
Stout | Coopers
Three Sheets | Lord Nelson
Victoria Bitter | Carlton

F-16
Example Database #2 (cont.)

Frequents relation/table instance:


drinker | bar
---------+------------------
Adam | Coogee Bay Hotel
Gernot | Lord Nelson
John | Coogee Bay Hotel
John | Lord Nelson
John | Australia Hotel
Justin | Regent Hotel
Justin | Marble Bar

F-17
Example Database #2 (cont.)

Likes relation/table instance:


drinker | beer
---------+---------------------
Adam | Crown Lager
Adam | Fosters Lager
Adam | New
Gernot | Premium Lager
Gernot | Sparkling Ale
John | 80/-
John | Bigfoot Barley Wine
John | Pale Ale
John | Three Sheets
Justin | Sparkling Ale
Justin | Victoria Bitter

F-18
Example Database #2 (cont.)

Sells relation/table instance:


bar | beer | price
------------------+------------------+-------
Australia Hotel | Burragorang Bock | 3.50
Coogee Bay Hotel | New | 2.25
Coogee Bay Hotel | Old | 2.50
Coogee Bay Hotel | Sparkling Ale | 2.80
Coogee Bay Hotel | Victoria Bitter | 2.30
Lord Nelson | Three Sheets | 3.75
Lord Nelson | Old Admiral | 3.75
Marble Bar | New | 2.80
Marble Bar | Old | 2.80
Marble Bar | Victoria Bitter | 2.80
Regent Hotel | New | 2.20
Regent Hotel | Victoria Bitter | 2.20
Royal Hotel | New | 2.30
Royal Hotel | Old | 2.30
Royal Hotel | Victoria Bitter | 2.30

F-19
SQL Syntax

SQL definitions, queries and statements are composed of:

comments ... -- comments to end of line

identifiers ... similar to regular programming languages

keywords ... a large set (e.g. CREATE, SELECT, TABLE)

data types ... a small set (e.g. integer, varchar, date)

operators ... similar to regular programming languages

constants ... similar to regular programming languages

Similar means often the same, but not always ...

John, blue, its are strings

"Students", "Really Silly!" are identifiers

F-20
SQL Syntax (cont.)

While SQL identifiers and keywords are case-insensitive, we generally:

write keywords in upper case (until it becomes annoying)


e.g. SELECT, FROM, WHERE, CREATE, ...

write relation names with an initial upper-case letter


e.g. Customers, Students, Owns, EnrolledIn

write attribute names in all lower-case


e.g. id, name, partNumber, isActive

We follow the above conventions when writing programs.

We ignore the above conventions when typing in lectures.

F-21
SQL Keywords

A categorised list of frequently-used SQL92 keywords:


Querying Defining Data Changing Data
SELECT CREATE INSERT
FROM TABLE INTO
WHERE INTEGER VALUES
GROUP BY REAL UPDATE
HAVING VARCHAR SET
ORDER BY CHAR DELETE
DESC KEY DROP
EXISTS PRIMARY ALTER
IS NULL FOREIGN
NOT NULL REFERENCES
IN CONSTRAINT
DISTINCT CHECK
AS

There are 225 reserved words in SQL92 ... not a small language.

F-22
SQL Keywords (cont.)

A list of PostgreSQLs SQL keywords:


ALL DEFERRABLE IS OVERLAPS
ANALYSE DESC ISNULL PRIMARY
ANALYZE DISTINCT JOIN PUBLIC
AND DO LEADING REFERENCES
ANY ELSE LEFT RIGHT
AS END LIKE SELECT
ASC EXCEPT LIMIT SESSION_USER
BETWEEN FALSE NATURAL SOME
BINARY FOR NEW TABLE
BOTH FOREIGN NOT THEN
CASE FREEZE NOTNULL TO
CAST FROM NULL TRAILING
CHECK FULL OFF TRUE
COLLATE GROUP OFFSET UNION
COLUMN HAVING OLD UNIQUE
CONSTRAINT ILIKE ON USER
CROSS IN ONLY USING
CURRENT_DATE INITIALLY OR VERBOSE
CURRENT_TIME INNER ORDER WHEN
CURRENT_USER INTERSECT OUTER WHERE
DEFAULT INTO

Note that some SQL92 reserved words are not reserved words in PostgreSQL.
F-23
SQL Identifiers

Names are used to identify

database objects such as tables, attributes, views, ...

meta-objects such as types, functions, constraints, ...

Identifiers in SQL use similar conventions to programming languages i.e.


a sequence of alpha-numerics, starting with an alphabetic.

Can create arbitrary indentifiers by enclosing in "..."

Example identifiers:

employee student Courses


last_name "Thats a Great Name!"

Oracle SQL also allows unquoted hash (#) and dollar ($) in identifiers.
F-24
SQL Identifiers (cont.)

Since SQL does not distinguish case, the following are all treated as
being the same identifier:

employee Employee EmPlOyEe

Most RDBMSs will let you give the same name to different kinds of
objects (e.g. a table called Beer and an attribute called Beer).

Some common naming conventions:

name tables representing entitites via plural nouns


(e.g. Drinkers, TheDrinkers, AllDrinkers, ...)

name foreign key attributes after the table they refer to


(e.g. beer in the Sells relation)
F-25
Constants in SQL

Numeric constants have same syntax as programming languages, e.g.

10 3.14159 2e-5 6.022e23

String constants are written in single quotes, e.g.

John some text !%#%!$ OBrien


" [A-Z]{4}\d{4} a VeRy! LoNg String

PostgreSQL provides extended strings containing \ escapes, e.g.

E\n EO\Brien E[A-Z]{4}\\d{4} EJohn

Boolean constants: TRUE and FALSE

PostgreSQL also allows t, true, yes, f, false, no


F-26
Constants in SQL (cont.)

Other kinds of constants are typically written as strings.

Dates: 2008-04-13, Times: 13:30:15

Timestamps: 2004-10-19 10:23:54

PostgreSQL also recognises: January 26 11:05:10 1988 EST

Time intervals: 10 minutes, 5 days, 6 hours

PostgreSQL also has IP address, XML, etc. data types.

F-27
SQL Data Types

All attributes in SQL relations are typed (i.e. have domain specified)

SQL supports a small set of useful built-in data types:


text string, number (integer,real), date, boolean, binary

Various type conversions are available (e.g. date to string, string to


date, integer to real) and applied automatically where they make
sense.

Basic domain (type) checking is performed automatically.

The NULL value is treated as a member of all data types.

No structured data types are available (in SQL2).

F-28
SQL Data Types (cont.)

Various kinds of number types are available:

INTEGER (or INT), SMALLINT ... 32/16-bit integers

REAL, DOUBLE PRECISION ... 32/64-bit floating point

NUMBER(d,p) ... fixed-point reals (d digits, p after dec.pt.)

PostgreSQL also provides ...

serial: auto-generated integer values for primary keys

currency: fixed-point reals, displayed as strings $1,000.00

F-29
SQL Data Types (cont.)

Two string types are available:

CHAR(n) ... uses n bytes, left-justified, blank-padded

VARCHAR(n) ... uses 0..n bytes, no padding

String types can be coerced by blank-padding or truncation.

abc::CHAR(2) = ab abc::CHAR(4) = abc

PostgreSQL also provides TEXT for arbitrary strings

convenient; no need to worry how long is a name?

efficient (different to some other DBMSs)

but not part of SQL standard


F-30
SQL Data Types (cont.)

Dates are simply specially-formatted strings, with a range of operations


to implement date semantics.

Format is typically YYYY-MM-DD , e.g. 1998-08-02

Accepts other formats (and has format-conversion functions), but be-


ware of two-digit years (year 2000)

Comparison operators implement before (<) and after (>).

Subtraction counts number of days between two dates.

Etc. etc. ... consult your local SQL Manual

F-31
SQL Data Types (cont.)

PostgreSQL also supports several non-standard data types.

generic text string data i.e. text

arbitrary binary data (BLOBs) i.e. bytea

geometric data types e.g. point, circle, polygon, ...

Also, extends relational model so that a single attribute can contain an


array/matrix of values, e.g.
CREATE TABLE Employees (
empid integer primary key,
name text,
pay_rate float[]
);
INSERT INTO Employees VALUES
(1234, John, {35.00,45.00,60.00});
SELECT pay_rate[2] FROM Employees ...

F-32
Tuple and Set Literals

Tuple and set constants are both written as:

( val1, val2, val3, ... )

The correct interpretation is worked out from the context.

Examples:
INSERT INTO Student(stude#, name, course)
VALUES (2177364, Jack Smith, BSc)
-- tuple literal

CREATE TABLE Academics (


id integer,
name varchar(40),
job varchar(10) CHECK
job IN (Lecturer, Tutor);
-- set literal

F-33
Tuple and Set Literals (cont.)

SQL data types provide coarse-grained control over values.

If more fine-grained control over values is needed:

constraints can express more precise conditions

new data types can be defined

Examples:

CREATE DOMAIN PositiveInt AS INTEGER


CHECK (VALUE > 0);
CREATE TYPE Colour AS ENUM
(red,yellow,green,blue,violet);
CREATE TABLE T (
x Colour,
y PositiveInt,
z INTEGER CHECK (z BETWEEN 10 AND 20)
);
F-34
SQL Operators

Comparison operators are defined on all types.

< > <= >= = <>

Boolean operators AND, OR, NOT are available within WHERE expressions to
combine results of comparisons.

Comparison against NULL always yields FALSE.

Can explicitly test for NULL using:

attr IS NULL attr IS NOT NULL

Most data types also have type-specific operations available (e.g. arith-
metic for numbers).

Which operations are actually provided depends on the implementation.


F-35
SQL Operators (cont.)

String comparison:

str1 < str2 ... compare using dictionary order

str LIKE pattern ... matches string to pattern

Pattern-matching uses SQL-specific pattern expressions:

% matches anything (like .*)

_ matches any single char (like .)

F-36
SQL Operators (cont.)

Examples (using SQL92 pattern matching):

Name LIKE Ja% Name begins with Ja

Name LIKE _i% Name has i as 2nd letter

Name LIKE %o%o% Name contains two os

Name LIKE %ith Name ends with ith

Name LIKE John Name matches John

PostgreSQL also supports case-insensitive match: ILIKE

F-37
SQL Operators (cont.)

Most Unix-based DBMSs utilise the regexp library

to provide full POSIX regular expression matching

PostgreSQL uses the ~ operator for this:

Attr ~ RegExp

PostgreSQL also provides full-text searching (see doc)

F-38
SQL Operators (cont.)

Examples (using POSIX regular expressions):

Name ~ ^Ja Name begins with Ja

Name ~ ^.i Name has i as 2nd letter

Name ~ .*o.*o.* Name contains two os

Name ~ ith$ Name ends with ith

Name ~ John Name matches John

Also supports case-insensitive match via *~

F-39
SQL Operators (cont.)

String manipulation:

str1 || str2 ... concatenate two strings

LENGTH(str) ... return length of string

SUBSTR(str,start,count) ... extract chars from within string


Etc. etc. ... consult your local SQL Manual

Note that above operations are null-preserving (strict):

if any operand is NULL, result is NULL

beware of (a|| ||b|| ||c) ... NULL if any of a, b, c are null

F-40
SQL Operators (cont.)

Arithmetic operations:
+ - * / abs ceil floor power sqrt sin

Aggregations apply to a column of numbers in a relation:

COUNT(attr) ... number of rows in attr column

SUM(attr) ... sum of values for attr

AVG(attr) ... mean of values for attr

MIN/MAX(attr) ... min/max of values for attr

Note: COUNT applies to columns of non-numbers as well.

F-41
SQL Operators (cont.)

NULL in arithmetic operation always yields NULL, e.g.

3 + NULL = NULL 1 / NULL = NULL

NULL in aggregations is ignored (treated as unknown), e.g.

sum(1,2,3,4,5,6) = 21
sum(1,2,NULL,4,NULL,6) = 13
avg(1,2,3,4,5) = 3
avg(NULL,2,NULL,4) = 3

F-42
SQL Operators (cont.)

PostgeSQL provides several ways of dealing with NULL:

coalesce(V al1,V al2,...V aln)

returns first non-null value V ali

useful for providing a displayable value for nulls

nullif(V al1,V al2)

returns null if V al1 is equal to V al2

can be used to provide inverse of coalesce()

F-43
SQL: Schemas

F-44
Relational Data Definition

In order to give a relational data model, we need to:

describe tables

describe attributes that comprise tables

describe any constraints on the data

A relation schema defines an individual table.

A database schema is a collection of relation schemas that defines the


structure of and constraints on an entire database.

F-45
Relational Data Definition (cont.)

So far, we have given relational schemas informally, e.g.


individual relation schemas
Account(accountNo, branchName, balance)
Branch(branchNo, address, assets)
Customer(customerNo, name, address, homeBranch)
Owner(customer,branch)

database schemas

Foreign Key Primary Key


Account branchName accountNo balance

Foreign Key
Primary Key Owner account customer
Branch branchName address assets Foreign Key

Customer name address customerNo homeBranch


Primary Key Foreign Key
F-46
SQL Data Definition Language

SQL is normally considered to be a query language.

However, it also has a data definition sub-language (DDL) for describing


database schemas.

The SQL DDL allows us to specify:

names of tables

names and domains for attributes

various types of constraints (e.g. primary/foreign keys)

It also provides mechanisms for performance tuning (see later).

F-47
Defining a Database Schema

Relations (tables) are described using:

CREATE TABLE RelName (


attribute1 domain1 constraints,
attribute2 domain2 constraints,
...
table-level constraints, ...
)

where constraints can include details about primary keys, foreign keys, default values,
and constraints on attribute values.

This not only defines the table schema but also creates an empty in-
stance of the table.

Tables are removed via DROP TABLE RelName;


F-48
Defining a Database Schema (cont.)

Consider the relational diagram for the example schema:

Foreign Key Primary Key

Account branchName accountNo balance

Foreign Key

Primary Key Owner account customer


Branch branchName address assets Foreign Key

Customer name address customerNo homeBranch


Primary Key Foreign Key

This shows explicitly the connection between foreign key attributes and their corre-
sponding key attributes.

The SQL DDL provides notation for expressing this in the table definition.

F-49
Defining a Database Schema (cont.)

SQL DDL for the example schema:

CREATE TABLE Branch (


name varchar(30),
address varchar(50),
assets float,
PRIMARY KEY (name)
);

Note: name is required to be unique and not null

F-50
Defining a Database Schema (cont.)

More SQL DDL for the example schema:

CREATE TABLE Customer (


customerNo integer,
name varchar(40),
address varchar(50),
homeBranch varchar(30) not null,
PRIMARY KEY (customerNo),
FOREIGN KEY (homeBranch)
REFERENCES Branch(name)
);

Note: the not null captures total participation, i.e. every customer has a home
branch.

F-51
Defining a Database Schema (cont.)

More SQL DDL for the example schema:

CREATE TABLE Account (


accountNo char(5),
heldAtBranch varchar(30) not null,
balance float,
PRIMARY KEY (accountNo),
FOREIGN KEY (heldAtBranch)
REFERENCES Branch(name)
);

Note: the not null captures total participation, i.e. every accountis held at some
branch.

F-52
Defining a Database Schema (cont.)

More SQL DDL for the example schema:

CREATE TABLE OwnedBy (


account char(5),
customer integer,
PRIMARY KEY (account,customer),
FOREIGN KEY (account)
REFERENCES Account(accountNo),
FOREIGN KEY (customer)
REFERENCES Customer(customerNo)
);

Note: it is not possible in SQL to capture the semantics that Accounts are required
to be owned by some Customer.

F-53
Declaring Keys

Primary keys:

if a single attribute, declare with attribute, e.g.


accountNo char(5) PRIMARY KEY,

if several attributes, declare with table constraints, e.g.


name varchar(40),
address varchar(50),
...
PRIMARY KEY (name,address)

F-54
Declaring Keys (cont.)

If we want to define a numeric primary key, e.g.

CREATE TABLE R ( id INTEGER PRIMARY KEY, ... );

we still have the problem of generating unique values.

Most DBMSs provide a mechanism to

generating a squence of unique values

ensuring that tuples dont get assigned the same value

PostgreSQLs version:

CREATE TABLE R ( id SERIAL PRIMARY KEY, ... );

F-55
Declaring Keys (cont.)

Foreign keys:

if a single attribute, specify Relation(Attribute), e.g.


customer integer
REFERENCES Customer(customerNo)
-- or
customer integer REFERENCES Customer
-- or
FOREIGN KEY (customer)
REFERENCES Customer(customerNo)

F-56
Declaring Keys (cont.)

Foreign keys: (cont)

if several attributes, specify in table constraints, e.g.


name varchar(40),
addr varchar(50),
...
FOREIGN KEY (name,addr)
REFERENCES Person(name,address)
If defining foreign keys with table constraints, must use FOREIGN KEY keywords.

F-57
Declaring Keys (cont.)

Declaring foreign keys assures referential integrity.

Example:

Account.branchName refers to primary key of Branch

If we want to delete a tuple from Branch, and there are tuples in Account
that refer to it, we could ...

reject the deletion (PostgreSQL/Oracle default behaviour)

set-NULL the foreign key attributes in Account records

cascade the deletion and remove Account records

F-58
Declaring Keys (cont.)

Can force the alternative delete behaviours via e.g.

-- to cascade deletes
customer integer
REFERENCES Customer(customerNo)
ON DELETE CASCADE

-- to set foreign keys to NULL


customer integer
REFERENCES Customer(customerNo)
ON DELETE SET NULL

F-59
Declaring Keys (cont.)

Example of different deletion strategies:

F-60
Branch
branchName address assets Account After deletion with SET NULL

Downtown Brooklyn 9000000 branchName accountNo balance

Redwood Palo Alto 2100000 Downtown A101 500


Perryridge Horseneck 1700000 NULL A215 700
Mianus Horseneck 400000 Perryridge A102 400
Round Hill Horseneck 8000000 NULL A305 350
North Town Rye 3700000 Brighton A201 900
Brighton Brooklyn 7100000 Redwood A222 700

Account Original relation


branchName accountNo balance

Downtown A101 500 Account After deletion with CASCADE

Round Hill A215 700 branchName accountNo balance

Perryridge A102 400 Downtown A101 500


Round Hill A305 350 Perryridge A102 400
Brighton A201 900 Brighton A201 900
Redwood A222 700 Redwood A222 700
Other Attribute Properties

Can specify that an attribute must have a non-null value, e.g.

barcode varchar(20) NOT NULL,


price float NOT NULL

Can specify that an attribute must have a unique value, e.g.

barcode varchar(20) UNIQUE,


isbn varchar(15) UNIQUE NOT NULL

Primary keys are automatically UNIQUE NOT NULL.

F-61
Other Attribute Properties (cont.)

Can specify a DEFAULT value for an attribute

will be assigned to attribute if no value is supplied during insert

Example:
CREATE TABLE Account (
accountNo char(5) PRIMARY KEY,
branchName varchar(30)
REFERENCES Branch(name)
DEFAULT Central,
balance float DEFAULT 0.0
);

INSERT INTO Account(accountNo) VALUES (A-456)


-- produces the tuple
Account(A-456,Central,0.0)

F-62
Attribute Value Constraints

In fact, NOT NULL is a special case of a constraint on the value that an


attribute is allowed to take.

SQL has a more general mechanism for specifying such constraints.

attrName type CHECK ( condition )

The Condition can be arbitrarily complex, and may even involve other
attributes, relations and SELECT queries.

(but many RDBMSs (e.g. Oracle and PostgreSQL) dont allow SELECT in CHECK)

F-63
Attribute Value Constraints (cont.)

Example:

CREATE TABLE Example


(
gender CHAR(1) CHECK (gender IN (M,F)),
Xvalue INT NOT NULL,
Yvalue INT CHECK (Yvalue > Xvalue),
Zvalue FLOAT CHECK (Zvalue >
(SELECT MAX(price)
FROM Sells)
)
);

F-64
Named Constraints

Any constraint in an SQL DDL can be named via

CONSTRAINT constraintName constraint

Example:

CREATE TABLE Example


(
gender CHAR(1) CONSTRAINT GenderCheck
CHECK (gender IN (M,F)),
Xvalue INT NOT NULL,
Yvalue INT CONSTRAINT XYOrder
CHECK (Yvalue > Xvalue),
);

F-65
SQL: Building Databases

F-66
Creating Databases

Mechanism for creating databases is typically DBMS-specific.

Many implement a (non-standard) SQL-like statement:

CREATE DATABASE DBname;

Many provide an external command, e.g PostgreSQLs

$ createdb DBname

Produces an empty database (no tables, etc) called DBname

F-67
Creating Databases (cont.)

A database can be completely removed (no backup) via

$ dropdb DBname

This removes all tuples, all tables, all traces of DBname

Tables can be removed from a database schema via:

DROP T ableN ame

All tuples can be removed from a table via:

DELETE FROM T ableN ame

F-68
Creating Databases (cont.)

Loading a schema with PostgreSQL:

$ createdb mydb
$ psql mydb
...
mydb=# \i schema.sql
...

or

$ psql -f schema.sql mydb

Running the above as:

$ psql -a -f schema.sql mydb

intersperses messages with the schema definition.

Useful for debugging, since errors appear in context.


F-69
Creating Databases (cont.)

Re-loading schemas is not well-supported in PostgreSQL.

Simplest approach is:

$ dropdb mydb
$ createdb mydb
$ psql -f schema.sql mydb

An alternative is to leave DB but drop all tables:

$ psql mydb
...
mydb=# drop Table1;
mydb=# drop Table2;
etc. etc. in correct order
mydb=# \i schema.sql
F-70
...

Later, well see how to write functions to automate this.


Creating Databases (cont.)

The entire contents of a database may be dumped:

$ pg dump mydb > mydb.dump

Dumps all definitions needed to re-create entire DB

table definitions (create table)

constraints, including PKs and FKs

all data from all tables

domains, stored procedures, triggers, etc.

Some things change appearance, but mean the same thing


(e.g. varchar(30) becomes character varying(30), etc.)

F-71
Creating Databases (cont.)

Dumps may be used for backup/restore or copying DBs

$ pg dump mydb > mydb.dump -- backup


$ createdb newdb
$ psql newdb -f mydb.dump -- copy

Result: newdb is a snapshot/copy of mydb.

however, different object identifiers

as changes are made, the two DBs will diverge

F-72
Data Modification in SQL

SQL provides mechanisms for modifying data (tuples) in tables:

INSERT ... add a new tuple into a table

DELETE ... remove tuples from a table (via condition)

UPDATE ... modify values in exiting tuples (via condition)

Constraint checking is applied automatically on any change.

(See description of relational model for details of which checking applied when)

F-73
Data Modification in SQL (cont.)

Also provides mechanisms for modifying table meta-data:

CREATE TABLE ... create a new empty table

DROP TABLE ... remove table from database (incl. tuples)

ALTER TABLE ... change properties of existing table

Analogous operations are available on other kinds of database objects,


e.g.

CREATE VIEW, CREATE FUNCTION, CREATE RULE, ...

DROP VIEW, DROP FUNCTION, DROP RULE, ...

no UPDATE on these; use CREATE OR REPLACE

F-74
Insertion

Accomplished via the INSERT operation:

INSERT INTO RelationName


VALUES (val1, val2, val3, ...)

INSERT INTO RelationN ame(Attr1 , Attr2, ...)


VALUES (valF orAttr1, valF orAttr2, ...)

Each form adds a single new tuple into RelationN ame.

F-75
Insertion (cont.)

INSERT INTO R VALUES (v1,v2,...)

values must be supplied for all attributes of R

in same order as appear in CREATE TABLE statement

INSERT INTO R(A1,A2,...) VALUES (v1,v2,...)

can specify any subset of attributes of R

values must match attribute specification order

unspecified attributes are assigned default or null

F-76
Insertion (cont.)

Example: Add the fact that Justin likes Old.

INSERT INTO Likes VALUES (Justin,Old);


-- or --
INSERT INTO Likes(drinker,beer)
VALUES(Justin, Old);
-- or --
INSERT INTO Likes(beer,drinker)
VALUES(Old,Justin);

Example: Add a new drinker with unknown phone number.

INSERT INTO Drinkers(name,addr)


VALUES(Frank,Coogee);
-- which inserts the tuple ...
(Frank, Coogee, null)
F-77
Insertion (cont.)

Example: insertion with default values

ALTER TABLE Likes


ALTER COLUMN beer SET DEFAULT New;
ALTER TABLE Likes
ALTER COLUMN drinker SET DEFAULT Joe;

INSERT INTO Likes(drinker)


VALUES(Fred);
INSERT INTO Likes(beer)
VALUES(Sparkling Ale);

-- inserts the two new tuples ...


(Fred, New)
(Joe, Sparkling Ale)
F-78
Insertion (cont.)

Example: insertion with insufficient values.

E.g. specify that drinkers phone numbers cannot be NULL.

ALTER TABLE Drinkers


ALTER COLUMN phone SET NOT NULL;

And then try to insert a new drinker whose phone number we dont
know:

INSERT INTO Drinkers(name,addr)


VALUES (Zoe, Manly);

ERROR: ExecInsert: Fail to add null value


in not null attribute phone
F-79
Insertion from Queries

Can use the result of a query to perform insertion of multiple tuples at


once.

INSERT INTO Relation ( Subquery );

Tuples of Subquery must be projected into a suitable format (i.e. match-


ing the tuple-type of Relation ).

F-80
Insertion from Queries (cont.)

Example: Create a relation of potential drinking buddies (i.e. people


who go to the same bars as each other).
CREATE TABLE DrinkingBuddies (
drinker varchar(20) references Drinkers(name),
buddy varchar(20) references Drinkers(name),
primary key (drinker,buddy)
);

INSERT INTO DrinkingBuddies (


SELECT a.drinker AS drinker,
b.drinker AS buddy
FROM Frequents a, Frequents b
WHERE a.bar = b.bar AND a.drinker <> b.drinker
);

Note: this is better done as a view (treat this as a materialized view).

F-81
Bulk Insertion of Data

Tuples may be inserted individually:

insert into Stuff(x,y,s) values (2,4,green);


insert into Stuff(x,y,s) values (4,8,null);
insert into Stuff(x,y,s) values (8,null,red);
...

but this is tedious if 1000s of tuples are involved.

It is also inefficient, because all relevant constraints are checked after


insertion of each tuple.

F-82
Bulk Insertion of Data (cont.)

Most DBMSs provide non-SQL methods for bulk insertion:


using a compact representation for each tuple
loading all tuples without constraint checking
doing all constraint checks at the end

Downside: if even one tuple is buggy, none are inserted.

Example: PostgreSQLs copy statement:

copy Stuff(x,y,s) from stdin;


2 4 green
4 8 \N
8 \N red
\.

Can also copy from a named file.


F-83
Deletion

Accomplished via the DELETE operation:

DELETE FROM Relation


WHERE Condition

Removes all tuples from Relation that satisfy Condition.

Example: Justin no longer likes Sparkling Ale.

DELETE FROM Likes


WHERE drinker = Justin
AND beer = Sparkling Ale;

Special case: Make relation R empty.

DELETE FROM R;
F-84
Deletion (cont.)

Example: remove all expensive beers from sale.

DELETE FROM Sells


WHERE price >= 3.00;

Example: remove all drinkers with no fixed address.

DELETE FROM Drinkers


WHERE addr IS NULL;

This fails if such Drinkers are referenced in other tables.

F-85
Semantics of Deletion

Method A for DELETE FROM R WHERE Cond :

FOR EACH tuple T in R DO


IF T satisfies Cond THEN
remove T from relation R
END
END

Method B for DELETE FROM R WHERE Cond :

FOR EACH tuple T in R DO


IF T satisfies Cond THEN
make a note of this T
END
END
FOR EACH noted tuple T DO
F-86
remove T from relation R
END

Does it matter which method is used?


Semantics of Deletion (cont.)

Example: Delete all beers for which there is another beer by the same
manufacturer.

DELETE FROM Beers b


WHERE EXISTS
(SELECT name
FROM Beers
WHERE manf = b.manf
AND name <> b.name);

Does the query result in ...

deletion of all beers by brewers who make multiple beers

deletion of all but the last beer by such brewers

Note: PostgreSQL disallows deletions with correlated subqueries (the


FROM clause can be only a table name).
F-87
Semantics of Deletion (cont.)

Example continued ...

Different results come from different evaluation methods ..

Method A: iterate and evaluate condition for each beer

consider a manufacturer M who makes two beers A and B

when we reach A, there are two beers by M , so delete A

when we reach B, there are no other beers by M , so not deleted

Method B: evalute condition and then do all deletions

both A and B test positive, and so both are deleted

Most RDBMSs use Method B, which matches natural semantics of DELETE.

F-88
Updates

An update allows you to modify values of specified attributes in specified


tuples of a relation:

UPDATE R
SET list of assignments
WHERE Condition

Each tuple in relation R that satisfies Condition has the assignments


applied to it.

Assignments may:

assign constant values to attributes,


e.g. SET price = 2.00

use existing values in the tuple to compute new values,


e.g. SET price = price * 0.5
F-89
Updates (cont.)

Example: Adam changes his phone number.

UPDATE Drinkers
SET phone = 9385-2222
WHERE name = Adam;

Example: John moves to Coogee.

UPDATE Drinkers
SET addr = Coogee,
phone = 9665-4321
WHERE name = John;

F-90
Updates (cont.)

Can update many tuples at once (all tuples that satisfy condition)

Example: Make $3 the maximum price for beer.

UPDATE Sells
SET price = 3.00
WHERE price > 3.00;

Example: Increase beer prices by 10%.

UPDATE Sells
SET price = price * 1.10;

F-91
Changing Tables

Accomplished via the ALTER TABLE operation:

ALTER TABLE Relation Modifications

Some possible modifications are:

add a new column (attribute) (set value to NULL unless default given)

change properties of an existing attribute (e.g. constraints)

remove an attribute

F-92
Changing Tables (cont.)

Example: Add phone numbers for hotels.

ALTER TABLE Bars


ADD phone char(10) DEFAULT Unlisted;

This appends a new column to the table and sets value for this attribute
to Unlisted in every tuple.

Specific phone numbers can subsequently be added via:

UPDATE Bars
SET phone = 9665-0000
WHERE name = Coogee Bay Hotel;

If no default value is given, new column is set to all NULL.


F-93
For More Details ...

Full details are in the PostgreSQL 8.3.0 Reference Manual.

See the section SQL Commands, which has entries for

INSERT, DELETE, UPDATE

CREATE X, DROP Y , ALTER Z


You will become very familiar with some of these commands by end of session.

F-94
SQL: Queries

F-95
Queries

A query is a declarative program that retrieves data from a database.

Analogous to an expression in relational algebra.

But SQL does not implement relational algebra precisely.

Queries are used in two ways in RDBMSs:

interactively (e.g. in psql)

the entire result is displayed in tabular format on the output

by a program (e.g. in a PLpgSQL function)

the result tuples are consumed one-at-a-time by the program

F-96
Queries in SQL

The most common kind of SQL statement is the SELECT query:

SELECT attributes
FROM relations
WHERE condition

The result of this statement is a relation, which is typically displayed on


output.

The SELECT statement contains the functionality of select, project and


join from the relational algebra.

F-97
SELECT Example

The question What beers are made by Tooheys?, can be phrased:


SELECT Name FROM Beers WHERE Manf = Tooheys;

This gives a subset of the Beers relation, displayed as:


name
-------------
New
Old
Red
Sheaf Stout

Notes:
upper- and lower-case are not distinguished, except in strings.
quotes are escaped by doubling them ( is like C \)

F-98
Semantics of SELECT

For SQL SELECT statement on a single relation:

SELECT Attributes
FROM R
WHERE Condition

Formal semantics (relational algebra):

P roj[Attributes](Sel[Condition](R))

F-99
Semantics of SELECT (cont.)

Operationally, we think in terms of a tuple variable ranging over all


tuples of the relation.

Operational semantics:

FOR EACH tuple T in R DO


check whether T satisfies the condition
in the WHERE clause
IF it does THEN
print the attributes of T that are
specified in the SELECT clause
END
END

F-100
Projection in SQL

For a relation R and attributes X R, the relational algebra expression


X (R) is implemented in SQL as:

SELECT X FROM R

Example: Names of drinkers = N ame(Drinkers)

SELECT Name FROM Drinkers;

name
--------
Adam
Gernot
John
Justin
F-101
Projection in SQL (cont.)

Example: Names/addresses of drinkers = N ame,Addr (Drinkers)

SELECT Name, Addr FROM Drinkers;

name | addr
--------+----------
Adam | Randwick
Gernot | Newtown
John | Clovelly
Justin | Mosman

F-102
Projection in SQL (cont.)

The symbol * denotes a list of all attributes.

Example: All information about drinkers = (Drinkers)

SELECT * FROM Drinkers;

name | addr | phone


--------+----------+------------
Adam | Randwick | 9385-4444
Gernot | Newtown | 9415-3378
John | Clovelly | 9665-1234
Justin | Mosman | 9845-4321

F-103
Renaming via AS

SQL implements renaming () via the AS clause within SELECT.

Example: rename Beers(name,manf) to Beers(beer,brewer)

SELECT name AS beer, manf AS Brewer


FROM Beers;

beer | brewer
---------------------+---------------
80/- | Caledonian
Bigfoot Barley Wine | Sierra Nevada
Burragorang Bock | George IV Inn
Crown Lager | Carlton
Fosters Lager | Carlton
...
F-104
Expressions as Values in Columns

AS can also be used to introduce computed values (generalised projection)

Example: display beer prices in Yen, rather than dollars


SELECT bar, beer, price*120 AS PriceInYen FROM Sells;

bar | beer | priceinyen


------------------+------------------+------------------
Australia Hotel | Burragorang Bock | 420
Coogee Bay Hotel | New | 270
Coogee Bay Hotel | Old | 300
Coogee Bay Hotel | Sparkling Ale | 335.999994277954
Coogee Bay Hotel | Victoria Bitter | 275.999994277954
Lord Nelson | Three Sheets | 450
Lord Nelson | Old Admiral | 450
...

F-105
Text in Result Table

Trick: to put specific text in output columns

use string constant expression with AS

Example: using Likes(drinker, beer)


SELECT drinker, likes Coopers AS WhoLikes
FROM Likes
WHERE beer = Sparkling Ale;

drinker | wholikes
---------+----------------
Gernot | likes Coopers
Justin | likes Coopers

F-106
Selection in SQL

The relational algebra expression Cond(Rel) is implemented in SQL


as:

SELECT * FROM Rel WHERE Cond

Example: All about the bars at The Rocks


SELECT * FROM Bars WHERE Addr=The Rocks;

name | addr | license


-----------------+-----------+---------
Australia Hotel | The Rocks | 123456
Lord Nelson | The Rocks | 123888
(2 rows)

The condition can be an arbitrarily complex boolean-valued expression


using the operators mentioned previously.

F-107
Selection in SQL (cont.)

Example: Find the price that The Regent charges for New
SELECT price
FROM Sells
WHERE bar = Regent Hotel AND beer = New;

price
-------
2.2

This can be formatted better via to\_char, e.g.


SELECT to_char(price,$99.99) AS price
FROM Sells
WHERE bar = Regent Hotel AND beer = New;

price
---------
$ 2.20

to_char() supports a wide range of conversions.


F-108
Multi-relation SELECT Queries

Syntax is similar to simple SELECT queries:

SELECT Attributes
FROM R1, R2, ...
WHERE Condition

Difference is that FROM clause contains a list of relations.

Also, the condition typically includes cross-relation (join) conditions.

F-109
Multi-relation SELECT Queries (cont.)

Example: Find the brewers whose beers John likes.

SELECT Manf as brewer


FROM Likes, Beers
WHERE beer = name AND drinker = John;

brewer
---------------
Caledonian
Sierra Nevada
Sierra Nevada
Lord Nelson

Note: duplicates could be eliminated by using DISTINCT.

F-110
Multi-relation SELECT Queries (cont.)

The above example corresponds to a relational algebra evaluation like:

BeerDrinkers = Likes Join[beer=name] Beers


JohnsBeers = Sel[drinker=John](BeerDrinkers)
Brewers = Proj[manf](JohnsBeers)
Result = Rename[manf->brewer](Brewers)

The SQL compiler knows how to translate tests

involving attributes from two relations into a join

involving attributes from one relations into a selection

F-111
Semantics of Multi-Relation SELECT

For SQL SELECT statement on several relations:

SELECT Attributes
FROM R1, R2, ... Rn
WHERE Condition

Formal semantics (relational algebra):

P roj[Attributes](Sel[Condition](R1 R2 ...Rn))

F-112
Semantics of Multi-Relation SELECT (cont.)

Operational semantics of SELECT:


FOR EACH tuple T1 in R1 DO
FOR EACH tuple T2 in R2 DO
...
check WHERE condition for current
assignment of T1, T2, ... vars
IF holds THEN
print attributes of T1, T2, ...
specified in SELECT
END
...
END
END

Requires one tuple variable for each relation, and nested loops over relations. This is
not how its actually computed!

F-113
Name Clashes in Conditions

If a selection condition

refers to two relations

the relations have attributes with the same name

use the relation name to disambiguate.

Example: Which hotels have the same name as a beer?

SELECT Bars.name
FROM Bars, Beers
WHERE Bars.name = Beers.name;

(The answer to this query is empty, but there is nothing special about this)

F-114
Name Clashes in Conditions (cont.)

Can use such qualified names, even if there is no ambiguity:

SELECT Sells.beer
FROM Sells
WHERE Sells.price > 3.00;

Advice:

qualify attribute names only when absolutely necessary

Note:

SQLs AS operator is only for renaming output

it provides no help with disambiguation

F-115
Explicit Tuple Variables

The relation-dot-attribute convention doesnt help if we happen to use


the same relation twice in a SELECT.

To handle this, we need to define new names for each instance of the
relation in the FROM clause.

Syntax:

SELECT r1.a, r2.b


FROM R r1, R r2
WHERE r1.a = r2.a

F-116
Explicit Tuple Variables (cont.)

Example: Find pairs of beers by the same manufacturer.


SELECT b1.name, b2.name
FROM Beers b1, Beers b2
WHERE b1.manf = b2.manf AND b1.name < b2.name;

name | name
---------------------+------------------
Crown Lager | Fosters Lager
Crown Lager | Invalid Stout
Crown Lager | Melbourne Bitter
Crown Lager | Victoria Bitter
Fosters Lager | Invalid Stout
Fosters Lager | Melbourne Bitter
...

The second part of the condition is used to avoid:


pairing a beer with itself e.g. (New,New)
same pairs with different order e.g. (New,Old) (Old,New)

F-117
Explicit Tuple Variables (cont.)

A common alternative syntax for

SELECT r1.a, r2.b


FROM R r1, R r2
WHERE r1.a = r2.a

uses the as keyword

SELECT r1.a, r2.b


FROM R as r1, R as r2
WHERE r1.a = r2.a

F-118
Explicit Joins

SQL supports syntax for explicit joins:

SELECT...FROM A natural join B


SELECT...FROM A join B using (A1,...,An)
SELECT...FROM A join B on Condition

The natural join and join using forms assume that the join attributes
are named the same in each relation.

F-119
Explicit Joins (cont.)

Example: Find the beers sold at bars where John drinks

SELECT Sells.bar, beer, price


FROM Sells, Frequents
WHERE drinker = John
AND Sells.bar = Frequents.bar;

could also be expressed as

SELECT bar, beer, price


FROM Sells natural join Frequents
WHERE drinker=John;
-- joins on the only common attribute: bar

F-120
Explicit Joins (cont.)

The example could also be expressed as

SELECT bar, beer, price


FROM Sells join Frequents using (bar)
WHERE drinker=John;
-- only one bar attribute in join result

or

SELECT Sells.bar, beer, price


FROM Sells join Frequents
on Sells.bar = Frequents.bar
WHERE drinker=John;
-- bar attribute occurs twice in join result

F-121
Outer Join

Join only produces tuples where there are matching values in both of
the relations involved in the join.

Often, it is useful to produce results for all tuples in one relation, even
if it has no matches in the other.

Consider the query: for each region, find out who drinks there.

F-122
Outer Join (cont.)

A regular join only gives results for regions where people drink.
SELECT B.addr, F.drinker
FROM Bars as B join Frequents as F
on (bar = name)
ORDER BY addr;

addr | drinker
-----------+---------
Coogee | Adam
Coogee | John
Kingsford | Justin
Sydney | Justin
The Rocks | John

But what if we want a result that shows all regions, even if there are
no drinkers there?

F-123
Outer Join (cont.)

An outer join solves this problem.

For R OUTER JOIN S

all tuples in R have an entry in the result

if a tuple from R matches a tuple in S,


we get the normal join result tuple

if a tuple from R has no matches in S,


the attributes supplied by S are NULL

This outer join variant is called LEFT OUTER JOIN.

F-124
Outer Join (cont.)

Solving the example query with an outer join:


SELECT B.addr, F.drinker
FROM Bars as B
left outer join
Frequents as F
on (bar = name)
ORDER BY B.addr;

addr | drinker
------------+---------
Coogee | Adam
Coogee | John
Kingsford | Justin
Randwick |
Sydney | Justin
The Rocks | John

Note that Randwick is now mentioned (because of the Royal Hotel).

F-125
Outer Join (cont.)

Many RDBMSs provide three variants of outer join:

R LEFT OUTER JOIN S

behaves as described above

R RIGHT OUTER JOIN S

includes all tuples from S in the result

NULL-fills any S tuples with no matches in R

R FULL OUTER JOIN S

includes all tuples from R and S in the result

those without matches in other relation are NULL-filled


F-126
Subqueries

The result of a SELECT-FROM-WHERE query can be used in the WHERE clause


of another query.

Simplest Case: Subquery returns a single, unary tuple

Can treat the result as a single constant value and use in expressions.

Syntax:

SELECT *
FROM R
WHERE R.a = (SELECT x FROM S WHERE Cond)
-- assume only one result

F-127
Subqueries (cont.)

Example: Find bars that serve New at the same price as the Coogee
Bay Hotel charges for VB.
SELECT bar
FROM Sells
WHERE beer = New AND
price =
(SELECT price
FROM Sells
WHERE bar = Coogee Bay Hotel
AND beer = Victoria Bitter);

bar
-------------
Royal Hotel

The inner query finds the price of VB at the CBH, and uses this as an argument to a
test in the outer query.

F-128
Subqueries (cont.)

Note the potential ambiguity in references to attributes of Sells


SELECT bar
FROM Sells
WHERE beer = New AND
price =
(SELECT price
FROM Sells
WHERE bar = Coogee Bay Hotel
AND beer = Victoria Bitter);

This introduces notions of scope: an attribute refers to the most closely


nested relation with that attribute.

Parentheses around the subquery are required (and set the scope).

F-129
Subqueries (cont.)

Note also that the query could be answered via:


SELECT s1.bar
FROM Sells as s1, Sells as s2
WHERE s1.beer = New
AND s1.price = s2.price
AND s2.bar = Coogee Bay Hotel
AND s2.beer = Victoria Bitter;

In general, expressing a query via joins will be much more efficient than
expressing it with sub-queries.

F-130
Subqueries (cont.)

Complex Case: Subquery returns multiple unary tuples.

Treat it as a list of values, and use the various operators on lists/sets


(e.g. IN).

Complex Case: Subquery returns a relation.

Most of the list operators also work on relations.

F-131
The IN Operator

Tests whether a specified tuple is contained in a relation.

tuple IN relation is true iff the tuple is contained in the relation.

Conversely for tuple NOT IN relation.

Syntax:

SELECT *
FROM R
WHERE R.a IN (SELECT x FROM S WHERE Cond)
-- assume multiple results

F-132
The IN Operator (cont.)

Example: Find the name and brewer of beers that John likes.

SELECT *
FROM Beers
WHERE name IN
(SELECT beer
FROM Likes
WHERE drinker = John);

name | manf
---------------------+---------------
80/- | Caledonian
Bigfoot Barley Wine | Sierra Nevada
Pale Ale | Sierra Nevada
Three Sheets | Lord Nelson

The subexpression answers the question What are the names of the
beers that John likes?
F-133
The IN Operator (cont.)

Note that this query can be answered equally well without using IN.

SELECT Beers.name, Beers.manf


FROM Beers, Likes
WHERE Likes.drinker = John AND
Likes.beer = Beers.name;

name | manf
---------------------+---------------
80/- | Caledonian
Bigfoot Barley Wine | Sierra Nevada
Pale Ale | Sierra Nevada
Three Sheets | Lord Nelson

The version with the subquery corresponds more closely to the way the
original query was expressed, and is probably more natural.

The subquery version is, however, potentially less efficient.


F-134
The EXISTS Function

EXISTS(relation) is true iff the relation is non-empty.

Example: Find the beers that are the unique beer by their manufac-
turer.

SELECT name, manf


FROM Beers b1
WHERE NOT EXISTS
(SELECT *
FROM Beers
WHERE manf = b1.manf
AND name != b1.name);

Note the scoping rule: to refer to outer Beers in the inner subquery, we
need to define a named tuple variable (in this example b1).

A subquery that refers to values from a surrounding query is called a


correlated subquery.
F-135
Quantifiers

ANY and ALL behave as existential and universal quantifiers respectively.

Example: Find the beers sold for the highest price.

SELECT beer
FROM Sells
WHERE price >=
ALL(SELECT price FROM sells);

Beware: in common use, any and all are often synonyms.

E.g. Im better than any of you vs. Im better than all of you.

F-136
Union, Intersection, Difference

SQL implements the standard set operations on union-compatible


relations:

R1 UNION R2 set of tuples in either R1 or R2

R1 INTERSECT R2 set of tuples in both R1 and R2

R1 EXCEPT R2 set of tuples in R1 but not R2

Oracle deviates from the SQL standard and uses MINUS for EXCEPT; PostgreSQL follows
the standard.

F-137
Union, Intersection, Difference (cont.)

Example: Find the drinkers and beers such that the drinker likes the
beer and frequents a bar that sells it.

(SELECT * FROM Likes)


INTERSECT
(SELECT drinker,beer
FROM Sells natural join Frequents);

drinker | beer
---------+-----------------
Adam | New
John | Three Sheets
Justin | Victoria Bitter

F-138
Bag Semantics of SQL

An SQL relation is really a bag (multiset):

it may contain the same tuple more than once

unlike lists, there is no specified order on the elements

example: {1, 2, 1, 3} is a bag and is not a set

This changes the semantics of the set operators UNION, INTERSECT and
MINUS.

F-139
Bag Semantics of SQL (cont.)

Bag Union

Sum the times an element appears in the two bags

example: {1, 2, 1} {1, 2, 3} = {1, 1, 1, 2, 2, 3}

Bag Intersection

Take the minimum number of occurrences from each bag.

example: {1, 2, 1} {1, 2, 3} = {1, 2}

Bag Difference

Proper-subract the number of occurrences in the two bags.

example: {1, 2, 1} {1, 2, 3} = {1}


F-140
Forcing Bag/Set Semantics

Default result for SELECT-FROM-WHERE is a bag.

Default result for UNION, INTERSECT, MINUS is a set.

Why the difference?

A bag can be produced faster because no need to worry about elimi-


nating duplicates (which typically requires sorting).

Can force set semantics with SELECT DISTINCT.

Can force bag semantics with UNION ALL, ...

F-141
Forcing Bag/Set Semantics (cont.)

Example: What beer manufacturers are there?

SELECT DISTINCT manf FROM Beers;

manf
---------------
Caledonian
Carlton
Cascade
Coopers
George IV Inn
Lord Nelson
Sierra Nevada
Tooheys

Note that the result is sorted.

If we omit DISTINCT, we get 18 unsorted tuples in the result.


F-142
Division

Not all SQL implementations provide a divide operator, but the same
effect can be achieved by combination of existing operations.

Example: Find bars that each sell all of the beers Justin likes.

SELECT DISTINCT a.bar


FROM Sells a
WHERE NOT EXISTS (
(SELECT beer FROM Likes
WHERE drinker = Justin)
EXCEPT
(SELECT beer FROM Sells b
WHERE bar = a.bar)
);

F-143
Selection with Aggregation

Selection clauses can contain aggregation operations.

Example: What is the average price of New?

SELECT AVG(price)
FROM Sells
WHERE beer = New;

avg
------------------
2.38749998807907
Note:
the bag semantics of SQL gives the correct result here
the price for New in all hotels will be included, even if two hotels sell it at the
same price
if we used set semantics, wed get the average of all the different prices for New.
F-144
Selection with Aggregation (cont.)

If we want set semantics, we can force using DISTINCT.

Example: How many different bars sell beer?

SELECT COUNT(DISTINCT bar)


FROM Sells;

count
-------
6

Without DISTINCT, the result is 15 ... the number of entries in the Sells
table.

F-145
Aggregation operators

The following operators apply to a list (bag) of numeric values in one


column of a relation:

SUM AVG MIN MAX COUNT

The notation COUNT(*) gives the number of tuples in a relation.

Example: How many different beers are there?

SELECT COUNT(*) FROM Beers;

count
-------
18

F-146
Grouping

SELECT-FROM-WHERE can be followed by GROUP BY to:

partition result relation into groups


(according to values of specified attribute)

treat each group separately in computing aggregations

Example: How many beers does each brewer make?

There is one entry for each beer by each brewer in the Beers table ...

F-147
Grouping (cont.)

The following gives us a list of brewers:

SELECT manf FROM Beers;

The number of occurrences of each brewer is the number of beers that


they make.

Ordering the list makes it much easier to work out:

SELECT manf FROM Beers ORDER BY manf;

but we still need to count length of runs by hand.

F-148
Grouping (cont.)

If we group the runs, we can count(*) them:

SELECT manf, COUNT(manf)


FROM Beers
GROUP BY manf;

manf | count
---------------+-------
Caledonian | 1
Carlton | 5
Cascade | 1
Coopers | 2
George IV Inn | 1
Lord Nelson | 2
Sierra Nevada | 2
Tooheys | 4
F-149
Grouping (cont.)

GROUP BY is used as follows:

SELECT attributes/aggregations
FROM relations
WHERE condition
GROUP BY attribute

Semantics:

1. apply product and selection as for SELECT-FROM-WHERE

2. partition result into groups based on values of attribute

3. apply any aggregation separately to each group

F-150
Grouping (cont.)

The query
select manf,count(manf) from Beers group by manf;

first produces a partitioned relation and then counts the number of


tuples in each partition:

Name Manf Name Manf


80 Caledonian 1 Burragorang Bock George IV Inn 1

Crown Lager Carlton Old Admiral Lord Nelson 2


Fosters Lager Carlton Three Sheets Lord Nelson
Invalid Stout Carlton 5
Melbourne Bitter Carlton Bigfoot Barley Wine Sierra Nevada 2
Victoria Bitter Carlton Pale Ale Sierra Nevada

Premium Lager Cascade 1 New Tooheys


Old Tooheys 4
Sparkling Ale Coopers Red Tooheys
2
Stout Coopers Sheaf Stout Tooheys

F-151
Grouping (cont.)

Grouping is typically used in queries involving the phrase for each.

Example: For each drinker, find the average price of New at the bars
they go to.
SELECT drinker, AVG(price) as "Avg.Price"
FROM Frequents, Sells
WHERE beer = New
AND Frequents.bar = Sells.bar
GROUP BY drinker;

drinker | Avg.Price
---------+-----------
Adam | 2.25
John | 2.25
Justin | 2.5

F-152
Restrictions on SELECT Lists

When using grouping, every attribute in the SELECT list must:

have an aggregation operator applied to it OR

appear in the GROUP-BY clause

Incorrect Example: Find the hotel that sells New cheapest.

SELECT bar, MIN(price)


FROM Sells
WHERE beer = New;

PostgreSQLs response to this query:

ERROR: Attribute sells.bar must be GROUPed


or used in an aggregate function
F-153
Restrictions on SELECT Lists (cont.)

How to answer the query: Which bar sells New cheapest?

SELECT bar
FROM Sells
WHERE beer = New AND
price <= (SELECT MIN(price)
FROM Sells
WHERE beer = New);

bar
--------------
Regent Hotel

F-154
Restrictions on SELECT Lists (cont.)

Also, cannot use grouping to simply re-order results.

Incorrect Example: Print beers grouped by their manufacturer.

SELECT name, manf FROM Beers


GROUP BY manf;

ERROR: Attribute beers.name must be GROUPed


or used in an aggregate function

F-155
Restrictions on SELECT Lists (cont.)

How to print beers grouped by their manufacturer?

SELECT name, manf FROM Beers


ORDER BY manf;

name | manf
---------------------+---------------
80/- | Caledonian
Crown Lager | Carlton
Fosters Lager | Carlton
Invalid Stout | Carlton
Melbourne Bitter | Carlton
Victoria Bitter | Carlton
Premium Lager | Cascade
...

ORDER BY can be applied to multiple attributes.


F-156
Eliminating Groups

In some queries, you can use the WHERE condition to eliminate groups.

Example: Average beer price by suburb excluding hotels in The Rocks.

SELECT Bars.addr, AVG(Sells.price)


FROM Sells, Bars
WHERE Bars.addr != The Rocks
AND Sells.bar = Bars.name
GROUP BY Bars.addr;

For more complex conditions on groups, use the HAVING clause.

F-157
Eliminating Groups (cont.)

HAVING is used to qualify a GROUP-BY clause:

SELECT attributes/aggregations
FROM relations
WHERE condition (on tuples)
GROUP BY attribute
HAVING condition (on group);

Semantics of HAVING:

1. generate the groups as for GROUP-BY

2. eliminate groups not satisfying HAVING condition

3. apply aggregations to remaining groups


Note: HAVING condition can use relations/variables from FROM just like WHERE condition,
but variables range over each group.
F-158
Eliminating Groups (cont.)

Example: Find the average price of common beers (i.e. those that are
served in more than one hotel).

SELECT beer,
to_char(AVG(price),9.99)
as "$$$"
FROM Sells
GROUP BY beer
HAVING COUNT(bar) > 1;

beer | $$$
-----------------+-------
New | 2.39
Old | 2.53
Victoria Bitter | 2.40
F-159
Eliminating Groups (cont.)

The HAVING condition can have components that do not use aggregation.

Example: Find the average price of beers that are either commonly
served (in more than one hotel) or are manufactured by Coopers.

SELECT beer, AVG(price)


FROM Sells
GROUP BY beer
HAVING COUNT(bar) > 1
OR beer in
(SELECT name
FROM beers
WHERE manf = Coopers);

beer | avg
-----------------+------------------
F-160
New | 2.38749998807907
Old | 2.53333330154419
Sparkling Ale | 2.79999995231628
Victoria Bitter | 2.39999997615814
Eliminating Groups (cont.)

GROUP-BY and HAVING also provide an alternative formulation for


division.

Example: Find bars that each sell all of the beers Justin likes.

SELECT DISTINCT S.bar


FROM Sells S, Likes L
WHERE S.beer = L.beer
AND L.drinker = Justin
GROUP BY bar
HAVING count(S.beer) =
(SELECT count(beer) FROM Likes
WHERE drinker = Justin);

F-161
SQL: Views

F-162
Views

A view is like a virtual relation defined via a query.

View definition and removal:

CREATE VIEW V iewN ame AS Query

CREATE VIEW V iewN ame [ (AttributeN ames) ]


AS Query

DROP VIEW V iewN ame

The Query may be any SQL query, involving

other views (intensional relations)

stored tables (extensional relations)


F-163
Views (cont.)

The stored tables in a view are referred to as base tables.

Views are defined only after their base tables are defined.

A view is valid only as long as its underlying query is valid.

Dropping a view has no effect on the base tables.

F-164
Views (cont.)

Example: An avid Carlton drinker might not be interested in any other


kinds of beer.

CREATE VIEW MyBeers AS


SELECT name, manf
FROM Beers
WHERE manf = Carlton;

SELECT * FROM MyBeers;

name | manf
------------------+---------
Crown Lager | Carlton
Fosters Lager | Carlton
Invalid Stout | Carlton
Melbourne Bitter | Carlton
Victoria Bitter | Carlton
F-165
Views (cont.)

A view might not use all attributes of the base relations.

Example: We dont really need the address of inner-city hotels.

CREATE VIEW InnerCityHotels AS


SELECT name, license
FROM Bars
WHERE addr in (The Rocks,Sydney);

SELECT * FROM InnerCityHotels;

name | license
-----------------+---------
Australia Hotel | 123456
Lord Nelson | 123888
Marble Bar | 122123
F-166
Views (cont.)

A view might use computed attribute values.

Example: Number of beers produced by each brewer.

CREATE VIEW BeersBrewed AS


SELECT manf as brewer,
count(*) as nbeers
FROM beers GROUP BY manf;

SELECT * FROM BeersBrewed;

brewer | nbeers
---------------+--------
Caledonian | 1
Carlton | 5
Cascade | 1
...
F-167
Renaming View Attributes

This can be achieved in two different ways:

CREATE VIEW InnerCityHotels AS


SELECT name AS pub, license AS lic
FROM Bars
WHERE addr IN (The Rocks, Sydney);

CREATE VIEW InnerCityHotels(pub,lic) AS


SELECT name, license
FROM Bars
WHERE addr IN (The Rocks, Sydney);

F-168
Using Views

Views can be used in queries as if they were stored relations.

However, they differ from stored relations in two important respects:

their value can change without being explicitly modified


(i.e. a view may change whenever one of its base tables is updated)

they may not be able to be explicitly modified (updated)


(only a certain simple kinds of views can be explicitly updated)

F-169
Using Views (cont.)

Example: of view changing when base table changes.

SELECT * FROM InnerCityHotels;


name | license
-----------------+---------
Australia Hotel | 123456
Lord Nelson | 123888
Marble Bar | 122123

-- then the Lord Nelson goes broke


DELETE FROM Bars WHERE name = Lord Nelson;

-- no explict update has been made to InnerCityHotels


SELECT * FROM InnerCityHotels;
name | license
-----------------+---------
Australia Hotel | 123456
Marble Bar | 122123
F-170
Updating Views

Explicit updates are allowed on views satisfying the following:

the view involves a single relation R

the WHERE clause does not involve R in a subquery

the WHERE clause only uses attributes from the SELECT

Attributes not in the views SELECT will be set to NULL in the base relation
after an insert into the view.

F-171
Updating Views (cont.)

Example: Our InnerCityHotel view is not updatable.

INSERT INTO InnerCityHotels


VALUES (Jacksons on George, 9876543);

creates a new tuple in the Bars relation:

(Jacksons on George, NULL, 9876543)

when we SELECT from the view, this new tuple does not satisfy the view
condition:

addr IN (The Rocks, Sydney)

F-172
Updating Views (cont.)

If we had chosen to omit the license attribute instead, it would be


updatable:

CREATE VIEW CityHotels AS


SELECT name,addr FROM Bars
WHERE addr IN (The Rocks, Sydney);

INSERT INTO CityHotels


VALUES (Jacksons on George, Sydney);

creates a new tuple in the Bars relation:

(Jacksons on George, Sydney, NULL)

which would appear in the view after the insertion.


F-173
Updating Views (cont.)

Updatable views in PostgreSQL require us to specify explicitly how up-


dates are done:

CREATE RULE InsertCityHotel AS


ON INSERT TO CityHotels
DO INSTEAD
INSERT INTO Bars VALUES
(new.name, new.addr, NULL);

CREATE RULE UpdateCityHotel AS


ON UPDATE TO CityHotels
DO INSTEAD
UPDATE Bars
SET addr = new.addr
WHERE name = old.name;
F-174
Evaluating Views

Two alternative ways of implementing views:

re-writing rules (or macros)

when a view is used in a query, the query is re-written

after rewriting, becomes a query only on base relations

explicit stored relations (called materialized views)

the view is stored as a real table in the database

updated appropriately when base tables are modified


The difference: underlying query evaluated either at query time or at update time.

F-175
Evaluating Views (cont.)

Example: Using the InnerCityHotels view.

CREATE VIEW InnerCityHotels AS


SELECT name, license
FROM Bars
WHERE addr IN (The Rocks, Sydney);

SELECT name
FROM InnerCityHotels
WHERE license = 123456;

--is rewritten into the following form before execution

SELECT name
FROM Bars
WHERE addr IN (The Rocks, Sydney)
AND license = 123456;
F-176
Evaluating Views (cont.)

Demonstrate the rewriting process via relational algebra.

Some abbreviations

n = name, l = license

L = license = 123456

A = addr IN (The Rocks, Sydney)

View definition in RA:

InnerCityHotels = (n,l)((A)(Bars))

F-177
Evaluating Views (cont.)

Rewriting of query involving a view:

= SELECT name from InnerCityHotels


WHERE license = 123456

= (n)((L)(InnerCityHotels))
= (n)((L)((n,l)((A)(Bars))))
= (n)((n,l)((L)((A)(Bars))))
= (n)((L)((A)(Bars)))
= (n)((L & A)(Bars))
= (n)((A & L)(Bars))

= SELECT name FROM Bars


WHERE addr IN (The Rocks, Sydney)
AND license = 123456
F-178
Materialized Views

Naive implementation of materialized views:

replace view table by re-evaluating query after each update

Clearly this costs space and makes updates more expensive.

However, in a situation where

updates are infrequent compared to queries on the view

the cost of computing the view is expensive

this approach provides substantial benefits.

Materialized views are used extensively in data warehouses.

F-179

You might also like