Π€ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Π°Ρ Π‘Π£Π‘Π”

ΠœΠΈΡ€ Π±Π°Π· Π΄Π°Π½Π½Ρ‹Ρ… Π΄Π°Π²Π½ΠΎ Π·Π°Ρ…Π²Π°Ρ‡Π΅Π½ рСляционными Π‘Π£Π‘Π”, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ язык SQL. ΠΠ°ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ сильно, Ρ‡Ρ‚ΠΎ ΠΏΠΎΡΠ²Π»ΡΡŽΡ‰ΠΈΠ΅ΡΡ разновидности Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ NoSQL. Им ΡƒΠ΄Π°Π»ΠΎΡΡŒ ΠΎΡ‚Π±ΠΈΡ‚ΡŒ сСбС ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ΅ мСсто Π½Π° этом Ρ€Ρ‹Π½ΠΊΠ΅, Π½ΠΎ рСляционныС Π‘Π£Π‘Π” ΡƒΠΌΠΈΡ€Π°Ρ‚ΡŒ Π½Π΅ ΡΠΎΠ±ΠΈΡ€Π°ΡŽΡ‚ΡΡ, ΠΈ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°ΡŽΡ‚ Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для своих Ρ†Π΅Π»Π΅ΠΉ.

Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ я Ρ…ΠΎΡ‡Ρƒ ΠΎΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠΉ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…. Для Π»ΡƒΡ‡ΡˆΠ΅Π³ΠΎ понимания, я Π±ΡƒΠ΄Ρƒ это Π΄Π΅Π»Π°Ρ‚ΡŒ ΠΏΡƒΡ‚Π΅ΠΌ сравнСния с классичСской рСляционной модСлью. Π’ качСствС ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π·Π°Π΄Π°Ρ‡ΠΈ ΠΈΠ· Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… тСстов ΠΏΠΎ SQL, Π½Π°ΠΉΠ΄Π΅Π½Π½Ρ‹Π΅ Π² ΠΈΠ½Ρ‚Π΅Ρ€Π½Π΅Ρ‚Π΅.

Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅

РСляционныС Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€ΠΈΡ€ΡƒΡŽΡ‚ Ρ‚Π°Π±Π»ΠΈΡ†Π°ΠΌΠΈ ΠΈ полями. Π’ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠΉ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… вмСсто Π½ΠΈΡ… Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ классы ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ соотвСтствСнно. ПолС Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ с N ΠΊΠ»ΡŽΡ‡Π°ΠΌΠΈ Π±ΡƒΠ΄Π΅Ρ‚ прСдставлСно ΠΊΠ°ΠΊ функция ΠΎΡ‚ N ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ². ВмСсто связСй ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ‚Π°Π±Π»ΠΈΡ†Π°ΠΌΠΈ Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ класса, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΠ΄Π΅Ρ‚ связь. ВмСсто JOIN Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ композиция Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ.

ΠŸΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ нСпосрСдствСнно ΠΊ Π·Π°Π΄Π°Ρ‡Π°ΠΌ, ΠΎΠΏΠΈΡˆΡƒ Π·Π°Π΄Π°Π½ΠΈΠ΅ Π΄ΠΎΠΌΠ΅Π½Π½ΠΎΠΉ Π»ΠΎΠ³ΠΈΠΊΠΈ. Для DDL я Π±ΡƒΠ΄Ρƒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ синтаксис PostgreSQL. Для Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠΉ свой синтаксис.

Π’Π°Π±Π»ΠΈΡ†Ρ‹ ΠΈ поля

ΠŸΡ€ΠΎΡΡ‚ΠΎΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Sku с полями Π½Π°ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ Ρ†Π΅Π½Π°:

РСляционная

CREATE TABLE Sku
(
    id bigint NOT NULL,
    name character varying(100),
    price numeric(10,5),
    CONSTRAINT id_pkey PRIMARY KEY (id)
)

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Π°Ρ

CLASSΒ Sku;
nameΒ =Β DATAΒ STRING[100]Β (Sku);
priceΒ =Β DATAΒ NUMERIC[10,5]Β (Sku);

ΠœΡ‹ объявляСм Π΄Π²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚ Π½Π° Π²Ρ…ΠΎΠ΄ ΠΎΠ΄ΠΈΠ½ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Sku, ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Π½Ρ‹ΠΉ Ρ‚ΠΈΠΏ.

ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ‚ΡΡ, Ρ‡Ρ‚ΠΎ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠΉ Π‘Π£Π‘Π” Ρƒ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π±ΡƒΠ΄Π΅Ρ‚ Π½Π΅ΠΊΠΈΠΉ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΉ ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ автоматичСски гСнСрируСтся, ΠΈ ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ ΠΏΡ€ΠΈ нСобходимости ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ.

Π—Π°Π΄Π°Π΄ΠΈΠΌ Ρ†Π΅Π½Ρƒ для Ρ‚ΠΎΠ²Π°Ρ€Π° / ΠΌΠ°Π³Π°Π·ΠΈΠ½Π° / поставщика. Она ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ со Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ, поэтому Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π² Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ ΠΏΠΎΠ»Π΅ врСмя. ОбъявлСниС Ρ‚Π°Π±Π»ΠΈΡ† для справочников Π² рСляционной Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΡ€ΠΎΠΏΡƒΡ‰Ρƒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠΊΡ€Π°Ρ‚ΠΈΡ‚ΡŒ ΠΊΠΎΠ΄:

РСляционная

CREATE TABLE prices
(
    skuId bigint NOT NULL,
    storeId bigint NOT NULL,
    supplierId bigint NOT NULL,
    dateTime timestamp without time zone,
    price numeric(10,5),
    CONSTRAINT prices_pkey PRIMARY KEY (skuId, storeId, supplierId)
)

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Π°Ρ

CLASSΒ Sku;
CLASSΒ Store;
CLASSΒ Supplier;
dateTimeΒ =Β DATAΒ DATETIMEΒ (Sku,Β Store,Β Supplier);
priceΒ =Β DATAΒ NUMERIC[10,5]Β (Sku,Β Store,Β Supplier);

Π˜Π½Π΄Π΅ΠΊΡΡ‹

Для послСднСго ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° построим индСкс ΠΏΠΎ всСм ΠΊΠ»ΡŽΡ‡Π°ΠΌ ΠΈ Π΄Π°Ρ‚Π΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ быстро Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ Ρ†Π΅Π½Ρƒ Π½Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ΅ врСмя.

РСляционная

CREATE INDEX prices_date
    ON prices
    (skuId, storeId, supplierId, dateTime)

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Π°Ρ

INDEXΒ SkuΒ sk,Β StoreΒ st,Β SupplierΒ sp,Β dateTime(sk,Β st,Β sp);

Π—Π°Π΄Π°Ρ‡ΠΈ

НачнСм с ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ простых Π·Π°Π΄Π°Ρ‡, взятых ΠΈΠ· ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ ΡΡ‚Π°Ρ‚ΡŒΠΈ Π½Π° Π₯Π°Π±Ρ€Π΅.

Π‘Π½Π°Ρ‡Π°Π»Π° объявим Π΄ΠΎΠΌΠ΅Π½Π½ΡƒΡŽ Π»ΠΎΠ³ΠΈΠΊΡƒ (для рСляционной Π±Π°Π·Ρ‹ это сдСлано нСпосрСдствСнно Π² ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΉ ΡΡ‚Π°Ρ‚ΡŒΠ΅).

CLASSΒ Department;
nameΒ =Β DATAΒ STRING[100]Β (Department);

CLASSΒ Employee;
departmentΒ =Β DATAΒ DepartmentΒ (Employee);
chiefΒ =Β DATAΒ EmployeeΒ (Employee);
nameΒ =Β DATAΒ STRING[100]Β (Employee);
salaryΒ =Β DATAΒ NUMERIC[14,2]Β (Employee);

Π—Π°Π΄Π°Ρ‡Π° 1.1

ВывСсти список сотрудников, ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‰ΠΈΡ… Π·Π°Ρ€Π°Π±ΠΎΡ‚Π½ΡƒΡŽ ΠΏΠ»Π°Ρ‚Ρƒ Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ Ρ‡Π΅ΠΌ Ρƒ нСпосрСдствСнного руководитСля.

РСляционная

select a.*
from   employee a, employee b
where  b.id = a.chief_id
and    a.salary > b.salary

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Π°Ρ

SELECTΒ name(EmployeeΒ a)Β WHEREΒ salary(a)Β >Β salary(chief(a));

Π—Π°Π΄Π°Ρ‡Π° 1.2

ВывСсти список сотрудников, ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‰ΠΈΡ… ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½ΡƒΡŽ Π·Π°Ρ€Π°Π±ΠΎΡ‚Π½ΡƒΡŽ ΠΏΠ»Π°Ρ‚Ρƒ Π² своСм ΠΎΡ‚Π΄Π΅Π»Π΅

РСляционная

select a.*
from   employee a
where  a.salary = ( select max(salary) from employee b
                    where  b.department_id = a.department_id )

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Π°Ρ

maxSalaryΒ 'ΠœΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Π°ΡΒ Π·Π°Ρ€ΠΏΠ»Π°Ρ‚Π°'Β (DepartmentΒ s)Β =Β 
Β Β Β Β GROUPΒ MAXΒ salary(EmployeeΒ e)Β IFΒ department(e)Β =Β s;
SELECTΒ name(EmployeeΒ a)Β WHEREΒ salary(a)Β =Β maxSalary(department(a));

// или Ссли "Π·Π°ΠΈΠ½Π»Π°ΠΉΠ½ΠΈΡ‚ΡŒ"
SELECTΒ name(EmployeeΒ a)Β WHEREΒ 
Β Β Β Β salary(a)Β =Β maxSalary(GROUPΒ MAXΒ salary(EmployeeΒ e)Β IFΒ department(e)Β =Β department(a));

ОбС Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ эквивалСнтны. Для ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ случая Π² рСляционной Π±Π°Π·Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ CREATE VIEW, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ‚Π°ΠΊΠΈΠΌ ΠΆΠ΅ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ сначала посчитаСт для ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ ΠΎΡ‚Π΄Π΅Π»Π° ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½ΡƒΡŽ Π·Π°Ρ€ΠΏΠ»Π°Ρ‚Ρƒ Π² Π½Π΅ΠΌ. Π’ дальнСйшСм я для наглядности Π±ΡƒΠ΄Ρƒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ случай, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ Π»ΡƒΡ‡ΡˆΠ΅ ΠΎΡ‚Ρ€Π°ΠΆΠ°Π΅Ρ‚ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅.

Π—Π°Π΄Π°Ρ‡Π° 1.3

ВывСсти список ID ΠΎΡ‚Π΄Π΅Π»ΠΎΠ², количСство сотрудников Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π½Π΅ ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ°Π΅Ρ‚ 3 Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊ.

РСляционная

select department_id
from   employee
group  by department_id
having count(*) <= 3

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Π°Ρ

countEmployeesΒ 'ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎΒ ΡΠΎΡ‚Ρ€ΡƒΠ΄Π½ΠΈΠΊΠΎΠ²'Β (DepartmentΒ d)Β =Β 
Β Β Β Β GROUPΒ SUMΒ 1Β IFΒ department(EmployeeΒ e)Β =Β d;
SELECTΒ DepartmentΒ dΒ WHEREΒ countEmployees(d)Β <=Β 3;

Π—Π°Π΄Π°Ρ‡Π° 1.4

ВывСсти список сотрудников, Π½Π΅ ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΡ… Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½ΠΎΠ³ΠΎ руководитСля, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰Π΅Π³ΠΎ Π² Ρ‚ΠΎΠΌ-ΠΆΠ΅ ΠΎΡ‚Π΄Π΅Π»Π΅.

РСляционная

select a.*
from   employee a
left   join employee b on (b.id = a.chief_id and b.department_id = a.department_id)
where  b.id is null

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Π°Ρ

SELECTΒ name(EmployeeΒ a)Β WHEREΒ NOTΒ (department(chief(a))Β =Β department(a));

Π—Π°Π΄Π°Ρ‡Π° 1.5

Найти список ID ΠΎΡ‚Π΄Π΅Π»ΠΎΠ² с максимальной суммарной Π·Π°Ρ€ΠΏΠ»Π°Ρ‚ΠΎΠΉ сотрудников.

РСляционная

with sum_salary as
  ( select department_id, sum(salary) salary
    from   employee
    group  by department_id )
select department_id
from   sum_salary a       
where  a.salary = ( select max(salary) from sum_salary )

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Π°Ρ

salarySumΒ 'ΠœΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Π°ΡΒ Π·Π°Ρ€ΠΏΠ»Π°Ρ‚Π°'Β (DepartmentΒ d)Β =Β 
Β Β Β Β GROUPΒ SUMΒ salary(EmployeeΒ e)Β IFΒ department(e)Β =Β d;
maxSalarySumΒ 'ΠœΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Π°ΡΒ Π·Π°Ρ€ΠΏΠ»Π°Ρ‚Π°Β ΠΎΡ‚Π΄Π΅Π»ΠΎΠ²'Β ()Β =Β 
Β Β Β Β GROUPΒ MAXΒ salarySum(DepartmentΒ d);
SELECTΒ DepartmentΒ dΒ WHEREΒ salarySum(d)Β =Β maxSalarySum();

ΠŸΠ΅Ρ€Π΅ΠΉΠ΄Π΅ΠΌ ΠΊ Π±ΠΎΠ»Π΅Π΅ слоТным Π·Π°Π΄Π°Ρ‡Π°ΠΌ ΠΈΠ· Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΡΡ‚Π°Ρ‚ΡŒΠΈ. Π’ Π½Π΅ΠΉ Π΅ΡΡ‚ΡŒ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Ρ‹ΠΉ Ρ€Π°Π·Π±ΠΎΡ€ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ эту Π·Π°Π΄Π°Ρ‡Ρƒ Π½Π° MS SQL.

Π—Π°Π΄Π°Ρ‡Π° 2.1

КакиС ΠΏΡ€ΠΎΠ΄Π°Π²Ρ†Ρ‹ ΠΏΡ€ΠΎΠ΄Π°Π»ΠΈ Π² 1997 Π³ΠΎΠ΄Ρƒ Π±ΠΎΠ»Π΅Π΅ 30 ΡˆΡ‚ΡƒΠΊ Ρ‚ΠΎΠ²Π°Ρ€Π° β„–1?

ДомСнная Π»ΠΎΠ³ΠΈΠΊΠ° (ΠΊΠ°ΠΊ ΠΈ Ρ€Π°Π½ΡŒΡˆΠ΅ Π½Π° Π Π‘Π£Π‘Π” пропускаСм объявлСниС):

CLASSΒ EmployeeΒ 'ΠŸΡ€ΠΎΠ΄Π°Π²Π΅Ρ†';
lastName 'Ѐамилия' = DATA STRING[100] (Employee);

CLASSΒ ProductΒ 'ΠŸΡ€ΠΎΠ΄ΡƒΠΊΡ‚';
idΒ =Β DATAΒ INTEGERΒ (Product);
nameΒ =Β DATAΒ STRING[100]Β (Product);

CLASSΒ OrderΒ 'Π—Π°ΠΊΠ°Π·';
dateΒ =Β DATAΒ DATEΒ (Order);
employeeΒ =Β DATAΒ EmployeeΒ (Order);

CLASSΒ DetailΒ 'Π‘Ρ‚Ρ€ΠΎΠΊΠ°Β Π·Π°ΠΊΠ°Π·Π°';

orderΒ =Β DATAΒ OrderΒ (Detail);
productΒ =Β DATAΒ ProductΒ (Detail);
quantityΒ =Β DATAΒ NUMERIC[10,5]Β (Detail);

РСляционная

select LastName
from Employees as e
where (
  select sum(od.Quantity)
  from [Order Details] as od
  where od.ProductID = 1 and od.OrderID in (
    select o.OrderID
    from Orders as o
    where year(o.OrderDate) = 1997 and e.EmployeeID = o.EmployeeID)
) > 30

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Π°Ρ

soldΒ (EmployeeΒ e,Β INTEGERΒ productId,Β INTEGERΒ year)Β =Β 
Β Β Β Β GROUPΒ SUMΒ quantity(OrderDetailΒ d)Β IFΒ 
Β Β Β Β Β Β Β Β employee(order(d))Β =Β eΒ ANDΒ 
Β Β Β Β Β Β Β Β id(product(d))Β =Β productIdΒ ANDΒ 
Β Β Β Β Β Β Β Β extractYear(date(order(d)))Β =Β year;
SELECTΒ lastName(EmployeeΒ e)Β WHEREΒ sold(e,Β 1,Β 1997)Β >Β 30;

Π—Π°Π΄Π°Ρ‡Π° 2.2

Для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ покупатСля (имя, фамилия) Π½Π°ΠΉΡ‚ΠΈ Π΄Π²Π° Ρ‚ΠΎΠ²Π°Ρ€Π° (Π½Π°Π·Π²Π°Π½ΠΈΠ΅), Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠΊΡƒΠΏΠ°Ρ‚Π΅Π»ΡŒ ΠΏΠΎΡ‚Ρ€Π°Ρ‚ΠΈΠ» большС всСго Π΄Π΅Π½Π΅Π³ Π² 1997-ΠΌ Π³ΠΎΠ΄Ρƒ.

Π Π°ΡΡˆΠΈΡ€ΡΠ΅ΠΌ Π΄ΠΎΠΌΠ΅Π½Π½ΡƒΡŽ Π»ΠΎΠ³ΠΈΠΊΡƒ ΠΈΠ· ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°:

CLASSΒ CustomerΒ 'ΠšΠ»ΠΈΠ΅Π½Ρ‚';
contactName 'ЀИО' = DATA STRING[100] (Customer);

customerΒ =Β DATAΒ CustomerΒ (Order);

unitPriceΒ =Β DATAΒ NUMERIC[14,2]Β (Detail);
discountΒ =Β DATAΒ NUMERIC[6,2]Β (Detail);

РСляционная

SELECT ContactName, ProductName FROM (
SELECT c.ContactName, p.ProductName
, ROW_NUMBER() OVER (
    PARTITION BY c.ContactName
    ORDER BY SUM(od.Quantity * od.UnitPrice * (1 - od.Discount)) DESC
) AS RatingByAmt
FROM Customers c
JOIN Orders o ON o.CustomerID = c.CustomerID
JOIN [Order Details] od ON od.OrderID = o.OrderID
JOIN Products p ON p.ProductID = od.ProductID
WHERE YEAR(o.OrderDate) = 1997
GROUP BY c.ContactName, p.ProductName
) t
WHERE RatingByAmt < 3

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Π°Ρ

sumΒ (DetailΒ d)Β =Β quantity(d)Β *Β unitPrice(d)Β *Β (1Β -Β discount(d));
boughtΒ 'ΠšΡƒΠΏΠΈΠ»'Β (CustomerΒ c,Β ProductΒ p,Β INTEGERΒ y)Β =Β 
Β Β Β Β GROUPΒ SUMΒ sum(DetailΒ d)Β IFΒ 
Β Β Β Β Β Β Β Β customer(order(d))Β =Β cΒ ANDΒ 
Β Β Β Β Β Β Β Β product(d)Β =Β pΒ ANDΒ 
Β Β Β Β Β Β Β Β extractYear(date(order(d)))Β =Β y;
ratingΒ 'Π Π΅ΠΉΡ‚ΠΈΠ½Π³'Β (CustomerΒ c,Β ProductΒ p,Β INTEGERΒ y)Β =Β 
Β Β Β Β PARTITIONΒ SUMΒ 1Β ORDERΒ DESCΒ bought(c,Β p,Β y),Β pΒ BYΒ c,Β y;
SELECTΒ contactName(CustomerΒ c),Β name(ProductΒ p)Β WHEREΒ rating(c,Β p,Β 1997)Β <Β 3;

ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ PARTITION Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΏΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌΡƒ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡƒ: ΠΎΠ½ суммируСт Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ΅ послС SUM (здСсь 1), Π²Π½ΡƒΡ‚Ρ€ΠΈ ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Ρ… Π³Ρ€ΡƒΠΏΠΏ (здСсь Customer ΠΈ Year, Π½ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ любоС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅), сортируя Π²Π½ΡƒΡ‚Ρ€ΠΈ Π³Ρ€ΡƒΠΏΠΏ ΠΏΠΎ выраТСниям, ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΌ Π² ORDER (здСсь bought, Π° Ссли Ρ€Π°Π²Π½Ρ‹, Ρ‚ΠΎ ΠΏΠΎ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ΠΌΡƒ ΠΊΠΎΠ΄Ρƒ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π°).

Π—Π°Π΄Π°Ρ‡Π° 2.3

Бколько Ρ‚ΠΎΠ²Π°Ρ€ΠΎΠ² Π½ΡƒΠΆΠ½ΠΎ Π·Π°ΠΊΠ°Π·Π°Ρ‚ΡŒ Ρƒ поставщиков для выполнСния Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΡ… Π·Π°ΠΊΠ°Π·ΠΎΠ².

ΠžΠΏΡΡ‚ΡŒ Ρ€Π°ΡΡˆΠΈΡ€ΡΠ΅ΠΌ Π΄ΠΎΠΌΠ΅Π½Π½ΡƒΡŽ Π»ΠΎΠ³ΠΈΠΊΡƒ:

CLASSΒ SupplierΒ 'ΠŸΠΎΡΡ‚Π°Π²Ρ‰ΠΈΠΊ';
companyNameΒ =Β DATAΒ STRING[100]Β (Supplier);

supplierΒ =Β DATAΒ SupplierΒ (Product);

unitsInStockΒ 'ΠžΡΡ‚Π°Ρ‚ΠΎΠΊΒ Π½Π°Β ΡΠΊΠ»Π°Π΄Π΅'Β =Β DATAΒ NUMERIC[10,3]Β (Product);
reorderLevelΒ 'Норма продаТи'Β =Β DATAΒ NUMERIC[10,3]Β (Product);

РСляционная

select s.CompanyName, p.ProductName, sum(od.Quantity) + p.ReorderLevel β€” p.UnitsInStock as ToOrder
from Orders o
join [Order Details] od on o.OrderID = od.OrderID
join Products p on od.ProductID = p.ProductID
join Suppliers s on p.SupplierID = s.SupplierID
where o.ShippedDate is null
group by s.CompanyName, p.ProductName, p.UnitsInStock, p.ReorderLevel
having p.UnitsInStock < sum(od.Quantity) + p.ReorderLevel

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Π°Ρ

orderedNotShippedΒ 'Π—Π°ΠΊΠ°Π·Π°Π½ΠΎ,Β Π½ΠΎΒ Π½Π΅Β ΠΎΡ‚Π³Ρ€ΡƒΠΆΠ΅Π½ΠΎ'Β (ProductΒ p)Β =Β 
Β Β Β Β GROUPΒ SUMΒ quantity(OrderDetailΒ d)Β IFΒ product(d)Β =Β p;
toOrderΒ 'ΠšΒ Π·Π°ΠΊΠ°Π·Ρƒ'Β (ProductΒ p)Β =Β orderedNotShipped(p)Β +Β reorderLevel(p)Β -Β unitsInStock(p);
SELECTΒ companyName(supplier(ProductΒ p)),Β name(p),Β toOrder(p)Β WHEREΒ toOrder(p)Β >Β 0;

Π—Π°Π΄Π°Ρ‡Π° со Π·Π²Π΅Π·Π΄ΠΎΡ‡ΠΊΠΎΠΉ

И послСднСй ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π»ΠΈΡ‡Π½ΠΎ ΠΎΡ‚ мСня. Π•ΡΡ‚ΡŒ Π»ΠΎΠ³ΠΈΠΊΠ° ΡΠΎΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΉ сСти. Π›ΡŽΠ΄ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π΄Ρ€ΡƒΠΆΠΈΡ‚ΡŒ Π΄Ρ€ΡƒΠ³ с Π΄Ρ€ΡƒΠ³ΠΎΠΌ ΠΈ нравится Π΄Ρ€ΡƒΠ³ Π΄Ρ€ΡƒΠ³Ρƒ. Π‘ Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠΉ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… это Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

CLASSΒ Person;
likesΒ =Β DATAΒ BOOLEANΒ (Person,Β Person);
friendsΒ =Β DATAΒ BOOLEANΒ (Person,Β Person);

НСобходимо Π½Π°ΠΉΡ‚ΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… ΠΊΠ°Π½Π΄ΠΈΠ΄Π°Ρ‚ΠΎΠ² Π½Π° Π΄Ρ€ΡƒΠΆΠ±Ρƒ. Π‘ΠΎΠ»Π΅Π΅ Ρ„ΠΎΡ€ΠΌΠ°Π»ΠΈΠ·ΠΎΠ²Π°Π½ΠΎ Π½ΡƒΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ всСх людСй A, B, C Ρ‚Π°ΠΊΠΈΡ…, Ρ‡Ρ‚ΠΎ A Π΄Ρ€ΡƒΠΆΠΈΡ‚ с B, Π° B Π΄Ρ€ΡƒΠΆΠΈΡ‚ с C, A нравится C, Π½ΠΎ A Π½Π΅ Π΄Ρ€ΡƒΠΆΠΈΡ‚ с C.
Π‘ Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠΉ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… запрос Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

SELECTΒ PersonΒ a,Β PersonΒ b,Β PersonΒ cΒ WHEREΒ 
Β Β Β Β likes(a,Β c)Β ANDΒ NOTΒ friends(a,Β c)Β ANDΒ 
Β Β Β Β friends(a,Β b)Β ANDΒ friends(b,Β c);

Π§ΠΈΡ‚Π°Ρ‚Π΅Π»ΡŽ прСдлагаСтся ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ эту Π·Π°Π΄Π°Ρ‡Ρƒ Π½Π° SQL. ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ‚ΡΡ, Ρ‡Ρ‚ΠΎ Π΄Ρ€ΡƒΠ·Π΅ΠΉ Π³ΠΎΡ€Π°Π·Π΄ΠΎ мСньшС Ρ‡Π΅ΠΌ Ρ‚Π΅Ρ…, ΠΊΡ‚ΠΎ нравится. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΎΠ½ΠΈ Π»Π΅ΠΆΠ°Ρ‚ Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… Ρ‚Π°Π±Π»ΠΈΡ†Π°Ρ…. Π’ случаС ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ³ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π΅ΡΡ‚ΡŒ Ρ‚Π°ΠΊΠΆΠ΅ Π·Π°Π΄Π°Ρ‡Π° с двумя Π·Π²Π΅Π·Π΄ΠΎΡ‡ΠΊΠ°ΠΌΠΈ. Π’ Π½Π΅ΠΉ Π΄Ρ€ΡƒΠΆΠ±Π° Π½Π΅ симмСтрична. На Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠΉ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… это Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ Ρ‚Π°ΠΊ:

SELECTΒ PersonΒ a,Β PersonΒ b,Β PersonΒ cΒ WHEREΒ 
Β Β Β Β likes(a,Β c)Β ANDΒ NOTΒ friends(a,Β c)Β ANDΒ 
Β Β Β Β (friends(a,Β b)Β ORΒ friends(b,Β a))Β ANDΒ 
Β Β Β Β (friends(b,Β c)Β ORΒ friends(c,Β b));

UPD: Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π·Π°Π΄Π°Ρ‡ΠΈ с ΠΏΠ΅Ρ€Π²ΠΎΠΉ ΠΈ Π²Ρ‚ΠΎΡ€ΠΎΠΉ Π·Π²Π΅Π·Π΄ΠΎΡ‡ΠΊΠΎΠΉ ΠΎΡ‚ dss_kalika:

SELECT 
   pl.PersonAID
  ,pf.PersonAID
  ,pff.PersonAID
FROM Persons                 AS p
--Π›Π°ΠΉΠΊΠΈ                      
JOIN PersonRelationShip      AS pl ON pl.PersonAID = p.PersonID
                                  AND pl.Relation  = 'Like'
--Π”Ρ€ΡƒΠ·ΡŒΡ                     
JOIN PersonRelationShip      AS pf ON pf.PersonAID = p.PersonID 
                                  AND pf.Relation = 'Friend'
--Π”Ρ€ΡƒΠ·ΡŒΡ Π”Ρ€ΡƒΠ·Π΅ΠΉ              
JOIN PersonRelationShip      AS pff ON pff.PersonAID = pf.PersonBID
                                   AND pff.PersonBID = pl.PersonBID
                                   AND pff.Relation = 'Friend'
--Π•Ρ‰Ρ‘ Π½Π΅ Π΄Ρ€ΡƒΠΆΠ°Ρ‚         
LEFT JOIN PersonRelationShip AS pnf ON pnf.PersonAID = p.PersonID
                                   AND pnf.PersonBID = pff.PersonBID
                                   AND pnf.Relation = 'Friend'
WHERE pnf.PersonAID IS NULL 

;WITH PersonRelationShipCollapsed AS (
  SELECT pl.PersonAID
        ,pl.PersonBID
        ,pl.Relation 
  FROM #PersonRelationShip      AS pl 
  
  UNION 

  SELECT pl.PersonBID AS PersonAID
        ,pl.PersonAID AS PersonBID
        ,pl.Relation
  FROM #PersonRelationShip      AS pl 
)
SELECT 
   pl.PersonAID
  ,pf.PersonBID
  ,pff.PersonBID
FROM #Persons                      AS p
--Π›Π°ΠΉΠΊΠΈ                      
JOIN PersonRelationShipCollapsed  AS pl ON pl.PersonAID = p.PersonID
                                 AND pl.Relation  = 'Like'                                  
--Π”Ρ€ΡƒΠ·ΡŒΡ                          
JOIN PersonRelationShipCollapsed  AS pf ON pf.PersonAID = p.PersonID 
                                 AND pf.Relation = 'Friend'
--Π”Ρ€ΡƒΠ·ΡŒΡ Π”Ρ€ΡƒΠ·Π΅ΠΉ                   
JOIN PersonRelationShipCollapsed  AS pff ON pff.PersonAID = pf.PersonBID
                                 AND pff.PersonBID = pl.PersonBID
                                 AND pff.Relation = 'Friend'
--Π•Ρ‰Ρ‘ Π½Π΅ Π΄Ρ€ΡƒΠΆΠ°Ρ‚                   
LEFT JOIN PersonRelationShipCollapsed AS pnf ON pnf.PersonAID = p.PersonID
                                   AND pnf.PersonBID = pff.PersonBID
                                   AND pnf.Relation = 'Friend'
WHERE pnf.[PersonAID] IS NULL 

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

Π‘Π»Π΅Π΄ΡƒΠ΅Ρ‚ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ синтаксис языка β€” это всСго лишь ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΉ ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΈ. Π—Π° основу Π±Ρ‹Π» взят ΠΈΠΌΠ΅Π½Π½ΠΎ SQL, ΠΈ Ρ†Π΅Π»ΡŒΡŽ Π±Ρ‹Π»ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ максимально Π±Ρ‹Π» ΠΏΠΎΡ…ΠΎΠΆ Π½Π° Π½Π΅Π³ΠΎ. ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, ΠΊΠΎΠΌΡƒ-Ρ‚ΠΎ ΠΌΠΎΠ³ΡƒΡ‚ Π½Π΅ понравится названия ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Ρ… слов, рСгистры слов ΠΈ ΠΏΡ€ΠΎΡ‡Π΅Π΅. Π—Π΄Π΅ΡΡŒ Π³Π»Π°Π²Π½ΠΎΠ΅ β€” ΠΈΠΌΠ΅Π½Π½ΠΎ сама концСпция. ΠŸΡ€ΠΈ ΠΆΠ΅Π»Π°Π½ΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΈ C++, ΠΈ Python ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹ΠΉ синтаксис.

Описанная концСпция Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…, Π½Π° ΠΌΠΎΠΉ взгляд ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌΠΈ прСимущСствами:

  • ΠŸΡ€ΠΎΡΡ‚ΠΎΡ‚Π°. Π­Ρ‚ΠΎ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡΡƒΠ±ΡŠΠ΅ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΉ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅ ΠΎΡ‡Π΅Π²ΠΈΠ΄Π΅Π½ Π½Π° простых случаях. Но Ссли ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ слоТныС случаи (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π·Π°Π΄Π°Ρ‡ΠΈ со Π·Π²Π΅Π·Π΄ΠΎΡ‡ΠΊΠ°ΠΌΠΈ), Ρ‚ΠΎ, Π½Π° ΠΌΠΎΠΉ взгляд, ΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΈΠ΅ запросы Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΡ€ΠΎΡ‰Π΅.
  • Π˜Π½ΠΊΠ°ΠΏΡΡƒΠ»ΡΡ†ΠΈΡ. Π’ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ… я объявлял ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, sold, bought ΠΈ Ρ‚.Π΄.), ΠΎΡ‚ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΡΡ‚Ρ€ΠΎΠΈΠ»ΠΈΡΡŒ ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π­Ρ‚ΠΎ позволяСт ΠΏΡ€ΠΈ нСобходимости ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ Π»ΠΎΠ³ΠΈΠΊΡƒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π±Π΅Π· измСнСния Π»ΠΎΠ³ΠΈΠΊΠΈ зависящих ΠΎΡ‚ Π½ΠΈΡ…. НапримСр, ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠ΄Π°ΠΆΠΈ sold ΡΡ‡ΠΈΡ‚Π°Π»ΠΈΡΡŒ ΠΎΡ‚ ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², ΠΏΡ€ΠΈ этом ΠΎΡΡ‚Π°Π»ΡŒΠ½Π°Ρ Π»ΠΎΠ³ΠΈΠΊΠ° Π½Π΅ измСнится. Π”Π°, Π² Π Π‘Π£Π‘Π” это ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ CREATE VIEW. Но Ссли всю Π»ΠΎΠ³ΠΈΠΊΡƒ ΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‚ΠΎ ΠΎΠ½Π° Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ Π½Π΅ ΠΎΡ‡Π΅Π½ΡŒ Ρ‡ΠΈΡ‚Π°Π±Π΅Π»ΡŒΠ½ΠΎΠΉ.
  • ΠžΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΠΈΠ΅ сСмантичСского Ρ€Π°Π·Ρ€Ρ‹Π²Π°. Вакая Π±Π°Π·Π° Π΄Π°Π½Π½Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ функциями ΠΈ классами (вмСсто Ρ‚Π°Π±Π»ΠΈΡ† ΠΈ ΠΏΠΎΠ»Π΅ΠΉ). Π’ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈ Π² классичСском ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ (Ссли ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄ β€” это функция с ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ Π² Π²ΠΈΠ΄Π΅ класса, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ ΠΎΠ½ относится). БоотвСтствСнно, Β«ΠΏΠΎΠ΄Ρ€ΡƒΠΆΠΈΡ‚ΡŒΒ» с ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ языками программирования Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΡ€ΠΎΡ‰Π΅. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, эта концСпция позволяСт Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ Π³ΠΎΡ€Π°Π·Π΄ΠΎ Π±ΠΎΠ»Π΅Π΅ слоТныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. НапримСр, ΠΌΠΎΠΆΠ½ΠΎ Π²ΡΡ‚Ρ€Π°ΠΈΠ²Π°Ρ‚ΡŒ Π² Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ Π²ΠΈΠ΄Π°:

    CONSTRAINTΒ sold(EmployeeΒ e,Β 1,Β 2019)Β >Β 100Β IFΒ name(e)Β =Β 'ΠŸΠ΅Ρ‚Ρ'Β MESSAGEΒ Β 'Π§Ρ‚ΠΎ-Ρ‚ΠΎΒ ΠŸΠ΅Ρ‚ΡΒ ΠΏΡ€ΠΎΠ΄Π°Π΅Ρ‚Β ΡΠ»ΠΈΡˆΠΊΠΎΠΌΒ ΠΌΠ½ΠΎΠ³ΠΎΒ ΠΎΠ΄Π½ΠΎΠ³ΠΎΒ Ρ‚ΠΎΠ²Π°Ρ€Π°Β Π²Β 2019Β Π³ΠΎΠ΄Ρƒ';

  • НаслСдованиС ΠΈ ΠΏΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌ. Π’ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠΉ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… ΠΌΠΎΠΆΠ½ΠΎ ввСсти мноТСствСнноС наслСдованиС Ρ‡Π΅Ρ€Π΅Π· конструкции CLASS ClassP: Class1, Class2 ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ мноТСствСнный ΠΏΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌ. Как ΠΈΠΌΠ΅Π½Π½ΠΎ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΏΠΈΡˆΡƒ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… ΡΡ‚Π°Ρ‚ΡŒΡΡ….

НСсмотря Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ это всСго лишь концСпция, Ρƒ нас Π΅ΡΡ‚ΡŒ ΡƒΠΆΠ΅ нСкоторая рСализация Π½Π° Java, которая транслируСт всю Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΡƒΡŽ Π»ΠΎΠ³ΠΈΠΊΡƒ Π² Ρ€Π΅Π»ΡΡ†ΠΈΠΎΠ½Π½ΡƒΡŽ Π»ΠΎΠ³ΠΈΠΊΡƒ. Плюс ΠΊ Π½Π΅ΠΉ красиво ΠΏΡ€ΠΈΠΊΡ€ΡƒΡ‡Π΅Π½Π° Π»ΠΎΠ³ΠΈΠΊΠ° прСдставлСний ΠΈ ΠΌΠ½ΠΎΠ³ΠΎ Ρ‡Π΅Π³ΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ, благодаря Ρ‡Π΅ΠΌΡƒ получаСтся цСлая ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ°. По сути, ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Π Π‘Π£Π‘Π” (ΠΏΠΎΠΊΠ° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ PostgreSQL) ΠΊΠ°ΠΊ Β«Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΡƒΡŽ ΠΌΠ°ΡˆΠΈΠ½ΡƒΒ». ΠŸΡ€ΠΈ Ρ‚Π°ΠΊΠΎΠΉ трансляции ΠΈΠ½ΠΎΠ³Π΄Π° Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ‚ΠΎΡ€ запросов Π Π‘Π£Π‘Π” Π½Π΅ Π·Π½Π°Π΅Ρ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ статистики, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π·Π½Π°Π΅Ρ‚ Π€Π‘Π£Π‘Π”. Π’ Ρ‚Π΅ΠΎΡ€ΠΈΠΈ, ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ систСму управлСния Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½Ρ‹Ρ…, которая Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² качСствС Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π° Π½Π΅ΠΊΡƒΡŽ структуру, Π°Π΄Π°ΠΏΡ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΡƒΡŽ ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΏΠΎΠ΄ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΡƒΡŽ Π»ΠΎΠ³ΠΈΠΊΡƒ.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com