ืคืึทื ื’ืงืฉืึทื ืึทืœ DBMS

ื“ื™ ื•ื•ืขืœื˜ ืคื•ืŸ ื“ืึทื˜ืึทื‘ื™ื™ืกื™ื– ืื™ื– ืœืึทื ื’ ื“ืึทืžืึทื ื™ื™ื˜ืึทื“ ื“ื•ืจืš ืจื™ืœื™ื™ืฉืึทื ืึทืœ ื“ื‘ืžืก, ื•ื•ืึธืก ื ื•ืฆืŸ ื“ื™ SQL ืฉืคึผืจืึทืš. ืึทื–ื•ื™ ืคื™ืœ ืึทื– ื™ืžืขืจื“ื–ืฉื™ื ื’ ื•ื•ืขืจื™ืึทื ืฅ ื–ืขื ืขืŸ ื’ืขืจื•ืคึฟืŸ NoSQL. ื–ื™ื™ ื’ืขืจืื˜ืŸ ืฆื• ืฉื ื™ื™ึทื“ืŸ ืื•ื™ืก ืึท ื–ื™ื›ืขืจ ืึธืจื˜ ืคึฟืึทืจ ื–ื™ืš ืื™ืŸ ื“ืขื ืžืึทืจืง, ืึธื‘ืขืจ ืจื™ืœื™ื™ืฉืึทื ืึทืœ DBMSs ื–ืขื ืขืŸ ื ื™ืฉื˜ ื’ืขื’ืื ื’ืขืŸ ืฆื• ืฉื˜ืึทืจื‘ืŸ, ืื•ืŸ ืคืึธืจื–ืขืฆืŸ ืฆื• ื–ื™ื™ืŸ ืึทืงื˜ื™ื•ื•ืœื™ ื’ืขื ื™ืฆื˜ ืคึฟืึทืจ ื–ื™ื™ืขืจ ืฆื•ื•ืขืงืŸ.

ืื™ืŸ ื“ืขื ืึทืจื˜ื™ืงืœ ืื™ืš ื•ื•ื™ืœืŸ ืฆื• ื‘ืึทืฉืจื™ื™ึทื‘ืŸ ื“ืขื ื‘ืึทื’ืจื™ืฃ ืคื•ืŸ ืึท ืคืึทื ื’ืงืฉืึทื ืึทืœ ื“ืึทื˜ืึทื‘ื™ื™ืก. ืคึฟืึทืจ ืึท ื‘ืขืกืขืจืข ืคืืจืฉื˜ืื ื“, ืื™ืš ื•ื•ืขืœ ื˜ืึธืŸ ื“ืึธืก ื“ื•ืจืš ืงืึทืžืคึผืขืจื™ื ื’ ืขืก ืžื™ื˜ ื“ื™ ืงืœืึทืกื™ืฉ ืจื™ืœื™ื™ืฉืึทื ืึทืœ ืžืึธื“ืขืœ. ืคึผืจืึธื‘ืœืขืžืก ืคื•ืŸ ืคืึทืจืฉื™ื“ืŸ SQL ื˜ืขืกืฅ ื’ืขืคึฟื•ื ืขืŸ ืื•ื™ืฃ ื“ืขืจ ืื™ื ื˜ืขืจื ืขืฅ ื•ื•ืขื˜ ื–ื™ื™ืŸ ื’ืขื•ื•ื™ื™ื ื˜ ื•ื•ื™ ื‘ื™ื™ืฉืคื™ืœืŸ.

ื”ืงื“ืžื”

ืจื™ืœื™ื™ืฉืึทื ืึทืœ ื“ืึทื˜ืึทื‘ื™ื™ืกื™ื– ืึทืจื‘ืขื˜ืŸ ืื•ื™ืฃ ื˜ื™ืฉืŸ ืื•ืŸ ืคืขืœื“ืขืจ. ืื™ืŸ ืึท ืคืึทื ื’ืงืฉืึทื ืึทืœ ื“ืึทื˜ืึทื‘ื™ื™ืก, ืงืœืืกืŸ ืื•ืŸ ืคืึทื ื’ืงืฉืึทื ื– ื•ื•ืขื˜ ื–ื™ื™ืŸ ื’ืขื•ื•ื™ื™ื ื˜ ืึทื ืฉื˜ืึธื˜, ืจื™ืกืคึผืขืงื˜ื™ื•ื•ืœื™. ื ืคืขืœื“ ืื™ืŸ ืึท ื˜ื™ืฉ ืžื™ื˜ N ืฉืœื™ืกืœืขืŸ ื•ื•ืขื˜ ื–ื™ื™ืŸ ืจืขืคึผืจื™ื–ืขื ื˜ื™ื“ ื•ื•ื™ ืึท ืคึฟื•ื ืงืฆื™ืข ืคื•ืŸ โ€‹โ€‹N ืคึผืึทืจืึทืžืขื˜ืขืจืก. ืื ืฉื˜ืื˜ ื‘ืืฆื™ืื•ื ื’ืขืŸ ืฆื•ื•ื™ืฉืŸ ื˜ื™ืฉืŸ, ื•ื•ืขื˜ ืžืขืŸ ื ื•ืฆืŸ ืคืึทื ื’ืงืฉืึทื ื– ื•ื•ืึธืก ืฆื•ืจื™ืงืงื•ืžืขืŸ ืึทื‘ื“ื–ืฉืขืงืฅ ืคื•ืŸ ื“ื™ ืงืœืึทืก ืฆื• ื•ื•ืึธืก ื“ื™ ืงืฉืจ ืื™ื– ื’ืขืžืื›ื˜. ืคื•ื ืงืฆื™ืข ื–ืึทืฅ ื•ื•ืขื˜ ื–ื™ื™ืŸ ื’ืขื•ื•ื™ื™ื ื˜ ืึทื ืฉื˜ืึธื˜ ืคื•ืŸ JOIN.

ืื™ื™ื“ืขืจ ืื™ืš ืžืึทืš ื’ืœื™ื™ืš ืฆื• ื“ื™ ื˜ืึทืกืงืก, ืื™ืš ื•ื•ืขืœ ื‘ืึทืฉืจื™ื™ึทื‘ืŸ ื“ื™ ืึทืจื‘ืขื˜ ืคื•ืŸ ืคืขืœื“ ืœืึธื’ื™ืง. ืคึฟืึทืจ DDL ืื™ืš ื•ื•ืขื˜ ื ื•ืฆืŸ PostgreSQL ืกื™ื ื˜ืึทืงืก. ืคึฟืึทืจ ืคืึทื ื’ืงืฉืึทื ืึทืœ ืขืก ื”ืื˜ ื–ื™ื™ึทืŸ ืื™ื™ื’ืŸ ืกื™ื ื˜ืึทืงืก.

ื˜ื™ืฉืŸ ืื•ืŸ ืคืขืœื“ืขืจ

ื ืคึผืฉื•ื˜ ืกืงื• ื›ื™ื™ืคืขืฅ ืžื™ื˜ ื ืึธืžืขืŸ ืื•ืŸ ืคึผืจื™ื™ึทื– ืคืขืœื“ืขืจ:

ืจื™ืœื™ื™ืฉืึทื ืึทืœ

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

ืžื™ืจ ืžืขืœื“ืŸ ืฆื•ื•ื™ื™ function, ื•ื•ืึธืก ื ืขืžืขืŸ ืื™ื™ืŸ ืคึผืึทืจืึทืžืขื˜ืขืจ ืกืงื• ื•ื•ื™ ืึทืจื™ื™ึทื ืฉืจื™ื™ึทื‘ ืื•ืŸ ืฆื•ืจื™ืงืงื•ืžืขืŸ ืึท ืคึผืจื™ืžื™ื˜ื™ื•ื• ื˜ื™ืคึผ.

ืขืก ืื™ื– ืื ื’ืขื ื•ืžืขืŸ ืึทื– ืื™ืŸ ืึท ืคืึทื ื’ืงืฉืึทื ืึทืœ 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?

ืคืขืœื“ ืœืึธื’ื™ืง (ื•ื•ื™ ืคืจื™ืขืจ ืื•ื™ืฃ 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);

ืขืก ืื™ื– ื ื™ื™ื˜ื™ืง ืฆื• ื’ืขืคึฟื™ื ืขืŸ ืžืขื’ืœืขืš ืงืึทื ื“ืึทื“ื™ื™ืฅ ืคึฟืึทืจ ืคึฟืจื™ื™ึทื ื“ืฉืึทืคึฟื˜. ืžืขืจ ืคืึธืจืžืึทืœื™, ืื™ืจ ื“ืึทืจืคึฟืŸ ืฆื• ื’ืขืคึฟื™ื ืขืŸ ืึทืœืข ืžืขื ื˜ืฉืŸ ื, ื‘, C ืึทื–ื•ื™ ืึทื– ื ืื™ื– ืคืจื™ื™ื ื˜ ืžื™ื˜ ื‘, ืื•ืŸ ื‘ ืื™ื– ืคืจื™ื™ื ื˜ ืžื™ื˜ C, ื ืœื™ื™ืงืก 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 

ืกืึธืฃ

ืขืก ื–ืึธืœ ื–ื™ื™ืŸ ืื ื’ืขื•ื•ื™ื–ืŸ ืึทื– ื“ืขืจ ื’ืขื’ืขื‘ืŸ ืฉืคึผืจืึทืš ืกื™ื ื˜ืึทืงืก ืื™ื– ื‘ืœื•ื™ื– ืื™ื™ื ืขืจ ืคื•ืŸ ื“ื™ ืึธืคึผืฆื™ืขืก ืคึฟืึทืจ ื™ืžืคึผืœืึทืžืขื ื™ื ื’ ื“ื™ ื’ืขื’ืขื‘ืŸ ื‘ืึทื’ืจื™ืฃ. ืกืงืœ ืื™ื– ื’ืขื ื•ืžืขืŸ ื•ื•ื™ ื“ื™ ื™ืงืขืจ, ืื•ืŸ ื“ืขืจ ืฆื™ืœ ืื™ื– ื’ืขื•ื•ืขืŸ ืึทื– ืขืก ื–ืึธืœ ื–ื™ื™ืŸ ื•ื•ื™ ืขื ืœืขืš ื•ื•ื™ ืžืขื’ืœืขืš ืฆื• ืื™ื. ืคื•ืŸ ืงื•ืจืก, ืขื˜ืœืขื›ืข ืงืขืŸ ื ื™ืฉื˜ ื•ื•ื™ ื“ื™ ื ืขืžืขืŸ ืคื•ืŸ ื˜ืขืจืžื™ื ืขืŸ, ื•ื•ืึธืจื˜ ืจืขื“ื–ืฉื™ืกื˜ืขืจื–, ืขื˜ืง. ื“ื™ ื”ื•ื™ืคึผื˜ ื–ืึทืš ื“ืึธ ืื™ื– ื“ืขืจ ื‘ืึทื’ืจื™ืฃ ื–ื™ืš. ืื•ื™ื‘ ืื™ืจ ื•ื•ื™ืœื˜, ืื™ืจ ืงืขื ืขืŸ ืžืึทื›ืŸ ื‘ื™ื™ื“ืข 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

ืœื™ื™ื’ืŸ ืึท ื‘ืึทืžืขืจืงื•ื ื’