در نوشته های پیشین، همه پرس و جوها (کوئری ها) پیشین به گونه ساده و تک پرس و جو بودند ولی زمانی پیش می آید که می بایست دو کوئری را با هم آمیخته کنیم تا بتوانیم مقدار درست را بدست آوریم. فرض کنید می خواهیم فهرست همه کارمندانی را بدست آوریم که دستمزد آنها از دستمزد کارمندی با نام خانوادگی Abel بیشتر باشد.

در چنین موردهایی باید دو پرس و جو را به کار ببرید که یکی باید دستمزد پرداختی Abel را پیدا کند و دیگری می بایست فهرست همه کارمندانی را پیدا کند که دست مزد آنها بیشتر از Abel است. این چنین پرس و جوهایی را زیر پرس جو یا زیر کوئری (Subquery) می گویند که یک پرس و جو به عنوان مقدار برگشتی یک عبارت WHERE درون پرس و جوی دیگر قرار می گیرد.

بنابراین پرس و جوی درونی (Inner) یا همان زیر کوئری (Subquery) مقداری را برای به کار گیری درون پرس جوی بیرونی (Outter) یا کوئری اصلی (Main Query) برگشت می دهد. اگر مفهومی زیر کوئری ها نبود، باید نخست کوئری درونی را انجام می دادیم و سپس مقدار برگشتی آن را به گونه دستی درون کوئری بیرونی به کار می بردیم.

کد SQL زیر کوئری را نشان می دهد که فهرست تمامی کارمندانی را پیدا می کند که دستمزد آنها بیشتر از Abel است. نخست کوئری درونی انجام می شود که درون پرانتزها است. این کوئری دستمزود Abel را پیدا می کند. سپس مقدار برگشتی آن که در اینجا یک شماره است به عنوان مقدار برگشتی، پیش روی عبارت WHERE کوئری بیرونی قرار داده می شود.

بنابراین نسخت زیر کوئری انجام شده و سپس کوئری اصلی انجام می شود. در کد زیر فهرست تمامی کارمندانی برگشت داده می شود که دستمزد آنها برابر با دستمزد کارمندی با شناسه (کلید اصلی) ۱۰۴ است و نام خانوادگی آنها King باشد. در شکل زیر می بینید که هیچ سطری برگشت داده نشده است، زیرا هیچ سطری با این ویژگی ها درون جدول نیست ولی کوئری به درستی کار می کند.

در پرس و جوی بالا عبارت AND بیرون از پرانتزهای کوئری درونی (زیر کوئری) است، پس مربوط به کوئری بیرونی (کوئری اصلی) می شود. شکل زیر الگویی از زیر کوئری ها را نشان می دهد که در هر دو کوئری اصلی و کوئری درونی می توانیم عبارت های WHERE و HAVING و FROM را به کار ببریم.

گونه های زیر کوئری ها

کوئری هایی که در بالا گفتیم همگی یک سطر را برگشت می دهند ولی گاهی کوئری درونی چندین سطر را برگشت خواهند داد. بنابراین دو گونه Single Row Subquery و Multiple Row Subquery را خواهیم داشت. اگر عملگرهای تک سطری زیر را درون عبارت شرطی کوئری درونی (زیر کوئری) به کار ببریم، گونه تک سطری خواهیم داشت.

کوئری زیر نشان می دهد که می توانیم بیش از دو زیر کوئری داشته باشیم. کوئری اصلی دارای دو شرط است که هر کدام بدست یک زیر کوئری مقداردهی می شوند. کوئری نام خانوادگی، شناسه کار (ستون job_id) و دستمزد همه کارمندانی را برگشت می دهد که شناسه کاری آنها با Taylor یکسان و دستمزد آنها از Taylor بیشتر باشد. اما در خروجی زیر می بینید که یک خطا رخ داده است.

دلیل خطای بالا برای آن است که یکی از زیر کوئری ها، دو سطر را برگشت می دهد، پس باید به گونه دیگری کوئری را آماده کنیم که این ایراد پوشش داده شود. در شکل زیر می بینید که یک کوئری دوم را نوشته ایم، تا به شما نشان دهیم که دومین زیر کوئری، دو سطر را برگشت داده است.