TOP, ALL and DISTINCT clauses in SQL
There are certain clauses that are usually placed in the SELECT before the FROM and help in filtering records. These clauses are often known as predicates and in this section we will see how they work.
TOP
TOP limits the number of records returned by the query to the number specified in the clause.
SELECT TOP 4 *
FROM Customers
ORDER BY customerId DESC;
| customerId | name | lastName | address | bankAccount |
|---|---|---|---|---|
| 7 | Paul | Williams | 2696 Ocello Street | NULL |
| 6 | Jessie | Good | 4452 Ventura Drive | 790763467 |
| 5 | Kimberly | Lee | 4298 Drummond Street | 778345112 |
| 4 | Helen | Ward | 711 Hershell Hollow Road | 447824556 |
In the execution result we can see that it has only returned the last 4 records from the the Customers table.
ALL
ALL returns all records in a table. Unlike SELECT * in SQL Server, SELECT ALL must be accompanied by at least one column, so its use is often redundant and unnecessary.
SELECT ALL customerId
FROM Customers;
| customerId |
|---|
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
However ALL can be useful for comparisons using SUBSELECTS:
SELECT customerId,
orderId,
product,
price
FROM Orders
WHERE price > ALL
(SELECT price
FROM orders
WHERE customerId = 2)
| customerId | orderId | product | price |
|---|---|---|---|
| 1 | 4 | MacBook Pro M1 | 2449,5 |
| NULL | 8 | Balay Oven | 699,55 |
This execution is returning the records from the Orders table whose prices are greater than the prices from customerId = 2.
The orders table has 2 records for the customerId = 2 with a price of 549,95 y 499,99 respectively, so our query returned the appropriate values .
To better understand the importance of this clause, let’s try executing the SELECT above ,without the ALL clause:
SELECT customerId,
orderId,
product,
price
FROM Orders
WHERE price >
(SELECT price
FROM Orders
WHERE customerId = 2)
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
Since the Orders table has more than one record with customerId = 2, the system is not able to establish the comparison. The ALL clause in this case would tell the system to validate all records with customerId = 2 and return the fields indicated in the main query.
DISTINCT
DISTINCT ignores records whose selected fields contain duplicate data.
SELECT DISTINCT customerId
FROM Orders
WHERE customerId IS NOT NULL
ORDER BY customerId ASC;
| customerId |
|---|
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
If we execute the same query without the DISTICT clause, we see that it returns duplicate records, since in our system there are several orders made by the same customer. which means that the Orders table contains records with duplicate customerId field.
SELECT customerId
FROM Orders
WHERE customerId IS NOT NULL
ORDER BY customerId ASC;
| customerId |
|---|
| 1 |
| 2 |
| 2 |
| 3 |
| 4 |
| 4 |
| 5 |