SQL - Once More With Feeling

+
SQL – Once More With
Feeling
+
Review and Questions
 Topics
from last lecture
 Terminology
 Questions?
+
Auto Increment

Key Word for MS SQL – Identity

Can specify at time of table creation – The easiest

CREATE TABLE PlayerDetails(
PlayerID
INT
Primary Key Identity,
PlayerFirstName
Char(30)
Not Null,
…
);

Or alter tables to include Identity
+
Happy Valley Golf
+
Altering Player ID to include
-- PlayerID
Alter Table PlayerHandicap
drop constraint PLAYERID_FK;
Alter Table Player_Rounds
drop constraint PLAYERID2_FK;
Alter Table PlayerDetails
drop constraint PLAYERID_PK;
Alter Table PlayerDetails
Drop column PlayerId;
Alter Table PlayerDetails
Add PlayerID int identity;
Alter Table PlayerDetails
Add constraint pk_PlayerID
primary key(PlayerId);
Alter Table PlayerHandicap
Add Constraint PLAYERID_FK
Foreign Key (PlayerId)
References PlayerDetails(PlayerId);
Alter Table Player_Rounds
Add Constraint PLAYERID2_FK
Foreign Key (PlayerId)
References PlayerDetails(PlayerId);
+
Group By

The GROUP BY statement is used in conjunction with the
aggregate functions to group the result-set by one or more
columns.

How many rounds of Golf have been played?

How many rounds of Golf have been played at each golf
course? (Just need the id for the course)
+
Group By

How many rounds of Golf have been played?

SELECT Count(RoundId) AS NumberofRounds
FROM GolfRounds;

How many rounds of Golf have been played at each golf
course? (just need id for the course)

SELECT CourseID, Count(RoundId) AS NumberofRounds
FROM GolfRounds
GROUP BY CourseID;
+
Having

Allows for the results to be displayed for only a selection of
the results of the function (count, average, etc).

How many multiple rounds of Golf have been played at each
golf course (display results for only courses that have more
than 1 round)? (just need id for the course)
+
Having

How many multiple rounds of Golf have been played at each
golf course (display results for only courses that have more
than 1 round)? (just need id for the course)

SELECT CourseID, Count(RoundId) AS NumberofRounds
FROM GolfRounds
GROUP BY CourseID;
HAVING COUNT(RoundId) > 1;
+
One Step Farther

How many rounds of Golf have been played at each golf
course and what golf course have they been played at (name
of the course)?

SELECT CourseName, Count(RoundId) AS NumberofRounds
FROM GolfRounds AS GR , GolfCourses AS GC
WHERE GR.CourseID = GC.CourseID
GROUP BY GR.CourseID, CourseName;
+
Join

Needed when the results displayed come from multiple
tables.

If the results to display come from one table you can use a
subquery
+
Inner Joins

Returns the rows when there is at least one match in both tables.

SELECT CourseName, Count(RoundId)
FROM GolfRounds AS GR , GolfCourses AS GC
WHERE GR.CourseID = GC.CourseID
GROUP BY GR.CourseID, CourseName;
+
Join … On

Will give the same results as the join query on the previous
slide

SELECT CourseName, Count(RoundId)
FROM GolfRounds AS GR JOIN GolfCourses AS GC
ON GR.CourseID = GC.CourseID
GROUP BY GR.CourseID, CourseName;
+
Outer Join

Returns all rows from both the participating tables which satisfy the
join condition along with rows which do not satisfy the join
condition.

How many rounds of Golf have been played at each golf course and
what golf course have they been played at (name of the course)?
Display all golf courses even if there has been no rounds played.

SELECT CourseName, Count(RoundID)
FROM GolfRounds AS GR RIGHT JOIN GolfCourses AS GC
ON GR.CourseID = GC.CourseID
GROUP BY GR.CourseID, CourseName;
+
Outer Join

Can use left Join as well.

SELECT CourseName, Count(RoundID)
FROM GolfCourses AS GC LEFT JOIN GolfRounds AS GR
ON GR.CourseID = GC.CourseID
GROUP BY GR.CourseID, CourseName;
+
Multiple Joins

You can use multiple tables together, not just two.

Show player’s names along with their average hole score and their
handicap, for all players that have a handicap and have recorded
round scores.

SELECT PlayerFirstName, PlayerLastName, Avg(HoleScore) AS
AvgHoleScore, Avg(HandicapScore) AS AvgHandicapScore
FROM PlayerDetails AS PD, Player_Rounds AS PR,
PlayerHandicap AS PH
WHERE PD.PlayerID = PR.PlayerID
AND PR.PlayerID = PH.PlayerID
GROUP BY PlayerLastName, PlayerFirstName
+
Multiple Joins .. Using JOIN…. ON

Show all player’s names along with their average hole score and
their handicap

SELECT PlayerFirstName, PlayerLastName, Avg(HoleScore) AS
AvgHoleScore, Avg(HandicapScore) AS AvgHandicapScore
FROM (PlayerDetails AS PD JOIN Player_Rounds AS PR ON
PD.PlayerID = PR.PlayerID) JOIN
PlayerHandicap AS PH ON PR.PlayerID =
PH.PlayerID
GROUP BY PlayerLastName, PlayerFirstName
+
Multiple Joins – Outer Join

Show all player’s names along with their average hole score
and their handicap
SELECT PlayerFirstName, PlayerLastName, Avg(HoleScore) AS
AvgHoleScore, Avg(HandicapScore) AS AvgHandicapScore
FROM (PlayerDetails AS PD LEFT JOIN Player_Rounds AS PR
ON PD.PlayerID = PR.PlayerID)
LEFT JOIN PlayerHandicap AS PH ON PR.PlayerID =
PH.PlayerID
GROUP BY PlayerLastName, PlayerFirstName

+
Practice

1.) Display each golf courses name, the average yards and
par for holes at each course.

2.) Display each golf courses name, the average yards and
par for holes at each course, and the number of holes played
at the course. (Include all courses)

3.) Display each golf courses name, the average yards and
par for holes at each course, and the number of rounds
played at the course. (Include all courses)
+
Question 1

Display each golf courses name, the average yards and par for
holes at each course.

SELECT CourseName, Avg(YardsForHole) AS AvgYardsForHole,
Avg(ParForHole) AS ParForHole
FROM GolfCourses AS GC LEFT JOIN CourseHoleDetails AS CHD
ON GC.CourseID = CHD.CourseID
GROUP BY GC.CourseID, CourseName
+

Question 2
Display each golf courses name, the average yards and par for holes at
each course, and the number of holes played at the course. (Include all
courses)

SELECT CourseName, Count(RoundId) AS NumberofHolesPlayer,
Avg(YardsForHole) AS AvgYardsForHole, Avg(ParForHole) AS ParForHole
FROM (GolfCourses AS GC LEFT JOIN GolfRounds AS GR
ON GR.CourseID = GC.CourseID)
RIGHT JOIN CourseHoleDetails AS CHD
ON GC.CourseID = CHD.CourseID
GROUP BY GR.CourseID, CourseName;
+
Question 3

Display each golf courses name, the average yards and par
for holes at each course, and the number of rounds played at
the course. (Include all courses)

SELECT CourseName, Count(DISTINCT RoundId) AS
NumberofHolesPlayer, Avg(YardsForHole) AS AvgYardsForHole,
Avg(ParForHole) AS ParForHole
FROM (GolfCourses AS GC LEFT JOIN GolfRounds AS GR
ON GR.CourseID = GC.CourseID)
RIGHT JOIN CourseHoleDetails AS CHD
ON GC.CourseID = CHD.CourseID
GROUP BY GR.CourseID, CourseName;
+
SQL Extra’s
+
Example – Inner Join
TableA
TableB
ID
FName
ID
LName
1
Jim
1
Smith
2
Bob
3
Jones
3
Sally
5
Adams
4
Beth
7
Zhu
Inner Join
Select FName, Lname
From TableA Join TableB
on TableA.ID = TableB.ID
Results
FName
LName
Jim
Smith
Sally
Jones
+
Example – Outer Join - Left
TableA
TableB
ID
FName
ID
LName
1
Jim
1
Smith
2
Bob
3
Jones
3
Sally
5
Adams
4
Beth
7
Zhu
Outer Join Left
Select FName, Lname
From TableA Left Join TableB
on TableA.ID = TableB.ID
Results
FName
LName
Jim
Smith
Bob
Null
Sally
Jones
Beth
Null
+
Example – Outer Join - Right
TableA
TableB
ID
FName
ID
LName
1
Jim
1
Smith
2
Bob
3
Jones
3
Sally
5
Adams
4
Beth
7
Zhu
Outer Join
Select FName, Lname
From TableA Right Join TableB
on TableA.ID = TableB.ID
Results
FName
LName
Jim
Smith
Sally
Jones
Null
Adams
Null
Zhu
+
Question
 How
do we get results from both table?
+
Union

Combines the results of two or more queries into a single
result set that includes all the rows that belong to all queries
in the union

The UNION operation is different from using joins that
combine columns from two tables.

The following are basic rules for combining the result sets of
two queries by using UNION:



The number and the order of the columns must be the same in all
queries.
The data types must be compatible
Column names for the final result set are taken from the first
query
+
Union / Union All - keywords
 UNION

allow you to join multiple datasets into one dataset and will
remove any duplicates that exist. Basically it is performing
a DISTINCT operation across all columns in the result set.
 UNION

ALL
allows you to join multiple datasets into one dataset, but it
does not remove any duplicate rows. Because this does not
remove duplicate rows this process is faster, but if you don't
want duplicate records you will need to use the UNION
operator instead.
+
Example - Union
TableA
TableB
ID
FName
ID
LName
1
Jim
1
Smith
2
Bob
3
Jones
3
Sally
5
Adams
4
Beth
7
Zhu
Results
Union
Select FName, Lname
From TableA Left Join TableB
on TableA.ID = TableB.ID
UNION
Select FName, Lname
From TableA Right Join TableB
on TableA.ID = TableB.ID
FName
LName
Jim
FName
Bob
Smith
LName
Null
Jim
Sally
Sally
Beth
Smith
Jones
Jones
Null
Null
Adams
Null
Zhu
+
Example – Union All
TableA
TableB
ID
FName
ID
LName
1
Jim
1
Smith
2
Bob
3
Jones
3
Sally
5
Adams
4
Beth
7
Zhu
Results FName
Union
Select FName, Lname
From TableA Left Join TableB
on TableA.ID = TableB.ID
UNION ALL
Select FName, Lname
From TableA Right Join TableB
on TableA.ID = TableB.ID
LName
Jim
Smith
Bob
Null
Sally
FName
Beth
Jim
Jim
Sally
Sally
Jones
LName
Null
Smith
Smith
Jones
Jones
Null
Adams
Null
Zhu