SQL - UW-Green Bay

SQL (Chapter 2: Simple queries;
Chapter 7 and 8: Nested and DML
queries)
Many of the examples in this document
are based on the tables in the next slide.
These are similar to the tables in the test
database CS451 Supplier.
Just about any query involving two tables
connected by a many-many relationship
will be similar to something from the
following slides (adapted from a book by
C. J. Date).
S
S#
S1
S2
S3
S4
S5
SNAME
Smith
Jones
Blake
Clark
Adams
P
STATUS
20
10
30
20
30
CITY
London
Paris
Paris
London
Athens
P#
P1
P2
P3
P4
P5
P6
PNAME
Nut
Bolt
Screw
Screw
Cam
Cog
SP
S#
S1
S1
S1
S1
S1
S1
S2
S2
S3
S3
S4
S4
S4
S5
S5
P#
P1
P2
P3
P4
P5
P6
P1
P3
P2
P3
P2
P3
P5
P3
P5
QTY
300
200
400
200
100
100
300
400
200
200
200
300
400
300
200
COLOR
Blue
Green
Blue
Red
Blue
Red
WEIGHT
12
17
17
14
12
19
SQL: one or more tables  view or
logical table.
SQL: Query
View: Answer or resulting table
Nice reference at
[http://www.w3schools.com/sql]
Book has numerous examples in Chapter
2.
Book also shows how to use SQL in
Access, Oracle, and MySQL;
just go through them for the SQL
examples; we’ll describe how to use SQL
in SQL-Server.
General format:
Select stuff
From table(s)
Where conditions
stuff can be specific attributes or the
character * to indicate all attributes.
The result is a list of all rows that satisfy
the conditions.
Using SQL Server to see result of SQL
commands
Using Management Studio, select the
desired database
Right click on it and select new Query
Type your SQL command into the
resulting text window
Click on the “! Execute” option just
above the window’s tab.
Row subsets
List all suppliers with a status larger than
20
Select *
From S
Where status > 20
NOTE: if status is NULL then
status > 20; status = 20; and status < 20
are all false!!
However, an SQL query could ask
whether status is equal to NULL and, if it
was, would return True.
Column Subsets combined with row
subsets:
List the name and status of each London
supplier
Select Sname, Status
From S
Where City = ‘London’
(may have to retype the quote marks if
copying the above and pasting into SQL
Server)
All SQL commands generate a logical
table.
The table may be displayed immediately
or buffered internally depending on the
context in which it is used.
Results may contain duplicate rows –
it’s time consuming to remove them
Select city
From S
Where status = 40
Can put distinct after the Select to eliminate
the duplicate rows.
Compound conditions:
List the numbers of Paris suppliers with a
status bigger than 20
Select S#
From S
Where city = ‘Paris’ and Status > 20;
Could use OR also
Ordering:
List the number and status of Paris
suppliers in descending order of status.
Select S#, status
From S
Where city = ‘Paris’
Order by Status Desc
Could also use ASC or just leave out.
Aggregates:
How many suppliers supply part ‘P2’
Select count(*)
From SP
Where P# = ‘P2’
If we left out the Where clause, we get a
count of ALL entries.
What is the average quantity supplied
by ‘P2’ suppliers
Select avg(qty)
From SP
Where P# = ‘P2’
Could use sum, max, min also, among
others
How can we get the average quantity for
all parts?
Group by options
Select P#, avg(Qty)
From SP
Group by P#
Gets an average for each P# and display
each in table format.
Results of the previous query displays no
column name for the avg. Can change this using
Select P#, avg(Qty) as 'average Quantity'
From SP
Group by P#
‘average Quantity’ becomes a column name in the
result
Find the supplier with the largest status
value
Select S#
From S
Where status = ( Select MAX (Status) from S)
This is an example of a nested query – a
select within a select.
Having Clause
The HAVING clause was added to SQL
because the WHERE keyword is limited
in its use with aggregate functions .
[http://www.w3schools.com/SQL/sql_ha
ving.asp]
SELECT attribute, function(attribute)
FROM table
WHERE condition
GROUP BY attribute
HAVING function(attribute) operator value
List suppliers with an average quantity
above 200
SELECT S#, avg(qty) as average
FROM SP
group by S#
having avg(qty) >200
List suppliers with above average
quantity
SELECT S#, avg(qty) as ‘average’
FROM SP
group by S#
having avg(qty) > (SELECT avg(qty) FROM SP)
Like keyword: allows queries to look
for strings similar to (but not equal to)
a specified criterion
Select stuff
from tables
where attribute like somestring
Common use similar to that below
Select *
from S
where Sname like 'Ada%‘
% is a wildcard. Looks for any name that
starts with ‘Ada’
Can use % prior to or after a string
Can replace ‘%’ with ‘_’
‘_’ is a wildcard for just ONE character.
Select *
from S
where Sname like 'Ada_‘
Looks for a string that starts with ‘Ada’ and
contains just one more character
NOTE: different DBMS’s may use different
symbols!
Multitable queries:
Find the names of suppliers who supply
part ‘P2’
Select Sname
From S, SP
Where S.S# = SP.S# and SP.P# = ‘P2’
How do you negate this?
That is: Find the names of suppliers who
do NOT supply part ‘P2’.
Nested queries:
Select Sname
From S
Where S# IN
( Select S#
From SP
Where P# = ‘P2’)
Or
Select Sname
From S
Where EXISTS
( Select *
From SP
Where S# = S.S# and P# = ‘P2’)
EXISTS is an existential qualifier
NOTE: queries involving IN can be
converted to queries involving EXISTS
but not necessarily vice-versa.
NOTE: In theory there’s no inherent
advantage to any of the above nested
queries or the previous JOIN-type query.
A good optimizer will treat all equally.
HOWEVER not all database systems
have comparable or good optimizers!!
Some report poor performance with
nested queries on mySQL
[http://dev.mysql.com/doc/refman/5.0/en/
subquery-restrictions.html]
Find the names of suppliers who do NOT
supply part ‘P2’.
You can negate nested queries by using
NOT IN or NOT EXISTS
Find the names of suppliers who do NOT
supply part ‘P2’.
Select Sname
From S
Where S# Not IN
( Select S#
From SP
Where P# = ‘P2’)
Select Sname
From S
Where not EXISTS
( Select *
From SP
Where S# = S.S# and P# = ‘P2’)
List suppliers who supply at least one red
part.
Select Sname
from S, SP, P
where S.S#=SP.S# and
SP.P#=P.P# and
P.color=‘Red’
Multiple nested queries: List suppliers
who supply at least one red part.
Select Sname
From S
Where S# IN
( Select S#
from SP
where P# IN
( Select P#
from P
where color = ‘Red’))
Which is better?
The former is probably more clear – but
maybe not to all.
The latter allows variations more easily.
Negating multiple nested queries:
NOT prior to first IN: List suppliers who
do NOT supply a red part.
NOT prior to second IN: List suppliers
who supply parts that are NOT red (nonred parts).
NOT prior to both: List suppliers who do
NOT supply parts that are NOT red
i.e. ONLY red parts.
NOTE: Two negations do NOT cancel
Select Sname
From S
Where EXISTS
( Select *
from P
where color=’Red’ and
EXISTS
( Select *
from SP
where SP.S#=S.S# and
P.P#=SP.P#))
Negating multiple nested queries:
NOT prior to first EXISTS: List suppliers
who do NOT supply a red part.
NOT prior to second EXISTS: List
suppliers for which there is a red part
they don’t supply.
NOT prior to both: List suppliers for
which there is no red part they do not
supply (i.e. supply ALL red parts).
NOTE: Two negations do NOT cancel
List supplier names of those who supply
all parts:
An alternative form is: List supplier
names of those for whom there is no part
they do not supply.
Select Sname
From S
Where NOT EXISTS
( Select *
from P
where NOT EXISTS
( Select *
from SP
where SP.S# = S.S# and SP.P# = P.P#))
Nested queries and multiple queries on
the same table:
Find supplier numbers for suppliers who
supply at least all those part supplied by
S2. NOTE: Nothing outside of SP is
needed.
Create view Temp as
( Select P#
from SP
where S# = ‘S2’)
Find numbers of suppliers who supply
all parts in temp
Select Distinct S#
From SP SPX
Where NOT EXISTS
( Select *
from Temp
where NOT EXISTS
( Select *
from SP SPY
where SPY.S# = SPX.S# and
SPY.P# = Temp.P#))
NOTE: if both of the previous SQL
commands are in the same SQL Server
window, place the word go between then.
It’s a syntax thing.
Alternative with NO temp table:
Select Distinct S#
From SP SPX
Where NOT EXISTS
( select *
from SP SPY
where S# = ‘S2’ and NOT EXISTS
( Select *
from SP
where S# = SPX.S# and P# =
SPY.P#))
This uses aliases SPX and SPY to be able
to state conditions related to a specific
selection when there is more than one
selection on the same table.
Alternative syntax for SQL and join
operations
A join operation combines two entries
from two (or more) tables based on a
condition, typically involving the equality
of a common attribute from each table.
See examples starting on page 261.
Sometimes these are called inner joins.
A join or inner join operation
concatenates two entries when a common
attribute from each has the same value.
However consider:
select *
from S, SP
where S.S# = SP.S#
Where is S8?
If there is an S8 that supplies NO parts,
then S8 is not listed.
If there is NO S8 then S8 is not listed.
Should these be distinguished?
Perhaps with an indication that S8
supplies NO parts if there IS an S8?
If not, what we have is OK.
If a distinction is needed, we need an
outer join.
See author’s note on page 265 for the
significance of the difference.
There are two types of outer joins – a left outer
join and a right outer join.
A left outer join is as follows.
Suppose the connecting attribute from the left table
matches NONE of the connecting attributes from the
right table.
Then the entry from the left table is included in the
result, with NULLS filling in positions that would
have been occupied from a matching entry of the
right table
select *
from S left outer join SP
on S.S# = SP.S#
Will show ALL suppliers – even those who
supply no parts.
A right outer join is defined analogously
Views
You can create a view, which defines the
results of a query.
The view’s definition is stored in the data
dictionary so that you don’t have to
reenter the SQL each time you need it.
Create view view_name as
select statement……..
To create a view in SQL Server
Right click on the views folder and select
New View.
Select the tables or other views you want
to include in your view definition. Click
the Add button.
You can enter the sql in the text area
shown or you can use the gui interface to
select your attributes and conditions.
See views from the demo databases for
examples.
You can right click on a view and select
Design to see its definition.
You just can’t change the view’s
definitions
Importing views from other databases
You must first download base tables using the
instructions from the previous SQL server
powerpoint file
The next powerpoint file will discuss how to
import views using script generation.
A view can be updated
---sometimes
Views represent data from underlying base
tables.
Question: can an update to a view be applied
unambiguously to the underlying base table.
In CS451 Supplier you could change the
city of a row in the Good Supplier view.
Usually cannot update views that contain
aggregate functions or distinct clauses or
one in which a single row represents
several rows in a base table.
Example: can’t change the name of an
entry in the view aboveaveragesupplier.
SQL DML (Data Manipulation
Language): Chapter 7
Can use SQL to insert data into tables,
modify data in tables, or remove entries
from tables.
Some examples follow.
This is extremely useful when writing
stored procedures (later).
Insert a record into the S table
insert into S (S#, Sname, City, Status)
values ('S8', 'zyzzy', 'Chicago', 10)
Modify an existing record in the S table
Update S
set status=40
where S# = 'S8'
Delete an existing record from S
delete from S
where S# = 'S8'
SQL is also used to create tables
The DBMS uses the gui with which you
work to generate code.
You CAN write your own code to create
tables.
Right click on a table and select (for
example)
Script table as 
Create to 
New Query Editor Window