DBMS เบ—เบตเปˆเปƒเบŠเป‰เป„เบ”เป‰

เป‚เบฅเบเบ‚เบญเบ‡เบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™เป„เบ”เป‰เบ–เบทเบเบ„เบญเบšเบ‡เปเบฒเบกเบฒเบ”เบปเบ™เบ™เบฒเบ™เป‚เบ”เบ DBMSs เบ—เบตเปˆเบเปˆเบฝเบงเบ‚เป‰เบญเบ‡, เป€เบŠเบดเปˆเบ‡เปƒเบŠเป‰เบžเบฒเบชเบฒ SQL. เบซเบผเบฒเบเบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™ variants เบ—เบตเปˆเบžเบปเป‰เบ™เป€เบ”เบฑเปˆเบ™เบ‚เบทเป‰เบ™เบ–เบทเบเป€เบญเบตเป‰เบ™เบงเปˆเบฒ NoSQL. เบžเบงเบเป€เบ‚เบปเบฒเป€เบˆเบปเป‰เบฒเบชเบฒเบกเบฒเบ”เปเบเบฐเบชเบฐเบซเบผเบฑเบเบชเบฐเบ–เบฒเบ™เบ—เบตเปˆเบชเบฐเป€เบžเบฒเบฐเปƒเบ”เบซเบ™เบถเปˆเบ‡เบชเปเบฒเบฅเบฑเบšเบ•เบปเบ™เป€เบญเบ‡เปƒเบ™เบ•เบฐเบซเบผเบฒเบ”เบ™เบตเป‰, เปเบ•เปˆ DBMSs เบ—เบตเปˆเบเปˆเบฝเบงเบ‚เป‰เบญเบ‡เบˆเบฐเบšเปเปˆเบ•เบฒเบ, เปเบฅเบฐเบชเบทเบšเบ•เปเปˆเบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เบขเปˆเบฒเบ‡เบˆเบดเบ‡เบˆเบฑเบ‡เป€เบžเบทเปˆเบญเบˆเบธเบ”เบ›เบฐเบชเบปเบ‡เบ‚เบญเบ‡เป€เบ‚เบปเบฒเป€เบˆเบปเป‰เบฒ.

เปƒเบ™เบšเบปเบ”เบ„เบงเบฒเบกเบ™เบตเป‰เบ‚เป‰เบญเบเบ•เป‰เบญเบ‡เบเบฒเบ™เบญเบฐเบ—เบดเบšเบฒเบเปเบ™เบงเบ„เบงเบฒเบกเบ„เบดเบ”เบ‚เบญเบ‡เบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเป€เบ›เบฑเบ™เบ›เบฐเป‚เบซเบเบ”. เบชเปเบฒเบฅเบฑเบšเบ„เบงเบฒเบกเป€เบ‚เบปเป‰เบฒเปƒเบˆเบ—เบตเปˆเบ”เบตเบเบงเปˆเบฒ, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบˆเบฐเป€เบฎเบฑเบ”เบชเบดเปˆเบ‡เบ™เบตเป‰เป‚เบ”เบเบเบฒเบ™เบ›เบฝเบšเบ—เบฝเบšเบกเบฑเบ™เบเบฑเบšเบ•เบปเบงเปเบšเบšเบ„เบงเบฒเบกเบชเปเบฒเบžเบฑเบ™เบ„เบฅเบฒเบชเบชเบดเบ. เบšเบฑเบ™เบซเบฒเบˆเบฒเบเบเบฒเบ™เบ—เบปเบ”เบชเบญเบš SQL เบ•เปˆเบฒเบ‡เป†เบ—เบตเปˆเบžเบปเบšเป€เบซเบฑเบ™เบขเบนเปˆเปƒเบ™เบญเบดเบ™เป€เบ•เบตเป€เบ™เบฑเบ”เบˆเบฐเบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เป€เบ›เบฑเบ™เบ•เบปเบงเบขเปˆเบฒเบ‡.

เบเบฒเบ™เบ™เปเบฒเบชเบฐเป€เบซเบ™เบต

เบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเบเปˆเบฝเบงเบ‚เป‰เบญเบ‡เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบขเบนเปˆเปƒเบ™เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เปเบฅเบฐเบžเบฒเบเบชเบฐเบซเบ™เบฒเบก. เปƒเบ™เบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเป€เบ›เบฑเบ™เบ›เบฐเป‚เบซเบเบ”, เบซเป‰เบญเบ‡เบฎเบฝเบ™เปเบฅเบฐเบซเบ™เป‰เบฒเบ—เบตเปˆเบˆเบฐเบ–เบทเบเปƒเบŠเป‰เปเบ—เบ™, เบ•เบฒเบกเบฅเปเบฒเบ”เบฑเบš. เบŠเปˆเบญเบ‡เบ‚เปเป‰เบกเบนเบ™เปƒเบ™เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบ—เบตเปˆเบกเบตเบ›เบธเปˆเบก N เบˆเบฐเบ–เบทเบเบชเบฐเปเบ”เบ‡เป€เบ›เบฑเบ™เบซเบ™เป‰เบฒเบ—เบตเปˆเบ‚เบญเบ‡ N เบžเบฒเบฅเบฒเบกเบดเป€เบ•เบต. เปเบ—เบ™เบ—เบตเปˆเบˆเบฐเป€เบ›เบฑเบ™เบเบฒเบ™เบžเบปเบงเบžเบฑเบ™เบฅเบฐเบซเบงเปˆเบฒเบ‡เบ•เบฒเบ•เบฐเบฅเบฒเบ‡, เบŸเบฑเบ‡เบŠเบฑเบ™เบˆเบฐเบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เบ—เบตเปˆเบชเบปเปˆเบ‡เบ„เบทเบ™เบงเบฑเบ”เบ–เบธเบ‚เบญเบ‡เบŠเบฑเป‰เบ™เบ—เบตเปˆเป€เบŠเบทเปˆเบญเบกเบ•เปเปˆ. เบญเบปเบ‡เบ›เบฐเบเบญเบšเบŸเบฑเบ‡เบŠเบฑเบ™เบˆเบฐเบ–เบทเบเปƒเบŠเป‰เปเบ—เบ™ JOIN.

เบเปˆเบญเบ™เบ—เบตเปˆเบˆเบฐเป€เบ„เบทเปˆเบญเบ™เบเป‰เบฒเบเป‚เบ”เบเบเบปเบ‡เบเบฑเบšเบงเบฝเบเบ‡เบฒเบ™, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบˆเบฐเบญเบฐเบ—เบดเบšเบฒเบเบงเบฝเบเบ‡เบฒเบ™เบ‚เบญเบ‡เป€เบซเบ”เบœเบปเบ™เบ‚เบญเบ‡เป‚เบ”เป€เบกเบ™. เบชเปเบฒเบฅเบฑเบš DDL เบ‚เป‰เบญเบเบˆเบฐเปƒเบŠเป‰ syntax PostgreSQL. เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบ, เบกเบฑเบ™เบกเบต syntax เบ‚เบญเบ‡เบ•เบปเบ™เป€เบญเบ‡.

เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เปเบฅเบฐเบžเบฒเบเบชเบฐเบซเบ™เบฒเบก

เบงเบฑเบ”เบ–เบธ 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 เป€เบ›เบฑเบ™ input เปเบฅเบฐเบชเบปเปˆเบ‡เบ„เบทเบ™เป€เบ›เบฑเบ™เบ›เบฐเป€เบžเบ” primitive.

เบกเบฑเบ™เบชเบปเบกเบกเบธเบ”เบงเปˆเบฒเปƒเบ™ 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?

เป€เบซเบ”เบœเบปเบ™เบ‚เบญเบ‡เป‚เบ”เป€เบกเบ™ (เป€เบŠเบฑเปˆเบ™เบ”เบฝเบงเบเบฑเบšเปƒเบ™ 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;

เบงเบฝเบเบ‡เบฒเบ™ 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), เบžเบฒเบเปƒเบ™เบเบธเปˆเบกเบ—เบตเปˆเบฅเบฐเบšเบธ (เบ—เบตเปˆเบ™เบตเป‰เบฅเบนเบเบ„เป‰เบฒเปเบฅเบฐเบ›เบต, เปเบ•เปˆเบญเบฒเบ”เบˆเบฐเป€เบ›เบฑเบ™เบเบฒเบ™เบชเบฐเปเบ”เบ‡เบญเบญเบเปƒเบ”เบเปเปˆเบ•เบฒเบก), เบเบฒเบ™เบˆเบฑเบ”เบฎเบฝเบ‡เบžเบฒเบเปƒเบ™เบเบธเปˆเบกเป‚เบ”เบเบชเปเบฒเบ™เบงเบ™เบ—เบตเปˆเบฅเบฐเบšเบธเป„เบงเป‰เปƒเบ™เบ„เปเบฒเบชเบฑเปˆเบ‡ ( เบ—เบตเปˆเบ™เบตเป‰เบŠเบทเป‰, เปเบฅเบฐเบ–เป‰เบฒเป€เบ—เบปเปˆเบฒเบ—เบฝเบกเบเบฑเบ™, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบญเบตเบ‡เบ•เบฒเบกเบฅเบฐเบซเบฑเบ”เบœเบฐเบฅเบดเบ”เบ•เบฐเบžเบฑเบ™เบžเบฒเบเปƒเบ™).

เบงเบฝเบเบ‡เบฒเบ™ 2.3

เบ•เป‰เบญเบ‡เบชเบฑเปˆเบ‡เบชเบดเบ™เบ„เป‰เบฒเบˆเบฒเบเบœเบนเป‰เบชเบฐเปœเบญเบ‡เบˆเปเบฒเบ™เบงเบ™เป€เบ—เบปเปˆเบฒเปƒเบ”เป€เบžเบทเปˆเบญเบšเบฑเบ™เบฅเบธเบ„เปเบฒเบชเบฑเปˆเบ‡เปƒเบ™เบ›เบฐเบˆเบธเบšเบฑเบ™.

เปƒเบซเป‰เบžเบงเบเป€เบฎเบปเบฒเบ‚เบฐเบซเบเบฒเบเป€เบซเบ”เบœเบปเบ™เบ‚เบญเบ‡เป‚เบ”เป€เบกเบ™เบญเบตเบเป€เบ—เบทเปˆเบญเบซเบ™เบถเปˆเบ‡:

CLASS Supplier 'ะŸะพัั‚ะฐะฒั‰ะธะบ';
companyName = DATA STRING[100] (Supplier);

supplier = DATA Supplier (Product);

unitsInStock 'ะžัั‚ะฐั‚ะพะบ ะฝะฐ ัะบะปะฐะดะต' = DATA NUMERIC[10,3] (Product);
reorderLevel 'ะะพั€ะผะฐ ะฟั€ะพะดะฐะถะธ' = DATA NUMERIC[10,3] (Product);

เบ„เบงเบฒเบกเบชเบณเบžเบฑเบ™

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

เปœเป‰เบฒ เบ—เบตเปˆ

orderedNotShipped 'ะ—ะฐะบะฐะทะฐะฝะพ, ะฝะพ ะฝะต ะพั‚ะณั€ัƒะถะตะฝะพ' (Product p) = 
    GROUP SUM quantity(OrderDetail d) IF product(d) = p;
toOrder 'ะš ะทะฐะบะฐะทัƒ' (Product p) = orderedNotShipped(p) + reorderLevel(p) - unitsInStock(p);
SELECT companyName(supplier(Product p)), name(p), toOrder(p) WHERE toOrder(p) > 0;

เบกเบตเบšเบฑเบ™เบซเบฒเบเบฑเบšเป€เบ„เบทเปˆเบญเบ‡เปเบฒเบเบ”เบฒเบง

เปเบฅเบฐเบ•เบปเบงเบขเปˆเบฒเบ‡เบชเบธเบ”เบ—เป‰เบฒเบเปเบกเปˆเบ™เบกเบฒเบˆเบฒเบเบ‚เป‰เบญเบเบชเปˆเบงเบ™เบ•เบปเบง. เบกเบตเป€เบซเบ”เบœเบปเบ™เบ‚เบญเบ‡เป€เบ„เบทเบญเบ‚เปˆเบฒเบเบชเบฑเบ‡เบ„เบปเบก. เบ›เบฐเบŠเบฒเบŠเบปเบ™เบชเบฒเบกเบฒเบ”เป€เบ›เบฑเบ™เป€เบžเบทเปˆเบญเบ™เบเบฑเบšเบเบฑเบ™เปเบฅเบฐเบเบฑเบ™เปเบฅเบฐเบกเบฑเบเป€เบŠเบดเปˆเบ‡เบเบฑเบ™เปเบฅเบฐเบเบฑเบ™. เบˆเบฒเบเบ—เบฑเบ”เบชเบฐเบ™เบฐเบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเป€เบ›เบฑเบ™เบ›เบฐเป‚เบซเบเบ”, เบกเบฑเบ™เบˆเบฐเป€เบšเบดเปˆเบ‡เบ„เบทเบงเปˆเบฒเบ™เบตเป‰:

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

เบกเบฑเบ™เป€เบ›เบฑเบ™เบชเบดเปˆเบ‡เบˆเปเบฒเป€เบ›เบฑเบ™เป€เบžเบทเปˆเบญเบŠเบญเบเบซเบฒเบœเบนเป‰เบชเบฐเบซเบกเบฑเบเบ—เบตเปˆเป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰เบชเปเบฒเบฅเบฑเบšเบกเบดเบ”เบ•เบฐเบžเบฒเบš. เบขเปˆเบฒเบ‡เป€เบ›เบฑเบ™เบ—เบฒเบ‡เบเบฒเบ™, เบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบŠเบญเบเบซเบฒเบ„เบปเบ™เบ—เบฑเบ‡เบซเบกเบปเบ” A, B, C เป€เบŠเบฑเปˆเบ™เบงเปˆเบฒ A เปเบกเปˆเบ™เบซเบกเบนเปˆเป€เบžเบทเปˆเบญเบ™เบเบฑเบš B, เปเบฅเบฐ B เปเบกเปˆเบ™เบซเบกเบนเปˆเป€เบžเบทเปˆเบญเบ™เบเบฑเบš C, A เบกเบฑเบ C, เปเบ•เปˆ A เบšเปเปˆเปเบกเปˆเบ™เป€เบžเบทเปˆเบญเบ™เบเบฑเบš C.
เบˆเบฒเบเบ—เบฑเบ”เบชเบฐเบ™เบฐเบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเป€เบ›เบฑเบ™เบ›เบฐเป‚เบซเบเบ”, เบ„เปเบฒเบ–เบฒเบกเบˆเบฐเบกเบตเบฅเบฑเบเบชเบฐเบ™เบฐเบ™เบตเป‰:

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

เบœเบนเป‰เบญเปˆเบฒเบ™เป„เบ”เป‰เบ–เบทเบเบŠเบธเบเบเบนเป‰เปƒเบซเป‰เปเบเป‰เป„เบ‚เบšเบฑเบ™เบซเบฒเบ™เบตเป‰เปƒเบ™ SQL เบ”เป‰เบงเบเบ•เบปเบงเป€เบญเบ‡. เบกเบฑเบ™เบชเบปเบกเบกเบธเบ”เบงเปˆเบฒเบกเบตเบซเบกเบนเปˆเป€เบžเบทเปˆเบญเบ™เบซเบ™เป‰เบญเบเบเบงเปˆเบฒเบ„เบปเบ™เบ—เบตเปˆเบ—เปˆเบฒเบ™เบกเบฑเบ. เป€เบžเบฒเบฐเบชเบฐเบ™เบฑเป‰เบ™เบžเบงเบเป€เบ‚เบปเบฒเบขเบนเปˆเปƒเบ™เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เปเบเบเบ•เปˆเบฒเบ‡เบซเบฒเบ. เบ–เป‰เบฒเบ›เบฐเบชเบปเบšเบœเบปเบ™เบชเปเบฒเป€เบฅเบฑเบ”, เบเบฑเบ‡เบกเบตเบงเบฝเบเบ‡เบฒเบ™เบ—เบตเปˆเบกเบตเบชเบญเบ‡เบ”เบฒเบง. เปƒเบ™เบกเบฑเบ™, เบกเบดเบ”เบ•เบฐเบžเบฒเบšเบšเปเปˆเปเบกเปˆเบ™เบ„เบงเบฒเบกเบชเบปเบกเบกเบฒเบ”. เปƒเบ™เบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเป€เบ›เบฑเบ™เบ›เบฐเป‚เบซเบเบ”, เบกเบฑเบ™เบˆเบฐเบกเบตเบฅเบฑเบเบชเบฐเบ™เบฐเบ™เบตเป‰:

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

UPD: เบเบฒเบ™เปเบเป‰เป„เบ‚เบšเบฑเบ™เบซเบฒเบ—เบตเปˆเบกเบตเบ”เบฒเบงเบ—เปเบฒเบญเบดเบ”เปเบฅเบฐเบ—เบตเบชเบญเบ‡เบˆเบฒเบ dss_kalika:

SELECT 
   pl.PersonAID
  ,pf.PersonAID
  ,pff.PersonAID
FROM Persons                 AS p
--ะ›ะฐะนะบะธ                      
JOIN PersonRelationShip      AS pl ON pl.PersonAID = p.PersonID
                                  AND pl.Relation  = 'Like'
--ะ”ั€ัƒะทัŒั                     
JOIN PersonRelationShip      AS pf ON pf.PersonAID = p.PersonID 
                                  AND pf.Relation = 'Friend'
--ะ”ั€ัƒะทัŒั ะ”ั€ัƒะทะตะน              
JOIN PersonRelationShip      AS pff ON pff.PersonAID = pf.PersonBID
                                   AND pff.PersonBID = pl.PersonBID
                                   AND pff.Relation = 'Friend'
--ะ•ั‰ั‘ ะฝะต ะดั€ัƒะถะฐั‚         
LEFT JOIN PersonRelationShip AS pnf ON pnf.PersonAID = p.PersonID
                                   AND pnf.PersonBID = pff.PersonBID
                                   AND pnf.Relation = 'Friend'
WHERE pnf.PersonAID IS NULL 

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

  SELECT pl.PersonBID AS PersonAID
        ,pl.PersonAID AS PersonBID
        ,pl.Relation
  FROM #PersonRelationShip      AS pl 
)
SELECT 
   pl.PersonAID
  ,pf.PersonBID
  ,pff.PersonBID
FROM #Persons                      AS p
--ะ›ะฐะนะบะธ                      
JOIN PersonRelationShipCollapsed  AS pl ON pl.PersonAID = p.PersonID
                                 AND pl.Relation  = 'Like'                                  
--ะ”ั€ัƒะทัŒั                          
JOIN PersonRelationShipCollapsed  AS pf ON pf.PersonAID = p.PersonID 
                                 AND pf.Relation = 'Friend'
--ะ”ั€ัƒะทัŒั ะ”ั€ัƒะทะตะน                   
JOIN PersonRelationShipCollapsed  AS pff ON pff.PersonAID = pf.PersonBID
                                 AND pff.PersonBID = pl.PersonBID
                                 AND pff.Relation = 'Friend'
--ะ•ั‰ั‘ ะฝะต ะดั€ัƒะถะฐั‚                   
LEFT JOIN PersonRelationShipCollapsed AS pnf ON pnf.PersonAID = p.PersonID
                                   AND pnf.PersonBID = pff.PersonBID
                                   AND pnf.Relation = 'Friend'
WHERE pnf.[PersonAID] IS NULL 

เบชเบฐเบซเบฅเบธเบš

เบกเบฑเบ™เบ„เบงเบ™เบˆเบฐเบชเบฑเบ‡เป€เบเบ”เบงเปˆเบฒ syntax เบžเบฒเบชเบฒเบ—เบตเปˆเป€เบ›เบฑเบ™เบžเบฝเบ‡เปเบ•เปˆเบซเบ™เบถเปˆเบ‡เปƒเบ™เบ—เบฒเบ‡เป€เบฅเบทเบญเบเปƒเบ™เบเบฒเบ™เบˆเบฑเบ”เบ•เบฑเป‰เบ‡เบ›เบฐเบ•เบดเบšเบฑเบ”เปเบ™เบงเบ„เบงเบฒเบกเบ„เบดเบ”เบ—เบตเปˆเปƒเบซเป‰. SQL เป„เบ”เป‰เบ–เบทเบเบ›เบฐเบ•เบดเบšเบฑเบ”เป€เบ›เบฑเบ™เบžเบทเป‰เบ™เบ–เบฒเบ™, เปเบฅเบฐเป€เบ›เบปเป‰เบฒเบซเบกเบฒเบเปเบกเปˆเบ™เป€เบžเบทเปˆเบญเปƒเบซเป‰เบกเบฑเบ™เบ„เป‰เบฒเบเบ„เบทเบเบฑเบ™เป€เบ—เบปเปˆเบฒเบ—เบตเปˆเป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰. เปเบ™เปˆเบ™เบญเบ™, เบšเบฒเบ‡เบ„เบปเบ™เบญเบฒเบ”เบˆเบฐเบšเปเปˆเบกเบฑเบเบŠเบทเปˆเบ‚เบญเบ‡เบ„เปเบฒเบซเบฅเบฑเบ, เบšเบฑเบ™เบ—เบถเบเบ„เปเบฒ, เปเบฅเบฐเบญเบทเปˆเบ™เป†. เบชเบดเปˆเบ‡เบ—เบตเปˆเบชเปเบฒเบ„เบฑเบ™เบขเบนเปˆเบ—เบตเปˆเบ™เบตเป‰เปเบกเปˆเบ™เปเบ™เบงเบ„เบงเบฒเบกเบ„เบดเบ”เบ‚เบญเบ‡เบกเบฑเบ™เป€เบญเบ‡. เบ–เป‰เบฒเบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เบเบฒเบ™, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบชเป‰เบฒเบ‡ syntax เบ„เป‰เบฒเบเบ„เบทเบเบฑเบ™ C ++ เปเบฅเบฐ Python.

เปเบ™เบงเบ„เบงเบฒเบกเบ„เบดเบ”เบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเบญเบฐเบ—เบดเบšเบฒเบ, เปƒเบ™เบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™เบ‚เบญเบ‡เบ‚เป‰เบญเบ, เบกเบตเบ‚เปเป‰เบ”เบตเบ”เบฑเปˆเบ‡เบ•เปเปˆเป„เบ›เบ™เบตเป‰:

  • เบ„เบงเบฒเบกเบชเบฐเบ”เบงเบ. เบ™เบตเป‰เปเบกเปˆเบ™เบ•เบปเบงเบŠเบตเป‰เบงเบฑเบ”เบ—เบตเปˆเบ‚เป‰เบญเบ™เบ‚เป‰เบฒเบ‡เบ—เบตเปˆเบšเปเปˆเบŠเบฑเบ”เป€เบˆเบ™เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ‡เปˆเบฒเบเป†. เปเบ•เปˆเบ–เป‰เบฒเบ—เปˆเบฒเบ™เป€เบšเบดเปˆเบ‡เบเปเบฅเบฐเบ™เบตเบ—เบตเปˆเบชเบฑเบšเบชเบปเบ™เบซเบผเบฒเบ (เบ•เบปเบงเบขเปˆเบฒเบ‡, เบšเบฑเบ™เบซเบฒเบเบฑเบšเบ”เบฒเบง), เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™, เปƒเบ™เบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™เบ‚เบญเบ‡เบ‚เป‰เบญเบ, เบเบฒเบ™เบ‚เบฝเบ™เปเบšเบšเบชเบญเบšเบ–เบฒเบกเบ”เบฑเปˆเบ‡เบเปˆเบฒเบงเปเบกเปˆเบ™เบ‡เปˆเบฒเบเบ‚เบถเป‰เบ™เบซเบผเบฒเบ.
  • เบฅเบฒเบเบฐเบฅเบฐเบญเบฝเบ”. เปƒเบ™เบšเบฒเบ‡เบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เบ›เบฐเบเบฒเบ”เบซเบ™เป‰เบฒเบ—เบตเปˆเบฅเบฐเบ”เบฑเบšเบเบฒเบ‡ (เบ•เบปเบงเบขเปˆเบฒเบ‡: เบ‚เบฒเบเป„เบ”เป‰, เบŠเบทเป‰เป„เบ”เป‰ เปเบฅเบฐเบญเบทเปˆเบ™เป†), เบˆเบฒเบเบซเบ™เป‰เบฒเบ—เบตเปˆเบ•เปเปˆเบกเบฒเป„เบ”เป‰เบ–เบทเบเบชเป‰เบฒเบ‡เบ‚เบถเป‰เบ™. เบ™เบตเป‰เบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบ›เปˆเบฝเบ™เป€เบซเบ”เบœเบปเบ™เบ‚เบญเบ‡เบซเบ™เป‰เบฒเบ—เบตเปˆเบชเบฐเป€เบžเบฒเบฐเปƒเบ”เบซเบ™เบถเปˆเบ‡, เบ–เป‰เบฒเบˆเปเบฒเป€เบ›เบฑเบ™, เป‚เบ”เบเบšเปเปˆเบกเบตเบเบฒเบ™เบ›เปˆเบฝเบ™เป€เบซเบ”เบœเบปเบ™เบ‚เบญเบ‡เบชเบดเปˆเบ‡เบ—เบตเปˆเบ‚เบถเป‰เบ™เบเบฑเบšเบžเบงเบเบกเบฑเบ™. เบ•เบปเบงเบขเปˆเบฒเบ‡, เป€เบˆเบปเป‰เบฒเบชเบฒเบกเบฒเบ”เบ‚เบฒเบเป„เบ”เป‰ เบ‚เบฒเบเป„เบ”เป‰ เป„เบ”เป‰เบ–เบทเบเบ„เบดเบ”เป„เบฅเปˆเบˆเบฒเบเบงเบฑเบ”เบ–เบธเบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™เบซเบกเบปเบ”, เปƒเบ™เบ‚เบฐเบ™เบฐเบ—เบตเปˆเบชเปˆเบงเบ™เบ—เบตเปˆเป€เบซเบผเบทเบญเบ‚เบญเบ‡เป€เบซเบ”เบœเบปเบ™เบˆเบฐเบšเปเปˆเบ›เปˆเบฝเบ™เปเบ›เบ‡. เปเบกเปˆเบ™เปเบฅเป‰เบง, เบ™เบตเป‰เบชเบฒเบกเบฒเบ”เบ–เบทเบเบ›เบฐเบ•เบดเบšเบฑเบ”เปƒเบ™ RDBMS เป‚เบ”เบเปƒเบŠเป‰ CREATE VIEW. เปเบ•เปˆเบ–เป‰เบฒเป€เบซเบ”เบœเบปเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”เบ–เบทเบเบ‚เบฝเบ™เบ”เป‰เบงเบเบงเบดเบ—เบตเบ™เบตเป‰, เบกเบฑเบ™เบˆเบฐเป€เบšเบดเปˆเบ‡เบšเปเปˆเป„เบ”เป‰เบญเปˆเบฒเบ™เบซเบผเบฒเบ.
  • เบšเปเปˆเบกเบตเบŠเปˆเบญเบ‡เบซเบงเปˆเบฒเบ‡ semantic. เบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™เบ”เบฑเปˆเบ‡เบเปˆเบฒเบงเบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบเปˆเบฝเบงเบเบฑเบšเบซเบ™เป‰เบฒเบ—เบตเปˆเปเบฅเบฐเบŠเบฑเป‰เบ™เบฎเบฝเบ™ (เปเบ—เบ™เบ—เบตเปˆเบˆเบฐเป€เบ›เบฑเบ™เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เปเบฅเบฐเบžเบฒเบเบชเบฐเบซเบ™เบฒเบก). เบ„เบทเบเบฑเบ™เบเบฑเบšเบเบฒเบ™เบ‚เบฝเบ™เป‚เบ›เบฅเปเบเบฅเบกเบ„เบฅเบฒเบชเบชเบดเบ (เบ–เป‰เบฒเบžเบงเบเป€เบฎเบปเบฒเบชเบปเบกเบกเบธเบ”เบงเปˆเบฒเบงเบดเบ—เบตเบเบฒเบ™เปเบกเปˆเบ™เบซเบ™เป‰เบฒเบ—เบตเปˆเบ—เบตเปˆเบกเบตเบžเบฒเบฅเบฒเบกเบดเป€เบ•เบตเบ—เปเบฒเบญเบดเบ”เปƒเบ™เบฎเบนเบšเปเบšเบšเบ‚เบญเบ‡เบซเป‰เบญเบ‡เบฎเบฝเบ™เบ—เบตเปˆเบกเบฑเบ™เบ‚เบถเป‰เบ™เบเบฑเบš). เบ•เบฒเบกเบ™เบฑเป‰เบ™เปเบฅเป‰เบง, เบกเบฑเบ™เบ„เบงเบ™เบˆเบฐเบ‡เปˆเบฒเบเบ‚เบถเป‰เบ™เบซเบผเบฒเบเบ—เบตเปˆเบˆเบฐ โ€œเบชเป‰เบฒเบ‡เป€เบžเบทเปˆเบญเบ™โ€ เบ”เป‰เบงเบเบžเบฒเบชเบฒเบเบฒเบ™เบ‚เบฝเบ™เป‚เบ›เบฃเปเบเบฃเบกเบ—เบปเปˆเบงเป„เบ›. เบ™เบญเบเบˆเบฒเบเบ™เบฑเป‰เบ™, เปเบ™เบงเบ„เบงเบฒเบกเบ„เบดเบ”เบ™เบตเป‰เบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เบ›เบฐเบ•เบดเบšเบฑเบ”เบซเบ™เป‰เบฒเบ—เบตเปˆเบชเบฐเบฅเบฑเบšเบชเบฑเบšเบŠเป‰เบญเบ™เบซเบผเบฒเบ. เบ•เบปเบงเบขเปˆเบฒเบ‡, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบเบฑเบ‡เบ•เบปเบงเบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เป€เบŠเบฑเปˆเบ™:

    CONSTRAINT sold(Employee e, 1, 2019) > 100 IF name(e) = 'ะŸะตั‚ั' MESSAGE  'ะงั‚ะพ-ั‚ะพ ะŸะตั‚ั ะฟั€ะพะดะฐะตั‚ ัะปะธัˆะบะพะผ ะผะฝะพะณะพ ะพะดะฝะพะณะพ ั‚ะพะฒะฐั€ะฐ ะฒ 2019 ะณะพะดัƒ';

  • เบกเปเบฅเบฐเบ”เบปเบเปเบฅเบฐ polymorphism. เปƒเบ™เบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเป€เบ›เบฑเบ™เบ›เบฐเป‚เบซเบเบ”, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เปเบ™เบฐเบ™เปเบฒเบเบฒเบ™เบชเบทเบšเบ—เบญเบ”เบซเบผเบฒเบเป‚เบ”เบเบœเปˆเบฒเบ™ CLASS ClassP: Class1, Class2 เบเบฒเบ™เบเปเปˆเบชเป‰เบฒเบ‡เปเบฅเบฐเบ›เบฐเบ•เบดเบšเบฑเบ”เบซเบผเบฒเบ polymorphism. เบ‚เป‰เบญเบเบญเบฒเบ”เบˆเบฐเบ‚เบฝเบ™เปเบ™เบงเปƒเบ”เปเบ—เป‰เปƒเบ™เบšเบปเบ”เบ„เบงเบฒเบกเปƒเบ™เบญเบฐเบ™เบฒเบ„เบปเบ”.

เป€เบ–เบดเบ‡เปเบกเปˆเบ™เบงเปˆเบฒเบ™เบตเป‰เปเบกเปˆเบ™เบžเบฝเบ‡เปเบ•เปˆเปเบ™เบงเบ„เบงเบฒเบกเบ„เบดเบ”, เบžเบงเบเป€เบฎเบปเบฒเบกเบตเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบšเบฒเบ‡เบขเปˆเบฒเบ‡เปƒเบ™ Java เบ—เบตเปˆเปเบ›เป€เบซเบ”เบœเบปเบ™เบ—เบตเปˆเป€เบ›เบฑเบ™เบ›เบฐเป‚เบซเบเบ”เบ—เบฑเบ‡เบซเบกเบปเบ”เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เป€เบซเบ”เบœเบปเบ™เบ—เบตเปˆเบเปˆเบฝเบงเบ‚เป‰เบญเบ‡. เบ™เบญเบเบˆเบฒเบเบ™เบฑเป‰เบ™, เป€เบซเบ”เบœเบปเบ™เบ‚เบญเบ‡เบเบฒเบ™เป€เบ›เบฑเบ™เบ•เบปเบงเปเบ—เบ™เปเบฅเบฐเบชเบดเปˆเบ‡เบญเบทเปˆเบ™เป†เบซเบผเบฒเบเปเบกเปˆเบ™เบ•เบดเบ”เบเบฑเบšเบกเบฑเบ™เบ—เบตเปˆเบชเบงเบเบ‡เบฒเบก, เบ‚เบญเบšเปƒเบˆเบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบฎเบฑเบšเบ—เบฑเบ‡เบซเบกเบปเบ”. เป€เบงเบ—เบต. เป‚เบ”เบเบžเบทเป‰เบ™เบ–เบฒเบ™เปเบฅเป‰เบง, เบžเบงเบเป€เบฎเบปเบฒเปƒเบŠเป‰ RDBMS (เบžเบฝเบ‡เปเบ•เปˆ PostgreSQL เบชเปเบฒเบฅเบฑเบšเปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™) เป€เบ›เบฑเบ™ "เป€เบ„เบทเปˆเบญเบ‡ virtual". เบšเบฒเบ‡เบ„เบฑเป‰เบ‡เบšเบฑเบ™เบซเบฒเป€เบเบตเบ”เบ‚เบทเป‰เบ™เบเบฑเบšเบเบฒเบ™เปเบ›เบ™เบตเป‰เป€เบžเบฒเบฐเบงเปˆเบฒเบ•เบปเบงเป€เบžเบตเปˆเบกเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบšเปเบšเบšเบชเบญเบšเบ–เบฒเบก RDBMS เบšเปเปˆเบฎเบนเป‰เบชเบฐเบ–เบดเบ•เบดเบ—เบตเปˆเปเบ™เปˆเบ™เบญเบ™เบ—เบตเปˆ FDBMS เบฎเบนเป‰. เปƒเบ™เบ—เบฒเบ‡เบ—เบดเบ”เบชเบฐเบ”เบต, เบกเบฑเบ™เป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰เบ—เบตเปˆเบˆเบฐเบ›เบฐเบ•เบดเบšเบฑเบ”เบฅเบฐเบšเบปเบšเบเบฒเบ™เบ„เบธเป‰เบกเบ„เบญเบ‡เบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเบˆเบฐเบ™เปเบฒเปƒเบŠเป‰เป‚เบ„เบ‡เบชเป‰เบฒเบ‡เบชเบฐเป€เบžเบฒเบฐเปƒเบ”เบซเบ™เบถเปˆเบ‡เป€เบ›เบฑเบ™เบเบฒเบ™เป€เบเบฑเบšเบฎเบฑเบเบชเบฒ, เบ”เบฑเบ”เปเบ›เบ‡เป‚เบ”เบเบชเบฐเป€เบžเบฒเบฐเบชเปเบฒเบฅเบฑเบšเป€เบซเบ”เบœเบปเบ™เบ—เบตเปˆเป€เบ›เบฑเบ™เบ›เบฐเป‚เบซเบเบ”.

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: www.habr.com

เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™