logo

SQL-korrelerade underfrågor

I SQL är en korrelerad underfråga en underfråga som refererar till en kolumn från den yttre frågan. Underfrågan exekveras upprepade gånger för varje rad i den yttre frågan, med hjälp av värdena från den aktuella raden för att utföra underfrågan. Resultatet av underfrågan används sedan i utvärderingen av den yttre frågan.

Korrelerade underfrågor används för rad-för-rad-behandling. Varje underfråga exekveras en gång för varje rad i den yttre frågan.



En korrelerad underfråga utvärderas en gång för varje rad som bearbetas av den överordnade satsen. Föräldrautlåtandet kan vara en VÄLJ , UPPDATERING , eller RADERA påstående.

Syntax:

VÄLJ kolumn1, kolumn2, ….

FRÅN bord 1 yttre



WHERE kolumn1 operator

(VÄLJ kolumn1, kolumn2

FRÅN tabell 2



WHERE expr1 =

yttre.expr2);

En korrelerad underfråga är ett sätt att läsa varje rad i en tabell och jämföra värden i varje rad med relaterade data. Den används när en underfråga måste returnera ett annat resultat eller en uppsättning resultat för varje kandidatrad som beaktas av huvudfrågan. Med andra ord kan du använda en korrelerad underfråga för att svara på en fråga med flera delar vars svar beror på värdet i varje rad som bearbetas av den överordnade satsen.

Kapslade underfrågor kontra korrelerade underfrågor

Med en normal kapslad underfråga, den inre VÄLJ frågan körs först och körs en gång och returnerar värden som ska användas av huvudfrågan. En korrelerad underfråga exekveras emellertid en gång för varje kandidatrad som den yttre frågan betraktar. Med andra ord, den inre frågan drivs av den yttre frågan.

NOTERA: Du kan också använda NÅGRA och ALLT operatör i en korrelerad delfråga. EXEMPEL på korrelerade underfrågor: Hitta alla anställda som tjänar mer än medellönen på sin avdelning.

Fråga:

SELECT last_name, salary, department_id  FROM employees outer  WHERE salary>(VÄLJ AVG(lön) FRÅN anställda WHERE department_id = yttre.department_id gruppera efter department_id);>

Annan användning av korrelation är in UPPDATERING och RADERA

KORRELATERAD UPPDATERING

UPDATE table1 alias1  SET column = (SELECT expression   FROM table2 alias2  WHERE alias1.column =  alias2.column);>

Använd en korrelerad underfråga för att uppdatera rader i en tabell baserat på rader från en annan tabell.

KORRELATERAD DELETE

DELETE FROM table1 alias1  WHERE column1 operator  (SELECT expression  FROM table2 alias2  WHERE alias1.column = alias2.column);>

Använd en korrelerad underfråga för att ta bort rader i en tabell baserat på raderna från en annan tabell.

storlek latex teckensnitt

Använda EXISTS-operatören

Operatören EXISTS testar förekomsten av rader i resultatuppsättningen för underfrågan. Om ett värde på en underfråga rad hittas flaggas villkoret SANN och sökningen fortsätter inte i den inre frågan, och om den inte hittas flaggas villkoret FALSK och sökningen fortsätter i den inre frågan.
EXEMPEL på att använda EXIST-operatorn:
Hitta anställda som har minst en person som rapporterar till dem.

Fråga:

SELECT employee_id, last_name, job_id, department_id FROM employees outer WHERE EXISTS ( SELECT ’X’ FROM employees WHERE manager_id = outer.employee_id);>

UTGÅNG :

EXEMPEL på att använda operatorn NOT EXIST
Hitta alla avdelningar som inte har några anställda.

Fråga:

SELECT department_id, department_name FROM departments d WHERE NOT EXISTS (SELECT ’X’ FROM employees WHERE department_id = d.department_id);>

UTGÅNG :

Vanliga frågor om SQL-korrelerade underfrågor – Vanliga frågor

Vad är skillnaden mellan korrelerade underfrågor och vanliga underfrågor?

Vanliga underfrågor (icke-korrelerade) är oberoende av den yttre frågan och utvärderas endast en gång innan huvudfrågan körs. Däremot är korrelerade underfrågor beroende av den yttre frågan och exekveras för varje rad i huvudfrågan.

När ska jag använda korrelerade underfrågor?

Korrelerade underfrågor är användbara när du behöver filtrera resultatet av den yttre frågan baserat på något tillstånd som kräver referensvärden från själva den yttre frågan. De används ofta i scenarier där villkoret bygger på data från relaterade tabeller.