SELECT Queries in SQL Server (DQL)
DQL is used to READ data.
SELECT -> get data from a table
This lesson creates its own small tables, so you can run it on any SQL Server database. The Output under each query is the real result.
IF DB_ID('SqlBasicsDb') IS NULL
CREATE DATABASE SqlBasicsDb;
GO
USE SqlBasicsDb;
GO
DROP TABLE IF EXISTS Employees;
GO
CREATE TABLE Employees
(
EmpID INT PRIMARY KEY,
Name VARCHAR(50),
Department VARCHAR(30),
City VARCHAR(30),
Salary INT,
Gender CHAR(1)
);
INSERT INTO Employees VALUES
(1, 'Ravi', 'IT', 'Hyderabad', 50000, 'M'),
(2, 'Sita', 'HR', 'Chennai', 40000, 'F'),
(3, 'John', 'IT', 'Bengaluru', 60000, 'M'),
(4, 'Meena', 'Sales', 'Hyderabad', 35000, 'F'),
(5, 'Arjun', 'Sales', 'Mumbai', 45000, 'M'),
(6, 'Pooja', 'IT', 'Hyderabad', 55000, 'F'),
(7, 'Kiran', 'HR', 'Mumbai', 38000, 'M'),
(8, 'Divya', 'Finance', 'Chennai', 52000, 'F'),
(9, 'Rahul', 'Finance', 'Bengaluru', 48000, 'M'),
(10, 'Neha', 'IT', NULL, 65000, 'F'); -- City is unknown
GO
Messages(10 rows affected)
All columns, all rows
SELECT * FROM Employees;
Output
| EmpID | Name | Department | City | Salary | Gender |
| 1 | Ravi | IT | Hyderabad | 50000 | M |
| 2 | Sita | HR | Chennai | 40000 | F |
| 3 | John | IT | Bengaluru | 60000 | M |
| 4 | Meena | Sales | Hyderabad | 35000 | F |
| 5 | Arjun | Sales | Mumbai | 45000 | M |
| 6 | Pooja | IT | Hyderabad | 55000 | F |
| 7 | Kiran | HR | Mumbai | 38000 | M |
| 8 | Divya | Finance | Chennai | 52000 | F |
| 9 | Rahul | Finance | Bengaluru | 48000 | M |
| 10 | Neha | IT | NULL | 65000 | F |
Only some columns
SELECT Name, Salary FROM Employees;
Output
| Name | Salary |
| Ravi | 50000 |
| Sita | 40000 |
| John | 60000 |
| Meena | 35000 |
| Arjun | 45000 |
| Pooja | 55000 |
| Kiran | 38000 |
| Divya | 52000 |
| Rahul | 48000 |
| Neha | 65000 |
Column alias (a new name for the output column)
SELECT Name AS EmployeeName, Salary AS MonthlySalary FROM Employees;
Output
| EmployeeName | MonthlySalary |
| Ravi | 50000 |
| Sita | 40000 |
| John | 60000 |
| Meena | 35000 |
| Arjun | 45000 |
| Pooja | 55000 |
| Kiran | 38000 |
| Divya | 52000 |
| Rahul | 48000 |
| Neha | 65000 |
Calculation in SELECT
SELECT Name, Salary, Salary * 12 AS YearlySalary FROM Employees;
Output
| Name | Salary | YearlySalary |
| Ravi | 50000 | 600000 |
| Sita | 40000 | 480000 |
| John | 60000 | 720000 |
| Meena | 35000 | 420000 |
| Arjun | 45000 | 540000 |
| Pooja | 55000 | 660000 |
| Kiran | 38000 | 456000 |
| Divya | 52000 | 624000 |
| Rahul | 48000 | 576000 |
| Neha | 65000 | 780000 |
WHERE - filter rows
SELECT * FROM Employees WHERE Department = 'IT';
Output
| EmpID | Name | Department | City | Salary | Gender |
| 1 | Ravi | IT | Hyderabad | 50000 | M |
| 3 | John | IT | Bengaluru | 60000 | M |
| 6 | Pooja | IT | Hyderabad | 55000 | F |
| 10 | Neha | IT | NULL | 65000 | F |
Comparison operators: = <> > < >= <=
SELECT * FROM Employees WHERE Salary > 50000;
SELECT * FROM Employees WHERE Department <> 'IT'; -- not equal
Output
| EmpID | Name | Department | City | Salary | Gender |
| 3 | John | IT | Bengaluru | 60000 | M |
| 6 | Pooja | IT | Hyderabad | 55000 | F |
| 8 | Divya | Finance | Chennai | 52000 | F |
| 10 | Neha | IT | NULL | 65000 | F |
Output
| EmpID | Name | Department | City | Salary | Gender |
| 2 | Sita | HR | Chennai | 40000 | F |
| 4 | Meena | Sales | Hyderabad | 35000 | F |
| 5 | Arjun | Sales | Mumbai | 45000 | M |
| 7 | Kiran | HR | Mumbai | 38000 | M |
| 8 | Divya | Finance | Chennai | 52000 | F |
| 9 | Rahul | Finance | Bengaluru | 48000 | M |
And - both conditions must be true
SELECT * FROM Employees WHERE Department = 'IT' AND Salary > 55000;
Output
| EmpID | Name | Department | City | Salary | Gender |
| 3 | John | IT | Bengaluru | 60000 | M |
| 10 | Neha | IT | NULL | 65000 | F |
Or - any one condition is enough
SELECT * FROM Employees WHERE City = 'Mumbai' OR City = 'Chennai';
Output
| EmpID | Name | Department | City | Salary | Gender |
| 2 | Sita | HR | Chennai | 40000 | F |
| 5 | Arjun | Sales | Mumbai | 45000 | M |
| 7 | Kiran | HR | Mumbai | 38000 | M |
| 8 | Divya | Finance | Chennai | 52000 | F |
In - match any value in a list
SELECT * FROM Employees WHERE City IN ('Mumbai', 'Chennai');
Output
| EmpID | Name | Department | City | Salary | Gender |
| 2 | Sita | HR | Chennai | 40000 | F |
| 5 | Arjun | Sales | Mumbai | 45000 | M |
| 7 | Kiran | HR | Mumbai | 38000 | M |
| 8 | Divya | Finance | Chennai | 52000 | F |
NOT IN
SELECT * FROM Employees WHERE Department NOT IN ('IT', 'HR');
Output
| EmpID | Name | Department | City | Salary | Gender |
| 4 | Meena | Sales | Hyderabad | 35000 | F |
| 5 | Arjun | Sales | Mumbai | 45000 | M |
| 8 | Divya | Finance | Chennai | 52000 | F |
| 9 | Rahul | Finance | Bengaluru | 48000 | M |
BETWEEN - a range (both ends included)
SELECT * FROM Employees WHERE Salary BETWEEN 40000 AND 50000;
Output
| EmpID | Name | Department | City | Salary | Gender |
| 1 | Ravi | IT | Hyderabad | 50000 | M |
| 2 | Sita | HR | Chennai | 40000 | F |
| 5 | Arjun | Sales | Mumbai | 45000 | M |
| 9 | Rahul | Finance | Bengaluru | 48000 | M |
LIKE - search text
% = any number of characters _ = exactly one character
SELECT * FROM Employees WHERE Name LIKE 'R%'; -- starts with R
SELECT * FROM Employees WHERE Name LIKE '%a'; -- ends with a
SELECT * FROM Employees WHERE Name LIKE '%ee%'; -- contains ee
SELECT * FROM Employees WHERE Name LIKE '____'; -- exactly 4 letters
Output
| EmpID | Name | Department | City | Salary | Gender |
| 1 | Ravi | IT | Hyderabad | 50000 | M |
| 9 | Rahul | Finance | Bengaluru | 48000 | M |
Output
| EmpID | Name | Department | City | Salary | Gender |
| 2 | Sita | HR | Chennai | 40000 | F |
| 4 | Meena | Sales | Hyderabad | 35000 | F |
| 6 | Pooja | IT | Hyderabad | 55000 | F |
| 8 | Divya | Finance | Chennai | 52000 | F |
| 10 | Neha | IT | NULL | 65000 | F |
Output
| EmpID | Name | Department | City | Salary | Gender |
| 4 | Meena | Sales | Hyderabad | 35000 | F |
Output
| EmpID | Name | Department | City | Salary | Gender |
| 1 | Ravi | IT | Hyderabad | 50000 | M |
| 2 | Sita | HR | Chennai | 40000 | F |
| 3 | John | IT | Bengaluru | 60000 | M |
| 10 | Neha | IT | NULL | 65000 | F |
IS NULL / IS NOT NULL (do NOT use = NULL)
SELECT * FROM Employees WHERE City IS NULL;
SELECT * FROM Employees WHERE City IS NOT NULL;
Output
| EmpID | Name | Department | City | Salary | Gender |
| 10 | Neha | IT | NULL | 65000 | F |
Output
| EmpID | Name | Department | City | Salary | Gender |
| 1 | Ravi | IT | Hyderabad | 50000 | M |
| 2 | Sita | HR | Chennai | 40000 | F |
| 3 | John | IT | Bengaluru | 60000 | M |
| 4 | Meena | Sales | Hyderabad | 35000 | F |
| 5 | Arjun | Sales | Mumbai | 45000 | M |
| 6 | Pooja | IT | Hyderabad | 55000 | F |
| 7 | Kiran | HR | Mumbai | 38000 | M |
| 8 | Divya | Finance | Chennai | 52000 | F |
| 9 | Rahul | Finance | Bengaluru | 48000 | M |
DISTINCT - remove duplicates
SELECT DISTINCT Department FROM Employees;
Output
| Department |
| Finance |
| HR |
| IT |
| Sales |
TOP - first N rows
SELECT TOP 3 * FROM Employees;
Output
| EmpID | Name | Department | City | Salary | Gender |
| 1 | Ravi | IT | Hyderabad | 50000 | M |
| 2 | Sita | HR | Chennai | 40000 | F |
| 3 | John | IT | Bengaluru | 60000 | M |
ORDER BY - sort the result
SELECT * FROM Employees ORDER BY Salary; -- low to high (ASC is default)
SELECT * FROM Employees ORDER BY Salary DESC; -- high to low
Output
| EmpID | Name | Department | City | Salary | Gender |
| 4 | Meena | Sales | Hyderabad | 35000 | F |
| 7 | Kiran | HR | Mumbai | 38000 | M |
| 2 | Sita | HR | Chennai | 40000 | F |
| 5 | Arjun | Sales | Mumbai | 45000 | M |
| 9 | Rahul | Finance | Bengaluru | 48000 | M |
| 1 | Ravi | IT | Hyderabad | 50000 | M |
| 8 | Divya | Finance | Chennai | 52000 | F |
| 6 | Pooja | IT | Hyderabad | 55000 | F |
| 3 | John | IT | Bengaluru | 60000 | M |
| 10 | Neha | IT | NULL | 65000 | F |
Output
| EmpID | Name | Department | City | Salary | Gender |
| 10 | Neha | IT | NULL | 65000 | F |
| 3 | John | IT | Bengaluru | 60000 | M |
| 6 | Pooja | IT | Hyderabad | 55000 | F |
| 8 | Divya | Finance | Chennai | 52000 | F |
| 1 | Ravi | IT | Hyderabad | 50000 | M |
| 9 | Rahul | Finance | Bengaluru | 48000 | M |
| 5 | Arjun | Sales | Mumbai | 45000 | M |
| 2 | Sita | HR | Chennai | 40000 | F |
| 7 | Kiran | HR | Mumbai | 38000 | M |
| 4 | Meena | Sales | Hyderabad | 35000 | F |
TOP with ORDER BY - 3 highest salaries
SELECT TOP 3 Name, Salary FROM Employees ORDER BY Salary DESC;
Output
| Name | Salary |
| Neha | 65000 |
| John | 60000 |
| Pooja | 55000 |
Replace NULL with a value
SELECT Name, ISNULL(City, 'Not Known') AS City FROM Employees;
Output
| Name | City |
| Ravi | Hyderabad |
| Sita | Chennai |
| John | Bengaluru |
| Meena | Hyderabad |
| Arjun | Mumbai |
| Pooja | Hyderabad |
| Kiran | Mumbai |
| Divya | Chennai |
| Rahul | Bengaluru |
| Neha | Not Known |