PostgreSQL рдЕрдБрдЯреАрдкреЕрдЯрд░реНрди: "рдлрдХреНрдд рдПрдХрдЪ рдмрд╛рдХреА рдЕрд╕рд╛рд╡реЗ!"

SQL рдордзреНрдпреЗ, рддреБрдореНрд╣реА "рдХрд╛рдп" рд╕рд╛рдзреНрдп рдХрд░реВ рдЗрдЪреНрдЫрд┐рддрд╛ рдпрд╛рдЪреЗ рд╡рд░реНрдгрди рдХрд░рддрд╛, рддреЗ "рдХрд╕реЗ" рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХреЗрд▓реЗ рдЬрд╛рд╡реЗ рдЕрд╕реЗ рдирд╛рд╣реА. рдореНрд╣рдгреВрди, "рдЬрд╕реЗ рдРрдХрд▓реЗ рдЬрд╛рддреЗ рддрд╕реЗ рддреЗ рдХрд╕реЗ рд▓рд┐рд╣рд┐рд▓реЗ рдЬрд╛рддреЗ" рдпрд╛ рд╢реИрд▓реАрдордзреНрдпреЗ рдПрд╕рдХреНрдпреВрдПрд▓ рдХреНрд╡реЗрд░реА рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдгреНрдпрд╛рдЪреА рд╕рдорд╕реНрдпрд╛ рддреНрдпрд╛рдЪреНрдпрд╛ рд╕рдиреНрдорд╛рдирд╛рдЪреЗ рд╕реНрдерд╛рди рдШреЗрддреЗ. рдПрд╕рдХреНрдпреВрдПрд▓ рдордзреНрдпреЗ рдЧрдгрдирд╛ рдкрд░рд┐рд╕реНрдерд┐рддреАрдЪреА рд╡реИрд╢рд┐рд╖реНрдЯреНрдпреЗ.

рдЖрдЬ, рдЕрддреНрдпрдВрдд рд╕реЛрдкреА рдЙрджрд╛рд╣рд░рдгреЗ рд╡рд╛рдкрд░реВрди, рд╡рд╛рдкрд░рд╛рдЪреНрдпрд╛ рд╕рдВрджрд░реНрднрд╛рдд рдпрд╛рдореБрд│реЗ рдХрд╛рдп рд╣реЛрдК рд╢рдХрддреЗ рддреЗ рдкрд╛рд╣реВ рдпрд╛ GROUP/DISTINCT ╨╕ LIMIT рддреНрдпрд╛рдВрдЪреНрдпрд╛ рд╕реЛрдмрдд.

рдЖрддрд╛, рд╡рд┐рдирдВрддреАрдордзреНрдпреЗ рд▓рд┐рд╣рд┐рд▓реЗ рддрд░ "рдкреНрд░рдердо рд╣реА рдЪрд┐рдиреНрд╣реЗ рдЬреЛрдбрд╛ рдЖрдгрд┐ рдирдВрддрд░ рд╕рд░реНрд╡ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдлреЗрдХреВрди рджреНрдпрд╛, рдлрдХреНрдд рдПрдХ рдмрд╛рдХреА рдЕрд╕рд╛рд╡реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреА рд╕рд╛рдареА рдХреЙрдкреА" - рдХрдиреЗрдХреНрд╢рдирдЪреА рдЕрдЬрд┐рдмрд╛рдд рдЧрд░рдЬ рдирд╕рд▓реА рддрд░реАрд╣реА рд╣реЗ рдХрд╕реЗ рдХрд╛рд░реНрдп рдХрд░реЗрд▓.

рдЖрдгрд┐ рдХрд╛рд╣реАрд╡реЗрд│рд╛ рдЖрдкрдг рднрд╛рдЧреНрдпрд╡рд╛рди рдЖрд╣рд╛рдд рдЖрдгрд┐ рддреЗ "рдлрдХреНрдд рдХрд╛рд░реНрдп рдХрд░рддреЗ", рдХрд╛рд╣реАрд╡реЗрд│рд╛ рддреНрдпрд╛рдЪрд╛ рдХрд╛рд░реНрдпрдкреНрд░рджрд░реНрд╢рдирд╛рд╡рд░ рдЕрдкреНрд░рд┐рдп рдкреНрд░рднрд╛рд╡ рдкрдбрддреЛ рдЖрдгрд┐ рдХрд╛рд╣реАрд╡реЗрд│рд╛ рддреЗ рд╡рд┐рдХрд╛рд╕рдХрд╛рдЪреНрдпрд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдирд╛рддреВрди рдкреВрд░реНрдгрдкрдгреЗ рдЕрдирдкреЗрдХреНрд╖рд┐рдд рдкреНрд░рднрд╛рд╡ рджреЗрддреЗ.

PostgreSQL рдЕрдБрдЯреАрдкреЕрдЯрд░реНрди: "рдлрдХреНрдд рдПрдХрдЪ рдмрд╛рдХреА рдЕрд╕рд╛рд╡реЗ!"
рдмрд░рдВ, рдХрджрд╛рдЪрд┐рдд рдЗрддрдХреЗ рдиреЗрддреНрд░рджреАрдкрдХ рдирд╛рд╣реА, рдкрд░рдВрддреБ ...

"рдЧреЛрдб рдЬреЛрдбрдкреЗ": рд╕рд╛рдореАрд▓ рд╡реНрд╣рд╛ + рд╡реЗрдЧрд│реЗ

SELECT DISTINCT
  X.*
FROM
  X
JOIN
  Y
    ON Y.fk = X.pk
WHERE
  Y.bool_condition;

рддреНрдпрд╛рдВрдирд╛ рдХрд╛рдп рд╣рд╡реЗ рдЖрд╣реЗ рддреЗ рд╕реНрдкрд╖реНрдЯ рд╣реЛрдИрд▓ рд░реЗрдХреЙрд░реНрдб X рдирд┐рд╡рдбрд╛ рдЬреНрдпрд╛рд╕рд╛рдареА Y рдордзреНрдпреЗ рдиреЛрдВрджреА рдЖрд╣реЗрдд рдЬреЗ рдкреВрд░реНрдг рдЭрд╛рд▓реЗрд▓реНрдпрд╛ рд╕реНрдерд┐рддреАрд╢реА рд╕рдВрдмрдВрдзрд┐рдд рдЖрд╣реЗрдд. рджреНрд╡рд╛рд░реЗ рд╡рд┐рдирдВрддреА рд▓рд┐рд╣рд┐рд▓реА JOIN тАФ рдХрд╛рд╣реА pk рд╡реНрд╣реЕрд▓реНрдпреВрдЬ рдЕрдиреЗрдХ рд╡реЗрд│рд╛ рдорд┐рд│рд╛рд▓реНрдпрд╛ (рдирдХреНрдХреА рдХрд┐рддреА рдпреЛрдЧреНрдп рдПрдВрдЯреНрд░реА Y рдордзреНрдпреЗ рджрд┐рд╕рд▓реНрдпрд╛). рдХрд╕реЗ рдХрд╛рдврд╛рдпрдЪреЗ? рдирдХреНрдХреАрдЪ DISTINCT!

рд╣реЗ рд╡рд┐рд╢реЗрд╖рддрдГ "рдЖрдирдВрджрджрд╛рдпрдХ" рдЖрд╣реЗ рдЬреЗрд╡реНрд╣рд╛ рдкреНрд░рддреНрдпреЗрдХ X-рд░реЗрдХреЙрд░реНрдбрд╕рд╛рдареА рдЕрдиреЗрдХ рд╢рдВрднрд░ рд╕рдВрдмрдВрдзрд┐рдд Y-рд░реЗрдХреЙрд░реНрдбреНрд╕ рдЕрд╕рддрд╛рдд рдЖрдгрд┐ рдирдВрддрд░ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рд╡реАрд░рдкрдгреЗ рдХрд╛рдврд▓реЗ рдЬрд╛рддрд╛рдд...

PostgreSQL рдЕрдБрдЯреАрдкреЕрдЯрд░реНрди: "рдлрдХреНрдд рдПрдХрдЪ рдмрд╛рдХреА рдЕрд╕рд╛рд╡реЗ!"

рдирд┐рд░рд╛рдХрд░рдг рдХрд╕реЗ рдХрд░рд╛рд╡реЗ? рд╕реБрд░реБрд╡рд╛рддреАрд▓рд╛, рд▓рдХреНрд╖рд╛рдд рдШреНрдпрд╛ рдХреА рд╕рдорд╕реНрдпрд╛ рд╕реБрдзрд╛рд░рд┐рдд рдХреЗрд▓реА рдЬрд╛рдК рд╢рдХрддреЗ "рдПрдХреНрд╕ рд░реЗрдХреЙрд░реНрдб рдирд┐рд╡рдбрд╛ рдЬреНрдпрд╛рд╕рд╛рдареА Y рдордзреНрдпреЗ рдХрд┐рдорд╛рди рдПрдХ рдкреВрд░реНрдг рдЭрд╛рд▓реЗрд▓реНрдпрд╛ рдЕрдЯреАрд╢реА рд╕рдВрдмрдВрдзрд┐рдд рдЖрд╣реЗ" - рд╢реЗрд╡рдЯреА, рдЖрдореНрд╣рд╛рд▓рд╛ Y-рд░реЗрдХреЙрд░реНрдбрдордзреВрдирдЪ рдХрд╢рд╛рдЪреАрд╣реА рдЧрд░рдЬ рдирд╛рд╣реА.

рдиреЗрд╕реНрдЯреЗрдб рдЕрд╕реНрддрд┐рддреНрд╡рд╛рдд рдЖрд╣реЗ

SELECT
  *
FROM
  X
WHERE
  EXISTS(
    SELECT
      NULL
    FROM
      Y
    WHERE
      fk = X.pk AND
      bool_condition
    LIMIT 1
  );

PostgreSQL рдЪреНрдпрд╛ рдХрд╛рд╣реА рдЖрд╡реГрддреНрддреНрдпрд╛ рд╕рдордЬрддрд╛рдд рдХреА рдЕрд╕реНрддрд┐рддреНрд╡рд╛рдд рдЕрд╕рд▓реЗрд▓реА рдкрд╣рд┐рд▓реА рдПрдВрдЯреНрд░реА рд╢реЛрдзрдгреЗ рдкреБрд░реЗрд╕реЗ рдЖрд╣реЗ, рдЬреБрдиреНрдпрд╛рдВрдирд╛ рдирд╛рд╣реА. рдореНрд╣рдгреВрди рдореА рдиреЗрд╣рдореА рд╕реВрдЪрд┐рдд рдХрд░рдгреЗ рдкрд╕рдВрдд рдХрд░рддреЛ LIMIT 1 рдЖрдд EXISTS.

рдкрд╛рд░реНрд╢реНрд╡ рд╕рд╛рдореАрд▓ рд╡реНрд╣рд╛

SELECT
  X.*
FROM
  X
, LATERAL (
    SELECT
      Y.*
    FROM
      Y
    WHERE
      fk = X.pk AND
      bool_condition
    LIMIT 1
  ) Y
WHERE
  Y IS DISTINCT FROM NULL;

рд╣рд╛рдЪ рдкрд░реНрдпрд╛рдп, рдЖрд╡рд╢реНрдпрдХ рдЕрд╕рд▓реНрдпрд╛рд╕, рд╕рд╛рдкрдбрд▓реЗрд▓реНрдпрд╛ рд╕рдВрдмрдВрдзрд┐рдд Y-рд░реЗрдХреЙрд░реНрдбрдордзреАрд▓ рдХрд╛рд╣реА рдбреЗрдЯрд╛ рддреНрд╡рд░рд┐рдд рдкрд░рдд рдХрд░рдгреНрдпрд╛рд╕ рдЕрдиреБрдорддреА рджреЗрддреЛ. рд▓реЗрдЦрд╛рдд рддрддреНрд╕рдо рдкрд░реНрдпрд╛рдпрд╛рдЪреА рдЪрд░реНрдЪрд╛ рдХреЗрд▓реА рдЖрд╣реЗ "рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдПрд╕рдХреНрдпреВрдПрд▓ рдЕрдБрдЯреАрдкреЕрдЯрд░реНрди: рдПрдХ рджреБрд░реНрдорд┐рд│ рд░реЗрдХреЙрд░реНрдб рдЬреЙрдЗрдирдЪреНрдпрд╛ рдордзреНрдпрднрд╛рдЧреА рдкреЛрд╣реЛрдЪреЗрд▓".

тАЬрдЕрдзрд┐рдХ рдкреИрд╕реЗ рдХрд╛ рджреНрдпрд╛рд╡реЗтАЭ: DISTINCT [рдЪрд╛рд▓реВ] + рдорд░реНрдпрд╛рджрд╛ 1

рдЕрд╢рд╛ рдХреНрд╡реЗрд░реА рдЯреНрд░рд╛рдиреНрд╕рдлреЙрд░реНрдореЗрд╢рдирдЪрд╛ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдлрд╛рдпрджрд╛ рдореНрд╣рдгрдЬреЗ рдЦрд╛рд▓реАрд▓ рдкреНрд░рдХрд░рдгрд╛рдВрдкреНрд░рдорд╛рдгреЗ рдлрдХреНрдд рдПрдХ рдХрд┐рдВрд╡рд╛ рдХрд╛рд╣реА рдЖрд╡рд╢реНрдпрдХ рдЕрд╕рд▓реНрдпрд╛рд╕ рд░реЗрдХреЙрд░реНрдбрдЪрд╛ рд╢реЛрдз рд╕рд╣рдЬрдкрдгреЗ рдорд░реНрдпрд╛рджрд┐рдд рдХрд░рдгреНрдпрд╛рдЪреА рдХреНрд╖рдорддрд╛ рдЖрд╣реЗ:

SELECT DISTINCT ON(X.pk)
  *
FROM
  X
JOIN
  Y
    ON Y.fk = X.pk
LIMIT 1;

рдЖрддрд╛ рдЖрдореНрд╣реА рд╡рд┐рдирдВрддреА рд╡рд╛рдЪрддреЛ рдЖрдгрд┐ рдбреАрдмреАрдПрдордПрд╕ рдХрд╛рдп рдХрд░рдгреНрдпрд╛рдЪрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдЖрд╣реЗ рд╣реЗ рд╕рдордЬреВрди рдШреЗрдгреНрдпрд╛рдЪрд╛ рдкреНрд░рдпрддреНрди рдХрд░рддреЛ:

  • рдЪрд┐рдиреНрд╣реЗ рдЬреЛрдбрдгреЗ
  • X.pk рджреНрд╡рд╛рд░реЗ рдЕрджреНрд╡рд┐рддреАрдп
  • рдЙрд░реНрд╡рд░рд┐рдд рдиреЛрдВрджреАрдВрдордзреВрди, рдПрдХ рдирд┐рд╡рдбрд╛

рдордЧ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдп рдорд┐рд│рд╛рд▓реЗ? "рдлрдХреНрдд рдПрдХ рдкреНрд░рд╡реЗрд╢" рдпреБрдирд┐рдХрдордзреВрди - рдЖрдгрд┐ рдЬрд░ рдЖрдкрдг рд╣реЗ рдЧреИрд░-рдпреБрдирд┐рдХрд╛рдВрдкреИрдХреА рдШреЗрддрд▓реЗ рддрд░ рдкрд░рд┐рдгрд╛рдо рдХрд╕рд╛ рддрд░реА рдмрджрд▓реЗрд▓ рдХрд╛?.. "рдЖрдгрд┐ рдЬрд░ рдХрд╛рд╣реА рдлрд░рдХ рдирд╕реЗрд▓ рддрд░ рдЬрд╛рд╕реНрдд рдкреИрд╕реЗ рдХрд╛ рджреНрдпрд╛рд╡реЗ?"

SELECT
  *
FROM
  (
    SELECT
      *
    FROM
      X
    -- ╤Б╤О╨┤╨░ ╨╝╨╛╨╢╨╜╨╛ ╨┐╨╛╨┤╤Б╤Г╨╜╤Г╤В╤М ╨┐╨╛╨┤╤Е╨╛╨┤╤П╤Й╨╕╤Е ╤Г╤Б╨╗╨╛╨▓╨╕╨╣
    LIMIT 1 -- +1 Limit
  ) X
JOIN
  Y
    ON Y.fk = X.pk
LIMIT 1;

рдЖрдгрд┐ рдЕрдЧрджреА рддреНрдпрд╛рдЪ рд╡рд┐рд╖рдпрд╛рд╕рд╣ GROUP BY + LIMIT 1.

тАЬрдорд▓рд╛ рдлрдХреНрдд рд╡рд┐рдЪрд╛рд░рд╛рдпрдЪреЗ рдЖрд╣реЗтАЭ: рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд GROUP + LIMIT

рддрддреНрд╕рдо рдЧреЛрд╖реНрдЯреА рд╡реЗрдЧрд╡реЗрдЧрд│реНрдпрд╛ рд╡реЗрд│реА рдШрдбрддрд╛рдд рдЧреИрд░-рд░рд┐рдХреНрддрддрд╛ рддрдкрд╛рд╕рдгреА рд╡рд┐рдирдВрддреА рдкреБрдвреЗ рдЬрд╛рдд рдЕрд╕рддрд╛рдирд╛ рдЪрд┐рдиреНрд╣реЗ рдХрд┐рдВрд╡рд╛ CTE:

...
CASE
  WHEN (
    SELECT
      count(*)
    FROM
      X
    LIMIT 1
  ) = 0 THEN ...

рдПрдХреВрдг рдХрд╛рд░реНрдпреЗ (count/min/max/sum/...) рдЕрдЧрджреА рд╕реНрдкрд╖реНрдЯ рдирд┐рд░реНрджреЗрд╢рд╛рдВрд╢рд┐рд╡рд╛рдп рд╕рдВрдкреВрд░реНрдг рд╕реЗрдЯрд╡рд░ рдпрд╢рд╕реНрд╡реАрд░рд┐рддреНрдпрд╛ рдЕрдВрдорд▓рд╛рдд рдЖрдгрд▓реЗ рдЬрд╛рддрд╛рдд GROUP BY. рдлрдХреНрдд рд╕рд╣ LIMIT рддреЗ рдлрд╛рд░ рдореИрддреНрд░реАрдкреВрд░реНрдг рдирд╛рд╣реАрдд.

рд╡рд┐рдХрд╛рд╕рдХ рд╡рд┐рдЪрд╛рд░ рдХрд░реВ рд╢рдХрддреЛ "рдЬрд░ рддреЗрдереЗ рд░реЗрдХреЙрд░реНрдб рдЕрд╕рддреАрд▓ рддрд░ рдорд▓рд╛ LIMIT рдкреЗрдХреНрд╖рд╛ рдЬрд╛рд╕реНрдд рдЧрд░рдЬ рдирд╛рд╣реА". рдкрдг рдЕрд╕реЗ рдХрд░реВ рдирдХрд╛! рдХрд╛рд░рдг рдмреЗрд╕рд╕рд╛рдареА рддреЗ рдЖрд╣реЗ:

  • рддреНрдпрд╛рдВрдирд╛ рдХрд╛рдп рд╣рд╡реЗ рдЖрд╣реЗ рддреЗ рдореЛрдЬрд╛ рд╕рд░реНрд╡ рдиреЛрдВрджреАрдиреБрд╕рд╛рд░
  • рддреЗ рдорд╛рдЧрддреАрд▓ рддрд┐рддрдХреНрдпрд╛ рдУрд│реА рджреНрдпрд╛

рд▓рдХреНрд╖реНрдп рдкрд░рд┐рд╕реНрдерд┐рддреАрдиреБрд╕рд╛рд░, рдЦрд╛рд▓реАрд▓рдкреИрдХреА рдПрдХ рдкрд░реНрдпрд╛рдп рдХрд░рдгреЗ рдпреЛрдЧреНрдп рдЖрд╣реЗ:

  • (count + LIMIT 1) = 0 рд╡рд░ NOT EXISTS(LIMIT 1)
  • (count + LIMIT 1) > 0 рд╡рд░ EXISTS(LIMIT 1)
  • count >= N рд╡рд░ (SELECT count(*) FROM (... LIMIT N))

тАЬрдЧреНрд░реЕрдордордзреНрдпреЗ рд╡рдЬрди рдХрд┐рддреА рдЕрд╕рд╛рд╡реЗтАЭ: DISTINCT + LIMIT

SELECT DISTINCT
  pk
FROM
  X
LIMIT $1

рдПрдХ рднреЛрд│рд╛ рд╡рд┐рдХрд╛рд╕рдХ рдкреНрд░рд╛рдорд╛рдгрд┐рдХрдкрдгреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдареЗрд╡реВ рд╢рдХрддреЛ рдХреА рд╡рд┐рдирдВрддреАрдЪреА рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреА рдерд╛рдВрдмреЗрд▓. рдЖрдореНтАНрд╣рд╛рд▓рд╛ рд╕рдореЛрд░ рдпреЗрдгрд╛рд░реНтАНрдпрд╛ рдкреНрд░рдердо рднрд┐рдиреНрди рдореВрд▓реНрдпрд╛рдВрдкреИрдХреА $1 рд╕рд╛рдкрдбрддреЛ.

рднрд╡рд┐рд╖реНрдпрд╛рдд рдХрдзреАрддрд░реА рд╣реЗ рдирд╡реАрди рдиреЛрдбрдореБрд│реЗ рдХрд╛рд░реНрдп рдХрд░реВ рд╢рдХрддреЗ рдЖрдгрд┐ рдХрд░реЗрд▓ рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рд╕реНрдХрд┐рдк рд╕реНрдХреЕрди, рдЬреНрдпрд╛рдЪреНрдпрд╛ рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреАрд╡рд░ рд╕рдзреНрдпрд╛ рдХрд╛рдо рдХреЗрд▓реЗ рдЬрд╛рдд рдЖрд╣реЗ, рдкрд░рдВрддреБ рдЕрджреНрдпрд╛рдк рдирд╛рд╣реА.

рдЖрддреНрддрд╛рд╕рд╛рдареА рдкреНрд░рдердо рд╕рд░реНрд╡ рд░реЗрдХреЙрд░реНрдб рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрдд рдХреЗрд▓реЗ рдЬрд╛рддреАрд▓, рдЕрджреНрд╡рд┐рддреАрдп рдЖрд╣реЗрдд рдЖрдгрд┐ рдХреЗрд╡рд│ рддреНрдпрд╛рдВрдЪреНрдпрд╛рдХрдбреВрди рд╡рд┐рдирдВрддреА рдХреЗрд▓реЗрд▓реА рд░рдХреНрдХрдо рдкрд░рдд рдХреЗрд▓реА рдЬрд╛рдИрд▓. рдЖрдореНрд╣рд╛рд▓рд╛ рдЕрд╕реЗ рдХрд╛рд╣реАрддрд░реА рд╣рд╡реЗ рдЕрд╕рд▓реНрдпрд╛рд╕ рд╣реЗ рд╡рд┐рд╢реЗрд╖рддрдГ рджреБрдГрдЦреА рдЖрд╣реЗ $ 1 = 4, рдЖрдгрд┐ рдЯреЗрдмрд▓рдордзреНрдпреЗ рд╢реЗрдХрдбреЛ рд╣рдЬрд╛рд░реЛ рд░реЗрдХреЙрд░реНрдб рдЖрд╣реЗрдд...

рд╡реНрдпрд░реНрде рджреБрдГрдЦреА рд╣реЛрдК рдирдпреЗ рдореНрд╣рдгреВрди, рдПрдХ рдЖрд╡рд░реНрддреА рдХреНрд╡реЗрд░реА рд╡рд╛рдкрд░реВ PostgreSQL Wiki рд╡рд░реВрди "DISTINCT рдЧрд░реАрдмрд╛рдВрд╕рд╛рдареА рдЖрд╣реЗ".:

PostgreSQL рдЕрдБрдЯреАрдкреЕрдЯрд░реНрди: "рдлрдХреНрдд рдПрдХрдЪ рдмрд╛рдХреА рдЕрд╕рд╛рд╡реЗ!"

рд╕реНрддреНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╛