* split up select.md * array-join.md basic refactoring * distinct.md basic refactoring * format.md basic refactoring * from.md basic refactoring * group-by.md basic refactoring * having.md basic refactoring * additional index.md refactoring * into-outfile.md basic refactoring * join.md basic refactoring * limit.md basic refactoring * limit-by.md basic refactoring * order-by.md basic refactoring * prewhere.md basic refactoring * adjust operators/index.md links * adjust sample.md links * adjust more links * adjust operatots links * fix some links * adjust aggregate function article titles * basic refactor of remaining select clauses * absolute paths in make_links.sh * run make_links.sh * remove old select.md locations * translate docs/es * translate docs/fr * translate docs/fa * remove old operators.md location * change operators.md links * adjust links in docs/es * adjust links in docs/es * minor texts adjustments * wip * update machine translations to use new links * fix changelog * es build fixes * get rid of some select.md links * temporary adjust ru links * temporary adjust more ru links * improve curly brace handling * adjust ru as well * fa build fix * ru link fixes * zh link fixes * temporary disable part of anchor checks
13 KiB
machine_translated | machine_translated_rev |
---|---|
true | 72537a2d52 |
پیوستن بند
اضافه کردن تولید یک جدول جدید با ترکیب ستون از یک یا چند جدول با استفاده از مقادیر مشترک به هر. این یک عملیات مشترک در پایگاه داده با پشتیبانی از گذاشتن است, که مربوط به جبر رابطه ای ملحق شو مورد خاص یک جدول پیوستن است که اغلب به عنوان اشاره “self-join”.
نحو:
SELECT <expr_list>
FROM <left_table>
[GLOBAL] [ANY|ALL|ASOF] [INNER|LEFT|RIGHT|FULL|CROSS] [OUTER|SEMI|ANTI] JOIN <right_table>
(ON <expr_list>)|(USING <column_list>) ...
عبارات از ON
بند و ستون از USING
بند نامیده می شوند “join keys”. مگر در مواردی که در غیر این صورت اعلام, پیوستن به تولید یک محصول دکارتی از ردیف با تطبیق “join keys”, که ممکن است نتایج را با ردیف خیلی بیشتر از جداول منبع تولید.
انواع پشتیبانی شده از پیوستن
همه استاندارد SQL JOIN انواع پشتیبانی می شوند:
INNER JOIN
, تنها ردیف تطبیق برگردانده می شوند.LEFT OUTER JOIN
, ردیف غیر تطبیق از جدول سمت چپ علاوه بر تطبیق ردیف بازگشت.RIGHT OUTER JOIN
, ردیف غیر تطبیق از جدول سمت چپ علاوه بر تطبیق ردیف بازگشت.FULL OUTER JOIN
, ردیف غیر تطبیق از هر دو جدول علاوه بر تطبیق ردیف بازگشت.CROSS JOIN
, تولید محصول دکارتی از تمام جداول, “join keys” هستند نه مشخص.
JOIN
بدون نوع مشخص نشان میدهد INNER
. کلیدواژه OUTER
می توان با خیال راحت حذف. نحو جایگزین برای CROSS JOIN
مشخص جداول چندگانه در از بند جدا شده توسط کاما.
پیوستن به انواع اضافی موجود در کلیک:
LEFT SEMI JOIN
وRIGHT SEMI JOIN
, یک لیست سفید در “join keys”, بدون تولید محصول دکارتی.LEFT ANTI JOIN
وRIGHT ANTI JOIN
, لیست سیاه در “join keys”, بدون تولید محصول دکارتی.
سختی
تغییر چگونگی تطبیق توسط “join keys” انجام شده است
ALL
— The standardJOIN
رفتار در گذاشتن همانطور که در بالا توضیح. به طور پیش فرض.ANY
— Partially (for opposite side ofLEFT
وRIGHT
) یا به طور کامل (برایINNER
وFULL
) غیر فعال محصول دکارتی برای استانداردJOIN
انواع.ASOF
— For joining sequences with a non-exact match.ASOF JOIN
استفاده در زیر توضیح داده شده است.
!!! note "یادداشت" مقدار سختگیرانه پیش فرض را می توان با استفاده از لغو بررسی اجمالی تنظیمات.
از این رو پیوستن به استفاده
ASOF JOIN
مفید است زمانی که شما نیاز به پیوستن به سوابق که هیچ بازی دقیق.
جداول برای ASOF JOIN
باید یک ستون توالی دستور داده اند. این ستون نمی تواند به تنهایی در یک جدول باشد و باید یکی از انواع داده ها باشد: UInt32
, UInt64
, Float32
, Float64
, Date
و DateTime
.
نحو ASOF JOIN ... ON
:
SELECT expressions_list
FROM table_1
ASOF LEFT JOIN table_2
ON equi_cond AND closest_match_cond
شما می توانید هر تعداد از شرایط برابری و دقیقا یکی از نزدیک ترین شرایط بازی استفاده کنید. به عنوان مثال, SELECT count() FROM table_1 ASOF LEFT JOIN table_2 ON table_1.a == table_2.b AND table_2.t <= table_1.t
.
شرایط پشتیبانی شده برای نزدیک ترین بازی: >
, >=
, <
, <=
.
نحو ASOF JOIN ... USING
:
SELECT expressions_list
FROM table_1
ASOF JOIN table_2
USING (equi_column1, ... equi_columnN, asof_column)
ASOF JOIN
استفاده equi_columnX
برای پیوستن به برابری و asof_column
برای پیوستن به نزدیک ترین مسابقه با table_1.asof_column >= table_2.asof_column
شرط. این asof_column
ستون همیشه یکی از گذشته در USING
بند بند.
مثلا, جداول زیر را در نظر بگیرید:
table_1 table_2
event | ev_time | user_id event | ev_time | user_id
----------|---------|---------- ----------|---------|----------
... ...
event_1_1 | 12:00 | 42 event_2_1 | 11:59 | 42
... event_2_2 | 12:30 | 42
event_1_2 | 13:00 | 42 event_2_3 | 13:00 | 42
... ...
ASOF JOIN
می توانید برچسب زمان از یک رویداد کاربر از را table_1
و پیدا کردن یک رویداد در table_2
جایی که برچسب زمان نزدیک به زمان این رویداد از table_1
مربوط به نزدیک ترین شرایط بازی. مقادیر برچسب زمان برابر نزدیک ترین در صورت موجود بودن. اینجا user_id
ستون را می توان برای پیوستن به برابری و ev_time
ستون را می توان برای پیوستن به در نزدیک ترین بازی استفاده می شود. در مثال ما, event_1_1
می توان با پیوست event_2_1
و event_1_2
می توان با پیوست event_2_3
اما event_2_2
نمیشه عضو شد
!!! note "یادداشت"
ASOF
پیوستن است نه پردازشگر پشتیبانی شده: پیوستن موتور جدول.
توزیع پیوستن
دو راه برای اجرای پیوستن به جداول توزیع شده وجود دارد:
- هنگام استفاده از نرمال
JOIN
پرس و جو به سرورهای راه دور ارسال می شود. زیرکریزها روی هر کدام اجرا می شوند تا میز مناسب را بسازند و پیوستن با این جدول انجام می شود. به عبارت دیگر, جدول سمت راست بر روی هر سرور تشکیل به طور جداگانه. - هنگام استفاده از
GLOBAL ... JOIN
, اول سرور درخواست کننده اجرا می شود یک خرده فروشی برای محاسبه جدول سمت راست. این جدول موقت به هر سرور از راه دور منتقل می شود و نمایش داده می شود با استفاده از داده های موقت منتقل می شود.
مراقب باشید در هنگام استفاده از GLOBAL
. برای کسب اطلاعات بیشتر, دیدن توزیع subqueries بخش.
توصیه های استفاده
پردازش سلولهای خالی یا خالی
در حالی که پیوستن به جداول سلول های خالی ظاهر می شود. تنظیمات ارزشهای خبری عبارتند از: تعریف چگونه خانه را پر می کند این سلول ها.
اگر JOIN
کلید ها Nullable زمینه, ردیف که حداقل یکی از کلید های دارای ارزش NULL عضو نشده.
نحو
ستون های مشخص شده در USING
باید نام های مشابه در هر دو کارخانه های فرعی دارند, و ستون های دیگر باید متفاوت به نام. شما می توانید نام مستعار برای تغییر نام ستون ها در زیرکریز استفاده کنید.
این USING
بند یک یا چند ستون برای پیوستن به مشخص, که ایجاد برابری این ستون. لیست ستون ها بدون براکت تنظیم شده است. شرایط پیوستن پیچیده تر پشتیبانی نمی شوند.
محدودیت نحو
برای چند JOIN
بند در یک SELECT
پرسوجو:
- گرفتن تمام ستون ها از طریق
*
در دسترس است تنها اگر جداول پیوست, نمی فرعی. - این
PREWHERE
بند در دسترس نیست.
برای ON
, WHERE
و GROUP BY
بند:
- عبارات دلخواه را نمی توان در
ON
,WHERE
وGROUP BY
بند, اما شما می توانید یک عبارت در یک تعریفSELECT
بند و سپس در این بند از طریق یک نام مستعار استفاده کنید.
عملکرد
هنگامی که در حال اجرا JOIN
بهینه سازی سفارش اعدام در رابطه با سایر مراحل پرس و جو وجود ندارد. پیوستن (جستجو در جدول سمت راست) قبل از فیلتر کردن در اجرا می شود WHERE
و قبل از تجمع.
هر بار که پرس و جو با همان اجرا شود JOIN
, خرده فروشی است دوباره اجرا به دلیل نتیجه ذخیره سازی نیست. برای جلوگیری از این, استفاده از ویژه پیوستن موتور جدول, که مجموعه ای تهیه شده برای پیوستن است که همیشه در رم.
در بعضی موارد کارایی بیشتری برای استفاده دارد IN به جای JOIN
.
اگر شما نیاز به یک JOIN
برای پیوستن به جداول بعد (این جداول نسبتا کوچک است که شامل خواص ابعاد هستند, مانند نام برای کمپین های تبلیغاتی), یک JOIN
ممکن است بسیار مناسب با توجه به این واقعیت است که جدول سمت راست برای هر پرس و جو دوباره قابل دسترسی است. برای چنین مواردی وجود دارد “external dictionaries” ویژگی است که شما باید به جای استفاده از JOIN
. برای کسب اطلاعات بیشتر, دیدن واژهنامهها خارجی بخش.
محدودیت حافظه
به طور پیش فرض, تاتر با استفاده از هش پیوستن الگوریتم. تاتر طول می کشد <right_table>
و یک جدول هش را در رم ایجاد می کند. پس از برخی از حد مصرف حافظه, خانه رعیتی می افتد به ادغام پیوستن الگوریتم.
اگر شما نیاز به محدود کردن پیوستن به مصرف حافظه عملیات استفاده از تنظیمات زیر:
- _پاک کردن _روشن گرافیک — Limits number of rows in the hash table.
- _پویش همیشگی — Limits size of the hash table.
هنگامی که هر یک از این محدودیت رسیده است, کلیک به عنوان عمل می کند _شروع مجدد تنظیم دستور.
مثالها
مثال:
SELECT
CounterID,
hits,
visits
FROM
(
SELECT
CounterID,
count() AS hits
FROM test.hits
GROUP BY CounterID
) ANY LEFT JOIN
(
SELECT
CounterID,
sum(Sign) AS visits
FROM test.visits
GROUP BY CounterID
) USING CounterID
ORDER BY hits DESC
LIMIT 10
┌─CounterID─┬───hits─┬─visits─┐
│ 1143050 │ 523264 │ 13665 │
│ 731962 │ 475698 │ 102716 │
│ 722545 │ 337212 │ 108187 │
│ 722889 │ 252197 │ 10547 │
│ 2237260 │ 196036 │ 9522 │
│ 23057320 │ 147211 │ 7689 │
│ 722818 │ 90109 │ 17847 │
│ 48221 │ 85379 │ 4652 │
│ 19762435 │ 77807 │ 7026 │
│ 722884 │ 77492 │ 11056 │
└───────────┴────────┴────────┘