poniedziałek, 24 września 2018

SQLite - Podzapytania


SQLite - Podzapytania

Podzapytanie lub zapytanie wewnętrzne lub zapytanie zagnieżdżone jest zapytaniem w obrębie innej kwerendy SQLite i osadzone w klauzuli WHERE.
Podzapytanie służy do zwracania danych, które będą używane w głównym zapytaniu, jako warunku dalszego ograniczenia danych do pobrania.
Podzapytania mogą być używane z instrukcjami SELECT, INSERT, UPDATE i DELETE wraz z operatorami takimi jak =, <,>,> =, <=, IN, BETWEEN itp.
Istnieje kilka reguł, których muszą przestrzegać podzapytania -
·      Podzapytania muszą być ujęte w nawiasy.
·      Podzapytanie może mieć tylko jedną kolumnę w klauzuli SELECT, chyba że w głównym zapytaniu znajduje się wiele kolumn dla podkwerendy, aby porównać wybrane kolumny.
·      Nie można użyć ORDER BY w podzapytaniu, chociaż główne zapytanie może zawierać ORDER BY. GRUP BY może służyć do wykonywania tej samej funkcji, co ORDER BY w podzapytaniu.
·      Podzapytania, które zwracają więcej niż jeden wiersz, mogą być używane tylko z operatorami o wielu wartościach, na przykład operatorem IN.
·      BETWEEN operator nie może być używany z podzapytaniem; jednak BETWEEN może być używany w podzapytaniu.

Podzapytania z instrukcją SELECT

Podzapytania są najczęściej używane z instrukcją SELECT. Podstawowa składnia jest następująca:
SELECT nazwa_kolumny [,nazwa_kolumny]
FROM tabela1 [,tabela2 ]
WHERE nazwa_kolumny OPERATOR
   (SELECT nazwa_kolumny [,nazwa_kolumny]
      FROM tabela1 [,tabela2 ]
      [WHERE])

Przykład
Rozważ tabelę PRACOWNIK z następującymi zapisami.
id          nazwisko    wiek        adres       pensja
----------  ----------  ----------  ----------  ----------
1           Adam        32          Warszawa    2000.0
3           Tomasz      23          Grodzisk    2000.0
5           Dawid       27          Halinów     8500.0
6           Katarzyna   22          Marki       4500.0
7           Jan         24          Kraków      4500.0
8           Paweł       24          Zielonka    3500.0
9           Jan         44          Kobyłka     5000.0
10          Jan         45          Nieporęt    5000.0
Teraz sprawdźmy następujące pod-zapytanie za pomocą instrukcji SELECT.
sqlite> SELECT *
   FROM PRACOWNIK
   WHERE ID IN (SELECT ID
      FROM PRACOWNIK
      WHERE PENSJA > 4500) ;
Spowoduje to uzyskanie następującego wyniku.
id          nazwisko    wiek        adres       pensja
----------  ----------  ----------  ----------  ----------
4           Marek       25          Płock       6500.0
5           Dawid       27          Halinów     8500.0
9           Jan         44          Kobyłka     5000.0
10          Jan         45          Nieporęt    5000.0

Podzapytania z instrukcją INSERT

Podzapytania mogą być również używane z instrukcjami INSERT. Instrukcja INSERT używa danych zwróconych z podzapytania do wstawienia do innej tabeli. Wybrane dane w podzapytaniu można modyfikować za pomocą dowolnej funkcji, postaci lub daty.
Poniżej przedstawiono podstawową składnię:
INSERT INTO nazwa_tabeli [ (kolumna1 [, kolumna2 ]) ]
   SELECT [ *|kolumna1 [, kolumna2 ]
   FROM tabela1 [, tabela2 ]
   [ WHERE VALUE OPERATOR ]

Przykład
Rozważmy tabelę PRACOWNIK_COPY o podobnej strukturze co tabela PRACOWNIK i można ją utworzyć przy użyciu tego samego CREATE TABLE, używając PRACOWNIK_COPY jako nazwy tabeli. Aby skopiować kompletną tabelę PRACOWNIK do PRACOWNIK_COPY, poniżej podano składnię -
sqlite> INSERT INTO PRACOWNIK_COPY
   SELECT * FROM PRACOWNIK
   WHERE ID IN (SELECT ID
      FROM PRACOWNIK) ;

Podzapytania z instrukcją UPDATE

Podzapytanie może być używane w połączeniu z instrukcją UPDATE. Każda pojedyncza lub wiele kolumn w tabeli może być aktualizowana podczas korzystania z podzapytania z instrukcją UPDATE.
Poniżej przedstawiono podstawową składnię:
UPDATE table
SET nazwa_kolumny = nowa_wartość
[ WHERE OPERATOR [ wartość ]
   (SELECT nazwa_kolumny
      FROM nazwa_tabeli)
   [ WHERE) ]

Przykład
Zakładając, że dostępna jest tabela PRACOWNIK_COPY, która jest kopią zapasową tabeli PRACOWNIK.
Poniższy przykład aktualizuje kolumnę PENSJA o 0,50 raza w tabeli PRACOWNIK dla wszystkich klientów, których WIEK jest większe lub równe 27.
sqlite> UPDATE PRACOWNIK
   SET PENSJA = PENSJA * 0.50
   WHERE WIEK IN (SELECT WIEK FROM PRACOWNIK_COPY
      WHERE WIEK >= 25 );
Wpłynęłoby to na dwa rekordy i ostatecznie tablica PRACOWNIK miałaby następujące rekordy -
id          nazwisko    wiek        adres       pensja
----------  ----------  ----------  ----------  ----------
1           Adam        32          Warszawa    1000.0
2           Piotr       25          Piaseczno   750.0
3           Tomasz      23          Grodzisk    2000.0
4           Marek       25          Płock       3250.0
5           Dawid       27          Halinów     4250.0
6           Katarzyna   22          Warszawa    4500.0
7           Jan         24          Kraków      4500.0
8           Paweł       24          Zielonka    3500.0
9           Jan         44          Kobyłka     2500.0
10          Jan         45          Nieporęt    2500.0

Podzapytania z instrukcją DELETE

Podzapytanie może być używane w połączeniu z instrukcją DELETE, podobnie jak w przypadku innych instrukcji wymienionych powyżej.
Poniżej przedstawiono podstawową składnię:
DELETE FROM NAZWA_TABELI
[ WHERE OPERATOR [ WARTOŚĆ ]
   (SELECT NAZWA_KOLUMNY
      FROM NAZWA_TABELI)
   [ WHERE) ]

Przykład
Zakładając, że dostępna jest tabela PRACOWNIK_COPY, która jest kopią zapasową tabeli PRACOWNIK.
Poniższy przykład usuwa rekordy z tabeli PRACOWNIK dla wszystkich klientów, których AGE jest większe lub równe 27.
sqlite> DELETE FROM PRACOWNIK
   WHERE WIEK IN (SELECT WIEK FROM PRACOWNIK_COPY
   WHERE WIEK > 27 );
Wpłynie to na trzy rekordy i ostatecznie tabela PRACOWNIK będzie zawierać następujące zapisy -
id          nazwisko    wiek        adres       pensja
----------  ----------  ----------  ----------  ----------
2           Piotr       25          Piaseczno   750.0
3           Tomasz      23          Grodzisk    2000.0
4           Marek       25          Płock       3250.0
5           Dawid       27          Halinów     4250.0
6           Katarzyna   22          Warszawa    4500.0
7           Jan         24          Kraków      4500.0
8           Paweł       24          Zielonka    3500.0



Brak komentarzy:

Prześlij komentarz