SQL Notes Detail
SQL Notes Detail
SQL is an ANSI/ISO standard language for querying and manipulating relational DBMSs. Designed to be a human readable language comprising: data denition facilities database modication 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 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
(aka SQL-92).
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) dened 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 dicult-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-specic programming languages
(e.g. Oracles PL/SQL, PostgreSQLs PLpgSQL)
SQL
(cont.)
SQLs query sub-language is based on relational algebra. Relational algebra: formal language of expressions mapping tablestables comprising three basic operations ... select: lter table rows via a condition on attributes project: lter table columns by name join: combines two tables via a condition along with set operations (union, intersection, dierence) and a variety of aggregates (including aggregations)
F-6
SQL
(cont.)
S h 1
select[t=1](R)
t 1 1 t 1 2 t 1 1 2 2
u v a 2.5 b 1.7
project[t](R)
join[t=y](R,S)
u a b a b
x h h j j
y 1 1 2 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.)
Account
branchName
accountNo
balance
account
Foreign Key
customer
Branch
branchName
Customer
name
address
customerNo
Primary Key
homeBranch
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
Example Database #1
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
(cont.)
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.)
Beers name
Likes drinker
Frequents drinker
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
Example Database #2
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
(cont.)
F-16
Example Database #2
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
(cont.)
F-17
Example Database #2
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
(cont.)
F-18
Example Database #2
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
(cont.)
F-19
SQL Syntax
SQL denitions, queries and statements are composed of: comments ... -- comments to end of line identiers ... 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 identiers
F-20
SQL Syntax
(cont.)
While SQL identiers 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 SELECT FROM WHERE GROUP BY HAVING ORDER BY DESC EXISTS IS NULL NOT NULL IN DISTINCT AS Dening Data Changing Data CREATE INSERT TABLE INTO INTEGER VALUES REAL UPDATE VARCHAR SET CHAR DELETE KEY DROP PRIMARY ALTER FOREIGN REFERENCES CONSTRAINT CHECK
There are 225 reserved words in SQL92 ... not a small language.
F-22
SQL Keywords
A list of PostgreSQLs SQL keywords:
ALL ANALYSE ANALYZE AND ANY AS ASC BETWEEN BINARY BOTH CASE CAST CHECK COLLATE COLUMN CONSTRAINT CROSS CURRENT_DATE CURRENT_TIME CURRENT_USER DEFAULT DEFERRABLE DESC DISTINCT DO ELSE END EXCEPT FALSE FOR FOREIGN FREEZE FROM FULL GROUP HAVING ILIKE IN INITIALLY INNER INTERSECT INTO IS ISNULL JOIN LEADING LEFT LIKE LIMIT NATURAL NEW NOT NOTNULL NULL OFF OFFSET OLD ON ONLY OR ORDER OUTER
(cont.)
OVERLAPS PRIMARY PUBLIC REFERENCES RIGHT SELECT SESSION_USER SOME TABLE THEN TO TRAILING TRUE UNION UNIQUE USER USING VERBOSE WHEN WHERE
Note that some SQL92 reserved words are not reserved words in PostgreSQL.
F-23
SQL Identiers
Names are used to identify database objects such as tables, attributes, views, ... meta-objects such as types, functions, constraints, ... Identiers in SQL use similar conventions to programming languages i.e.
a sequence of alpha-numerics, starting with an alphabetic.
Can create arbitrary indentiers by enclosing in "..." Example identiers: employee last_name student Courses "Thats a Great Name!"
Oracle SQL also allows unquoted hash (#) and dollar ($) in identiers.
F-24
SQL Identiers
(cont.)
Since SQL does not distinguish case, the following are all treated as being the same identier: employee Employee EmPlOyEe
Most RDBMSs will let you give the same name to dierent 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 " [A-Z]{4}\d{4} !%#%!$ OBrien a VeRy! LoNg String
PostgreSQL provides extended strings containing \ escapes, e.g. E\n EO\Brien E[A-Z]{4}\\d{4} EJohn
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
F-27
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
(cont.)
Various kinds of number types are available: INTEGER (or INT), SMALLINT ... 32/16-bit integers REAL, DOUBLE PRECISION ... 32/64-bit oating point NUMBER(d,p) ... xed-point reals (d digits, p after dec.pt.) PostgreSQL also provides ... serial: auto-generated integer values for primary keys currency: xed-point reals, displayed as strings $1,000.00
F-29
(cont.)
CHAR(n) ... uses n bytes, left-justied, 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? ecient
(dierent to some other DBMSs)
(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 beware 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
(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
(cont.)
SQL data types provide coarse-grained control over values. If more ne-grained control over values is needed: constraints can express more precise conditions new data types can be dened 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 dened 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-specic operations available (e.g. arithmetic for numbers). Which operations are actually provided depends on the implementation.
F-35
SQL Operators
String comparison:
(cont.)
str1 < str2 ... compare using dictionary order str LIKE pattern ... matches string to pattern Pattern-matching uses SQL-specic pattern expressions: % matches anything (like .*) (like .)
F-36
SQL Operators
(cont.)
Examples (using SQL92 pattern matching): Name LIKE Ja% Name LIKE _i% Name begins with Ja Name has i as 2nd letter
Name LIKE %o%o% Name contains two os Name LIKE %ith Name LIKE John Name ends with ith Name matches John
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 ~ ^.i Name begins with Ja Name has i as 2nd letter
Name ~ .*o.*o.* Name contains two os Name ~ ith$ Name ~ John Name ends with ith Name matches John
F-39
SQL Operators
String manipulation: str1 || str2 ... concatenate two strings LENGTH(str) ... return length of string
(cont.)
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
Arithmetic operations:
+ * / abs ceil floor power sqrt
(cont.)
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) sum(1,2,NULL,4,NULL,6) avg(1,2,3,4,5) avg(NULL,2,NULL,4) = = = = 21 13 3 3
F-42
SQL Operators
(cont.)
PostgeSQL provides several ways of dealing with NULL: coalesce(V al1,V al2,...V aln) returns rst 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
F-45
(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
account
Foreign Key
customer
Branch
branchName
Customer
name
address
customerNo
Primary Key
homeBranch
Foreign Key
F-46
This not only denes the table schema but also creates an empty instance of the table. Tables are removed via DROP TABLE RelName;
F-48
(cont.)
Account
branchName
accountNo
balance
account
Foreign Key
customer
Branch
branchName
Customer
name
address
customerNo
Primary Key
homeBranch
Foreign Key
This shows explicitly the connection between foreign key attributes and their corresponding key attributes. The SQL DDL provides notation for expressing this in the table denition.
F-49
(cont.)
F-50
(cont.)
F-51
(cont.)
Note: the not null captures total participation, i.e. every accountis held at some branch.
F-52
(cont.)
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, accountNo char(5) PRIMARY KEY, if several attributes, declare with table constraints, name varchar(40), address varchar(50), ... PRIMARY KEY (name,address) e.g. e.g.
F-54
Declaring Keys
(cont.)
If we want to dene 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
Foreign keys:
(cont.)
if a single attribute, specify Relation(Attribute), customer integer REFERENCES Customer(customerNo) -- or customer integer REFERENCES Customer -- or FOREIGN KEY (customer) REFERENCES Customer(customerNo)
e.g.
F-56
Declaring Keys
Foreign keys: (cont)
(cont.)
if several attributes, specify in table constraints, name varchar(40), addr varchar(50), ... FOREIGN KEY (name,addr) REFERENCES Person(name,address)
e.g.
If dening 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
Example of dierent deletion strategies:
(cont.)
F-60
Branch branchName Downtown Redwood Perryridge Mianus Round Hill North Town Brighton Account branchName Downtown Round Hill Perryridge Round Hill Brighton Redwood accountNo A101 A215 A102 A305 A201 A222 address Brooklyn Palo Alto Horseneck Horseneck Horseneck Rye Brooklyn assets 9000000 2100000 1700000 400000 8000000 3700000 7100000 Original relation balance 500 700 400 350 900 700 Account branchName Downtown Perryridge Brighton Redwood After deletion with CASCADE accountNo A101 A102 A201 A222 balance 500 400 900 700 Account branchName Downtown NULL Perryridge NULL Brighton Redwood After deletion with SET NULL accountNo A101 A215 A102 A305 A201 A222 balance 500 700 400 350 900 700
Can specify that an attribute must have a unique value, e.g. barcode varchar(20) UNIQUE, isbn varchar(15) UNIQUE NOT NULL
(cont.)
F-62
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
(cont.)
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 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
constraintName
constraint
F-66
Creating Databases
Mechanism for creating databases is typically DBMS-specic. 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
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
(cont.)
intersperses messages with the schema denition. 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
...
Creating Databases
(cont.)
The entire contents of a database may be dumped: $ pg dump mydb > mydb.dump Dumps all denitions needed to re-create entire DB table denitions (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, dierent object identiers as changes are made, the two DBs will diverge
F-72
F-73
(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, DROP VIEW, CREATE FUNCTION, DROP FUNCTION, CREATE RULE, ...
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
INSERT INTO R VALUES (v1,v2,...)
(cont.)
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 specication order unspecied 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 insucient 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
F-80
(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
F-82
(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 le.
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 xed 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
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
Example continued ...
(cont.)
Dierent results come from dierent 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
F-88
Updates
An update allows you to modify values of specied attributes in specied tuples of a relation: UPDATE R SET list of assignments WHERE Condition Each tuple in relation R that satises 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
Can update many tuples at once
(cont.)
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 Modications Some possible modications are: add a new column (attribute)
(set value to NULL unless default given) (e.g. constraints)
F-92
Changing Tables
Example: Add phone numbers for hotels.
(cont.)
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. Specic 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
CREATE X,
DROP Y ,
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)
by a 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;
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
The symbol * denotes a list of all attributes.
(cont.)
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
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
F-106
Selection in SQL
The relational algebra expression 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)
Cond(Rel)
is implemented in SQL
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
F-109
(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
(cont.)
The above example corresponds to a relational algebra evaluation like: BeerDrinkers JohnsBeers Brewers Result = = = = Likes Join[beer=name] Beers Sel[drinker=John](BeerDrinkers) Proj[manf](JohnsBeers) 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
F-112
(cont.)
Requires one tuple variable for each relation, and nested loops over relations. This is not how its actually computed!
F-113
(cont.)
Can use such qualied 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
F-116
(cont.)
F-117
(cont.)
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
The example could also be expressed as
(cont.)
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, nd 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
An outer join solves this problem. For R OUTER JOIN S
(cont.)
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.)
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-lls 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-lled
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 nds the price of VB at the CBH, and uses this as an argument to a test in the outer query.
F-128
Subqueries
(cont.)
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.)
In general, expressing a query via joins will be much more ecient 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 specied tuple is contained in a relation. tuple IN relation Conversely for Syntax: SELECT * FROM R WHERE R.a IN (SELECT x FROM S WHERE Cond) -- assume multiple results is true i the tuple is contained in the relation. tuple NOT IN relation.
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 ecient.
F-134
Quantiers
ANY and ALL behave as existential and universal quantiers 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
Oracle deviates from the SQL standard and uses MINUS for EXCEPT; PostgreSQL follows the standard.
F-137
(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
F-139
(cont.)
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 Dierence Proper-subract the number of occurrences in the two bags. example: {1, 2, 1} {1, 2, 3} = {1}
F-140
F-141
(cont.)
Division
Not all SQL implementations provide a divide operator, but the same eect 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
(cont.)
If we want set semantics, we can force using DISTINCT. Example: How many dierent 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 dierent 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 specied 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
GROUP BY is used as follows: SELECT FROM WHERE GROUP BY Semantics:
(cont.)
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
The query
(cont.)
rst produces a partitioned relation and then counts the number of tuples in each partition:
Name 80 Crown Lager Fosters Lager Invalid Stout Melbourne Bitter Victoria Bitter Premium Lager Sparkling Ale Stout
Manf Caledonian Carlton Carlton Carlton Carlton Carlton Cascade Coopers Coopers
Manf George IV Inn Lord Nelson Lord Nelson Sierra Nevada Sierra Nevada Tooheys Tooheys Tooheys Tooheys
1 2 2
5 Bigfoot Barley Wine Pale Ale 1 2 New Old Red Sheaf Stout
F-151
Grouping
(cont.)
Grouping is typically used in queries involving the phrase for each. Example: For each drinker, nd the average price of New at the bars they go to.
SELECT FROM WHERE drinker, AVG(price) as "Avg.Price" Frequents, Sells beer = New AND Frequents.bar = Sells.bar GROUP BY drinker; drinker | Avg.Price ---------+----------Adam | 2.25 John | 2.25 Justin | 2.5
F-152
OR
(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
(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
(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.
Bars.addr, AVG(Sells.price) Sells, Bars 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
HAVING is used to qualify a GROUP-BY clause: SELECT FROM WHERE GROUP BY HAVING attributes/aggregations relations condition (on tuples) attribute condition (on group);
(cont.)
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). 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
SELECT
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
| | | |
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 dened via a query. View denition 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 stored tables
(intensional relations) (extensional relations)
F-163
Views
(cont.)
The stored tables in a view are referred to as base tables. Views are dened only after their base tables are dened. A view is valid only as long as its underlying query is valid. Dropping a view has no eect 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
F-168
Using Views
Views can be used in queries as if they were stored relations. However, they dier from stored relations in two important respects: their value can change without being explicitly modied
(i.e. a view may change whenever one of its base tables is 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 updates 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 modied
The dierence: underlying query evaluated either at query time or at update time.
F-175
Evaluating Views
Example: Using the InnerCityHotels view.
(cont.)
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 denition in RA: InnerCityHotels = (n,l)((A)(Bars))
F-177
Evaluating Views
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))
(cont.)
= 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 benets. Materialized views are used extensively in data warehouses.
F-179