เช•เชพเชฐเซเชฏเชพเชคเซเชฎเช• 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);

เช•เชพเชฐเซเชฏเซ‹

เชšเชพเชฒเซ‹ เช…เชจเซเชฐเซ‚เชชเชฎเชพเช‚เชฅเซ€ เชฒเซ‡เชตเชพเชฎเชพเช‚ เช†เชตเซ‡เชฒเซ€ เชชเซเชฐเชฎเชพเชฃเชฎเชพเช‚ เชธเชฐเชณ เชธเชฎเชธเซเชฏเชพเช“เชฅเซ€ เชชเซเชฐเชพเชฐเช‚เชญ เช•เชฐเซ€เช เชฒเซ‡เช– 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);

เช•เชพเชฐเซเชฏ 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

เชฎเชนเชคเซเชคเชฎ เช•เซเชฒ เช•เชฐเซเชฎเชšเชพเชฐเซ€ เชชเช—เชพเชฐ เชธเชพเชฅเซ‡ เชตเชฟเชญเชพเช— 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) เชชเช›เซ€ เช‰เชฒเซเชฒเซ‡เช–เชฟเชค เช…เชญเชฟเชตเซเชฏเช•เซเชคเชฟเชจเซ‹ เชธเชฐเชตเชพเชณเซ‹ เช•เชฐเซ‡ เช›เซ‡, เช‰เชฒเซเชฒเซ‡เช–เชฟเชค เชœเซ‚เชฅเซ‹เชฎเชพเช‚ (เช…เชนเซ€เช‚ เช—เซเชฐเชพเชนเช• เช…เชจเซ‡ เชตเชฐเซเชท, เชชเชฐเช‚เชคเซ เช•เซ‹เชˆเชชเชฃ เช…เชญเชฟเชตเซเชฏเช•เซเชคเชฟ เชนเซ‹เชˆ เชถเช•เซ‡ เช›เซ‡), ORDER เชฎเชพเช‚ เช‰เชฒเซเชฒเซ‡เช–เชฟเชค เช…เชญเชฟเชตเซเชฏเช•เซเชคเชฟเช“ เชฆเซเชตเชพเชฐเชพ เชœเซ‚เชฅเซ‹เชจเซ€ เช…เช‚เชฆเชฐ เชตเชฐเซเช—เซ€เช•เชฐเชฃ เช•เชฐเซ‡ เช›เซ‡ ( เช…เชนเซ€เช‚ เช–เชฐเซ€เชฆเซเชฏเซเช‚, เช…เชจเซ‡ เชœเซ‹ เชธเชฎเชพเชจ เชนเซ‹เชฏ, เชคเซ‹ เชชเช›เซ€ เช†เช‚เชคเชฐเชฟเช• เช‰เชคเซเชชเชพเชฆเชจ เช•เซ‹เชก เช…เชจเซเชธเชพเชฐ).

เช•เชพเชฐเซเชฏ 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_เช•เชพเชฒเชฟเช•เชพ:

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 เชฌเช‚เชจเซ‡ เชธเชฎเชพเชจ เชธเชฟเชจเซเชŸเซ‡เช•เซเชธ เชฌเชจเชพเชตเซ€ เชถเช•เซ‹ เช›เซ‹.

เชตเชฐเซเชฃเชตเซ‡เชฒ เชกเซ‡เชŸเชพเชฌเซ‡เช เช–เซเชฏเชพเชฒ, เชฎเชพเชฐเชพ เชฎเชคเซ‡, เชจเซ€เชšเซ‡เชจเชพ เชซเชพเชฏเชฆเชพเช“ เชงเชฐเชพเชตเซ‡ เช›เซ‡:

  • เชธเชฐเชณ. เช† เชชเซเชฐเชฎเชพเชฃเชฎเชพเช‚ เชตเซเชฏเช•เซเชคเชฟเชฒเช•เซเชทเซ€ เชธเซ‚เชšเช• เช›เซ‡ เชœเซ‡ เชธเชฐเชณ เช•เซ‡เชธเซ‹เชฎเชพเช‚ เชธเซเชชเชทเซเชŸ เชจเชฅเซ€. เชชเชฐเช‚เชคเซ เชœเซ‹ เชคเชฎเซ‡ เชตเชงเซ เชœเชŸเชฟเชฒ เช•เซ‡เชธเซ‹ เชœเซเช“ (เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, เชซเซ‚เชฆเชกเซ€ เชธเชพเชฅเซ‡เชจเซ€ เชธเชฎเชธเซเชฏเชพเช“), เชคเซ‹ เชชเช›เซ€, เชฎเชพเชฐเชพ เชฎเชคเซ‡, เช†เชตเชพ เชชเซเชฐเชถเซเชจเซ‹ เชฒเช–เชตเชพ เช–เซ‚เชฌ เชธเชฐเชณ เช›เซ‡.
  • เช‡เชจเซเช•เชชเซเชธเซเชฒเซเชฒเซ‡เชถเชจ. เช•เซ‡เชŸเชฒเชพเช• เช‰เชฆเชพเชนเชฐเชฃเซ‹เชฎเชพเช‚ เชฎเซ‡เช‚ เชฎเชงเซเชฏเชตเชฐเซเชคเซ€ เช•เชพเชฐเซเชฏเซ‹ เชœเชพเชนเซ‡เชฐ เช•เชฐเซเชฏเชพ (เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, เชตเซ‡เชšเซ€, เช–เชฐเซ€เชฆเซ€ เชตเช—เซ‡เชฐเซ‡), เชœเซ‡เชฎเชพเช‚เชฅเซ€ เช…เชจเซเช—เชพเชฎเซ€ เช•เชพเชฐเซเชฏเซ‹ เชฌเชจเชพเชตเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเชพ เชนเชคเชพ. เช† เชคเชฎเชจเซ‡ เชšเซ‹เช•เซเช•เชธ เช•เชพเชฐเซเชฏเซ‹เชจเชพ เชคเชฐเซเช•เชจเซ‡ เชฌเชฆเชฒเชตเชพเชจเซ€ เชฎเช‚เชœเซ‚เชฐเซ€ เช†เชชเซ‡ เช›เซ‡, เชœเซ‹ เชœเชฐเซ‚เชฐเซ€ เชนเซ‹เชฏ เชคเซ‹, เชคเซ‡เชฎเชจเชพ เชชเชฐ เชจเชฟเชฐเซเชญเชฐ เชฒเซ‹เช•เซ‹เชจเชพ เชคเชฐเซเช•เชจเซ‡ เชฌเชฆเชฒเซเชฏเชพ เชตเชฟเชจเชพ. เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, เชคเชฎเซ‡ เชตเซ‡เชšเชพเชฃ เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹ เชตเซ‡เชšเซ€ เชธเช‚เชชเซ‚เชฐเซเชฃเชชเชฃเซ‡ เช…เชฒเช— เชตเชธเซเชคเซเช“เชฎเชพเช‚เชฅเซ€ เช—เชฃเชคเชฐเซ€ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ€ เชนเชคเซ€, เชœเซเชฏเชพเชฐเซ‡ เชฌเชพเช•เซ€เชจเชพ เชคเชฐเซเช• เชฌเชฆเชฒเชพเชถเซ‡ เชจเชนเซ€เช‚. เชนเชพ, เช† 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

เชเช• เชŸเชฟเชชเซเชชเชฃเซ€ เช‰เชฎเซ‡เชฐเซ‹