# LeetCode 595: Big Countries

## Problem Restatement

We are given a table called `World`.

Each row contains information about one country.

A country is considered big if at least one of these conditions is true:

1. Its area is at least `3,000,000`.
2. Its population is at least `25,000,000`.

We need to return the `name`, `population`, and `area` of all big countries. The result may be returned in any order.

## Table

### World

| Column | Type | Meaning |
|---|---|---|
| `name` | varchar | Country name |
| `continent` | varchar | Continent name |
| `area` | int | Country area |
| `population` | int | Country population |
| `gdp` | bigint | Country GDP |

`name` is the primary key.

## Example

Input:

| name | continent | area | population | gdp |
|---|---|---:|---:|---:|
| Afghanistan | Asia | 652230 | 25500100 | 20343000000 |
| Albania | Europe | 28748 | 2831741 | 12960000000 |
| Algeria | Africa | 2381741 | 37100000 | 188681000000 |
| Andorra | Europe | 468 | 78115 | 3712000000 |
| Angola | Africa | 1246700 | 20609294 | 100990000000 |

Output:

| name | population | area |
|---|---:|---:|
| Afghanistan | 25500100 | 652230 |
| Algeria | 37100000 | 2381741 |

Afghanistan qualifies because its population is at least `25,000,000`.

Algeria qualifies for the same reason.

The other countries in the sample do not satisfy either condition.

## First Thought: Select All Countries

A first query might be:

```sql
SELECT name, population, area
FROM World;
```

This returns every country.

But the problem only asks for big countries, so we need a `WHERE` clause.

## Key Insight

The problem gives two independent conditions.

A country qualifies if either condition is true:

```sql
area >= 3000000
```

or:

```sql
population >= 25000000
```

Because satisfying either condition is enough, we combine them with `OR`.

## Algorithm

1. Read rows from `World`.
2. Keep countries where `area >= 3000000`.
3. Also keep countries where `population >= 25000000`.
4. Return only `name`, `population`, and `area`.

## Correctness

For any country with area at least `3,000,000`, the `area >= 3000000` condition is true, so the query includes it.

For any country with population at least `25,000,000`, the `population >= 25000000` condition is true, so the query includes it.

For any country that satisfies neither condition, both sides of the `OR` expression are false, so the query excludes it.

Therefore, the query returns exactly the countries defined as big.

## Complexity

Let:

```text
n = number of rows in World
```

| Metric | Value | Why |
|---|---|---|
| Time | `O(n)` | The table is scanned and each row is filtered |
| Space | `O(1)` | No extra structure is needed apart from the result |

The database may use indexes if available, but a simple scan is enough conceptually.

## Implementation

```sql
SELECT
    name,
    population,
    area
FROM World
WHERE area >= 3000000
   OR population >= 25000000;
```

## Code Explanation

This selects the required columns:

```sql
SELECT
    name,
    population,
    area
```

This reads from the table:

```sql
FROM World
```

This condition keeps countries with large area:

```sql
area >= 3000000
```

This condition keeps countries with large population:

```sql
population >= 25000000
```

The `OR` means a country only needs to satisfy one of the two conditions:

```sql
WHERE area >= 3000000
   OR population >= 25000000;
```

## Testing

Sample data:

```sql
CREATE TABLE World (
    name VARCHAR(255) PRIMARY KEY,
    continent VARCHAR(255),
    area INT,
    population INT,
    gdp BIGINT
);

INSERT INTO World (name, continent, area, population, gdp) VALUES
('Afghanistan', 'Asia', 652230, 25500100, 20343000000),
('Albania', 'Europe', 28748, 2831741, 12960000000),
('Algeria', 'Africa', 2381741, 37100000, 188681000000),
('Andorra', 'Europe', 468, 78115, 3712000000),
('Angola', 'Africa', 1246700, 20609294, 100990000000);
```

Query:

```sql
SELECT
    name,
    population,
    area
FROM World
WHERE area >= 3000000
   OR population >= 25000000;
```

Expected result:

| name | population | area |
|---|---:|---:|
| Afghanistan | 25500100 | 652230 |
| Algeria | 37100000 | 2381741 |

Additional test cases:

| Case | Expected behavior |
|---|---|
| `area = 3000000` | Included |
| `population = 25000000` | Included |
| Large area but small population | Included |
| Small area but large population | Included |
| Both conditions false | Excluded |

