V SQL lahko podpoizvedbo preprosto definiramo kot poizvedbo znotraj druge poizvedbe. Z drugimi besedami lahko rečemo, da je podpoizvedba poizvedba, ki je vdelana v klavzulo WHERE druge poizvedbe SQL. Pomembna pravila za podpoizvedbe:
- Podpoizvedbo lahko postavite v številne klavzule SQL: KJE stavek, stavek HAVING, stavek FROM. Podpoizvedbe je mogoče uporabiti s stavki SELECT, UPDATE, INSERT, DELETE skupaj z izraznim operatorjem. Lahko je operator enakosti ali primerjalni operator, kot je =,>, =, <= in operator Like.
- Podpoizvedba je poizvedba znotraj druge poizvedbe. Zunanja poizvedba se imenuje as glavna poizvedba in notranja poizvedba se imenuje kot podpoizvedbo .
- Podpoizvedba se običajno izvede prva, če podpoizvedba nima nobenega soodnos z glavna poizvedba , kadar obstaja sorelacija, razčlenjevalnik sprejme odločitev spotoma na katero poizvedbo naj se izvede prednost in ustrezno uporabi izhod podpoizvedbe.
- Podpoizvedba mora biti v oklepajih.
- Podpoizvedbe so na desni strani primerjalnega operatorja.
- NAROČI PO ukaz ne more uporabiti v podpoizvedbi. GROUPBY ukaz se lahko uporablja za izvajanje iste funkcije kot ukaz ORDER BY.
- Uporabite enovrstične operaterje z enovrstičnimi podpoizvedbami. Uporabite večvrstične operaterje s podpoizvedbami z več vrsticami.
Sintaksa: Za podpoizvedbe ni splošne sintakse. Vendar se zdi, da se podpoizvedbe najpogosteje uporabljajo s stavkom SELECT, kot je prikazano spodaj:
SELECT column_name FROM table_name WHERE column_name expression operator ( SELECT COLUMN_NAME from TABLE_NAME WHERE ... );>
Vzorčna tabela :
BAZA PODATKOV
| IME | ROLL_ŠT | LOKACIJA | TELEFONSKA ŠTEVILKA |
|---|---|---|---|
| Oven | 101 | Chennai | 9988775566 |
| Raj | 102 | Coimbatore | 8877665544 |
| Sasi | 103 | Madurai | 7766553344 |
| Zdravljenje | 104 | Salem | 8989898989 |
| Sumathi | 105 | Kanchipuram | 8989856868 |
ŠTUDENT
| IME | ROLL_ŠT | ODDELEK |
|---|---|---|
| Zdravljenje | 104 | A |
| Sumathi | 105 | B |
| Raj | 102 | A |
Vzorčne poizvedbe
:
- Za prikaz NAME, LOCATION, PHONE_NUMBER študentov iz tabele DATABASE, katere razdelek je A
Select NAME, LOCATION, PHONE_NUMBER from DATABASE WHERE ROLL_NO IN (SELECT ROLL_NO from STUDENT where SECTION=’A’);>
- Pojasnilo: Prva podpoizvedba izvede SELECT ROLL_NO od STUDENT, kjer SECTION='A' vrne ROLL_NO iz tabele STUDENT, katere SECTION je 'A'. Nato jo izvede zunanja poizvedba in vrne NAME, LOCATION, PHONE_NUMBER iz tabele DATABASE študenta, katerega ROLL_NO se vrne iz notranje podpoizvedbe. Izhod:
| IME | ROLL_ŠT | LOKACIJA | TELEFONSKA ŠTEVILKA |
| Zdravljenje | 104 | Salem | 8989898989 |
| Raj | 102 | Coimbatore | 8877665544 |
- Primer vstavi poizvedbo:
Tabela1: Študent1
| IME | ROLL_ŠT | LOKACIJA | TELEFONSKA ŠTEVILKA | |
|---|---|---|---|---|
| Oven | 101 | chennai | 9988773344 | |
| Raju | 102 | Coimbatore | 9090909090 | |
| Zdravljenje | 103 | Salem | 8989898989 |
Tabela2: Študent2
| IME | ROLL_ŠT | LOKACIJA | TELEFONSKA ŠTEVILKA | |
|---|---|---|---|---|
| Raj | 111 | chennai | 8787878787 | |
| dokler | 112 | Mumbai | 6565656565 | |
| Sri | 113 | Coimbatore | 7878787878 |
- Če želite vstaviti Student2 v tabelo Student1:
INSERT INTO Student1 SELECT * FROM Student2;>
- Izhod:
| IME | ROLL_ŠT | LOKACIJA | TELEFONSKA ŠTEVILKA | |
|---|---|---|---|---|
| Oven | 101 | chennai | 9988773344 | |
| Raju | 102 | Coimbatore | 9090909090 | |
| Zdravljenje | 103 | Salem | 8989898989 | |
| Raj | 111 | chennai | 8787878787 | |
| dokler | 112 | Mumbai | 6565656565 | |
| Sri | 113 | Coimbatore | 7878787878 |
- Za brisanje študentov iz tabele Student2, katerih rollno je enako tistemu v tabeli Student1 in ima lokacijo kot chennai
DELETE FROM Student2 WHERE ROLL_NO IN ( SELECT ROLL_NO FROM Student1 WHERE LOCATION = ’chennai’);>
- Izhod:
1 row delete successfully.>
- Prikaz tabele Student2:
| IME | ROLL_ŠT | LOKACIJA | TELEFONSKA ŠTEVILKA | |
|---|---|---|---|---|
| dokler | 112 | Mumbai | 6565656565 | |
| Sri | 113 | Coimbatore | 7878787878 |
- Za posodobitev imena študentov v geeke v tabeli Student2, katerih lokacija je enaka kot Raju,Ravi v tabeli Student1
UPDATE Student2 SET NAME=’geeks’ WHERE LOCATION IN ( SELECT LOCATION FROM Student1 WHERE NAME IN (‘Raju’,’Ravi’));>
- Izhod:
1 row updated successfully.>
- Prikaz tabele Student2:
| IME | ROLL_ŠT | LOKACIJA | TELEFONSKA ŠTEVILKA | |
|---|---|---|---|---|
| dokler | 112 | Mumbai | 6565656565 | |
| geeki | 113 | Coimbatore | 7878787878 |