JOIN operatori. SQL tili - JOIN Oracle sql bir nechta jadvallarga qo'shiladi

Ma'lumotlar bazasining yagona jadvalidan ma'lumotlarni olish uchun avval SELECT buyrug'idan foydalanganmiz. Agar Transact-SQL-ning imkoniyatlari faqat SELECT-ning oddiy bayonotlarini qo'llab-quvvatlash bilan chegaralangan bo'lsa, ulardan ma'lumotlarni olish uchun so'rovda ikki yoki undan ortiq jadvallarni birlashtirish imkonsiz bo'lar edi. Shunday qilib, barcha ma'lumotlar bazasi bitta jadvalda saqlanishi kerak. Garchi bu yondashuv juda mumkin bo'lsa -da, uning bitta muhim kamchiligi bor - shu tarzda saqlangan ma'lumotlar yuqori zaxira bilan tavsiflanadi.

Transact-SQL taqdim etish orqali bu muammoni hal qiladi JOIN operatori, bu sizga bir nechta jadvaldan ma'lumotlarni olish imkonini beradi. Bu operator, ehtimol, relyatsion ma'lumotlar bazasi tizimlari uchun eng muhim operatordir, chunki u sizga ma'lumotlarni bir nechta jadvallar bo'yicha taqsimlashga imkon beradi va shu bilan ma'lumotlar bazasi tizimlarining muhim xususiyatini ta'minlaydi, bu esa ma'lumotlarning zaxirasi yo'q.

Biz ilgari ko'rib chiqqan UNION operatori sizga bir nechta jadvallar bo'yicha so'rov o'tkazish imkonini beradi. Biroq, bu bayonot sizga bir nechta SELECT bayonotlariga qo'shilish imkonini beradi, JOIN bayonoti esa bitta SELECT iborasi yordamida bir nechta jadvallarga qo'shiladi. Bundan tashqari, UNION operatori jadval qatorlarini, JOIN operatori esa ustunlarni birlashtiradi.

Birlashtirish operatori, shuningdek, asosiy jadvallar va ko'rinishlar bilan ishlatilishi mumkin. JOIN bayonoti turli xil shakllarga ega. Ushbu maqolada ushbu operatorning quyidagi asosiy shakllari muhokama qilinadi:

    tabiiy aloqa;

    Kartezian mahsuloti yoki o'zaro faoliyat birlashma;

    tashqi qo'shilish;

    Theta qo'shilish, o'z-o'zidan qo'shilish va yarim qo'shilish.

Birlashtirishning turli shakllarini ko'rib chiqishdan oldin, bu bo'limda biz JOIN operatorining turli xil variantlarini ko'rib chiqamiz.

Birlashtirishni amalga oshirish uchun ikkita sintaktik shakl

Jadvallarga qo'shilish uchun qo'shilish operatorining ikki xil sintaktik shakllaridan foydalanishingiz mumkin:

    Aniq qo'shilish sintaksisi (ANSI SQL: 1992 sintaksisiga qo'shilish)

    yopiq qo'shilish sintaksisi (eski uslubdagi qo'shilish sintaksisi).

ANSI SQL: 1992 qo'shilish sintaksisi SQL92 standarti tomonidan kiritilgan va qo'shilish operatsiyalarini aniq belgilaydi, ya'ni. qo'shilish operatsiyasining har bir turi uchun tegishli nomdan foydalanish. Aloqani aniq e'lon qilishda quyidagi kalit so'zlar ishlatiladi:

  • ChAP QO'SHILISH;

    To'g'ri qo'shilish;

    To'liq qo'shiling.

CROSS JOIN kalit so'zi ikkita jadvalning dekart mahsulotini belgilaydi. INNER JOIN kalit so'zi ikkita jadval orasidagi tabiiy qo'shilishni, LEFT OUTER JOIN va RIGHT OUTER JOIN bir xil nomdagi qo'shilish amallarini belgilaydi. Nihoyat, FULL OUTER JOIN kalit so'zi chap va o'ng tashqi birikmalarning birlashishini belgilaydi. Bu birlashma operatsiyalarining barchasi keyingi bo'limlarda muhokama qilinadi.

Yopiq qo'shilish operatorining sintaksisi "eski uslub" sintaksisidir, bu erda har bir qo'shilish qo'shilish ustunlari deb ataladigan WHERE bandi bilan aniq belgilanadi.

Birlashtirish operatsiyalari uchun aniq sintaksisdan foydalanish tavsiya etiladi, chunki bu so'rovlarning ishonchliligini oshiradi. Shu sababli, qo'shilish operatsiyalariga oid quyida keltirilgan barcha misollar aniq sintaksis shakllaridan foydalanadi. Ammo birinchi misollar "eski uslub" sintaksisini ham ko'rsatadi.

Tabiiy aloqa

Tabiiy qo'shilish va tenglashish atamalari ko'pincha sinonim sifatida ishlatiladi, lekin ular o'rtasida unchalik farq yo'q. Ekvivalentlik qo'shilish operatsiyasida har bir satrda bir xil qiymatga ega bo'lgan bir yoki bir nechta juft ustunlar bo'ladi. Bunday ustunlarni ekvivalentlik qo'shilish operatsiyalari natijalaridan olib tashlaydigan operatsiyaga tabiiy qo'shilish deyiladi. Tabiiy aloqani tushuntirishning eng yaxshi usuli - bu misol:

SampleDb dan foydalaning; Xodimni tanlang. *, Bo'lim. * Xodimdan INNER JOIN bo'limi Xodimlar bo'limi. Bo'lim raqami = Bo'lim raqami;

So'rovda barcha xodimlar to'g'risidagi barcha ma'lumotlar qaytariladi: bo'limning ismi va familiyasi, xodimlarning soni, shuningdek bo'limning nomi, raqami va joylashuvi, bo'lim raqami uchun turli jadvallardan dublikat ustunlar ko'rsatiladi.

Bu misolda, tanlov uchun SELECT bayonoti xodim va bo'lim uchun barcha jadval ustunlarini bildiradi. SELECT bayonotining FROM bandi birlashtiriladigan jadvallarni belgilaydi, shuningdek, qo'shilish operatsiyasining turini aniq ko'rsatib beradi - Ichki qo'shilish... ON bandi FROM bandining bir qismi bo'lib, ikkala jadvalda birlashtiriladigan ustunlarni bildiradi. "Employee.DepartamentNumber = Department.Number" iborasi qo'shilish shartini belgilaydi va ikkala shart ustuni ham nomlanadi. ustunlarni birlashtirish.

Ekvivalent yopiq ("eski uslub") sintaksisi so'rovi shunday bo'ladi:

Bu sintaksis shaklining aniq shakli bilan ikkita muhim farqi bor: birlashtiriladigan jadvallar ro'yxati FROM bandida ko'rsatilgan va tegishli qo'shilish sharti qo'shilgan ustunlar yordamida WHERE bandida ko'rsatilgan.

Oldingi misollar birlashma operatsiyasi qanday ishlashini ko'rsatadi. Shuni yodda tutish kerakki, bu faqat ulanish jarayonining g'oyasi Aslida, ma'lumotlar bazasi dvigateli bir nechta mumkin bo'lgan strategiyalar orasidan qo'shilish operatsiyasini tanlaydi. Tasavvur qiling, xodimlar jadvalidagi har bir satr bo'lim bo'limidagi har bir qatorga qo'shiladi. Natijada etti ustunli jadval (Xodimlar jadvalidan 4 ustun va Bo'lim jadvalidan 3 ta) va 21 qatorli jadval.

Bundan tashqari, "Employee.Number = Department.Number" qo'shilish shartiga mos kelmaydigan barcha qatorlar ushbu jadvaldan olib tashlanadi. Qolgan qatorlar yuqoridagi birinchi misol natijasini ko'rsatadi. Birlashtiriladigan ustunlar bir xil semantikaga ega bo'lishi kerak, ya'ni. ikkala ustun ham bir xil boolean qiymatga ega bo'lishi kerak. Birlashtiriladigan ustunlar bir xil nomga (yoki hatto bir xil ma'lumot turiga) ega bo'lishi shart emas, lekin bu ko'pincha shunday bo'ladi.

Ma'lumotlar bazasi tizimi ustunning mantiqiy qiymatini aniqlay olmaydi. Masalan, u loyiha raqami va xodimlar soni ustunlari o'rtasida hech qanday umumiylik yo'qligini aniqlay olmaydi, garchi ular ikkalasi ham butun turdagi ma'lumotlar turiga mansub bo'lsa. Shuning uchun ma'lumotlar bazasi tizimi faqat ma'lumotlar turini va satrlar uzunligini tekshirishi mumkin. Ma'lumotlar bazasi mexanizmi birlashtiriladigan ustunlar INT va SMALLINT kabi mos keladigan ma'lumotlar turlarini talab qiladi.

SampleDb ma'lumotlar bazasi uchta juft ustunni o'z ichiga oladi, bu erdagi har bir ustun bir xil boolean qiymatga ega (shuningdek, xuddi shu nomlar). Xodim va bo'lim jadvallariga Employee.DepartmentNumber va Department.Number ustunlari qo'shilishi mumkin. Employee va Works_on jadvallarining birlashma ustunlari Employee.Id va Works_on.EmpId ustunlaridir. Nihoyat, Project va Works_on jadvallariga Project.Number va Works_on.ProjectNumber ustunlari qo'shilishi mumkin.

SELECT bayonotidagi ustun nomlari malakali bo'lishi mumkin. Bu nuqtai nazardan, malaka deganda, ustun qaysi jadvalga tegishli ekanligi noaniq bo'lishining oldini olish uchun, ustun nomi, uning jadval nomi (yoki jadval taxallusi) bilan ajratilgan:

table_name.column_name (table_name.column_name)

Ko'pgina SELECT bayonotlarida ustunlar malakaga ega bo'lishni talab qilmaydi, lekin odatda sizning kodingizni tushunishingizni yaxshilash uchun ustunlar malakasidan foydalanish tavsiya etiladi. Biroq, agar SELECT bayonotidagi ustun nomlari noaniq bo'lsa (masalan, Loyiha va bo'lim jadvallaridagi sonlar ustunlari), malakali ustun nomlari talab qilinadi.

Birlashtirish operatsiyali SELECT bayonotida, qo'shilish shartidan tashqari, WHERE bandi quyidagi misolda ko'rsatilgandek boshqa shartlarni o'z ichiga olishi mumkin:

SampleDb dan foydalaning; - Aniq sintaksis SELECT EmpId, Project.Number, Job, EnterDate, ProjectName, Budget FROM Works_on Project ON ON Project.Number = Works_on.ProjectNumber WHERE ProjectName = "Egizaklar"; - Eski uslub SELECT EmpId, Project.Number, Job, EnterDate, ProjectName, Byudjet FROM Works_on, Project WHERE Project.Number = Works_on.ProjectNumber AND ProjectName = "Egizaklar";

Yuqoridagi misolda Project.Number nomli ustun nomidan foydalanish ixtiyoriydir, chunki bu holda ularning nomlari haqida noaniqlik yo'q. Keyinchalik, barcha misollar faqat aniq qo'shilish sintaksisidan foydalanadi.

Quyidagi misolda ichki qo'shilishning yana bir qo'llanilishi ko'rsatilgan:

Ikkita jadvalga qo'shilish

Nazariy jihatdan, SELECT bayonotiga qo'shilishi mumkin bo'lgan jadvallar soni cheklanmagan. (Lekin bitta qo'shilish sharti faqat ikkita jadvalga qo'shiladi!) Biroq, ma'lumotlar bazasi mexanizmi uchun SELECT buyrug'iga qo'shiladigan jadvallar soni 64 ta jadval bilan cheklangan.

Quyidagi misolda uchta SampleDb ma'lumotlar bazasi jadvalining birlashuvi ko'rsatilgan:

SampleDb dan foydalaning; - "Vasiliy Frolov" yagona xodimini qaytaradi, Ism, Familiya, Ishlar_O'ZIDAN QO'SHILING ON Works_on.EmpId = Xodim.Id QO'SHILING bo'limi xodimlari.DepartamentNumber = Bo'lim.Number VA Joy = "Sankt -Peterburg" VA Ish = "Tahlilchi" ;

Bu misolda bo'limi Sankt -Peterburgda joylashgan barcha tahlilchilarning ismi va familiyasi (Ish = "Analitik") tanlanadi (Manzil = "Sankt -Peterburg"). Yuqoridagi misolda ko'rsatilgan so'rov natijasini faqat uchta jadval birlashtirilgan bo'lsa olish mumkin: Works_on, xodim va bo'lim. Bu jadvallarni ikkita juft biriktiruvchi ustun yordamida birlashtirish mumkin:

(Works_on.EmpId, Employee.Id) (Xodimlar bo'limi raqami, bo'lim raqami)

E'tibor bering, uchta jadvalni tabiiy ravishda birlashtirish uchun ikkita qo'shilish sharti ishlatiladi, ularning har biri ikkita jadvalga qo'shiladi. Va bunday birlashish shartlarining to'rtta jadvaliga qo'shilganda, uchta shart talab qilinadi. Umuman olganda, n ta jadvalga qo'shilganda dekart mahsulotini olmaslik uchun n - 1 qo'shilish shartlarini qo'llash kerak. Albatta, hosil bo'lgan ma'lumotlar to'plamidagi elementlar sonini yanada kamaytirish uchun boshqa shartlar singari, n - 1 dan ortiq qo'shilish shartlaridan ham foydalanish joizdir.

Kartezian mahsuloti

Oldingi bo'limda biz tabiiy aloqani yaratishning mumkin bo'lgan usulini ko'rib chiqdik. Bu jarayonning birinchi bosqichida Xodimlar jadvalidagi har bir satr bo'lim bo'limining har bir qatoriga qo'shiladi. Bu operatsiya deyiladi kartezian mahsuloti... Xodimlar va bo'lim bo'limlari o'rtasida kartezian mahsuloti yordamida birlashma yaratish so'rovi quyidagi misolda ko'rsatilgan:

SampleDb dan foydalaning; Xodimni *, bo'limni tanlang.

Kartezian mahsuloti birinchi jadvalning har bir satrini ikkinchi satr bilan bog'laydi. Umuman olganda, n -qatorli birinchi jadvalning kartezian mahsuloti va m -qatorli ikkinchi jadvalning natijasi n * m qatorli jadval bo'ladi. Shunday qilib, yuqoridagi misoldagi so'rov natijasi 7 x 3 = 21 qatorga ega (bu satrlarda takroriy qiymatlar mavjud).

Amalda Karteziya mahsuloti kamdan -kam ishlatiladi. Ba'zida foydalanuvchilar "eski uslub" qo'shilish sintaksisini ishlatganda, WHERE bandiga qo'shilish shartini kiritishni unutganlarida, ikkita jadvalning Kartezian mahsulotini oladi. Bunday holda, olingan natija kutilgan natijaga mos kelmaydi, chunki qo'shimcha qatorlarni o'z ichiga oladi. Natijada kutilmagan ko'p sonli satrlar - bu ikkita jadvalning kerakli tabiiy birikmasi o'rniga kartezian mahsuloti olinganligini ko'rsatadi.

Tashqi aloqa

Oldingi tabiiy qo'shilish misollarida, natijalar to'plamida faqat bitta jadvaldagi satrlar bor edi, ular uchun boshqa jadvalda mos qatorlar bor edi. Lekin ba'zida, mos keladigan qatorlardan tashqari, bitta yoki ikkala jadvaldan satrlarni gugurtsiz olish kerak bo'ladi. Bu operatsiya deyiladi tashqi qo'shilish.

Quyidagi misolda bir shaharda yashaydigan va ishlaydigan xodimlar uchun barcha ma'lumotlar tanlangan. Bu UNION operatorini muhokama qilishda SELECT bayonoti: Kengaytirilganda yaratilgan EmployeeEnh jadvalidan foydalanadi.

SampleDb dan foydalaning; SELECT DISTINCT EmployeeEnh. *, Department.Location from EmployeeEnh JOIN departamentdagi shahar = Manzil;

Bu so'rov natijasi:

Bu misolda kerakli satrlarni olish tabiiy birlashma yordamida amalga oshiriladi. Agar bu natijaga boshqa joylarda yashovchi xodimlar kirsa, chap tashqi qo'shilishni qo'llash kerak bo'ladi. Bu tashqi birlashma chap deb ataladi, chunki u o'ng tomonda jadvalda mos keladigan satrlar bo'lishidan qat'i nazar, taqqoslash operatorining chap tomonidagi jadvaldagi barcha qatorlarni qaytaradi. Boshqacha qilib aytganda, bu tashqi qo'shilish, o'ng jadvalda mos kelmasa ham, chap jadvaldagi qatorni qaytaradi, ikkinchisida mos bo'lmagan ustun qiymati bo'lgan barcha qatorlar uchun NULL qiymati. , to'g'ri, stol. Ma'lumotlar bazasi dvigateli chap tashqi qo'shilish operatsiyasini bajarish uchun operatordan foydalanadi ChAP QO'SHILISH.

O'ng tashqi qo'shilish operatsiyasi chap tashqi birlashma bilan bir xil, lekin ifodaning o'ng tomonidagi barcha jadval satrlari qaytariladi. Ma'lumotlar bazasi mexanizmi tashqi qo'shilish operatsiyasini to'g'ri bajarish uchun operatordan foydalanadi To'g'ridan -to'g'ri qo'shiling.

SampleDb dan foydalaning; SELECT EmployeeEnh. *, Department.Location from EmployeeEnh LEFT OUTER JOIN departamenti Shahar = Manzil;

Bu misol xodimlar yashaydigan (xodimlar jadvalidagi "Shahar ustuni") yoki yashaydigan va ishlaydigan shaharlar uchun xodimlarni (shu jumladan, to'liq ma'lumotni) tanlaydi. Bu so'rov natijasi:

So'rov natijasidan ko'rinib turibdiki, o'ng jadvalda (bu holda bo'limda) chap jadvaldagi qator uchun mos keladigan satr bo'lmasa (bu holda EmployeeEnh), chap tashqi qo'shilishning ishlashi hali ham bu qatorni qaytaradi. , mos keladigan ustunning barcha katakchalarini NULL bilan to'ldirish, to'g'ri jadvalning ustunlari mos kelmaganligi uchun. To'g'ri tashqi birikmaning qo'llanilishi quyidagi misolda ko'rsatilgan:

SampleDb dan foydalaning; Shaxsiy bo'limni tanlang.

Bu misol xodimlar faqat ishlaydigan yoki yashaydigan va ishlaydigan shaharlar uchun bo'limlarni (shu jumladan ular haqida to'liq ma'lumotni) tanlaydi. Bu so'rov natijasi:

Chap va o'ng tashqi qo'shilishlardan tashqari, tashqi va chap tashqi bo'g'inlarning birlashmasi bo'lgan to'liq tashqi birikma ham mavjud. Boshqacha qilib aytganda, bunday birikmaning natijalar to'plami ikkala jadvalning ham barcha qatorlaridan iborat. Agar jadvallardan biridagi satrda boshqa jadvalda mos keladigan satr bo'lmasa, ikkinchi jadvaldagi satrning barcha katakchalari NULL ga o'rnatiladi. To'liq tashqi qo'shilish operatsiyasini bajarish uchun operatordan foydalaning TO'LIQ QO'SHILISH.

Har qanday tashqi qo'shilish operatsiyasini UNION operatoridan NOT EXISTS funktsiyasi bilan birgalikda taqlid qilish mumkin. Shunday qilib, quyida keltirilgan misolda ko'rsatilgan so'rov ilgari ko'rsatilgan chap tashqi qo'shilish so'roviga tengdir. Ushbu so'rovda xodimlar faqat yashaydigan yoki yashaydigan va ishlaydigan shaharlar uchun xodimlarni tanlash (to'liq ma'lumotni o'z ichiga olgan holda) o'tkaziladi:

Birlashuvning birinchi SELECT bayonoti "Shahar va manzil" qo'shilish ustunlari bo'yicha EmployeeEnh va Department jadvallarining tabiiy qo'shilishini aniqlaydi. Ushbu yo'riqnoma barcha shaharlarni xodimlar yashaydigan va ishlaydigan barcha xodimlar uchun qaytaradi. Bundan tashqari, qo'shilishning ikkinchi SELECT bayonoti EmployeeEnh jadvalining tabiiy qo'shilish shartiga mos kelmaydigan barcha qatorlarini qaytaradi.

Birlashtirish operatsiyalarining boshqa shakllari

Oldingi bo'limlarda biz qo'shilishning eng muhim shakllarini ko'rib chiqdik. Ammo bu operatsiyaning boshqa shakllari ham bor, biz ularni keyingi bo'limlarda ko'rib chiqamiz.

Teta aloqasi

Birlashma ustunini taqqoslash sharti teng bo'lishi shart emas, lekin boshqa har qanday taqqoslash bo'lishi mumkin. Ulanishning umumiy ustun taqqoslash shartidan foydalanadigan qo'shilish deyiladi teta aloqasi... Quyidagi misolda teta birlashma operatsiyasi ko'rsatilgan, unda kamroq band ishlatiladi. Bu so'rovda xodimlar va bo'limlar haqidagi barcha ma'lumotlar kombinatsiyasi qaytariladi, agar xodimning yashash joyi u ishlaydigan har qanday bo'lim joylashgan joydan oldin bo'lsa.

SampleDb dan foydalaning; Ismni, familiyani, shaharni, joyni xodimlar bo'limidan tanlang

Bu so'rov natijasi:

Bu misol shahar va manzil ustunlaridagi mos keladigan qiymatlarni solishtiradi. Natijaning har bir qatori shahar ustunining qiymatini alifbo tartibida tegishli Manzil ustunining qiymati bilan solishtiradi.

O'z-o'zidan qo'shilish yoki o'z-o'zidan stolga qo'shilish

Ikki yoki undan ortiq turli jadvallarga qo'shilishdan tashqari, tabiiy birlashtirish operatsiyasini bitta stolga qo'llash mumkin. Bu operatsiyada jadval o'ziga qo'shiladi va jadvalning bitta ustuni o'zi bilan solishtiriladi. Ustunni o'zi bilan solishtirish, SELECT bayonotining FROM bandida jadval nomi ikki marta ishlatilishini bildiradi. Shuning uchun, bir jadvalning nomiga ikki marta murojaat qila olish kerak. Buni kamida bitta taxallus yordamida amalga oshirish mumkin. SELECT bayonotidagi qo'shilish bandidagi ustun nomlari uchun ham xuddi shunday. Xuddi shu nomdagi ustunlarni ajratish uchun siz malakali nomlardan foydalanishingiz kerak.

Jadvalning o'ziga qo'shilishi quyidagi misolda ko'rsatilgan:

Bu misol hech bo'lmaganda boshqa bo'lim bilan bir joyda joylashgan barcha bo'limlarni (to'liq ma'lumotli) tanlaydi. Bu so'rov natijasi:

Bu erda FROM bandida bo'lim jadvali uchun ikkita taxallus mavjud: t1 va t2. WHERE bandining birinchi bandi birlashma ustunlarini belgilaydi, ikkinchisi esa har bir bo'limni boshqa bo'limlar bilan taqqoslashni ta'minlab, keraksiz dublikatlarni olib tashlaydi.

Yarim qo'shilish

Yarim qo'shilish tabiiy qo'shilishga o'xshaydi, lekin faqat bitta jadvaldagi barcha satrlar to'plamini qaytaradi, ular uchun boshqa jadvalda bir yoki bir nechta moslik bor. Yarim qo'shilishni ishlatish quyidagi misolda ko'rsatilgan:

So'rovni bajarish natijasi:

Ko'rib turganingizdek, SELECT yarim qo'shilishda faqat xodimlar jadvalining ustunlari mavjud. Bu yarim qo'shilish operatsiyasining o'ziga xos xususiyati. Bu operatsiya odatda uzatilgan ma'lumotlar miqdorini kamaytirish uchun tarqatilgan so'rovlarni qayta ishlashda ishlatiladi. Ma'lumotlar bazasi mexanizmi yarim qo'shilish operatsiyasidan foydalanib yulduz qo'shilish funktsiyasini amalga oshiradi.

Asosiy narsalarni o'rganishda davom etish SQL va oddiy JOINlar haqida gapirish vaqti keldi. Va bugun biz operatorlarning mablag'lari yordamida ma'lumotlarni qanday birlashtirilishini ko'rib chiqamiz. ChAP QO'SHILISH, O'G'IL QO'SHILISH, O'tish -qo'shilish va Ichki qo'shilish Boshqacha aytganda, biz ma'lumotlarni birlashtirgan so'rovlarni yozishni o'rganamiz va odatdagidek, bularning barchasini misollar orqali o'rganamiz.

SQL -da JOIN -ga qo'shilish juda muhim, chunki har xil ob'ektlar ma'lumotlarini birlashtirgan holda so'rovlar yozish qobiliyatisiz SQL dasturchisi shunchaki qila olmaydi va vaqti -vaqti bilan ma'lumotlar bazasidan ba'zi ma'lumotlarni olib tashlaydigan administrator, shuning uchun bu amal qiladi. SQL asoslari va SQL bilan shug'ullanadigan har bir kishi bu nima ekanligini tushunishi kerak.

Eslatma! Barcha misollar Management Studio SQL Server 2008 da yoziladi.

Biz SQL asoslarini anchadan buyon o'rganib kelmoqdamiz va agar esingizda bo'lsa, biz tanlagan bayonotdan boshlaganmiz va umuman bu saytda SQLda juda ko'p materiallar bor edi, masalan:

Va boshqa ko'p narsalar, biz allaqachon kasaba uyushmasi va kasaba uyushmasi deb hisoblaganmiz, lekin biz siz bilan qo'shilish haqida batafsil gaplashmaganmiz, shuning uchun bugun biz o'z bilimimizdagi bu bo'shliqni to'ldiramiz.

Va biz odatdagidek kichik nazariyadan boshlaymiz.

QO'SHILING- bu ikki yoki undan ortiq ma'lumotlar bazasi ob'ektlarining ma'lum bir kalit yoki kalitlar yordamida yoki o'zaro bog'lanish holatida hech qanday kalitsiz birlashishi. Bu erda ob'ektlar deganda biz turli jadvallar, ko'rinishlar, jadval vazifalari yoki faqat sql subqueries, ya'ni. jadval ma'lumotlarini qaytaradigan hamma narsa.

SQL chap va o'ng qo'shilish

SOL QO'SHILISH- bu chap tugma bilan ma'lumotlarning birlashishi, ya'ni. Aytaylik, biz ikkita jadvalni chap qo'shilish orqali birlashtiramiz, ya'ni ikkinchi jadvaldagi barcha ma'lumotlar birinchisiga ko'tariladi va kalit bo'lmasa NULL qiymatlari ko'rsatiladi, boshqacha aytganda. chap jadval va o'ngdagi barcha kalitlar ko'rsatiladi.

To'g'ri qo'shiling- bu Chap qo'shilish bilan bir xil, faqat o'ng jadvaldagi barcha ma'lumotlar va faqat qo'shilish kaliti bo'lgan chap jadvaldagi ma'lumotlar ko'rsatiladi.

Keling, misollarni ko'rib chiqaylik va birinchi navbatda ikkita jadval tuzamiz:

JADVOL ({18, 0) NULL, (50) NULL) GO ON -da JADVAL ({18, 0) NULL, (50) NULL)

Bu shunday oddiy jadvallar va men ularni quyidagi ma'lumotlar bilan to'ldirdim:

Keling, bu jadvallarga raqam tugmasi yordamida qo'shiladigan so'rovni yozamiz, avval LEFT:

T1.numberni t1_number, t1.textni t1_text sifatida, t2.numberni t2_number sifatida, t2.textni t2_text sifatida test_toldan t1 LEFT JOIN test_table_2 t2 ON t1.number = t2.number

Ko'rib turganingizdek, t1 jadvalidagi barcha ma'lumotlar ko'rsatildi, lekin t2 jadvalidagi barcha ma'lumotlar emas, chunki = 4 qatorli qator yo'q, shuning uchun NULL qiymatlari ko'rsatildi.

Va agar biz to'g'ri qo'shilish orqali birlashsak nima bo'ladi, lekin bu shunday bo'lar edi:

T1.numberni t1_number, t1.textni t1_text sifatida, t2.number t2_number sifatida, t2.textni t2_text sifatida test_tabledan t1 O'ngga qo'shilish test_table_2 t2 ON t1.number = t2.number

Boshqacha qilib aytganda, t2 jadvalidagi barcha satrlar va t1 jadvalidagi tegishli yozuvlar ko'rsatildi, chunki t2 jadvalidagi barcha kalitlar ham t1 jadvalida joylashgan va shuning uchun bizda NULL qiymatlar yo'q.

SQL INNER JOIN

Ichki qo'shilish- bu bir jadvaldagi barcha yozuvlar va boshqa jadvaldagi barcha tegishli yozuvlar ko'rsatilganda va bir yoki boshqa jadvalda bo'lmagan yozuvlar ko'rsatilmasa, ya'ni. faqat kalitga mos keladigan yozuvlar. Aytgancha, men darhol aytamanki, ichki qo'shilish ichki bo'lmagan qo'shilish bilan bir xil. Misol:

T1.numberni t1_number, t1.textni t1_text, t2.number t2_number, t2.text sifatida t2_text sifatida test_table t1 INNER JOIN test_table_2 t2 t1.number = t2.number

Keling, jadvallarimizni ikkita kalit bilan birlashtirishga harakat qilaylik, buning uchun biz jadvalga qanday ustun qo'shishimiz va ma'lumotlarni yangilash orqali qanday yangilashimiz kerakligini eslaymiz, chunki bizning jadvallarimizda faqat ikkita ustun bor va ularni birlashtirish yaxshi emas. matn maydoni orqali. Buning uchun ustunlar qo'shing:

ALTER TABLE test_table ADD raqami2 INT ALTER TABLE test_table_2 ADD raqami2 INT

Ma'lumotlarimizni yangilaylik, 1 -sonni 2 -sonli ustunga qo'ying:

UPDATE test_table SET raqami2 = 1 UPDATE test_table_2 SET raqami2 = 1

Keling, ikkita kalitda birikma bilan so'rov yozaylik:

T1.numberni t1_number, t1.textni t1_text, t2.number t2_number, t2.text sifatida t2_text sifatida test_table t1 INNER JOIN test_table_2 t2 ON t1.number = t2.number VA t2.number2

Va natija oldingi misolda bo'lgani kabi bo'ladi:

Ammo, agar biz, masalan, bir qatordagi ikkinchi jadvalda, 2 -raqamli maydonni, masalan, 2 ga o'zgartirsak, natija butunlay boshqacha bo'ladi.

UPDATE test_table_2 raqami 2 = 2 QAYERDA raqam = 1

So'rov bir xil, lekin natija:

Ko'rib turganingizdek, ikkinchi kalit uchun biz bitta qatorni ko'rsatmaganmiz.

SQL CROSS JOIN

QO'SHILISH Bu SQL birlashmasi bo'lib, uning yordamida bitta jadvalning har bir qatori boshqa jadvalning har bir satriga qo'shiladi. Shaxsan men kamdan -kam hollarda bu ittifoqqa muhtojman, lekin ba'zida bu talab qilinadi, shuning uchun siz ham undan foydalanishingiz kerak. Masalan, bizning holimizda, albatta, nima bo'lishi aniq emas, lekin baribir sinab ko'raylik, ayniqsa sintaksis biroz boshqacha:

T1.numberni t1_number, t1.textni t1_text, t2.number t2_number, t2.textni t2_text sifatida test_toldan t1 CROSS JOIN test_table_2 t2

Bu erda test_table ning har bir satri test_table_2 jadvalining har bir satriga to'g'ri keladi, ya'ni. test_table jadvalida bizda 4 ta satr bor va test_table_2 jadvalida 3 qatorda 4 ta 3 ga ko'paytiriladi va biz 12 qatorni ko'rsatganimizdek 12 bo'ladi.

Va nihoyat, keling, qanday qilib bir nechta jadvallarni birlashtirish mumkinligini ko'rsating, buning uchun men, masalan, birinchi jadvalimizni ikkinchi jadval bilan bir necha marta birlashtiraman, albatta, bu holatda qo'shilishning ma'nosi yo'q, lekin qanday bo'lishini ko'rasiz. buni baribir qilishingiz mumkin, boshlaylik:

T1.numberni t1_number, t1.textni t1_text, t2.number t2_number, t2.text t2_text sifatida Chapga qo'shilish test_table_2 t2 t1.number = t2.number O'ng qo'shilish test_table_2 t3 t1 bo'yicha

Ko'rib turganingizdek, men bu erda aniqlik uchun chapni ham, o'ngni ham, ichkarini ham birlashtiraman.

Uyushmalar bilan men etarli darajada o'ylayman, ayniqsa ular uchun murakkab narsa yo'q. Ammo bu keyingi maqolalarda SQLni o'rganish bilan tugamaydi, biz davom etamiz, lekin hozircha o'z so'rovlaringizni mashq qiling va yozing. Omad!

Operator QO'SHILISH ikkita to'plamdan ma'lumotlarni bitta natija to'plamiga birlashtirish operatsiyasini bajarish uchun ishlatiladi. SELECT ni bajarishda birlashtirishning har xil turlaridan foydalanish mumkin. Qaysi qatorlar natijalar to'plamiga qo'shilish birlashma turiga va aniq belgilangan qo'shilish shartiga bog'liq. Birlashish sharti, ya'ni. jadval satrlarini bir -biriga moslashtirish sharti mantiqiy ifodadir.

Agar siz bir nechta jadvallarga qo'shilishingiz kerak bo'lsa, qo'shilish amaliyoti ketma -ket bir necha marta qo'llanilishi kerak.

JOIN bayonotining sintaksisi

Operator yordamida qo'shimcha jadval so'rovlariga qo'shilish sintaksisi QO'SHILISH quyidagicha ifodalanishi mumkin:

1 -maydondan 1 -maydonni, 1, [, ... n] TANLASH (ICHKI | (SOL | O'ng | TO'LI) Tashqi | O'tish) 2 -jadvalga qo'shiling (ON) | FOYDALANILADI (maydon_ nomi [, ... n]))

Ko'pgina ma'lumotlar bazalarida, operatordan foydalanilganda QO'SHILISH LEFT, RIGHT, FULL kalit so'zlari bilan birgalikda OUTER operandini tashlab qo'yish mumkin. INNER operandini ko'pgina ma'lumotlar bazasi ma'lumotlar bazasida ham o'tkazib yuborish mumkin.

Agar jadvallar birlashtiriladigan ustunlar nomlari bir xil bo'lsa, ON o'rniga siz foydalanishingiz mumkin FOYDALANISH... Operator uchun QO'SHILISH shart belgilanmagan.

JOINni tekshirish uchun test jadvallari

Boshqa misollar uchun ikkita oddiy test jadvalini tuzaylik. Foydalanuvchilar va ularning transport vositalarining ma'lumot jadvallari. Birinchi jadvalda foydalanuvchi identifikatori va uning ismi (taxallusi) saqlanadi. Ikkinchi jadvalda avtomobillar ro'yxati (identifikator, ism) va ularning egalari / foydalanuvchilarining identifikatori mavjud. Shuni ta'kidlash kerakki, foydalanuvchi bir nechta mashinaga ega bo'lishi mumkin yoki umuman bo'lmasligi mumkin.

Foydalanuvchilar jadvali

CREATE TABLE foydalanuvchilarini (id int null emas, varchar nomi (32) null emas, asosiy kalit (id)); - Jadvalga bir nechta yozuvlarni kiritamiz foydalanuvchilarga kiritish (id, ism) qiymatlari (1, "alex"); foydalanuvchilarga (id, ism) qiymatlarni kiritish (2, "piter"); foydalanuvchilarga (id, ism) qiymatlarni kiritish (3, "serg"); foydalanuvchilarga (id, ism) qiymatlarni kiritish (4, "olga"); foydalanuvchilarga (id, ism) qiymatlarni kiritish (5, "ostap");

Avtomobil stoli

CREATE table autos (id int null emas, - avtomatik identifikator nomi varchar (32) null emas, - avtomatik nom bo'yicha tegishli int null emas, - egasi identifikatorining asosiy kaliti (id)); - Keling, jadvalga bir nechta yozuvlarni autos (id, tegishli, name) qiymatlariga kiritamiz (1, 1, "toyota camry"); avtomobillarga (id, tegishli, ism) qiymatlarni kiritish (2, 1, "toyota prado"); autos (id, tegishli, name) qiymatlarini kiritish (3, 2, "renault megane"); autos (id, tegishli, name) qiymatlarini kiritish (4, 3, "nissan x-trail"); autos (id, tegishli, name) qiymatlarini kiritish (5, 4, "suzuki swift"); autos (id, tegishli, name) qiymatlarini kiritish (6, 4, "suzuki vitara");

Ichki qo'shilish, ichki qo'shilish

Ichki qo'shilish ikkita jadvalning ichki qo'shilish operatoridir. Bu nosimmetrik, shuning uchun jadvallar tartibi operator uchun muhim emas.

Qo'llash mumkin Ichki qo'shilish faqat master -dagi yozuvlar va biriktirilgan jadval o'rtasida yozishmalar mavjud bo'lgan qatorlarni olish. Natijani yaratish algoritmi: asosiy jadvalning har bir qatori biriktirilgan jadvalning har bir satriga to'g'ri keladi. Shundan so'ng, ulanish sharti tekshiriladi. Agar shart to'g'ri bo'lsa, natijalar to'plamiga mos keladigan "birlashtirilgan" qator qo'shiladi.

Natijalar to'plamidagi ustunlarni tanlash bilan so'rov egasi sifatida u.name, foydalanuvchilarning avtomatik nomi sifatida tanlanadi u ichki qo'shilish autos a ON a.oid = u.id - So'rov natijasi egasi avtomatik alex toyota camry alex toyota prado piter renault megane serg nissan x -trail olga suzuki swift olga suzuki vitara - Natijalar to'plamidagi ustunlarni tanlamasdan so'rov * foydalanuvchilar ichidan tanlang u ichki qo'shilish avtos a ON a.oid = u.id - So'rov natijasi id nomi id1 name1 tegishli 1 alex 1 toyota camry 1 1 alex 2 toyota prado 1 2 piter 3 renault megane 2 3 serg 4 nissan x-trail 3 4 olga 5 suzuki swift 4 4 olga 6 suzuki vitara 4

Shartga mos kelmaydigan ma'lumotlarni olish uchun tashqi qo'shilishdan foydalanish kerak - Tashqi qo'shilish.

Tashqi qo'shilish, Tashqi qo'shilish

Operator bilan ikkita jadval qo'shilganda Tashqi qo'shilish natijalar to'plami, albatta, jadvallardan birining yoki ikkala jadvalning qatorlarini o'z ichiga oladi. OUTER kalit so'zini tashlab qo'yish mumkin. LEFT JOIN yozuvi LEFT OUTER JOIN bilan bir xil.

Tashqi birikmalarning ikki turi mavjud. u ChAP QO'SHILISH va To'g'ridan -to'g'ri qo'shiling... Bu operatorlar ham xuddi shunday ishlaydi. Farqi shundaki, LEFT JOIN ishlatilganda asosiy jadval FROM bandidan keyingi jadvaldir. Ilova qilingan jadval ma'lumotlari ushbu jadval satrlariga belgilangan sharoitda qo'shiladi. RIGHT OUTER JOIN operatori uchun hamma narsa aksincha.

Tashqi qo'shilish operatori Tashqi qo'shilish nosimmetrik emas, shuning uchun operatorlar uchun jadvallar orasidagi munosabatni o'rnatish tartibi muhim ahamiyatga ega.

LEFT OUTER JOIN operatoridan foydalanishga misol

U.name ni egasi sifatida, a.ni avtomatik foydalanuvchilardan tanlab oling u a.oid = u.id - avtoulov egasi uchun so'rov natijasi alex toyota camry alex toyota prado piter renault megane serg nissan x -trail olga suzuki swift olga suzuki vitara ostap

Grafik jihatdan ish natijasini quyidagicha ko'rsatish mumkin.

Filtrlangan LEFT OUTER JOIN bayonoti

Oldingi misol kodiga "a.name nol" shartini qo'shish orqali. Tanlovda faqat bitta "ostap" yozuvi qoladi, chunki unda faqat mashina aniqlanmagan.

Grafik jihatdan ish natijasini quyidagicha ko'rsatish mumkin.

O'zaro bog'lanish operatori, CROSS JOIN

CROSS JOIN - bu o'zaro bog'lanish operatori (kartezian mahsuloti). Operator nosimmetrik va jadvallar tartibi operator uchun muhim emas.

Natijalar to'plami quyidagicha shakllantiriladi: bitta jadvalning har bir qatori ikkinchi jadvalning har bir satriga qo'shiladi va natijada ikkita jadval satrining barcha mumkin bo'lgan kombinatsiyalarini beradi. Bizning misolimiz uchun, bu natijalar to'plamining 30 qatoriga olib keladi.

Foydalanuvchilarning o'zaro qo'shilish avtoulovlaridan * tanlang - so'rov natijasi id nomi id1 name1 oid 1 alex 1 toyota camry 1 2 piter 1 toyota camry 1 3 serg 1 toyota camry 1 4 olga 1 toyota camry 1 5 ostap 1 toyota camry 1 1 alex 2 toyota prado 1 2 piter 2 toyota prado 1 3 serg 2 toyota prado 1 4 olga 2 toyota prado 1 5 ostap 2 toyota prado 1. ... ...

To'plam natijalarida faqat dastlabki 12 qator ko'rsatiladi.

Birlashtirish operatsiyasi, boshqa ikkilik operatsiyalar singari, ikkita jadvaldan ma'lumotlarni olish va bu ma'lumotlarni bitta natija to'plamiga kiritish uchun mo'ljallangan. Birlashtirish operatsiyasining o'ziga xos xususiyati quyidagilardan iborat:

  • natijalar jadvalining sxemasi har ikkala manba jadvalining ustunlarini o'z ichiga oladi (operand jadvallari), ya'ni natija sxemasi operand sxemalarining "birikmasi" dir;
  • natijalar jadvalining har bir qatori bitta operandli jadvaldan ikkinchi operandlar jadvalining qatori bilan "biriktirilishi" dir.

Qaysi manba satrlari natijaga kiritilishini va qanday kombinatsiyalar qo'shilish operatsiyalari turiga va aniq ko'rsatilganligiga bog'liq. ulanish shartlari... Birlashish sharti, ya'ni manba jadvallar satrlarini bir -biriga moslashtirish sharti mantiqiy ifodadir (predikat).

Agar ikkita emas, balki bir nechta jadvallarni birlashtirish zarur bo'lsa, birlashtirish jarayoni bir necha marta (ketma -ket) qo'llaniladi.

Operator tavsifi

Jadvalni tanlang [, ... n] 1 -jadvaldan (ichki | (chap | o'ng | to'liq) tashqi | kesishgan) 2 -jadvalga qo'shiling< condition>

Ko'pgina DBMSlarda LEFT, RIGHT, FULL so'zlarini belgilashda OUTER so'zini tashlab qo'yish mumkin. Ko'p ichki ma'lumotlar bazalarida INNER so'zi ham qoldirilishi mumkin.

Umuman olganda, DBMS qo'shilishni amalga oshirishda shartni (predikatni) tekshiradi shart... CROSS JOIN uchun hech qanday band ko'rsatilmagan.

Ba'zi SQL ilovalari vergul operatoridan foydalanadi ( , ):

JOYNI [, ... n] SEQLASH 1 -jadval, 2 -jadvaldan

JOIN operator turlari

Batafsil tushuntirish uchun quyidagi jadvallardan foydalaniladi:

Shaharlarda yashovchi odamlar (odamlar jadvali)

Ichki qo'shilish

Operator ichki aloqa INNER JOIN ikkita jadvalga qo'shiladi. Jadvallar tartibi operator uchun muhim emas, chunki operator nosimmetrikdir.

Sarlavha birlashtirish

Tana natija mantiqan quyidagicha shakllanadi. Bir jadvalning har bir satri ikkinchi jadvalning har bir qatori bilan taqqoslanadi, shundan so'ng hosil bo'lgan "ulangan" qator uchun qo'shilish sharti tekshiriladi (qo'shilish predikati hisoblab chiqiladi). Agar shart to'g'ri bo'lsa, natijalar jadvaliga mos keladigan "birlashtirilgan" qator qo'shiladi.

Ta'riflangan harakatlar algoritmi qat'iy mantiqiydir, ya'ni u faqat operatsiyani bajarishda olinishi kerak bo'lgan natijani tushuntiradi, lekin ma'lum bir DBMS ulanishni belgilangan usulda bajarishi shart emas. Birlashtirilgan operatsiyani amalga oshirishning ko'plab usullari mavjud, masalan, biriktirilgan ko'chadan qo'shilish. ichki halqalar birlashadi), xesh aloqasi (ing. hash qo'shilish), qo'shilish (ing. qo'shilish). Bitta talab shundaki, har qanday dastur mantiqan ta'riflangan algoritmni qo'llangandek natija beradi.

SELECT * FROM Inson INNER JOIN City ON Person. CityId = shahar. Id

Natija:

Ism Person.CityId Shahar Id Shahar nomi
Andrey 1 1 Moskva
Leonid 2 2 Sankt -Peterburg
Sergey 1 1 Moskva

Tashqi qo'shilish

Ikkita jadvalning birlashuvi, natijasi bitta yoki ikkala jadvalning qatorlarini o'z ichiga oladi.

ChAP QO'SHILISH

Operator chap tashqi birikma LEFT OUTER JOIN ikkita jadvalga qo'shiladi. Operator uchun jadvallar tartibi muhim, chunki operator nosimmetrik emas.

Sarlavha natijalar jadvali-bu birlashtiriladigan jadvallar sarlavhalarining birlashishi.

Tana p.

  1. p.
  2. So'ngra, 1 -qadamda ichki qo'shilishga kiritilmagan chap jadvalning yozuvlari natijaga qo'shiladi va bunday yozuvlar uchun o'ng jadvalga mos keladigan maydonlar qiymatlar bilan to'ldiriladi. NULL.

Tanlang * FROM SHAXRDAN QOLGAN QO'ShIMChA Shaharda. CityId = shahar. Id

Natija:

Ism Person.CityId Shahar Id Shahar nomi
Andrey 1 1 Moskva
Leonid 2 2 Sankt -Peterburg
Sergey 1 1 Moskva
Gregori 4 NULL NULL

To'g'ridan -to'g'ri qo'shiling

Operator o'ng tashqi qo'shilish RIGHT OUTER JOIN ikkita jadvalga qo'shiladi. Operator uchun jadvallar tartibi muhim, chunki operator nosimmetrik emas.

Sarlavha natijalar jadvali-bu birlashtiriladigan jadvallar sarlavhalarining birlashishi.

Tana natija mantiqan quyidagicha shakllanadi. Chap va o'ng jadvallarning qo'shilishi predikat (shart) orqali bajarilsin p.

  1. Natijada, predikat tomonidan chap va o'ng jadvallarning ichki qo'shilishi (INNER JOIN) kiradi p.
  2. Keyin 1 -bosqichda ichki qo'shilishga kiritilmagan o'ng jadvalning yozuvlari natijaga qo'shiladi va bunday yozuvlar uchun chap jadvalga mos keladigan maydonlar qiymatlar bilan to'ldiriladi. NULL.

Shaxsdan * O'ngdan tashqariga tanlang. CityId = shahar. Id

Natija:

Ism Person.CityId Shahar Id Shahar nomi
Andrey 1 1 Moskva
Sergey 1 1 Moskva
Leonid 2 2 Sankt -Peterburg
NULL NULL 3 Qozon

TO'LIQ QO'SHILISH

Operator to'liq tashqi qo'shilish FULL OUTER JOIN ikkita jadvalga qo'shiladi. Jadvallar tartibi operator uchun muhim emas, chunki operator nosimmetrikdir.

Sarlavha natijalar jadvali-bu birlashtiriladigan jadvallar sarlavhalarining birlashishi.

Tana natija mantiqan quyidagicha shakllanadi. Birinchi va ikkinchi jadvallarning qo'shilishi predikat (shart) orqali bajarilsin p... Bu erda "birinchi" va "ikkinchi" so'zlari yozuvdagi tartibni bildirmaydi (bu muhim emas), faqat jadvallarni ajratish uchun ishlatiladi.

  1. Natijada birinchi va ikkinchi jadvallarning ichki qo'shilishi (INNER JOIN) o'z ichiga oladi p.
  2. Natijada 1 -qadamda ichki qo'shilishga kiritilmagan birinchi jadval yozuvlari qo'shiladi. Bunday yozuvlar uchun ikkinchi jadvalga mos keladigan maydonlar qiymatlar bilan to'ldiriladi. NULL.
  3. Natijada 1 -qadamda ichki qo'shilishga kiritilmagan ikkinchi jadval yozuvlari qo'shiladi. Bunday yozuvlar uchun birinchi jadvalga mos keladigan maydonlar qiymatlar bilan to'ldiriladi. NULL.

Shaxsdan * to'liq tanlang. CityId = shahar. Id

Natija:

Ism Person.CityId Shahar Id Shahar nomi
Andrey 1 1 Moskva
Sergey 1 1 Moskva
Leonid 2 2 Sankt -Peterburg
NULL NULL 3 Qozon
Gregori 4 NULL NULL

QO'SHILISH

Operator o'zaro bog'liqlik, yoki Kartezian mahsuloti CROSS JOIN ikkita jadvalga qo'shiladi. Jadvallar tartibi operator uchun muhim emas, chunki operator nosimmetrikdir.

Sarlavha natijalar jadvali-bu birlashtiriladigan jadvallar sarlavhalarining birlashishi.

Tana natija mantiqan quyidagicha shakllanadi. Bir jadvaldagi har bir satr ikkinchi jadvaldagi har bir qatorga qo'shiladi, natijada ikkita jadvaldagi barcha mumkin bo'lgan satr kombinatsiyalari paydo bo'ladi.

Shahardan QO'SHILISHNI TANLASH *

Shaxsdan, shahardan * tanlang

Natija:

Ism Person.CityId Shahar Id Shahar nomi
Andrey 1 1 Moskva
Andrey 1 2 Sankt -Peterburg
Andrey 1 3 Qozon
Leonid 2 1 Moskva
Leonid 2 2 Sankt -Peterburg
Leonid 2 3 Qozon
Sergey 1 1 Moskva
Sergey 1 2 Sankt -Peterburg
Sergey 1 3 Qozon
Gregori 4 1 Moskva
Gregori 4 2 Sankt -Peterburg
Gregori 4 3 Qozon

Agar siz WHERE bandiga qo'shilish shartini qo'shsangiz, ya'ni tuplar kombinatsiyasini cheklasangiz, natija xuddi shu shart bilan INNER JOIN operatsiyasiga teng bo'ladi:

Shunday qilib, CROSS JOIN + WHERE ( predikat) va ichki qo'shilish ( predikat) bir xil mantiqiy ichki qo'shilish operatsiyasini yozishning sintaktik muqobil shakllari. CROSS JOIN + WHERE qo'shilish sintaksisi bekor qilingan, chunki u ANSI SQL standarti bilan bekor qilingan.

Eslatmalar (tahrir)

Havolalar

  • Oracle -da qo'shilish turlarining tavsifi (rus)
  • Jeff Atvud, SQL qo'shilishining vizual izohi

Oracle ikki yoki undan ortiq jadvallar yoki ko'rinishlar qatorlarini birlashtirish usuli bilan farq qiladigan bir necha turdagi birlashuvlarni qo'llab -quvvatlaydi. Mening blogimdagi ushbu xabarda Oracle -ning eng keng tarqalgan qo'shilish turlari tasvirlangan.

Ekvivalent

Equi-join ustunlar orasidagi tenglik shartiga asoslangan ikki yoki undan ortiq jadvalga qo'shiladi. Boshqacha qilib aytganda, birlashtiriladigan barcha jadvallarda bitta ustun bir xil qiymatga ega. Quyida tenglamali birikmaning ishlatilishiga misol keltirilgan:

SQL> SELECT e.last_name, d.dept FROM emp e, dept d WHERE e.emp_id = d.emp_id;

Yuqorida ko'rsatilgan qo'shilish operatori uchun quyidagi yangi sintaksisdan ham foydalanishingiz mumkin:

SQL> SELECT e.last_name, d.dept FROM emp e JOIN dept d USING (emp_id);

Agar siz bir nechta ustunlarga qo'shilishni xohlasangiz, ularning nomlarini vergul bilan ajratilgan ro'yxat sifatida ro'yxatlashingiz mumkin, masalan: USING (dept_id, emp_name).

Tabiiy aloqa

Tabiiy qo'shilish-bu qo'shilishni yakunlash uchun mos keladigan ustunlar aniq ko'rsatilmagan tenglama. Oracle avtomatik ravishda qaysi jadvallar bir -biriga mos kelishini aniqlab beradi. Quyida tabiiy aralashmani ishlatishga misol keltirilgan.

SQL> SELECT e.last_name, d.dept FROM emp e NATURAL JOIN dept d;

Bu misolda, qo'shilish sharti emp va dept jadvallaridagi last_name ustunida bir xil qiymatlarning mavjudligi.

Reflektiv aloqa

O'z -o'zidan qo'shilish - bu taxalluslar yordamida jadvalning o'ziga qo'shilishini anglatadi. Quyidagi misol, barcha takrorlanadigan qatorlarni olib tashlagan holda, taxallus yordamida xodimlar jadvaliga qo'shiladi.

SQL> X YO'RLANGAN X XO'RLARIDAN O'CHIRISH> 2 (YIN xodimlaridan MIN (qator) ni tanlang, bu erda X.key_values ​​= Y.key_values);

Ichki aloqa

Ichki qo'shilish, oddiy qo'shilish deb ham ataladi, belgilangan qo'shilish shartiga mos keladigan barcha qatorlarni qaytaradi. Ilgari, ichki qo'shilish sintaksisida, jadvallarni qanday birlashtirish kerakligini belgilash uchun WHERE bandini ishlatish kerak edi, masalan:

SQL> SELECT e.flast_name, d.dept FROM emp e, de d d WHERE e.emp_id = d.emp_id;

Endi Oracle yangi ON yoki USING konstruktsiyasidan foydalanib ichki (yoki oddiy) qo'shilish sintaksisida qo'shilish mezonlarini belgilashga imkon beradi, masalan:

SQL> DISTINCT NVL ni tanlang (dname, "No Dept"), COUNT (empno) nbr_emps EMP JOIN DEPT ON emp.deptno = dept.deptno emp.job IN ("MANAGER", "SALESMAN", "ANALYST") GURUHIDA BY nomi bilan;

Tashqi aloqa

Tashqi qo'shilish belgilangan qo'shilish shartiga mos keladigan barcha qatorlarni qaytarish uchun ishlatiladi, shuningdek, ko'rsatilgan qo'shilish shartiga mos keladigan qatorlar mos kelmaydigan jadvaldagi ba'zi yoki barcha qatorlarni qaytarish uchun ishlatiladi. Tashqi birlashishning uch turi mavjud: chap tashqi birikma, o'ng tashqi birikma va to'liq tashqi qo'shilish. OUTER odatda to'liq tashqi qo'shilish bayonnomasida qoldiriladi.

Buni baham ko'ring