DBMS ืคื•ื ืงืฆื™ื•ื ืœื™

ืขื•ืœื ืžืกื“ื™ ื”ื ืชื•ื ื™ื ื ืฉืœื˜ ื–ื” ืžื›ื‘ืจ ืขืœ ื™ื“ื™ DBMSs ื™ื—ืกื™, ื”ืžืฉืชืžืฉื™ื ื‘ืฉืคืช SQL. ืขื“ ื›ื“ื™ ื›ืš ืฉื’ืจืกืื•ืช ืžืชืคืชื—ื•ืช ื ืงืจืื•ืช NoSQL. ื”ื ื”ืฆืœื™ื—ื• ืœืžืฆื•ื ืœืขืฆืžื ืžืงื•ื ืžืกื•ื™ื ื‘ืฉื•ืง ื”ื–ื”, ืื‘ืœ DBMSs ื™ื—ืกื™ ืœื ื”ื•ืœื›ื™ื ืœืžื•ืช, ื•ืžืžืฉื™ื›ื™ื ืœืฉืžืฉ ื‘ืื•ืคืŸ ืคืขื™ืœ ืœืžื˜ืจื•ืชื™ื”ื.

ื‘ืžืืžืจ ื–ื” ืื ื™ ืจื•ืฆื” ืœืชืืจ ืืช ื”ืจืขื™ื•ืŸ ืฉืœ ืžืกื“ ื ืชื•ื ื™ื ืคื•ื ืงืฆื™ื•ื ืœื™. ืœื”ื‘ื ื” ื˜ื•ื‘ื” ื™ื•ืชืจ, ืืขืฉื” ื–ืืช ืขืœ ื™ื“ื™ ื”ืฉื•ื•ืืชื• ืœืžื•ื“ืœ ื”ื”ืชื™ื™ื—ืกื•ืชื™ ื”ืงืœืืกื™. ื‘ืขื™ื•ืช ืžื‘ื“ื™ืงื•ืช SQL ืฉื•ื ื•ืช ืฉื ืžืฆืื• ื‘ืื™ื ื˜ืจื ื˜ ื™ืฉืžืฉื• ื›ื“ื•ื’ืžืื•ืช.

ืžื‘ื•ื

ืžืกื“ื™ ื ืชื•ื ื™ื ื™ื—ืกื™ื™ื ืคื•ืขืœื™ื ืขืœ ื˜ื‘ืœืื•ืช ื•ืฉื“ื•ืช. ื‘ืžืกื“ ื ืชื•ื ื™ื ืคื•ื ืงืฆื™ื•ื ืœื™, ื™ืฉืžืฉื• ืžื—ืœืงื•ืช ื•ืคื•ื ืงืฆื™ื•ืช ื‘ืžืงื•ื, ื‘ื”ืชืืžื”. ืฉื“ื” ื‘ื˜ื‘ืœื” ืขื N ืžืคืชื—ื•ืช ื™ื•ืฆื’ ื›ืคื•ื ืงืฆื™ื” ืฉืœ N ืคืจืžื˜ืจื™ื. ื‘ืžืงื•ื ื™ื—ืกื™ื ื‘ื™ืŸ ื˜ื‘ืœืื•ืช, ื™ืฉืžืฉื• ืคื•ื ืงืฆื™ื•ืช ืฉืžื—ื–ื™ืจื•ืช ืื•ื‘ื™ื™ืงื˜ื™ื ืฉืœ ื”ืžื—ืœืงื” ืืœื™ื” ื ื•ืฆืจ ื”ื—ื™ื‘ื•ืจ. ื”ืจื›ื‘ ื”ืคื•ื ืงืฆื™ื” ื™ืฉืžืฉ ื‘ืžืงื•ื JOIN.

ืœืคื ื™ ืžืขื‘ืจ ื™ืฉื™ืจื•ืช ืœืžืฉื™ืžื•ืช, ืืชืืจ ืืช ืžืฉื™ืžืช ื”ืœื•ื’ื™ืงื” ืฉืœ ื”ืชื—ื•ื. ืขื‘ื•ืจ DDL ืืฉืชืžืฉ ื‘ืชื—ื‘ื™ืจ PostgreSQL. ืœืคื•ื ืงืฆื™ื•ื ืœื™ ื™ืฉ ืœื• ืชื—ื‘ื™ืจ ืžืฉืœื•.

ื˜ื‘ืœืื•ืช ื•ืฉื“ื•ืช

ืื•ื‘ื™ื™ืงื˜ Sku ืคืฉื•ื˜ ืขื ืฉื“ื•ืช ืฉื ื•ืžื—ื™ืจ:

ื™ื—ืกื™

CREATE TABLE Sku
(
    id bigint NOT NULL,
    name character varying(100),
    price numeric(10,5),
    CONSTRAINT id_pkey PRIMARY KEY (id)
)

ืคื•ึผื ืงืฆึดื™ื•ึนื ึธืœึดื™

CLASS Sku;
name = DATA STRING[100] (Sku);
price = DATA NUMERIC[10,5] (Sku);

ืื ื—ื ื• ืžื›ืจื™ื–ื™ื ืขืœ ืฉื ื™ื™ื ืคื•ื ืงืฆื™ื•ืช, ืฉืœื•ืงื—ื™ื ืคืจืžื˜ืจ ืื—ื“ Sku ื›ืงืœื˜ ื•ืžื—ื–ื™ืจื™ื ืกื•ื’ ืคืจื™ืžื™ื˜ื™ื‘ื™.

ื”ื”ื ื—ื” ื”ื™ื ืฉื‘-DBMS ืคื•ื ืงืฆื™ื•ื ืœื™ ืœื›ืœ ืื•ื‘ื™ื™ืงื˜ ื™ื”ื™ื” ืงื•ื“ ืคื ื™ืžื™ ื›ืœืฉื”ื• ืฉื ื•ืฆืจ ืื•ื˜ื•ืžื˜ื™ืช ื•ื ื™ืชืŸ ืœื’ืฉืช ืืœื™ื• ื‘ืžื™ื“ืช ื”ืฆื•ืจืš.

ื‘ื•ืื• ื ืงื‘ืข ืืช ื”ืžื—ื™ืจ ืœืžื•ืฆืจ/ื—ื ื•ืช/ืกืคืง. ื–ื” ืขืฉื•ื™ ืœื”ืฉืชื ื•ืช ืขื ื”ื–ืžืŸ, ืื– ื‘ื•ืื• ื ื•ืกื™ืฃ ืฉื“ื” ื–ืžืŸ ืœื˜ื‘ืœื”. ืื ื™ ืื“ืœื’ ืขืœ ื”ืฆื”ืจืช ื˜ื‘ืœืื•ืช ืขื‘ื•ืจ ืกืคืจื™ื•ืช ื‘ืžืกื“ ื ืชื•ื ื™ื ื™ื—ืกื™ ื›ื“ื™ ืœืงืฆืจ ืืช ื”ืงื•ื“:

ื™ื—ืกื™

CREATE TABLE prices
(
    skuId bigint NOT NULL,
    storeId bigint NOT NULL,
    supplierId bigint NOT NULL,
    dateTime timestamp without time zone,
    price numeric(10,5),
    CONSTRAINT prices_pkey PRIMARY KEY (skuId, storeId, supplierId)
)

ืคื•ึผื ืงืฆึดื™ื•ึนื ึธืœึดื™

CLASS Sku;
CLASS Store;
CLASS Supplier;
dateTime = DATA DATETIME (Sku, Store, Supplier);
price = DATA NUMERIC[10,5] (Sku, Store, Supplier);

ืžื“ื“ื™ื

ืขื‘ื•ืจ ื”ื“ื•ื’ืžื” ื”ืื—ืจื•ื ื”, ื ื‘ื ื” ืื™ื ื“ืงืก ืขืœ ื›ืœ ื”ืžืคืชื—ื•ืช ื•ื”ืชืืจื™ืš ื›ื“ื™ ืฉื ื•ื›ืœ ืœืžืฆื•ื ื‘ืžื”ื™ืจื•ืช ืืช ื”ืžื—ื™ืจ ืœื–ืžืŸ ืžืกื•ื™ื.

ื™ื—ืกื™

CREATE INDEX prices_date
    ON prices
    (skuId, storeId, supplierId, dateTime)

ืคื•ึผื ืงืฆึดื™ื•ึนื ึธืœึดื™

INDEX Sku sk, Store st, Supplier sp, dateTime(sk, st, sp);

ืžืฉื™ืžื•ืช

ื ืชื—ื™ืœ ื‘ื‘ืขื™ื•ืช ืคืฉื•ื˜ื•ืช ื™ื—ืกื™ืช ืฉื ืœืงื—ื• ืžื”ืžืชืื™ื ืžืืžืจื™ื ืขืœ ื”ื‘ืจ.

ืจืืฉื™ืช, ื‘ื•ืื• ื ื›ืจื™ื– ืขืœ ืœื•ื’ื™ืงื” ืฉืœ ื”ืชื—ื•ื (ืขื‘ื•ืจ ืžืกื“ ื”ื ืชื•ื ื™ื ื”ื™ื—ืกื™ ื–ื” ื ืขืฉื” ื™ืฉื™ืจื•ืช ื‘ืžืืžืจ ืฉืœืžืขืœื”).

CLASS Department;
name = DATA STRING[100] (Department);

CLASS Employee;
department = DATA Department (Employee);
chief = DATA Employee (Employee);
name = DATA STRING[100] (Employee);
salary = DATA NUMERIC[14,2] (Employee);

ืžืฉื™ืžื” 1.1

ื”ืฆื’ ืจืฉื™ืžื” ืฉืœ ืขื•ื‘ื“ื™ื ืฉืžืงื‘ืœื™ื ืฉื›ืจ ื’ื‘ื•ื” ืžื–ื” ืฉืœ ื”ืžืžื•ื ื” ื”ื™ืฉื™ืจ ืฉืœื”ื.

ื™ื—ืกื™

select a.*
from   employee a, employee b
where  b.id = a.chief_id
and    a.salary > b.salary

ืคื•ึผื ืงืฆึดื™ื•ึนื ึธืœึดื™

SELECT name(Employee a) WHERE salary(a) > salary(chief(a));

ืžืฉื™ืžื” 1.2

ืจืฉื•ื ืืช ื”ืขื•ื‘ื“ื™ื ืฉืžืงื‘ืœื™ื ืืช ื”ืฉื›ืจ ื”ืžืงืกื™ืžืœื™ ื‘ืžื—ืœืงื” ืฉืœื”ื

ื™ื—ืกื™

select a.*
from   employee a
where  a.salary = ( select max(salary) from employee b
                    where  b.department_id = a.department_id )

ืคื•ึผื ืงืฆึดื™ื•ึนื ึธืœึดื™

maxSalary 'ะœะฐะบัะธะผะฐะปัŒะฝะฐั ะทะฐั€ะฟะปะฐั‚ะฐ' (Department s) = 
    GROUP MAX salary(Employee e) IF department(e) = s;
SELECT name(Employee a) WHERE salary(a) = maxSalary(department(a));

// ะธะปะธ ะตัะปะธ "ะทะฐะธะฝะปะฐะนะฝะธั‚ัŒ"
SELECT name(Employee a) WHERE 
    salary(a) = maxSalary(GROUP MAX salary(Employee e) IF department(e) = department(a));

ืฉื ื™ ื”ืžื™ืžื•ืฉื™ื ืฉื•ื•ื™ื. ื‘ืžืงืจื” ื”ืจืืฉื•ืŸ, ื‘ืžืกื“ ื ืชื•ื ื™ื ืจืœืฆื™ื•ื ื™ ื ื™ืชืŸ ืœื”ืฉืชืžืฉ ื‘-CREATE VIEW, ืฉื‘ืื•ืชื• ืื•ืคืŸ ื™ื—ืฉื‘ ืชื—ื™ืœื” ืืช ื”ืฉื›ืจ ื”ืžืงืกื™ืžืœื™ ืœืžื—ืœืงื” ืกืคืฆื™ืคื™ืช ื‘ื•. ื‘ื”ืžืฉืš, ืœืฉื ื”ื‘ื”ื™ืจื•ืช, ืืฉืชืžืฉ ื‘ืžืงืจื” ื”ืจืืฉื•ืŸ, ืฉื›ืŸ ื”ื•ื ืžืฉืงืฃ ื˜ื•ื‘ ื™ื•ืชืจ ืืช ื”ืคืชืจื•ืŸ.

ืžืฉื™ืžื” 1.3

ื”ืฆื’ ืจืฉื™ืžื” ืฉืœ ืžื–ื”ื™ ืžื—ืœืงื•ืช, ืฉืžืกืคืจ ื”ืขื•ื‘ื“ื™ื ื‘ื” ืื™ื ื• ืขื•ืœื” ืขืœ 3 ืื ืฉื™ื.

ื™ื—ืกื™

select department_id
from   employee
group  by department_id
having count(*) <= 3

ืคื•ึผื ืงืฆึดื™ื•ึนื ึธืœึดื™

countEmployees 'ะšะพะปะธั‡ะตัั‚ะฒะพ ัะพั‚ั€ัƒะดะฝะธะบะพะฒ' (Department d) = 
    GROUP SUM 1 IF department(Employee e) = d;
SELECT Department d WHERE countEmployees(d) <= 3;

ืžืฉื™ืžื” 1.4

ื”ืฆื’ ืจืฉื™ืžื” ืฉืœ ืขื•ื‘ื“ื™ื ืฉืื™ืŸ ืœื”ื ืžื ื”ืœ ื™ื™ืขื•ื“ื™ ืฉืขื•ื‘ื“ ื‘ืื•ืชื” ืžื—ืœืงื”.

ื™ื—ืกื™

select a.*
from   employee a
left   join employee b on (b.id = a.chief_id and b.department_id = a.department_id)
where  b.id is null

ืคื•ึผื ืงืฆึดื™ื•ึนื ึธืœึดื™

SELECT name(Employee a) WHERE NOT (department(chief(a)) = department(a));

ืžืฉื™ืžื” 1.5

ืžืฆื ืจืฉื™ืžื” ืฉืœ ืžื–ื”ื™ ืžื—ืœืงื•ืช ืขื ืฉื›ืจ ื”ืขื•ื‘ื“ ื”ื›ื•ืœืœ ื”ืžืจื‘ื™.

ื™ื—ืกื™

with sum_salary as
  ( select department_id, sum(salary) salary
    from   employee
    group  by department_id )
select department_id
from   sum_salary a       
where  a.salary = ( select max(salary) from sum_salary )

ืคื•ึผื ืงืฆึดื™ื•ึนื ึธืœึดื™

salarySum 'ะœะฐะบัะธะผะฐะปัŒะฝะฐั ะทะฐั€ะฟะปะฐั‚ะฐ' (Department d) = 
    GROUP SUM salary(Employee e) IF department(e) = d;
maxSalarySum 'ะœะฐะบัะธะผะฐะปัŒะฝะฐั ะทะฐั€ะฟะปะฐั‚ะฐ ะพั‚ะดะตะปะพะฒ' () = 
    GROUP MAX salarySum(Department d);
SELECT Department d WHERE salarySum(d) = maxSalarySum();

ื”ื‘ื” ื ืขื‘ื•ืจ ืœืžืฉื™ืžื•ืช ืžื•ืจื›ื‘ื•ืช ื™ื•ืชืจ ืžืฉืœ ืื—ืจ ืžืืžืจื™ื. ื”ื•ื ืžื›ื™ืœ ื ื™ืชื•ื— ืžืคื•ืจื˜ ื›ื™ืฆื“ ืœื™ื™ืฉื ืžืฉื™ืžื” ื–ื• ื‘-MS SQL.

ืžืฉื™ืžื” 2.1

ืื™ืœื• ืžื•ื›ืจื™ื ืžื›ืจื• ื™ื•ืชืจ ืž-1997 ื™ื—ื™ื“ื•ืช ืฉืœ ืžื•ืฆืจ ืžืก' 30 ื‘-1?

ืœื•ื’ื™ืงื” ืฉืœ ืชื—ื•ื (ื›ืžื• ืงื•ื“ื ื‘-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), ื‘ืชื•ืš ื”ืงื‘ื•ืฆื•ืช ืฉืฆื•ื™ื ื• (ื›ืืŸ Customer ื•- Year, ืื‘ืœ ื™ื›ื•ืœ ืœื”ื™ื•ืช ื›ืœ ื‘ื™ื˜ื•ื™), ืžื™ื•ืŸ ื‘ืชื•ืš ื”ืงื‘ื•ืฆื•ืช ืœืคื™ ื”ื‘ื™ื˜ื•ื™ื™ื ืฉืฆื•ื™ื ื• ื‘-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_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 

ืžืกืงื ื”

ื™ืฉ ืœืฆื™ื™ืŸ ื›ื™ ืชื—ื‘ื™ืจ ื”ืฉืคื” ื”ื ืชื•ืŸ ื”ื•ื ืจืง ืื—ืช ืžื”ืืคืฉืจื•ื™ื•ืช ืœื™ื™ืฉื•ื ื”ืžื•ืฉื’ ื”ื ืชื•ืŸ. ื”-SQL ื ืœืงื— ื›ื‘ืกื™ืก, ื•ื”ืžื˜ืจื” ื”ื™ื™ืชื” ืฉื”ื•ื ื™ื”ื™ื” ื›ืžื” ืฉื™ื•ืชืจ ื“ื•ืžื” ืœื•. ื›ืžื•ื‘ืŸ, ื™ื™ืชื›ืŸ ืฉื—ืœืงื ืœื ื™ืื”ื‘ื• ืืช ืฉืžื•ืช ืžื™ืœื•ืช ื”ืžืคืชื—, ืื•ื’ืจื™ ืžื™ืœื™ื ื•ื›ื•'. ื”ืขื™ืงืจ ื›ืืŸ ื”ื•ื ื”ืงื•ื ืกืคื˜ ืขืฆืžื•. ืื ืชืจืฆื”, ืืชื” ื™ื›ื•ืœ ืœื”ืคื•ืš ืืช ืชื—ื‘ื™ืจ C++ ื•ื’ื Python ื“ื•ืžื”.

ืœืžื•ืฉื’ ืžืกื“ ื”ื ืชื•ื ื™ื ื”ืžืชื•ืืจ, ืœื“ืขืชื™, ื™ืฉ ืืช ื”ื™ืชืจื•ื ื•ืช ื”ื‘ืื™ื:

  • ืคืฉื˜ื•ืช. ื–ื”ื• ืื™ื ื“ื™ืงื˜ื•ืจ ืกื•ื‘ื™ื™ืงื˜ื™ื‘ื™ ื™ื—ืกื™ืช ืฉืื™ื ื• ืžื•ื‘ืŸ ืžืืœื™ื• ื‘ืžืงืจื™ื ืคืฉื•ื˜ื™ื. ืื‘ืœ ืื ืืชื” ืžืกืชื›ืœ ืขืœ ืžืงืจื™ื ืžื•ืจื›ื‘ื™ื ื™ื•ืชืจ (ืœืžืฉืœ, ื‘ืขื™ื•ืช ืขื ื›ื•ื›ื‘ื™ื•ืช), ืื–, ืœื“ืขืชื™, ื›ืชื™ื‘ืช ืฉืื™ืœืชื•ืช ื›ืืœื” ื”ื™ื ื”ืจื‘ื” ื™ื•ืชืจ ืงืœื”.
  • ะ˜ะฝะบะฐะฟััƒะปัั†ะธั. ื‘ื›ืžื” ื“ื•ื’ืžืื•ืช ื”ื›ืจื–ืชื™ ืขืœ ืคื•ื ืงืฆื™ื•ืช ื‘ื™ื ื™ื™ื (ืœื“ื•ื’ืžื”, ื ืžื›ืจื™ื, ืงื ื” ื•ื›ื•'), ืฉืžืžื ื• ื ื‘ื ื• ืคื•ื ืงืฆื™ื•ืช ืขื•ืงื‘ื•ืช. ื–ื” ืžืืคืฉืจ ืœืš ืœืฉื ื•ืช ืืช ื”ื”ื™ื’ื™ื•ืŸ ืฉืœ ืคื•ื ืงืฆื™ื•ืช ืžืกื•ื™ืžื•ืช, ื‘ืžื™ื“ืช ื”ืฆื•ืจืš, ืžื‘ืœื™ ืœืฉื ื•ืช ืืช ื”ื”ื™ื’ื™ื•ืŸ ืฉืœ ืืœื” ื”ืชืœื•ื™ื•ืช ื‘ื”ืŸ. ืœื“ื•ื’ืžื”, ืืชื” ื™ื›ื•ืœ ืœื‘ืฆืข ืžื›ื™ืจื•ืช ื ืžื›ืจื™ื ื—ื•ืฉื‘ื• ืžืื•ื‘ื™ื™ืงื˜ื™ื ืฉื•ื ื™ื ืœื—ืœื•ื˜ื™ืŸ, ื‘ืขื•ื“ ืฉืฉืืจ ื”ื”ื™ื’ื™ื•ืŸ ืœื ื™ืฉืชื ื”. ื›ืŸ, ื ื™ืชืŸ ืœื™ื™ืฉื ื–ืืช ื‘-RDBMS ื‘ืืžืฆืขื•ืช CREATE VIEW. ืื‘ืœ ืื ื›ืœ ื”ื”ื™ื’ื™ื•ืŸ ื›ืชื•ื‘ ื›ืš, ื–ื” ืœื ื™ื™ืจืื” ืงืจื™ื ื‘ืžื™ื•ื—ื“.
  • ืื™ืŸ ืคืขืจ ืกืžื ื˜ื™. ืžืกื“ ื ืชื•ื ื™ื ื›ื–ื” ืคื•ืขืœ ืขืœ ืคื•ื ืงืฆื™ื•ืช ื•ืžื—ืœืงื•ืช (ื‘ืžืงื•ื ื˜ื‘ืœืื•ืช ื•ืฉื“ื•ืช). ืžืžืฉ ื›ืžื• ื‘ืชื›ื ื•ืช ืงืœืืกื™ (ืื ื ื ื™ื— ืฉืžืชื•ื“ื” ื”ื™ื ืคื•ื ืงืฆื™ื” ืขื ื”ืคืจืžื˜ืจ ื”ืจืืฉื•ืŸ ื‘ืฆื•ืจืช ื”ืžื—ืœืงื” ืืœื™ื” ื”ื™ื ืฉื™ื™ื›ืช). ื‘ื”ืชืื, ื–ื” ืฆืจื™ืš ืœื”ื™ื•ืช ื”ืจื‘ื” ื™ื•ืชืจ ืงืœ "ืœื”ืชื™ื™ื“ื“" ืขื ืฉืคื•ืช ืชื›ื ื•ืช ืื•ื ื™ื‘ืจืกืœื™ื•ืช. ื‘ื ื•ืกืฃ, ื”ืจืขื™ื•ืŸ ื”ื–ื” ืžืืคืฉืจ ืœื™ื™ืฉื ืคื•ื ืงืฆื™ื•ื ืœื™ื•ืช ื”ืจื‘ื” ื™ื•ืชืจ ืžื•ืจื›ื‘ืช. ืœื“ื•ื’ืžื”, ืืชื” ื™ื›ื•ืœ ืœื”ื˜ืžื™ืข ืื•ืคืจื˜ื•ืจื™ื ื›ืžื•:

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

  • ืชื•ืจืฉื” ื•ืคื•ืœื™ืžื•ืจืคื™ื–ื. ื‘ืžืกื“ ื ืชื•ื ื™ื ืคื•ื ืงืฆื™ื•ื ืœื™, ืืชื” ื™ื›ื•ืœ ืœื”ืฆื™ื’ ื™ืจื•ืฉื” ืžืจื•ื‘ื” ื‘ืืžืฆืขื•ืช CLASS ClassP: Class1, Class2 ื‘ื•ื ื” ื•ืœื™ื™ืฉื ืคื•ืœื™ืžื•ืจืคื™ื–ื ืžืจื•ื‘ื”. ืื ื™ ื›ื ืจืื” ืื›ืชื•ื‘ ืื™ืš ื‘ื“ื™ื•ืง ื‘ืžืืžืจื™ื ื”ื‘ืื™ื.

ืœืžืจื•ืช ืฉื–ื” ืจืง ืžื•ืฉื’, ื›ื‘ืจ ื™ืฉ ืœื ื• ื™ื™ืฉื•ื ื›ืœืฉื”ื• ื‘ื’'ืื•ื•ื” ืฉืžืชืจื’ื ืืช ื›ืœ ื”ื”ื™ื’ื™ื•ืŸ ื”ืคื•ื ืงืฆื™ื•ื ืœื™ ืœืœื•ื’ื™ืงื” ื™ื—ืกื™ืช. ื‘ื ื•ืกืฃ, ื”ื”ื™ื’ื™ื•ืŸ ืฉืœ ื”ื™ื™ืฆื•ื’ื™ื ื•ื”ืจื‘ื” ื“ื‘ืจื™ื ืื—ืจื™ื ืžื—ื•ื‘ืจื™ื ืืœื™ื• ื™ืคื”, ืฉื‘ื–ื›ื•ืชื ืื ื• ืžืงื‘ืœื™ื ืฉืœื ืคึผืœึทื˜ืคื•ึนืจืžึธื”. ื‘ืขื™ืงืจื• ืฉืœ ื“ื‘ืจ, ืื ื• ืžืฉืชืžืฉื™ื ื‘-RDBMS (ืจืง PostgreSQL ืœืขืช ืขืชื”) ื›"ืžื›ื•ื ื” ื•ื™ืจื˜ื•ืืœื™ืช". ืœืคืขืžื™ื ืžืชืขื•ืจืจื•ืช ื‘ืขื™ื•ืช ืขื ืชืจื’ื•ื ื–ื” ืžื›ื™ื•ื•ืŸ ืฉืžืื•ืคื˜ื™ืžื™ื–ืฆื™ื™ืช ื”ืฉืื™ืœืชื•ืช ืฉืœ RDBMS ืื™ื ื• ื™ื•ื“ืข ืกื˜ื˜ื™ืกื˜ื™ืงื•ืช ืžืกื•ื™ืžื•ืช ืฉื”-FDBMS ื™ื•ื“ืข. ื‘ืชื™ืื•ืจื™ื”, ื ื™ืชืŸ ืœื™ื™ืฉื ืžืขืจื›ืช ื ื™ื”ื•ืœ ืžืกื“ ื ืชื•ื ื™ื ืฉืชืฉืชืžืฉ ื‘ืžื‘ื ื” ืžืกื•ื™ื ื›ืื—ืกื•ืŸ, ื”ืžื•ืชืื ื‘ืžื™ื•ื—ื“ ืœืœื•ื’ื™ืงื” ืคื•ื ืงืฆื™ื•ื ืœื™ืช.

ืžืงื•ืจ: www.habr.com

ื”ื•ืกืคืช ืชื’ื•ื‘ื”