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

рдбрд╛рдЯрд╛рдмреЗрд╕рдХреЛ рд╕рдВрд╕рд╛рд░ рд▓рд╛рдореЛ рд╕рдордпрджреЗрдЦрд┐ рд╕рдореНрдмрдиреНрдзрд┐рдд DBMSs рджреНрд╡рд╛рд░рд╛ рд╣рд╛рд╡реА рднрдПрдХреЛ рдЫ, рдЬрд╕рд▓реЗ SQL рднрд╛рд╖рд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрджрдЫред рдпрддрд┐ рдзреЗрд░реИ рдЙрджреАрдпрдорд╛рди рднреЗрд░рд┐рдпрдиреНрдЯрд╣рд░реВрд▓рд╛рдИ NoSQL рднрдирд┐рдиреНрдЫред рддрд┐рдиреАрд╣рд░реВрд▓реЗ рдпрд╕ рдмрдЬрд╛рд░рдорд╛ рдЖрдлреНрдиреЛ рд▓рд╛рдЧрд┐ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдард╛рдЙрдБ рдмрдирд╛рдЙрди рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдЧрд░реЗ, рддрд░ рд╕рдореНрдмрдиреНрдзрдЧрдд DBMS рд╣рд░реВ рдорд░реНрдиреЗ рдЫреИрдирдиреН, рд░ рд╕рдХреНрд░рд┐рдп рд░реВрдкрдорд╛ рддрд┐рдиреАрд╣рд░реВрдХреЛ рдЙрджреНрджреЗрд╢реНрдпрдХрд╛ рд▓рд╛рдЧрд┐ рдкреНрд░рдпреЛрдЧ рдЧрд░рд┐рдиреНрдЫрдиреНред

рдпрд╕ рд▓реЗрдЦрдорд╛ рдо рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдбрд╛рдЯрд╛рдмреЗрд╕рдХреЛ рдЕрд╡рдзрд╛рд░рдгрд╛ рд╡рд░реНрдгрди рдЧрд░реНрди рдЪрд╛рд╣рдиреНрдЫреБред рд░рд╛рдореНрд░реЛ рдмреБрдЭреНрдирдХреЛ рд▓рд╛рдЧрд┐, рдо рдпрд╕рд▓рд╛рдИ рд╢рд╛рд╕реНрддреНрд░реАрдп рд░рд┐рд▓реЗрд╢рдирд▓ рдореЛрдбреЗрд▓рд╕рдБрдЧ рддреБрд▓рдирд╛ рдЧрд░реЗрд░ рдЧрд░реНрдиреЗрдЫреБред рдЗрдиреНрдЯрд░рдиреЗрдЯрдорд╛ рдкрд╛рдЗрдиреЗ рд╡рд┐рднрд┐рдиреНрди 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 рдорд╛ рдпреЛ рдХрд╛рд░реНрдп рдХрд╕рд░реА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЧрд░реНрдиреЗ рднрдиреНрдиреЗ рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рд╢реНрд▓реЗрд╖рдг рд╕рдорд╛рд╡реЗрд╢ рдЧрд░реНрджрдЫред

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

рдХреБрди рдмрд┐рдХреНрд░реЗрддрд╛рд▓реЗ рд╕рдиреН резрепрепрен рдорд╛ рдЙрддреНрдкрд╛рджрди рдирдореНрдмрд░ рез рдХреЛ рейреж рднрдиреНрджрд╛ рдмрдвреА рдпреБрдирд┐рдЯ рдмреЗрдЪреЗрдХрд╛ рдерд┐рдП?

рдбреЛрдореЗрди рддрд░реНрдХ (RDBMS рдорд╛ рдкрд╣рд┐рд▓реЗ рдЬрд╕реНрддреИ рд╣рд╛рдореА рдШреЛрд╖рдгрд╛ рдЫреЛрдбреНрдЫреМрдВ):

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

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

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++ рд░ рдкрд╛рдЗрдерди рд╕рдорд╛рди рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдмрдирд╛рдЙрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред

рд╡рд░реНрдгрди рдЧрд░рд┐рдПрдХреЛ рдбрд╛рдЯрд╛рдмреЗрд╕ рдЕрд╡рдзрд╛рд░рдгрд╛, рдореЗрд░реЛ рд╡рд┐рдЪрд╛рд░рдорд╛, рдирд┐рдореНрди рдлрд╛рдЗрджрд╛рд╣рд░реВ рдЫрдиреН:

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

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

  • рд╡рд┐рд░рд╛рд╕рдд рд░ рдмрд╣реБрд░реВрдкрддрд╛ред рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдбрд╛рдЯрд╛рдмреЗрд╕рдорд╛, рддрдкрд╛рдИрдВрд▓реЗ CLASS ClassP: Class1, Class2 рд▓реЗ рдмрд╣реБрд╡рд┐рдз рдмрд╣реБрд░реВрдкрддрд╛ рдирд┐рд░реНрдорд╛рдг рд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдорд╛рд░реНрдлрдд рдмрд╣реБ рд╡рд┐рд░рд╛рд╕рдд рдкрд░рд┐рдЪрдп рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред рдо рд╕рд╛рдпрдж рднрд╡рд┐рд╖реНрдпрдХрд╛ рд▓реЗрдЦрд╣рд░реВрдорд╛ рдХрд╕рд░реА рдареАрдХ рд▓реЗрдЦреНрдЫреБред

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

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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдердкреНрди