sql queries ordering and grouping. rhs soc 2 sql query - ordering in a query producing a large...
DESCRIPTION
RHS – SOC 3 SQL query - ordering SELECT FROM WHERE ORDER BY Which fields do I want From what table do I want the fields What conditions must the fields fulfill What order are the results sorted inTRANSCRIPT
SQL queriesordering and grouping
RHS – SOC 2
SQL query - ordering
• In a query producing a large result, it may be beneficial to order the result
• SQL allows us to order the result by any of the fields in the result
• We use the keyword ORDER BY
RHS – SOC 3
SQL query - ordering
SELECT <fieldlist>FROM <tablename>WHERE <condition>ORDER BY <fieldname>
Which fields do I want
From what table do I want the fields
What conditions must the fields fulfill
What order are the results sorted in
RHS – SOC 4
SQL query - ordering
• We use a movie information database as example
Movie movieid title country prodyear genre oscars
Actor actorid name country birth living oscars
Casting movieid actorid
RHS – SOC 5
SQL query - orderingmovieid title country prodyear genre oscars
1 E.T. USA 1982 Sci-Fi 4
2 Taxi France 1998 Comedy 0
3 Hunger Denmark 1966 Drama 1
4 Leon France 1994 Thriller 0
5 Hard Boiled HK 1992 Action 0
6 1984 UK 1984 Sci-Fi 2
7 Seven USA 1995 Thriller 1
SELECT *FROM MovieORDER BY title
RHS – SOC 6
SQL query - orderingmovieid title country prodyear genre oscars
6 1984 UK 1984 Sci-Fi 2
1 E.T. USA 1982 Sci-Fi 4
5 Hard Boiled HK 1992 Action 0
3 Hunger Denmark 1966 Drama 1
4 Leon France 1994 Thriller 0
7 Seven USA 1995 Thriller 1
2 Taxi France 1998 Comedy 0
SELECT *FROM MovieORDER BY title
RHS – SOC 7
SQL query - orderingmovieid title country prodyear genre oscars
1 E.T. USA 1982 Sci-Fi 4
2 Taxi France 1998 Comedy 0
3 Hunger Denmark 1966 Drama 1
4 Leon France 1994 Thriller 0
5 Hard Boiled HK 1992 Action 0
6 1984 UK 1984 Sci-Fi 2
7 Seven USA 1995 Thriller 1
SELECT title, prodyearFROM MovieWHERE oscars > 0ORDER BY title
RHS – SOC 8
SQL query - orderingmovieid title country prodyear genre oscars
1 E.T. USA 1982 Sci-Fi 4
2 Taxi France 1998 Comedy 0
3 Hunger Denmark 1966 Drama 1
4 Leon France 1994 Thriller 0
5 Hard Boiled HK 1992 Action 0
6 1984 UK 1984 Sci-Fi 2
7 Seven USA 1995 Thriller 1
SELECT title, prodyearFROM MovieWHERE oscars > 0ORDER BY title
RHS – SOC 9
SQL query - orderingtitle prodyear
1984 1984
E.T. 1982
Hunger 1966
Seven 1995 SELECT title, prodyearFROM MovieWHERE oscars > 0ORDER BY title
RHS – SOC 10
SQL query - ordering
• We can even specifiy more than one field for ordering – secondary fields used if primary fields are identical
• We can choose between descending and ascending order, using the keywords DESC and ASC, respectively
ORDER BY oscars DESC, prodyear ASC
RHS – SOC 11
SQL query - functions
• We can even do some (simple) arithmetic in SQL, using a basic set of functions– COUNT– SUM– AVG– MIN– MAX
• These are called aggregate functions
RHS – SOC 12
SQL query - functions
• A aggregate function works on the values of a specific field (column)
• The set of values is determined by the search conditions
SELECT COUNT(title)FROM MovieWHERE (oscars > 0)
How many movies have won an Oscar
RHS – SOC 13
SQL query - functions
• This query can also be written asSELECT COUNT(title) AS OscarWinnersFROM MovieWHERE (oscars > 0)
• The AS keyword allows us to rename a column in the search result
• Only cosmetic, but useful…
NB!
RHS – SOC 14
SQL query - functions
SELECT COUNT(title) AS OscarWinners,
AVG(oscars) AS averageOscars,
MAX(oscars) AS maximalOscars
FROM MovieWHERE (oscars > 0)
RHS – SOC 15
SQL query - functions
OscarWinners averageOscars maximalOscars
4 2.0000 4
RHS – SOC 16
Exercise 4 – SQL queries• Use the MovieInformation database, defined in exercise 1• With the data in place, run the below queries on the database
– SELECT * FROM Movie ORDER BY prodyear ASC– SELECT title, prodyear FROM Movie ORDER BY title– SELECT MAX(prodyear) AS maxUSA FROM Movie WHERE country = ’USA’– SELECT AVG(prodyear) AS loserYear FROM Movie WHERE (oscars = 0)
• Now formulate queries yourself, in order to retrieve the below data:– Get all oscar-winning movies ordered by year (oldest movie first)– Get a sorted list of movie title for movies made in France– Get the year for the oldest movie not winning any Oscars– Get the average number of Oscars for Sci-Fi movies– Get the total number of Oscars won by movies from USA
RHS – SOC 17
SQL query - grouping
• The aggregate functions are good for calculating properties for the entire result of the search
• We may sometimes wish to find proper-ties for a certain group within the result
• This can be done using WHERE…• …but can be cumbersome if the groups
are very numerous
RHS – SOC 18
SQL query - grouping
• Suppose we have a full movie database, with movies for more than 100 countries
• ”Find the total number of movies made in each country”
SELECT COUNT(title) AS MovieCountFROM MoviesWHERE country = ’…’
• More than 100 queries…
RHS – SOC 19
SQL query - grouping
• A much easier way is to use GROUP BY• Syntax:
SELECT <fieldlist>FROM <tablename>GROUP BY <fieldlist>
• Produces a result for each group, specified in the field list
RHS – SOC 20
SQL query - groupingmovieid title country prodyear genre oscars
1 E.T. USA 1982 Sci-Fi 4
2 Taxi France 1998 Comedy 0
3 Hunger Denmark 1966 Drama 1
4 Leon France 1994 Thriller 0
5 Hard Boiled HK 1992 Action 0
6 1984 UK 1984 Sci-Fi 2
7 Seven USA 1995 Thriller 1
SELECT country,COUNT(title) AS MovieCount
FROM MovieGROUP BY country
RHS – SOC 21
SQL query - groupingmovieid title country prodyear genre oscars
1 E.T. USA 1982 Sci-Fi 4
2 Taxi France 1998 Comedy 0
3 Hunger Denmark 1966 Drama 1
4 Leon France 1994 Thriller 0
5 Hard Boiled HK 1992 Action 0
6 1984 UK 1984 Sci-Fi 2
7 Seven USA 1995 Thriller 1
SELECT country,COUNT(title) AS MovieCount
FROM MovieGROUP BY country
RHS – SOC 22
SQL query - groupingCountry MovieCount
Denmark 1
France 2
HK 1
UK 1
USA 2
RHS – SOC 23
SQL query - groupingCountry OscarTotal
Denmark 1
France 0
HK 0
UK 2
USA 5
SUM(oscars) AS …
RHS – SOC 24
SQL query - grouping
• In the last example, it might be desirable to leave out results where total is zero
• In general; only include groups which fulfill some criteria
• This can be done using the HAVING keyword
RHS – SOC 25
SQL query - grouping
• Syntax:SELECT <fieldlist>FROM <tablename>GROUP BY <fieldlist>HAVING <criteria>
RHS – SOC 26
SQL query - groupingmovieid title country prodyear genre oscars
1 E.T. USA 1982 Sci-Fi 4
2 Taxi France 1998 Comedy 0
3 Hunger Denmark 1966 Drama 1
4 Leon France 1994 Thriller 0
5 Hard Boiled HK 1992 Action 0
6 1984 UK 1984 Sci-Fi 2
7 Seven USA 1995 Thriller 1
SELECT country,SUM(oscars) AS OscarTotal
FROM MovieGROUP BY countryHAVING (SUM(oscars) > 0)
RHS – SOC 27
SQL query - groupingmovieid title country prodyear genre oscars
1 E.T. USA 1982 Sci-Fi 4
2 Taxi France 1998 Comedy 0
3 Hunger Denmark 1966 Drama 1
4 Leon France 1994 Thriller 0
5 Hard Boiled HK 1992 Action 0
6 1984 UK 1984 Sci-Fi 2
7 Seven USA 1995 Thriller 1
SELECT country,SUM(oscars) AS OscarTotal
FROM MovieGROUP BY countryHAVING (SUM(oscars) > 0)
RHS – SOC 28
SQL query - groupingCountry OscarTotal
USA 5
France 0
UK 2
HK 0
Denmark 1
RHS – SOC 29
SQL query - grouping
Country OscarTotal
USA 5
UK 2
Denmark 1
RHS – SOC 30
SQL query - grouping
• But wait…• …isn’t HAVING the same as WHERE..?• Not quite
– WHERE is for filtering out specific records– HAVING is for filtering out specific groups
from the final result• We cannot use an aggregate function in a
WHERE clause
RHS – SOC 31
Exercise 5 – SQL queries• Use the MovieInformation database, defined in exercise 1• With the data in place, run the below queries on the database
– SELECT genre, AVG(oscars) FROM Movie GROUP BY genre– SELECT oscars, MAX(prodyear) FROM Movie WHERE (oscars > 0) GROUP BY
oscars– SELECT genre, AVG(oscars) FROM Movie GROUP BY genre HAVING
(COUNT(title) > 1)
• Now formulate queries yourself, in order to retrieve the below data:– Get a list of the total count of movies, grouped by country. Within each
contry group, the count should be grouped by genre– Get a list of the average number of oscars won by movies, grouped by
country– Get a list of the total count of movies, grouped by country. Only include
movies made after 1985