65
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

SQL (Chapter 2: Simple queries; Chapter 7 and 8: Nested and DML queries)

Embed Size (px)

DESCRIPTION

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. - PowerPoint PPT Presentation

Citation preview

Page 1: SQL (Chapter 2: Simple queries; Chapter 7 and 8: Nested and DML queries)

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).

Page 2: SQL (Chapter 2: Simple queries; Chapter 7 and 8: Nested and DML queries)

S# SNAME STATUS CITY P# PNAME COLOR WEIGHTS1 Smith 20 London P1 Nut Blue 12S2 Jones 10 Paris P2 Bolt Green 17S3 Blake 30 Paris P3 Screw Blue 17S4 Clark 20 London P4 Screw Red 14S5 Adams 30 Athens P5 Cam Blue 12

P6 Cog Red 19

S# P# QTYS1 P1 300S1 P2 200S1 P3 400S1 P4 200S1 P5 100S1 P6 100S2 P1 300S2 P3 400S3 P2 200S3 P3 200S4 P2 200S4 P3 300S4 P5 400S5 P3 300S5 P5 200

S P

SP

Page 3: SQL (Chapter 2: Simple queries; Chapter 7 and 8: Nested and DML queries)

SQL: one or more tables view or logical table.

SQL: Query

View: Answer or resulting table

Page 4: SQL (Chapter 2: Simple queries; Chapter 7 and 8: Nested and DML queries)

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.

Page 5: SQL (Chapter 2: Simple queries; Chapter 7 and 8: Nested and DML queries)

General format:

Select stuffFrom 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.

Page 6: SQL (Chapter 2: Simple queries; Chapter 7 and 8: Nested and DML queries)

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.

Page 7: SQL (Chapter 2: Simple queries; Chapter 7 and 8: Nested and DML queries)

Row subsets

List all suppliers with a status larger than 20

Select *From SWhere status > 20

Page 8: SQL (Chapter 2: Simple queries; Chapter 7 and 8: Nested and DML queries)

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.

Page 9: SQL (Chapter 2: Simple queries; Chapter 7 and 8: Nested and DML queries)

Column Subsets combined with row subsets:

List the name and status of each London supplier

Select Sname, StatusFrom SWhere City = ‘London’

(may have to retype the quote marks if copying the above and pasting into SQL Server)

Page 10: SQL (Chapter 2: Simple queries; Chapter 7 and 8: Nested and DML queries)

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.

Page 11: SQL (Chapter 2: Simple queries; Chapter 7 and 8: Nested and DML queries)

Results may contain duplicate rows – it’s time consuming to remove them

Select cityFrom SWhere status = 40

Can put distinct after the Select to eliminate the duplicate rows.

Page 12: SQL (Chapter 2: Simple queries; Chapter 7 and 8: Nested and DML queries)

Compound conditions:List the numbers of Paris suppliers with a status bigger than 20

Select S#From SWhere city = ‘Paris’ and Status > 20;

Could use OR also

Page 13: SQL (Chapter 2: Simple queries; Chapter 7 and 8: Nested and DML queries)

Ordering:

List the number and status of Paris suppliers in descending order of status.

Select S#, statusFrom SWhere city = ‘Paris’Order by Status Desc

Could also use ASC or just leave out.

Page 14: SQL (Chapter 2: Simple queries; Chapter 7 and 8: Nested and DML queries)

Aggregates:

How many suppliers supply part ‘P2’

Select count(*)From SPWhere P# = ‘P2’

If we left out the Where clause, we get a count of ALL entries.

Page 15: SQL (Chapter 2: Simple queries; Chapter 7 and 8: Nested and DML queries)

What is the average quantity supplied by ‘P2’ suppliers

Select avg(qty)From SPWhere P# = ‘P2’

Could use sum, max, min also, among others

How can we get the average quantity for all parts?

Page 16: SQL (Chapter 2: Simple queries; Chapter 7 and 8: Nested and DML queries)

Group by options

Select P#, avg(Qty)From SPGroup by P#

Gets an average for each P# and display each in table format.

Page 17: SQL (Chapter 2: Simple queries; Chapter 7 and 8: Nested and DML queries)

Results of the previous query displays no column name for the avg. Can change this using

Select P#, avg(Qty) as 'average Quantity'From SPGroup by P#

‘average Quantity’ becomes a column name in the result

Page 18: SQL (Chapter 2: Simple queries; Chapter 7 and 8: Nested and DML queries)

Find the supplier with the largest status value

Select S#From SWhere status = ( Select MAX (Status) from S)

This is an example of a nested query – a select within a select.

Page 19: SQL (Chapter 2: Simple queries; Chapter 7 and 8: Nested and DML queries)

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_having.asp]

Page 20: SQL (Chapter 2: Simple queries; Chapter 7 and 8: Nested and DML queries)

SELECT attribute, function(attribute)FROM tableWHERE conditionGROUP BY attribute HAVING function(attribute) operator value

Page 21: SQL (Chapter 2: Simple queries; Chapter 7 and 8: Nested and DML queries)

List suppliers with an average quantity above 200

SELECT S#, avg(qty) as averageFROM SPgroup by S#having avg(qty) >200

Page 22: SQL (Chapter 2: Simple queries; Chapter 7 and 8: Nested and DML queries)

List suppliers with above average quantity

SELECT S#, avg(qty) as ‘average’FROM SPgroup by S#having avg(qty) > (SELECT avg(qty) FROM SP)

Page 23: SQL (Chapter 2: Simple queries; Chapter 7 and 8: Nested and DML queries)

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

Page 24: SQL (Chapter 2: Simple queries; Chapter 7 and 8: Nested and DML queries)

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

Page 25: SQL (Chapter 2: Simple queries; Chapter 7 and 8: Nested and DML queries)

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!

Page 26: SQL (Chapter 2: Simple queries; Chapter 7 and 8: Nested and DML queries)

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’

Page 27: SQL (Chapter 2: Simple queries; Chapter 7 and 8: Nested and DML queries)

How do you negate this?

That is: Find the names of suppliers who do NOT supply part ‘P2’.

Page 28: SQL (Chapter 2: Simple queries; Chapter 7 and 8: Nested and DML queries)

Nested queries:

Select Sname

From S

Where S# IN( Select S#

From SP

Where P# = ‘P2’)

Page 29: SQL (Chapter 2: Simple queries; Chapter 7 and 8: Nested and DML queries)

Or

Select Sname

From S

Where EXISTS( Select *

From SP

Where S# = S.S# and P# = ‘P2’)

Page 30: SQL (Chapter 2: Simple queries; Chapter 7 and 8: Nested and DML queries)

EXISTS is an existential qualifier

NOTE: queries involving IN can be converted to queries involving EXISTS but not necessarily vice-versa.

Page 31: SQL (Chapter 2: Simple queries; Chapter 7 and 8: Nested and DML queries)

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]

Page 32: SQL (Chapter 2: Simple queries; Chapter 7 and 8: Nested and DML queries)

Find the names of suppliers who do NOT supply part ‘P2’.

You can negate nested queries by using NOT IN or NOT EXISTS

Page 33: SQL (Chapter 2: Simple queries; Chapter 7 and 8: Nested and DML queries)

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’)

Page 34: SQL (Chapter 2: Simple queries; Chapter 7 and 8: Nested and DML queries)

Select Sname

From S

Where not EXISTS( Select *

From SP

Where S# = S.S# and P# = ‘P2’)

Page 35: SQL (Chapter 2: Simple queries; Chapter 7 and 8: Nested and DML queries)

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’

Page 36: SQL (Chapter 2: Simple queries; Chapter 7 and 8: Nested and DML queries)

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’))

Page 37: SQL (Chapter 2: Simple queries; Chapter 7 and 8: Nested and DML queries)

Which is better?

The former is probably more clear – but maybe not to all.

The latter allows variations more easily.

Page 38: SQL (Chapter 2: Simple queries; Chapter 7 and 8: Nested and DML queries)

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 (non-red 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

Page 39: SQL (Chapter 2: Simple queries; Chapter 7 and 8: Nested and DML queries)

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#))

Page 40: SQL (Chapter 2: Simple queries; Chapter 7 and 8: Nested and DML queries)

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

Page 41: SQL (Chapter 2: Simple queries; Chapter 7 and 8: Nested and DML queries)

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.

Page 42: SQL (Chapter 2: Simple queries; Chapter 7 and 8: Nested and DML queries)

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#))

Page 43: SQL (Chapter 2: Simple queries; Chapter 7 and 8: Nested and DML queries)

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’)

Page 44: SQL (Chapter 2: Simple queries; Chapter 7 and 8: Nested and DML queries)

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#))

Page 45: SQL (Chapter 2: Simple queries; Chapter 7 and 8: Nested and DML queries)

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.

Page 46: SQL (Chapter 2: Simple queries; Chapter 7 and 8: Nested and DML queries)

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#))

Page 47: SQL (Chapter 2: Simple queries; Chapter 7 and 8: Nested and DML queries)

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.

Page 48: SQL (Chapter 2: Simple queries; Chapter 7 and 8: Nested and DML queries)

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.

Page 49: SQL (Chapter 2: Simple queries; Chapter 7 and 8: Nested and DML queries)

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#

Page 50: SQL (Chapter 2: Simple queries; Chapter 7 and 8: Nested and DML queries)

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?

Page 51: SQL (Chapter 2: Simple queries; Chapter 7 and 8: Nested and DML queries)

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.

Page 52: SQL (Chapter 2: Simple queries; Chapter 7 and 8: Nested and DML queries)

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

Page 53: SQL (Chapter 2: Simple queries; Chapter 7 and 8: Nested and DML queries)

select *

from S left outer join SP

on S.S# = SP.S#

Will show ALL suppliers – even those who supply no parts.

Page 54: SQL (Chapter 2: Simple queries; Chapter 7 and 8: Nested and DML queries)

A right outer join is defined analogously

Page 55: SQL (Chapter 2: Simple queries; Chapter 7 and 8: Nested and DML queries)

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……..

Page 56: SQL (Chapter 2: Simple queries; Chapter 7 and 8: Nested and DML queries)

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.

Page 57: SQL (Chapter 2: Simple queries; Chapter 7 and 8: Nested and DML queries)

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

Page 58: SQL (Chapter 2: Simple queries; Chapter 7 and 8: Nested and DML queries)

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.

Page 59: SQL (Chapter 2: Simple queries; Chapter 7 and 8: Nested and DML queries)

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.

Page 60: SQL (Chapter 2: Simple queries; Chapter 7 and 8: Nested and DML queries)

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.

Page 61: SQL (Chapter 2: Simple queries; Chapter 7 and 8: Nested and DML queries)

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).

Page 62: SQL (Chapter 2: Simple queries; Chapter 7 and 8: Nested and DML queries)

Insert a record into the S table

insert into S (S#, Sname, City, Status)

values ('S8', 'zyzzy', 'Chicago', 10)

Page 63: SQL (Chapter 2: Simple queries; Chapter 7 and 8: Nested and DML queries)

Modify an existing record in the S table

Update S

set status=40

where S# = 'S8'

Page 64: SQL (Chapter 2: Simple queries; Chapter 7 and 8: Nested and DML queries)

Delete an existing record from S

delete from S

where S# = 'S8'

Page 65: SQL (Chapter 2: Simple queries; Chapter 7 and 8: Nested and DML queries)

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