🐘 Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ Ρ…Ρ€Π°Π½ΠΈΠΌΡ‹Π΅ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ Π² SQL: Π·Π°Ρ‡Π΅ΠΌ Π½ΡƒΠΆΠ½Ρ‹ ΠΈ ΠΊΠ°ΠΊ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ Π² Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ…

Как устроСны Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ Ρ…Ρ€Π°Π½ΠΈΠΌΡ‹Π΅ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ ΠΈ ΠΊΠ°ΠΊ ΠΈΡ… ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ для ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ³ΠΎ использования запросов.

SQL, ΠΊΠ°ΠΊ ΠΈ любой Π΄Ρ€ΡƒΠ³ΠΎΠΉ язык программирования, прСдоставляСт Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ Ρ…Ρ€Π°Π½ΠΈΠΌΡ‹Π΅ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹. Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΌΡ‹ рассмотрим Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ Ρ…Ρ€Π°Π½ΠΈΠΌΡ‹Π΅ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ Π² PostgreSQL, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π±ΡƒΠ΄ΡƒΡ‚ освСщСны ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΌΠΎΠΌΠ΅Π½Ρ‚Ρ‹:

  • Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ Ρ…Ρ€Π°Π½ΠΈΠΌΡ‹Π΅ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹;
  • Ρ€Π°Π·Π½ΠΈΡ†Π° ΠΌΠ΅ΠΆΠ΄Ρƒ функциями ΠΈ Ρ…Ρ€Π°Π½ΠΈΠΌΡ‹ΠΌΠΈ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π°ΠΌΠΈ;
  • созданиС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈ Ρ…Ρ€Π°Π½ΠΈΠΌΡ‹Ρ… ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€;
  • ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈ Ρ…Ρ€Π°Π½ΠΈΠΌΡ‹Ρ… ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€ Π² Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ….

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ Ρ…Ρ€Π°Π½ΠΈΠΌΡ‹Π΅ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ Π² SQL, ΠΊΠ°ΠΊ ΠΈ Π² любом Π΄Ρ€ΡƒΠ³ΠΎΠΌ языкС программирования, ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ³ΠΎ использования ΠΈ Π³ΠΈΠ±ΠΊΠΎΡΡ‚ΡŒ. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ Ρ…Ρ€Π°Π½ΠΈΠΌΡ‹Π΅ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ собой Π±Π»ΠΎΠΊ ΠΊΠΎΠ΄Π° ΠΈΠ»ΠΈ запросов, хранящихся Π² Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ снова ΠΈ снова. ВмСсто Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΎΠ΄Π½ΠΈ ΠΈ Ρ‚Π΅ ΠΆΠ΅ запросы, ΡƒΠ΄ΠΎΠ±Π½Π΅Π΅ ΡΠ³Ρ€ΡƒΠΏΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ всС запросы ΠΈ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΈΡ…, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ… ΠΌΠ½ΠΎΠ³ΠΎ Ρ€Π°Π·. Π§Ρ‚ΠΎ касаСтся гибкости, Ρ‚ΠΎ всякий Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° происходит ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π»ΠΎΠ³ΠΈΠΊΠΈ запросов, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ функциям ΠΈ Ρ…Ρ€Π°Π½ΠΈΠΌΡ‹ΠΌ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π°ΠΌ.

ΠœΠ΅ΠΆΠ΄Ρƒ функциями ΠΈ Ρ…Ρ€Π°Π½ΠΈΠΌΡ‹ΠΌΠΈ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π°ΠΌΠΈ Π² PostgreSQL Π΅ΡΡ‚ΡŒ нСсколько Ρ€Π°Π·Π»ΠΈΡ‡ΠΈΠΉ. Они ΠΏΠΎΠΊΠ°Π·Π°Π½Ρ‹ Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ Π½ΠΈΠΆΠ΅.

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π₯Ρ€Π°Π½ΠΈΠΌΡ‹Π΅ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹
Ѐункция ΠΈΠΌΠ΅Π΅Ρ‚ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹ΠΉ Ρ‚ΠΈΠΏ ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π₯ранимая ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°, Π½ΠΎ ΠΈΠΌΠ΅Π΅Ρ‚ Π²Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹
ИспользованиС DML (insert, update, delete) запросов Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ. Π’ функциях Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½Ρ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ SELECT-запросы ИспользованиС DML-запросов (insert, update, delete) Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π² Ρ…Ρ€Π°Π½ΠΈΠΌΠΎΠΉ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π΅.
Ѐункция Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ Π²Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² Π₯ранимая ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° ΠΈΠΌΠ΅Π΅Ρ‚ ΠΈ Π²Ρ…ΠΎΠ΄Π½Ρ‹Π΅, ΠΈ Π²Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹
Π’Ρ‹Π·ΠΎΠ² Ρ…Ρ€Π°Π½ΠΈΠΌΠΎΠΉ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ИспользованиС ΠΈΠ»ΠΈ ΠΆΠ΅ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ транзакциями Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π² Ρ…Ρ€Π°Π½ΠΈΠΌΠΎΠΉ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π΅
Π’Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²Π½ΡƒΡ‚Ρ€ΠΈ SELECT запросов Π²ΠΎΠ·ΠΌΠΎΠΆΠ΅Π½ Π’Ρ‹Π·ΠΎΠ² Ρ…Ρ€Π°Π½ΠΈΠΌΠΎΠΉ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ ΠΈΠ· SELECT запросов Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ

Π”Π°Π²Π°ΠΉΡ‚Π΅ рассмотрим созданиС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² PostgreSQL. Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π±Π»ΠΎΠΊ ΠΊΠΎΠ΄Π° ΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚, ΠΊΠ°ΠΊ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ.

CREATE [or REPLACE] FUNCTION function_name(param_list)
   RETURNS return_type 
   LANGUAGE plpgsql
  as
$$
DECLARE 
-- variable declaration
BEGIN
 -- logic
END;
$$

ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€:

  • create [or replace] function имя_Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ β€” создаСт ΠΈΠ»ΠΈ замСняСт Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, Ссли ΠΎΠ½Π° сущСствуСт, с Π·Π°Π΄Π°Π½Π½Ρ‹ΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ;
  • returns return_type β€” Ρ‚ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ функция;
  • язык plpgsql β€” ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½ΠΎΠ΅ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ PostgreSQL;
  • Π²Π½ΡƒΡ‚Ρ€ΠΈ Π·Π½Π°ΠΊΠ° $ являСтся Ρ‚Π΅Π»ΠΎΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ;
  • declare β€” ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, ΠΊΠ°ΠΊ ΠΎΠ±ΡŠΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΈΠ»ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅;
  • Π±Π»ΠΎΠΊ ΠΊΠΎΠ΄Π° [begin β€” end] β€” содСрТит всю Π»ΠΎΠ³ΠΈΠΊΡƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ;
  • begin β€” ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° Π½Π°Ρ‡Π°Π»ΠΎ запросов;
  • end β€” ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΊΠΎΠ½Π΅Ρ† Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ Π±Π»ΠΎΠΊΠ΅ ΠΊΠΎΠ΄Π° ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ созданиС простой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, которая вычисляСт ΡΡ‚ΠΎΠΈΠΌΠΎΡΡ‚ΡŒ самой Π΄ΠΎΡ€ΠΎΠ³ΠΎΠΉ ΠΏΠΎΠΊΡƒΠΏΠΊΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ.

CREATE OR REPLACE FUNCTION findMostExpensivePurchase(customer_id int)
    RETURNS numeric(10, 2)
    LANGUAGE plpgsql
AS
$$
DECLARE
    itemCost numeric(10, 2);
begin
    SELECT MAX(cost)
    INTO itemCost
    FROM purchases
    WHERE user_id = customer_id;
    RETURN itemCost;
end;
$$;

Π’Π°ΠΆΠ½ΠΎ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ:

  • Declare itemCost integer β€” объявляСм Π»ΠΎΠΊΠ°Π»ΡŒΠ½ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ;
  • SELECT max(cost) INTO itemCost β€” ΠΊΠ°ΠΊ ΠΌΡ‹ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ itemCost;
  • RETURN itemCost β€” Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Ρ…Ρ€Π°Π½ΠΈΠΌΠΎΠΉ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² Π±Π»ΠΎΠΊΠ΅ ΠΊΠΎΠ΄Π° Π½ΠΈΠΆΠ΅, ΠΏΠΎΡ‡Ρ‚ΠΈ Ρ‚Π°ΠΊΠΎΠ΅ ΠΆΠ΅, ΠΊΠ°ΠΊ созданиС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ с нСбольшим ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ΠΌ β€” Π² Π½Π΅ΠΉ Π½Π΅Ρ‚ return. ΠžΡΡ‚Π°Π»ΡŒΠ½ΠΎΠ΅ ΠΏΠΎΡ‡Ρ‚ΠΈ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½ΠΎ.

CREATE [OR REPLACE] PROCEDURE procedure_name(parameter_list)
LANGUAGE language_name
AS $
    stored_procedure_body;
$;

Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π½ΠΈΠΆΠ΅ Π±Π»ΠΎΠΊΠ΅ ΠΊΠΎΠ΄Π° ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ созданиС ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ β€” transfer(), которая ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Ρ‚Ρ€ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°. Π‘Ρ€Π°Π·Ρƒ послС ΠΈΠΌΠ΅Π½ΠΈ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ с ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌΠΈ Ρ‚ΠΈΠΏΠ°ΠΌΠΈ Π΄Π°Π½Π½Ρ‹Ρ… β€” sourceAccountId, destinationAccountId, сумма. ΠŸΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° Π²Ρ‹Ρ‡ΠΈΡ‚Π°Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½ΡƒΡŽ сумму ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ account ΠΈ добавляСт Π΅Π΅ ΠΊ Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ account.

CREATE OR REPLACE PROCEDURE transfer(sourceAccountId bigInt, destinationAccountId bigInt, amount Integer)
language plpgsql
as $$
begin
    update accounts
    set balance = accounts.balance - amount
    where id = sourceAccountId;

    update accounts
    set balance = balance + amount
    where id = destinationAccountId;

    commit;
end;
$$;

НаконСц, Π΄Π°Π²Π°ΠΉΡ‚Π΅ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌ всС это Π½Π° Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ…. Π§Ρ‚ΠΎΠ±Ρ‹ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ вСсь ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Π½ Π½ΠΈΠΆΠ΅, потрСбуСтся ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ PostgreSQL (вСрсия 13.2) Π½Π° Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€ ΠΈΠ»ΠΈ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ PostgreSQL с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Docker-ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°. Π§Ρ‚ΠΎΠ±Ρ‹ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ PostgreSQL Π² Docker ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π΅, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Ρ„Π°ΠΉΠ» docker-compose.yaml, ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ Π½ΠΈΠΆΠ΅.

version: "3.8"

services:

  postgresqldb:
    container_name: database
    image: postgres:13.2-alpine
    ports:
      - "5432:5432"
    environment:
      - POSTGRES_DB=customer-service
      - POSTGRES_USER=customer-dev
      - POSTGRES_PASSWORD=1awer321!qwQ
    volumes:
    - pgdata:/var/lib/postgresql/data

volumes:
  pgdata:
> docker-compose up

Π”Π°Π²Π°ΠΉΡ‚Π΅ создадим Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ users ΠΈ purchases ΠΈ Π·Π°ΠΏΠΎΠ»Π½ΠΈΠΌ ΠΈΡ…. Для простоты Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ users Π΅ΡΡ‚ΡŒ Ρ‚Ρ€ΠΈ столбца β€” id, name ΠΈ profession; Ρ‚Π°Π±Π»ΠΈΡ†Π° profession состоит ΠΈΠ· Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅Ρ… столбцов β€” id, name, cost ΠΈ user_id.

CREATE table users
(
    id         serial primary key,
    name       varchar(255),
    profession varchar(255)
);

insert into users(name, profession)
values
('Bob', 'QA'),
('Camilo', 'Front End developer'),
('Billy', 'Backend Developer'),
('Alice', 'Mobile Developer'),
('Kate', 'QA'),
('Wayne', 'DevOps'),
('Tim', 'Mobile Developer'),
('Amigos', 'QA');

CREATE TABLE purchases
(
    id      serial primary key ,
    name    varchar(255),
    cost    numeric(10, 2),
    user_id int,
    foreign key (user_id)
        references users (id)
);

insert into purchases(name, cost, user_id)
values
('M1 MacBook Air', 1300.99, 1),
('Iphone 14', 1200.00 , 2),
('Iphon 10', 700.00, 3),
('Iphone 13', 800.00, 1),
('Intel Core i5', 500.00, 4),
('M1 MacBook Pro', 1500, 5),
('IMAC',2500 , 7),
('ASUS VIVOBOOK', 899.99, 6),
('Lenovo', 1232.99, 1),
('Galaxy S21', 999.99, 2),
('XIAMI REDMIBOOK 14', 742.99, 4),
('M1 MacBook Air', 1299.99 , 8),
('ACER', 799.99, 7);

ПослС выполнСния запросов ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Π½Π°ΡˆΡƒ Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ…

ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ записСй ΠΈΠ· Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ users
ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ записСй ΠΈΠ· Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ purchases

Допустим, ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ Π·Π°ΠΏΡ€ΠΎΡΠΈΡ‚ΡŒ имя ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΈ Π΅Π³ΠΎ самыС Π΄ΠΎΡ€ΠΎΠ³ΠΈΠ΅ ΠΏΠΎΠΊΡƒΠΏΠΊΠΈ. МоТно Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ нСсколько слоТных запросов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Π΅Ρ€Π½ΡƒΡ‚ ΠΆΠ΅Π»Π°Π΅ΠΌΡ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚, ΠΎΠ΄Π½Π°ΠΊΠΎ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π½Π°ΡˆΡƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΡƒΡŽ Π²Ρ‹ΡˆΠ΅.

Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ сам запрос для создания нашСй Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

CREATE OR REPLACE FUNCTION findMostExpensivePurchase(customer_id int)
    RETURNS numeric(10, 2)
    LANGUAGE plpgsql
AS
$$
DECLARE
    itemCost numeric(10, 2);
begin
    SELECT MAX(cost)
    INTO itemCost
    FROM purchases
    WHERE user_id = customer_id;
    RETURN itemCost;
end;
$$;

Π§Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ β€” Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ:

SELECT findMostExpensivePurchase(1) as mostExpensivePurchase;
ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ самой Π΄ΠΎΡ€ΠΎΠ³ΠΎΠΉ ΠΏΠΎΠΊΡƒΠΏΠΊΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΏΠΎ id = 1

Π§Ρ‚ΠΎΠ±Ρ‹ Π² ΠΏΠΎΠ»Π½ΠΎΠΉ ΠΌΠ΅Ρ€Π΅ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ функциями, ΠΈΡ… ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… случаях, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π²ΠΎ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΡ… запросах select. Π‘ функциями запросы становятся Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΡ€ΠΎΡ‡Π΅ ΠΈ Ρ‚ΠΎΡ‡Π½Π΅Π΅, это ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅Ρ‚ ΡˆΠ°Π±Π»ΠΎΠ½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ ΠΈ Π΄Π΅Π»Π°Π΅Ρ‚ запросы Π»Π°ΠΊΠΎΠ½ΠΈΡ‡Π½Ρ‹ΠΌΠΈ ΠΈ простыми.

ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ списка ΠΈΠΌΡ‘Π½ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ ΠΈ ΠΈΡ… самых Π΄ΠΎΡ€ΠΎΠ³ΠΈΡ… ΠΏΠΎΠΊΡƒΠΏΠΎΠΊ

Как ΠΌΡ‹ обсуТдали Ρ€Π°Π½Π΅Π΅, Ρ…Ρ€Π°Π½ΠΈΠΌΡ‹Π΅ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ ΠΎΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Select-запросы, Π° Ρ…Ρ€Π°Π½ΠΈΠΌΡ‹Π΅ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Insert, Update, Delete ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ. Π₯Ρ€Π°Π½ΠΈΠΌΡ‹Π΅ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ ΠΎΡ‡Π΅Π½ΡŒ ΡƒΠ΄ΠΎΠ±Π½Ρ‹ ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ со случаями, ΠΊΠΎΠ³Π΄Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ insert, update ΠΈΠ»ΠΈ delete.

Рассмотрим Π±Π°Π½ΠΊΠΎΠ²ΡΠΊΡƒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ β€” ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄. ΠŸΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ банковской ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ дСньги пСрСводятся с ΠΎΠ΄Π½ΠΎΠ³ΠΎ счСта Π½Π° Π΄Ρ€ΡƒΠ³ΠΎΠΉ. Π§Ρ‚ΠΎΠ±Ρ‹ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ эту Ρ…Ρ€Π°Π½ΠΈΠΌΡƒΡŽ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ β€” transfer(), Π΄Π°Π²Π°ΠΉΡ‚Π΅ создадим Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ accounts ΠΈ Π·Π°ΠΏΠΎΠ»Π½ΠΈΠΌ Π΅Π΅.

create table accounts
(
    id      SERIAL primary key,
    balance  BIGINT,
    user_id INT unique ,
    FOREIGN KEY (user_id)
        references users (id)
);

INSERT INTO accounts(balance, user_id)
values
(1500, 1),
(1100, 2),
(2300, 3),
(7500, 5),
(6500, 4);

ПослС выполнСния ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Ρ… Π²Ρ‹ΡˆΠ΅ запросов ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π²Ρ‹Π²ΠΎΠ΄.

ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ записСй ΠΈΠ· Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ accounts

Для Π²Ρ‹Π·ΠΎΠ²Π° Ρ…Ρ€Π°Π½ΠΈΠΌΠΎΠΉ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ β€” call procedure_name().

Π‘Π΄Π΅Π»Π°Π΅ΠΌ условно ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ Π΄Π΅Π½Π΅Π³ – 500 Π΅Π΄ΠΈΠ½ΠΈΡ† с account.id = 3 Π½Π° account.id = 4 ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚.

Π’Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ transfer() ΠΈ с ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ Π²Ρ‹Π²ΠΎΠ΄ΠΎΠΌ записСй ΠΈΠ· Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ accounts

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΌΡ‹ рассмотрСли:

  • Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ Ρ…Ρ€Π°Π½ΠΈΠΌΡ‹Π΅ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΡ… Ρ€Π°Π·Π½ΠΈΡ†Ρƒ;
  • созданиС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹;
  • ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€ Π½Π° Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ…;
***

ΠœΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Ρ‹ ΠΏΠΎ Ρ‚Π΅ΠΌΠ΅

Π‘ΠΎΠ»ΡŒΡˆΠ΅ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Ρ… ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»ΠΎΠ² Π²Ρ‹ Π½Π°ΠΉΠ΄Π΅Ρ‚Π΅ Π½Π° нашСм Ρ‚Π΅Π»Π΅Π³Ρ€Π°ΠΌ-ΠΊΠ°Π½Π°Π»Π΅ Β«Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° программиста»

Π’ΠΠšΠΠΠ‘Π˜Π˜

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ вакансию
Senior Java Developer
Москва, ΠΏΠΎ ΠΈΡ‚ΠΎΠ³Π°ΠΌ собСсСдования
Go-Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ
ΠΏΠΎ ΠΈΡ‚ΠΎΠ³Π°ΠΌ собСсСдования
Java Team Lead
Москва, ΠΏΠΎ ΠΈΡ‚ΠΎΠ³Π°ΠΌ собСсСдования

Π›Π£Π§Π¨Π˜Π• БВАВЬИ ПО Π’Π•ΠœΠ•

eFusion
08 января 2020

11 Ρ‚ΠΈΠΏΠΎΠ² соврСмСнных Π±Π°Π· Π΄Π°Π½Π½Ρ‹Ρ…: ΠΊΡ€Π°Ρ‚ΠΊΠΈΠ΅ описания, схСмы ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ Π‘Π”

Π›ΡŽΠ±Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ Π³Π΄Π΅-Ρ‚ΠΎ хранятся. Π‘ΡƒΠ΄ΡŒ это ΠΈΠ½Ρ‚Π΅Ρ€Π½Π΅Ρ‚ Π²Π΅Ρ‰Π΅ΠΉ ΠΈΠ»ΠΈ ΠΏΠ°Ρ€ΠΎΠ»ΠΈ Π² *nix. По...
Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° программиста
29 июня 2017

5 сайтов для оттачивания Π½Π°Π²Ρ‹ΠΊΠΎΠ² написания SQL-запросов

Одним ΠΈΠ· ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Ρ… Π½Π°Π²Ρ‹ΠΊΠΎΠ² ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с Π±Π°Π·Π°ΠΌΠΈ Π΄Π°Π½Π½Ρ‹Ρ… являСтся ΡƒΠΌΠ΅Π½ΠΈΠ΅ ΠΏΠΈΡΠ°Ρ‚ΡŒ...
admin
23 фСвраля 2017

SQL Π·Π° 20 ΠΌΠΈΠ½ΡƒΡ‚

ΠŸΡ€Π΅Π΄Π»Π°Π³Π°Π΅ΠΌ Π²Π°ΡˆΠ΅ΠΌΡƒ вниманию ΡΡ‚Π°Ρ‚ΡŒΡŽ с ΠΊΡ€ΠΈΡ‡Π°Ρ‰ΠΈΠΌ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ "SQL Π·Π° 20 ΠΌΠΈΠ½ΡƒΡ‚". К...