TeamQuest Blog

Popularne błędy w zapytaniach SQL

Popularne błędy w zapytaniach SQL

Marcin Sarna , 29.12.2020 r.

Sprawdź czy Ci się nie zdarzają.

Tytułem wstępu

Pochylmy się nad niektórymi typowymi ale ignorowanymi błędami w składni SQL. Opiszemy je szczegółowo za pomocą hipotetycznych tabel, a także podamy poprawki. Weźmy taki hipotetyczny przykład biznesowy: załóżmy, że jesteś w zespole obsługi sklepu i musisz wykonać kilka prostych zapytań w bazie danych. Masz dwie tabele o nazwie „product” i „discount”. W tabeli product mamy product_id (np. 1), product_name (np. B), product_subcategory (np. earphone), brand (np. Sony), category (np. electronics) i price (np. 120). W tabeli discount znajdują się zaś: product_id (np. 1), discount_amount (np. 10) i offer_valid_till (np. 2020/12/31).

Liczymy nulle

Gdy musisz policzyć także wartości null w danej kolumnie, musisz być świadomy tego jak dokładnie działa COUNT. Załóżmy, że chcesz policzyć ilość produktów, nawet jeżeli klucz główny product_id nie istnieje dla danego produktu (co oczywiście zasadniczo nie powinno się wydarzyć…). Przyjmijmy, że mamy 4 takie wiersze z czego dla jednego z nich brakuje product_id. Zapytajmy:

SELECT COUNT(product_id)
FROM product;

Zapytanie powinno zwrócić cztery bo oczekiwaliśmy policzenia także nulla, prawda? To czemu dostajemy trzy? COUNT() nie liczy tymczasem nulli. Powinniśmy użyć COUNT(*):

Select Count(*)
From product;

Sprawdź oferty pracy na TeamQuest

Używamy zastrzeżonego słowa jako nazwy kolumny

Załóżmy, że chcemy utworzyć kolumnę rank:

SELECT product_id,
RANK() OVER (ORDER BY price desc) As Rank
FROM product;

„Nie da się” – słowo „Rank” jest zastrzeżone dla funkcji RANK(). Jak sobie z tym poradzić?

SELECT product_id,
RANK() OVER (ORDER BY price desc) As ‘Rank’
FROM product;

Nulla nie porównasz „równasiem”

Zapytanie jak poniżej zwróci wyjątek:

SELECT product_name
FROM product
WHERE product_id=NULL;

Nie można bowiem porównywać za pomocą „=” lub „!=” wartości z nullem. Takie zapytanie nie brzmi bowiem – jak chcielibyśmy – „czy wartość w kolumnie product_id jest NULLem” ale tak naprawdę zapytaliśmy o to czy wartość jest równa NULL. A tak to należało zrobić prawidłowo:

SELECT product_name
FROM product
WHERE product_id ISNULL;

BETWEEN to obejmuje także daty wskazane jako zakres

Załóżmy, że chcemy znaleźć wszystkie oferty wygasające w ciągu roku 2019:

SELECT *
FROM discount
WHERE offer_valid_till BETWEEN ‘2019/01/01’ AND ‘2020/01/01’
ORDER BY offer_valid_till;

Dobrze, prawda? Nie. Dostaniemy w odpowiedzi także 1 stycznia 2020 roku. Dlaczego tak? Bo BETWEEN wyszukuje nie „pomiędzy” wskazanymi datami ale także z ich uwzględnieniem (jest to tzw. inclusive search). Należy więc po prostu zmienić zakres zapytania:

SELECT *
FROM discount
WHERE offer_valid_till BETWEEN ‘2019/01/01’ AND ‘2019/12/31’
ORDER BY offer_valid_till;
.

Najnowsze oferty pracy:

Polecane wpisy na blogu IT:

Szukasz pracownika IT?

Dostarczymy Ci najlepszych specjalistów z branży IT. Wyślij zapytanie

Wyrażam zgodę TeamQuest Sp. z o.o. na przetwarzanie moich danych osobowych w celu marketingu produktów i usług własnych TeamQuest, w tym na kontaktowanie się ze mną w formie połączenia telefonicznego lub środkami elektronicznymi.
Administratorem podanych przez Ciebie danych osobowych jest TeamQuest Sp. z o.o., z siedzibą w Warszawie (00-814), ul. Miedziana 3a/21, zwana dalej „Administratorem".
Jeśli masz jakiekolwiek pytania odnośnie przetwarzania przez nas Twoich danych, skontaktuj się z naszym Inspektorem Ochrony Danych (IOD). Do Twojej dyspozycji jest pod adresem e-mail: office@teamquest.pl.
W jakim celu i na jakiej podstawie będziemy wykorzystywać Twoje dane? Dowiedz się więcej