SQL Server: Sub Queries Overview
Background
Most of the time in interviews, one question that might be asked is: What are Sub-Queries in SQL Server? In consideration of that requirement I have written this article by focusing on how to provide the answer of that specific question that might be asked about sub-queries.
So let us start with the basics.
What are Sub-Queries ?
A SQL query written within another query enclosed with parenthesis is called a Sub-Query or inner query. When you write a sub query, the SQL engine executes the subquery first.
A subquery is created in an existing SELECT, INSERT, UPDATE, or DELETE statement along with the operators like =, <, >, >=, <=, IN, BETWEEN etc.. The parent query that contains the inner statement is also called an outer query.
When you write a Sub Query the following rules must used:
- A sub-query must be enclosed in parenthesis.
- A sub-query must be put in the right hand of the comparison operator.
- A sub-query cannot contain an ORDER-BY clause but you can include an ORDER BY clause in a sub-query only when a TOP clause is included.
- You can write up to 32 subqueries in one SQL Statement.
- The BETWEEN operator cannot be used with a subquery; however, the BETWEEN can be used within the subquery.
- The column involved in the subquery cannot be of type varchar(max), nvarchar(max), or varbinary(max).
Types of Sub-Query
1. Single Row
This sub query returns only one row. Such as scalar subquery, which returns a single row with one column. Scalar subqueries are often very useful in any situation where you could use a literal value, a constant, or an expression.
If the comparison operator is any of the ones in the following the subquery must be a single-row subquery.
Symbol | Meaning |
= | equal to |
> | greater than |
>= | greater than equal to |
< | Less than |
<= | Less than equal to |
<> | not equal to |
e.g.
select MAX (salary) as Salary from employee
where salary <
( select MAX (salary) as Salary from employee )
The above subquery returns the single row value.
2. Multiple Rows
This is a sub query that returns multiple rows. These queries are commonly used to generate result sets that will be passed to a DML or SELECT statement for further processing. Both single-row and multiple-row subqueries will be evaluated once before the parent query is run. Single- and multiple-row subqueries can be used in the WHERE and HAVING clauses of the parent query.
The operators in the following table can use multiple-row subqueries:
IN | equal to any member in a list |
Not IN | not equal to any member in a list |
ANY | returns rows that match any value on a list |
ALL | returns rows that match all the values in a list |
3. Multiple columns
This sub-query returns multiple columns. Now let us see how to use Sub queries with various SQL Statements.
Sub queries using a Select Statement
The sub queries are most commonly used with Select statements.
Syntax
SELECT column_name [, column_name ]
FROM table1 [, table2 ]
WHERE column_name
OPERATOR
(
SELECT column_name [, column_name ]
FROM table1 [, table2 ][WHERE condition]
)
Example
SELECT *
FROM emp
WHERE ID
IN
(
SELECT ID
FROM emp
WHERE SALARY > 10498
) ;
Sub queries using an Insert Statement
The following is the syntax using the Insert Statement:
INSERT INTO table_name
[ (column1 [, column2 ]) ]
SELECT [ *|column1 [, column2 ]
FROM table1 [, table2 ]
[ WHERE VALUE OPERATOR ]
Example
INSERT INTO #tmp
SELECT * FROM emp
WHERE code IN (SELECT codeFROM emp) ;
Sub queries using Update Statement
The Sub queries can also be used with the Update Statements, the following is the syntax:
UPDATE table SET column_name = new_value
[
WHERE OPERATOR [ VALUE ]
(SELECT COLUMN_NAME FROM TABLE_NAME)[ WHERE) ]
Example
UPDATE empSET SALARY = SALARY * 0.25
WHERE exeperience IN
(SELECT experience FROM empWHERE experience >= 3 )
Sub queries using delete Statement
The most amazing task using a sub query is to use it with a delete statement. The following is the syntax used with a delete statement:
DELETE FROM TABLE_NAME
[ WHERE OPERATOR
[ VALUE ] (SELECT COLUMN_NAME FROM TABLE_NAME)[ WHERE) ]
Example
DELETE
FROM emp
WHERE AGE IN (SELECT AGE FROM emp WHERE AGE > 58 );