ืขืืื ืืกืื ืื ืชืื ืื ื ืฉืื ืื ืืืืจ ืขื ืืื 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();
ืืื ื ืขืืืจ ืืืฉืืืืช ืืืจืืืืช ืืืชืจ ืืฉื ืืืจ
ืืฉืืื 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: ืคืชืจืื ืืืขืื ืขื ืืืืืืืช ืืจืืฉืื ื ืืืฉื ืืื ื
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 ืืื ื ืืืืืฉื ืคืืืืืืจืคืืื ืืจืืื. ืื ื ืื ืจืื ืืืชืื ืืื ืืืืืง ืืืืืจืื ืืืืื.
ืืืจืืช ืฉืื ืจืง ืืืฉื, ืืืจ ืืฉ ืื ื ืืืฉืื ืืืฉืื ืื'ืืืื ืฉืืชืจืื ืืช ืื ืืืืืืื ืืคืื ืงืฆืืื ืื ืืืืืืงื ืืืกืืช. ืื ืืกืฃ, ืืืืืืื ืฉื ืืืืฆืืืื ืืืจืื ืืืจืื ืืืจืื ืืืืืจืื ืืืื ืืคื, ืฉืืืืืชื ืื ื ืืงืืืื ืฉืื
ืืงืืจ: www.habr.com