لطفا صبر کنید ...

عملیات Join در پایگاه داده MySQL

مریم مهربان

توسط مریم مهربان

دیدگاه ها: 0
بازدید ها : 114
رایگان
هدف ما این است که شما، در بالاترین سطح طراحی و توسعه وب باشید.

ثبت نام کنید

در آموزش‌های قبل، ما جدول‌های friends یا houses را به صورت جداگانه استفاده کردیم. اما در این آموزش از لیداوب قصد داریم نحوه ترکیب جدول‌ها در پرس و جو را با هم یاد بگیریم. در MySQL، برای این کار از تابع Join استفاده می‌شود.


پیش از معرفی انواع Join ، ساختار جدول‌های friends و houses را با هم مرور می‌کنیم. همانطور که مشاهده می‌کنید در هر دو جدول، ستون house_id وجود دارد.

Join داخلی در پایگاه داده mysql

 انواع متفاوتی از join وجود دارد، اما join داخلی، رایج‌ترین نوعی است که استفاده می‌شود. در عکس زیر، دایره سمت چپ، جدول friends و دایره سمت راست، جدول houses را نشان می‌دهد. همانگونه که در تصویر زیر مشاهده می‌کنید، در این دو جدول ستون house_id مشترک است و چون این دو جدول در وسط نمودار قرار دارند، به این نوع ترکیب، join داخلی یا inner join گفته می‌شود. پیش از اینکه این مورد را با پرس و جوهای مختلف یاد بگیریم، اطلاعات چند فرد را به جدول friends اضافه می‌کنیم که چون همیشه در حال مسافرت هستند، مقدار ستون house_id آن‌ها را با null مقداردهی کردیم.

mysql> show tables;
+---------------------+
| Tables_in_addresses |
+---------------------+
| friends             |
| houses              |
+---------------------+
2 rows in set (0.00 sec)

mysql> describe friends;
+------------+----------------------+------+-----+------------+-------+
| Field      | Type                 | Null | Key | Default    | Extra |
+------------+----------------------+------+-----+------------+-------+
| first_name | varchar(40)          | NO   | PRI |            |       |
| last_name  | varchar(40)          | NO   | PRI |            |       |
| cell_phone | varchar(20)          | NO   |     |            |       |
| birthday   | date                 | NO   | PRI | 0000-00-00 |       |
| house_id   | smallint(5) unsigned | YES  |     | NULL       |       |
+------------+----------------------+------+-----+------------+-------+
5 rows in set (0.03 sec)

mysql> describe houses;
+----------------+----------------------+------+-----+---------+----------------+
| Field          | Type                 | Null | Key | Default | Extra          |
+----------------+----------------------+------+-----+---------+----------------+
| house_id       | smallint(5) unsigned | NO   | PRI | NULL    | auto_increment |
| address        | varchar(120)         | NO   | UNI |         |                |
| home_telephone | varchar(25)          | YES  |     | NULL    |                |
+----------------+----------------------+------+-----+---------+----------------+
3 rows in set (0.06 sec)
mysql> insert into friends set first_name='Sandy', last_name='Sholes';
Query OK, 1 row affected (0.00 sec)

mysql> insert into friends set first_name='Heather', last_name='Jeffries';
Query OK, 1 row affected (0.00 sec)

در قسمت زیر چند مثال از join داخلی را با هم مشاهده می‌کنیم.

پرس و جوی اول، دو جدول friends و houses را با استفاده از شناسه خانه (house_id) با هم ترکیب می‌کند و سپس نام کوچک و نام خانوادگی را از جدول ترکیب شده استخراج می‌کند. برای مشخص کردن ستون مشترک از کلیدواژه using استفاده شده است.

mysql> select first_name, last_name, address from friends

    -> inner join houses using (house_id);

+------------+------------+---------------------------------+

| first_name | last_name  | address                         |

+------------+------------+---------------------------------+

| Brenda     | Penblanc   | 87 Highcrest St, Orlando FL     |

| Dave       | Chappelle  | 88 Bundy Drive, Stowe VT        |

| Emmet      | Brickowski | 836 Shark Ave, Chatham MA       |

| Frankie    | Farmington | 92 Buzzfeed Lane, Denver CO     |

| Jack       | Penblanc   | 87 Highcrest St, Orlando FL     |

| Jacob      | Olivio     | 12 Dunpoto Street, Boston MA    |

| Jim        | Jones      | 54 Main Street, Conway NH       |

| Mary       | Olivio     | 12 Dunpoto Street, Boston MA    |

| Sheila     | Farmington | 92 Buzzfeed Lane, Denver CO     |

| Sofia      | Vergara    | 742 Applewild, San Francisco CA |

+------------+------------+---------------------------------+

10 rows in set (0.03 sec)

پرسوجوی دوم، همان پرس و جوی بالا را با inner join انجام می‌دهد، اما نحو آن کمی متفاوت است. در این نحو از کلیدواژه on استفاده می‌شود که در آن ستون‌هایی که قصد داریم ترکیب جدول‌ها براساس آن انجام شود، مشخص می‌کنیم. به عبارت دیگر، ما از پایگاه داده می‌خواهیم که آدرس، نام کوچک و نام خانوادگی افرادی از دو جدول friends و houses را به ما بدهد که house_id آن‌ها در این دو جدول با هم یکسان باشد.

mysql> select first_name, last_name, address from friends

    -> inner join houses on friends.house_id = houses.house_id;

+------------+------------+---------------------------------+

| first_name | last_name  | address                         |

+------------+------------+---------------------------------+

| Brenda     | Penblanc   | 87 Highcrest St, Orlando FL     |

| Dave       | Chappelle  | 88 Bundy Drive, Stowe VT        |

| Emmet      | Brickowski | 836 Shark Ave, Chatham MA       |

| Frankie    | Farmington | 92 Buzzfeed Lane, Denver CO     |

| Jack       | Penblanc   | 87 Highcrest St, Orlando FL     |

| Jacob      | Olivio     | 12 Dunpoto Street, Boston MA    |

| Jim        | Jones      | 54 Main Street, Conway NH       |

| Mary       | Olivio     | 12 Dunpoto Street, Boston MA    |

| Sheila     | Farmington | 92 Buzzfeed Lane, Denver CO     |

| Sofia      | Vergara    | 742 Applewild, San Francisco CA |

+------------+------------+---------------------------------+

10 rows in set (0.00 sec)

 

در MySQL، می‌توانید به جای واژه inner join از واژه join استفاده کنید. به عبارت دیگر، به کار بردن واژه inner در پرس و جوها اختیاری است.

mysql> select first_name, last_name, address from friends

    -> join houses using (house_id);

+------------+------------+---------------------------------+

| first_name | last_name  | address                         |

+------------+------------+---------------------------------+

| Brenda     | Penblanc   | 87 Highcrest St, Orlando FL     |

| Dave       | Chappelle  | 88 Bundy Drive, Stowe VT        |

| Emmet      | Brickowski | 836 Shark Ave, Chatham MA       |

| Frankie    | Farmington | 92 Buzzfeed Lane, Denver CO     |

| Jack       | Penblanc   | 87 Highcrest St, Orlando FL     |

| Jacob      | Olivio     | 12 Dunpoto Street, Boston MA    |

| Jim        | Jones      | 54 Main Street, Conway NH       |

| Mary       | Olivio     | 12 Dunpoto Street, Boston MA    |

| Sheila     | Farmington | 92 Buzzfeed Lane, Denver CO     |

| Sofia      | Vergara    | 742 Applewild, San Francisco CA |

+------------+------------+---------------------------------+

10 rows in set (0.03 sec)

mysql> select first_name, last_name, address from friends

    -> join houses on friends.house_id = houses.house_id;

+------------+------------+---------------------------------+

| first_name | last_name  | address                         |

+------------+------------+---------------------------------+

| Brenda     | Penblanc   | 87 Highcrest St, Orlando FL     |

| Dave       | Chappelle  | 88 Bundy Drive, Stowe VT        |

| Emmet      | Brickowski | 836 Shark Ave, Chatham MA       |

| Frankie    | Farmington | 92 Buzzfeed Lane, Denver CO     |

| Jack       | Penblanc   | 87 Highcrest St, Orlando FL     |

| Jacob      | Olivio     | 12 Dunpoto Street, Boston MA    |

| Jim        | Jones      | 54 Main Street, Conway NH       |

| Mary       | Olivio     | 12 Dunpoto Street, Boston MA    |

| Sheila     | Farmington | 92 Buzzfeed Lane, Denver CO     |

| Sofia      | Vergara    | 742 Applewild, San Francisco CA |

+------------+------------+---------------------------------+

10 rows in set (0.00 sec)

 

کوتاه کردن نام جدول در پرس و جوهای mysql

اگر نام جدول مورد استفاده شما طولانی است، این احتمال وجود دارد که با یک خطای املایی در نوشتن نام آن، موفق به اجرای پرس و جوی خود نشوید. برای اینکه این اتفاق برای شما رخ ندهد، پیشنهاد می‌کنیم به جای نام‌های طولانی از نام مستعار استفاده کنید. به این منظور، کلیدواژه as به کار می‌رود. در پرس و جوی زیر، از حرف “h” به جای houses و از حرف f به جای “friends” استفاده شده است.

mysql> select first_name, last_name, address from friends as f

    -> inner join houses as h on f.house_id = h.house_id;

+------------+------------+---------------------------------+

| first_name | last_name  | address                         |

+------------+------------+---------------------------------+

| Brenda     | Penblanc   | 87 Highcrest St, Orlando FL     |

| Dave       | Chappelle  | 88 Bundy Drive, Stowe VT        |

| Emmet      | Brickowski | 836 Shark Ave, Chatham MA       |

| Frankie    | Farmington | 92 Buzzfeed Lane, Denver CO     |

| Jack       | Penblanc   | 87 Highcrest St, Orlando FL     |

| Jacob      | Olivio     | 12 Dunpoto Street, Boston MA    |

| Jim        | Jones      | 54 Main Street, Conway NH       |

| Mary       | Olivio     | 12 Dunpoto Street, Boston MA    |

| Sheila     | Farmington | 92 Buzzfeed Lane, Denver CO     |

| Sofia      | Vergara    | 742 Applewild, San Francisco CA |

+------------+------------+---------------------------------+

10 rows in set (0.00 sec)

در پرس و جوی زیر، تمامی ستون‌های حاصل از ترکیب دو جدول را از پایگاه داده درخواست کردیم. به این منظور، در بخش select پرس و جو، *  نوشتیم.

mysql> select * from friends as f

    -> inner join houses as h on f.house_id = h.house_idG

*************************** 1. row ***************************

    first_name: Jim

     last_name: Jones

    cell_phone: 423-1423

      birthday: 1985-07-24

      house_id: 1

      house_id: 1

       address: 54 Main Street, Conway NH

home_telephone: 153-3487

*************************** 2. row ***************************

    first_name: Sofia

     last_name: Vergara

    cell_phone: 487-4612

      birthday: 1972-07-10

      house_id: 2

      house_id: 2

       address: 742 Applewild, San Francisco CA

home_telephone: 487-1235

*************************** 3. row ***************************

    first_name: Emmet

     last_name: Brickowski

    cell_phone: 987-1244

      birthday: 2013-07-15

      house_id: 3

      house_id: 3

       address: 836 Shark Ave, Chatham MA

home_telephone: 876-4576

*************************** 4. row ***************************

    first_name: Dave

     last_name: Chappelle

    cell_phone: 977-5555

      birthday: 1973-08-24

      house_id: 4

      house_id: 4

       address: 88 Bundy Drive, Stowe VT

home_telephone: 746-9487

*************************** 5. row ***************************

    first_name: Brenda

     last_name: Penblanc

    cell_phone: 719-4521

      birthday: 1970-02-15

      house_id: 5

      house_id: 5

       address: 87 Highcrest St, Orlando FL

home_telephone: 198-4723

*************************** 6. row ***************************

    first_name: Jack

     last_name: Penblanc

    cell_phone: 581-1841

      birthday: 1967-04-23

      house_id: 5

      house_id: 5

       address: 87 Highcrest St, Orlando FL

home_telephone: 198-4723

*************************** 7. row ***************************

    first_name: Frankie

     last_name: Farmington

    cell_phone: 978-1235

      birthday: 1977-04-17

      house_id: 6

      house_id: 6

       address: 92 Buzzfeed Lane, Denver CO

home_telephone: 258-4723

*************************** 8. row ***************************

    first_name: Sheila

     last_name: Farmington

    cell_phone: 591-8522

      birthday: 1977-07-12

      house_id: 6

      house_id: 6

       address: 92 Buzzfeed Lane, Denver CO

home_telephone: 258-4723

*************************** 9. row ***************************

    first_name: Jacob

     last_name: Olivio

    cell_phone: 512-3411

      birthday: 1972-10-01

      house_id: 7

      house_id: 7

       address: 12 Dunpoto Street, Boston MA

home_telephone: NULL

*************************** 10. row ***************************

    first_name: Mary

     last_name: Olivio

    cell_phone: 412-9823

      birthday: 1972-11-11

      house_id: 7

      house_id: 7

       address: 12 Dunpoto Street, Boston MA

home_telephone: NULL

10 rows in set (0.00 sec)

JOIN خارجی در پایگاه داده mysql

در JOIN خارجی، مجددا دو جدول براساس یک ستون با هم ترکیب می‌شوند، اما بسته به اینکه JoIN خارجی از چه نوعی باشد، می‌توانیم اطلاعات یک جدول را در خروجی در اختیار داشته باشیم.

Left Join

در این نوع JOIN، پس از ترکیب و مطابقت دوجدول، تنها اطلاعات جدول سمت چپ‌ استخرج می‌شود. برای مثال، در پرس و جوی زیر اطلاعات جدول سمت چپ (friends) بازگردانده می‌شود. برای مشخص کردن این نوع ترکیب، کلیدواژه left join به کار برده می‌شود.

mysql> select first_name, last_name, address from friends

    -> left join houses using (house_id);

+------------+------------+---------------------------------+

| first_name | last_name  | address                         |

+------------+------------+---------------------------------+

| Brenda     | Penblanc   | 87 Highcrest St, Orlando FL     |

| Dave       | Chappelle  | 88 Bundy Drive, Stowe VT        |

| Emmet      | Brickowski | 836 Shark Ave, Chatham MA       |

| Frankie    | Farmington | 92 Buzzfeed Lane, Denver CO     |

| Heather    | Jeffries   | NULL                            |

| Jack       | Penblanc   | 87 Highcrest St, Orlando FL     |

| Jacob      | Olivio     | 12 Dunpoto Street, Boston MA    |

| Jim        | Jones      | 54 Main Street, Conway NH       |

| Mary       | Olivio     | 12 Dunpoto Street, Boston MA    |

| Sandy      | Sholes     | NULL                            |

| Sheila     | Farmington | 92 Buzzfeed Lane, Denver CO     |

| Sofia      | Vergara    | 742 Applewild, San Francisco CA |

+------------+------------+---------------------------------+

12 rows in set (0.00 sec)

Right JOIN

برخلاف Left JOIN، در این نوع ترکیب اطلاعات جدول سمت راست ترکیب بازگردانده می‌شود.

mysql> select first_name, last_name, address from houses

    -> right join friends using(house_id);

+------------+------------+---------------------------------+

| first_name | last_name  | address                         |

+------------+------------+---------------------------------+

| Brenda     | Penblanc   | 87 Highcrest St, Orlando FL     |

| Dave       | Chappelle  | 88 Bundy Drive, Stowe VT        |

| Emmet      | Brickowski | 836 Shark Ave, Chatham MA       |

| Frankie    | Farmington | 92 Buzzfeed Lane, Denver CO     |

| Heather    | Jeffries   | NULL                            |

| Jack       | Penblanc   | 87 Highcrest St, Orlando FL     |

| Jacob      | Olivio     | 12 Dunpoto Street, Boston MA    |

| Jim        | Jones      | 54 Main Street, Conway NH       |

| Mary       | Olivio     | 12 Dunpoto Street, Boston MA    |

| Sandy      | Sholes     | NULL                            |

| Sheila     | Farmington | 92 Buzzfeed Lane, Denver CO     |

| Sofia      | Vergara    | 742 Applewild, San Francisco CA |

+------------+------------+---------------------------------+

12 rows in set (0.00 sec)

 

همچنین، می‌توانیم با به کار بردن where ، خروجی‌های پایگاه داده را محدودتر کنیم.

mysql> select first_name, last_name, address from houses

    -> right join friends using(house_id) where houses.address is null;

+------------+-----------+---------+

| first_name | last_name | address |

+------------+-----------+---------+

| Heather    | Jeffries  | NULL    |

| Sandy      | Sholes    | NULL    |

+------------+-----------+---------+

2 rows in set (0.00 sec)

دوره‌های آموزش طراحی سایت در لیداوب:

آموزش پایه لاراول

آموزش CSS

آموزش HTML مقدماتی

درس امروز نیز در اینجا به اتمام رسید. با سایر دروس آموزش mysql و مقالات و دوره‌های آموزشی لیداوب در زمینه‌های مختلف طراحی سایت و برنامه نویسی همراه باشید.

منبع :

5 از 1 رای

 مطالب مرتبط  

در قسمت زیر مطالبی وجود دارند که با مقاله فعلی مرتبط هستند



متاسفانه فقط اعضای سایت قادر به ثبت دیدگاه هستند

برترین مطالب

آموزش در لیداوب

از مقالات و ویدیو های آموزشی خودتان کسب درآمد کنید!

جدیدترین سرویس ما برای دوستان متخصص و خوش بیان در زمینه طراحی وب ارائه شد. این سرویس به شما این امکان را می دهد که به آسانی مقالات و یا ویدیو های آموزشی خود را در لیداوب منتشر کنید. فرصت مناسبی است که بدون داشتن وب سایت و یا وبلاگ و مهم تر از همه بدون هزینه، مطالب خود را در لیداوب منتشر کنید و مهم تر از همه با فروش آنها کسب درآمد کنید. همین حالا شروع کنید و این فرصت استثنایی را از دست ندهید.