استفاده از دستور Union در Mysql

تاریخ انتشار: مهر ۱, ۱۳۹۵

گاهی اوقات ساختار دیتابیس باید بصورتی باشد که یک سری اطلاعات در 2 یا چند جدول ذخیره شده و حالا میخواهیم گزارشی از یک عبارت بگیرم .

به نظر من یکی از کاربردهای این دستور در جستجو در جدول های آرشیو است .

SELECT  name,price FROM tb1 a


where a.name = "vahid"

UNION  
SELECT  name,price FROM tb2 b
 
 
where b.name = "vahid"

دستور فوق شما عبارت vahid را در 2 جدول نمایش می دهد و حاصل آن را در هر 2 جدول نمایش می دهد .

نکاتی در مورد union :

1- باید موارد Select شده در هر دو Select یکسان باشد مثلا من در مثال فوق 2 فیلد name,price را انتخاب کرده ام

2- فیلد های انتخاب شده باید از یک نوع باشد

3-شما نمی توانید جستجو را بر اساس یک فیلد که در یکی از جدول ها وجود ندارد بدست آورید باید آن فیلد که در where قرار میگیرد در هر 2 جدول به صورت منطقی وجود داشته باشد

4- شما به جای union میتوانید از union all نیز استفاده کنید اما استفاده از union all موارد تکراری را که برابر فیلد Where میباشد را حذف میکند.

 

مثلا اگر در جدول  اول مقدار name = vahid , price =2000  باشد و در جدول دوم name = vahid , price =1000 باشد تنها مقدار جدول اول که معادلSelect  اول میباشد را نمایش میدهد.

 

فرض کنید میخواهید نتایج هر 2 جدول را در هم ادغام کنید مثال فوق که اجرا میشود نتیجه زیر را نمایش میدهد

vahid  —- 1000

vahid —- 2000

 

اگر شما بخواهید هر جمع حاصل هر 2 جدول را نمایش بدهد باید آنها را در یک Sub query قرار دهید

SELECT  

sum(t.ss) from

(

SELECT name,sum(price) as ss FROM tb1 a

where a.name = "vahid"
 
UNION  
SELECT  name,sum(price) as ss FROM tb2 b
 
 
where b.name = "vahid"
) t

 

توضیح برنامه فوق این است که دو Select موجود در Subquery جمع نتایج خود را بدست آوردند و سپس در متفیر ss قرار دادند در داخل Subquery ما همان برنامه قبل را نوشتیم اما حالا میخواهیم جمع نتایج هر 2 جدول را جمع بزنیم . مقدار t حامل همان نتایج قبل است و آن را به عنوان یک جدول فرض می بیند وقتی که ما در Select اصلی که در ابتدای برنامه قرار دارد sum(t.ss) را وارد میکنیم جمع 2 نتیجه را یکی میکند و حاصل مقدار زیر است

vahid  —- 3000

 

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *