Encyklopedia SQL - Podzapytania, NULL, NOT NULL  

Udostępnij na: Facebook

Autor: Paweł Wilkosz

Opublikowano: 2012-02-06

Zapytania, wykonywane w poprzednich częściach cyklu Encyklopedia SQL, swoją semantyką wskazywały na poszukiwanie określonego zbioru wynikowego, ograniczonego co najwyżej wartościami doskonale znanymi programiście. W praktyce jednak wydobywanie wiedzy z tabel bazodanowych nie zawsze polegać będzie na eliminacji rekordów, które są oczywiste (np. ograniczenie względem wartości pola ID). Niejednokrotnie podzbiór informacji, interesujących programistę, możliwy będzie dzięki wykluczeniu rekordów, które potencjalnie nie powinny występować w danej relacji. Dlatego niniejsza publikacja koncentrować się będzie na filtrowaniu zbioru wynikowego za pomocą warunków NULL, NOT NULL oraz konstruowaniu podzapytań.

Przed wykonaniem zadań zapoznaj się z następującym materiałem:

Po wykonaniu zadań będziesz wiedział:

  • w jaki sposób konstruować podzapytania,
  • jak wykorzystać wartości NULL/NOT NULL do ograniczania zbioru wynikowego.

Podzapytania

Podzapytania są jedną z form wydobywania wiedzy z tabel z relacyjną zależnością, polegającą na tym, iż zbiór atomicznych wartości, stanowiący integralną część zapytania, może być dostarczony w formie innego z nich. Bazując na tej definicji, podstawowa składnia zapytania z klauzulą WHERE oraz towarzyszącego mu podzapytania precyzującego warunek ograniczenia danych, może wyglądać następująco:

SELECT kolumna1, kolumna2, … , kolumnaN
FROM Tabela
WHERE kolumna1 = 
( 
      SELECT kolumnaA2
FROM Tabela 2
      //dalsza cześć zapytania
)

Następujący przykład powinien posłużyć lepszemu zrozumieniu omawianego zagadnienia. Do działu IT firmy AdventureWorks zgłosił się pracownik departamentu finansów i rozliczeń. Ponieważ przygotowuje on prezentację na temat wzrostu cen produktów firmy, chciałby dowiedzieć się, które modele rowerów miały zmienianą cenę w trakcie działalności przedsiębiorstwa. Programiści baz danych zorientowali się, iż informacje na temat zmiany cen znajdują się w tabeli Production.ProductListPriceHistory, która jako jedną z kolumn posiada ProductID – czyli identyfikator produktu. Zatem algorytmem do wykonania zadania będzie wyciągnięcie wszystkich wpisów z tabeli Production.Product, których ID występuje w Production.ProductListPriceHistory. W związku z tym przygotowali zapytanie, wykorzystujące sub-query:

SELECT * FROM Production.Product
WHERE Product.ProductID IN
(
  SELECT ProductID
  FROM Production.ProductCostHistory
)

które zwraca wynik jak na rysunku 1.

Rys. 1. Wynik działania zapytania z podzapytaniem dla przykładu 1.

NULL, NOT NULL

Zapytania z konstrukcją NULL/NOT NULL można wykorzystywać na co najmniej dwa sposoby. Pierwszy z nich definiuje kolumnę do porównania, która nie zawiera żadnej określonej informacji (czyli jest pusta). Druga może zostać użyta do eliminacji rekordów, np. w podzapytaniach, dostarczających programiście zbiór danych, który chciał otrzymać. W dalszej części artykułu skupimy się na właśnie na tych dwóch przypadkach użycia.

Aby znaleźć wszystkich kandydatów do pracy w AdventureWorks, którzy pozytywnie przeszli proces rekrutacji oraz zostali zatrudnieni, wystarczy przeszukać tabelę HumanResources.JobCandidate w celu wyodrębnienia pól, których EmployeeID nie jest wartością NULL. Poniższe zapytanie przedstawia imię i nazwisko osoby, która niedawno została przyjęta do giganta rowerowego:

SELECT employee.EmployeeID, contact.FirstName, contact.LastName
FROM HumanResources.JobCandidate AS jobcandidate
INNER JOIN HumanResources.Employee AS employee
ON employee.EmployeeID = jobcandidate.EmployeeID
INNER JOIN Person.Contact AS contact
  ON employee.ContactID = contact.ContactID
WHERE jobcandidate.EmployeeID IS NOT NULL

Zapytanie powinno zwrócić wyniki zgodne z Rys. 2.

Rys. 2. Lista osób niedawno zatrudnionych w AdventureWorks.

W przypadku podzapytań sposób wyrzucania wartości, które nie należą do zbioru wynikowego wygląda podobnie, z tą różnicą, iż NOT NULL/IS NULL zostało zastąpione słowem kluczowym NOT IN/ IN, co zostało wykazane w pierwszej części publikacji.

Informacja

Zapamiętaj, że:

  1. Podzapytanie wykorzystywane jako dostawca zbioru danych do warunków ograniczania zbioru wynikowego musi zwracać dokładnie taki sam typ danych jak kolumna do porównywania.
  2. Klauzula IS NULL/IS NOT NULL pozwala na eliminację danych ze zbioru wynikowego, które nie posiadają określonej wartości, bądź z podzapytań, gdzie zostały zastąpione słowem kluczowym IN/NOT IN.

Podsumowanie

Techniki ograniczania zbioru wynikowego poprzez usuwanie danych, które docelowo nie powinny się w nim znaleźć pozwolą Ci na efektywniejsze wykorzystanie języka T-SQL do konstrukcji zapytań.

W kolejnej publikacji nauczysz się co to są indeksy i jaką rolę pełnią w bazie danych.

Dodatkowo zobacz: