рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдбреАрдмреАрдПрдордПрд╕

рдбреЗрдЯрд╛рдмреЗрд╕ рдХреА рджреБрдирд┐рдпрд╛ рдореЗрдВ рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рд░рд┐рд▓реЗрд╢рдирд▓ DBMS рдХрд╛ рд╡рд░реНрдЪрд╕реНрд╡ рд░рд╣рд╛ рд╣реИ, рдЬреЛ 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 рдХреЛ рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдПрдХ рдЖрджрд┐рдо рдкреНрд░рдХрд╛рд░ рд▓реМрдЯрд╛рддрд╛ рд╣реИред

рдпрд╣ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдХрд╛рд░реНрдпрд╛рддреНрдордХ 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);

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

рдЖрдЗрдП рд╕рдВрдмрдВрдзрд┐рдд рд╕реЗ рд▓реА рдЧрдИ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рд╕рд░рд▓ рд╕рдорд╕реНрдпрд╛рдУрдВ рд╕реЗ рд╢реБрд░реБрдЖрдд рдХрд░реЗрдВ рд▓реЗрдЦ рд╣реИрдмрд░ рдкрд░ред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЖрдЗрдП рдбреЛрдореЗрди рд▓реЙрдЬрд┐рдХ рдШреЛрд╖рд┐рдд рдХрд░реЗрдВ (рд░рд┐рд▓реЗрд╢рдирд▓ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд▓рд┐рдП рдпрд╣ рд╕реАрдзреЗ рдЙрдкрд░реЛрдХреНрдд рдЖрд▓реЗрдЦ рдореЗрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ)ред

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

рд╡рд┐рднрд╛рдЧ рдЖрдИрдбреА рдХреА рдПрдХ рд╕реВрдЪреА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдВ, рдЬрд┐рд╕рдореЗрдВ рдХрд░реНрдордЪрд╛рд░рд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ 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

рдЕрдзрд┐рдХрддрдо рдХреБрд▓ рдХрд░реНрдордЪрд╛рд░реА рд╡реЗрддрди рд╡рд╛рд▓реЗ рд╡рд┐рднрд╛рдЧ рдЖрдИрдбреА рдХреА рд╕реВрдЪреА рдвреВрдВрдвреЗрдВред

рд░рд┐рд▓реЗрд╢рдирд▓

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;

рдкрд╛рд░реНрдЯрд┐рд╢рди рдСрдкрд░реЗрдЯрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рд┐рджреНрдзрд╛рдВрдд рдкрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ: рдпрд╣ SUM (рдпрд╣рд╛рдВ 1) рдХреЗ рдмрд╛рдж рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╕рдореВрд╣реЛрдВ (рдпрд╣рд╛рдВ рдЧреНрд░рд╛рд╣рдХ рдФрд░ рд╡рд░реНрд╖, рд▓реЗрдХрд┐рди рдХреЛрдИ рднреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ) рдХреЗ рднреАрддрд░ рдЬреЛрдбрд╝рддрд╛ рд╣реИ, рд╕рдореВрд╣реЛрдВ рдХреЗ рднреАрддрд░ рдСрд░реНрдбрд░ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдХреНрд░рдордмрджреНрдз рдХрд░рддрд╛ рд╣реИ ( рдпрд╣рд╛рдВ рдЦрд░реАрджрд╛ рдЧрдпрд╛, рдФрд░ рдпрджрд┐ рдмрд░рд╛рдмрд░ рд╣реИ, рддреЛ рдЖрдВрддрд░рд┐рдХ рдЙрддреНрдкрд╛рдж рдХреЛрдб рдХреЗ рдЕрдиреБрд╕рд╛рд░)ред

рдХрд╛рд░реНрдп 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));

рдпреВрдкреАрдбреА: рдкрд╣рд▓реЗ рдФрд░ рджреВрд╕рд░реЗ рддрд╛рд░рд╛рдВрдХрди рд╕реЗ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди 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 рджреЛрдиреЛрдВ рдХреЛ рд╕рдорд╛рди рд╕рд┐рдВрдЯреИрдХреНрд╕ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред

рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рд╡рд░реНрдгрд┐рдд рдбреЗрдЯрд╛рдмреЗрд╕ рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдлрд╛рдпрджреЗ рд╣реИрдВ:

  • рдЖрд░рд╛рдо. рдпрд╣ рдПрдХ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рд╡реНрдпрдХреНрддрд┐рдкрд░рдХ рд╕рдВрдХреЗрддрдХ рд╣реИ рдЬреЛ рд╕рд╛рдзрд╛рд░рдг рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдк рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдорд╛рдорд▓реЛрдВ рдХреЛ рджреЗрдЦреЗрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рддрд╛рд░рд╛рдВрдХрди рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛рдПрдВ), рддреЛ, рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдРрд╕реЗ рдкреНрд░рд╢реНрди рд▓рд┐рдЦрдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИред
  • рдХреИрдкреНрд╕реВрд▓реАрдХрд░рдг. рдХреБрдЫ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рдореИрдВрдиреЗ рдордзреНрдпрд╡рд░реНрддреА рдлрд╝рдВрдХреНрд╢рдВрд╕ рдШреЛрд╖рд┐рдд рдХрд┐рдП (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдмреЗрдЪрд╛, рдЦрд░реАрджрд╛ рдЖрджрд┐), рдЬрд┐рд╕рд╕реЗ рдмрд╛рдж рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд┐рдпрд╛ рдЧрдпрд╛ред рдпрд╣ рдЖрдкрдХреЛ рдХреБрдЫ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рддрд░реНрдХ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рдЙрди рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рддрд░реНрдХ рдХреЛ рдмрджрд▓реЗ рдмрд┐рдирд╛ рдЬреЛ рдЙрди рдкрд░ рдирд┐рд░реНрднрд░ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк рдмрд┐рдХреНрд░реА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдмреЗрдЪрд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╡рд╕реНрддреБрдУрдВ рд╕реЗ рдЧрдгрдирд╛ рдХреА рдЧрдИ, рдЬрдмрдХрд┐ рдмрд╛рдХреА рддрд░реНрдХ рдирд╣реАрдВ рдмрджрд▓реЗрдВрдЧреЗред рд╣рд╛рдБ, рдЗрд╕реЗ CREATE VIEW рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ RDBMS рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рд╕рд╛рд░рд╛ рддрд░реНрдХ рдЗрд╕реА рддрд░рд╣ рд▓рд┐рдЦрд╛ рдЬрд╛рдП рддреЛ рд╡рд╣ рдмрд╣реБрдд рдкрдардиреАрдп рдирд╣реАрдВ рд▓рдЧреЗрдЧрд╛.
  • рдХреЛрдИ рдЕрд░реНрде рд╕рдВрдмрдВрдзреА рдЕрдВрддрд░рд╛рд▓ рдирд╣реАрдВ. рдРрд╕рд╛ рдбреЗрдЯрд╛рдмреЗрд╕ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдФрд░ рдХреНрд▓рд╛рд╕реЗрд╕ (рдЯреЗрдмрд▓ рдФрд░ рдлрд╝реАрд▓реНрдб рдХреЗ рдмрдЬрд╛рдп) рдкрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдмрд┐рд▓реНрдХреБрд▓ рд╢рд╛рд╕реНрддреНрд░реАрдп рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреА рддрд░рд╣ (рдпрджрд┐ рд╣рдо рдорд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдПрдХ рд╡рд┐рдзрд┐ рдЙрд╕ рд╡рд░реНрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╣рд▓реЗ рдкреИрд░рд╛рдореАрдЯрд░ рд╡рд╛рд▓рд╛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬрд┐рд╕рд╕реЗ рд╡рд╣ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ)ред рддрджрдиреБрд╕рд╛рд░, рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд╕рд╛рде "рджреЛрд╕реНрдд рдмрдирд╛рдирд╛" рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд, рдпрд╣ рдЕрд╡рдзрд╛рд░рдгрд╛ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдПрдореНрдмреЗрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

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

  • рд╡рдВрд╢рд╛рдиреБрдХреНрд░рдо рдФрд░ рдмрд╣реБрд░реВрдкрддрд╛. рдПрдХ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ, рдЖрдк рдХреНрд▓рд╛рд╕ рдХреНрд▓рд╛рд╕рдкреА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХрд╛рдзрд┐рдХ рд╡рд┐рд░рд╛рд╕рдд рдкреЗрд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: рдХреНрд▓рд╛рд╕ 1, рдХреНрд▓рд╛рд╕ 2 рдирд┐рд░реНрдорд╛рдг рдФрд░ рдПрдХрд╛рдзрд┐рдХ рдмрд╣реБрд░реВрдкрддрд╛ рдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдореИрдВ рд╕рдВрднрд╡рддрдГ рднрд╡рд┐рд╖реНрдп рдХреЗ рд▓реЗрдЦреЛрдВ рдореЗрдВ рд╕рдЯреАрдХ рддрд░реАрдХреЗ рд╕реЗ рд▓рд┐рдЦреВрдВрдЧрд╛ред

рднрд▓реЗ рд╣реА рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рдЕрд╡рдзрд╛рд░рдгрд╛ рд╣реИ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЬрд╛рд╡рд╛ рдореЗрдВ рдХреБрдЫ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ рдЬреЛ рд╕рднреА рдХрд╛рд░реНрдпрд╛рддреНрдордХ рддрд░реНрдХ рдХреЛ рд╕рдВрдмрдВрдзрдкрд░рдХ рддрд░реНрдХ рдореЗрдВ рдЕрдиреБрд╡рд╛рджрд┐рдд рдХрд░рддрд╛ рд╣реИред рд╕рд╛рде рд╣реА, рдЕрднреНрдпрд╛рд╡реЗрджрди рдХреЗ рддрд░реНрдХ рдФрд░ рдмрд╣реБрдд рд╕реА рдЕрдиреНрдп рдЪреАрдЬреЗрдВ рдЗрд╕рдХреЗ рд╕рд╛рде рдЦреВрдмрд╕реВрд░рддреА рд╕реЗ рдЬреБрдбрд╝реА рд╣реБрдИ рд╣реИрдВ, рдЬрд┐рд╕рдХреА рдмрджреМрд▓рдд рд╣рдореЗрдВ рдПрдХ рд╕рдордЧреНрд░рддрд╛ рдорд┐рд▓рддреА рд╣реИ рдордВрдЪ. рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ, рд╣рдо "рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди" рдХреЗ рд░реВрдк рдореЗрдВ RDBMS (рдЕрднреА рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ PostgreSQL) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕ рдЕрдиреБрд╡рд╛рдж рдХреЗ рд╕рд╛рде рдХрднреА-рдХрднреА рд╕рдорд╕реНрдпрд╛рдПрдБ рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ RDBMS рдХреНрд╡реЗрд░реА рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝рд░ рдХреБрдЫ рдирд┐рд╢реНрдЪрд┐рдд рдЖрдБрдХрдбрд╝реЗ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рд╣реИ рдЬреЛ FDBMS рдЬрд╛рдирддрд╛ рд╣реИред рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдПрдХ рдбреЗрдЯрд╛рдмреЗрд╕ рдкреНрд░рдмрдВрдзрди рдкреНрд░рдгрд╛рд▓реА рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ рдЬреЛ рднрдВрдбрд╛рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛, рдЬреЛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рддрд░реНрдХ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рд┐рдд рд╣реИред

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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╝реЗрдВ