poniedziałek, 3 września 2018

SQL - podzapytania


SQL - podzapytania

Podzapytanie lub zapytanie wewnętrzne lub zapytanie zagnieżdżone to zapytanie w ramach innego zapytania SQL 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 należy przestrzegać tworząc 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.
·      W podzapytaniu nie można użyć polecenia ORDER BY, chociaż główne zapytanie może używać ORDER BY. Komenda GROUP BY może być użyta do wykonania tej samej funkcji, co ORDER BY w podzapytaniu.
·      Podkwerendy, które zwracają więcej niż jeden wiersz, mogą być używane tylko z operatorami o wielu wartościach, na przykład operatorem IN.
·      Lista SELECT nie może zawierać żadnych odwołań do wartości, które są oceniane na BLOB, ARRAY, CLOB lub NCLOB.
·      Podzapytanie nie może być natychmiast zawarte w ustawionej funkcji.
·      Operator BETWEEN nie może być używany z podzapytaniem. Jednak operator BETWEEN może być używany w podzapytaniu.

Podzapytania za pomocą instrukcji 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ę KLIENCI zawierającą następujące rekordy:
+----+----------+-----+-----------+----------+
 id,  nazwisko,    wiek, adres,        pensja
'1', 'Zawadzki',  '32', 'Warszawska', '2000.00'
'2', 'Kowalczyk', '25', 'Sokratesa',  '1500.00'
'3', 'Kot',       '23', 'Darwina',    '2000.00'
'4', 'Kowalska',  '25', 'Modlińska',  '6500.00'
'5', 'Sapal',     '27', 'Wspólna',    '8500.00'
'6', 'Nowak',     '22', 'Blizne',      NULL
'7', 'Makowska',  '24', 'Piaseczno',   NULL
+----+----------+-----+-----------+----------+
Teraz, sprawdźmy następujące podkwerendy za pomocą instrukcji SELECT.
SQL> SELECT *
   FROM KLIENCI
   WHERE ID IN (SELECT ID
         FROM KLIENCI
         WHERE PENSJA > 4500) ;
Dałoby to następujący wynik.
+----+----------+-----+---------+----------+
 id,  nazwisko,   wiek,  adres,       pensja
'4', 'Kowalska', '25',  'Modlińska', '6500.00'
'5', 'Sapal',    '27',  'Wspólna',   '8500.00'
+----+----------+-----+---------+----------+

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ć dowolną funkcją znaku, datą lub liczbą.
Podstawowa składnia jest następująca.
INSERT INTO nazwa_tabeli [ (kolumna1 [, kolumna2 ]) ]
   SELECT [ *|kolumna1 [, kolumna2 ]
   FROM tabela1 [, tabela2 ]
   [ WHERE VALUE OPERATOR ]

Przykład
Rozważmy tabelę KLON_KLIENCI o strukturze podobnej do tabeli KLIENCI. Teraz, aby skopiować całą tabelę KLIENCI do tabeli KLON_KLIENCI, możesz użyć następującej składni.
SQL> INSERT INTO KLON_KLIENCI
   SELECT * FROM KLIENCI
   WHERE ID IN (SELECT ID
   FROM KLIENCI) ;

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.
Podstawowa składnia jest następująca.
UPDATE tabela
SET nazwa_kolumny = nowa_wartosc
[ WHERE OPERATOR [ VALUE ]
   (SELECT nazwa_kolumny
   FROM nazwa_tabeli)
   [ WHERE) ]

Przykład
Zakładając, że mamy dostępną tabelę KLON_KLIENCI, która jest kopią zapasową tabeli KLIENCI. Poniższy przykład aktualizuje kolumnę PENSJA o 0,25 raza w tabeli KLIENCI dla wszystkich klientów, których WIEK jest większe lub równe 27.
SQL> UPDATE KLIENCI
   SET PENSJA = PENSJA * 0.25
   WHERE WIEK IN (SELECT WIEK FROM KLON_KLIENCI
      WHERE WIEK >= 27 );
Wpłynęłoby to na jeden rząd i ostatecznie tabela KLIENCI miałaby następujące rekordy.
+----+-----------+------+------------+---------+
| id | nazwisko  | wiek | adres      | pensja  |
+----+-----------+------+------------+---------+
|  1 | Zawadzki  |   32 | Warszawska |  500.00 |
|  2 | Kowalczyk |   25 | Sokratesa  | 1500.00 |
|  3 | Kot       |   23 | Darwina    | 2000.00 |
|  4 | Kowalska  |   25 | Modlińska  | 6500.00 |
|  5 | Sapal     |   27 | Wspólna    | 2125.00 |
|  6 | Nowak     |   22 | Blizne     |    NULL |
|  7 | Makowska  |   24 | Piaseczno  |    NULL |
+----+-----------+------+------------+---------+

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.
Podstawowa składnia jest następująca.
DELETE FROM nazwa_tabeli
[ WHERE OPERATOR [ VALUE ]
   (SELECT nazwa_kolumny
   FROM nazwa_tabeli)
   [ WHERE) ]

Przykład
Zakładając, że dostępna jest tabela KLON_KLIENCI, która jest kopią zapasową tabeli KLIENCI. Poniższy przykład usuwa zapisy z tabeli KLIENCI dla wszystkich klientów, których WIEK jest większy lub równy 27.
SQL> DELETE FROM KLIENCI
   WHERE WIEK IN (SELECT WIEK FROM KLON_KLIENCI
      WHERE WIEK >= 27 );
Wpłynie to na jeden rząd, a na końcu tabela KLIENCI będzie miała następujące rekordy.
+----+-----------+------+-----------+---------+
| id | nazwisko  | wiek | adres     | pensja  |
+----+-----------+------+-----------+---------+
|  2 | Kowalczyk |   25 | Sokratesa | 1500.00 |
|  3 | Kot       |   23 | Darwina   | 2000.00 |
|  4 | Kowalska  |   25 | Modlińska | 6500.00 |
|  6 | Nowak     |   22 | Blizne    |    NULL |
|  7 | Makowska  |   24 | Piaseczno |    NULL |
+----+-----------+------+-----------+---------+


Brak komentarzy:

Prześlij komentarz