# SQL для тестировщика

## Быстрые проверки данных
```sql
-- дубли по ключу
SELECT email, COUNT(*) FROM users GROUP BY email HAVING COUNT(*) > 1;

-- осиротевшие записи (заказ без предметов)
SELECT o.* FROM orders o
LEFT JOIN order_items i ON i.order_id = o.id
WHERE i.id IS NULL;

-- NULL в обязательных полях
SELECT COUNT(*) FROM products WHERE price IS NULL OR price <= 0;
```

## JOIN-шпаргалка
| Тип | Что вернёт |
|---|---|
| INNER | только совпадения в обеих таблицах |
| LEFT | все из левой + совпадения из правой (NULL если нет) |
| RIGHT | зеркально LEFT |
| FULL | всё из обеих |

## NULL-ловушки
- `WHERE x != 'value'` НЕ вернёт строки где x IS NULL
- `COUNT(*)` считает все, `COUNT(x)` — только не-NULL
- `ORDER BY x` ставит NULL последними (ASC) или первыми (DESC)

## Группировка и агрегаты
```sql
-- сумма заказов по статусам за неделю
SELECT status, COUNT(*), SUM(total)
FROM orders
WHERE created_at > NOW() - INTERVAL '7 days'
GROUP BY status
ORDER BY count DESC;
```
