28 апрСля 2022

πŸ—„οΈ βœ”οΈ 10 Π»ΡƒΡ‡ΡˆΠΈΡ… ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊ написания SQL-запросов

iOS-developer, ИВ-ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‡ΠΈΡ†Π°, ΠΏΠΈΡˆΡƒ ΡΡ‚Π°Ρ‚ΡŒΠΈ ΠΈ Π³Π°ΠΉΠ΄Ρ‹.
ДСлимся рСкомСндациями ΠΏΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡŽ распространСнных ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ с SQL, с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ часто ΡΡ‚Π°Π»ΠΊΠΈΠ²Π°ΡŽΡ‚ΡΡ спСциалисты ΠΏΠΎ Ρ€Π°Π±ΠΎΡ‚Π΅ с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ.
πŸ—„οΈ βœ”οΈ 10 Π»ΡƒΡ‡ΡˆΠΈΡ… ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊ написания SQL-запросов
Π‘Ρ‚Π°Ρ‚ΡŒΡ являСтся ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΎΠΌ. ΠžΡ€ΠΈΠ³ΠΈΠ½Π°Π» доступСн ΠΏΠΎ ссылкС.

Π― Ρ€Π°Π±ΠΎΡ‚Π°ΡŽ с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ ΡƒΠΆΠ΅ 3 Π³ΠΎΠ΄Π°, ΠΈ мСня Π΄ΠΎ сих ΠΏΠΎΡ€ удивляСт, Ρ‡Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ люди, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ хотят ΡΡ‚Π°Ρ‚ΡŒ Π°Π½Π°Π»ΠΈΡ‚ΠΈΠΊΠ°ΠΌΠΈ, практичСски Π½Π΅ зная SQL. Π₯ΠΎΡ‡Ρƒ особо ΠΏΠΎΠ΄Ρ‡Π΅Ρ€ΠΊΠ½ΡƒΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ SQL являСтся Ρ„ΡƒΠ½Π΄Π°ΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Ρ‹ΠΌ языком нСзависимо ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ΅ΠΌ Π²Ρ‹ Π±ΡƒΠ΄Π΅Ρ‚Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π² сфСрС Π°Π½Π°Π»ΠΈΠ·Π° Π΄Π°Π½Π½Ρ‹Ρ….

ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, я Π²ΠΈΠ΄Π΅Π» ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ, ΠΊΠΎΠ³Π΄Π° люди, ΠΎΠ±Π»Π°Π΄Π°ΡŽΡ‰ΠΈΠ΅ Π²ΠΏΠ΅Ρ‡Π°Ρ‚Π»ΡΡŽΡ‰ΠΈΠΌΠΈ знаниями Π² Π΄Ρ€ΡƒΠ³ΠΈΡ… областях, ΠΏΠΎΠΌΠΈΠΌΠΎ SQL, ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ, Π½ΠΎ ΠΏΡ€ΠΈ этом послС получСния ΠΎΡ„Ρ„Π΅Ρ€Π° ΠΈΠΌ всС Ρ€Π°Π²Π½ΠΎ приходится ΠΈΠ·ΡƒΡ‡Π°Ρ‚ΡŒ SQL. Π― Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΡ‡Ρ‚ΠΈ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ профСссионалом Π² сфСрС Π°Π½Π°Π»ΠΈΠ·Π° Π΄Π°Π½Π½Ρ‹Ρ… Π±Π΅Π· Π·Π½Π°Π½ΠΈΠΉ SQL.

Π”Π°Π½Π½Ρ‹Π΅ совСты ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Ρ‹ для всСх спСциалистов, нСзависимо ΠΎΡ‚ ΠΎΠΏΡ‹Ρ‚Π°. Π― пСрСчислил самыС распространСнныС случаи Π² ΠΌΠΎΠ΅ΠΉ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅, размСстив Π² порядкС возрастания слоТности.

Для ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² я Π±ΡƒΠ΄Ρƒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ… SQLite: sql-practice.com

1. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅

        SELECT count(*), count(distinct patient_id) FROM patients

    

Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ, ΠΊΠ°ΠΊ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, являСтся Π»ΠΈ ваш столбСц ΠΏΠ΅Ρ€Π²ΠΈΡ‡Π½Ρ‹ΠΌ ΠΊΠ»ΡŽΡ‡ΠΎΠΌ Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅. ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, это ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² создаваСмых Π²Π°ΠΌΠΈ Ρ‚Π°Π±Π»ΠΈΡ†Π°Ρ…, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π² Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ Π±Π°Π· Π΄Π°Π½Π½Ρ‹Ρ… Π΅ΡΡ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π²ΠΈΡ‡Π½Ρ‹ΠΉ ΠΊΠ»ΡŽΡ‡ Π² ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ схСмы.

Если числа ΠΈΠ· Π΄Π²ΡƒΡ… столбцов Ρ€Π°Π²Π½Ρ‹, Ρ‚ΠΎ столбСц, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹ подсчитали Π²ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΉ части запроса, ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠ΅Ρ€Π²ΠΈΡ‡Π½Ρ‹ΠΌ ΠΊΠ»ΡŽΡ‡ΠΎΠΌ. Π­Ρ‚ΠΎ Π½Π΅ всСгда являСтся Π³Π°Ρ€Π°Π½Ρ‚ΠΈΠ΅ΠΉ, Π½ΠΎ ΠΈΠ½ΠΎΠ³Π΄Π° ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΌΠΎΡ‡ΡŒ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ.

Однако становится Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ слоТнСС, ΠΊΠΎΠ³Π΄Π° Ρƒ вас Π΅ΡΡ‚ΡŒ нСсколько столбцов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ ΠΏΠ΅Ρ€Π²ΠΈΡ‡Π½Ρ‹ΠΉ ΠΊΠ»ΡŽΡ‡. Π§Ρ‚ΠΎΠ±Ρ‹ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ эту ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ, просто ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΠΈΡ‚Π΅ столбцы, ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠ΅ ΠΏΠ΅Ρ€Π²ΠΈΡ‡Π½Ρ‹ΠΉ ΠΊΠ»ΡŽΡ‡, послС ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ³ΠΎ слова DISTINCT. ΠŸΡ€ΠΎΡΡ‚ΠΎΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ β€” объСдинСниС ΠΈΠΌΠ΅Π½ΠΈ ΠΈ Ρ„Π°ΠΌΠΈΠ»ΠΈΠΈ для создания ΠΏΠ΅Ρ€Π²ΠΈΡ‡Π½ΠΎΠ³ΠΎ ΠΊΠ»ΡŽΡ‡Π°.

        SELECT count(*), count(distinct first_name || last_name) FROM patients
    

2. Поиск ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡŽΡ‰ΠΈΡ…ΡΡ записСй

        SELECT 
    first_name 
    , count(*) as ct
    
FROM patients
GROUP BY
    first_name
HAVING
    count(*) > 1
ORDER BY 
    COUNT(*) DESC
;
    

Π’Π°Π±Π»ΠΈΡ†Π° ΠΈΠ· ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° β€” это упрощСнная вСрсия Π±Π°Π· Π΄Π°Π½Π½Ρ‹Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ Π±ΡƒΠ΄Π΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² своСй Ρ€Π°Π±ΠΎΡ‚Π΅. Π’ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ случаСв Π²Ρ‹ Π·Π°Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Π²Ρ‹ΡΡΠ½ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρ‹ дублирования Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π² Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ…. Для этого Π²Π°ΠΌ пригодится Π΄Π°Π½Π½Ρ‹ΠΉ запрос.

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово HAVING для сортировки ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡŽΡ‰ΠΈΡ…ΡΡ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ. Π’ Ρ‚Π°ΠΊΠΎΠΌ случаС Π²Ρ‹ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ Ρ‡Π°Ρ‰Π΅ всСго дублируСтся имя Π”ΠΆΠΎΠ½. Π—Π°Ρ‚Π΅ΠΌ Π²Ρ‹ запуститС Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ запрос, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρƒ ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡŽΡ‰ΠΈΡ…ΡΡ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, ΠΈ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ всС ΠΏΠ°Ρ†ΠΈΠ΅Π½Ρ‚Ρ‹ ΠΈΠΌΠ΅ΡŽΡ‚ Ρ€Π°Π·Π½Ρ‹Π΅ Ρ„Π°ΠΌΠΈΠ»ΠΈΠΈ ΠΈ ID.

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

3. ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° NULL с DISTINCT

        with new_table as (
select patient_id from patients
UNION
select null
)

select 
    count(*)
  , count(distinct patient_id)
  , count(patient_id) 

from new_table
    

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ запроса Π±ΡƒΠ΄Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 4531 для столбца COUNT(*) ΠΈ 4530 для Π΄Π²ΡƒΡ… ΠΎΡΡ‚Π°Π²ΡˆΠΈΡ…ΡΡ столбцов. Когда Π²Ρ‹ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚Π΅ столбСц, ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово COUNT ΠΈΡΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π½ΡƒΠ»Π΅Π²Ρ‹Π΅ значСния. Однако, ΠΏΡ€ΠΈ использовании Π·Π²Π΅Π·Π΄ΠΎΡ‡ΠΊΠΈ Π² подсчСт Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ΡΡ значСния NULL. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠ±ΠΈΠ²Π°Ρ‚ΡŒ с Ρ‚ΠΎΠ»ΠΊΡƒ ΠΏΡ€ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ΅, являСтся Π»ΠΈ столбСц ΠΏΠ΅Ρ€Π²ΠΈΡ‡Π½Ρ‹ΠΌ ΠΊΠ»ΡŽΡ‡ΠΎΠΌ, поэтому я посчитал Π½ΡƒΠΆΠ½Ρ‹ΠΌ ΡƒΠΏΠΎΠΌΡΠ½ΡƒΡ‚ΡŒ ΠΎΠ± этом.

4. CTE > ΠŸΠΎΠ΄Π·Π°ΠΏΡ€ΠΎΡΡ‹

        -- Use of CTE
with combined_table as (
select
  *
 
FROM patients p
JOIN admissions a 
  on p.patient_id = a.patient_id
)

, name_most_admissions as (
select
    first_name || ' ' || last_name as full_name
  , count(*)                       as admission_ct
  
FROM combined_table
)

select * from name_most_admissions
;

-- Use of sub-queries :(
select * from 
   (select
        first_name || ' ' || last_name as full_name
      , count(*)                       as admission_ct
  
    FROM (select
             *
 
          FROM patients p
          JOIN admissions a 
              on p.patient_id = a.patient_id
          ) combined_table
    ) name_most_admissions
;
    

Когда я Π²ΠΏΠ΅Ρ€Π²Ρ‹Π΅ Π½Π°Ρ‡Π°Π» Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π°Π½Π°Π»ΠΈΡ‚ΠΈΠΊΠΎΠΌ Π΄Π°Π½Π½Ρ‹Ρ… 3 Π³ΠΎΠ΄Π° Π½Π°Π·Π°Π΄, я писал SQL-запросы с большим количСством подзапросов, Ρ‡Π΅ΠΌ это Π±Ρ‹Π»ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ. Π― быстро понял, Ρ‡Ρ‚ΠΎ это Π½Π΅ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ Ρ‡ΠΈΡ‚Π°Π±Π΅Π»ΡŒΠ½ΠΎΠΌΡƒ ΠΊΠΎΠ΄Ρƒ. Π’ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ ситуаций Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±Ρ‰Π΅Π΅ Ρ‚Π°Π±Π»ΠΈΡ‡Π½ΠΎΠ΅ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ вмСсто подзапроса. Π—Π°Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΡƒΠΉΡ‚Π΅ подзапросы для однострочников, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ.

5. ИспользованиС SUM ΠΈ CASE WHEN вмСстС

        select 
     sum(case when allergies = 'Penicillin' and city = 'Burlington' then 1 else 0 end) as allergies_burl
   , sum(case when allergies = 'Penicillin' and city = 'Oakville' then 1 else 0 end)   as allergies_oak
  
from patients
    

ΠŸΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ WHERE ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ, Ссли Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΡΡƒΠΌΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ количСство ΠΏΠ°Ρ†ΠΈΠ΅Π½Ρ‚ΠΎΠ², ΠΎΡ‚Π²Π΅Ρ‡Π°ΡŽΡ‰ΠΈΡ… ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌ условиям. Но Ссли Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ нСсколько условий, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова SUM ΠΈ CASE WHEN вмСстС. Π­Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ ΠΊΠΎΠ΄ Π»Π°ΠΊΠΎΠ½ΠΈΡ‡Π½Ρ‹ΠΌ ΠΈ Π»Π΅Π³ΠΊΠΎ Ρ‡ΠΈΡ‚Π°Π΅ΠΌΡ‹ΠΌ.

Π”Π°Π½Π½ΡƒΡŽ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΡŽ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ WHERE, ΠΊΠ°ΠΊ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π½ΠΈΠΆΠ΅.

        select
  * 
FROM patients
WHERE TRUE
  and 1 = (case when allergies = 'Penicillin' and city = 'Burlington' then 1 else 0 end)
    

6. Π‘ΡƒΠ΄ΡŒΡ‚Π΅ остороТны с Π΄Π°Ρ‚Π°ΠΌΠΈ

        with new_table as (
select
    patient_id
  , first_name
  , last_name
  , time(birth_date, '+1 second') as birth_date

from patients
where TRUE
   and patient_id = 1

UNION
  
select
    patient_id
  , first_name
  , last_name
  , birth_date 

from patients
WHERE TRUE
  and patient_id != 1
)

select 
  birth_date 
  
from new_table 
where TRUE 
  and birth_date between '1953-12-05' and '1953-12-06'
    

Π’ этой Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… всС Π΄Π°Ρ‚Ρ‹ сокращСны Π΄ΠΎ дня. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ всС значСния Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ столбца Birthday_date Π² этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Ρ€Π°Π²Π½Ρ‹ 00:00:00. Однако Π² Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Ρ… Π½Π°Π±ΠΎΡ€Π°Ρ… Π΄Π°Π½Π½Ρ‹Ρ… это ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π½Π΅ Ρ‚Π°ΠΊ.

Π’ зависимости ΠΎΡ‚ срСды Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ SQL ваши настройки ΠΌΠΎΠ³ΡƒΡ‚ ΡΠΊΡ€Ρ‹Ρ‚ΡŒ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. Но Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ врСмя скрыто, Π½Π΅ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΎ Π½Π΅ являСтся Ρ‡Π°ΡΡ‚ΡŒΡŽ Π΄Π°Π½Π½Ρ‹Ρ….

Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π²Ρ‹ΡˆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ я искусствСнно Π΄ΠΎΠ±Π°Π²ΠΈΠ» сСкунду ΠΊ ΠΏΠ°Ρ†ΠΈΠ΅Π½Ρ‚Ρƒ β„–1. Как Π²ΠΈΠ΄ΠΈΡ‚Π΅, этой 1-ΠΉ сСкунды Π±Ρ‹Π»ΠΎ достаточно, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΏΠ°Ρ†ΠΈΠ΅Π½Ρ‚Π° ΠΈΠ· Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² ΠΏΡ€ΠΈ использовании ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ³ΠΎ слова BETWEEN.

Π•Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ распространСнный ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ‡Π°Ρ‰Π΅ всСго ΡƒΠΏΡƒΡΠΊΠ°ΡŽΡ‚ ΠΈΠ· Π²ΠΈΠ΄Π° спСциалисты ΠΏΠΎ Ρ€Π°Π±ΠΎΡ‚Π΅ с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ, β€” это присоСдинСниС ΠΊ Π΄Π°Ρ‚Π°ΠΌ, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… всС Π΅Ρ‰Π΅ Π΅ΡΡ‚ΡŒ Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚. Π’ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ случаСв ΠΎΠ½ΠΈ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΡ‹Ρ‚Π°ΡŽΡ‚ΡΡ ΠΏΡ€ΠΈΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒΡΡ ΠΊ столбцам с сокращСнной Π΄Π°Ρ‚ΠΎΠΉ ΠΈ, Π² ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΌ ΠΈΡ‚ΠΎΠ³Π΅, Π½Π΅ ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‚ ΠΆΠ΅Π»Π°Π΅ΠΌΠΎΠ³ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° ΠΈΠ»ΠΈ, Ρ‡Ρ‚ΠΎ Π΅Ρ‰Π΅ Ρ…ΡƒΠΆΠ΅, ΠΎΠ½ΠΈ Π½Π΅ ΠΎΡΠΎΠ·Π½Π°ΡŽΡ‚, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚.

7. НС Π·Π°Π±Ρ‹Π²Π°ΠΉΡ‚Π΅ ΠΎΠ± ΠΎΠΊΠΎΠ½Π½Ρ‹Ρ… функциях

        select
    p.*
  , MAX(weight) over (partition by city) as maxwt_by_city
   
 from patients p
    

ΠžΠΊΠΎΠ½Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ β€” ΠΎΡ‚Π»ΠΈΡ‡Π½Ρ‹ΠΉ способ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ всС строки Π΄Π°Π½Π½Ρ‹Ρ…, Π° Π·Π°Ρ‚Π΅ΠΌ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ столбСц с Π²Π°ΠΆΠ½Ρ‹ΠΌΠΈ Π°Π³Ρ€Π΅Π³Π°Ρ‚Π½Ρ‹ΠΌΠΈ свСдСниями. Π’ этом случаС ΠΌΡ‹ смогли ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ всС Π΄Π°Π½Π½Ρ‹Π΅ ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ вСс ΠΏΠΎ столбцу Π³ΠΎΡ€ΠΎΠ΄Π°.

Π― Π²ΠΈΠ΄Π΅Π», ΠΊΠ°ΠΊ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π°Π½Π°Π»ΠΈΡ‚ΠΈΠΊΠΈ ΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Π»ΠΈ ΠΎΠ±Ρ…ΠΎΠ΄Π½Ρ‹Π΅ ΠΏΡƒΡ‚ΠΈ, ΠΊΠΎΠ³Π΄Π° оконная функция Π΄Π΅Π»Π°Π»Π° ΠΊΠΎΠ΄ ΠΊΠΎΡ€ΠΎΡ‡Π΅ ΠΈ Ρ‡ΠΈΡ‚Π°Π±Π΅Π»ΡŒΠ½Π΅Π΅ ΠΈ, скорСС всСго, Ρ‚Π°ΠΊΠΆΠ΅ экономила ΠΈΠΌ врСмя.

БущСствуСт мноТСство Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΎΠΊΠΎΠ½Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, Π½ΠΎ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ Π²Ρ‹ΡˆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ являСтся распространСнным ΠΈ простым Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠΌ использования.

8. По возмоТности ΠΈΠ·Π±Π΅Π³Π°ΠΉΡ‚Π΅ DISTINCT

ПослСдниС 3 совСта Π½Π΅ содСрТат ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°, Π½ΠΎ ΠΎΠ½ΠΈ Ρ‚Π°ΠΊ ΠΆΠ΅ Π²Π°ΠΆΠ½Ρ‹, ΠΊΠ°ΠΊ ΠΈ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Π΅ Π²Ρ‹ΡˆΠ΅. По ΠΌΠΎΠ΅ΠΌΡƒ ΠΎΠΏΡ‹Ρ‚Ρƒ, спСциалисты ΠΏΠΎ Ρ€Π°Π±ΠΎΡ‚Π΅ с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ слишком часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ distinct, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π΄ΡƒΠ±Π»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅, Π½Π΅ Ρ€Π°Π·Π±ΠΈΡ€Π°ΡΡΡŒ Π² ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π΅.

Π­Ρ‚ΠΎ ошибка. Если Π²Ρ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ с самого Π½Π°Ρ‡Π°Π»Π° ΠΎΠ±ΡŠΡΡΠ½ΠΈΡ‚ΡŒ, ΠΏΠΎΡ‡Π΅ΠΌΡƒ Π² Π΄Π°Π½Π½Ρ‹Ρ… Π΅ΡΡ‚ΡŒ Π΄ΡƒΠ±Π»ΠΈΠΊΠ°Ρ‚Ρ‹, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π²Ρ‹ ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΠ»ΠΈ ΠΈΠ· своСго Π°Π½Π°Π»ΠΈΠ·Π° ΠΊΠ°ΠΊΡƒΡŽ-Ρ‚ΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ. Π’Ρ‹ всСгда Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ Π² состоянии ΠΎΠ±ΡŠΡΡΠ½ΠΈΡ‚ΡŒ, ΠΏΠΎΡ‡Π΅ΠΌΡƒ Π²Ρ‹ ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅Ρ‚Π΅ distinct Π² Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ ΠΈ ΠΏΠΎΡ‡Π΅ΠΌΡƒ Π΅ΡΡ‚ΡŒ Π΄ΡƒΠ±Π»ΠΈΠΊΠ°Ρ‚Ρ‹. ИспользованиС WHERE ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Ρ‚ΠΈΡ‚Π΅Π»ΡŒΠ½Π΅Π΅, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΈΡΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ.

9. Π€ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ SQL

Об этом сказано довольно ΠΌΠ½ΠΎΠ³ΠΎ, Π½ΠΎ стоит ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΠΈΡ‚ΡŒ. ΠžΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΎΡ‚Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΡƒΠΉΡ‚Π΅ SQL. Π›ΡƒΡ‡ΡˆΠ΅ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ большС строк с Ρ…ΠΎΡ€ΠΎΡˆΠΈΠΌ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ, Ρ‡Π΅ΠΌ ΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ ΡΠΆΠ°Ρ‚ΡŒ вСсь ΠΊΠΎΠ΄ всСго Π² нСсколько строк. Π­Ρ‚ΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ ΡƒΡΠΊΠΎΡ€ΠΈΡ‚ΡŒ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ.

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ… я использовал TRUE Π² WHERE Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ. Π­Ρ‚ΠΎ Π±Ρ‹Π»ΠΎ сдСлано для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ всС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ Π² Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ WHERE Π½Π°Ρ‡ΠΈΠ½Π°Π»ΠΈΡΡŒ с AND. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‚ΡΡ с ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ мСста.

Π•Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ быстрый совСт β€” Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ запятыС Π² Π½Π°Ρ‡Π°Π»Π΅ столбца Π² Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ SELECT. Π­Ρ‚ΠΎ позволяСт Π»Π΅Π³ΠΊΠΎ Π½Π°ΠΉΡ‚ΠΈ ΠΏΡ€ΠΎΠΏΡƒΡ‰Π΅Π½Π½Ρ‹Π΅ запятыС, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ всС ΠΎΠ½ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ упорядочСны.

10. Π‘ΠΎΠ²Π΅Ρ‚ ΠΏΠΎ ΠΎΡ‚Π»Π°Π΄ΠΊΠ΅

НСкоторыС SQL-запросы ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΡ‡Π΅Π½ΡŒ слоТными для ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ. Π§Ρ‚ΠΎ ΠΌΠ½Π΅ большС всСго ΠΏΠΎΠΌΠΎΠ³Π»ΠΎ, ΠΊΠΎΠ³Π΄Π° я сталкивался с этим Π² ΠΏΡ€ΠΎΡˆΠ»ΠΎΠΌ, Ρ‚Π°ΠΊ это Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ я ΠΎΡ‡Π΅Π½ΡŒ усСрдно Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π» свои шаги.

Π§Ρ‚ΠΎΠ±Ρ‹ Π·Π°Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ шаги, я ΠΏΡ€ΠΎΠ½ΡƒΠΌΠ΅Ρ€ΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ ΠΊΠΎΠ΄Π° Π² коммСнтариях ΠΏΠ΅Ρ€Π΅Π΄ запросом. ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ описываСт, Ρ‡Ρ‚ΠΎ я ΠΏΡ‹Ρ‚Π°ΡŽΡΡŒ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π² этом Ρ€Π°Π·Π΄Π΅Π»Π΅ запроса. Π—Π°Ρ‚Π΅ΠΌ я Π½Π°ΠΏΠΈΡˆΡƒ свой ΠΎΡ‚Π²Π΅Ρ‚ ΠΏΠΎΠ΄ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠΌ коммСнтария послС выполнСния запроса.

Π’ΠΎ врСмя ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π»Π΅Π³ΠΊΠΎ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ ΡƒΠΆΠ΅ ΠΏΠΎΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Π»ΠΈ, ΠΈ я ΠΎΠ±Π΅Ρ‰Π°ΡŽ, Ρ‡Ρ‚ΠΎ с Ρ‚Π°ΠΊΠΈΠΌ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΎΠΌ Π²Ρ‹ Ρ€Π΅ΡˆΠΈΡ‚Π΅ эту ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ быстрСС.

***

НадСюсь, Π²Ρ‹ ΡƒΠ·Π½Π°Π»ΠΈ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠ΅ ΠΈΠ· ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Ρ… Π²Ρ‹ΡˆΠ΅ совСтов. КакиС ΠΈΠ· Π½ΠΈΡ… Π²Ρ‹ нашли Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΌΠΈ? ΠœΡ‹ Ρ‚Π°ΠΊΠΆΠ΅ с Π½Π΅Ρ‚Π΅Ρ€ΠΏΠ΅Π½ΠΈΠ΅ΠΌ ΠΆΠ΄Π΅ΠΌ Π²Π°ΡˆΠΈΡ… совСтов ΠΈ, поТалуйста, Π΄Π°ΠΉΡ‚Π΅ ссылки Π½Π° Π»ΡŽΠ±Ρ‹Π΅ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Π΅ ΡΡ‚Π°Ρ‚ΡŒΠΈ Π² коммСнтариях, спасибо!

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

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊΠΈ

ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ

 
 

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

LIVE >

Подпишись

Π½Π° push-увСдомлСния