Many times in a relational database the information you want to show in your query is in more than one table. This begs the question “How do you combine results from more than one table?”
All the examples for this lesson are based on Microsoft SQL Server Management Studio and the AdventureWorks2012 database. You can get started today learning SQL with my Guide Getting Started Using SQL Server.
Table of contents
What are the ways I can combine results from more than one query?
SQL wouldn’t be a very useful language if it didn’t provide an easy means for you to combine results from more than one query. Fortunately, there are three main ways you can combine data from multiple tables. We’ll go over these briefly here and provide links to more in-depth articles.
Three Main Ways to Combine Results
Database tables are organized into rows and columns within a relational database. As we investigate ways to combine data, keep in mind that the end result will be to either add more columns to a result, perhaps from another related table, or rows, by taking a set of rows from two or more tables.
When most people learn to combine data they learn about:
- JOIN – You can use joins to combine columns from one or more queries into one result.
- UNION – Use Unions and other set operators to combine rows from one or more queries into one result.
- Sub Queries – I sometimes call these nested queries.
I like to think of joins as the glue that puts the database back together. Relational databases are usually normalized to make the data easier to maintain and to improve performance, but the end result is information is separated into many tables. You can use Joins to recombine that information back together into a more human-readable format. By matching columns from each table the data is combinesd.
In all cases, joins require two main ingredients: Two tables and a join condition. The tables are what we will use to pull the rows and columns and the join condition is how we intend on matching the columns between tables.
SELECT Person.FirstName, Person.LastName, PersonPhone.PhoneNumber FROM Person.Person INNER JOIN Person.PersonPhone ON Person.BusinessEntityID = PersonPhone.BusinessEntityID
There are two main types of joins: Inner Joins and Outer Joins.
InnerSQL Inner Join Joins only return a resulting row if the join condition matches in both tables. To match the primary key of one table a foreign key in another use an inner join.
The second type of join is an outer join. SQL left joins always return at least one row for the main table, referred to as the Left or Right table, and null values in the corresponding columns of the non-matching column. Outer joins are useful for finding non-matching data.
It is important to note that joins can return more rows than exist in either table combined. The joins return combinations of matches. If you join two tables, one containing 5 row, and the other 10, the result may contain anywhere from 0 to 50 rows depending on the join condition.
Read More: SQL Joins – The Ultimate Guide >>
Combine results, row-by-row, with a UNION. This is one of three set operators.
There are some special conditions that must occur in order for a union to work. First, each query must have the same number of columns. Second, the data types of these columns must be compatible. Generally speaking, each query must return the same number and type of columns.
A practical example of union is when two tables contain part numbers and you want to create a combined list for a catalog. You can either elect to have the end result be a unique listing for the combined query or if you use UNION ALL return all rows from each table.
SELECT C.Name FROM Production.ProductCategory AS C UNION SELECT S.Name FROM Production.ProductSubcategory AS S
The other set operators are:
- INTERSECT – You can use this to only return rows that are common between two tables.
- EXCEPT – You can use this to return rows that exist in one table, but not another.
As you go on to learn more SQL you find that you can use joins to write equivalent statements for Intersect and Except, but there are no equivalents for Union.
Read More: Set Operators – The Ultimate Guide
Sometime we call subqueries “nested queries.” This is because the subquery is inside, or “nested within” the main query. Subqueries can be confusing. Subqueries are confusing and hard to learn since they versatile and used in many locations.
For example, here are some areas you may see a subquery to combine results:
- SELECT clause – Used to return a value. For instance, if you’re querying a sales table, you could include the total sales by return a sum of all sales from within a subquery.
- WHERE clause – Use single result subqueries in comparisons, or table results with IN or EXISTS.
- HAVING clause – I mostly see them used to with comparison operators. Many times you’ll use a subquery here to calculate a sum or average and compare that to an summation within the group.
Read More: The Ultimate Guide to Subqueries >>
SELECT SalesOrderID, LineTotal, (SELECT AVG(LineTotal) FROM Sales.SalesOrderDetail) AS AverageLineTotal FROM Sales.SalesOrderDetail
When used in select clauses and comparison operators such as equals, greater than, and less than, a subquery can only return one row. If used in conjunction with a membership operator, such as IN, it is OK for the query to return one or more rows.