Beruflich Dokumente
Kultur Dokumente
3.2
History
IBM Sequel language developed as part of System R project at
3.3
3.4
maximum length n.
int. Integer (a finite subset of the integers that is machinedependent).
smallint. Small integer (a machine-dependent subset of the integer
domain type).
numeric(p,d). Fixed point number, with user-specified precision of
p digits, with n digits to the right of decimal point.
real, double precision. Floating point and double-precision floating
point numbers, with machine-dependent precision.
float(n). Floating point number, with user-specified precision of at
least n digits.
More are covered in Chapter 4.
3.5
3.6
3.7
ID
varchar(5),
name
varchar(20) not null,
dept_name
varchar(20),
tot_cred
numeric(3,0),
primary key (ID),
foreign key (dept_name) references department) );
create table takes (
ID
varchar(5),
course_id
varchar(8),
sec_id
varchar(8),
semester
varchar(6),
year
numeric(4,0),
grade
varchar(2),
primary key (ID, course_id, sec_id, semester, year),
foreign key (ID) references student,
foreign key (course_id, sec_id, semester, year) references section );
Note: sec_id can be dropped from primary key above, to ensure a
student cannot be registered for two sections of the same course in the
same semester
3.8
course_id
varchar(8) primary key,
title
varchar(50),
dept_name
varchar(20),
credits
numeric(2,0),
foreign key (dept_name) references department) );
3.9
Dropping
3.10
3.11
select name
from instructor
NOTE: SQL names are case insensitive (i.e., you may use upper- or
lower-case letters.)
3.12
after select.
Find the names of all departments with instructor, and remove
duplicates
select distinct dept_name
from instructor
The keyword all specifies that duplicates not be removed.
3.13
select *
from instructor
The select clause can contain arithmetic expressions involving
The query:
3.14
satisfy
To find all instructors in Comp. Sci. dept with salary > 80000
select name
from instructor
where dept_name = Comp. Sci.' and salary > 80000
Comparison results can be combined using the logical
3.15
select
from instructor, teaches
3.16
teaches
3.17
Joins
For all instructors who have taught some course, find their names
3.18
3.19
Natural Join
Natural join matches tuples with the same values for all
3.20
they taught.
3.21
teach
Correct version
3.22
old-name as new-name
E.g.
Find the names of all instructors who have a higher salary than
instructor as T instructor T
3.23
String Operations
SQL includes a string-matching operator for comparisons on
Find the names of all instructors whose name includes the substring
dar.
select name
from instructor
where name like '%dar%'
Match the string 100 %
like 100 \%' escape '\'
3.24
3.25
3.26
select name
from instructor
where salary between 90000 and 100000
Tuple comparison
3.27
Duplicates
In relations with duplicates, SQL can define how many copies
3.28
Duplicates (Cont.)
Example: Suppose multiset relations r1 (A, B) and r2 (C)
are as follows:
r1 = {(1, a) (2,a)}
3.29
Set Operations
Find courses that ran in Fall 2009 or in Spring 2010
(select course_id from section where sem = Fall and year = 2009)
union
(select course_id from section where sem = Spring and year = 2010)
Find courses that ran in Fall 2009 and in Spring 2010
(select course_id from section where sem = Fall and year = 2009)
intersect
(select course_id from section where sem = Spring and year = 2010)
Find courses that ran in Fall 2009 but not in Spring 2010
(select course_id from section where sem = Fall and year = 2009)
except
(select course_id from section where sem = Spring and year = 2010)
3.30
Set Operations
Set operations union, intersect, and except
3.31
Null Values
It is possible for tuples to have a null value, denoted by null, for
3.32
or
null = null
evaluates to unknown
Database System Concepts - 6th Edition
3.33
Aggregate Functions
These functions operate on the multiset of values of a
3.34
department
3.35
3.36
Aggregation (Cont.)
Attributes in select clause outside of aggregate functions must
/* erroneous query */
select dept_name, ID, avg (salary)
from instructor
group by dept_name;
3.37
3.38
count returns 0
3.39
Nested Subqueries
SQL provides a mechanism for the nesting of subqueries.
A subquery is a select-from-where expression that is nested
3.40
Example Query
Find courses offered in Fall 2009 and in Spring 2010
3.41
Example Query
Find the total number of (distinct) studentswho have taken
3.42
Set Comparison
Find names of instructors with salary greater than that of some
3.43
0
5
6
) = true
(5 < some
0
5
) = false
(5 = some
0
5
) = true
(5 some
0
5
) = true (since 0 5)
(5 < some
(= some) in
However, ( some) not in
3.44
Example Query
Find the names of all instructors whose salary is greater than
3.45
(5 < all
0
5
6
) = false
(5 < all
6
10
) = true
(5 = all
4
5
) = false
(5 all
4
6
( all) not in
However, (= all) in
3.46
subquery is nonempty.
exists r r
not exists r r =
3.47
Correlation Variables
Yet another way of specifying the query Find all courses
taught in both the Fall 2009 semester and in the Spring 2010
semester
select course_id
from section as S
where semester = Fall and year= 2009 and
exists (select *
from section as T
where semester = Spring and year= 2010
and S.course_id= T.course_id);
Correlated subquery
Correlation name or correlation variable
3.48
Not Exists
Find all students who have taken all courses offered in the
Biology department.
select distinct S.ID, S.name
from student as S
where not exists ( (select course_id
from course
where dept_name = Biology)
except
(select T.course_id
from takes as T
where S.ID = T.ID));
Note that X Y = X Y
Note: Cannot write this query using = all and its variants
3.49
in its result.
select T.course_id
from course as T
where unique (select R.course_id
from section as R
where T.course_id= R.course_id
and R.year = 2009);
3.50
3.51
3.52
With Clause
The with clause provides a way of defining a temporary view
3.53
variations
Find all departments where the total salary is greater than the
3.54
Scalar Subquery
Scalar subquery is one which is used where a single value is expected
(select count(*)
from instructor
where department.dept_name = instructor.dept_name)
as num_instructors
from department;
E.g. select name
from instructor
where salary * 10 >
(select budget from department
where department.dept_name = instructor.dept_name)
Runtime error if subquery returns more than one result tuple
3.55
3.56
3.57
Deletion (Cont.)
Delete all instructors whose salary is less than the average
salary of instructors
delete from instructor
where salary< (select avg (salary) from instructor);
3.58
3.59
Insertion (Cont.)
Add all instructors to the student relation with tot_creds set to 0
its results are inserted into the relation (otherwise queries like
insert into table1 select * from table1
would cause problems, if table1 did not have any primary key
defined.
3.60
3.61
update instructor
set salary = case
when salary <= 100000 then salary * 1.05
else salary * 1.03
end
3.62
update student S
set tot_cred = ( select sum(credits)
from takes natural join course
where S.ID= takes.ID and
takes.grade <> F and
takes.grade is not null);
Sets tot_creds to null for students who have not taken any course
Instead of sum(credits), use:
case
when sum(credits) is not null then sum(credits)
else 0
end
3.63
End of Chapter 3
3.65
Figure 3.02
3.66
Figure 3.03
3.67
Figure 3.04
3.68
Figure 3.05
3.69
Figure 3.07
3.70
Figure 3.08
3.71
Figure 3.09
3.72
Figure 3.10
3.73
Figure 3.11
3.74
Figure 3.12
3.75
Figure 3.13
3.76
Figure 3.16
3.77
Figure 3.17
3.78