ΠΠΎ ΡΠ²Π΅ΡΠΎΡ Π½Π° Π±Π°Π·ΠΈΡΠ΅ Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ Π΄ΠΎΠ»Π³ΠΎ Π²ΡΠ΅ΠΌΠ΅ Π΄ΠΎΠΌΠΈΠ½ΠΈΡΠ°Π°Ρ ΡΠ΅Π»Π°ΡΠΈΠΎΠ½ΠΈ DBMS, ΠΊΠΎΠΈ Π³ΠΎ ΠΊΠΎΡΠΈΡΡΠ°Ρ ΡΠ°Π·ΠΈΠΊΠΎΡ SQL. Π’ΠΎΠ»ΠΊΡ ΠΌΠ½ΠΎΠ³Ρ ΡΡΠΎ Π½ΠΎΠ²ΠΈΡΠ΅ Π²Π°ΡΠΈΡΠ°Π½ΡΠΈ ΡΠ΅ Π½Π°ΡΠ΅ΠΊΡΠ²Π°Π°Ρ NoSQL. Π’ΠΈΠ΅ ΡΡΠΏΠ΅Π°ΡΠ° Π΄Π° ΠΎΠ΄Π²ΠΎΡΠ°Ρ ΠΎΠ΄ΡΠ΅Π΄Π΅Π½ΠΎ ΠΌΠ΅ΡΡΠΎ Π·Π° ΡΠ΅Π±Π΅ Π½Π° ΠΎΠ²ΠΎΡ ΠΏΠ°Π·Π°Ρ, Π½ΠΎ ΡΠ΅Π»Π°ΡΠΈΠΎΠ½ΠΈΡΠ΅ DBMS Π½Π΅ΠΌΠ° Π΄Π° ΡΠΌΡΠ°Ρ ΠΈ ΡΠ΅ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ°Ρ Π°ΠΊΡΠΈΠ²Π½ΠΎ Π΄Π° ΡΠ΅ ΠΊΠΎΡΠΈΡΡΠ°Ρ Π·Π° Π½ΠΈΠ²Π½ΠΈΡΠ΅ ΡΠ΅Π»ΠΈ.
ΠΠΎ ΠΎΠ²Π°Π° ΡΡΠ°ΡΠΈΡΠ° ΡΠ°ΠΊΠ°ΠΌ Π΄Π° Π³ΠΎ ΠΎΠΏΠΈΡΠ°ΠΌ ΠΊΠΎΠ½ΡΠ΅ΠΏΡΠΎΡ Π½Π° ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π½Π° Π±Π°Π·Π° Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ. ΠΠ° ΠΏΠΎΠ΄ΠΎΠ±ΡΠΎ ΡΠ°Π·Π±ΠΈΡΠ°ΡΠ΅, ΡΠ΅ Π³ΠΎ Π½Π°ΠΏΡΠ°Π²Π°ΠΌ ΠΎΠ²Π° ΡΠΏΠΎΡΠ΅Π΄ΡΠ²Π°ΡΡΠΈ Π³ΠΎ ΡΠΎ ΠΊΠ»Π°ΡΠΈΡΠ½ΠΈΠΎΡ ΡΠ΅Π»Π°ΡΠΈΡΠΊΠΈ ΠΌΠΎΠ΄Π΅Π». ΠΠ°ΠΊΠΎ ΠΏΡΠΈΠΌΠ΅ΡΠΈ ΡΠ΅ ΡΠ΅ ΠΊΠΎΡΠΈΡΡΠ°Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ ΠΎΠ΄ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ 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), Π²ΠΎ ΡΠ°ΠΌΠΊΠΈΡΠ΅ Π½Π° Π½Π°Π²Π΅Π΄Π΅Π½ΠΈΡΠ΅ Π³ΡΡΠΏΠΈ (ΡΡΠΊΠ° ΠΠ»ΠΈΠ΅Π½Ρ ΠΈ ΠΠΎΠ΄ΠΈΠ½Π°, Π½ΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΠΈΠ΄Π΅ ΠΊΠΎΡ Π±ΠΈΠ»ΠΎ ΠΈΠ·ΡΠ°Π·), ΡΠΎΡΡΠΈΡΠ°ΡΠ΅ Π²ΠΎ ΡΠ°ΠΌΠΊΠΈΡΠ΅ Π½Π° Π³ΡΡΠΏΠΈΡΠ΅ ΡΠΏΠΎΡΠ΅Π΄ ΠΈΠ·ΡΠ°Π·ΠΈΡΠ΅ Π½Π°Π²Π΅Π΄Π΅Π½ΠΈ Π²ΠΎ 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);
ΠΠ΅ΠΎΠΏΡ
ΠΎΠ΄Π½ΠΎ Π΅ Π΄Π° ΡΠ΅ Π½Π°ΡΠ΄Π°Ρ ΠΌΠΎΠΆΠ½ΠΈ ΠΊΠ°Π½Π΄ΠΈΠ΄Π°ΡΠΈ Π·Π° ΠΏΡΠΈΡΠ°ΡΠ΅Π»ΡΡΠ²ΠΎ. ΠΠΎΡΠΎΡΠΌΠ°Π»Π½ΠΎ, ΡΡΠ΅Π±Π° Π΄Π° Π³ΠΈ Π½Π°ΡΠ΄Π΅ΡΠ΅ ΡΠΈΡΠ΅ Π»ΡΡΠ΅ Π, Π, Π¦ ΡΠ°ΠΊΠ° ΡΡΠΎ Π Π΅ ΠΏΡΠΈΡΠ°ΡΠ΅Π» ΡΠΎ Π, Π° Π Π΅ ΠΏΡΠΈΡΠ°ΡΠ΅Π» ΡΠΎ Π¦, Π ΡΠ°ΠΊΠ° Π¦, Π½ΠΎ Π Π½Π΅ Π΅ ΠΏΡΠΈΡΠ°ΡΠ΅Π» ΡΠΎ Π.
ΠΠ΄ ΠΏΠ΅ΡΡΠΏΠ΅ΠΊΡΠΈΠ²Π° Π½Π° ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π½Π° Π±Π°Π·Π° Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ, Π±Π°ΡΠ°ΡΠ΅ΡΠΎ Π±ΠΈ ΠΈΠ·Π³Π»Π΅Π΄Π°Π»ΠΎ Π²Π°ΠΊΠ°:
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