# Язык SQL (SELECT, WHERE, (LEFT) JOIN, GROUP BY, HAVING).

#### DDL и DML — подмножество языка SQL

**DDL (Data Definition Language, язык описания данных)** служит для создания и модификации структуры БД, т.е. для создания/изменения/удаления таблиц и связей.
  
**DML (Data Manipulation Language, язык манипулирования данными)** позволяет осуществлять манипуляции с данными таблиц, т.е. с ее строками. Он позволяет делать выборку данных из таблиц, добавлять новые данные в таблицы, а также обновлять и удалять существующие данные.

---

#### SQL
язык запросов для управления данными в РСУБД.

---

#### SELECT
оператор для выбора данных из одной или нескольких таблицы

```sql
SELECT <columns> FROM <table>
```

⸻

#### WHERE
оператор для фильтрации результатов

```sql
SELECT <columns> FROM <table> WHERE <condition>
```

⸻

#### GROUP BY
оператор для группировки по определенному столбцу

```sql
SELECT <columns> FROM <table> GROUP BY <column>
SELECT Department, COUNT(*) as EmployeeCount FROM Employees GROUP BY Department
```

⸻

#### HAVING
позволяет ставить условия на группы, которые были получены после GROUP BY.
>Это как WHERE, но для сгруппированных данных

```sql
SELECT Country, COUNT(*) AS cnt
FROM Customers
GROUP BY Country
HAVING COUNT(*) > 10;
```

**WHERE** — фильтрует исходные строки перед группировкой.
**HAVING** — фильтрует уже сгруппированные результаты.

⸻

#### LEFT JOIN
выводит все строки из левой таблицы, даже если в правой нет совпадений.
Если нет совпадающих данных — связанные поля будут NULL.

```sql
SELECT c.CustomerName, o.OrderID
FROM Customers c
LEFT JOIN Orders o
  ON c.CustomerID = o.CustomerID;
```

⸻

Последовательность логической обработки SQL-запроса

```
FROM / JOIN → WHERE → GROUP BY → HAVING → SELECT
```

То есть:
- сначала выбираются таблицы и объединяются,
- потом фильтруются строки,
- затем группируются,
- после фильтруются группы,
- и только потом выдается результат.