Π€ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»Π΅Π½ DBMS

Π’ΠΎ свСтот Π½Π° Π±Π°Π·ΠΈΡ‚Π΅ Π½Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ Π΄ΠΎΠ»Π³ΠΎ Π²Ρ€Π΅ΠΌΠ΅ Π΄ΠΎΠΌΠΈΠ½ΠΈΡ€Π°Π°Ρ‚ Ρ€Π΅Π»Π°Ρ†ΠΈΠΎΠ½ΠΈ 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();

АјдС Π΄Π° ΠΏΡ€Π΅ΠΌΠΈΠ½Π΅ΠΌΠ΅ Π½Π° послоТСни Π·Π°Π΄Π°Ρ‡ΠΈ ΠΎΠ΄ Π΄Ρ€ΡƒΠ³Π° Π§Π»Π΅Π½. Π‘ΠΎΠ΄Ρ€ΠΆΠΈ Π΄Π΅Ρ‚Π°Π»Π½Π° Π°Π½Π°Π»ΠΈΠ·Π° Π·Π° Ρ‚ΠΎΠ° ΠΊΠ°ΠΊΠΎ Π΄Π° сС ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€Π° ΠΎΠ²Π°Π° Π·Π°Π΄Π°Ρ‡Π° Π²ΠΎ 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), Π²ΠΎ Ρ€Π°ΠΌΠΊΠΈΡ‚Π΅ Π½Π° Π½Π°Π²Π΅Π΄Π΅Π½ΠΈΡ‚Π΅ Π³Ρ€ΡƒΠΏΠΈ (Ρ‚ΡƒΠΊΠ° ΠšΠ»ΠΈΠ΅Π½Ρ‚ ΠΈ Π“ΠΎΠ΄ΠΈΠ½Π°, Π½ΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΠΈΠ΄Π΅ кој Π±ΠΈΠ»ΠΎ ΠΈΠ·Ρ€Π°Π·), ΡΠΎΡ€Ρ‚ΠΈΡ€Π°ΡšΠ΅ Π²ΠΎ Ρ€Π°ΠΌΠΊΠΈΡ‚Π΅ Π½Π° Π³Ρ€ΡƒΠΏΠΈΡ‚Π΅ спорСд ΠΈΠ·Ρ€Π°Π·ΠΈΡ‚Π΅ Π½Π°Π²Π΅Π΄Π΅Π½ΠΈ Π²ΠΎ 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: Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π·Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΡ‚ со ΠΏΡ€Π²Π°Ρ‚Π° ΠΈ Π²Ρ‚ΠΎΡ€Π°Ρ‚Π° Ρ•Π²Π΅Π·Π΄ΠΈΡ‡ΠΊΠ° ΠΎΠ΄ 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

Π”ΠΎΠ΄Π°Π΄Π΅Ρ‚Π΅ ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€