490 likes | 511 Views
A comprehensive guide to Oracle SQL and PL/SQL, including examples, tips, and common pitfalls. Learn how to write efficient queries and manage data effectively.
E N D
OCL1 Oracle 8i:SQL & PL/SQLSession #4 Matthew P. Johnson CISDD, CUNY Fall, 2004 Matthew P. Johnson, OCL1, CISDD CUNY, F2004
Review • Examples from sqlzoo.net SELECT L FROM R1, …, Rn WHERE C PL(sC(R1 x … Rn) Matthew P. Johnson, OCL1, CISDD CUNY, F2004
Questions from last time • Q: What about double quotes? • A: Can’t 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); Matthew P. Johnson, OCL1, CISDD CUNY, F2004
Questions from last time • Q: Can an escape char be an escape string? • A: No. SQL> select * from newtable where a like '%\%%' escape '\'; A B ---------- ---------- h%i there SQL> 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 Matthew P. Johnson, OCL1, CISDD CUNY, F2004
Case-sensitivity • By default, all matches and comparisons are case-sensitive • If want case-insensitive, some options: • Convert all to upper or lower case: • SQL> select * from emp where upper(ename) like upper('%la%'); • Create a function index • Maybe later… • Modify the nls_sort setting: • SQL> alter session set nls_sort=binary_ci; • The other values: binary, binary_ai Matthew P. Johnson, OCL1, CISDD CUNY, F2004
Disambiguation in Oracle SQL • Can rename fields by • Select name as n … • Select name n … • But not by • Select name=n… • Can rename relations only by • … from tab t1, tab t2 • Lesson: if you get errors, remove all =s, ASs Matthew P. Johnson, OCL1, CISDD CUNY, F2004
Disambiguation 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 SQL> Select * from R, R; Select * from R, R * ERROR at line 1: ORA-00918: column ambiguously defined Matthew P. Johnson, OCL1, CISDD CUNY, F2004
SQL e.g. • Acc(name,ssn,balance) • Q: Who has the largest balance? • Conceptually: Pname(Acc) - Pa2.name(sa2.bal < Acc.bal(Acc x ra2(Acc))) • In SQL? Matthew P. Johnson, OCL1, CISDD CUNY, F2004
Nulls in SQL • If we don’t 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 Matthew P. Johnson, OCL1, CISDD CUNY, F2004
Null 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 Matthew P. Johnson, OCL1, CISDD CUNY, F2004
Null values in boolean expressions • C1 AND C2 = min(C1, C2) • C1 OR C2 = max(C1, C2) • NOT C1 = 1 – C1 • height > 6 = UNKNOWN • UNKNOWN OR weight > 190 = UNKOWN • (age < 25) AND UNKNOWN = UNKNOWN SELECT * FROM Person WHERE (age < 25) AND (height > 6 OR weight > 190) E.g.age=20height is NULLweight=200 Matthew P. Johnson, OCL1, CISDD CUNY, F2004
Comparing null and non-nulls • Unexpected behavior: • Some Persons are not included! • The “trichotomy law” does not hold! SELECT * FROM Person WHERE age < 25 OR age >= 25 Matthew P. Johnson, OCL1, CISDD CUNY, F2004
Testing for null values • Can test for NULL explicitly: • x IS NULL • x IS NOT NULL • But: • x=NULLis always null • Now it includes all Persons SELECT * FROM Person WHERE age < 25 OR age >= 25 OR age IS NULL Matthew P. Johnson, OCL1, CISDD CUNY, F2004
Example with nulls • look at emp table • Select names, salaries, commissions, total salaries • What if commission is null? • nvl Matthew P. Johnson, OCL1, CISDD CUNY, F2004
Evaluation 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 Matthew P. Johnson, OCL1, CISDD CUNY, F2004
Case-sensitivity redux • By default, all matches and comparisons are case-sensitive • If want case-insensitive, some options: • Convert all to upper or lower case: • SQL> select * from emp where upper(ename) = upper(‘blake'); • Create a function index • Maybe later… • Modify the nls_sort setting: • SQL> alter session set nls_sort=binary_ci; • SQL> alter session set nls_comp=ansi; • The other values: binary, binary_ai Matthew P. Johnson, OCL1, CISDD CUNY, F2004
Subqueries • 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. Matthew P. Johnson, OCL1, CISDD CUNY, F2004
Subquery 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 ssn’s row and buyerssn’s row SELECT Purchase.prodnameFROM Purchase, PersonWHERE buyerssn = ssn AND name = ‘Conrad’ Matthew P. Johnson, OCL1, CISDD CUNY, F2004
Subquery motivation • Purchase(prodname, buyerssn, etc.) • Person(name, ssn, etc.) • What did Conrad buy? • Natural intuition: 1. Go find Conrad’s ssn 2. Then find purchases SELECT ssnFROM PersonWHERE name = ‘Conrad’ SELECT Purchase.prodnameFROM Purchase, PersonWHERE buyerssn = Conrad’s-ssn Matthew P. Johnson, OCL1, CISDD CUNY, F2004
Subqueries • Subquery: copy in Conrad’s 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’) Matthew P. Johnson, OCL1, CISDD CUNY, F2004
SQL e.g. • People(ssn, name, street, city, state) • assume for clarity that cities are unique • Q: Who lives on George’s street? • Conceptually: sstreet=s2 AND city=c2(rp2(s2,c2)(People) x Pstreet,city(sname=‘George’(People))) • In SQL? • Another way, conceptually: People ⋈Pstreet,city(sname='George’(People)) • In SQL? Later on… Matthew P. Johnson, OCL1, CISDD CUNY, F2004
Operators on selections • Several new operators applied to (unary) selections: • EXISTS R • s > ALL R • s > ANY R • > is just an example op • Each expression can be negated with NOT Matthew P. Johnson, OCL1, CISDD CUNY, F2004
Subqueries returning relations • Q: Find companies Martha bought from • Intuition: • Find Martha’s ssn • Find Martha’s 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’)) Matthew P. Johnson, OCL1, CISDD CUNY, F2004
Subqueries 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’ Matthew P. Johnson, OCL1, CISDD CUNY, F2004
Subqueries returning relations You can also use: s > ALL R s > 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 > ALL (SELECT price FROM Purchase WHERE maker=‘Gizmo-Works’) Matthew P. Johnson, OCL1, CISDD CUNY, F2004
Correlated Queries • So far, subquery executed once; • result used for higher query • More complicated: correlated queries • “[T]he 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 Matthew P. Johnson, OCL1, CISDD CUNY, F2004
Correlated 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 SELECTDISTINCT title FROM Movie AS x WHERE year <> ANY (SELECT year FROM Movie WHERE title = x.title); correlation Matthew P. Johnson, OCL1, CISDD CUNY, F2004
Complex 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 > ALL (SELECT price FROM Product AS y WHERE x.maker = y.maker AND y.year < 1972); Matthew P. Johnson, OCL1, CISDD CUNY, F2004
FROM 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’)) Matthew P. Johnson, OCL1, CISDD CUNY, F2004
FROM subqueries • Motivation for another way: suppose we’re given Martha’s purchases • Then could just cross with Products and select identified rows • Substitute (named) subquery for Martha’s 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 Matthew P. Johnson, OCL1, CISDD CUNY, F2004
Existential/Universal Conditions Product (pname, price, company) Company(cname, city) Find all companies s.t. some of their products have price < 100 SELECT DISTINCT Company.cname FROM Company, Product WHERE Company.cname = Product.company and Produc.price < 100 Existential: easy! Matthew P. Johnson, OCL1, CISDD CUNY, F2004
Existential/Universal Conditions Product (pname, price, company) Company(cname, city) Find all companies s.t. all of their products have price < 100 Universal: hard! Matthew P. Johnson, OCL1, CISDD CUNY, F2004
Existential/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.companyFROM ProductWHERE Produc.price >= 100 2. Find all companies s.t. all their products have price < 100 SELECT DISTINCT Company.cname FROM Company WHERE Company.cname NOT IN (SELECT Product.companyFROM ProductWHERE Produc.price >= 100 Matthew P. Johnson, OCL1, CISDD CUNY, F2004
More on Set-Comparison Operators • We’ve 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 Horatio: SELECT R.SID FROM Reserves R WHERE R.rating> ANY(SELECT R2.rating FROM Reserves R2 WHERE R2.sname=‘Horatio’) Matthew P. Johnson, OCL1, CISDD CUNY, F2004
Joins operations • Variations: • Cross join (Cartesian product) • Join … On • Natural join • Outer join • Apply to relations appearing in selections Matthew P. Johnson, OCL1, CISDD CUNY, F2004
Cross join - example MovieStar MovieExec Matthew P. Johnson, OCL1, CISDD CUNY, F2004
Cross join – example • Select * From MovieStar Cross Join MovieExec Matthew P. Johnson, OCL1, CISDD CUNY, F2004
Join … On: example • Select * From MovieStar Join MovieExec On MovieStar.Name <> MovieExec. Name Matthew P. Johnson, OCL1, CISDD CUNY, F2004
Natural 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) Matthew P. Johnson, OCL1, CISDD CUNY, F2004
Example - Natural join MovieStar MovieExec Select *from MovieStar Natural Join MovieExec Matthew P. Johnson, OCL1, CISDD CUNY, F2004
Outer Join - Example MovieStar MovieExec Select *from MovieStar NATURAL FULL OUTER JOIN MovieExec Matthew P. Johnson, OCL1, CISDD CUNY, F2004
Outer Join - Example • Select *from MovieStar LEFT OUTER JOIN MovieExec Select *from MovieStar RIGHT OUTER JOIN MovieExec Matthew P. Johnson, OCL1, CISDD CUNY, F2004
New-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 … Matthew P. Johnson, OCL1, CISDD CUNY, F2004
New-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 Matthew P. Johnson, OCL1, CISDD CUNY, F2004
New-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 Matthew P. Johnson, OCL1, CISDD CUNY, F2004
New-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 Matthew P. Johnson, OCL1, CISDD CUNY, F2004
Old-style outer joins • Outer joins can also be done with the old-style syntax, but with the (+) • …WHERE A.att=B.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” Matthew P. Johnson, OCL1, CISDD CUNY, F2004
SQL e.g. • People(ssn, name, street, city, state) • assume for clarity that cities are unique • Q: Who lives on George’s street? • Now, the second way, conceptually: People ⋈Pstreet,city(sname=“George”(People)) • In SQL? Matthew P. Johnson, OCL1, CISDD CUNY, F2004
Live Examples • Examples from sqlzoo.net Matthew P. Johnson, OCL1, CISDD CUNY, F2004