Π€ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»Π½Π° Π‘Π£Π‘Π”

Π‘Π²Π΅Ρ‚ΡŠΡ‚ Π½Π° Π±Π°Π·ΠΈΡ‚Π΅ Π΄Π°Π½Π½ΠΈ ΠΎΡ‚Π΄Π°Π²Π½Π° Π΅ ΠΏΡ€Π΅Π²Π·Π΅Ρ‚ ΠΎΡ‚ Ρ€Π΅Π»Π°Ρ†ΠΈΠΎΠ½Π½ΠΈ Π‘Π£Π‘Π”, ΠΊΠΎΠΈΡ‚ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚ Π΅Π·ΠΈΠΊΠ° 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();

НСка Π΄Π° ΠΏΡ€Π΅ΠΌΠΈΠ½Π΅ΠΌ към ΠΏΠΎ-слоТни Π·Π°Π΄Π°Ρ‡ΠΈ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³ статии. Π’ΠΎΠΉ ΡΡŠΠ΄ΡŠΡ€ΠΆΠ° ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π΅Π½ Π°Π½Π°Π»ΠΈΠ· ΠΊΠ°ΠΊ Π΄Π° сС Ρ€Π΅Π°Π»ΠΈΠ·ΠΈΡ€Π° Ρ‚Π°Π·ΠΈ Π·Π°Π΄Π°Ρ‡Π° Π² 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);

НСобходимо Π΅ Π΄Π° сС намСрят възмоТни ΠΊΠ°Π½Π΄ΠΈΠ΄Π°Ρ‚ΠΈ Π·Π° приятСлство. По-Ρ„ΠΎΡ€ΠΌΠ°Π»Π½ΠΎ, трябва Π΄Π° Π½Π°ΠΌΠ΅Ρ€ΠΈΡ‚Π΅ всички Ρ…ΠΎΡ€Π° 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 ΠΈ Π΄Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠΈΡ‚Π΅ мноТСствСн ΠΏΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„ΠΈΠ·ΡŠΠΌ. Как Ρ‚ΠΎΡ‡Π½ΠΎ, ΠΌΠΎΠΆΠ΅ Π±ΠΈ Ρ‰Π΅ пиша Π² слСдващитС статии.

Π’ΡŠΠΏΡ€Π΅ΠΊΠΈ Ρ‡Π΅ Ρ‚ΠΎΠ²Π° Π΅ само концСпция, Π²Π΅Ρ‡Π΅ ΠΈΠΌΠ°ΠΌΠ΅ някаква рСализация Π² Java, която ΠΏΡ€Π΅Π²Π΅ΠΆΠ΄Π° цялата Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»Π½Π° Π»ΠΎΠ³ΠΈΠΊΠ° Π² Ρ€Π΅Π»Π°Ρ†ΠΈΠΎΠ½Π½Π° Π»ΠΎΠ³ΠΈΠΊΠ°. ОсвСн Ρ‚ΠΎΠ²Π° Π»ΠΎΠ³ΠΈΠΊΠ°Ρ‚Π° Π½Π° прСдставянията ΠΈ ΠΌΠ½ΠΎΠ³ΠΎ Π΄Ρ€ΡƒΠ³ΠΈ Π½Π΅Ρ‰Π° са красиво Π·Π°Π²ΠΈΠ½Ρ‚Π΅Π½ΠΈ към Π½Π΅Π³ΠΎ, Π±Π»Π°Π³ΠΎΠ΄Π°Ρ€Π΅Π½ΠΈΠ΅ Π½Π° ΠΊΠΎΠ΅Ρ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π°ΠΌΠ΅ цяло ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ°. По ΡΡŠΡ‰Π΅ΡΡ‚Π²ΠΎ Π½ΠΈΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ RDBMS (засСга само PostgreSQL) ΠΊΠ°Ρ‚ΠΎ "Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»Π½Π° машина". Π’ΠΎΠ·ΠΈ ΠΏΡ€Π΅Π²ΠΎΠ΄ понякога създава ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ, Ρ‚ΡŠΠΉ ΠΊΠ°Ρ‚ΠΎ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ‚ΠΎΡ€ΡŠΡ‚ Π½Π° заявки Π·Π° RDBMS Π½Π΅ Π·Π½Π°Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈ статистики, ΠΊΠΎΠΈΡ‚ΠΎ FDBMS Π·Π½Π°Π΅. На тСория Π΅ възмоТно Π΄Π° сС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠΈ систСма Π·Π° ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ, която Ρ‰Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° структура ΠΊΠ°Ρ‚ΠΎ ΡΡŠΡ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅, Π°Π΄Π°ΠΏΡ‚ΠΈΡ€Π°Π½Π° спСциално Π·Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»Π½Π° Π»ΠΎΠ³ΠΈΠΊΠ°.

Π˜Π·Ρ‚ΠΎΡ‡Π½ΠΈΠΊ: www.habr.com

ДобавянС Π½Π° Π½ΠΎΠ² ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€