taking your sql beyond simple selects and (inner) joins

Upload: reinnard-torrano-abalos

Post on 06-Apr-2018

219 views

Category:

Documents


0 download

TRANSCRIPT

  • 8/3/2019 Taking Your SQL Beyond Simple SELECTs and (Inner) Joins

    1/48

    Taking Your SQL Beyond Simple

    SELECTs and (Inner) Joins

    Charlie [email protected]

  • 8/3/2019 Taking Your SQL Beyond Simple SELECTs and (Inner) Joins

    2/48

    May 3, 2012 2

    Why Are We Here?

    Hopefully youve read the session description

    Many developers quickly grasp how to do simple Selects and

    simple (inner) joins in SQL But often the fail to get past those fundamentals

    And end up missing data (for lack of understanding outer joins)

    or writing code in client applications that would be better performed in thedatabase

    Will introduce important fundamental features of SQL that will save you time and create more effective applications

    You'll learn how to slice and dice data in many ways Handling Distinct Column Values

    Manipulating Data with SQL Functions

    Summarizing Data with SQL (Counts, Averages, etc.)

    Grouping Data with SQL

    Handling Nulls

    And understand the value of inner, outer and self-joins.

  • 8/3/2019 Taking Your SQL Beyond Simple SELECTs and (Inner) Joins

    3/48

    May 3, 2012 3

    Managing Expectations

    Many sessions focus on latest and greatest features Sometimes, we miss out on the fundamentals

    This talks subjects may seem old school But it applies to DBAs and developers (both client and web app)

    Not everyone attending CodeCamp is advanced, oreven intermediate

    Will see code, but purely SQL code As could be used in any app, and mostly any database

    Will work mostly from slides, showing code andresults along with explanations Sure, I could have done all live demos and commentary

    But this way you can download and review all the key points

  • 8/3/2019 Taking Your SQL Beyond Simple SELECTs and (Inner) Joins

    4/48

    May 3, 2012 4

    About Your Speaker

    CTO of Garrison Enterprises (Charlotte) 9 yrs Web App experience (23 yrs in Enterprise IT)

    Frequent article/blog author, contributor to severalbooks, and 2 recent MSDN webcasts

    Frequent speaker to user groups, conferencesworldwide

  • 8/3/2019 Taking Your SQL Beyond Simple SELECTs and (Inner) Joins

    5/48

    May 3, 2012 5

    Slicing and Dicing Data in Many Ways

    Theres more to database processing than simplyselecting columns for display. May want to massagethe data

    There are many examples of more challenging SQL

    problems, and lets consider several: Handling distinct column values

    o Show each distinct lastname for employees

    Manipulating data before or after selecting it

    o Show the first 30 characters of a description column

    o Find rows where the year in a date column is a particular year

  • 8/3/2019 Taking Your SQL Beyond Simple SELECTs and (Inner) Joins

    6/48

    May 3, 2012 6

    Slicing and Dicing Data in Many Ways

    As well as: Summarizing data

    o Show how many employees we have

    o Show how many employees make more than $40k

    o Show how many employees have not been terminated

    o Show the average, max, and min salary for all employees

    o Show the total salary for all employees

    o Show how many distinct salary levels there are

    Sli i d Di i D i M W

  • 8/3/2019 Taking Your SQL Beyond Simple SELECTs and (Inner) Joins

    7/48May 3, 2012 7

    Slicing and Dicing Data in Many Ways(cont.)

    As well as: Grouping Data

    o Show those counts, averages, or totals by department

    o Show those departments whose count/avg/total meets some criteria

    Handling Nulls

    o

    Show employees who have not been terminated (TerminationDatecolumn is null)

    o Count how many employees do not live in NYC

    Cross-referencing tables

    o Show each employee and their department

    o Show all employees and their department, even if not assigned to one

    o Show each employee and their manager

    Ti 1 W ki ith D t i SQL V

  • 8/3/2019 Taking Your SQL Beyond Simple SELECTs and (Inner) Joins

    8/48May 3, 2012 8

    Tip 1: Working with Data in SQL VersusApplication Code

    SQL provides the means to do each of those tasks And client code may have some means to do some of them

    o Whether in Windows or web forms, C#, VB.NET, etc

    Many developers create complicated code/scripts todo what SQL can enable with simpler constructs Same problems arise in other web app dev environments

    Experienced developers/DBAs will admonish: Dont do things in code that you can better do in SQL

    The challenge is deciding which to use

    SQL 2005s support of CLR coding in SPs raises risk

  • 8/3/2019 Taking Your SQL Beyond Simple SELECTs and (Inner) Joins

    9/48May 3, 2012 9

    Tip 2: Client vs SQL Functions

    Both SQL and client code offer functions for string, numeric,date, list and other manipulation Challenge is when to know which to use

    Client applications (C#, VB.NET, etc.) offers hundreds offunctions These are used in a format such as Left(), DateFormat()

    Used within scripts, these can even be used to build SQLo If used in building SQL, evaluated beforeSQL is passed to the DBMS

    o If used in processing results, evaluated afterresults returned from the DBMS

    SQL also offers several functions, as we will learn Also used in same format, such as Left()

    Indeed, many share the same name!

    Evaluated by DBMS whileprocessing the SQL to produce results Could indeed use both client code and SQL functions in a given

    SQL statement Again, need to take care in deciding which to use

    In this seminar, focus is on SQL functions

  • 8/3/2019 Taking Your SQL Beyond Simple SELECTs and (Inner) Joins

    10/48May 3, 2012 10

    Handling Distinct Column Values

    Typical Problems: Show each distinct lastname for employees

    Can try to do it manually, looping through all rowsand placing unique values in an array Tedious, Slow, Unnecessary!

    SQL offers simple solution to produce list of uniquevalues

    H dli Di ti t C l V l

  • 8/3/2019 Taking Your SQL Beyond Simple SELECTs and (Inner) Joins

    11/48May 3, 2012 11

    Problem: Show each distinct lastname for employees Solution: DISTINCTkeyword used before column

    name

    Example: (assuming we had a Lastname column)

    Possible Query Result Set Values:Abbot

    Brown

    Coleman

    Note: when used with multiple columns, DISTINCTmust be specified first. Applies to all columns Cant do SELECT Degree, DISTINCT Salary

    Can do SELECT DISTINCT Salary, Degreeo Creates distinct instances of the combined values from each

    Handling Distinct Column Values:DISTINCT Keyword

    SELECT Distinct LastName

    FROM EmployeesORDER BY Lastname

  • 8/3/2019 Taking Your SQL Beyond Simple SELECTs and (Inner) Joins

    12/48May 3, 2012 12

    Manipulating Data with SQL Functions

    Typical Problems: Show the first 30 characters of a description column

    Find rows where the year in a date column is a particular year

    Tempting to try with code functions in client app May be wasteful, or impossible

    SQL functions may be more efficient, and could evenhave more features In any case, remember admonition:

    o Dont do in client code that which you can do in SQL

    Beware: while some SQL functions are shared by all DBMSs, eachsupports its own or variations

    M i l ti D t ith SQL T t

  • 8/3/2019 Taking Your SQL Beyond Simple SELECTs and (Inner) Joins

    13/48May 3, 2012 13

    Manipulating Data with SQL: TextFunctions

    Problem: Show the first 30 characters of adescription column Can certainly use most client languages Left() function to

    substring the result passed back from SQL

    o But this means sending all data from DB to the client (or ASP.NET),only to then be stripped down to 30 chars. Wasteful!

    Solution: Use SQL Left() function

    Example:

    Note: There are many other similar text manipulation

    functions, depending on DBMS Length(), Lower(), Upper(), Ltrim(), Soundex(), etc.

    Investigate DBMS documentation to learn more

    SELECT Left(Description,30) FROM Products

    Manip lating Data ith SQL Date

  • 8/3/2019 Taking Your SQL Beyond Simple SELECTs and (Inner) Joins

    14/48May 3, 2012 14

    Manipulating Data with SQL: DateFunctions

    Problem: Find rows where the year in a date columnis a particular year Assuming date column contains month, day, and year, how to just

    search on year?

    Could find records between 01/01/xx and 12/31/xx

    Solution: Use SQL DatePart() function Example:

    Note: each DBMS will have its own date handlingfunctions and function arguments This example is from SQL Server. Could also use Year(HireDate)

    There are many other similar date manipulationfunctions, depending on DBMS Also will find numeric functions, system functions, and more

    SELECT LastName FROM Employees

    WHERE DatePart(yyyy,HireDate) = 2001

  • 8/3/2019 Taking Your SQL Beyond Simple SELECTs and (Inner) Joins

    15/48May 3, 2012 15

    Summarizing Data with SQL

    Typical Problems: Show how many employees we have

    Show how many employees make more than $40k

    Count how many employees have not been terminated

    Show the average, max, and min salary for all employees

    Show the total salary for all employees Show how many distinct salary levels there are

    Again, tempting to try with client code processing May be complicated, wasteful

    SQL functions may be more efficient, more powerful

    SQL functions for summarizing data are known as aggregatefunctions: Count, Min, Max, Avg, Sum

    o Others include StdDev (standard deviation), Var (variance)

    Summarizing Data with SQL: Count(*)

  • 8/3/2019 Taking Your SQL Beyond Simple SELECTs and (Inner) Joins

    16/48

    May 3, 2012 16

    Summarizing Data with SQL: Count(*)Function

    Problem: Show how many employees we have Newcomers may find all records and count on client/middle tier

    o But if all we want is the count, this is wasteful!!!

    Solution: Use SQL Count(*) function

    Example:

    Possible Query Result Set Values: 54

    Notes: We use a column alias in order to refer to that count within code

    Returns only a single-record resultseto In SQL Server, does clustered index scan

    o Still, much faster than SELECT * and count in client application

    o Should store the number in client app and reuse as long as possible

    More on count(columnname) later

    Other uses of count, to follow

    SELECT Count(*) as RecCount

    FROM Employees

    Summarizing Data with SQL: Count(*)

  • 8/3/2019 Taking Your SQL Beyond Simple SELECTs and (Inner) Joins

    17/48

    May 3, 2012 17

    Summarizing Data with SQL: Count(*)Function and Filter

    Problem: Show how many employees make morethan $40k

    Solution: Use SQL Count(*) function and a filter Simple matter of adding a WHERE clause to indicate the desired

    criteria

    Example: SELECT Count(*) as RecCountFROM Employees

    WHERE Salary > 40000

    Summarizing Data with SQL: Count(col)

  • 8/3/2019 Taking Your SQL Beyond Simple SELECTs and (Inner) Joins

    18/48

    May 3, 2012 18

    Summarizing Data with SQL: Count(col)Function

    Problem: Count how many employees have beenterminated

    Solution: Use SQL Count(column) function Instead of counting all records, count all having a value for a given

    column

    Assume terminated employees have a value in theTerminationDate column

    Example:

    Note: doesnt count records having null column value Will discuss nulls later

    In this case, the behavior is as expected. May not always be

    SELECT Count(TerminationDate) as RecCount

    FROM Employees

    Summarizing Data with SQL:

  • 8/3/2019 Taking Your SQL Beyond Simple SELECTs and (Inner) Joins

    19/48

    May 3, 2012 19

    Summarizing Data with SQL:AVG/MAX/MIN Functions

    Problem: Show the average, max, and min salary forall employees

    Solution: Use SQLAvg(), Min(), or Max() functions Besides just counting records having any value for a given column,

    can also use these functions to summarize

    Example:

    Notes: Like Count(column) function, these functions ignores columns with

    null valueso I.e., is average of records having a value for that column

    Also, can add a filter in order to compute summaries for recordsmeeting some other criteria

    SELECTAvg(Salary) as AvgSal, Min(Salary) as MinSal,

    Max(Salary) as MaxSal

    FROM Employees

    Summarizing Data with SQL: SUM

  • 8/3/2019 Taking Your SQL Beyond Simple SELECTs and (Inner) Joins

    20/48

    May 3, 2012 20

    Summarizing Data with SQL: SUMFunction

    Problem: Show the total salary for all employees Solution: Use SQL Sum() function

    Just as other functions compute Avg/Min/Max, can use Sumfunction to add up all values of column

    Example:

    Notes: Can also perform mathematical computation on the column and

    sum that:SELECT SUM(Salary * 1.20)

    Or perform computation between two or more columns and sum

    that, as in:SELECT SUM(Salary*RaisePct)

    SELECT Sum(Salary) as SumSal

    FROM Employees

    Summarizing Data with SQL: Using

  • 8/3/2019 Taking Your SQL Beyond Simple SELECTs and (Inner) Joins

    21/48

    May 3, 2012 21

    Summarizing Data with SQL: UsingDISTINCT with Functions

    Problem: Show how many distinct salary levels thereare

    Solution: Use DISTINCT keyword with functions Rather than perform given function against all values of the given

    column in all records, can performs it against only the unique

    values that exist

    Example:

    Notes: Note that this will produce just one number: the number of distinct

    salary values that existo To produce instead a count of employees at each salary level, need to

    learn about SQL GROUP BYclause (coming next)

    Can also use AVG (average of distinct values rather than of allvalues). MIN and MAX would return same result either way

    SELECT Count(DISTINCT Salary) as NumDistinctSals

    FROM Employees

  • 8/3/2019 Taking Your SQL Beyond Simple SELECTs and (Inner) Joins

    22/48

    May 3, 2012 22

    Grouping Data with SQL

    Typical Problems: Show those counts, averages, or totals by department

    Show which departments have count/avg/total meets some criteria

    SQL provides a GROUP BY clause that can be used tocreate a list of unique values for a column Difference from DISTINCT is that it also rolls up the rows

    o aggregates some computation over all the records having that uniquevalue

  • 8/3/2019 Taking Your SQL Beyond Simple SELECTs and (Inner) Joins

    23/48

    May 3, 2012 23

    Grouping Data with SQL

    Assume the employees table has a Dept column Example:

    Note: this simple example creates a result no

    different than SELECT DISTINCT Dept You would nottypically use this statement, because youre also

    asking the DB to roll up rows having the same value of Dept, butare aggregating nothing

    Difference comes when combined with the previously presentedaggregate functions, which then aggregate the data BYthe unique

    grouped column values

    SELECT Dept FROM Employees

    GROUP BY Dept

    Grouping Data with SQL: Using GROUP BY

  • 8/3/2019 Taking Your SQL Beyond Simple SELECTs and (Inner) Joins

    24/48

    May 3, 2012 24

    Grouping Data with SQL: Using GROUP BYwith Count Function

    Problem: Show count of employees by department Solution: Use GROUP BY with COUNT(*) function

    Example:

    Possible QueryResult Set Values:

    Notes: In example, first row in resultset represents records with

    null value for Dept column

    Order of rows is random. Could add ORDER BY Dept

    o If present, must be specified AFTER the GROUP BY

    SELECT Dept, Count(*) as CountEmp

    FROM Employees

    GROUP BY Dept

    4

    Sales 15

    Engineering 33

    Marketing 7

    Grouping Data with SQL: Using GROUP BY

  • 8/3/2019 Taking Your SQL Beyond Simple SELECTs and (Inner) Joins

    25/48

    May 3, 2012 25

    Grouping Data with SQL: Using GROUP BYwith Avg Function

    Problem: Show average salary by department Solution: Use GROUP BY with Avg(column) function

    Aggregate on a column other than that being grouped

    Example:

    Possible Query Result Set Values:

    Notes: Could use Min/Max/Count(column) too

    SELECT Dept, Avg(Salary) as AvgSalary

    FROM Employees

    GROUP BY Dept

    45687

    Sales 83276

    Engineering 75500

    Marketing 55000

    Grouping Data with SQL: Using GROUP BY

  • 8/3/2019 Taking Your SQL Beyond Simple SELECTs and (Inner) Joins

    26/48

    May 3, 2012 26

    Grouping Data with SQL: Using GROUP BYwith Functions

    More notes: Columns to be SELECTed can only be aggregate functions and/or

    column named in GROUP BY

    o Could not use:

    Since LastName isnt being GROUPed and isnt an aggregate function itself

    Often a source of confusion, though it clearly wouldnt make sense to showLastName here

    SELECT Lastname, Dept FROM Employees

    GROUP BY Dept

    Grouping Data with SQL: Using GROUP BY

  • 8/3/2019 Taking Your SQL Beyond Simple SELECTs and (Inner) Joins

    27/48

    May 3, 2012 27

    Grouping Data with SQL: Using GROUP BYwith Filter

    Problem: Show average salary by departments ofemployees whove completed grade 12

    Solution: Use GROUP BY with filter WHERE clause limits which records are to be GROUPed

    Example:

    More notes: WHERE must occur after FROM, before GROUP

    o Order of appearance:

    FROM, WHERE, GROUP BY, ORDER BY

    To select records whose aggregated values meet some criteria, useHAVING clause

    SELECT Dept, Avg(Salary) as AvgSalary

    FROM Employees

    WHERE GradeCompleted >= 12

    GROUP BY Dept

    Grouping Data with SQL: Using GROUP BY

  • 8/3/2019 Taking Your SQL Beyond Simple SELECTs and (Inner) Joins

    28/48

    May 3, 2012 28

    Grouping Data with SQL: Using GROUP BYwith HAVING

    Problem: Show departments whose employees havean average salary greater than $40,000

    Solution: Use GROUP BY with HAVING

    Example:

    Note: HAVING must occur after GROUP BY, before ORDER BY

    Order of appearance:

    o FROM, WHERE, GROUP BY, HAVING, ORDER BY

    Expression in HAVING cant refer to alias from SELECT clauseo In example above, couldnt use HAVING AvgSalary > 40000

    SELECT Dept, Avg(Salary) as AvgSalary

    FROM Employees

    GROUP BY DeptHAVING Avg(Salary) > 40000

  • 8/3/2019 Taking Your SQL Beyond Simple SELECTs and (Inner) Joins

    29/48

    May 3, 2012 29

    Handling Nulls

    About Nulls Columns that have no value are considered NULL

    o Null is not the same as a space or 0 or empty string (). Its no valueat all

    A column can be defined to not allow nulls

    Can select which columns are or arent null with IS NULL or IS NOTNULL in WHERE clause

    Typical Problems: Show employees who have not been terminated

    Count how many employees do not live in NYC

  • 8/3/2019 Taking Your SQL Beyond Simple SELECTs and (Inner) Joins

    30/48

    May 3, 2012 30

    Handling Nulls: Searching for Nulls

    Problem: Show employees who have not beenterminated Assume TerminationDate is null if not yet terminated

    Solution: Use IS NULL in WHERE clause

    Example:SELECT LastName

    FROM Employees

    WHERE TerminationDate IS NULL

    Handling Nulls: Negated Searching And

  • 8/3/2019 Taking Your SQL Beyond Simple SELECTs and (Inner) Joins

    31/48

    May 3, 2012 31

    Handling Nulls: Negated Searching AndImpact of Nulls

    Problem: Count how many employees do not live inNYC Be careful selecting records that dont have some given value

    Tempting to use:Select count(*)

    FROM Employees

    WHERE City New York

    Problem is it doesnt find records that dont have a value for cityo Consider 200 records: 10 in New York, 5 are null

    o Is answer 185 or 190? Depends on if you think nulls count City New York ignores records with null values (null is neither equal to

    nor not equal to new york

    Solution: May want to add OR column IS NULL Example: SELECT Count(*)

    FROM Employees

    WHERE CITY New York

    OR CITY IS NULL

  • 8/3/2019 Taking Your SQL Beyond Simple SELECTs and (Inner) Joins

    32/48

    May 3, 2012 32

    Understanding Relational Database Design

    Relational Databasesare comprised of several tables, eachstoring data about a particular aspect of the subject beingdescribed

    Goals are: store only related data in a single table

    dont repeat data (dont store it in more than one place)

    ensure integrity of data cross-referenced between tables

    Can be challenging to cross-reference that data

    Personnel

    Departments

    Offices

    Employees

  • 8/3/2019 Taking Your SQL Beyond Simple SELECTs and (Inner) Joins

    33/48

    May 3, 2012 33

    Understanding Foreign Keys

    Recall previous examples of GROUPing on Deptcolumn Assumed that Employees table had DEPT column holding string

    values for department name

    Problems with this include:o Were storing the same string multiple times on many records

    o If a mistake is made entering a given value, that record will no longerbe found in searches on value (see EmpID 4)

    Employees

    EmpID Name HireDate Dept

    1 Bob 06-04-98 Sales

    2 Cindy 12-01-00 Engineering

    3 John 01-01-01 Sales

    4 Beth 05-30-99 Engineering

  • 8/3/2019 Taking Your SQL Beyond Simple SELECTs and (Inner) Joins

    34/48

    May 3, 2012 34

    Understanding Foreign Keys

    More appropriate solution: Have Department table with just a list of each valid Dept and a

    unique DeptID (that tables primary key)

    Then in Employees table, simply store that DeptID to indicate anemployees department

    o This DeptID in the Employees table is called a Foreign Key Since it holds a value that comes from the primary key of another table

    This is the fundamental aspect of a relational design

    Employees

    EmpID Name HireDate DeptID

    1 Bob 06-04-98 1

    2 Cindy 12-01-00 2

    3 John 01-01-01 1

    4 Beth 05-30-99 2

    Departments

    DeptID Dept

    1 Sales

    2 Engineering

  • 8/3/2019 Taking Your SQL Beyond Simple SELECTs and (Inner) Joins

    35/48

    May 3, 2012 35

    Cross-Referencing Tables (Joins)

    Typical Problems: Show each employee and their department

    Show all employees and their department, even if not assigned toone

    Show each employee and their manager

    May be tempting for beginners to loop throughresultset of one query (departments) and search forrelated records (employees for each dept) Bad! Bad! Bad!

    Correct solution is to instead JOIN the tables together

    There are several kinds of joins, each serving different purposes

  • 8/3/2019 Taking Your SQL Beyond Simple SELECTs and (Inner) Joins

    36/48

    May 3, 2012 36

    Understanding Joins

    To retrieve data from multiple tables, simply list bothtables in FROM clause, such as:

    Note that if columns of the same name existed in each table, wedneed to prefix the table name to the column

    Only problem is that this selects all combinations ofthe values in the two columns In our example table, would create 8 rows in result

    o 4 employees times 2 departments

    Not really what we likely wanted

    o Called a cartesian productor a cross join

    Bob Sales

    Cindy Sales

    John Sales

    Beth Sales

    Bob Engineering

    Cindy Engineering

    John Engineering

    Beth Engineering

    SELECT Name, Dept

    FROM Employees, Departments

  • 8/3/2019 Taking Your SQL Beyond Simple SELECTs and (Inner) Joins

    37/48

    May 3, 2012 37

    Inner Joins

    Problem: Show each employee and their department

    Solution: Perform Inner Joinof the two tables indicate columns in each table that share common value. SQL

    automatically matches themo Typically, where one tables foreign key maps to its corresponding

    primary key in a related table

    Example:

    Correct Result:

    Note: the datatype of the columns being joined mustmatch

    SELECT Name, Dept

    FROM Employees, Departments

    WHERE Employees.DeptID = Departments.DeptID

    Bob Sales

    Cindy EngineeringJohn Sales

    Beth Engineering

  • 8/3/2019 Taking Your SQL Beyond Simple SELECTs and (Inner) Joins

    38/48

    May 3, 2012 38

    Join via WHERE vs JOIN clause

    ANSI SQL standard (and most databases) supportsan alternative means of indicating joins Rather than indicate joined columns in WHERE clause

    o Use them with JOIN keyword on FROM clause

    Example:

    Notes: If INNER keyword is not specified, INNER is assumed in SQL Server

    Can join more than two tables with additional join clauses (of eitherformat)

    o Any limit will be set by DBMS

    o Practical limit is that performance suffers with too many joins in asingle SELECT

    SELECT Name, Dept

    FROM Employees INNER JOIN Departments

    ON Employees.DeptID = Departments.DeptID

  • 8/3/2019 Taking Your SQL Beyond Simple SELECTs and (Inner) Joins

    39/48

    May 3, 2012 39

    Outer Joins

    With inner join, if value of join columns dont match,records will not be retrieved Unexpected problems can occur when foreign key is null

    Assume we had at least one employee with nodepartment indicated (null value for DeptID)

    With inner join, his record will not be displayed at all

    o he has no DeptID to match on DeptIDs in Departments table Could be a real problem if expecting SELECT to show all

    employees!

    Employees

    EmpID Name HireDate DeptID

    5 Bill 11-22-00

  • 8/3/2019 Taking Your SQL Beyond Simple SELECTs and (Inner) Joins

    40/48

    May 3, 2012 40

    Outer Joins

    Problem: Show all employees and their department, even if not

    assigned to one Solution: Perform Outer Joinof the two tables

    Example:

    Possible Query Result Set Values:

    Notes: This example indicated LEFT OUTER JOIN: there are 2 other types

    o LEFT join means retrieve all rows from table on left of JOIN even if they donthave match for join column in right table

    Creates null values in join columns that did not match

    SELECT Name, Dept

    FROM Employees LEFT OUTER JOIN Departments

    ON Employees.DeptID = Departments.DeptID

    Bob Sales

    Cindy Engineering

    John Sales

    Beth Engineering

    Bill

  • 8/3/2019 Taking Your SQL Beyond Simple SELECTs and (Inner) Joins

    41/48

    May 3, 2012 41

    Outer Joins (cont.)

    WHERE clause syntax for LEFT join:WHERE Employees.DeptID *= Departments.DeptID

    Syntax no longer supported in SQL Server 2005o Must use sp_dbcmptlevel to set level to 80 or lower

    Two other kinds of Outer joins: RIGHT OUTER JOIN retrieves all rows from table on right

    o In current example, that would be useful if we had a row inDepartments not pointed to by an employee

    A RIGHT join would then show a row in the resultset forAccounting (with name being null)

    o Even though no employees had that DeptID

    o WHERE clause syntax for RIGHT join (where supported):

    WHERE Employees.DeptID =* Departments.DeptID

    Departments

    DeptID Dept

    5 Accounting

  • 8/3/2019 Taking Your SQL Beyond Simple SELECTs and (Inner) Joins

    42/48

    May 3, 2012 42

    Outer Joins (cont.)

    Second kind of Outer join A FULL OUTER JOIN (or FULL JOIN) retrieves rows from both

    tables even if join values dont match

    o In current example, would show both:

    a row for Bill with no department and

    A row with no employee name for Accounting

    No equivalent WHERE clause syntax at all

    Bob Sales

    Cindy Engineering

    John Sales

    Beth Engineering

    Bill

    Accounting

  • 8/3/2019 Taking Your SQL Beyond Simple SELECTs and (Inner) Joins

    43/48

    May 3, 2012 43

    Self-Joins

    Is possible to join a table to itself Assume Employees table has column for ManagerID,

    to indicate each employees manager Values for that ManagerID column simply point to the EmpID for

    their manager

    How to show who works for who?

    Employees

    EmpID Name HireDate DeptID ManagerID

    1 Bob 06-04-98 1 5

    2 Cindy 12-01-00 2 4

    3 John 01-01-01 1 1

    4 Beth 05-30-99 2 5

    5 Bill 10-10-97

  • 8/3/2019 Taking Your SQL Beyond Simple SELECTs and (Inner) Joins

    44/48

    May 3, 2012 44

    Self-Joins

    Problem: Show each employee and their manager

    Solution: Use self-join (just join table to itself, using an alias) There is no SELF keyword

    Example:

    Possible Query Result Set Values:

    Pop Quiz/Final Exam: Why isnt Bill listed? We can see from others that hes the boss and is an employee

    o He has null ManagerID

    o To show him in table, what would we need ? An OUTER join

    SELECT Employees.Name, Employees.Dept,Mgr.Name

    as Manager

    FROM Employees INNER JOIN Employees as Mgr

    ON Employees.ManagerID =Mgr.EmpID

    Name Dept Manager

    Bob Sales Bill

    Cindy Engineering Beth

    John Sales Bob

    Beth Engineering Bill

  • 8/3/2019 Taking Your SQL Beyond Simple SELECTs and (Inner) Joins

    45/48

    May 3, 2012 45

    Summary

    We learned how to slice and dice data in many ways Handling Distinct Column Values

    Manipulating Data with SQL Functions

    Summarizing Data with SQL (Counts, Averages, etc.)

    Grouping Data with SQL

    Handling Nulls We learned the value of other than inner joins

    Use of outer joins, when join columns values may be null

    Use of self-joins with hierarchical data

  • 8/3/2019 Taking Your SQL Beyond Simple SELECTs and (Inner) Joins

    46/48

    May 3, 2012 46

    Some Other Tidbits for You to Investigate

    TOP, TOP n PERCENT options on SELECT UNIONs

    Nested Subqueries

    EXISTS predicate

  • 8/3/2019 Taking Your SQL Beyond Simple SELECTs and (Inner) Joins

    47/48

    May 3, 2012 47

    Where to Learn More

    Popular SQL books available, including Teach Yourself SQL in 10 Minutes

    o Excellent little guide to getting started

    Practical SQL Handbook

    SQL For Smarties (any Joe Celko book)

    Learning SQL on SQL Server 2005 (OReilly)

  • 8/3/2019 Taking Your SQL Beyond Simple SELECTs and (Inner) Joins

    48/48

    Contact Information

    With that, I want to thank you and hope you enjoyedthe talk

    Contact for follow-up issues Email: [email protected]

    Phone: (704) 650 5371