рдХрд╛рд░реНрдпрд╛рддреНрдордХ DBMS

рдбреЗрдЯрд╛рдмреЗрд╕рдЪреНрдпрд╛ рдЬрдЧрд╛рдд рдПрд╕рдХреНрдпреВрдПрд▓ рднрд╛рд╖рд╛ рд╡рд╛рдкрд░рдгрд╛рд▒реНрдпрд╛ рд░рд┐рд▓реЗрд╢рдирд▓ рдбреАрдмреАрдПрдордПрд╕рдЪреЗ рд╡рд░реНрдЪрд╕реНрд╡ рдЖрд╣реЗ. рдЗрддрдХреЗ рдХреА рдЙрджрдпреЛрдиреНрдореБрдЦ рд░реВрдкрд╛рдВрдирд╛ 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 рдШреЗрддреЗ рдЖрдгрд┐ рдПрдХ рдЖрджрд┐рдо рдкреНрд░рдХрд╛рд░ рдкрд░рдд рдХрд░рддреЗ.

рдЕрд╕реЗ рдЧреГрд╣реАрдд рдзрд░рд▓реЗ рдЬрд╛рддреЗ рдХреА рдХрд╛рд░реНрдпрд╛рддреНрдордХ DBMS рдордзреНрдпреЗ рдкреНрд░рддреНрдпреЗрдХ рдСрдмреНрдЬреЗрдХреНрдЯрдордзреНрдпреЗ рдХрд╛рд╣реА рдЕрдВрддрд░реНрдЧрдд рдХреЛрдб рдЕрд╕рддреЛ рдЬреЛ рдЖрдкреЛрдЖрдк рд╡реНрдпреБрддреНрдкрдиреНрди рд╣реЛрддреЛ рдЖрдгрд┐ рдЖрд╡рд╢реНрдпрдХ рдЕрд╕рд▓реНрдпрд╛рд╕ рддреНрдпрд╛рдд рдкреНрд░рд╡реЗрд╢ рдХреЗрд▓рд╛ рдЬрд╛рдК рд╢рдХрддреЛ.

рдЙрддреНрдкрд╛рджрди/рд╕реНрдЯреЛрдЕрд░/рдкреБрд░рд╡рдард╛рджрд╛рд░рд╛рд╕рд╛рдареА рдХрд┐рдВрдордд рд╕реЗрдЯ рдХрд░реВрдпрд╛. рд╣реЗ рдХрд╛рд▓рд╛рдВрддрд░рд╛рдиреЗ рдмрджрд▓реВ рд╢рдХрддреЗ, рдореНрд╣рдгреВрди рдЯреЗрдмрд▓рдордзреНрдпреЗ рд╡реЗрд│ рдлреАрд▓реНрдб рдЬреЛрдбреВрдпрд╛. рдореА рдХреЛрдб рд▓рд╣рд╛рди рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд░рд┐рд▓реЗрд╢рдирд▓ рдбреЗрдЯрд╛рдмреЗрд╕рдордзреАрд▓ рдбрд┐рд░реЗрдХреНрдЯрд░реАрдВрд╕рд╛рдареА рдЯреЗрдмрд▓реНрд╕ рдШреЛрд╖рд┐рдд рдХрд░рдгреЗ рд╡рдЧрд│реЗрди:

рд╕рдВрдмрдВрдзреАрдд

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);

рдХрд╛рд░реНрдпреЗ

рдЪрд▓рд╛ рд╕рдВрдмрдВрдзрд┐рддрд╛рдВрдордзреВрди рдШреЗрддрд▓реЗрд▓реНрдпрд╛ рддреБрд▓рдиреЗрдиреЗ рд╕реЛрдкреНрдпрд╛ рд╕рдорд╕реНрдпрд╛рдВрдкрд╛рд╕реВрди рд╕реБрд░реБрд╡рд╛рдд рдХрд░реВрдпрд╛ рд▓реЗрдЦ Habr рд╡рд░.

рдкреНрд░рдердо, рдбреЛрдореЗрди рд▓реЙрдЬрд┐рдХ рдШреЛрд╖рд┐рдд рдХрд░реВ (рд░рд┐рд▓реЗрд╢рдирд▓ рдбреЗрдЯрд╛рдмреЗрд╕рд╕рд╛рдареА рд╣реЗ рдереЗрдЯ рд╡рд░реАрд▓ рд▓реЗрдЦрд╛рдд рдХреЗрд▓реЗ рдЖрд╣реЗ).

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);

рдХрд╛рд░реНрдп реи

рдЬреНрдпрд╛ рдХрд░реНрдордЪрд╛рд▒реНрдпрд╛рдВрдирд╛ рддреНрдпрд╛рдВрдЪреНрдпрд╛ рддрд╛рддреНрдХрд╛рд│ рдкрд░реНрдпрд╡реЗрдХреНрд╖рдХрд╛рдкреЗрдХреНрд╖рд╛ рдЬрд╛рд╕реНрдд рдкрдЧрд╛рд░ рдорд┐рд│рддреЛ рддреНрдпрд╛рдВрдЪреА рдпрд╛рджреА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рд╛.

рд╕рдВрдмрдВрдзреАрдд

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));

рдХрд╛рд░реНрдп реи

рддреНрдпрд╛рдВрдЪреНрдпрд╛ рд╡рд┐рднрд╛рдЧрд╛рдд рдЬрд╛рд╕реНрддреАрдд рдЬрд╛рд╕реНрдд рдкрдЧрд╛рд░ рдШреЗрдгрд╛рд▒реНрдпрд╛ рдХрд░реНрдордЪрд╛рд▒реНрдпрд╛рдВрдЪреА рдпрд╛рджреА рдХрд░рд╛

рд╕рдВрдмрдВрдзреАрдд

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 рд╡рд╛рдкрд░реВ рд╢рдХрддрд╛, рдЬреЗ рддреНрдпрд╛рдЪ рдкреНрд░рдХрд╛рд░реЗ рдкреНрд░рдердо рддреНрдпрд╛рддреАрд▓ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд┐рднрд╛рдЧрд╛рд╕рд╛рдареА рдЬрд╛рд╕реНрддреАрдд рдЬрд╛рд╕реНрдд рдкрдЧрд╛рд░рд╛рдЪреА рдЧрдгрдирд╛ рдХрд░реЗрд▓. рдкреБрдвреАрд▓ рдЧреЛрд╖реНрдЯреАрдВрдордзреНрдпреЗ, рд╕реНрдкрд╖реНрдЯрддреЗрд╕рд╛рдареА, рдореА рдкреНрд░рдердо рдХреЗрд╕ рд╡рд╛рдкрд░реЗрди, рдХрд╛рд░рдг рддреЗ рд╕рдорд╛рдзрд╛рди рдЕрдзрд┐рдХ рдЪрд╛рдВрдЧрд▓реЗ рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рдХрд░рддреЗ.

рдХрд╛рд░реНрдп реи

рдбрд┐рдкрд╛рд░реНрдЯрдореЗрдВрдЯ рдЖрдпрдбреАрдЪреА рдпрд╛рджреА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рд╛, рдЬреНрдпрд╛рдордзреНрдпреЗ 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;

рдХрд╛рд░реНрдп реи

рддреНрдпрд╛рдЪ рд╡рд┐рднрд╛рдЧрд╛рдд рдХрд╛рдо рдХрд░рдгрд╛рд░реЗ рдирд┐рдпреБрдХреНрдд рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдирд╕рд▓реЗрд▓реНрдпрд╛ рдХрд░реНрдордЪрд╛рд▒реНрдпрд╛рдВрдЪреА рдпрд╛рджреА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рд╛.

рд╕рдВрдмрдВрдзреАрдд

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));

рдХрд╛рд░реНрдп реи

рдХрдорд╛рд▓ рдПрдХреВрдг рдХрд░реНрдордЪрд╛рд░реА рдкрдЧрд╛рд░рд╛рд╕рд╣ рд╡рд┐рднрд╛рдЧ рдЖрдпрдбреАрдВрдЪреА рдпрд╛рджреА рд╢реЛрдзрд╛.

рд╕рдВрдмрдВрдзреАрдд

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 рдордзреНрдпреЗ рд╣реЗ рдХрд╛рд░реНрдп рдХрд╕реЗ рдЕрдВрдорд▓рд╛рдд рдЖрдгрд╛рдпрдЪреЗ рдпрд╛рдЪреЗ рддрдкрд╢реАрд▓рд╡рд╛рд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рддреНрдпрд╛рдд рдЖрд╣реЗ.

рдХрд╛рд░реНрдп реи

рдХреЛрдгрддреНрдпрд╛ рд╡рд┐рдХреНрд░реЗрддреНрдпрд╛рдВрдиреА 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;

рдХрд╛рд░реНрдп реи

рдкреНрд░рддреНрдпреЗрдХ рдЦрд░реЗрджреАрджрд╛рд░рд╛рд╕рд╛рдареА (рдирд╛рд╡, рдЖрдбрдирд╛рд╡), рджреЛрди рд╡рд╕реНрддреВ (рдирд╛рд╡) рд╢реЛрдзрд╛ рдЬреНрдпрд╛рд╡рд░ рдЦрд░реЗрджреАрджрд╛рд░рд╛рдиреЗ 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) рдирдВрддрд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХреЗрд▓реЗрд▓реНрдпрд╛ рдЕрднрд┐рд╡реНрдпрдХреНрддреАрдЪреА рдмреЗрд░реАрдЬ рдХрд░рддреЛ, рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЧрдЯрд╛рдВрдордзреНрдпреЗ (рдпреЗрдереЗ рдЧреНрд░рд╛рд╣рдХ рдЖрдгрд┐ рд╡рд░реНрд╖, рдкрд░рдВрддреБ рдХреЛрдгрддреАрд╣реА рдЕрднрд┐рд╡реНрдпрдХреНрддреА рдЕрд╕реВ рд╢рдХрддреЗ), ORDER рдордзреНрдпреЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХреЗрд▓реЗрд▓реНрдпрд╛ рдЕрднрд┐рд╡реНрдпрдХреНрддреАрдиреБрд╕рд╛рд░ рдЧрдЯрд╛рдВрдордзреНрдпреЗ рдХреНрд░рдорд╡рд╛рд░реА рд▓рд╛рд╡рддреЗ ( рдпреЗрдереЗ рдЦрд░реЗрджреА рдХреЗрд▓реЗ, рдЖрдгрд┐ рд╕рдорд╛рди рдЕрд╕рд▓реНрдпрд╛рд╕, рдЕрдВрддрд░реНрдЧрдд рдЙрддреНрдкрд╛рджрди рдХреЛрдбрдиреБрд╕рд╛рд░).

рдХрд╛рд░реНрдп реи

рд╡рд░реНрддрдорд╛рди рдСрд░реНрдбрд░ рдкреВрд░реНрдг рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдкреБрд░рд╡рдард╛рджрд╛рд░рд╛рдВрдХрдбреВрди рдХрд┐рддреА рд╡рд╕реНрддреВ рдорд╛рдЧрд╡рд▓реНрдпрд╛ рдкрд╛рд╣рд┐рдЬреЗрдд.

рдЪрд▓рд╛ рдбреЛрдореЗрди рд▓реЙрдЬрд┐рдХ рдкреБрдиреНрд╣рд╛ рд╡рд┐рд╕реНрддреГрдд рдХрд░реВрдпрд╛:

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);

рд╡рд╛рдЪрдХрд╛рд▓рд╛ рдПрд╕рдХреНрдпреВрдПрд▓рдордзреНрдпреЗ рд╣реА рд╕рдорд╕реНрдпрд╛ рд╕реНрд╡рддрдГрдЪ рд╕реЛрдбрд╡рдгреНрдпрд╛рд╕рд╛рдареА рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХреЗрд▓реЗ рдЬрд╛рддреЗ. рдЕрд╕реЗ рдЧреГрд╣реАрдд рдзрд░рд▓реЗ рдЬрд╛рддреЗ рдХреА рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рдЖрд╡рдбрдд рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рд▓реЛрдХрд╛рдВрдкреЗрдХреНрд╖рд╛ рдЦреВрдк рдХрдореА рдорд┐рддреНрд░ рдЖрд╣реЗрдд. рдореНрд╣рдгреВрди рддреЗ рд╕реНрд╡рддрдВрддреНрд░ рдЯреЗрдмрд▓рдордзреНрдпреЗ рдЖрд╣реЗрдд. рдпрд╢рд╕реНрд╡реА рдЭрд╛рд▓реНрдпрд╛рд╕, рджреЛрди рддрд╛рд░реЗ рдЕрд╕рд▓реЗрд▓реЗ рдХрд╛рд░реНрдп рджреЗрдЦреАрд▓ рдЖрд╣реЗ. рддреНрдпрд╛рдд, рдореИрддреНрд░реА рд╕рдордорд┐рддреАрдп рдирд╛рд╣реА. рдлрдВрдХреНрд╢рдирд▓ рдбреЗрдЯрд╛рдмреЗрд╕рд╡рд░ рд╣реЗ рдЕрд╕реЗ рджрд┐рд╕реЗрд▓:

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_рдХрд╛рд▓рд┐рдХрд╛:

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 

рдирд┐рд╖реНрдХрд░реНрд╖

рд╣реЗ рд▓рдХреНрд╖рд╛рдд рдШреЗрддрд▓реЗ рдкрд╛рд╣рд┐рдЬреЗ рдХреА рджрд┐рд▓реЗрд▓реА рднрд╛рд╖рд╛ рд╡рд╛рдХреНрдпрд░рдЪрдирд╛ рд╣реА рджрд┐рд▓реЗрд▓реНрдпрд╛ рд╕рдВрдХрд▓реНрдкрдиреЗрдЪреНрдпрд╛ рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреАрд╕рд╛рдареА рдлрдХреНрдд рдПрдХ рдкрд░реНрдпрд╛рдп рдЖрд╣реЗ. рдПрд╕рдХреНрдпреВрдПрд▓рд▓рд╛ рдЖрдзрд╛рд░ рдореНрд╣рдгреВрди рдШреЗрддрд▓реЗ рдЧреЗрд▓реЗ рдЖрдгрд┐ рддреЗ рд╢рдХреНрдп рддрд┐рддрдХреЗ рд╕рдорд╛рди рдЕрд╕рдгреЗ рд╣реЗ рдзреНрдпреЗрдп рд╣реЛрддреЗ. рдЕрд░реНрдерд╛рдд, рдХрд╛рд╣реАрдВрдирд╛ рдХреАрд╡рд░реНрдб, рд╡рд░реНрдб рд░рдЬрд┐рд╕реНрдЯрд░ рдЗрддреНрдпрд╛рджреАрдВрдЪреА рдирд╛рд╡реЗ рдЖрд╡рдбрдгрд╛рд░ рдирд╛рд╣реАрдд. рдпреЗрдереЗ рдореБрдЦреНрдп рдЧреЛрд╖реНрдЯ рд╣реА рд╕рдВрдХрд▓реНрдкрдирд╛ рдЖрд╣реЗ. рдЗрдЪреНрдЫрд┐рдд рдЕрд╕рд▓реНрдпрд╛рд╕, рддреБрдореНрд╣реА C++ рдЖрдгрд┐ Python рджреЛрдиреНрд╣реА рд╕рдорд╛рди рд╡рд╛рдХреНрдпрд░рдЪрдирд╛ рдХрд░реВ рд╢рдХрддрд╛.

рд╡рд░реНрдгрди рдХреЗрд▓реЗрд▓реНрдпрд╛ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕рдВрдХрд▓реНрдкрдиреЗрдЪреЗ, рдорд╛рдЭреНрдпрд╛ рдорддреЗ, рдЦрд╛рд▓реАрд▓ рдлрд╛рдпрджреЗ рдЖрд╣реЗрдд:

  • рдХрдореА. рд╣реЗ рддреБрд▓рдиреЗрдиреЗ рд╡реНрдпрдХреНрддрд┐рдирд┐рд╖реНрда рд╕реВрдЪрдХ рдЖрд╣реЗ рдЬреЗ рд╕рд╛рдзреНрдпрд╛ рдкреНрд░рдХрд░рдгрд╛рдВрдордзреНрдпреЗ рд╕реНрдкрд╖реНрдЯ рдирд╛рд╣реА. рдкрд░рдВрддреБ рдЬрд░ рдЖрдкрдг рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдкреНрд░рдХрд░рдгреЗ (рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рддрд╛рд░рдХрд╛рдВрд╡рд░реАрд▓ рд╕рдорд╕реНрдпрд╛) рдкрд╛рд╣рд┐рд▓реНрдпрд╛рд╕, рдорд╛рдЭреНрдпрд╛ рдорддреЗ, рдЕрд╢рд╛ рдкреНрд░рд╢реНрди рд▓рд┐рд╣рд┐рдгреЗ рдЦреВрдк рд╕реЛрдкреЗ рдЖрд╣реЗ.
  • ╨Ш╨╜╨║╨░╨┐╤Б╤Г╨╗╤П╤Ж╨╕╤П. рдХрд╛рд╣реА рдЙрджрд╛рд╣рд░рдгрд╛рдВрдордзреНрдпреЗ рдореА рдордзреНрдпрд╡рд░реНрддреА рдХрд╛рд░реНрдпреЗ рдШреЛрд╖рд┐рдд рдХреЗрд▓реА (рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рд╡рд┐рдХрд▓реЗ, рд╡рд┐рдХрдд рдШреЗрддрд▓реЗ рдЗ.), рдЬреНрдпрд╛рддреВрди рддреНрдпрд╛рдирдВрддрд░рдЪреА рдХрд╛рд░реНрдпреЗ рддрдпрд╛рд░ рдХреЗрд▓реА рдЧреЗрд▓реА. рд╣реЗ рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рдХрд╛рд╣реА рдлрдВрдХреНрд╢рдиреНрд╕рдЪреЗ рддрд░реНрдХрд╢рд╛рд╕реНрддреНрд░ рдмрджрд▓рдгреНрдпрд╛рдЪреА рдкрд░рд╡рд╛рдирдЧреА рджреЗрддреЗ, рдЖрд╡рд╢реНрдпрдХ рдЕрд╕рд▓реНрдпрд╛рд╕, рддреНрдпрд╛рдВрдЪреНрдпрд╛рд╡рд░ рдЕрд╡рд▓рдВрдмреВрди рдЕрд╕рд▓реЗрд▓реНрдпрд╛рдВрдЪреЗ рддрд░реНрдХрд╢рд╛рд╕реНрддреНрд░ рди рдмрджрд▓рддрд╛. рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рдЖрдкрдг рд╡рд┐рдХреНрд░реА рдХрд░реВ рд╢рдХрддрд╛ рд╡рд┐рдХрд▓реЗ рдкреВрд░реНрдгрдкрдгреЗ рднрд┐рдиреНрди рд╡рд╕реНрддреВрдВрдордзреВрди рдЧрдгрдирд╛ рдХреЗрд▓реА рдЧреЗрд▓реА, рддрд░ рдЙрд░реНрд╡рд░рд┐рдд рддрд░реНрдХ рдмрджрд▓рдгрд╛рд░ рдирд╛рд╣реАрдд. рд╣реЛрдп, рд╣реЗ рдХреНрд░рд┐рдПрдЯ рд╡реНрд╣реНрдпреВ рд╡рд╛рдкрд░реВрди рдЖрд░рдбреАрдмреАрдПрдордПрд╕рдордзреНрдпреЗ рд▓рд╛рдЧреВ рдХреЗрд▓реЗ рдЬрд╛рдК рд╢рдХрддреЗ. рдкрдг рд╕рдЧрд│реЗ рд▓реЙрдЬрд┐рдХ рдЕрд╕реЗ рд▓рд┐рд╣рд┐рд▓реЗ рддрд░ рддреЗ рдлрд╛рд░рд╕реЗ рд╡рд╛рдЪрдиреАрдп рд╡рд╛рдЯрдгрд╛рд░ рдирд╛рд╣реА.
  • рд╕рд┐рдореЗрдВрдЯрд┐рдХ рдЧреЕрдк рдирд╛рд╣реА. рдЕрд╕рд╛ рдбреЗрдЯрд╛рдмреЗрд╕ рдлрдВрдХреНрд╢рдиреНрд╕ рдЖрдгрд┐ рдХреНрд▓рд╛рд╕реЗрд╕рд╡рд░ рдЪрд╛рд▓рддреЛ (рдЯреЗрдмрд▓ рдЖрдгрд┐ рдлреАрд▓реНрдб рдРрд╡рдЬреА). рд╢рд╛рд╕реНрддреНрд░реАрдп рдкреНрд░реЛрдЧреНрд░реЕрдорд┐рдВрдЧ рдкреНрд░рдорд╛рдгреЗрдЪ (рдЬрд░ рдЖрдкрдг рдЕрд╕реЗ рдЧреГрд╣реАрдд рдзрд░рд▓реЗ рдХреА рдкрджреНрдзрдд рд╣реЗ рдкреНрд░рдердо рдкреЕрд░рд╛рдореАрдЯрд░ рдЕрд╕рд▓реЗрд▓реЗ рдлрдВрдХреНрд╢рди рдЖрд╣реЗ рдЬреНрдпрд╛ рд╡рд░реНрдЧрд╛рд╢реА рд╕рдВрдмрдВрдзрд┐рдд рдЖрд╣реЗ). рддреНрдпрд╛рдиреБрд╕рд╛рд░, рд╕рд╛рд░реНрд╡рддреНрд░рд┐рдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдВрд╕рд╣ "рдорд┐рддреНрд░ рдмрдирд╡рдгреЗ" рдЦреВрдк рд╕реЛрдкреЗ рдЕрд╕рд╛рд╡реЗ. рдпрд╛рд╡реНрдпрддрд┐рд░рд┐рдХреНрдд, рд╣реА рд╕рдВрдХрд▓реНрдкрдирд╛ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдХрд╛рд░реНрдпрдХреНрд╖рдорддреЗрдЪреА рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреА рдХрд░рдгреНрдпрд╛рд╕ рдЕрдиреБрдорддреА рджреЗрддреЗ. рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рддреБрдореНрд╣реА рдСрдкрд░реЗрдЯрд░ рдПрдореНрдмреЗрдб рдХрд░реВ рд╢рдХрддрд╛ рдЬрд╕реЗ:

    CONSTRAINT sold(Employee e, 1, 2019) > 100 IF name(e) = '╨Я╨╡╤В╤П' MESSAGE  '╨з╤В╨╛-╤В╨╛ ╨Я╨╡╤В╤П ╨┐╤А╨╛╨┤╨░╨╡╤В ╤Б╨╗╨╕╤И╨║╨╛╨╝ ╨╝╨╜╨╛╨│╨╛ ╨╛╨┤╨╜╨╛╨│╨╛ ╤В╨╛╨▓╨░╤А╨░ ╨▓ 2019 ╨│╨╛╨┤╤Г';

  • рд╡рд╛рд░рд╕рд╛ рдЖрдгрд┐ рдмрд╣реБрд░реВрдкрддрд╛. рдлрдВрдХреНрд╢рдирд▓ рдбреЗрдЯрд╛рдмреЗрд╕рдордзреНрдпреЗ, рддреБрдореНрд╣реА рдХреНрд▓рд╛рд╕ рдХреНрд▓рд╛рд╕рдкреА: рдХреНрд▓рд╛рд╕ 1, рдХреНрд▓рд╛рд╕ 2 рдорд▓реНрдЯрд┐рдкрд▓ рдкреЙрд▓рд┐рдореЙрд░реНрдлрд┐рдЭрдо рдмрдирд╡рддреЗ рдЖрдгрд┐ рдЕрдВрдорд▓рд╛рдд рдЖрдгрддреЗ. рдореА рдХрджрд╛рдЪрд┐рдд рдкреБрдвреАрд▓ рд▓реЗрдЦрд╛рдВрдордзреНрдпреЗ рдирдХреНрдХреА рдХрд╕реЗ рд▓рд┐рд╣реАрди.

рдЬрд░реА рд╣реА рдлрдХреНрдд рдПрдХ рд╕рдВрдХрд▓реНрдкрдирд╛ рдЕрд╕рд▓реА рддрд░реАрд╣реА, рдЖрдордЪреНрдпрд╛рдХрдбреЗ Java рдордзреНрдпреЗ рдЖрдзреАрдкрд╛рд╕реВрдирдЪ рдХрд╛рд╣реА рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреА рдЖрд╣реЗ рдЬреА рд╕рд░реНрд╡ рдлрдВрдХреНрд╢рдирд▓ рд▓реЙрдЬрд┐рдХрд▓рд╛ рд░рд┐рд▓реЗрд╢рдирд▓ рд▓реЙрдЬрд┐рдХрдордзреНрдпреЗ рдЕрдиреБрд╡рд╛рджрд┐рдд рдХрд░рддреЗ. рд╢рд┐рд╡рд╛рдп, рдкреНрд░рд╕реНрддреБрддреАрдХрд░рдгрд╛рдЪреЗ рддрд░реНрдХрд╢рд╛рд╕реНрддреНрд░ рдЖрдгрд┐ рдЗрддрд░ рдмрд░реНтАНрдпрд╛рдЪ рдЧреЛрд╖реНрдЯреА рддреНрдпрд╛рдЪреНрдпрд╛рд╢реА рд╕реБрдВрджрд░рдкрдгреЗ рдЬреЛрдбрд▓реНрдпрд╛ рдЧреЗрд▓реНрдпрд╛ рдЖрд╣реЗрдд, рдЬреНрдпрд╛рдореБрд│реЗ рдЖрдореНрд╣рд╛рд▓рд╛ рд╕рдВрдкреВрд░реНрдг рдорд╛рд╣рд┐рддреА рдорд┐рд│рддреЗ. рд╡реНрдпрд╛рд╕рдкреАрда. рдореВрд▓рдд:, рдЖрдореНрд╣реА RDBMS (рдЖрддрд╛ рдлрдХреНрдд PostgreSQL) тАЬрд╡реНрд╣рд░реНрдЪреНрдпреБрдЕрд▓ рдорд╢реАрдитАЭ рдореНрд╣рдгреВрди рд╡рд╛рдкрд░рддреЛ. рдпрд╛ рднрд╛рд╖рд╛рдВрддрд░рд╛рдд рдХрд╛рд╣реАрд╡реЗрд│рд╛ рд╕рдорд╕реНрдпрд╛ рдЙрджреНрднрд╡рддрд╛рдд рдХрд╛рд░рдг RDBMS рдХреНрд╡реЗрд░реА рдСрдкреНрдЯрд┐рдорд╛рдпрдЭрд░рд▓рд╛ FDBMS рд▓рд╛ рдорд╛рд╣реАрдд рдЕрд╕рд▓реЗрд▓реА рдХрд╛рд╣реА рдЖрдХрдбреЗрд╡рд╛рд░реА рдорд╛рд╣реАрдд рдирд╕рддреЗ. рд╕рд┐рджреНрдзрд╛рдВрддрддрдГ, рдбреЗрдЯрд╛рдмреЗрд╕ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрди рдкреНрд░рдгрд╛рд▓реА рд▓рд╛рдЧреВ рдХрд░рдгреЗ рд╢рдХреНрдп рдЖрд╣реЗ рдЬреА рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдВрд░рдЪрдирд╛ рд╕реНрдЯреЛрд░реЗрдЬ рдореНрд╣рдгреВрди рд╡рд╛рдкрд░реЗрд▓, рд╡рд┐рд╢реЗрд╖рдд: рдХрд╛рд░реНрдпрд╛рддреНрдордХ рддрд░реНрдХрд╢рд╛рд╕реНрддреНрд░рд╛рд╕рд╛рдареА рдЕрдиреБрдХреВрд▓ рдХреЗрд▓реА рдЬрд╛рдИрд▓.

рд╕реНрддреНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╛