پرسوجوهای پایه در SQL
این فصل پنج موضوع را پوشش میدهد: انتخاب همهٔ ستونها و ردیفها، انتخاب ستونهای مشخص، انتخاب ردیفهای مشخص، مرتبسازی ردیفها و حذف ردیفهای تکراری.
انتخاب همهٔ ستونها و ردیفها
سادهترین نوع پرسوجو همهٔ ستونها و همهٔ ردیفهای یک جدول را نمایش میدهد. در بند SELECT یک ستاره وارد میشود تا مشخص شود همهٔ ستونها باید در خروجی باشند و نام جدول در بند FROM قرار میگیرد، مانند نمونههای زیر:
| JOB | TITLE |
|---|
| S | Scientist |
| E | Entertainer |
| W | Writer |
| I | Instructor |
| COUNTRY | RELIGION | PERCENT |
|---|
| Germany | Protestant | 45 |
| Germany | Catholic | 37 |
| England | Catholic | 30 |
| England | Anglican | 70 |
- همهٔ پرسوجوها دارای بندهای SELECT و FROM هستند.
- بند FROM بعد از بند SELECT میآید.
- ستاره (*) به معنی «همهٔ ستونها» است.
- نام جدول در بند FROM مشخص میشود.
- ستونها و ردیفها میتوانند با ترتیب دلخواه ظاهر شوند.
نحو عمومی یک دستور SQL SELECT در جدول زیر آمده است. کلیدواژهها و مثالها با حروف بزرگ و پارامترها با حروف کوچک نمایش داده شدهاند.
خلاصهٔ نحو| CLAUSE | PARAMETERS | EXAMPLE |
|---|
| SELECT | * | * |
| FROM | table | JOBS |
تمرینها
- از مدرس بخواهید یک آموزش کوتاه دربارهٔ استفاده از پایگاه دادهٔ کلاس ارائه دهد.
- همهٔ ستونها و همهٔ ردیفهای جدول PERSONS را انتخاب کنید.
- جدول COUNTRIES را با یک دستور SELECT بررسی کنید.
- نگاهی به جدول ERRORS بیندازید.
- جدول ARMIES را بررسی کنید.
امتیاز اضافه
- بیشتر پایگاههای دادهٔ جدی جدولی به نام SYSCOLUMNS دارند. نگاهی به آن بیندازید.
- هر جدول دیگری را از جدول SYSCOLUMNS انتخاب و نمایش دهید.
انتخاب ستونهای مشخص
برای انتخاب ستونهای مشخص، بهجای ستاره فهرستی از ستونها را در دستور SELECT وارد میکنیم. نام هر ستون با یک ویرگول و در صورت تمایل فاصله از بقیه جدا میشود. ستونها به همان ترتیبی که فهرست شدهاند نمایش داده میشوند.
| TITLE |
|---|
| Scientist |
| Entertainer |
| Writer |
| Instructor |
SELECT TITLE, JOB
FROM JOBS
| TITLE | JOB |
|---|
| Scientist | S |
| Entertainer | E |
| Writer | W |
| Instructor | I |
| JOB | TITLE | JOB |
|---|
| S | Scientist | S |
| E | Entertainer | E |
| W | Writer | W |
| I | Instructor | I |
- نام ستونها در بند SELECT فهرست میشوند.
- نام ستونها با ویرگول از هم جدا میشوند.
- ستونها به ترتیب فهرستشده ظاهر میشوند.
- ردیفها با ترتیب دلخواه ظاهر میشوند.
خلاصهٔ نحو بازبینیشده| CLAUSE | PARAMETERS | EXAMPLE |
|---|
| SELECT | * | * |
| SELECT | col list | LANGUAGE, COUNTRY |
| FROM | table | JOBS |
تمرینها
- فقط ستون JOB را از جدول JOBS انتخاب کنید.
- ستونهای NAME و BDATE را از جدول PERSONS نمایش دهید.
- جدول RELIGIONS سه ستون COUNTRY، RELIGION و PERCENT دارد. همهٔ این ستونها را با ترتیب معکوس نمایش دهید.
امتیاز اضافه
- همهٔ ستونهای جدول COUNTRIES را نمایش دهید، اما ستون COUNTRY را در هر دو انتها قرار دهید تا بتوانیم آنها را «مثل یک حاکم» ردیف کنیم. ابتدا با ستاره و سپس بدون ستاره امتحان کنید.
انتخاب ردیفهای مشخص
ردیفهای یک جدول با مقادیری که در خود دارند شناسایی میشوند. بنابراین مهم است دستههای مختلف مقادیری را که SQL پشتیبانی میکند و نحو مناسب ورود هر نوع مقدار در دستورهای پرسوجو بشناسیم.
خلاصهٔ انواع مقدار| CATEGORY | DESCRIPTION | EXAMPLES |
|---|
| NUMERIC | positive values | 3, +12 |
| NUMERIC | negative values | -7, -1024000 |
| NUMERIC | decimal values | 3.141519, -.96 |
| NON-NUMERIC | single words | 'Chamberlin', 'SELECT' |
| NON-NUMERIC | multiple words | 'We love SQL', 'The LORD is good to me' |
| NON-NUMERIC | single quotes | '10 O''Clock', 'I don''t know' |
| DATE | 'yyyy-mm-dd' format | '1996-01-01', '1996-12-31' |
مقادیر عددی به شکل معمول وارد میشوند
مقادیر عددی در پرسوجوها با یک یا چند نویسهٔ زیر مشخص میشوند: + - 0 1 2 3 4 5 6 7 8 9 . علامت اختیاری است ولی در صورت وجود باید نخست بیاید. فقط یک نقطهٔ اعشاری مجاز است. ویرگول، علامت دلار و علامت درصد در مقادیر عددی مجاز نیستند.
مقادیر غیرعددی داخل کوتیشن قرار میگیرند
مقادیر غیرعددی که رشته (String) نامیده میشوند داخل تککوتیشن نوشته میشوند. برای نمایش یک تککوتیشن واقعی داخل رشته، دو تککوتیشن پیاپی بنویسید.
مقادیر تاریخ با قالب 'yyyy-mm-dd' وارد میشوند
با اینکه استاندارد SQL نمایش یکنواختی برای تاریخ ندارد، قالب نشاندادهشده در بیشتر گویشهای SQL پشتیبانی میشود. تاریخها باید داخل تککوتیشن قرار گیرند.
مقایسه (Comparison) عبارتی است که از نام ستون، عملگر مقایسه و یک مقدار تشکیل میشود. نتیجهٔ همهٔ مقایسهها یا True است یا False. از مقایسهها برای تعیین ردیفهایی استفاده میشود که باید در نتیجهٔ یک پرسوجو گنجانده شوند.
عملگرهای مقایسه| OPERATOR | MEANING | EXAMPLE |
|---|
| = | Equal to | NAME = 'EINSTEIN' |
| <> | Not equal to | BDATE <> '1944-05-02' |
| < | Less than | POP < 100000 |
| <= | Less than or equal to | NAME <= 'O''Grady' |
| > | Greater than | AREA > 999 |
| >= | Greater than or equal to | BDATE >= '1962-06-19' |
نام ستون در سمت چپ مشخص میشود
نام ستون را میتوان با حروف بزرگ، کوچک یا ترکیبی وارد کرد. در این کتاب نام ستونها با حروف بزرگ نمایش داده میشوند. توجه کنید حتی اگر نام ستون غیرعددی باشد، داخل کوتیشن قرار نمیگیرد.
مقدار در سمت راست مشخص میشود
مقادیر باید متناسب با نوع دادهٔ خود وارد شوند؛ اعداد به شکل معمول، رشتهها داخل تککوتیشن و تاریخها با قالب yyyy-mm-dd. مقدار باید از همان نوع ستونی باشد که با آن مقایسه میشود.
عملگر در میانه مشخص میشود
عملگرهای مقایسه بین نام ستون و مقدار قرار میگیرند. وجود فاصله در دو طرف عملگر مجاز ولی اجباری نیست. با این حال داخل نمادهای عملگر چندنویسهای نباید فاصله قرار گیرد؛ مانند <>, <=, >=.
مقایسهها در بند WHERE از دستور SELECT نوشته میشوند. بند WHERE باید بلافاصله پس از بند FROM بیاید. جدول نتیجه همهٔ ردیفهای جدول منبع را که مقایسه برای آنها درست است شامل میشود.
SELECT COUNTRY, AREA
FROM COUNTRIES
WHERE AREA > 3000000
| COUNTRY | AREA |
|---|
| USA | 3679192 |
| Canada | 3849674 |
| China | 3696100 |
| Brazil | 3286500 |
| Russia | 6592800 |
SELECT NAME, COUNTRY
FROM PERSONS
WHERE COUNTRY = 'RUSSIA'
| NAME | COUNTRY |
|---|
| Rand | Russia |
| Tolstoy | Russia |
| Chekhov | Russia |
| Babel | Russia |
SELECT NAME, BDATE
FROM PERSONS
WHERE BDATE < '1300-01-01'
| NAME | BDATE |
|---|
| Dante | 1265-03-31 |
| Shikabu | 1000-09-03 |
| Augustino | 0354-04-30 |
| Magnus | 1193-12-05 |
| Paul | 0013-06-01 |
- بند WHERE پس از بند FROM میآید.
- مقایسهها در بند WHERE وارد میشوند.
- ردیفهایی که مقایسه برای آنها True است نمایش داده میشوند.
خلاصهٔ نحو SELECT با WHERE| CLAUSE | PARAMETERS | EXAMPLE |
|---|
| SELECT | * | * |
| SELECT | col list | LANGUAGE, COUNTRY |
| FROM | table | JOBS |
| WHERE | col oper value | AREA > 3000000 |
خلاصهٔ عملگرهای مقایسه| OPERATOR | MEANING | EXAMPLE |
|---|
| = | Equal to | NAME = 'EINSTEIN' |
| <> | Not equal to | BDATE <> '1944-05-02' |
| < | Less than | POP < 100000 |
| <= | Less than or equal to | NAME <= 'O''Grady' |
| > | Greater than | AREA > 999 |
| >= | Greater than or equal to | BDATE >= '1962-06-19' |
تمرینها
- همهٔ ستونها و ردیفهای جدول COUNTRIES را نمایش دهید. سپس فقط کشورهایی را نمایش دهید که مساحتشان کمتر از ۳۰ مایل مربع است. نتیجه باید ۵ ردیف داشته باشد.
- نام و کشور همهٔ افراد جدول PERSONS را نمایش دهید، سپس نتیجه را به افراد متولد کانادا محدود کنید. نتیجهٔ نهایی ۶ ردیف دارد.
- نام و تاریخ تولد افرادی را که پس از 1964-01-01 متولد شدهاند نمایش دهید. نتیجه ۹ ردیف است.
امتیاز اضافه
- تاریخ تولد فردی با نام O'Toole چیست؟
مرتبسازی ردیفها
برای مرتبسازی ردیفهای جدول نتیجه از بند ORDER BY استفاده کنید. این بند اختیاری باید آخرین بند پرسوجو باشد. بهعنوان پارامتر میتوان نام ستون، موقعیت ستون در بند SELECT و کلیدواژهٔ DESC برای مرتبسازی نزولی را وارد کرد.
SELECT COUNTRY, AREA
FROM COUNTRIES
ORDER BY AREA
| COUNTRY | AREA |
|---|
| Monaco | 1 |
| Vatican City | 1 |
| Nauru | 8 |
| Tuvalu | 9 |
| San Marino | 24 |
SELECT COUNTRY, AREA
FROM COUNTRIES
ORDER BY 2
| COUNTRY | AREA |
|---|
| Monaco | 1 |
| Vatican City | 1 |
| Nauru | 8 |
| Tuvalu | 9 |
| San Marino | 24 |
SELECT COUNTRY, AREA
FROM COUNTRIES
ORDER BY AREA DESC
| COUNTRY | AREA |
|---|
| Russia | 6592800 |
| Canada | 3849674 |
| China | 3696100 |
| USA | 3679192 |
| Brazil | 3286500 |
- بند ORDER BY باید آخر باشد.
- میتوان نام ستون یا موقعیت آن را مشخص کرد.
- DESC مرتبسازی نزولی را مشخص میکند.
ردیفهای جدول نتیجه را میتوان بر اساس مقادیر بیش از یک ستون مرتب کرد؛ کافی است فهرست ستونها را در بند ORDER BY وارد کنید. ترتیب ستونها از چپ به راست، توالی اولویت از اصلی به فرعی را تعیین میکند.
SELECT LANGUAGE, POP
FROM COUNTRIES
ORDER BY LANGUAGE
| LANGUAGE | POP |
|---|
| Afrikaans | 1651545 |
| Albanian | 3413904 |
| Amharic | 55979018 |
| Arabic | 549338 |
| Arabic | 65359623 |
| Arabic | 533916 |
| Arabic | 20643769 |
SELECT LANGUAGE, POP
FROM COUNTRIES
ORDER BY LANGUAGE, POP DESC
| LANGUAGE | POP |
|---|
| Afrikaans | 1651545 |
| Albanian | 3413904 |
| Amharic | 55979018 |
| Arabic | 65359623 |
| Arabic | 30120420 |
| Arabic | 29168848 |
| Arabic | 28539321 |
- فهرست ستونها در بند ORDER BY مجاز است.
- نام ستونها با ویرگول جدا میشوند.
- ستونها به ترتیب اولویت اصلی تا فرعی فهرست میشوند.
خلاصهٔ نحو SELECT با ORDER BY| CLAUSE | PARAMETERS | EXAMPLE |
|---|
| SELECT | * | * |
| SELECT | col list | LANGUAGE, COUNTRY |
| FROM | table | JOBS |
| WHERE | col oper value | AREA > 3000000 |
| ORDER BY | col [ DESC ] list | LANGUAGE DESC, COUNTRY |
| ORDER BY | pos [ DESC ] list | 1 DESC, 3 |
تمرینها
- همهٔ ستونهای جدول PERSONS را برای افراد ایرلندی نمایش دهید. ۶ نفر هستند. آنها را به ترتیب الفبایی نمایش دهید.
- همهٔ ستونهای جدول COUNTRIES را برای کشورهای آلمانیزبان نمایش دهید. نتیجه ۴ ردیف دارد. سپس بر اساس GNP از بزرگترین به کوچکترین مرتب کنید.
- کشور، شغل و نام همهٔ ایتالیاییهای پایگاه داده را بر اساس نام مرتب کنید. نتیجه ۱۰ ردیف دارد.
امتیاز اضافه
- کدام کشور بیشترین بودجهٔ نظامی را دارد؟ کمترین را چطور؟ کدام بیشترین نیرو، بیشترین تانک، کشتی و هواپیما را دارد؟
حذف ردیفهای تکراری
معمولاً جدولها ردیف تکراری ندارند؛ اما اگر تنها زیرمجموعهای از ستونها انتخاب شود، نتیجهٔ پرسوجو ممکن است ردیفهای تکراری داشته باشد. کلیدواژهٔ DISTINCT در بند SELECT استفاده میشود تا ردیفهای تکراری در جدول نتیجه نمایش داده نشوند.
SELECT RELIGION
FROM RELIGIONS
WHERE PERCENT = 100
ORDER BY RELIGION
| RELIGION |
|---|
| Catholic |
| Catholic |
| Catholic |
| Eastern Or... |
| Lutheran |
| Muslim |
| Muslim |
| Muslim |
| Sunni Mus... |
SELECT DISTINCT RELIGION
FROM RELIGIONS
WHERE PERCENT = 100
ORDER BY RELIGION
| RELIGION |
|---|
| Catholic |
| Eastern Or... |
| Lutheran |
| Muslim |
| Sunni Mus... |
- DISTINCT بعد از کلیدواژهٔ SELECT وارد میشود.
- DISTINCT ردیفهای تکراری را حذف میکند.
- DISTINCT فقط یکبار در یک پرسوجو قابل ورود است.
خلاصهٔ نحو SELECT با DISTINCT| CLAUSE | PARAMETERS | EXAMPLE |
|---|
| SELECT | * | * |
| SELECT | [ DISTINCT ] col list | LANGUAGE, COUNTRY |
| FROM | table | JOBS |
| WHERE | col oper value | AREA > 3000000 |
| ORDER BY | col [ DESC ] list | LANGUAGE DESC, COUNTRY |
| ORDER BY | pos [ DESC ] list | 1 DESC, 3 |
تمرینها
- فقط ستون JOB را از جدول PERSONS نمایش دهید. ۴۰۲ ردیف وجود دارد ــ فعلاً شمارش نکنید. سپس ردیفهای تکراری را حذف کنید؛ فقط ۷ ردیف باید باقی بماند.
- فهرستی الفبایی از زبانهایی نمایش دهید که نرخ باسوادی آنها کمتر از ۳۰ درصد است. ردیفهای تکراری را حذف کنید. نتیجهٔ نهایی ۹ ردیف است.
- کشورهایی را که دستکم یک دانشمند تولید کردهاند بر اساس کشور مرتب کنید. ردیفهای تکراری را حذف کنید. تنها ۱۰ ردیف باید باقی بماند.
امتیاز اضافه
- فهرستی الفبایی از ادیانی بسازید که کمتر از پنج درصد جمعیت کشور آنها را پیروی میکنند. ردیفهای تکراری را حذف کنید. ۷ ردیف باید باقی بماند.