باستخدام UNION في SQL. عامل التشغيل للعمل مع UNION يحدد الجمع بين الاستعلامات Union

حان الوقت للحديث عن دمج البيانات بوسائل التصميم اتحادو الاتحاد جميعا، لأنه في بعض الأحيان يكون مفيدًا جدًا، وفي بعض الأحيان يكون من المستحيل الاستغناء عن استخدام مثل هذا التصميم. سنكتب أمثلة في نظام إدارة قواعد البيانات (DBMS). إم إس إس كيو إل 2008باستخدام لغة SQL.

وأود أن أبدأ بحقيقة أننا وقد نظرنا بالفعل في العديد من الأمثلة على طلبات الكتابة SQLعلى سبيل المثال، عبارة تحديد لغة SQL، أو استخدام وظائف سلسلة SQL، تعتبر أيضًا برمجة في كل من plpgsql وtransact-sql، على سبيل المثال، كيفية كتابة دالة في PL/pgSQL وTransact-sql - وظائف الجدول و الجداول المؤقتة على التوالي.

لقد أشرت إلى المقالات المذكورة أعلاه لسبب ما، لكنني أشرت إليها لأنه من أجل فهم واستيعاب درس اليوم بشكل أفضل، فأنت بحاجة إلى المعرفة الأساسية (هذا موقع للمبرمجين المبتدئين)، والتي يمكنك الحصول عليها من المواد المذكورة أعلاه.

ولذا دعونا نبدأ. أولاً، دعونا نلقي نظرة على ماهية هذه النقابات وجميع المشغلين النقابيين.

ما هو UNION و UNION ALL في SQL؟

  • اتحادعبارة عن عبارة SQL لدمج مجموعة نتائج الاستعلامات المتعددة، ويقوم هذا العامل بإخراج صفوف فريدة فقط في الاستعلامات، أي. على سبيل المثال، تقوم بدمج استعلامين ويحتوي كل منهما على نفس البيانات، أي متطابقة تمامًا، وسيقوم مشغل الاتحاد بدمجهما في سطر واحد حتى لا يكون هناك تكرارات؛
  • الاتحاد الكلهو عامل SQL لدمج مجموعة البيانات الناتجة من عدة استعلامات، ولكن هذا العامل سيخرج جميع الصفوف تمامًا، حتى التكرارات.

الشروط الأساسية للنقابة ونقابة جميع المشغلين

  1. يجب أن تكون مجموعة الحقول نفسفي جميع الطلبات، أي. عدد الحقول في كل طلب سيتم دمجها باستخدام الاتحاد أو الاتحاد يجب أن يكون كل البناء هو نفسه؛
  2. أنواع البياناتيجب أن تتطابق الحقول أيضًا في كل طلب، على سبيل المثال. على سبيل المثال، إذا كنت تريد كتابة استعلام واحد يكون فيه نوع البيانات int ونوع البيانات في الاستعلام الثاني هو varchar، فلن يتم تنفيذ استعلامك وستعرض نافذة الاستعلام خطأً؛
  3. في حالة الفرز، المشغل ترتيب حسبيمكنك تحديد فقط بعد الطلب الأخير.

الآن دعونا نتحدث عن متى قد نحتاج إلى استخدام عوامل التشغيل هذه. حسنًا، على سبيل المثال، لديك عدة قواعد بيانات ذات بنية متشابهة، تم إنشاء كل منها لفرع مثلاً، وتحتاج إلى دمج هذه البيانات لتقديم تقارير لجميع الفروع إلى الإدارة، وأسهل طريقة للقيام بذلك هو كتابة استعلامات في SQL، كل منها سيصل إلى قواعد بيانات مختلفة، واستخدام Union أو Union All Construction لدمجها. أيضًا، في بعض الأحيان يكون من الضروري دمج البيانات في قاعدة بيانات واحدة بحيث لا يمكن تحقيق ذلك باستخدام الاتحادات العادية ويتعين عليك استخدام الاتحاد. لماذا أقول "يجب أن" لأن هذا البناء يزيد بشكل كبير من وقت تنفيذ الاستعلام، على سبيل المثال، إذا كان هناك الكثير من البيانات، وليس هناك حاجة لإساءة استخدامها.

يكفي نظرية، دعونا ننتقل إلى الممارسة.

ملحوظة!كما ذكرنا سابقًا، سنكتب الاستعلامات في Management Studio لـ SQL Server 2008

أمثلة على استخدام union و union all

أولاً، لنقم بإنشاء جدولين بسيطين test_table وtest_table_2

إنشاء جدول (IDENTITY(1,1) NOT NULL، (18، 0) NULL، (50) NULL، CONSTRAINT PRIMARY KEY CLUSTERED (ASC)WITH (PAD_INDEX = OFF، STATISTICS_NORECOMPUTE = OFF، IGNORE_DUP_KEY = OFF، ALLOW_ROW_LOCKS = ON، ALLOW_PAGE_LOCKS) = ON) ON) ON GO SET ANSI_PADDING OFF GO - والجدول الثاني إنشاء جدول ( IDENTITY(1,1) NOT NULL، (18، 0) NULL، (50) NULL، CONSTRAINT PRIMARY KEY CLUSTERED ( ASC) مع ( PAD_INDEX = إيقاف، STATISTICS_NORECOMPUTE = إيقاف، IGNORE_DUP_KEY = إيقاف، ALLOW_ROW_LOCKS = تشغيل، ALLOW_PAGE_LOCKS = تشغيل) تشغيل) ON GO SET ANSI_PADDING OFF GO

هم نفس الشيء على سبيل المثال، فقط أسماء مختلفة. لقد ملأت لهم البيانات التالية:

لنكتب الآن استعلامًا يجمع البيانات الناتجة في استعلام واحد، على سبيل المثال من خلال اتحاد. بناء الجملة بسيط جدا:

طلب اتحاد واحد طلب اتحاد اثنين طلب اتحاد 3، إلخ.

وهنا الطلب:

حدد رقمًا، نصًا من اتحاد test_table، حدد رقمًا، نصًا من test_table_2

كما ترون، تم عرض 5 أسطر فقط، حيث أن السطر الأول في الطلب الأول والسطر الأول في الطلب الثاني متماثلان، لذلك تم دمجهما.

الآن دعونا نتحد عبر الاتحاد جميعا

وهنا الطلب:

حدد الرقم والنص من test_table union الكل حدد الرقم والنص من test_table_2

لقد تم بالفعل عرض كافة الأسطر هنا، حيث قمنا بتحديد الاتحاد الكل.

الآن دعونا نلقي نظرة على الأخطاء التي يمكن أن تحدث حتى في هذا الطلب البسيط. على سبيل المثال، قمنا بخلط تسلسل الحقول:

أو قمنا بتحديد حقل إضافي في الطلب الأول، ولكننا لم نفعل ذلك في الطلب الثاني.

وأيضًا، على سبيل المثال، عند استخدام الأمر حسب:

قمنا هنا بتحديد الفرز في كل طلب، ولكنه كان ضروريا فقط في الطلب الأخير، على سبيل المثال:

حدد الرقم، والنص من اتحاد test_table، الكل حدد الرقم، والنص من test_table_2 بالترتيب حسب الرقم

وأخيرًا، أردت أن أخبرك عن خدعة واحدة يمكن استخدامها، على سبيل المثال، عندما لا تزال بحاجة إلى عرض بعض الحقول في طلب واحد، وفي حالات أخرى لا تكون موجودة أو ببساطة ليست هناك حاجة إليها، لذلك يمكنك الكتابة الطلب التالي:

حدد المعرف والرقم والنص من test_table union الكل حدد "" والرقم والنص من test_table_2

أولئك. كما ترون، ما عليك سوى وضع الحقل فارغًا في مكانه وسيعمل الطلب بشكل مثالي، على سبيل المثال:

ربما كل ما أردت أن أخبرك به عن التصميم الاتحاد والاتحاد كل من لغة SQLقلت، إذا كانت لديك أسئلة حول استخدام هذه العوامل، فاطرحها في التعليقات. حظ سعيد!

سيغطي الدرس موضوع استخدام عمليات الاستعلامات الاتحاد والتقاطع والاختلاف. أمثلة على كيفية استخدامه اتحاد استعلام SQL وموجود واستخدام الكلمات الرئيسية SOME وANY وجميع الكلمات الرئيسية. تمت تغطية وظائف السلسلة


يمكنك إجراء عمليات الاتحاد والفرق والضرب الديكارتي على مجموعة. يمكن استخدام نفس العمليات في استعلامات SQL (تنفيذ العمليات باستخدام الاستعلامات).

يتم استخدام كلمة خاصة للجمع بين عدة استعلامات اتحاد.
بناء الجملة:

< запрос 1 >الاتحاد[الكل]< запрос 2 >

<запрос 1>اتحاد<запрос 2>

يتم استخدام استعلام Union SQL لدمج صفوف الإخراج لكل استعلام في مجموعة نتائج واحدة.

إذا ما استخدمت المعلمة الكل، ثم يتم حفظ كافة خطوط الإخراج المكررة. إذا كانت المعلمة مفقودة، فستبقى الصفوف الفريدة فقط في مجموعة النتائج.

يمكنك دمج أي عدد من الاستعلامات معًا.

يتطلب استخدام مشغل UNION استيفاء عدة شروط:

  1. يجب أن يكون عدد أعمدة الإخراج لكل استعلام هو نفسه؛
  2. يجب أن تكون أعمدة الإخراج لكل استعلام قابلة للمقارنة مع بعضها البعض حسب نوع البيانات (حسب الأولوية)؛
  3. تستخدم المجموعة الناتجة أسماء الأعمدة المحددة في الاستعلام الأول؛
  4. لا يمكن استخدام ORDER BY إلا في نهاية الاستعلام المركب لأنه ينطبق على نتيجة الصلة.

مثال:عرض أسعار أجهزة الكمبيوتر واللاب توب وأرقامها (أي التفريغ من جدولين مختلفين في استعلام واحد)


✍ الحل:
1 2 3 4 5 6 حدد "الرقم" ، "السعر" من جهاز الكمبيوتر UNION حدد "الرقم" ، "السعر" من دفتر الملاحظات ORDER BY "السعر"

حدد "الرقم" ، "السعر" من جهاز الكمبيوتر UNION حدد "الرقم" ، "السعر" من دفتر الملاحظات ORDER BY "السعر"

نتيجة:

دعونا نلقي نظرة على مثال أكثر تعقيدًا مع صلة داخلية:

مثال:ابحث عن نوع المنتج وعدد وسعر أجهزة الكمبيوتر وأجهزة الكمبيوتر المحمولة


✍ الحل:
1 2 3 4 5 6 7 8 حدد المنتج. `النوع`، جهاز كمبيوتر. "الرقم" ، "السعر" من جهاز الكمبيوتر INNER JOIN المنتج على جهاز الكمبيوتر. `الرقم` = المنتج. `الرقم` منتج UNION SELECT. `النوع`، دفتر ملاحظات. `الرقم'، `السعر` من الكمبيوتر المحمول، انضم إلى المنتج الداخلي على الكمبيوتر المحمول. `الرقم` = المنتج. "الرقم" اطلب حسب "السعر".

حدد المنتج.`النوع`، الكمبيوتر.`الرقم`، `السعر` من جهاز الكمبيوتر INNER JOIN المنتج على جهاز الكمبيوتر.`الرقم` = المنتج.`الرقم` الاتحاد حدد المنتج.`النوع`، دفتر الملاحظات.`الرقم`، `السعر` من دفتر الملاحظات الداخلي، انضم إلى المنتج على دفتر الملاحظات. `الرقم` = المنتج.`الرقم` ترتيب حسب `السعر`

نتيجة:

اتحاد SQL 1.ابحث عن الشركة المصنعة ورقم القطعة وسعر جميع أجهزة الكمبيوتر المحمولة والطابعات

اتحاد SQL 2.احصل على أرقام وأسعار جميع المنتجات التي تنتجها الشركة المصنعة روسيا

مسند وجود SQL موجود

تحتوي SQL على تسهيلات لتنفيذ عمليات التقاطع والاختلاف في الاستعلامات - عبارة INTERSECT (التقاطع) وعبارة EXCEPT (الفرق). تعمل هذه الجمل بشكل مشابه لكيفية عمل UNION: تتضمن مجموعة النتائج فقط تلك الصفوف الموجودة في كلا الاستعلامين - INTERSECT، أو فقط تلك الصفوف من الاستعلام الأول المفقودة في الاستعلام الثاني - باستثناء. لكن المشكلة هي أن العديد من أنظمة إدارة قواعد البيانات لا تدعم هذه المقترحات. ولكن هناك طريقة للخروج - باستخدام المسند الموجود.

يتم تقييم دالة تقييم EXISTS إلى TRUE إذا قام الاستعلام الفرعي بإرجاع بعض الصفوف على الأقل؛ وبخلاف ذلك، يتم تقييم EXISTS إلى FALSE. هناك أيضًا مسند غير موجود، وهو ما يفعل العكس.

عادةً ما يتم استخدام EXISTS في الاستعلامات الفرعية التابعة (على سبيل المثال، IN).

موجود (استعلام فرعي للجدول)

مثال:ابحث عن الشركات المصنعة لأجهزة الكمبيوتر التي تنتج أجهزة الكمبيوتر المحمولة أيضًا


✍ الحل:

حدد الشركة المصنعة المميزة من المنتج كـ pc_product حيث النوع = "كمبيوتر" والموجود (اختر الشركة المصنعة من المنتج حيث النوع = "كمبيوتر محمول" والشركة المصنعة = pc_product.Manufacturer)

نتيجة:

ابحث عن الشركات المصنعة لأجهزة الكمبيوتر التي لا تصنع الطابعات

SQL بعض الكلمات الرئيسية | أي وجميع

الكلمتان الأساسيتان SOME وANY مترادفتان، لذا يمكنك استخدام أي منهما في الاستعلام الخاص بك. ستكون نتيجة هذا الاستعلام عمودًا واحدًا من القيم.

بناء الجملة:

< выражение>< оператор сравнения>بعض | أي (< подзапрос> )

<выражение><оператор сравнения>بعض | أي (<подзапрос>)

إذا تم إرجاع أي قيمة X من استعلام فرعي، فإن نتيجة العملية " " ترجع TRUE ، فسيتم تقييم المسند ANY أيضًا إلى TRUE .

مثال:ابحث عن موردي أجهزة الكمبيوتر الذين ليست أرقامهم معروضة للبيع (أي غير موجودة في جدول أجهزة الكمبيوتر)


✍ الحل:

بيانات مصدر الجدول:

نتيجة:

في المثال، الرقم المسند = ANY(SELECT Number FROM pc) سيرجع القيمة TRUE عندما يتم العثور على الرقم من الاستعلام الرئيسي في قائمة أرقام أجهزة الكمبيوتر المكتبية (التي يتم إرجاعها بواسطة الاستعلام الفرعي). بالإضافة إلى ذلك، يتم استخدام NOT. ستتكون مجموعة النتائج من عمود واحد - الشركة المصنعة. لمنع عرض مصنع واحد عدة مرات، تم تقديم كلمة الخدمة DISTINCT.
الآن دعونا نلقي نظرة على استخدام الكلمة الأساسية ALL:

مثال:تعرف على أرقام وأسعار أجهزة الكمبيوتر المحمولة التي تكلف أكثر من أي جهاز كمبيوتر


✍ الحل:

مهم:تجدر الإشارة إلى أنه بشكل عام، يؤدي الاستعلام باستخدام ANY إلى إرجاع مجموعة من القيم. ولذلك، فإن استخدام استعلام فرعي في عبارة WHERE بدون عوامل التشغيل EXISTS و IN و ALL و ANY، والتي تنتج قيمة منطقية، قد يؤدي إلى حدوث خطأ في وقت تشغيل الاستعلام


مثال:تعرف على أرقام وأسعار أجهزة الكمبيوتر التي تتجاوز تكلفتها الحد الأدنى لتكلفة أجهزة الكمبيوتر المحمولة


✍ الحل:


هذا الاستعلام صحيح لأنه تتم مقارنة التعبير العددي "السعر" باستعلام فرعي يُرجع قيمة واحدة

وظائف للعمل مع السلاسل في SQL

تقوم الدالة LEFT بقص عدد الأحرف المحددة بواسطة الوسيطة الثانية من يسار السلسلة:

غادر (<строка>,<число>)

تقوم الدالة RIGHT بإرجاع العدد المحدد من الأحرف إلى اليمين من تعبير سلسلة:

يمين(<строка>,<число>)

مثال:طباعة الحروف الأولى من أسماء جميع الشركات المصنعة


✍ الحل:

اختر اليسار المميز("الشركة المصنعة"، 1) من "المنتج"

نتيجة:

مثال:طباعة أسماء الشركات المصنعة التي تبدأ وتنتهي بنفس الحرف


✍ الحل:

وظيفة استبدال SQL

بناء الجملة:

حدد `اسم`، واستبدل(`اسم`، "a"، "aa") من `المعلمين`

تجمع عبارة SQL UNION نتيجة عبارتين أو أكثر من عبارات SELECT.

مشغل SQL UNION

يتم استخدام عامل التشغيل UNION لدمج نتائج متعددة لاثنين أو أكثر من عبارات SELECT.

لاحظ أن كل عبارة ZELEST داخل الاتحاد يجب أن تحتوي على نفس عدد الأعمدة. يجب أن تحتوي الأعمدة أيضًا على نفس أنواع البيانات. بالإضافة إلى ذلك، يجب أن تكون الأعمدة في كل SELEST بنفس الترتيب.

بناء جملة SQL UNION

يختار اسم_العمود (الأسماء)من الجدول 1
اتحاد
يختار اسم_العمود (الأسماء)من الجدول 2 ;

ملاحظة: يقوم عامل التشغيل UNION بتحديد القيم الافتراضية المميزة فقط.للسماح بالقيم المكررة، استخدم الكلمة الأساسية ALL مع UNION.

SQL UNION ALL بناء الجملة

يختار اسم_العمود (الأسماء)من الجدول 1
الاتحاد الكل
يختار اسم_العمود (الأسماء)من الجدول 2 ;

ملاحظة: عادةً ما تكون أسماء الأعمدة في نتائج الاستعلامات في الاتحاد مساوية لأسماء الأعمدة في أول ZEBEST في الاتحاد.

النسخة التجريبية من قاعدة البيانات

في هذا البرنامج التعليمي سوف نستخدم قاعدة بيانات Northwind المعروفة.

فيما يلي تحديد من جدول "العملاء":

معرف المستخدماسم العميلالشخص المتصلعنوانمدينةشفرة البريدبلد
1 ألفريدس فوتيركيست ماريا أندرس شارع أوبير. 57 برلين 12209 ألمانيا
2 أنا تروخيو Emparedados y helados آنا تروجيلو أفدا. دي لا الدستور 2222 المكسيك مدافع. 05021 المكسيك
3 أنطونيو مورينو تاكيريا أنطونيو مورينو ماتاديروس 2312 المكسيك مدافع. 05023 المكسيك

والاختيار من جدول "الموردين":

مثال SQL UNION

SQL التالي - حدد كل البيان متنوعالمدن (القيم الفردية فقط) من جدولي "العملاء" و"الموردين":

ملاحظة: لا يمكن استخدام UNION لسرد كافة المدن من جدولين.إذا كان هناك العديد من العملاء والموردين في نفس المدن، فسيتم إدراج كل مدينة مرة واحدة فقط. يختار UNION قيمًا معينة فقط. باستخدام UNION ALL أيضًا حدد القيم المكررة!

SQL UNION ALL مثال

الجميع(قيم مكررة) أيضًا مدن من جدولي "العملاء" و"الموردين":

اتحاد SQL مع كل مكان

تستخدم عبارة SQL التالية UNION ALL للتحديد الجميع(القيم المكررة) أيضا ألمانيةالمدن من جدولي "العملاء" و"الموردين".

في الغالبية استعلامات SQLيتم استخدام عامل واحد لإرجاع البيانات من جدول واحد أو أكثر. SQLكما يسمح لك بتشغيل استعلامات منفصلة متعددة في وقت واحد وعرض النتيجة كمجموعة واحدة من البيانات. عادةً ما يتم استدعاء مثل هذه الاستعلامات المجمعة مجموعاتأو استعلامات معقدة.

1. استخدام مشغل UNION

الاستعلامات في اللغة SQLيتم دمجها باستخدام المشغل اتحاد. للقيام بذلك، يجب عليك تحديد كل طلب يختارووضع الكلمة الأساسية بينهما اتحاد. حدود على عدد المشغلين المستخدمة اتحادفي طلب عام واحد رقم. وقد لاحظنا ذلك في القسم السابق وصولليس لديه القدرة على الخلق الانضمام الخارجي الكاملوالآن سنرى كيف يمكننا تحقيق ذلك من خلال المشغل اتحاد.

يختار *
من Sumproduct، انضم إلى البائعين على Sumproduct.City = Sellers.City
اتحاد
يختار *

من Sumproduct يمينًا، انضم إلى البائعين في Sumproduct.City = Sellers.City

نرى أن الاستعلام عرض كل الأعمدة من الجدول الأول والآخر، بغض النظر عما إذا كانت جميع السجلات متطابقة في الجدول الآخر.

ومن الجدير بالذكر أيضًا أنه في كثير من الحالات، بدلاً من ذلك اتحاديمكننا استخدام الاقتراح أينمع العديد من الشروط، والحصول على نتيجة مماثلة. ومع ذلك، بسبب اتحادتبدو الإدخالات أكثر إيجازًا ومفهومة. من الضروري أيضًا اتباع قواعد معينة عند كتابة الاستعلامات المجمعة:

  • طلب اتحاديجب أن تتضمن بيانين أو أكثر يختار، مفصولة بكلمة رئيسية اتحاد(على سبيل المثال، إذا كان الاستعلام يستخدم أربع عبارات SELECT، فيجب أن تكون هناك ثلاث كلمات أساسية UNION)
  • كل طلب في البيان اتحاديجب أن تحتوي على نفس الأعمدة أو التعبيرات أو الوظائف الإحصائية، والتي يجب أيضًا إدراجها بنفس الترتيب
  • يجب أن تكون أنواع بيانات الأعمدة متوافقة. ليس من الضروري أن يكونوا من نفس النوع، ولكن يجب أن يكونوا من نفس النوع لكي يكونوا كذلك نظام إدارة قواعد البياناتيمكن تحويلها بشكل فريد (على سبيل المثال، يمكن أن تكون أنواع بيانات رقمية مختلفة أو أنواع تاريخ مختلفة).

2. قم بتشغيل أو إيقاف تشغيل الخطوط المتكررة

طلب من اتحاديقوم تلقائيًا بإزالة كافة الصفوف المكررة من مجموعة نتائج الاستعلام (أي أنها تتصرف مثل الجمل أينمع عدة شروط في بيان واحد يختار). هذا سلوك المشغل اتحادبشكل افتراضي، ولكن يمكننا تغيير هذا إذا أردنا ذلك. للقيام بذلك يجب علينا استخدام المشغل الاتحاد الكلبدلاً من اتحاد.

3. فرز نتائج الاستعلامات المجمعة

نتائج تنفيذ البيان يختارفرزها باستخدام جملة ترتيب حسب. عند الجمع بين الاستعلامات باستخدام اتحادجملة واحدة فقط ترتيب حسبيمكن استخدامها ويجب تضمينها في البيان الأخير يختار. في الواقع، من الناحية العملية، لا فائدة من فرز جزء من النتائج بترتيب والجزء الآخر بترتيب آخر. لذلك، بعض الاقتراحات ترتيب حسبالاستخدام غير مسموح به.



نواصل الموضوع:
شبابيك

الجزء الثاني: "أهم خصائص كل عائلة من معالجات Intel Core i3/i5/i7. أي من هذه الرقائق ذات أهمية خاصة" المقدمة أولاً سنقدم...