پایگاههای داده بخش اصلی بسیاری از وبسایتها و برنامهها هستند و نقشی کلیدی در ذخیره سازی و تبادل اطلاعات در اینترنت ایفا میکنند. یکی از وظایف مهم در مدیریت پایگاه داده، بازیابی دادههاست، چه به صورت مورد یو چه بعنوان بخشی از فرایندهای برنامه نویسی. یکی از رایجترین روشهای بازیابی اطلاعات، ارسال کوئری از طریق خط فرمان است. در سیستمهای مدیریت پایگاه داده رابطهای، کوئری دستوری است که برای استخراج دادهها از جداول استفاده میشود. در SQL، این کار اغلب با دستور SELECT انجام میشود. در این مطلب آموزش Query در MySQL، به نحوه نوشتن کوئریهای پایه SQL، توابع و عملگرهای پرکاربرد خواهیم پرداخت.
پیشنیازها
دستورات و مفاهیمی که در این راهنما ارائه شدهاند، به طور کلی در هر سیستمعامل مبتنی بر لینوکس و هر نرمافزار پایگاه داده SQL قابل استفاده هستند. با این حال، این راهنما برای یک سرور Ubuntu که MySQL روی آن نصب شده است، نوشته شده است. برای آمادهسازی این محیط، به موارد زیر نیاز دارید:
- یک سرور مجازی لینوکس با توزیع لینوکس اوبونتو که یک کاربر غیر روت (non-root) با دسترسیهای sudo در آن تنظیم شده باشد. میتوانید این تنظیمات را با استفاده از راهنمای تنظیم اولیه سرور ubuntu انجام دهید.
- نصب MySQL روی سرور. اگر هنوز MySQL را نصب نکردهاید، میتوانید از راهنمای نصب MySQL روی Ubuntu استفاده کنید.
ایجاد یک پایگاه داده نمونه
قبل از اینکه آموزش query در MySQL شروع کنیم به نوشتن کوئریها در SQL بپردازیم ابتدا یک پایگاه داده و چند جدول ایجاد خواهیم کرد و سپس این جداول را با دادههای نمونه پر میکنیم. این کار به شما این امکان را میدهد که تجربه عملی بدست آورید و بعدا وقتی شروع به نوشتن کوئریها میکنید، با دادههای واقعی کار کنید. برای پایگاه داده نمونهای که در طول این راهنما از آن استفاده خواهیم کرد، سناریو زیر را تصور کنید:
شما و چند نفر از دوستانتان همیشه تولدهای یکدیگر را جشن میگیرید. در هر مناسبت، اعضای گروه به بولینگ میروند، در یک تورنمنت دوستانه شرکت میکنند و سپس به خانه شما میروند، جایی که شما غذای مورد علاقه فردی که تولدش است را آماده میکنید. حالا که این سنت مدتی است که ادامه دارد، شما تصمیم گرفتهاید که رکوردهای این تورنمنتها را ثبت کنید. همچنین برای آسانتر کردن برنامهریزی برای شامها، تصمیم میگیرید که تاریخ تولد دوستانتان و غذاهای مورد علاقه آنها را ثبت کنید. به جای اینکه این اطلاعات را در دفترچه فیزیکی نگه دارید، تصمیم میگیرید که از مهارتهای پایگاه داده خود استفاده کنید و آن را در یک دیتابیس my sql ثبت کنید.
برای شروع، یک پنجره MySQL باز کنید و به عنوان کاربر روت MySQL وارد شوید:
sudo mysql
نکته: ممکن است کاربر root را طوری تنظیم کرده باشید که از طریق یک رمز عبور احراز هویت کند. در این صورت، میتوانید برای ورود به محیط MySQL از دستور زیر استفاده کنید:
mysql -u root -p
سپس با اجرای دستور زیر یک پایگاه داده ایجاد کنید:
CREATE DATABASE `birthdays`;
با دستور زیر این پایگاه داده را SELECT کنید:
USE birthdays;
سپس، دو جدول در این پایگاه داده ایجاد کنید. ما از جدول اول برای پیگیری رکوردهای دوستانتان در بولینگ استفاده خواهیم کرد. دستور زیر یک جدول به نام tourneys ایجاد میکند که شامل ستونهایی برای نام هر یک از دوستان شما، تعداد تورنمنتهایی که برنده شدهاند (Wins)، بهترین امتیاز آنها در طول تاریخ، و سایز کفش بولینگ آنها (Size) است:
CREATE TABLE tourneys (
name varchar(30),
wins real,
best real,
size real
);
پس از اجرای دستور CREATE TABLE و پر کردن آن با سرستونها، خروجی زیر را دریافت خواهید کرد:
Query OK, 0 rows affected (0.00 sec)
این به این معناست که جدول با موفقیت ایجاد شده است، اما هیچ دادهای به آن اضافه نشده است. حالا میتوانید دادهها را به این جدول وارد کنید. برای پر کردن جدول tourneys با دادههای نمونه، از کوئری های mysql زیر استفاده کنید:
INSERT INTO tourneys (name, wins, best, size)
VALUES ('Dolly', '7', '245', '8.5'),
('Etta', '4', '283', '9'),
('Irma', '9', '266', '7'),
('Barbara', '2', '197', '7.5'),
('Gladys', '13', '273', '8');
خروجی به شکل زیر خواهد بود:
Output
Query OK, 5 rows affected (0.01 sec)
Records: 5 Duplicates: 0 Warnings: 0
در ادامه، یک جدول دیگر در همان پایگاه داده ایجاد کنید که برای ذخیره اطلاعات مربوط به غذاهای مورد علاقه دوستانتان در تولد استفاده خواهد شد. به کمک آموزش کوئری نویسی در MySQL میتوانید یک جدول به نام dinners ایجاد کنید که شامل ستونهایی برای نام هر یک از دوستان شما، تاریخ تولدشان، غذای اصلی مورد علاقه، غذای جانبی ترجیحی و دسر مورد علاقه آنها است:
CREATE TABLE dinners (
name varchar(30),
birthdate date,
entree varchar(30),
side varchar(30),
dessert varchar(30)
);
به همین ترتیب، برای این جدول نیز پس از اجرای دستور، بازخوردی دریافت خواهید کرد که تأیید میکند دستور با موفقیت اجرا شده است.
برای مثال، در محیط MySQL معمولاً پیامی مشابه زیر نمایش داده میشود:
Output
Query OK, 0 rows affected (0.01 sec)
با اجرای این دستور، جدول غذاها با ستونهای مورد نظر ایجاد خواهد شد که میتوانید دادههای مربوط به غذاهای مورد علاقه دوستانتان را در آن ذخیره کنید. به طور مشابه، پس از اجرای دستور CREATE TABLE برای جدول غذاها خروجی تاییدی دریافت خواهید کرد که نشان میدهد دستور با موفقیت اجرا شده است. برای پر کردن جدول غذاها با دادههای نمونه، از دستور زیر استفاده کنید:
INSERT INTO dinners (name, birthdate, entree, side, dessert)
VALUES ('Dolly', '1946-01-19', 'steak', 'salad', 'cake'),
('Etta', '1938-01-25', 'chicken', 'fries', 'ice cream'),
('Irma', '1941-02-18', 'tofu', 'fries', 'cake'),
('Barbara', '1948-12-25', 'tofu', 'salad', 'ice cream'),
('Gladys', '1944-05-28', 'steak', 'fries', 'ice cream');
Output
Query OK, 5 rows affected (0.00 sec)
Records: 5 Duplicates: 0 Warnings: 0
اکنون میتوانیم به ساختار اصلی دستورات SELECT بپردازیم که برای بازیابی دادهها از پایگاه داده استفاده میشوند. این بخش به شما نشان میدهد چگونه دادههای مورد نیاز خود را از جداول استخراج کنید و اصول اولیه استفاده از کوئری SELECT را درک کنید.
آشنایی با دستورات SELECT
همانطور که در مقدمه ذکر شد، تقریباً تمام کوئریهای SQL با دستور SELECT آغاز میشوند. دستور SELECT برای مشخص کردن اینکه کدام ستونها از یک جدول باید در مجموعه نتایج بازگشت داده شوند استفاده میشود. به علاوه، کوئریها معمولاً شامل FROM نیز هستند که برای مشخص کردن جدولی است که دستور باید آن را جستجو کند. به طور کلی، ساختار کوئریهای SQL به این شکل است:
SELECT column_to_select
FROM table_to_select
WHERE certain_conditions_apply;
در این ساختار:
- column_to_select: ستونی که میخواهید از آن دادهها را انتخاب کنید.
- table_to_select: جدولی که میخواهید از آن دادهها را استخراج کنید.
- WHERE: شرطی که باید برای انتخاب دادهها اعمال شود (اختیاری است).
برای مثال، دستور زیر کل ستون name از جدول dinners را برمیگرداند:
SELECT name FROM dinners;
خروجی به شکل زیر خواهد بود:
Output
+---------+
| name |
+---------+
| Dolly |
| Etta |
| Irma |
| Barbara |
| Gladys |
+---------+
5 rows in set (0.00 sec)
شما میتوانید چندین ستون را از یک جدول با جداسازی نامهای آنها با کاما، مانند موارد زیر انتخاب کنید:
SELECT name, birthdate FROM dinners;
خروجی به شکل زیر خواهد بود:
Output
+---------+------------+
| name | birthdate |
+---------+------------+
| Dolly | 1946-01-19 |
| Etta | 1938-01-25 |
| Irma | 1941-02-18 |
| Barbara | 1948-12-25 |
| Gladys | 1944-05-28 |
+---------+------------+
5 rows in set (0.00 sec)
به جای نام بردن از یک ستون یا مجموعهای از ستونها، میتوانید بعد از عملگر SELECT از ستاره (*) استفاده کنید که به عنوان یک جایگزین برای نمایش همه ستونها در جدول عمل میکند. دستور زیر تمام ستونهای جدول tourneys را باز میگرداند:
SELECT * FROM tourneys;
خروجی:
Output
+---------+------+------+------+
| name | wins | best | size |
+---------+------+------+------+
| Dolly | 7 | 245 | 8.5 |
| Etta | 4 | 283 | 9 |
| Irma | 9 | 266 | 7 |
| Barbara | 2 | 197 | 7.5 |
| Gladys | 13 | 273 | 8 |
+---------+------+------+------+
5 rows in set (0.00 sec)
عبارت WHERE در کوئریها برای فیلتر کردن رکوردها استفاده میشود، به گونهای که فقط رکوردهایی که شرایط مشخصشده را برآورده میکنند، در نتیجه باقی بمانند. رکوردهایی که شرایط را نداشته باشند، حذف میشوند. دستور WHERE عموما به این شکل نوشته میشود:
. . . WHERE column_name comparison_operator value
عملگر مقایسه در عبارت WHERE مشخص میکند که ستون انتخابشده چگونه باید با مقدار موردنظر مقایسه شود. در اینجا برخی از رایجترین عملگرهای مقایسه در SQL آورده شده است:
[جدول]
SQL اجازه استفاده از کاراکترهای wildcard (نمادهای جایگزین) را میدهد که به ویژه در جملات WHERE بسیار مفید هستند. نماد درصد (%) نمایانگر صفر یا بیشتر کاراکترهای ناشناخته است و زیرخط (_) نمایانگر یک کاراکتر ناشناخته واحد است. این نمادها زمانی مفید هستند که شما در تلاشید تا یک ورودی خاص را در یک جدول پیدا کنید، اما دقیقاً نمیدانید که آن ورودی چیست. برای مثال، فرض کنید که شما نام غذای محبوب چند نفر از دوستانتان را فراموش کردهاید، اما مطمئنید که این غذا با حرف “t” شروع میشود. شما میتوانید با اجرای کوئری زیر نام آن غذا را پیدا کنید:
SELECT name, entree
FROM dinners
WHERE entree LIKE 't%';
خروجی:
+--------+
| entree |
+--------+
| tofu |
| tofu |
+--------+
2 rows in set (0.00 sec)
LIKE ‘t%’: به این معنی است که نام غذا باید با “t” شروع شود و هر تعداد کاراکتر بعد از آن میتواند وجود داشته باشد. براساس خروجی فوق، مشاهده میکنیم که غذای محبوبی که فراموش کرده بودیم “tofu” است. ممکن است زمانی با پایگاهدادههایی کار کنید که ستونها یا جداول آنها نامهای طولانی یا سختخوان دارند. در اینگونه موارد، میتوانید با استفاده از کلمه کلیدی AS یک نام مستعار (alias) برای آنها بسازید تا خوانایی بهتر شود. نامهای مستعار که با AS ایجاد میشوند، موقتی هستند و فقط برای مدت زمان اجرای همان کوئری که در آن ساخته شدهاند، وجود دارند. به عنوان مثال:
SELECT name AS n, birthdate AS b, dessert AS d
FROM dinners;
خروجی:
+---------+------------+-----------+
| n | b | d |
+---------+------------+-----------+
| Dolly | 1946-01-19 | cake |
| Etta | 1938-01-25 | ice cream |
| Irma | 1941-02-18 | cake |
| Barbara | 1948-12-25 | ice cream |
| Gladys | 1944-05-28 | ice cream |
+---------+------------+-----------+
5 rows in set (0.00 sec)
در اینجا:
- name AS n: به معنی این است که ستون “name” با نام مستعار “n” نمایش داده میشود.
- birthdate AS b: ستون “birthdate” با نام مستعار “b” نمایش داده میشود.
- dessert AS d: ستون “dessert” با نام مستعار “d” نمایش داده میشود.
مثالهایی که تاکنون بررسی کردهایم، شامل برخی از رایجترین کلمات کلیدی و دستورات در کوئریهای SQL بودهاند. اینها برای کوئریهای پایه مفید هستند، اما وقتی که بخواهید محاسباتی انجام دهید یا مقداری اسکالر (یک مقدار واحد، برخلاف مجموعهای از مقادیر مختلف) بر اساس دادههایتان بهدست آورید، این دستورات کاربردی نخواهند بود. در اینجاست که توابع تجمعی (aggregate functions) وارد میشوند.
توابع تجمعی به شما این امکان را میدهند که دادههایتان را جمعآوری کرده و به صورت مفیدتری نتایج را تجزیه و تحلیل کنید. این توابع بهویژه زمانی مفید هستند که بخواهید مقادیری مانند مجموع، میانگین، یا تعداد موارد مختلف را محاسبه کنید.
توابع تجمعی
اغلب اوقات، زمانی که با دادهها کار میکنید، لزوماً نیازی به مشاهده خود دادهها ندارید. بلکه شما به اطلاعاتی دربارهی دادهها نیاز دارید. دستور SQL شامل تعدادی تابع است که به شما این امکان را میدهد که تنها با ارسال یک کوئری SELECT، دادههای خود را تفسیر یا محاسباتی روی آنها انجام دهید. این توابع به عنوان توابع تجمعی شناخته میشوند. تابع COUNT تعداد ردیفهایی که با یک معیار خاص مطابقت دارند را میشمارد و برمیگرداند. به عنوان مثال، اگر بخواهید بدانید چند نفر از دوستان شما توفو را به عنوان غذای اصلی تولد خود ترجیح میدهند، میتوانید این کوئری را اجرا کنید:
SELECT COUNT(entree) FROM dinners WHERE entree = 'tofu';
خروجی:
+---------------+
| COUNT(entree) |
+---------------+
| 2 |
+---------------+
1 row in set (0.00 sec)
تابع AVG میانگین (میانه) مقدار یک ستون را برمیگرداند. با استفاده از جدول مثال ما، میتوانید میانگین بهترین امتیاز دوستان خود را با این کوئری پیدا کنید:
SELECT AVG(best) FROM tourneys;
خروجی:
Output
+-----------+
| AVG(best) |
+-----------+
| 252.8 |
+-----------+
1 row in set (0.00 sec)
تابع SUM برای پیدا کردن مجموع کل مقادیر یک ستون استفاده میشود. به عنوان مثال، اگر بخواهید ببینید شما و دوستانتان در طول سالها چه تعداد بازی بولینگ کردهاید، میتوانید این کوئری را اجرا کنید:
SELECT SUM(wins) FROM tourneys;
خروجی:
Output
+-----------+
| AVG(best) |
+-----------+
| 252.8 |
+-----------+
1 row in set (0.00 sec)
توجه داشته باشید که توابع AVG (میانگین) و SUM (جمع) فقط در صورتی به درستی عمل میکنند که با دادههای عددی استفاده شوند. اگر تلاش کنید این توابع را روی دادههای غیر عددی اجرا کنید، بسته به سیستم مدیریت پایگاه داده رابطهای (RDBMS) که استفاده میکنید، یا با خطا مواجه خواهید شد یا نتیجه صرفاً 0 خواهد بود.
SELECT SUM(entree) FROM dinners;
+-------------+
| SUM(entree) |
+-------------+
| 0 |
+-------------+
1 row in set, 5 warnings (0.00 sec)
تابع MIN برای پیدا کردن کوچکترین مقدار در یک ستون خاص استفاده میشود. شما میتوانید از این کوئری برای مشاهده بدترین رکورد بولینگ (از نظر تعداد پیروزیها) استفاده کنید:
SELECT MIN(wins) FROM tourneys;
به طور مشابه، تابع MAX برای پیدا کردن بزرگترین مقدار عددی در یک ستون استفاده میشود. کوئری زیر بهترین رکورد بولینگ را نمایش خواهد داد:
SELECT MAX(wins) FROM tourneys;
خروجی:
+-----------+
| MIN(wins) |
+-----------+
| 2 |
+-----------+
1 row in set (0.00 sec)
به همین ترتیب، زمانی که تابع MAX روی ستونی که شامل مقادیر متنی است اجرا شود، آخرین مقدار به ترتیب الفبایی را نمایش میدهد:
SELECT MAX(name) FROM dinners;
خروجی:
+-----------+
| MAX(wins) |
+-----------+
| 13 |
+-----------+
1 row in set (0.00 sec)
برخلاف توابع SUM و AVG، توابع MIN (کوچکترین مقدار) و MAX (بزرگترین مقدار) را میتوان برای هر دو نوع داده عددی و الفبایی استفاده کرد.
هنگامی که این توابع روی یک ستون شامل مقادیر متنی (رشتهای) اجرا شوند:
- تابع MIN اولین مقدار را به ترتیب حروف الفبا نشان میدهد.
- تابع MAX آخرین مقدار را به ترتیب حروف الفبا نمایش میدهد.
SELECT MIN(name) FROM dinners;
خروجی:
+-----------+
| MIN(name) |
+-----------+
| Barbara |
+-----------+
1 row in set (0.00 sec)
به همین ترتیب، وقتی تابع MAX روی یک ستون شامل مقادیر متنی (رشتهای) اجرا شود، آخرین مقدار را به ترتیب حروف الفبا نمایش میدهد.
SELECT MAX(name) FROM dinners;
خروجی:
+-----------+
| MAX(name) |
+-----------+
| Irma |
+-----------+
1 row in set (0.00 sec)
توابع تجمعی (aggregate functions) کاربردهای زیادی فراتر از مواردی دارند که در این بخش توضیح داده شد. آنها بهویژه زمانی که با عبارت GROUP BY ترکیب میشوند، بسیار مفید خواهند بود. این مبحث و چندین عبارت دیگر که تأثیر زیادی روی نحوه مرتبسازی نتایج دارند، در بخش بعدی توضیح داده خواهند شد.
دستکاری نتایج کوئریها
علاوه بر عبارتهای FROM و WHERE، چندین عبارت دیگر وجود دارند که برای دستکاری نتایج یک پرسوجو SELECT استفاده میشوند. در این بخش، ما برخی از پرکاربردترین عبارتهای پرسوجو را توضیح داده و برای هرکدام مثالهایی ارائه خواهیم داد. یکی از پرکاربردترین عبارتهای پرسوجو، علاوه بر FROM و WHERE، عبارت GROUP BY است. این عبارت معمولاً زمانی استفاده میشود که شما یک تابع تجمعی را روی یک ستون اجرا میکنید، اما در ارتباط با مقادیر مشابه در ستون دیگری. برای مثال، فرض کنید میخواهید بدانید که چند نفر از دوستان شما هر کدام از سه نوع غذای اصلی که شما تهیه میکنید، را ترجیح میدهند. در اینجا، تابع COUNT تعداد افرادی را که هر نوع غذا را ترجیح میدهند، شمارش میکند و سپس این نتایج بر اساس غذاهایی که هر فرد ترجیح میدهد گروهبندی میشود. میتوانید این اطلاعات را با کوئریزیر به دست آورید:
SELECT COUNT(name), entree FROM dinners GROUP BY entree;
خروجی:
+-------------+---------+
| COUNT(name) | entree |
+-------------+---------+
| 1 | chicken |
| 2 | steak |
| 2 | tofu |
+-------------+---------+
3 rows in set (0.00 sec)
عبارت ORDER BY برای مرتبسازی نتایج پرسوجو استفاده میشود. به طور پیشفرض، مقادیر عددی به صورت صعودی و مقادیر متنی به ترتیب حروف الفبا مرتب میشوند. برای مثال، پرسوجوی زیر ستونهای نام و تاریخ تولد را فهرست میکند، اما نتایج را بر اساس تاریخ تولد مرتب میسازد:
SELECT name, birthdate FROM dinners ORDER BY birthdate;
توجه داشته باشید که رفتار پیشفرض عبارت ORDER BY این است که نتایج را به صورت صعودی مرتب میکند. برای معکوس کردن این رفتار و مرتبسازی نتایج به صورت نزولی، میتوانید عبارت DESC را به انتهای پرسوجو اضافه کنید:
SELECT name, birthdate FROM dinners ORDER BY birthdate DESC;
همانطور که پیشتر اشاره شد، عبارت WHERE برای فیلتر کردن نتایج بر اساس شرایط خاص استفاده میشود. با این حال، اگر از عبارت WHERE همراه با یک تابع تجمعی (aggregate function) استفاده کنید، خطا دریافت خواهید کرد. اینطور که در مثال زیر مشاهده میکنید، در تلاش برای یافتن اینکه کدام طرفدیشها حداقل مورد علاقه سه نفر از دوستانتان هستند:
SELECT COUNT(name), side FROM dinners WHERE COUNT(name) >= 3;
این پرسوجو خطا میدهد زیرا نمیتوان از COUNT به طور مستقیم در عبارت WHERE استفاده کرد. برای حل این مشکل، باید از HAVING به جای WHERE استفاده کرد که مخصوص فیلتر کردن نتایج پس از انجام توابع تجمعی است.
عبارت HAVING به SQL افزوده شده است تا عملکردی مشابه به عبارت WHERE داشته باشد، اما به طور خاص با توابع تجمعی (aggregate functions) سازگار است. برای درک تفاوت بین این دو عبارت، میتوان گفت که WHERE به رکوردهای فردی اعمال میشود، در حالی که HAVING به رکوردهای گروهی اعمال میشود. بنابراین، هر بار که از عبارت HAVING استفاده میکنید، باید عبارت GROUP BY نیز وجود داشته باشد. مثال زیر نشان میدهد که چگونه میتوانیم بدون خطا، تلاش کنیم که ببینیم کدام مورد علاقه حداقل سه نفر از دوستانتان هستند:
SELECT COUNT(name), side FROM dinners GROUP BY side HAVING COUNT(name) >= 3;
توابع تجمعی برای خلاصهسازی نتایج یک ستون خاص در یک جدول به کار میروند. با این حال، در بسیاری از مواقع نیاز است که محتوای بیش از یک جدول را همزمان کوئری کنید. در بخش بعدی، چند روش برای انجام این کار را بررسی خواهیم کرد.
کوئرینویسی از چندین جدول
بیشتر اوقات، یک پایگاه داده شامل چندین جدول است که هر کدام مجموعههای مختلفی از دادهها را نگه میدارند. SQL روشهای مختلفی برای اجرای یک کوئری بر روی چندین جدول فراهم میکند. برای ترکیب سطرها از دو یا بیشتر جدول در یک نتیجه کوئری، میتوان از عبارت JOIN استفاده کرد. این کار از طریق یافتن یک ستون مرتبط بین جداول انجام میشود و نتایج بهطور مناسب در خروجی مرتب میشود. کوئریهایی که شامل عبارت JOIN هستند معمولاً از این دستورالعمل استفاده میکنند:
SELECT table1.column1, table2.column2
FROM table1
JOIN table2 ON table1.related_column = table2.related_column;
توجه داشته باشید که چون عبارتهای JOIN محتویات بیش از یک جدول را مقایسه میکنند، در مثال قبلی مشخص شده است که از کدام جدول باید هر ستون انتخاب شود، با قرار دادن نام جدول به همراه یک نقطه قبل از نام ستون. شما میتوانید برای هر کوئری اینگونه مشخص کنید که هر ستون باید از کدام جدول انتخاب شود، هرچند این کار در هنگام انتخاب از یک جدول تنها، مانند مثالهای قبلی، ضروری نیست. بیایید یک مثال را با استفاده از دادههای نمونهمان بررسی کنیم.
تصور کنید که میخواهید برای هر کدام از دوستانتان یک جفت کفش بولینگ به عنوان هدیه تولد بخرید. از آنجا که اطلاعات مربوط به تاریخ تولد و اندازه کفش دوستانتان در جداول جداگانه ذخیره شده است، شما میتوانید هر جدول را به صورت جداگانه کوئری کرده و نتایج را با هم مقایسه کنید. اما با استفاده از عبارت JOIN میتوانید تمام اطلاعات مورد نظر را با یک کوئری پیدا کنید:
SELECT tourneys.name, tourneys.size, dinners.birthdate
FROM tourneys
JOIN dinners ON tourneys.name=dinners.name;
عبارت JOIN که در این مثال استفاده شده است، بدون هیچگونه پارامتر دیگری، یک عبارت INNER JOIN است. این به این معنی است که تمامی رکوردهایی که دارای مقادیر مطابق در هر دو جدول هستند، انتخاب شده و در مجموعه نتایج چاپ میشوند، در حالی که رکوردهایی که تطابق ندارند، از نتایج حذف میشوند. برای روشنتر شدن این مفهوم، بیایید یک ردیف جدید به هر جدول اضافه کنیم که ورودی مربوطه در جدول دیگر وجود ندارد:
INSERT INTO tourneys (name, wins, best, size)
VALUES ('Bettye', '0', '193', '9');
INSERT INTO dinners (name, birthdate, entree, side, dessert)
VALUES ('Lesley', '1946-05-02', 'steak', 'salad', 'ice cream');
در این صورت، پس از اجرای کوئری JOIN، رکوردهای مربوط به “Bettye” و “Lesley” در نتایج ظاهر نخواهند شد، زیرا هیچ تطابقی برای آنها در جدول دیگر وجود ندارد. اگر کوئری را دوباره با استفاده از عبارت JOIN اجرا کنید، خروجی به صورت زیر خواهد بود:
SELECT tourneys.name, tourneys.size, dinners.birthdate
FROM tourneys
JOIN dinners ON tourneys.name=dinners.name;
این کوئری تنها رکوردهایی را که در هر دو جدول تطابق دارند، باز میگرداند. بنابراین، رکوردهای “Bettye” و “Lesley” که قبلاً اضافه کردهایم و در هیچکدام از جداول مربوطه تطابق ندارند، در نتایج نخواهند بود. نتیجه کوئری برای کسانی که تطابق دارند به این صورت خواهد بود:
- Dolly، 8.5، 1946-01-19
- Etta، 9، 1938-01-25
- Irma، 7، 1941-02-18
- Barbara، 7.5، 1948-12-25
- Gladys، 8، 1944-05-28
جمع بندی
در این مطلب به آموزش Query در MySQL پرداختیم و با دستورات و کوئریهای رایج آشنا شدیم. اجرای کوئریها یکی از رایجترین وظایف در حوزه مدیریت پایگاه دادهها است. ابزارهای مختلفی مانند phpMyAdmin یا pgAdmin وجود دارند که به شما این امکان را میدهند تا کوئریها را اجرا کرده و نتایج آنها را مشاهده کنید، اما اجرای دستورات SELECT از طریق خط فرمان هنوز هم یک روش معمول است که همچنین کنترل بیشتری را در اختیار شما قرار میدهد. اگر شما تازه کار با SQL را شروع کردهاید، پیشنهاد میکنیم از Cheat Sheet SQL ما به عنوان مرجع استفاده کرده و مستندات رسمی MySQL را بررسی کنید.