زیرپرسوجوها در SQL
زیرپرسوجوها در SQL
این فصل سه نوع زیرپرسوجو را بررسی میکند: تکمقداری، چندمقداری و همبسته.
زیرپرسوجوهای تکمقداری
زیرپرسوجوی تکمقداری (Single-Valued Subquery) پرسوجویی است که ۱) نتیجهای با یک ستون و یک ردیف تولید میکند و ۲) در بند WHERE پرسوجوی دیگری «تو در تو» میشود. زیرپرسوجو باید داخل پرانتز قرار گیرد.
SELECT AVG( POP )
FROM COUNTRIES
SELECT COUNTRY, POP
FROM COUNTRIES
WHERE POP > 30150531
| COUNTRY | POP |
|---|
| Germany | 81337541 |
| USA | 263814032 |
| England | 58295119 |
| Argentina | 34292742 |
| Colombia | 36200251 |
| Mexico | 93985848 |
SELECT COUNTRY, POP
FROM COUNTRIES
WHERE POP > ( SELECT AVG( POP )
FROM COUNTRIES )
| COUNTRY | POP |
|---|
| Germany | 81337541 |
| USA | 263814032 |
| England | 58295119 |
| Argentina | 34292742 |
| Colombia | 36200251 |
| Mexico | 93985848 |
- پرسوجوهای تکمقداری را میتوان در مقایسهها استفاده کرد.
- زیرپرسوجوها داخل پرانتز قرار میگیرند.
خلاصهٔ نحو با زیرپرسوجوی تکمقداری| CLAUSE | PARAMETERS | EXAMPLE |
|---|
| SELECT | * | * |
| SELECT | [ DISTINCT ] col [ AS alias ] list | NAME, PERSONS.JOB, TITLE |
| SELECT | expr [ AS alias ] list | POP / AREA AS DENSITY |
| SELECT | func [ AS alias ] list | MIN(POP) AS LOWEST |
| FROM | table [ AS alias ] list | PERSONS, JOBS |
| WHERE | comparisons | PERSONS.JOB = JOBS.JOB |
| WHERE | column oper ( subquery ) | POP > ( SELECT AVG( POP ) ... ) |
| GROUP BY | col list | JOB, COUNTRY |
| HAVING | comparisons with funcs | COUNT(*) > 30 |
| UNION | query | SELECT ... |
| ORDER BY | sort list | LANGUAGE DESC, COUNTRY |
تمرینها
- بیشترین جمعیت همهٔ کشورها را پیدا کنید. اکنون همان پرسوجو را بهعنوان زیرپرسوجو به کار ببرید تا همهٔ ستونهای کشوری را که بیشترین جمعیت را دارد نمایش دهید.
- همهٔ ستونهای ارتشهایی را نمایش دهید که بودجهشان از میانگین بودجهٔ همهٔ ارتشها بیشتر است. نتیجه ۵ ردیف دارد.
امتیاز اضافه
- زبان مادری، نام، عنوان شغلی و تاریخ تولد همهٔ افرادی را نمایش دهید که همان شغل Luther را دارند. بر اساس نام درون زبان مرتب کنید. نتیجه ۱۳ ردیف دارد.
زیرپرسوجوهای چندمقداری
زیرپرسوجوی چندمقداری (Multi-Valued Subquery) پرسوجویی است که ۱) نتیجهای تکستونی با صفر، یک یا چند ردیف برمیگرداند و ۲) در بند WHERE پرسوجوی دیگری تو در تو میشود. زیرپرسوجوهای چندمقداری همیشه پس از عملگر IN قرار میگیرند.
SELECT DISTINCT JOB
FROM PERSONS
WHERE GENDER = 'FEMALE'
SELECT JOB, TITLE
FROM JOBS
WHERE NOT JOB IN ('W','R','E','S','M')
| JOB | TITLE |
|---|
| I | Instructor |
| T | Theologian |
| B | Business... |
| L | Lawyer |
| K | Key Grip |
SELECT JOB, TITLE
FROM JOBS
WHERE NOT JOB IN
( SELECT DISTINCT JOB
FROM PERSONS
WHERE GENDER = 'FEMALE' )
| JOB | TITLE |
|---|
| I | Instructor |
| T | Theologian |
| B | Business... |
| L | Lawyer |
| K | Key Grip |
- زیرپرسوجوهای چندمقداری پس از عملگر IN قرار میگیرند.
خلاصهٔ نحو با زیرپرسوجوی چندمقداری| CLAUSE | PARAMETERS | EXAMPLE |
|---|
| SELECT | * | * |
| SELECT | [ DISTINCT ] col [ AS alias ] list | NAME, PERSONS.JOB, TITLE |
| SELECT | expr [ AS alias ] list | POP / AREA AS DENSITY |
| SELECT | func [ AS alias ] list | MIN(POP) AS LOWEST |
| FROM | table [ AS alias ] list | PERSONS, JOBS |
| WHERE | comparisons | PERSONS.JOB = JOBS.JOB |
| WHERE | column oper ( subquery ) | POP > ( SELECT AVG( POP ) ... ) |
| WHERE | column IN ( subquery ) | JOB IN ( SELECT DISTINCT JOB ... ) |
| GROUP BY | col list | JOB, COUNTRY |
| HAVING | comparisons with funcs | COUNT(*) > 30 |
| UNION | query | SELECT ... |
| ORDER BY | sort list | LANGUAGE DESC, COUNTRY |
تمرینها
- فهرستی از کشورهایی بسازید که نرخ باسوادی آنها کمتر از ۵۰٪ است. سپس از آن پرسوجو برای نمایش همهٔ ستونهای نویسندگان هر یک از آن کشورها استفاده کنید. ۲ ردیف وجود دارد.
- همهٔ ستونهای افرادی را نمایش دهید که در کشورهایی با بیش از ۹۵٪ Catholic متولد شدهاند. ۱۳ نفر وجود دارد.
امتیاز اضافه
- همهٔ ستونهای رهبران نظامی را در کشورهای انگلیسیزبان نمایش دهید که تعداد نیروهایشان کمتر از میانگین تعداد نیروهای ارتشها است. ۲ ردیف وجود دارد.
زیرپرسوجوهای همبسته
زیرپرسوجوی همبسته (Correlated Subquery) یک زیرپرسوجوی تکمقداری یا چندمقداری است که از طریق Alias جدولی تعریفشده در بند FROM پرسوجوی بیرونی به آن پرسوجو ارجاع میدهد. زیرپرسوجو برای هر ردیف پرسوجوی بیرونی یکبار اجرا میشود.
SELECT JOB, NAME
FROM PERSONS
WHERE JOB = 'S'
AND BDATE =
( SELECT MIN( BDATE )
FROM PERSONS
WHERE JOB = 'S' )
SELECT JOB, NAME
FROM PERSONS AS P
WHERE BDATE =
( SELECT MIN( BDATE )
FROM PERSONS
WHERE JOB = P.JOB )
| JOB | NAME |
|---|
| E | Hepburn |
| W | Shikabu |
| M | Montal... |
| B | Dupont |
| S | Magnus |
| T | Paul |
| R | Jean |
- زیرپرسوجوهای همبسته چندین بار اجرا میشوند.
- زیرپرسوجوهای همبسته به Alias جدول نیاز دارند.
خلاصهٔ نحو با زیرپرسوجوی همبسته| CLAUSE | PARAMETERS | EXAMPLE |
|---|
| SELECT | * | * |
| SELECT | [ DISTINCT ] col [ AS alias ] list | NAME, PERSONS.JOB, TITLE |
| SELECT | expr [ AS alias ] list | POP / AREA AS DENSITY |
| SELECT | func [ AS alias ] list | MIN(POP) AS LOWEST |
| FROM | table [ AS alias ] list | PERSONS, JOBS |
| WHERE | comparisons | PERSONS.JOB = JOBS.JOB |
| WHERE | column oper ( subquery ) | BDATE = ( SEL ... WHERE JOB = P.JOB ) |
| WHERE | column IN ( subquery ) | BDATE IN ( SEL ... WHERE JOB = P.JOB ) |
| GROUP BY | col list | JOB, COUNTRY |
| HAVING | comparisons with funcs | COUNT(*) > 30 |
| UNION | query | SELECT ... |
| ORDER BY | sort list | LANGUAGE DESC, COUNTRY |
تمرینها
- شغل و نام جوانترین فرد هر حرفه را نمایش دهید. نتیجه ۷ ردیف دارد و افرادی مانند Grisham، Mountbatten و Forbes را شامل میشود.
- با یک پرسوجو و یک زیرپرسوجوی همبسته، همهٔ ستونهای جوانترین مرد و جوانترین زن را نمایش دهید. چه وجه مشترک دیگری دارند؟
امتیاز اضافه
- دین غالب را در هر کشور آلمانیزبان پیدا کنید. جدول نتیجه ۴ ردیف دارد.