Title: OCL2 Oracle 10g: SQL
1OCL2 Oracle 10gSQL PL/SQLSession 4
- Matthew P. Johnson
- CISDD, CUNY
- Fall, 2004
2Review
SELECT L FROM R1, , Rn WHERE C
PL(sC(R1 x Rn)
3Questions from last time
- Q What about double quotes?
- A Cant be used in place of single quotes
- But can be used when Oracle would otherwise
misparse your command, e.g. - Names with spaces
- create table bad table name (a int, b int)
- Reserved words as names
- create table badfieldname(from int, b int)
4Questions from last time
- Q Can an escape char be an escape string?
- A No.
SQLgt select from newtable where a like '\'
escape '\' A B ----------
---------- hi there SQLgt select from
newtable where a like '\' escape '\\' select
from newtable where a like '\' escape '\\'
ERROR at line 1 ORA-01425 escape character
must be character string of length 1
5Case-sensitivity
- By default, all matches and comparisons are
case-sensitive - If want case-insensitive, some options
- Convert all to upper or lower case
- SQLgt select from emp where upper(ename) like
upper('la') - Create a function index
- Maybe later
- Modify the nls_sort setting
- SQLgt alter session set nls_sortbinary_ci
- The other values binary, binary_ai
6Disambiguation in Oracle SQL
- Can rename fields by
- Select name as n
- Select name n
- But not by
- Select namen
- Can rename relations only by
- from tab t1, tab t2
- Lesson if you get errors, remove all s, ASs
7Disambiguation in Oracle SQL
- Every selected field must be unambiguous
- For R(A,B),
- Select A from R, R
- ? Select R1.A from R R1, R R2
- Consider
- Why?
- is shorthand for all fields, each must be
unambiguous - ? Select from R R1, R R2
SQLgt Select from R, R Select from R, R
ERROR at line 1 ORA-00918 column ambiguously
defined
8SQL e.g.
- Acc(name,ssn,balance)
- Q Who has the largest balance?
- Conceptually
- Pname(Acc) - Pa2.name(sa2.bal lt Acc.bal(Acc x
ra2(Acc))) - In SQL?
9Nulls in SQL
- If we dont have a value, can put a NULL
- Null can mean several things
- Value does not exists
- Value exists but is unknown
- Value not applicable
- The schema specifies whether null is allowed for
each attribute - not null if not allowed
- Otherwise, null is allowed
10Null Values
- x NULL ? 4(3-x)/7 NULL
- x NULL ? x 3 x NULL
- x NULL ? 3 (x-x) NULL
- x NULL ? x Joe is UNKNOWN
- In general no row use null fields appear in the
selection test will pass the test - Pace Boole, SQL has three boolean values
- FALSE 0
- TRUE 1
- UNKNOWN 0.5
11Null values in boolean expressions
- C1 AND C2 min(C1, C2)
- C1 OR C2 max(C1, C2)
- NOT C1 1 C1
- height gt 6 UNKNOWN
- ? UNKNOWN OR weight gt 190 UNKOWN
- ? (age lt 25) AND UNKNOWN UNKNOWN
SELECT FROM Person WHERE (age lt 25) AND
(height gt 6 OR weight gt 190)
E.g.age20height is NULLweight180
12Comparing null and non-nulls
- Unexpected behavior
- Some Persons are not included!
- The trichotomy law does not hold!
SELECT FROM Person WHERE age lt 25 OR age
gt 25
13Testing for null values
- Can test for NULL explicitly
- x IS NULL
- x IS NOT NULL
- But
- xNULL is always null
- Now it includes all Persons
SELECT FROM Person WHERE age lt 25 OR age
gt 25 OR age IS NULL
14Example with nulls
- look at emp table
- Select names, salaries, commissions, total
salaries - What if commission is null?
- nvl
15Evaluation strategies for SQL queries
- Semantics of a SQL query defined in terms of the
following conceptual evaluation strategy - Compute the cross-product of relation-list in
FROM clause - Discard resulting tuples if they fail WHERE
clause - Delete attributes that are not in SELECT clause
- If DISTINCT is specified, eliminate duplicate
rows - Often the least efficient way to compute a query!
- Optimizer finds better ways, but result is the
same
16Case-sensitivity redux
- By default, all matches and comparisons are
case-sensitive - If want case-insensitive, some options
- Convert all to upper or lower case
- SQLgt select from emp where upper(ename)
upper(blake') - Create a function index
- Maybe later
- Modify the nls_sort setting
- SQLgt alter session set nls_sortbinary_ci
- SQLgt alter session set nls_compansi
- The other values binary, binary_ai
17Subqueries
- Powerful feature of SQL one clause can contain
other SQL queries! - So can FROM and HAVING clauses
- Several ways
- Selection ? single constant (scalar) in WHERE
- Selection ? relation in WHERE
- Selection ? relation in FROM
- Etc.
18Subquery motivation
- Consider standard multi-table example
- Purchase(prodname, buyerssn, etc.)
- Person(name, ssn, etc.)
- What did Conrad buy?
- As usual, need to AND on equality identifying
ssns row and buyerssns row
SELECT Purchase.prodnameFROM Purchase,
PersonWHERE buyerssn ssn AND name Conrad
19Subquery motivation
- Purchase(prodname, buyerssn, etc.)
- Person(name, ssn, etc.)
- What did Conrad buy?
- Natural intuition
- 1. Go find Conrads ssn
- 2. Then find purchases
SELECT ssnFROM PersonWHERE name Conrad
SELECT Purchase.prodnameFROM Purchase,
PersonWHERE buyerssn Conrads-ssn
20Subqueries
- Subquery copy in Conrads selection for his ssn
- The subquery returns one value, so the is valid
- If it returns more (or fewer), we get a run-time
error
SELECT Purchase.prodname FROM Purchase WHERE
buyerssn (SELECT ssn
FROM Person
WHERE name Conrad)
21SQL e.g.
- People(ssn, name, street, city, state)
- assume for clarity that cities are unique
- Q Who lives on Georges street?
- Conceptually sstreets2 AND cityc2(rp2(s2,c2)(Pe
ople) x Pstreet,city(snameGeorge(People))) - In SQL?
- Another way, conceptually People ?
Pstreet,city(sname'George(People)) - In SQL? Later on
22Operators on selections
- Several new operators applied to (unary)
selections - EXISTS R
- s gt ALL R
- s gt ANY R
- gt is just an example op
- Each expression can be negated with NOT
23Subqueries returning relations
- Q Find companies Martha bought from
- Intuition
- Find Marthas ssn
- Find Marthas products
- Find those products companies
SELECT Product.maker FROM Product WHERE
Product.name IN (SELECT
Purchase.product FROM
Purchase WHERE
Purchase.buyerssn (SELECT ssn
FROM Person WHERE name
Martha))
24Subqueries returning relations
- Equivalent to
- But are they really equivalent?
- Make both distinct to be sure
SELECT Product.maker FROM Product,
Purchase, People WHERE Product.name
Purchase.product AND
Purchase.buyerssn ssn AND name
Martha
25Subqueries returning relations
You can also use s gt ALL R
s gt ANY R
EXISTS R
Product (pname, price, category, maker) Find
products that are more expensive than all
Gizmo-Works products
SELECT name FROM Product WHERE price gt
ALL (SELECT price
FROM Purchase
WHERE makerGizmo-Works)
26Correlated Queries
- So far, subquery executed once
- result used for higher query
- More complicated correlated queries
- The subquery is evaluated many times, once
for each assignment of a value to some term in
the subquery that comes from a tuple variable
outside the subquery (Ullman, p286). - Q What does this mean?
- A That subqueries refer to vars from outer
queries
27Correlated Queries
- Movie (title, year, director, length)
- Q Find titles that are titles of multiple movies
- Note (1) scope of variables (2) this can still be
expressed as single SFW
SELECT DISTINCT title FROM Movie AS x WHERE
year ltgt ANY
(SELECT year FROM
Movie WHERE
title x.title)
correlation
28Complex Correlated Query
- Product (pname, price, category, maker, year)
- Find products (and their manufacturers) that are
more expensive than all products made by the same
manufacturer before 1972 - Powerful, but much harder to optimize!
SELECT DISTINCT pname, maker FROM Product AS
x WHERE price gt ALL (SELECT price
FROM Product AS y
WHERE
x.maker y.maker AND y.year lt 1972)
29FROM subqueries
- Recall Q Which companies did Martha buy from?
- Before found ssn, found products, found companies
SELECT Product.maker FROM Product WHERE
Product.name IN (SELECT
Purchase.product FROM
Purchase WHERE
Purchase.buyerssn (SELECT ssn
FROM Person WHERE name Martha))
30FROM subqueries
- Motivation for another way suppose were given
Marthas purchases - Then could just cross with Products and select
identified rows - ? Substitute (named) subquery for Marthas
purchases
SELECT Product.maker FROM Product,
(SELECT Purchase.product
FROM Purchase WHERE
Purchase.buyerssn (SELECT ssn
FROM Person WHERE name Martha))
Marthas WHERE Product.name Martha.product
31Existential/Universal Conditions
Product (pname, price, company) Company(cname,
city)
Find all companies s.t. some of their products
have price lt 100
SELECT DISTINCT Company.cname FROM Company,
Product WHERE Company.cname Product.company
and Produc.price lt 100
Existential easy!
32Existential/Universal Conditions
Product (pname, price, company) Company(cname,
city)
Find all companies s.t. all of their products
have price lt 100
Universal hard!
33Existential/universal with IN
1. Find the other companies i.e. s.t. some
product ? 100
SELECT DISTINCT Company.cname FROM
Company WHERE Company.cname IN (SELECT
Product.company
FROM Product
WHERE Produc.price
gt 100
2. Find all companies s.t. all their products
have price lt 100
SELECT DISTINCT Company.cname FROM
Company WHERE Company.cname NOT IN (SELECT
Product.company
FROM Product
WHERE Produc.price gt 100
34More on Set-Comparison Operators
- Weve already seen IN R, NOT IN R.
- Can also use EXISTS R, NOT EXISTS R
- Also available op ANY R, op ALL R
- Find sailors whose rating is greater than that of
some sailor called Alberto
SELECT R.SID FROM Reserves R WHERE R.rating gt
ANY (SELECT R2.rating
FROM Reserves R2
WHERE
R2.snameAlberto)
35Joins operations
- Variations
- Cross join (Cartesian product)
- Join On
- Natural join
- Outer join
- Apply to relations appearing in selections
36Cross join - example
MovieStar
MovieExec
37Cross join example
- Select
- From MovieStar Cross Join MovieExec
38Join On example
- Select
- From MovieStar Join MovieExec
- On MovieStar.Name ltgt MovieExec. Name
39Natural Joins
- MovieStar(name, address, gender, birthdate)
- MovieExec(name, address, networth)
- Natural Join
- MovieStar Natural Join MovieExec
- Results in list of individuals who are
movie-stars as well as executives - (Name, address, gender, birthdate, networth)
40Example - Natural join
MovieStar
MovieExec
Select from MovieStar Natural Join MovieExec
41Outer Join - Example
MovieStar
MovieExec
Select from MovieStar FULL OUTER JOIN MovieExec
on MovieStart.nameMovieExec.name
42Outer Join - Example
- Select from MovieStar LEFT OUTER JOIN MovieExec
on MovieStart.nameMovieExec.name
Select from MovieStar RIGHT OUTER JOIN MovieExec
on MovieStart.nameMovieExec.name
43New-style join syntax
- Old-style syntax simply lists tables separated by
commas - SELECT
- FROM A, B
- WHERE
- New-style makes the join explicit
- SELECT
- FROM A JOIN B ON
- WHERE
44New-style join syntax
- Functionally equivalent to old-style, but perhaps
more elegant - Introduced in Oracle 8i
- Older versions / other DBMSs may only support
old-style syntax
45New-style join types
- cross joins (simplest)
- FROM A CROSS JOIN B
- Inner joins (regular joins)
- FROM A INNER JOIN B ON
- Natural join
- FROM A NATURAL JOIN B
- Joins on common fields and merges
- Outer joins
46New-style outer joins
- Outer joins may be left, right, or middle
- FROM A LEFT OUTER JOIN B
- FROM A RIGHT OUTER JOIN B
- FROM A FULL OUTER JOIN B
- OUTER is optional
- If OUTER is included, then FULL is the
default - Q How to remember left v. right?
- A It indicates the side whose rows are always
included
47Old-style outer joins
- Outer joins can also be done with the old-style
syntax, but with the () - WHERE A.attB.att()
- corresponds to
- FROM A LEFT JOIN B
- The () is applied to all B attributes referred
to in the WHERE clause - Q How to remember which side gets the ()?
- A The side that gets null rows added
48SQL e.g.
- People(ssn, name, street, city, state)
- assume for clarity that cities are unique
- Q Who lives on Georges street?
- Now, the second way, conceptually
- People ? Pstreet,city(snameGeorge(People))
- In SQL?
49Live Examples