Академический Документы
Профессиональный Документы
Культура Документы
Introduction
Structured Query Language (SQL) is the most widely used commercial relational database language. It was originally developed at IBM in the SEQUEL-XRM and System-R projects (1974-1977). - SEQUEL (Structured English Query Language) Almost immediately, other vendors introduced DBMS products based on SQL, and it is now a standard. SQL continues to evolve in response to the changing need. The current ANSI/ISO standard for SQL is called SQL:1999. The previous standard is SQL-92. Not all DBMS products support the full SQL standards.
Embedded and Dynamic SQL Embedded SQL features allow SQL code to be called from a host language such as C or COBOL. Dynamic SQL features allow a query to be constructed and executed at run-time. Client-Server Execution and Remote Database Access Client application can connect to an SQL server. Access data from a database over a network. Transaction Management Controls how transactions are executed. Security Provides mechanisms to control users access to data.
target-
list
FROM WHERE
relation-list qualification
relation-list target-list
A list of relation names (possibly with a range-variable after each name). A list of attributes of relations in relationlist.
SELECT
[DISTINCT]
target-
list
FROM WHERE
relation-list qualification
qualification
Comparisons (Attr op const or Attr1 op Attr2, <, >, =, , , where op is one of ) combined using AND, OR and NOT. DISTINCT an optional keyword indicating that the answer should not contain duplicates. Default is that duplicates are not eliminated.
SELECT clause specifies columns to be retained in the result. FROM clause specifies a cross-product of tables. WHERE clause (optional) specifies selection conditions on the tables mentioned in the FROM clause. An SQL query intuitively corresponds to a relational algebra expression involving selections, projections, and cross-products.
a1, a2, , an ( P ( R1 x R2 x x Rm ) )
To remove duplications
SELECT DISTINCT branch-name FROM Loan
Loan Result
branch_name
( Loan )
SELECT
[DISTINCT]
target-
list
1.
FROM WHERE
relation-list qualification
2. 1. 1.
Find the names of sailors who have reserved boat number 103
sid 22 58 bid 101 103 day 10/10/05 11/12/05 sid 22 31 58 sname dustin lubber rusty rating 7 8 10 age 45.0 55.5 35.0
bid=103, S.sid=R.sid
( Sailors X
Reserves )
More Examples
Given the following schema:
Sailors (sid; integer, sname: string, rating:integer, age: real) Boats (bid: integer, bname; string, color: string) Reserves (sid: integer, bid: integer, day: date)
rating color
age
day
rating color
age
B.color = red
B.color = red
rating color
age
(In general, there may be more than one sailor called Lubber. In this case, it will return the colors of boats reserved by all such Lubbers).
rating color
age
Find the names of sailors who have reserved at least one boat.
SELECT S.name FROM Sailors S, Reserves WHERE S.sid = R.sid
(If a sailor has not made a reservation, the second step in the conceptual evaluation strategy would eliminate all rows in the cross-product that involve this sailor).
2 * S.age AS age2
Illustrates use of arithmetic expressions and string pattern matching: Find triples (of ages of sailors and two fields defined by expressions) for sailors whose names begin and end with B and contain at least three characters. AS and = are two ways to name fields in result. LIKE is used for string matching. `_ stands for any one character (exact one character) `% stands for 0 or more arbitrary characters.
rating color
age
of any two union-compatible sets of tuples (which are themselves the result of SQL queries).
SELECT DISTINCT R.sid FROM Boats B, Reserves R WHERE R.bid=B.bid AND (B.color=red OR B.color=green)
SELECT R.sid FROM Boats B, Reserves R WHERE R.bid=B.bid AND B.color=red UNION SELECT R.sid FROM Boats B, Reserves R WHERE R.bid=B.bid AND B.color=green
rating color
age
Boats B2, Reserves R2 WHERE S.sid=R1.sid AND R1.bid=B1.bid AND S.sid=R2.sid AND R2.bid=B2.bid AND (B1.color=red AND B2.color=green)
rating color
age
Find sids of all sailors whove reserved red boat but not green boat.
SELECT R.sid FROM Boats B, Reserves R WHERE R.bid=B.bid AND B.color=red EXCEPT SELECT R.sid FROM Boats B, Reserves R WHERE R.bid=B.bid AND B.color=green
rating color
age
Find sids of all sailors who have a rating of 10 or reserved boat 104
SELECT S.sid FROM Sailors S WHERE S.rating = 10 UNION SELECT R.sid FROM Reserves R WHERE R.bid=104
Nested Queries
A nested query is a query that has another query embedded within it. The embedded query is called a subquery. The embedded query can be a nested query itself. Queries may have very deeply nested structures.
Reserves R
WHERE
R.bid=103) A very powerful feature of SQL: a WHERE clause can itself contain an SQL query! (Actually, so can FROM clauses.) To find sailors whove not reserved #103, use NOT IN. To understand semantics of nested queries, think of a nested loops evaluation:
For each Sailors tuple, check the qualification by computing the subquery.
Reserves R R.bid=103) In the previous example, the inner subquery is independent of the outer query.
WHERE
In general, the inner subquery could depend on the row currently being examined in the outer query.
rating color
age
EXISTS is another set comparison operator, which allows us to test whether a set is nonempty. For the query finds sailors with at most one reservation for boat #103, we use UNIQUE instead of EXISTS, and * is replaced by R.bid (UNIQUE checks for duplicate tuples; * denotes all attributes. Why do we have to replace * by R.bid?)
Set-comparison Operators
Weve already seen IN, EXISTS and UNIQUE. We can also use NOT IN, NOT EXISTS and NOT UNIQUE. Also available: op ANY, op ALL Where op is one of the arithmetic comparison operator
>,<,=,,,
SOME is also available, but it is just a synonym for ANY. Example: Find sailors whose rating is greater than that of some sailor called Horatio:
SELECT * FROM Sailors S WHERE S.rating > ANY (SELECT S2.rating FROM Sailors S2 WHERE S2.sname=Horatio)
rating color
age
Find sailors whose rating is better than every sailor called Horatio.
SELECT * FROM Sailors S WHERE S.rating > ALL (SELECT S2.rating FROM Sailors S2 WHERE S2.sname=Horatio)
Division in SQL
Find sailors whove reserved all boats.
SELECT S.sname Boats bid bname color FROM Sailors S Reserves sid bid day WHERE NOT EXISTS ((SELECT B.bid FROM Boats B) All boats EXCEPT (SELECT R.bid All boats reserved by S FROM Reserves R WHERE R.sid=S.sid))
sailors sid sname rating age
Note that this query is correlated for each sailor S, we check to see that the set of boats reserved by S includes every boat. Logic: there does not exist any boat that is not reserved by S
rating color
age
ELECT S.sname ROM Sailors S HERE NOT EXISTS (SELECT B.bid FROM Boats B WHERE NOT EXISTS (SELECT R.bid FROM Reserves R WHERE R.bid=B.bid AND R.sid=S.s Intuitively, for each sailor we check that there is no boat that has not been reserved by this sailor.
Aggregate Operators
SQL allows the use of arithmetic expressions. SQL supports five aggregate operations, which can be applied on any column of a relation.
COUNT([DISTINCT] A) The number of (unique) values in the A column. SUM ( [DISTINCT] A) AVG ([DISTINCT A) MAX (A) MIN (A) The sum of all (unique) values in the A column. The average of all (unique) values in the A column. The maximum value in the A column. The minimum value in the A column.
rating color
age
rating color
age
rating color
age
rating color
age
Aggregate operations offer an alternative to the ANY and ALL constructs. Find the names of sailors who are older than the oldest sailor with a rating of 10.
SELECT S.name FROM Sailors S WHERE S.age > ( SELECT MAX (S2.age) FROM Sailors S2 WHERE S2.rating = 10)
Suppose we know that rating levels are from 1 to 10; we can write 10 queries that look like this (!): For i = 1, 2, ... , 10:
In
general, we may not know how many rating levels exist, and what the rating values for these levels are!
To write such queries, we need a major extension to the basic SQL query form, namely the Group BY clause. The extension also includes an optional HAVING clause that can be used to specify qualifications over groups. Find the age of the youngest sailor for each rating level. SELECT S.rating, MIN (S.age) FROM Sailors S GROUP BY S.rating
Conceptual Evaluation
SELECT [DISTINCT] target-list FROM relation-list WHERE qualification GROUP BY grouping-list HAVING group-qualification a. Compute the cross-product of relation-list b. Discard tuples that fail qualification c. Delete fields that are not specified by target-list, grouping-list or group-qualification d. Partition the remaining tuples according to the value of attributes in grouping-list e. Apply the group-qualification to eliminate groups that are not qualified.
Conceptual Evaluation
SELECT [DISTINCT] target-list FROM relation-list WHERE qualification GROUP BY grouping-list HAVING group-qualification
The group-qualification is applied to eliminate some groups. Expressions in group-qualification must have a single value per group ! Because one answer tuple is generated per qualifying group.
In effect, an attribute in group-qualification must be either an argument of an aggregation operator or appears in grouping-list.
Find the age of the youngest sailor with age >= 18, for each rating with at least 2 such sailors
SELECT S.rating, MIN (S.age) FROM Sailors S WHERE S.age >= 18 GROUP BY S.rating HAVING COUNT (*) > 1 Only S.rating and S.age are mentioned in the SELECT, GROUP BY or HAVING clauses; other attributes are `unnecessary. 2nd column of result is unnamed. (Can use AS to name it)
sid 22 31 71 64 29 58
sname rating age dustin 7 45.0 lubber 8 55.5 zorba 10 16.0 horatio 7 35.0 brutus 1 33.0 rusty 10 35.0
age 33.0 45.0 35.0 55.5 35.0
rating 1 7 7 8 10
rating 7
35.0
Answer relation
Find the average age of sailors for each rating level that has at least two sailors.
sid sname rating age
SELECT S.rating, AVG(S.age) AS avgage FROM Sailor S GROUP BY S.rating HAVING COUNT (*) > 1
OR
22 29 31 32 58 64 71 74 85 95
Dustin Brutus Lubber Andy Rusty Horatio Zorba Horatio Art Bob
7 1 8 8 10 7 10 9 3 3
45.0 33.0 55.5 25.5 35.0 35.0 16.0 35.0 25.5 63.5
Answer
SELECT S.rating, AVG(S.age) AS avgage FROM Sailor S GROUP BY S.rating HAVING 1 < (SELECT COUNT (*) FROM Sailors S2 WHERE S.rating = S2.rating)
Rating avgage
3 7 8 10
We can use S.rating inside the nested subquery in the HAVING because it has a single value for the current group of sailors
Instance S3 of Sailor
Find the average age of sailors who are at least 18 years old for each rating level that has at least two sailors.
SELECT S.rating, AVG(S.age) AS avgage FROM Sailor S WHERE S.age >=18 GROUP BY S.rating HAVING 1 < (SELECT COUNT (*) FROM Sailors S2 WHERE S.rating = S2.rating)
S2
Etc.
Result
rating color
age
For each red boat, find the number of reservations for this boat
Only columns that SELECT B.bid, COUNT (*) AS reservationcount appear in the GROUP BY FROM Boats B, Reserves R clause can appear in the WHERE R.bid=B.bid HAVING clause
SELECT B.bid, COUNT (*) AS reservationcount FROM Boats B, Reserves R WHERE R.bid=B.bid AND B.color=red GROUP BY B.bid
rating color
age
Find those ratings for which the average age is the minimum over all ratings
SELECT S.rating FROM Sailors S WHERE S.age = (SELECT MIN (AVG (S2.age)) FROM Sailors S2 GROUP BY S2.rating)
Aggregate operations cannot be nested! This query will not work even if MIN(AVG(S2.age)), which is illegal, is allowed. In the nested query, Sailors is partitioned into groups by rating, and the average age is computed for each rating value. For each group, applying MIN to this average age value for the group will return the same value.
Correct solution
SELECT Temp.rating, Temp.avgage FROM (SELECT S.rating, AVG (S.age) AS avgage FROM Sailors S GROUP BY S.rating) AS Temp WHERE Temp.avgage = (SELECT MIN (Temp.avgage) FROM Temp)
It essentially computes a temporary table containing the average age for each rating value and then finds the rating(s) for which this average age is the minimum.
NULL Value
field value unknown A new employee has not been assigned a supervisor yet. Employee
eno ename supervisor_eno spouse_name
Two rows are duplicates if matching columns are either equal or both NULL implicitly NULL=NULL. But for comparison in where clause, (NULL=NULL) = unknown. NULL is counted in COUNT(*) All other aggregate discard NULL values
Outer Joins
List (sid, bid) for sailors and boats they have reserved.
sid 22 31 58 sname dustin lubber rusty rating 7 8 10 age 45.0 55.5 35.0 sid 22 58 bid 101 103 day 10/10/05 11/12/05
SELECT R.sid, R.bid FROM Sailors S NATURAL LEFT OUTER JOIN Reserves R
All left relation rows (Sailors) appear in the result
Use of null
Outer Joins
List (sid, bid) for sailors and boats they have reserved. sid sname rating
sid 22 58 bid day 101 103 10/10/05 11/12/05 22 31 58 dustin lubber rusty 7 8 10 age 45.0 55.5 35.0
SELECT R.sid, R.bid FROM Reserves R NATURAL RIGHT OUTER JOIN Sailors S
All right relation rows (Sailors) appear in the result
Views
List (sid, bid) for sailors and boats they have reserved.
CREATE VIEW SB (sid, bid) AS SELECT R.sid, R.bid FROM Reserves R NATURAL RIGHT OUTER JOIN Sailors S
View SB is a table which is not explicitly stored in the database. A view can be used just like a base table.
Outer Joins
SB
rating color
age
General Constraints
Useful when more general ICs than keys are involved. Can use queries to express constraint. Sailors
CREATE TABLE Sailors ( sid INTEGER, sname CHAR(10), rating INTEGER, age REAL, PRIMARY KEY (sid), CHECK ( rating >= 1 AND rating <= 10 ))
sid
sname
rating
age
Boats Reserves
bid sname
bname bid
color day
CREATE TABLE Reserves Constraint: ( sname CHAR(10), Interlake boats bid INTEGER, cannot be reserved.
day DATE,
PRIMARY KEY (bid,day), CONSTRAINT noInterlakeRes CHECK (`Interlake <> ( SELECT B.bname FROM Boats B WHERE B.bid=Reserves.bid)))
When a boat is inserted into Reserves or an existing row is modified, the conditional expression in the CHECK constraint is evaluated. If it evaluates to false, the command is rejected.
Boats bid
bname color
CREATE TABLE Sailors ( sid INTEGER, sname CHAR(10), rating INTEGER, age REAL, PRIMARY KEY (sid), CHECK ( (SELECT COUNT (S.sid) FROM Sailors S) + (SELECT COUNT (B.bid) FROM Boats B) < 100 )
Awkward and wrong! If Sailors is empty, the number of Boats tuples can be anything! A constraint is not required to hold for an empty relation
CREATE ASSERTION smallClub CHECK ( (SELECT COUNT (S.sid) FROM Sailors S) + (SELECT COUNT (B.bid) FROM Boats B) < 100 )
Sailors Boats
sid bid
age color
Triggers
Trigger: procedure that starts automatically if specified changes occur to the DBMS Three parts:
Event (activates the trigger) Condition (tests whether the triggers should run) Action (what happens if the trigger runs)
Action
Sailors
sid
sname
rating
age
Summary
SQL was an important factor in the early acceptance of the relational model; more natural than earlier, procedural query languages. Relationally complete; in fact, significantly more expressive power than relational algebra. Many alternative ways to write a query; optimizer should look for most efficient evaluation plan. In practice, users need to be aware of how queries are optimized and evaluated for best results.
Read Chapter 3