Заметки про SQL
select name, Milliseconds
from tracks
where UnitPrice =0.99
order by Milliseconds limit 1

-------- Группировки в БД ---------
Агрегатные функции в группировках по стране или стране-городу

select country, city, count(*), sum(age), max(age), min(age), avg(age)
from customers
group by country, city

Сколько продаж было сделано в каждом году?

select date(SalesDate, 'start of year'), count(*)
from sales
group by date(SalesDate, 'start of year')

или так

select strtime('&Y', SalesDate), count(*)
from sales
group by strtime('&Y', SalesDate)

В какие немецкие города в 2009 было сделано больше одной продажи?

select ShipCity, count(*) 
from sales
where ShipCountry = 'Germany', and SalesDate >= date('2009-01-01') and SalesDate < date ('2010-01-01')
group by ShipCity
having count(*)>1
--------------------------
JOINы

select FirstName, LastName, 'Клиенты' from customers
union all
select FirstName, LastName, 'Сотрудники' from employees

так отбросит дубликаты из двух таблиц (сделает distinctы)
select FirstName from customers
union 
select FirstName from employees

- для 3 занятия ---
Строим запрос для табилцы, которая нужна в отчете: Страна отгрузки  Кол-во продаж  Количество уникальных клиентов

select ShipCountry, count(*) as cnt, count(distinct CustomerId) as cnt_dist
from sales
group by ShipCountry

---
select * -- sum(UnitPrice*Quantity)
from sales as sales
inner join sales_items as si
on s.salesid = si.salesid
where SalesDate >=date('2012-01-01') and SalesDate < date('2013-01-01')

Показать статистику продаж по годам. Поля: Год, Кол-во продаж, Сумма продаж в рублях, Средний чек в рублях, количество уникальных покупателей

select date(SalesDate, 'start of year') as [Год продажи]
,COUNT(DISTINTCT S.salesid) as [Продажи,#]
,sum(si.UnitPrice*si.Quantity) as [Продажи, руб]
,round(avg(si.UnitPrice*si.Quantity),2) as [Средний чек, руб]
,count(distinct s.customerid) as [Количество уникальных клиентов]
from sales as sales
inner join sales_items as si
on s.salesid = si.salesid
where SalesDate >=date('2012-01-01') and SalesDate < date('2013-01-01')

Показать статистику продаж по возрастам. Поля: Год Возрастная группа Кол-во продаж Сумма продаж

Нужна методология определения возрастных группа
Методология:
до 18 лет = '1. Подростки'
от 19 до 30 = '2. Молодежь'
от 31 до 50= '3. Взрослые'
от 55  = '4. Пенсионеры'

with q1 as (
select FirstName, LastName, Age
, case when age <=18 then '1. Подростки'
       when age >19 and age <=30 then '2. Молодежь'
   when age >31 and age <=55 then '3. Взрослые'
       when age >55 then '4. Пенсионеры'
       end as age_type
from customers
)

select * from q1

select * from sales as sales
inner join q1 on q1.customerid = s.customerid
  inner join sales_items as si
     on si.SalesId = s.SalesId
 
select strtime('%Y', salesdate) as YYYY, age_type, count(distinct, s.SalesID) as count_sales, sum(si.UnitPrice*si.Quantity) as sum_sales
from sales as sales
inner join q1 on q1.customerid = s.customerid
  inner join sales_items as si
     on si.SalesId = s.SalesId
where strtime('%Y', salesdate) in ('2011', '2012', '2013')
group by strtime('%Y', salesdate), age_type


Виды JOINов
UNION
    ALL -- полный
    DISTINTCT - исключающий
JOIN
     CROSS
     INNER
     OUTER
           LEFT
           RIGHT
           FULL

Запросы с проектов

SELECT

DATE(registration_date) AS day,

COUNT(`number`) AS orders_count

FROM `order`

GROUP BY DATE(registration_date)

ORDER BY day