Π‘Π²Π΅ΡΡΡ Π½Π° Π±Π°Π·ΠΈΡΠ΅ Π΄Π°Π½Π½ΠΈ ΠΎΡΠ΄Π°Π²Π½Π° Π΅ ΠΏΡΠ΅Π²Π·Π΅Ρ ΠΎΡ ΡΠ΅Π»Π°ΡΠΈΠΎΠ½Π½ΠΈ Π‘Π£ΠΠ, ΠΊΠΎΠΈΡΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ Π΅Π·ΠΈΠΊΠ° SQL. Π’ΠΎΠ»ΠΊΠΎΠ²Π° ΠΌΠ½ΠΎΠ³ΠΎ, ΡΠ΅ Π½ΠΎΠ²ΠΎΠ²ΡΠ·Π½ΠΈΠΊΠ²Π°ΡΠΈΡΠ΅ ΡΠ°Π·Π½ΠΎΠ²ΠΈΠ΄Π½ΠΎΡΡΠΈ ΡΠ΅ Π½Π°ΡΠΈΡΠ°Ρ ββNoSQL. Π’Π΅ ΡΡΠΏΡΡ Π° Π΄Π° ΡΠΏΠ΅ΡΠ΅Π»ΡΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΎ ΠΌΡΡΡΠΎ Π·Π° ΡΠ΅Π±Π΅ ΡΠΈ Π½Π° ΡΠΎΠ·ΠΈ ΠΏΠ°Π·Π°Ρ, Π½ΠΎ ΡΠ΅Π»Π°ΡΠΈΠΎΠ½Π½ΠΈΡΠ΅ Π‘Π£ΠΠ Π½ΡΠΌΠ° Π΄Π° ΡΠΌΡΠ°Ρ ΠΈ ΠΏΡΠΎΠ΄ΡΠ»ΠΆΠ°Π²Π°Ρ Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ Π°ΠΊΡΠΈΠ²Π½ΠΎ Π·Π° ΡΠΎΠ±ΡΡΠ²Π΅Π½ΠΈΡΠ΅ ΡΠΈ ΡΠ΅Π»ΠΈ.
Π ΡΠ°Π·ΠΈ ΡΡΠ°ΡΠΈΡ ΠΈΡΠΊΠ°ΠΌ Π΄Π° ΠΎΠΏΠΈΡΠ° ΠΊΠΎΠ½ΡΠ΅ΠΏΡΠΈΡΡΠ° Π·Π° ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π½Π° Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ. ΠΠ° ΠΏΠΎ-Π΄ΠΎΠ±ΡΠΎ ΡΠ°Π·Π±ΠΈΡΠ°Π½Π΅ ΡΠ΅ Π½Π°ΠΏΡΠ°Π²Ρ ΡΠΎΠ²Π°, ΠΊΠ°ΡΠΎ ΡΡΠ°Π²Π½Ρ Ρ ΠΊΠ»Π°ΡΠΈΡΠ΅ΡΠΊΠΈΡ ΡΠ΅Π»Π°ΡΠΈΠΎΠ½Π΅Π½ ΠΌΠΎΠ΄Π΅Π». ΠΠ°ΡΠΎ ΠΏΡΠΈΠΌΠ΅ΡΠΈ ΡΠ΅ Π±ΡΠ΄Π°Ρ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ΠΈ Π·Π°Π΄Π°ΡΠΈ ΠΎΡ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ 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 ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ ΠΊΠ°ΡΠΎ Π²Ρ ΠΎΠ΄ ΠΈ Π²ΡΡΡΠ°Ρ ΠΏΡΠΈΠΌΠΈΡΠΈΠ²Π΅Π½ ΡΠΈΠΏ.
ΠΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π° ΡΠ΅, ΡΠ΅ Π²ΡΠ² ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π½Π° Π‘Π£ΠΠ Π²ΡΠ΅ΠΊΠΈ ΠΎΠ±Π΅ΠΊΡ ΡΠ΅ ΠΈΠΌΠ° Π½ΡΠΊΠ°ΠΊΡΠ² Π²ΡΡΡΠ΅ΡΠ΅Π½ ΠΊΠΎΠ΄, ΠΊΠΎΠΉΡΠΎ ΡΠ΅ Π³Π΅Π½Π΅ΡΠΈΡΠ° Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ½ΠΎ ΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ Π΄ΠΎΡΡΡΠΏΠ΅Π½, Π°ΠΊΠΎ Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ.
ΠΠ΅ΠΊΠ° Π΄Π° ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΠΌ ΡΠ΅Π½Π°ΡΠ° Π·Π° ΠΏΡΠΎΠ΄ΡΠΊΡΠ° / ΠΌΠ°Π³Π°Π·ΠΈΠ½Π° / Π΄ΠΎΡΡΠ°Π²ΡΠΈΠΊΠ°. ΠΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ Ρ Π²ΡΠ΅ΠΌΠ΅ΡΠΎ, ΡΠ°ΠΊΠ° ΡΠ΅ Π½Π΅ΠΊΠ° Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΠΏΠΎΠ»Π΅ Π·Π° Π²ΡΠ΅ΠΌΠ΅ ΠΊΡΠΌ ΡΠ°Π±Π»ΠΈΡΠ°ΡΠ°. Π©Π΅ ΠΏΡΠΎΠΏΡΡΠ½Π° Π΄Π΅ΠΊΠ»Π°ΡΠ°ΡΠΈΡΡΠ° Π½Π° ΡΠ°Π±Π»ΠΈΡΠΈ Π·Π° Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΠΈ Π² ΡΠ΅Π»Π°ΡΠΈΠΎΠ½Π½Π° Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ, Π·Π° Π΄Π° ΡΡΠΊΡΠ°ΡΡ ΠΊΠΎΠ΄Π°:
Π Π΅Π»Π°ΡΠΈΠΎΠ½Π½Π°
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);
ΠΠ΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ Π΅ Π΄Π° ΡΠ΅ Π½Π°ΠΌΠ΅ΡΡΡ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΈ ΠΊΠ°Π½Π΄ΠΈΠ΄Π°ΡΠΈ Π·Π° ΠΏΡΠΈΡΡΠ΅Π»ΡΡΠ²ΠΎ. ΠΠΎ-ΡΠΎΡΠΌΠ°Π»Π½ΠΎ, ΡΡΡΠ±Π²Π° Π΄Π° Π½Π°ΠΌΠ΅ΡΠΈΡΠ΅ Π²ΡΠΈΡΠΊΠΈ Ρ
ΠΎΡΠ° 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 ΠΈ Π΄Π° ΠΏΡΠΈΠ»ΠΎΠΆΠΈΡΠ΅ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π΅Π½ ΠΏΠΎΠ»ΠΈΠΌΠΎΡΡΠΈΠ·ΡΠΌ. ΠΠ°ΠΊ ΡΠΎΡΠ½ΠΎ, ΠΌΠΎΠΆΠ΅ Π±ΠΈ ΡΠ΅ ΠΏΠΈΡΠ° Π² ΡΠ»Π΅Π΄Π²Π°ΡΠΈΡΠ΅ ΡΡΠ°ΡΠΈΠΈ.
ΠΡΠΏΡΠ΅ΠΊΠΈ ΡΠ΅ ΡΠΎΠ²Π° Π΅ ΡΠ°ΠΌΠΎ ΠΊΠΎΠ½ΡΠ΅ΠΏΡΠΈΡ, Π²Π΅ΡΠ΅ ΠΈΠΌΠ°ΠΌΠ΅ Π½ΡΠΊΠ°ΠΊΠ²Π° ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ Π² Java, ΠΊΠΎΡΡΠΎ ΠΏΡΠ΅Π²Π΅ΠΆΠ΄Π° ΡΡΠ»Π°ΡΠ° ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π½Π° Π»ΠΎΠ³ΠΈΠΊΠ° Π² ΡΠ΅Π»Π°ΡΠΈΠΎΠ½Π½Π° Π»ΠΎΠ³ΠΈΠΊΠ°. ΠΡΠ²Π΅Π½ ΡΠΎΠ²Π° Π»ΠΎΠ³ΠΈΠΊΠ°ΡΠ° Π½Π° ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΡΠ½ΠΈΡΡΠ° ΠΈ ΠΌΠ½ΠΎΠ³ΠΎ Π΄ΡΡΠ³ΠΈ Π½Π΅ΡΠ° ΡΠ° ΠΊΡΠ°ΡΠΈΠ²ΠΎ Π·Π°Π²ΠΈΠ½ΡΠ΅Π½ΠΈ ΠΊΡΠΌ Π½Π΅Π³ΠΎ, Π±Π»Π°Π³ΠΎΠ΄Π°ΡΠ΅Π½ΠΈΠ΅ Π½Π° ΠΊΠΎΠ΅ΡΠΎ ΠΏΠΎΠ»ΡΡΠ°Π²Π°ΠΌΠ΅ ΡΡΠ»ΠΎ
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: www.habr.com