Query Fundamentals

Lesson 0003 — SELECT, WHERE, Operators, ORDER BY, LIMIT, DISTINCT & Aliases — ~15 min read

Reading data is the core of SQL. Every real question — “Who signed up today?” or “Top 10 customers by spend?” — is answered by picking the right table, the right columns, the right rows, and the right order.

Once you understand what a database and SQL are, the next step is learning how to read data. Commands like SELECT, FROM, WHERE, logical operators (AND/OR/NOT), comparison operators, ORDER BY, LIMIT, DISTINCT, and AS (aliases) work together to pick the right rows, choose the right columns, and present results clearly.

At a high level, every basic query answers:

The Example: countries Table

To make every command concrete, we will use one relatable table throughout this lesson.

CREATE TABLE countries (
  id INT PRIMARY KEY AUTO_INCREMENT,
  country VARCHAR(64) NOT NULL,
  population BIGINT NULL, area INT NOT NULL,
  region VARCHAR(64) NOT NULL
);

INSERT INTO countries (country, population, area, region) VALUES
('India',     1400000000, 3287000, 'Asia'),
('China',     1200000000, 4287000, 'Asia'),
('Brazil',     214000000, 8516000, 'South America'),
('Australia',   25700000, 7692000, 'Oceania'),
('USA',        331000000, 9834000, 'North America');
CREATE TABLE countries (
  id SERIAL PRIMARY KEY,
  country VARCHAR(64) NOT NULL,
  population BIGINT NULL, area INT NOT NULL,
  region VARCHAR(64) NOT NULL
);

INSERT INTO countries (country, population, area, region) VALUES
('India',     1400000000, 3287000, 'Asia'),
('China',     1200000000, 4287000, 'Asia'),
('Brazil',     214000000, 8516000, 'South America'),
('Australia',   25700000, 7692000, 'Oceania'),
('USA',        331000000, 9834000, 'North America');
idcountrypopulationarearegion
1India14000000003287000Asia
2China12000000004287000Asia
3Brazil2140000008516000South America
4Australia257000007692000Oceania
5USA3310000009834000North America

1. SELECT & FROM

SELECT specifies which columns you want. FROM tells SQL which table to read.

All columns, all rows

SELECT *
FROM countries;
SELECT *
FROM countries;

Useful when exploring a new table, but prefer explicit columns in real code.

idcountrypopulationarearegion
1India14000000003287000Asia
2China12000000004287000Asia
3Brazil2140000008516000South America
4Australia257000007692000Oceania
5USA3310000009834000North America

Specific columns only

SELECT country, population
FROM countries;
SELECT country, population
FROM countries;
countrypopulation
India1400000000
China1200000000
Brazil214000000
Australia25700000
USA331000000

Result is narrower and focused — build the habit: only select what you need.

2. WHERE — Filtering Rows

WHERE keeps only rows that satisfy a condition.

SELECT *
FROM countries
WHERE region = 'Oceania';
SELECT *
FROM countries
WHERE region = 'Oceania';
countrypopulationarearegion
Australia257000007692000Oceania

WHERE decides which rows stay.

3. Comparison Operators

OperatorMeaningExample
<Less thanpopulation < 50000000
>Greater thansalary > 30000
<=Less than or equal toage <= 18
>=Greater than or equal tomarks >= 90
=Equal tocity = 'Delhi'
<> / !=Not equal tostatus != 'active'

These form the foundation of filtering. We will use them in every query ahead.

4. Logical Operators — AND, OR, NOT

Combine or modify conditions in WHERE.

a. AND — all conditions must be true

Population > 50M and area < 5M sq km:

SELECT *
FROM countries
WHERE population > 50000000 AND area < 5000000;
SELECT *
FROM countries
WHERE population > 50000000 AND area < 5000000;
countrypopulationarearegion
India14000000003287000Asia
China12000000004287000Asia

b. OR — at least one condition must be true

Nations in Asia or Oceania:

SELECT *
FROM countries
WHERE region = 'Asia' OR region = 'Oceania';
SELECT *
FROM countries
WHERE region = 'Asia' OR region = 'Oceania';
countrypopulationarearegion
India14000000003287000Asia
China12000000004287000Asia
Australia257000007692000Oceania

c. NOT — negates a condition

Exclude North America:

SELECT *
FROM countries
WHERE NOT region = 'North America';
-- equivalent
SELECT * FROM countries WHERE region <> 'North America';
SELECT *
FROM countries
WHERE NOT region = 'North America';
countrypopulationarearegion
India14000000003287000Asia
China12000000004287000Asia
Brazil2140000008516000South America
Australia257000007692000Oceania

Which query finds Asian countries with population > 500M?

5. Arithmetic Operators & NULLIF

OperatorDefinitionExample
+AdditionSELECT 10 + 5 AS result;
-SubtractionSELECT 10 - 5 AS result;
*MultiplicationSELECT 10 * 5 AS result;
/DivisionSELECT 10 / 5 AS result;
%Modulus (remainder)SELECT 10 % 3 AS remainder;
DIVInteger division (MySQL-only)SELECT 7 DIV 2 AS quotient; -- 3

NULLIF — Safe Division

NULLIF(value1, value2) returns NULL if the two values are equal, otherwise value1. Common use: prevent division-by-zero — convert 0 to NULL so division yields NULL instead of an error.

Syntax: NULLIF(value1, value2)

SELECT
  country,
  population / NULLIF(area, 0) AS density
FROM countries;
SELECT
  country,
  population / NULLIF(area, 0) AS density
FROM countries;
countrydensity
India425.920292
China279.916025
Brazil25.129169
Australia3.341134
USA33.658735

If a test row had area = 0, NULLIF(area, 0) → NULL, so population / NULL → NULL safely instead of an error.

6. ORDER BY & LIMIT

ORDER BY sorts rows. Default is ASC (small → large, A → Z). Use DESC for reverse (large → small, Z → A). LIMIT returns only the top N rows.

Top 2 countries by land area (largest first):

SELECT country, area
FROM countries
ORDER BY area DESC
LIMIT 2;
SELECT country, area
FROM countries
ORDER BY area DESC
LIMIT 2;
-- or FETCH FIRST 2 ROWS ONLY
countryarea
USA9834000
Brazil8516000

First sort by area DESC, then keep only the top 2 via LIMIT.

7. DISTINCT & AS (Aliases)

DISTINCT removes duplicates — keep only unique values. AS gives a temporary, reader-friendly name to a column or table without changing the schema.

Unique regions, renamed to unique_region:

SELECT DISTINCT region AS unique_region
FROM countries;
SELECT DISTINCT region AS unique_region
FROM countries;
unique_region
Asia
South America
Oceania
North America

What do ORDER BY area DESC LIMIT 2 and DISTINCT do?

Notes

Query shape :-

SELECT cols FROM table WHERE rows ORDER BY sort LIMIT n

SELECT = which columns; FROM = which table; WHERE = which rows stay

ORDER BY ASC/DESC; LIMIT top N; DISTINCT = unique only; AS = alias

Filtering :-

Comparison: < > <= >= = <>/!=

Logical: AND (all true), OR (any true), NOT (negates)

WHERE region='Oceania'; WHERE pop>50M AND area<5M; WHERE region='Asia' OR region='Oceania'; WHERE NOT region='North America'

Arithmetic & NULLIF :-

+ - * / % ; DIV = MySQL integer division (7 DIV 2 = 3)

NULLIF(v1,v2) → NULL if equal else v1 — safe divide: population / NULLIF(area,0) → NULL not error

Countries example :-

CREATE TABLE countries (id SERIAL PK, country, population BIGINT, area INT, region)

SELECT * vs SELECT country, population — prefer explicit columns

ORDER BY area DESC LIMIT 2 → USA, Brazil; DISTINCT region AS unique_region → 4 regions

Primary sources: MySQL SELECT · Postgres SELECT · Postgres NULLIF. Ask me anything that's unclear.

← Prev: Database & Table Basics Next: Filtering Essentials →

Questions? Ask your agent — you can follow up on any concept, quiz answer, or how this applies to a specific query. Review the SQL glossary or syntax quick reference for a compressed overview.