V SQL lze poddotaz jednoduše definovat jako dotaz v rámci jiného dotazu. Jinými slovy můžeme říci, že poddotaz je dotaz, který je vložen do klauzule WHERE jiného SQL dotazu. Důležitá pravidla pro dílčí dotazy:
- Poddotaz můžete umístit do několika klauzulí SQL: KDE klauzule, klauzule HAVING, klauzule FROM. Poddotazy lze použít s příkazy SELECT, UPDATE, INSERT, DELETE spolu s výrazovým operátorem. Může to být operátor rovnosti nebo operátor porovnání, jako je operátor =,>, =, <= a Like.
- Poddotaz je dotaz v rámci jiného dotazu. Vnější dotaz se nazývá as hlavní dotaz a vnitřní dotaz se nazývá jako poddotaz .
- Poddotaz se obecně spustí jako první, když poddotaz žádný nemá spoluvztah s hlavní dotaz , když existuje korelace, rozhodne analyzátor za běhu na kterém dotazu se má provést přednost a podle toho použije výstup poddotazu.
- Poddotaz musí být uzavřen v závorkách.
- Poddotazy jsou na pravé straně operátoru porovnání.
- SEŘADIT PODLE příkaz nemůže použít v poddotazu. SKUPINA VYTVOŘENÁ příkaz lze použít k provedení stejné funkce jako příkaz ORDER BY.
- Použijte jednořádkové operátory s jednořádkovými poddotazy. Použijte víceřádkové operátory s víceřádkovými poddotazy.
Syntax: Pro poddotazy neexistuje žádná obecná syntaxe. Zdá se však, že poddotazy se nejčastěji používají s příkazem SELECT, jak je uvedeno níže:
SELECT column_name FROM table_name WHERE column_name expression operator ( SELECT COLUMN_NAME from TABLE_NAME WHERE ... );>
Vzorová tabulka :
DATABÁZE
| NÁZEV | ROLL_NO | UMÍSTĚNÍ | TELEFONNÍ ČÍSLO |
|---|---|---|---|
| RAM | 101 | Chennai | 9988775566 |
| Raj | 102 | Coimbatore | 8877665544 |
| Sasi | 103 | Madurai | 7766553344 |
| Léčba | 104 | Salem | 8989898989 |
| Sumathi | 105 | Kanchipuram | 8989856868 |
STUDENT
| NÁZEV | ROLL_NO | SEKCE |
|---|---|---|
| Léčba | 104 | A |
| Sumathi | 105 | B |
| Raj | 102 | A |
Ukázkové dotazy
:
- Chcete-li zobrazit JMÉNO, LOCATION, PHONE_NUMBER studentů z tabulky DATABASE, jejíž sekce je A
Select NAME, LOCATION, PHONE_NUMBER from DATABASE WHERE ROLL_NO IN (SELECT ROLL_NO from STUDENT where SECTION=’A’);>
- Vysvětlení: První poddotaz provede SELECT ROLL_NO od STUDENT, kde SECTION='A' vrátí ROLL_NO z tabulky STUDENT, jejíž SECTION je 'A'. Poté jej vnější dotaz provede a vrátí NAME, LOCATION, PHONE_NUMBER z tabulky DATABASE studenta, jehož ROLL_NO je vráceno z vnitřního poddotazu. Výstup:
| NÁZEV | ROLL_NO | UMÍSTĚNÍ | TELEFONNÍ ČÍSLO |
| Léčba | 104 | Salem | 8989898989 |
| Raj | 102 | Coimbatore | 8877665544 |
- Příklad vložení dotazu:
Tabulka1: Student1
| NÁZEV | ROLL_NO | UMÍSTĚNÍ | TELEFONNÍ ČÍSLO | |
|---|---|---|---|---|
| RAM | 101 | chennai | 9988773344 | |
| Raju | 102 | coimbatore | 9090909090 | |
| Léčba | 103 | Salem | 8989898989 |
Tabulka2: Student2
| NÁZEV | ROLL_NO | UMÍSTĚNÍ | TELEFONNÍ ČÍSLO | |
|---|---|---|---|---|
| Raj | 111 | chennai | 8787878787 | |
| Až do | 112 | mumbai | 6565656565 | |
| Sri | 113 | coimbatore | 7878787878 |
- Postup vložení Student2 do tabulky Student1:
INSERT INTO Student1 SELECT * FROM Student2;>
- Výstup:
| NÁZEV | ROLL_NO | UMÍSTĚNÍ | TELEFONNÍ ČÍSLO | |
|---|---|---|---|---|
| RAM | 101 | chennai | 9988773344 | |
| Raju | 102 | coimbatore | 9090909090 | |
| Léčba | 103 | Salem | 8989898989 | |
| Raj | 111 | chennai | 8787878787 | |
| Až do | 112 | mumbai | 6565656565 | |
| Sri | 113 | coimbatore | 7878787878 |
- Chcete-li odstranit studenty z tabulky Student2, jejichž rollno je stejné jako v tabulce Student1 a má umístění jako chennai
DELETE FROM Student2 WHERE ROLL_NO IN ( SELECT ROLL_NO FROM Student1 WHERE LOCATION = ’chennai’);>
- Výstup:
1 row delete successfully.>
- Zobrazit tabulku Student2:
| NÁZEV | ROLL_NO | UMÍSTĚNÍ | TELEFONNÍ ČÍSLO | |
|---|---|---|---|---|
| Až do | 112 | mumbai | 6565656565 | |
| Sri | 113 | coimbatore | 7878787878 |
- Aktualizace jmen studentů na geeky v tabulce Student2, jejichž umístění je stejné jako Raju, Ravi v tabulce Student1
UPDATE Student2 SET NAME=’geeks’ WHERE LOCATION IN ( SELECT LOCATION FROM Student1 WHERE NAME IN (‘Raju’,’Ravi’));>
- Výstup:
1 row updated successfully.>
- Zobrazit tabulku Student2:
| NÁZEV | ROLL_NO | UMÍSTĚNÍ | TELEFONNÍ ČÍSLO | |
|---|---|---|---|---|
| Až do | 112 | mumbai | 6565656565 | |
| geeky | 113 | coimbatore | 7878787878 |