In SQL a lot of the times there will be a need to write subqueries that will extract data that you can analyse.
But what if you want to use the data as input to another query that can then be used to give you the result you desire?
This is is the power of using a subquery, the subquery can gather the information you need, the main query will then provide the output.
But why would somebody approach it this way?
(A) Complex SQL and joins are used in the sub query.
(B) The main query that uses the sub query , summaries the data.
(C) Lots of data is returned in the subquery, the programmer chooses out of it what they want.
(D) Flexibility – You can adjust the main query to pull out what you need from it, not everything is required to be used, but can be quickly if a decision is made to utilise that data.
(E) As long as the subquery does not need to be changed at all, it can reduce maintenance and coding required to keep it up to date.
So what are the different ways we can use sub queries?
We will use these table values to return output that will allow us to provide output for analysis.
CUSTOMER
SALES
Selecting specific values that you only want to look at
In the below code the second select statement is the subquery. In this instance, we are using the output of that as an input to the first query on the left-hand side of the equals sign.
This therefore allows us to alter the right hand side for the values we want to return in the output, by just adding customer nos.
Note by adding customer nos we will need to change the equals sign, that will be covered off in the next section
select * FROM DBO.SALES where CUSTOMER_NO = (select CUSTOMER_NO FROM dbo.CUSTOMER WHERE CUSTOMER_NO = '123456' )
Giving the below output:
Returning more than one value from the sub query
In the above section, we where focused on returning one value. That used the operator “equals”.
When we have more than one value to return that will not work, hence we use the like operator in the sub query.
As a result of this, the sub query will now return more than one value, this is the desired output we are looking for
select * FROM DBO.SALES where CUSTOMER_NO IN (select CUSTOMER_NO FROM dbo.CUSTOMER WHERE INVOICE_NO LIKE 'INV%')
The output now that will be produced is as follows:
As can be seen the subquery returns through the wild card ‘INV%’ all those rows with that value. Then the main query will match all the customers it has with the customer nos returned in the subquery to produce the final output.
Use a subquery to UPDATE values
There may be a scenario where a subquery is used to update values on a table.
The subquery below checks for a NULL INVOICE_NO and the customer no = 654654, and if both are true, then the main query updates the table column INVOICE_NO value to ‘ERROR’ where CUSTOMER_NO = 654654.
SELECT * FROM dbo.SALES; UPDATE dbo.Sales SET INVOICE_NO = 'ERROR' WHERE CUSTOMER_NO in (SELECT CUSTOMER_NO FROM dbo.SALES where INVOICE_NO is null AND CUSTOMER_NO = 654654); SELECT * FROM dbo.SALES;
Before the update is applied:
After the update is applied:
Use a subquery to DELETE values
The final use of a subquery we will use is to look at a scenario where we want to delete values from the database table.
If we look at the above output from the previous section, we will see that the below code should remove rows 5-10 and 12.
Here we will use:
DELETE FROM dbo.Sales WHERE CUSTOMER_NO in (SELECT CUSTOMER_NO FROM dbo.SALES where INVOICE_NO is null); SELECT * FROM dbo.SALES;
Have you seen these great posts?
how to groupby in a select statement
how to update records in sql
Deleting table records in SQL