|
SQL Overview
|
|
Structured Query Language or SQL is the standard query
language for relational databases.
-
It first became an official standard in 1986 as
defined by the American National Standards Institute (ANSI).
-
All major database vendors conform to the SQL
standard with minor variations in syntax (different dialects).
-
SQL consists of both a Data Definition Language
(DDL) and a Data Manipulation Language (DML).
-
SQL is a declarative language (non-procedural).
A SQL query specifies what to retrieve but not how to retrieve it.
-
SQL is not a complete programming language. It
does not have control or iteration commands
|
|
SQL History
-
1970 - Codd invents relational model and
relational algebra
-
1974 - D. Chamberlin (also at IBM) defined
Structured English Query Language (SEQUEL)
-
1976 - SEQUEL/2 defined and renamed SQL for
legal reasons.
-
Origin of pronunciation 'See-Quel' but official pronunciation is 'S-Q-L'.
-
Late 1970s - System R, Oracle, INGRES implement
variations of SQL-like query languages.
-
1982 - standardization effort on SQL begins
-
1986 - became ANSI official standard
-
1987 - became ISO standard
-
1992 - SQL2 (SQL92) revision
-
1999 - SQL3 (supports recursion,
object-relational)
-
2003 - SQL:2003
|
|
|
SQL Basic Rules
Some basic rules for SQL statements: .
1) There is a set of reserved words that cannot be
used as names for database objects.
SELECT,
FROM, WHERE, etc
2) SQL is generally case-insensitive.
Only exception is string constants. 'FRED' not the
same as 'fred'.
3) SQL is free-format and white-space is ignored.
4) The semi-colon is often used as a statement
terminator, although that is not part of the standard.
5) Date and time constants have defined format:
DATE 'YYYY-MM-DD' e.g. DATE '1975-05-17'
TIME 'hh:mm:ss[.f]' e.g. TIME '15:00:00', TIME
'08:30:30.5'
6) Two single quotes '' are used to represent a single
quote character in a character constant. e.g. 'Master''s'.
|
|
SQL Queries
The query portion of SQL is performed using a SELECT
statement. The general form of the statement is:
SELECT A1 , A2 , … , An
<-------- attributes in result
FROM R1 , R2 , … ,
Rm <---------- tables in query
WHERE (condition) Notes:
1) The "*" is used to select all attributes.
2) Combines the relational algebra operators of
selection, projection, and join into a single statement.
3) Comparison operators: =, <>, >, <,
>=, <=.
|
|
Example Relations
emp (eno, ename, bdate, title, salary,
supereno, dno)
proj (pno, pname, budget, dno)
dept (dno, dname, mgreno)
workson (eno, pno, resp, hours)
Foreign keys:
emp: emp.supereno to emp.eno, emp.dno to dept.dno
proj: proj.dno to dept.dno
dept: dept.mgreno to emp.eno
workson: workson.eno to emp.eno, workson.pno to
proj.pno
|
| emp |
|
eno
|
ename
|
bdate
|
title
|
salary
|
supereno
|
dno
|
|
E1
|
J.Doe
|
01-05-75
|
EE
|
30000
|
E2
|
null
|
|
E2
|
M.
Smith
|
06-04-66
|
SA
|
50000
|
E5
|
D3
|
|
E3
|
A.
Lee
|
07-05-66
|
ME
|
40000
|
E7
|
D2
|
|
E4
|
J.
Miller
|
09-01-50
|
PR
|
20000
|
E6
|
D3
|
|
E5
|
B.
Casey
|
12-25-71
|
SA
|
50000
|
E8
|
D3
|
|
E6
|
L.
Chu
|
11-30-65
|
EE
|
30000
|
E7
|
D2
|
|
E7
|
R.
Davis
|
09-08-77
|
ME
|
40000
|
E8
|
D1
|
|
E8
|
J.
Jones
|
10-11-72
|
SA
|
50000
|
null
|
D1
|
|
| workson |
|
eno
|
pno
|
resp
|
hours
|
|
E1
|
P1
|
Manager
|
12
|
|
E2
|
P1
|
Analyst
|
24
|
|
E2
|
P2
|
Analyst
|
6
|
|
E3
|
P3
|
Consultant
|
10
|
|
E3
|
P4
|
Engineer
|
48
|
|
E4
|
P2
|
Programmer
|
18
|
|
E5
|
P2
|
Manager
|
24
|
|
E6
|
P4
|
Manager
|
48
|
|
E7
|
P3
|
Engineer
|
36
|
|
| Proj |
|
pno
|
pname
|
budget
|
dno
|
|
P1
|
Instruments
|
150000
|
D1
|
|
P2
|
DB
Develop
|
135000
|
D2
|
|
P3
|
Budget
|
250000
|
D3
|
|
P4
|
Maintenance
|
310000
|
D2
|
|
P5
|
CAD/CAM
|
500000
|
D2
|
|
| Dept |
|
dno
|
dname
|
mgreno
|
|
D1
|
Management
|
E8
|
|
D2
|
Consulting
|
E7
|
|
D3
|
Accounting
|
E5
|
|
D4
|
Development
|
null
|
|
Return the employee name and salary of all employees
whose title is 'EE':
SELECT ename, salary
FROM emp
WHERE title = 'EE';
|
| Result |
|
ename
|
salary
|
|
J.
Doe
|
30000
|
|
L.
Chu
|
30000
|
|
|
Algorithm: Scan each tuple in table and check if
matches condition in WHERE clause.
|
|
One Relation Query
more Examples
Return the birth date and salary of employee 'J. Doe'
SELECT bdate, salary
FROM emp
WHERE ename = 'J. Doe';
Return all information on all employees:
SELECT * FROM emp; <------returns
all attributes
Return the employee number, project number, and number
of hours worked where the hours worked is > 50:
SELECT eno, pno, hours
FROM workson
WHERE hours > 50
|
|
Duplicates in SQL
One major difference between SQL and relational
algebra is that relations in SQL are bags instead of sets. It is possible to
have two or more identical rows in a relation.
Consider the query:
Return all titles of employees.
SELECT title
FROM emp
|
| Result |
|
title
|
|
EE
|
|
SA
|
|
ME
|
|
PR
|
|
SA
|
|
EE
|
|
ME
|
|
SA
|
|
| Duplicates in SQL - DISTINCT clause
|
| To remove duplicates, use the DISTINCT
clause in the SQL statement:
|
| SELECT DISTINCT title FROM emp
|
| Result |
|
|
|
Join Query Example
Multiple tables can be queried in a single SQL
statement by listing them in the FROM clause. Note that if you do not specify
any join condition to relate them in the WHERE clause, you get a cross product
of the tables.
Example: Return the employees who are assigned to the
'Management' department.
SELECT ename
FROM emp, dept
WHERE dname = 'Management'
and
emp.dno = dept.dno
|
| Result |
|
|
|
Join Query Examples
Return the department names and the projects in each
department:
SELECT dname, pname
FROM dept, proj
WHERE dept.dno = proj.dno;
Return the employees and the names of their
department:
SELECT ename, dname
FROM emp, dept
WHERE emp.dno=dept.dno;
Return all projects who have an employee working on
them whose title is 'EE':
SELECT pname
FROM emp, proj, workson
WHERE emp.title = 'EE'
and workson.eno=emp.eno
and workson.pno = proj.pno;
|
|
Practice Questions
Relational database schema:
emp (eno, ename, bdate, title, salary, supereno,
dno)
proj (pno, pname, budget, dno)
dept (dno, dname, mgreno)
workson (eno, pno, resp, hours)
1) Return the project names that have a budget >
250000.
2) Return the employees born after July 1, 1970 that
have a salary > 35000 and have a title of 'SA' or 'PR'.
3) Return a list of all department names, the names of
the projects of that department, and the name of the manager of each
department.
4) Return a list of all distinct combinations of title
and salary in the database.
|
|
Calculated Fields
Mathematical expressions are allowed in the SELECT
clause to perform simple calculations.
When an expression is used to define an attribute, the
DBMS gives the attribute a unique name such as col1, col2, etc.
|
|
Example:
Return
how much employee 'A. Lee' will get paid for his work on each project.
SELECT
ename, pname, salary/52/5/8*hours
FROM
emp, workson, proj
WHERE
emp.eno = workson.eno and ename=‘A.
Lee’
|
| Result |
|
ename
|
pname
|
col3
|
|
A.
Lee
|
Budget
|
192.31
|
|
A.
Lee
|
Maintenance
|
923.08
|
|
|
Renaming and Aliasing
Often it is useful to be able to rename an attribute
in the final result (especially when using calculated fields). Renaming is
ename pname pay A. Lee Budget 192.31 A. Lee Maintenance 923.08 accomplished
using the keyword AS:
SELECT ename, pname, salary/52/5/8*hours AS pay
FROM emp, workson, proj
WHERE emp.eno = workson.eno
and ename=‘A. Lee’
and proj.pno = workson.pno
AS keyword is optional.
|
| Result |
|
ename
|
pname
|
pay
|
|
A.
Lee
|
Budget
|
192.31
|
|
A.
Lee
|
Maintenance
|
923.08
|
|
|
Renaming is also used when two or more copies of the
same table are in a query. Using aliases allows you to uniquely identify what
table you are talking about.
Example: Return the employees and their managers where
the managers make less than the employee. S
ELECT E.ename, M.ename
FROM emp as E, emp as M
WHERE E.mgreno = M.eno
and E.salary > M.salary;
|
|
Advanced Conditions – BETWEEN
Sometimes the condition in the WHERE clause will
request tuples where one attribute value must be in a range of values. Example:
Return the employees who make at least $20,000 and less than or equal to
$45,000.
SELECT ename
FROM emp
WHERE salary >= 20000 and salary <= 45000
We can use the keyword BETWEEN instead:
SELECT ename FROM emp WHERE salary between 20000 and
45000
|
|
Advanced Conditions - LIKE
For string valued attributes, the LIKE operator is
used to search for partial matches. Partial string matches are specified by
using either "%" that replaces an arbitrary number of characters or underscore
"_" that replaces a single character.
Example: Return all employee names that start with
'A'. Example:
Return all employee names who have a first name
that starts with 'J' and whose last name is 3 characters long.
SELECT ename
FROM emp
WHERE ename LIKE 'A%';
SELECT ename
FROM emp
WHERE ename LIKE 'J. _ _ _';
|
|
Performance Concerns of LIKE
Warning: Do not use the LIKE operator if you do not
have to. It is one of the most inefficient operations. The reason is that the
DBMS is not able to optimize lookup using LIKE as it can for equal (=)
comparisons. The result is the DBMS often has to examine ALL TUPLES in the
relation. In almost all cases, adding indexes will not increase the performance
of LIKE queries because the indexes cannot be used.
Most indexes are implemented using B-trees that
allow for fast equality searching and efficient range searches.
|
|
Advanced Conditions - IN
To specify that an attribute value should be in a
given set of values, the IN keyword is used.
Example: Return all employees who are in any one of
the departments {'D1', 'D2', 'D3'}.
SELECT ename
FROM emp
WHERE dno IN ('D1','D2','D3');
Note that this is equivalent to using OR:
SELECT ename
FROM emp
WHERE dno = 'D1'
OR dno = 'D2'
OR dno = 'D3';
However, we will see more practical uses of IN and NOT
IN when we study nested subqueries.
|
|
Advanced Conditions - NULL
Remember NULL is used to indicate that a given attribute does not have a value.
To determine if an attribute is NULL, we use the
clause IS NULL. Note that you cannot test NULL values using = and <>.
Example: Return all employees who are not in a department.
SELECT ename
FROM emp
WHERE dno IS NULL
Example: Return all departments that have a manager.
SELECT dname
FROM dept
WHERE mgreno IS NOT NULL
|
|
Set Operations
The basic set operations of union,
intersection, and difference can be performed in SQL. They are generally used
to combine the results of two separate SQL queries. UNION defined in SQL1,
INTERSECT, EXCEPT in SQL2
Example: Return the employees who are either directly
supervised by 'R. Davis' or directly supervised by 'M. Smith'.
(SELECT E.ename
FROM emp as E, emp as M
WHERE E.supereno = M.eno and M.ename='R. Davis')
UNION
(SELECT E.ename
FROM emp as E, emp as M
WHERE E.supereno = M.eno
and M.ename='M. Smith');
|
|
SELECT INTO
The result of a select statement can be stored in a
temporary table using the INTO keyword:
SELECT E.ename INTO davisMgr
FROM emp as E, emp as M
WHERE E.supereno = M.eno and M.ename='R. Davis'
This can be used for set operations instead of using
parentheses
SELECT E.ename INTO smithMgr
FROM emp as E, emp as M
WHERE E.supereno = M.eno
and M.ename=’M. Smith'
davisMgr UNION smithMgr;
|
|
Ordering Result Data
The query result returned is not ordered on any
attribute by default. We can order the data using the ORDER BY clause:
SELECT ename, salary, bdate
FROM emp
WHERE salary > 30000
ORDER BY salary DESC, ename ASC;
-
'ASC' sorts the data in ascending order, and 'DESC'
sorts it in descending order. The default is 'ASC'. ·
-
The order of sorted attributes is significant. The
first attribute specified is sorted on first, then the second attribute is used
to break any ties, etc.
-
NULL is normally treated as less than all non-null
values
|
|
Practice Questions
Relational database schema:
emp (eno, ename, bdate, title, salary, supereno,
dno)
proj (pno, pname, budget, dno)
dept (dno, dname, mgreno)
workson (eno, pno, resp, hours)
1) Calculate the monthly salary for each
employee.
2) Return the list of employees who make less than
their managers and how much less they make.
3) Return a list of distinct projects where an
employee has worked more hours on the project than a manager on the project. 4)
List all employees who do not have a supervisor.
|