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;
.