حدد (SQL)
تُعيد عبارة SQL SELECT مجموعة نتائج من الصفوف ، من جدول واحد أو أكثر . [ 1 ] [ 2 ]
تسترجع عبارة SELECT صفرًا أو أكثر من الصفوف من جدول واحد أو أكثر من جداول قاعدة البيانات أو من طرق عرض قاعدة البيانات . في معظم التطبيقات، SELECTتُعدّ هذه العبارة الأمر الأكثر شيوعًا في لغة معالجة البيانات (DML). ولأن SQL لغة برمجة تصريحية ، SELECTفإن الاستعلامات تُحدد مجموعة النتائج، ولكنها لا تُحدد كيفية حسابها. تُترجم قاعدة البيانات الاستعلام إلى " خطة استعلام " قد تختلف بين عمليات التنفيذ، وإصدارات قاعدة البيانات، وبرامج قاعدة البيانات. تُسمى هذه الوظيفة " مُحسِّن الاستعلام " لأنها مسؤولة عن إيجاد أفضل خطة تنفيذ ممكنة للاستعلام، ضمن القيود المُطبقة.
تحتوي عبارة SELECT على العديد من البنود الاختيارية:
SELECTالقائمة هي قائمة الأعمدة أو تعابير SQL التي سيتم إرجاعها بواسطة الاستعلام. وهذا يُشبه إلى حد كبير عملية الإسقاط في الجبر العلائقي .ASيُتيح هذا الخيار إمكانية إنشاء اسم بديل لكل عمود أو تعبير في القائمة. هذه هي عملية إعادة تسميةSELECTالجبر العلائقي .FROMيحدد الجدول الذي سيتم الحصول على البيانات منه. [ أ ]WHEREيحدد هذا الأمر الصفوف المراد استرجاعها. وهذا يُشبه إلى حد كبير عملية الاختيار في الجبر العلائقي .GROUP BYتجميع الصفوف التي تشترك في خاصية معينة بحيث يمكن تطبيق دالة تجميعية على كل مجموعة.HAVINGيختار من بين المجموعات المحددة بواسطة عبارة GROUP BY.ORDER BYيحدد كيفية ترتيب الصفوف المُعادة.
ملخص
SELECTتُعدّ عملية الاستعلام (أو ما يُعرف بـ "الاستعلام") العملية الأكثر شيوعًا في لغة SQL، حيث SELECTتسترجع البيانات من جدول واحد أو أكثر ، أو من تعبيرات. SELECTلا تُحدث العبارات القياسية أي تأثيرات دائمة على قاعدة البيانات. بينما قد تُحدث بعض التطبيقات غير القياسية للاستعلام SELECTتأثيرات دائمة، مثل SELECT INTOالصيغة المُستخدمة في بعض قواعد البيانات. [ 3 ]
تسمح الاستعلامات للمستخدم بوصف البيانات المطلوبة، تاركةً نظام إدارة قواعد البيانات (DBMS) لتنفيذ التخطيط والتحسين وإجراء العمليات المادية اللازمة لإنتاج تلك النتيجة كما يختار.
يتضمن الاستعلام قائمة بالأعمدة المراد تضمينها في النتيجة النهائية، وعادةً ما تلي الكلمة المفتاحية مباشرةً . يمكن استخدام SELECTعلامة النجمة (" ") لتحديد أن الاستعلام يجب أن يُرجع جميع أعمدة جميع الجداول المستعلم عنها. يُعدّ الاستعلام الأكثر تعقيدًا في لغة SQL، مع كلمات مفتاحية اختيارية وعبارات تتضمن ما يلي:*SELECT
- يشير هذا
FROMالبند إلى الجداول التي سيتم استرجاع البيانات منها.FROMويمكن أن يتضمن هذا البند بنودًا فرعية اختياريةJOINلتحديد قواعد ربط الجداول. - يتضمن هذا
WHEREالشرط مُسند مقارنة، يُقيّد الصفوف التي تُرجعها الاستعلام.WHEREويحذف هذا الشرط جميع الصفوف من مجموعة النتائج التي لا يُقيّم فيها مُسند المقارنة إلى "صحيح". - تقوم هذه
GROUP BYالعبارة بتقسيم الصفوف ذات القيم المشتركة إلى مجموعة أصغر من الصفوف.GROUP BYتُستخدم غالبًا مع دوال التجميع في لغة SQL أو لحذف الصفوف المكررة من مجموعة النتائج.WHEREتُطبق هذه العبارة قبلGROUP BYعبارة أخرى. - يتضمن هذا
HAVINGالشرط دالة تُستخدم لتصفية الصفوف الناتجة عنهGROUP BY. ولأنها تعمل على نتائج الشرطGROUP BY، يمكن استخدام دوال التجميع فيHAVINGدالة الشرط. - تحدد هذه
ORDER BYالعبارة الأعمدة المستخدمة لفرز البيانات الناتجة، واتجاه الفرز (تصاعديًا أو تنازليًا). وبدونهاORDER BY، يكون ترتيب الصفوف المُعادة من استعلام SQL غير مُحدد. - الكلمة
DISTINCTالمفتاحية [ 4 ] تزيل البيانات المكررة. [ 5 ]
يُظهر المثال التالي استعلامًا SELECTيُعيد قائمة بالكتب باهظة الثمن. يسترجع الاستعلام جميع الصفوف من جدول الكتب التي تحتوي على قيمة في عمود السعر أكبر من 100.00. يتم ترتيب النتائج تصاعديًا حسب العنوان . تشير علامة النجمة (*) في قائمة التحديد إلى ضرورة تضمين جميع أعمدة جدول الكتب في مجموعة النتائج.
SELECT * FROM Book WHERE price > 100 . 00 ORDER BY title ;يوضح المثال أدناه استعلامًا عن جداول متعددة، وتجميعها، ودمجها، من خلال إرجاع قائمة بالكتب وعدد المؤلفين المرتبطين بكل كتاب.
حدد عنوان الكتاب ( Book.title ) وعدد المؤلفين ( Authors ) من جدول Book، وانضم إلى جدول Book_author بناءً على رقم ISBN الخاص بـ Book.isbn = Book_author.isbn ، ثم قم بتجميع النتائج حسب عنوان الكتاب ( Book.title ).قد يكون الناتج على النحو التالي:
العنوان المؤلفون ---------------------- ------- أمثلة ودليل SQL 4 متعة لغة SQL 1 مقدمة إلى لغة SQL 2 عيوب لغة SQL 1
بافتراض أن isbn هو اسم العمود المشترك الوحيد بين الجدولين وأن عمودًا باسم title موجود فقط في جدول Book ، يمكن إعادة كتابة الاستعلام أعلاه بالشكل التالي:
حدد العنوان ، وعدد المؤلفين ( * ) من جدول الكتب، مع ربط جدول مؤلفي الكتب ، وتجميع النتائج حسب العنوان .ومع ذلك، فإن العديد من البائعين إما لا يدعمون هذا النهج، أو يشترطون اتباع اصطلاحات معينة لتسمية الأعمدة لكي تعمل عمليات الربط الطبيعية بشكل فعال.
تتضمن لغة SQL عوامل تشغيل ودوال لحساب القيم المخزنة. تسمح SQL باستخدام التعبيرات في قائمة SELECT لعرض البيانات، كما في المثال التالي، الذي يُرجع قائمة بالكتب التي يزيد سعرها عن 100.00 مع عمود إضافي باسم sales_tax يحتوي على قيمة ضريبة المبيعات المحسوبة بنسبة 6% من السعر .
حدد رقم ISBN ، والعنوان ، والسعر ، والسعر * 0.06 كضريبة المبيعات من جدول الكتب حيث السعر > 100.00 ، ورتب النتائج حسب العنوان .الاستعلامات الفرعية
يمكن تداخل الاستعلامات بحيث تُستخدم نتائج استعلام ما في استعلام آخر عبر عامل علائقي أو دالة تجميع. يُعرف الاستعلام المتداخل أيضًا بالاستعلام الفرعي . في حين أن عمليات الربط وغيرها من عمليات الجداول توفر بدائل أسرع حسابيًا في كثير من الحالات (وذلك يعتمد على التنفيذ)، فإن استخدام الاستعلامات الفرعية يُنشئ تسلسلًا هرميًا في التنفيذ قد يكون مفيدًا أو ضروريًا. في المثال التالي، AVGتستقبل دالة التجميع نتيجة استعلام فرعي كمدخل:
حدد رقم ISBN ، والعنوان ، والسعر من جدول الكتب حيث يكون السعر أقل من ( حدد متوسط ( السعر ) من جدول الكتب ) ورتب النتائج حسب العنوان ؛يمكن للاستعلام الفرعي استخدام القيم من الاستعلام الخارجي، وفي هذه الحالة يُعرف باسم الاستعلام الفرعي المرتبط .
منذ عام 1999، يسمح معيار SQL باستخدام عبارات WITH، أي الاستعلامات الفرعية المسماة والتي تُعرف غالبًا بتعبيرات الجداول المشتركة (CTEs ) (سميت وصُممت على غرار تطبيق IBM DB2 الإصدار 2؛ وتُطلق عليها Oracle اسم تحليل الاستعلامات الفرعية ). يمكن أن تكون تعبيرات الجداول المشتركة (CTEs) تكرارية أيضًا من خلال الإشارة إلى نفسها؛ وتتيح الآلية الناتجة اجتياز الأشجار أو الرسوم البيانية (عند تمثيلها كعلاقات)، وبشكل عام حسابات النقطة الثابتة .
الجدول المشتق
الجدول المشتق هو استعلام فرعي ضمن عبارة FROM. بمعنى آخر، هو استعلام فرعي يمكن استخدامه للاستعلام أو الربط به. تتيح وظيفة الجدول المشتق للمستخدم الإشارة إلى الاستعلام الفرعي كجدول. يُشار إلى الجدول المشتق أيضًا باسم العرض المضمن أو عبارة SELECT IN FROM .
في المثال التالي، تتضمن عبارة SQL ربطًا بين جدول الكتب الأصلي وجدول المبيعات المشتق. يسجل هذا الجدول المشتق معلومات مبيعات الكتب المرتبطة باستخدام رقم ISBN للربط مع جدول الكتب. ونتيجة لذلك، يوفر الجدول المشتق مجموعة النتائج مع أعمدة إضافية (عدد الكتب المباعة والشركة التي باعت الكتب).
استعلم عن رقم ISBN الخاص بالكتاب ، وعنوانه ، وسعره ، وعدد الأصناف المباعة ، واسم الشركة من جدول الكتب ( Book ) واربطه بجدول المبيعات ( Book_Sales ) مع جدول الكتب (Book_Sales ) واجمع النتائج حسب اسم الشركة ورقم ISBN . ثم اربط النتائج بجدول المبيعات ( Sales ) بناءً على تطابق رقم ISBN الخاص بالكتاب ( Book ) .أمثلة
| الجدول "T" | استفسار | نتيجة | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| SELECT*FROMT; |
| ||||||||||||
| SELECTC1FROMT; |
| ||||||||||||
| SELECT*FROMTWHEREC1=1; |
| ||||||||||||
| SELECT*FROMTORDERBYC1DESC; |
| ||||||||||||
| غير موجود | SELECT1+1,3*2; |
|
بالنظر إلى الجدول T، ستؤدي الاستعلامات إلى عرض جميع عناصر جميع صفوف الجدول.SELECT*FROMT
باستخدام نفس الجدول، ستُظهر الاستعلامات عناصر العمود C1 من جميع صفوف الجدول. يُشبه هذا الإسقاط في الجبر العلائقي ، إلا أنه في الحالة العامة، قد تحتوي النتيجة على صفوف مُكررة. يُعرف هذا أيضًا باسم التقسيم الرأسي في بعض مصطلحات قواعد البيانات، حيث يُقيّد مخرجات الاستعلام لعرض حقول أو أعمدة مُحددة فقط.SELECTC1FROMT
باستخدام الجدول نفسه، ستُظهر الاستعلامات جميع عناصر جميع الصفوف التي تكون فيها قيمة العمود C1 هي '1' - أي، بلغة الجبر العلائقي ، سيتم إجراء عملية اختيار ، وذلك بفضل شرط WHERE. يُعرف هذا أيضًا بالتقسيم الأفقي، الذي يُقيّد الصفوف الناتجة عن الاستعلام وفقًا لشروط مُحددة.SELECT*FROMTWHEREC1=1
في حالة وجود أكثر من جدول، ستكون مجموعة النتائج هي كل تركيبة من الصفوف. فإذا كان لدينا جدولان T1 و T2، فستكون النتيجة هي كل تركيبة من صفوف T1 مع كل صفوف T2. على سبيل المثال، إذا كان T1 يحتوي على 3 صفوف و T2 يحتوي على 5 صفوف، فستكون النتيجة 15 صفًا.SELECT*FROMT1,T2
على الرغم من عدم وجود ذلك في المعايير القياسية، تسمح معظم أنظمة إدارة قواعد البيانات باستخدام عبارة SELECT بدون جدول، وذلك بافتراض وجود جدول وهمي يحتوي على صف واحد. ويُستخدم هذا بشكل أساسي لإجراء العمليات الحسابية التي لا تتطلب جدولاً.
تحدد عبارة SELECT قائمة بالخصائص (الأعمدة) بالاسم، أو حرف البدل ("*") ليعني "جميع الخصائص".
تحديد عدد صفوف النتائج
غالباً ما يكون من المفيد تحديد الحد الأقصى لعدد الصفوف التي يتم إرجاعها. يمكن استخدام ذلك لأغراض الاختبار أو لتجنب استهلاك موارد زائدة إذا أعاد الاستعلام معلومات أكثر من المتوقع. وتختلف طريقة القيام بذلك باختلاف مزودي الخدمة.
في معيار ISO SQL:2003 ، يمكن تقييد مجموعات النتائج باستخدام
- المؤشرات ، أو
- عن طريق إضافة دالة نافذة SQL إلى عبارة SELECT
أدخل معيار ISO SQL:2008FETCH FIRST هذا البند.
بحسب توثيق PostgreSQL الإصدار 9، فإن دالة النافذة في SQL "تُجري عملية حسابية على مجموعة من صفوف الجدول المرتبطة بطريقة ما بالصف الحالي"، على غرار دوال التجميع. [ 6 ] ويُذكّر الاسم بدوال النافذة في معالجة الإشارات . ويحتوي استدعاء دالة النافذة دائمًا على عبارة OVER .
دالة النافذة ROW_NUMBER()
ROW_NUMBER() OVERيمكن استخدامها لإنشاء جدول بسيط على الصفوف المُعادة، على سبيل المثال لإعادة ما لا يزيد عن عشرة صفوف:
SELECT * FROM ( SELECT ROW_NUMBER () OVER ( ORDER BY sort_key ASC ) AS row_number , columns FROM tablename ) AS foo WHERE row_number <= 10قد يكون رقم الصف غير محدد : إذا لم يكن مفتاح الفرز فريدًا، ففي كل مرة تُنفذ فيها الاستعلام، من الممكن الحصول على أرقام صفوف مختلفة لأي صفوف يكون فيها مفتاح الفرز هو نفسه. أما عندما يكون مفتاح الفرز فريدًا، فسيحصل كل صف دائمًا على رقم صف فريد.
دالة النافذة RANK()
تعمل دالة النافذة RANK() OVERمثل ROW_NUMBER ، ولكنها قد تُرجع عددًا أكبر أو أقل من n من الصفوف في حالة التعادل، على سبيل المثال لإرجاع أصغر 10 أشخاص:
استعلم عن جميع البيانات من ( استعلم عن الترتيب () على ( رتب حسب العمر تصاعديًا ) كـ الترتيب ، ومعرف الشخص ، واسم الشخص ، والعمر من الشخص ) كـ foo حيث يكون الترتيب أقل من أو يساوي 10يمكن أن يُرجع الكود أعلاه أكثر من عشرة صفوف، على سبيل المثال إذا كان هناك شخصان من نفس العمر، فقد يُرجع أحد عشر صفًا.
عبارة FETCH FIRST
منذ معيار ISO SQL:2008، يمكن تحديد حدود النتائج كما في المثال التالي باستخدام FETCH FIRSTالعبارة.
استعلم عن جميع البيانات من الجدول T ، واجلب أول 10 صفوف فقط.يتم دعم هذا البند حاليًا بواسطة CA DATACOM/DB 11 و IBM DB2 و SAP SQL Anywhere و PostgreSQL و EffiProz و H2 و HSQLDB الإصدار 2.0 و Oracle 12c و Mimer SQL .
يدعمFETCH FIRST Microsoft SQL Server 2008 والإصدارات الأحدث هذه الخاصية ، ولكنها تُعتبر جزءًا من ORDER BYالشرط. وتُعدّ الشروط ORDER BYو OFFSETو و FETCH FIRSTضروريةً لهذا الاستخدام.
استعلم عن جميع البيانات من الجدول T ، ورتبها تنازليًا حسب العمود acolumn ، مع إزاحة 0 صفوف، ثم استرجع أول 10 صفوف فقط.بناء جملة غير قياسي
تُتيح بعض أنظمة إدارة قواعد البيانات استخدام صيغ غير قياسية إما بدلاً من صيغة SQL القياسية أو بالإضافة إليها. فيما يلي، قائمة بصيغ استعلام الحد البسيط لأنظمة إدارة قواعد البيانات المختلفة:
SET ROWCOUNT 10 SELECT * FROM T | MS SQL Server (هذا يعمل أيضًا على Microsoft SQL Server 6.5 بينما لا يعمل الأمر Select top 10 * from T ) |
حدد * من الجدول T بحد أقصى 10 وإزاحة 20 | Netezza ، MySQL ، MariaDB (يدعم أيضًا الإصدار القياسي، منذ الإصدار 10.6)، SAP SQL Anywhere ، PostgreSQL (يدعم أيضًا الإصدار القياسي، منذ الإصدار 8.4)، SQLite ، HSQLDB ، H2 ، Vertica ، Polyhedra ، Couchbase Server ، Snowflake Computing ، OpenLink Virtuoso |
حدد * من الجدول T حيث يكون رقم الصف أقل من أو يساوي 10 | أوراكل |
SELECT FIRST 10 * from T | إنجريس |
SELECT FIRST 10 * FROM T order by a | إنفورميكس |
SELECT SKIP 20 FIRST 10 * FROM T order by c, d | في برنامج Informix (يتم تصفية أرقام الصفوف بعد تقييم عبارة الترتيب. تم إدخال عبارة SKIP في حزمة إصلاح الإصدار v10.00.xC4) |
SELECT TOP 10 * FROM T | MS SQL Server ، SAP ASE ، MS Access ، SAP IQ ، Teradata |
حدد * من T SAMPLE 10 | تيراداتا |
SELECT TOP 20, 10 * FROM T | OpenLink Virtuoso (يتخطى 20، ويسلم العشرة التالية) [ 7 ] |
SELECT TOP 10 START AT 20 * FROM T | SAP SQL Anywhere (يدعم المعيار أيضًا، منذ الإصدار 9.0.1) |
SELECT FIRST 10 SKIP 20 * FROM T | طائر النار |
حدد * من الجدول T الصفوف من 20 إلى 30 | فايربيرد (منذ الإصدار 2.1) |
استعلم عن جميع البيانات من الجدول T حيث يكون ID_T أكبر من 10 ، ثم استرجع أول 10 صفوف فقط. | IBM Db2 |
استعلم عن جميع البيانات من الجدول T حيث يكون ID_T أكبر من 20، ثم استرجع أول 10 صفوف فقط. | IBM Db2 (يتم تصفية الصفوف الجديدة بعد مقارنتها بعمود المفتاح في الجدول T) |
ترقيم الصفوف
تُعدّ ترقيم الصفوف [ 8 ] أسلوبًا يُستخدم لتقييد وعرض جزء فقط من البيانات الإجمالية لاستعلام في قاعدة البيانات. فبدلًا من عرض مئات أو آلاف الصفوف دفعة واحدة، يُطلب من الخادم صفحة واحدة فقط (مجموعة محدودة من الصفوف، على سبيل المثال 10 صفوف فقط)، ويبدأ المستخدم بالتنقل عن طريق طلب الصفحة التالية، ثم التي تليها، وهكذا. يُعدّ هذا الأسلوب مفيدًا للغاية، خاصةً في أنظمة الويب، حيث لا يوجد اتصال مباشر بين العميل والخادم، فلا يضطر العميل إلى الانتظار لقراءة وعرض جميع صفوف الخادم.
البيانات في نهج الترقيم
{rows}= عدد الصفوف في الصفحة{page_number}= رقم الصفحة الحالية{begin_base_0}= رقم الصف - 1 حيث تبدأ الصفحة = (رقم_الصفحة-1) * عدد_الصفوف
أبسط طريقة (لكنها غير فعالة للغاية)
- حدد جميع الصفوف من قاعدة البيانات
- اقرأ جميع الصفوف، ولكن أرسلها للعرض فقط عندما يكون رقم الصف المقروء
{begin_base_0 + 1}بين{begin_base_0 + rows}
حدد * من { الجدول } ورتب حسب { المفتاح_الفريد }طريقة أخرى بسيطة (أكثر كفاءة بقليل من قراءة جميع الصفوف)
- حدد جميع الصفوف من بداية الجدول إلى الصف الأخير لعرضها (
{begin_base_0 + rows}) - اقرأ
{begin_base_0 + rows}الصفوف، ولكن أرسلها للعرض فقط عندما يكون رقم الصف المقروء أكبر من{begin_base_0}
| SQL | لهجة |
|---|---|
حدد * من { الجدول } ورتب حسب { المفتاح_الفريد }، ثم استرجع أول { بداية_الأساس_0 + صفوف } صفوف فقط | SQL ANSI 2008 PostgreSQL SQL Server 2012 Derby Oracle 12c DB2 12 MIMER SQL |
حدد * من { الجدول } ورتب حسب { المفتاح_الفريد } وحدد عدد الصفوف بـ { بداية_الأساس_0 + عدد الصفوف } | MySQL SQLite |
حدد أعلى { بداية_الأساس_0 + صفوف } * من { الجدول } مرتبة حسب { المفتاح_الفريد } | SQL Server 2005 |
حدد * من { الجدول } ورتب حسب { المفتاح_الفريد }، مع تحديد عدد الصفوف بـ { بداية_الأساس_0 + صفوف } | Sybase، ASE 16 SP2 |
SET ROWCOUNT { begin_base_0 + rows } Select * from { table } order by { unique_key } SET ROWCOUNT 0 | Sybase، SQL Server 2000 |
حدد * من ( حدد * من { الجدول } ورتب حسب { المفتاح_الفريد } ) حيث رقم_الصف < = { بداية_الأساس_0 + صفوف } | أوراكل 11 |
طريقة تحديد المواقع
- حدد
{rows}الصفوف التي تبدأ من الصف التالي لعرضها ({begin_base_0 + 1}) - اقرأ وأرسل لعرض جميع الصفوف المقروءة من قاعدة البيانات
| SQL | لهجة |
|---|---|
حدد * من { الجدول } ورتب حسب { المفتاح_الفريد } ، ثم قم بإزاحة { بداية_الأساس_0 } صفوف، ثم استرجع الصفوف التالية { صفوف } صفوف فقط | SQL ANSI 2008 PostgreSQL SQL Server 2012 Derby Oracle 12c DB2 12 MIMER SQL |
حدد * من { الجدول } ورتب حسب { المفتاح_الفريد } وحدد عدد الصفوف بـ { الصفوف } وأرجع { بداية_الأساس_0 } | MySQL، MariaDB، PostgreSQL، SQLite |
حدد * من { الجدول } ورتب حسب { المفتاح_الفريد } وحدد { بداية_الأساس_0 } ، { الصفوف } | MySQL و MariaDB و SQLite |
حدد * من { الجدول } ورتب حسب { المفتاح_الفريد }، مع تحديد عدد الصفوف بـ { صفوف } ، وإزاحة { بداية_الأساس_0 } | Sybase، ASE 16 SP2 |
حدد أعلى { begin_base_0 + صفوف } * ، _offset = identity ( 10 ) في #temp من { table } ORDER BY { unique_key } حدد * من #temp حيث _offset > { begin_base_0 } احذف الجدول #temp | Sybase 12.5.3: |
SET ROWCOUNT { begin_base_0 + rows } select * , _offset = identity ( 10 ) into #temp from { table } ORDER BY { unique_key } select * from #temp where _offset > { begin_base_0 } DROP TABLE #temp SET ROWCOUNT 0 | Sybase 12.5.2: |
حدد أعلى { صفوف } * من ( حدد * ، رقم_الصف () فوق ( رتب حسب { المفتاح_الفريد } ) كـ _offset من { الجدول } ) xx حيث _offset > { بداية_الأساس_0 } | SQL Server 2005 |
SET ROWCOUNT { begin_base_0 + rows } select * , _offset = identity ( int , 1 , 1 ) into #temp from { table } ORDER BY { unique - key } select * from #temp where _offset > { begin_base_0 } DROP TABLE #temp SET ROWCOUNT 0 | SQL Server 2000 |
SELECT * FROM ( SELECT rownum - 1 as _offset , a . * FROM ( SELECT * FROM { table } ORDER BY { unique_key } ) a WHERE rownum <= { begin_base_0 + cant_regs } ) WHERE _offset >= { begin_base_0 } | أوراكل 11 |
طريقة باستخدام المرشح (وهي أكثر تعقيدًا ولكنها ضرورية لمجموعات البيانات الكبيرة جدًا)
- حدد فقط
{rows}الصفوف التي تحتوي على عامل التصفية:- الصفحة الأولى: حدد الصفوف الأولى فقط
{rows}، وذلك حسب نوع قاعدة البيانات - الصفحة التالية: حدد الصفوف الأولى فقط
{rows}، حسب نوع قاعدة البيانات، حيث{unique_key}تكون قيمة أكبر من{last_val}(قيمة{unique_key}في الصف الأخير في الصفحة الحالية). - الصفحة السابقة: رتب البيانات بترتيب عكسي، وحدد
{rows}الصفوف الأولى فقط، حيث{unique_key}تكون قيمة أقل من{first_val}(قيمة{unique_key}في الصف الأول من الصفحة الحالية)، ثم رتب النتيجة بالترتيب الصحيح.
- الصفحة الأولى: حدد الصفوف الأولى فقط
- اقرأ وأرسل لعرض جميع الصفوف المقروءة من قاعدة البيانات
| الصفحة الأولى | الصفحة التالية | الصفحة السابقة | لهجة |
|---|---|---|---|
حدد * من { الجدول } ورتب حسب { المفتاح_الفريد }، ثم استرجع أول { صفوف } صفوف فقط | حدد * من { الجدول } حيث { المفتاح_الفريد } > { القيمة_الأخيرة } ، ورتب النتائج حسب { المفتاح_الفريد }، واسترجع أول { صفوف } صفوف فقط. | حدد * من ( حدد * من { الجدول } حيث { المفتاح_الفريد } < { القيمة_الأولى } رتب حسب { المفتاح_الفريد } تنازليًا ، جلب أول { صفوف } صفوف فقط ) رتب حسب { المفتاح_الفريد } | SQL ANSI 2008 PostgreSQL SQL Server 2012 Derby Oracle 12c DB2 12 MIMER SQL |
حدد * من { الجدول } ورتب حسب { المفتاح_الفريد } وحدد عدد الصفوف بـ { الصفوف } | حدد * من { الجدول } حيث { المفتاح_الفريد } > { القيمة_الأخيرة } ، ورتب النتائج حسب { المفتاح_الفريد }، وحدد عدد الصفوف بـ { الصفوف }. | حدد * من ( حدد * من { الجدول } حيث { المفتاح_الفريد } < { القيمة_الأولى } رتب حسب { المفتاح_الفريد } تنازليًا حدّد { الصفوف } ) رتب حسب { المفتاح_الفريد } | MySQL SQLite |
حدد أعلى { صفوف } * من { جدول } ورتبها حسب { مفتاح_فريد } | حدد أعلى { صفوف } * من { جدول } حيث { مفتاح_فريد } > { قيمة_نهائية } مرتبة حسب { مفتاح_فريد } | حدد * من ( حدد أعلى { صفوف } * من { جدول } حيث { مفتاح_فريد } < { قيمة_أولى } مرتبة حسب { مفتاح_فريد } تنازليًا ) مرتبة حسب { مفتاح_فريد } | SQL Server 2005 |
SET ROWCOUNT { rows } select * from { table } order by { unique_key } SET ROWCOUNT 0 | SET ROWCOUNT { rows } select * from { table } where { unique_key } > { last_val } order by { unique_key } SET ROWCOUNT 0 | SET ROWCOUNT { rows } select * from ( select * from { table } where { unique_key } < { first_val } order by { unique_key } DESC ) a order by { unique_key } SET ROWCOUNT 0 | Sybase، SQL Server 2000 |
حدد * من ( حدد * من { الجدول } ورتب حسب { المفتاح_الفريد } ) أ حيث رقم_الصف <= { الصفوف } | حدد * من ( حدد * من { الجدول } حيث { المفتاح_الفريد } > { القيمة_الأخيرة } مرتبة حسب { المفتاح_الفريد } ) أ حيث رقم_الصف <= { الصفوف } | حدد * من ( حدد * من ( حدد * من { الجدول } حيث { المفتاح_الفريد } < { القيمة_الأولى } مرتبة حسب { المفتاح_الفريد } تنازليًا ) a1 حيث رقم_الصف <= { الصفوف } ) a2 مرتبة حسب { المفتاح_الفريد } | أوراكل 11 |
الاستعلام الهرمي
توفر بعض قواعد البيانات صيغة متخصصة للبيانات الهرمية .
دالة النافذة في SQL:2003 هي دالة تجميعية يتم تطبيقها على قسم من مجموعة النتائج.
على سبيل المثال،
مجموع ( عدد السكان ) على ( تقسيم حسب المدينة )يحسب مجموع عدد السكان في جميع الصفوف التي لها نفس قيمة المدينة مثل الصف الحالي.
يتم تحديد الأقسام باستخدام عبارة OVER التي تُعدّل التجميع. الصيغة:
< OVER_CLAUSE > :: = OVER ( [ PARTITION BY < expr > , ... ] [ ORDER BY < expression > ] ) يمكن لعبارة OVER تقسيم مجموعة النتائج وترتيبها. يُستخدم الترتيب مع الدوال التي تعتمد على الترتيب، مثل دالة row_number.
تقييم الاستعلام ANSI
ستكون معالجة عبارة SELECT وفقًا لمعيار ANSI SQL كما يلي: [ 9 ]
حدد جميع البيانات من جدول المستخدمين (users ) وجدول المجموعات (groups) باستخدام معرّف المستخدم ( Userid ) في جدول المستخدمين (users ) وجدول المجموعات (groups) حيث يكون اسم العائلة (LastName ) هو "Smith" والاسم الأول (FirstName ) هو "John" .
- عند تقييم عبارة FROM، يتم إنشاء عملية ربط متقاطع أو ضرب ديكارتي لأول جدولين في عبارة FROM، مما ينتج عنه جدول افتراضي باسم Vtable1.
- يتم تقييم عبارة ON للجدول vtable1؛ ويتم إدراج السجلات التي تحقق شرط الربط g.Userid = u.Userid فقط في الجدول Vtable2
- إذا تم تحديد ربط خارجي، فسيتم إضافة السجلات التي تم حذفها من الجدول vTable2 إلى الجدول vTable3، على سبيل المثال إذا كان الاستعلام أعلاه كالتالي: سيتم إضافة جميع المستخدمين الذين لا ينتمون إلى أي مجموعات مرة أخرى إلى Vtable3
حدد جميع البيانات من جدول المستخدمين u ، ثم قم بربطها يسارًا بجدول المجموعات g باستخدام معرف المستخدم في g = معرف المستخدم في u، حيث يكون اسم العائلة في u هو ' Smith' والاسم الأول في u هو 'John' .
- يتم تقييم عبارة WHERE، وفي هذه الحالة ستتم إضافة معلومات المجموعة الخاصة بالمستخدم جون سميث فقط إلى vTable4
- يتم تقييم عبارة GROUP BY؛ إذا كان الاستعلام أعلاه كالتالي: سيتكون الجدول vTable5 من الأعضاء الذين تم إرجاعهم من الجدول vTable4 مرتبة حسب التجميع، وفي هذه الحالة اسم المجموعة
حدد اسم المجموعة ( g.GroupName ) وعدد أعضائها ( count ( g . * ) as NumberOfMembers ) من جدول المستخدمين (users ) مع ربطه بجدول المجموعات (groups) بناءً على تطابق معرف المستخدم (Userid ) بين المجموعتين ( g.Userid ) وجدول المجموعات (groups). ثم قم بتجميع النتائج حسب اسم المجموعة (GroupName) .
- يتم تقييم شرط HAVING للمجموعات التي يكون شرط HAVING صحيحًا بالنسبة لها، ويتم إدراجها في الجدول vTable6. على سبيل المثال:
حدد اسم المجموعة ( g.GroupName) وعدد أعضاء المجموعة ( g . * ) كـ NumberOfMembers من جدول المستخدمين ( users) مع ربطه بجدول المجموعات ( groups ) بناءً على تطابق معرف المستخدم ( Userid ) في جدول المستخدمين (groups). قم بتجميع النتائج حسب اسم المجموعة ( GroupName) بشرط أن يكون عدد أعضاء المجموعة ( g . * ) أكبر من 5 .
- يتم تقييم قائمة SELECT وإعادتها كجدول افتراضي 7
- يتم تقييم عبارة DISTINCT؛ وتُزال الصفوف المكررة وتُعاد كجدول افتراضي رقم 8
- يتم تقييم عبارة ORDER BY، مما يؤدي إلى ترتيب الصفوف وإرجاع VCursor9. هذا مؤشر وليس جدولًا لأن ANSI تُعرّف المؤشر على أنه مجموعة مرتبة من الصفوف (ليس علائقيًا).
دعم وظائف النوافذ من قبل موردي أنظمة إدارة قواعد البيانات العلائقية
تختلف تطبيقات ميزات دوال النوافذ اختلافًا كبيرًا بين موردي قواعد البيانات العلائقية ومحركات SQL. تدعم معظم قواعد البيانات نوعًا ما من دوال النوافذ، ولكن عند التدقيق، يتضح أن معظم الموردين لا يطبقون سوى جزء من المعيار. لنأخذ عبارة RANGE القوية كمثال، حيث لا تُطبق هذه الميزة بالكامل إلا في Oracle وDB2 وSpark/Hive وGoogle BigQuery. ومؤخرًا، أضاف الموردون امتدادات جديدة للمعيار، مثل دوال تجميع المصفوفات. تُعد هذه الدوال مفيدة بشكل خاص عند تشغيل SQL على نظام ملفات موزع (Hadoop، Spark، Google BigQuery)، حيث تكون ضمانات تجاور البيانات أضعف مقارنةً بقاعدة بيانات علائقية موزعة (MPP). فبدلًا من توزيع البيانات بالتساوي على جميع العُقد، تستطيع محركات SQL التي تُشغل الاستعلامات على نظام ملفات موزع تحقيق ضمانات تجاور البيانات من خلال تداخل البيانات، وبالتالي تجنب عمليات الربط المكلفة التي قد تتضمن نقلًا مكثفًا عبر الشبكة. تُعد دوال التجميع المُعرّفة من قِبل المستخدم، والتي يمكن استخدامها في دوال النوافذ، ميزة أخرى بالغة الأهمية.
توليد البيانات في لغة T-SQL
طريقة لتوليد البيانات بناءً على اتحاد الكل
اختر 1 أ ، 1 ب، ثم ادمج الكل. اختر 1 ، 2، ثم ادمج الكل. اختر 1 ، 3، ثم ادمج الكل. اختر 2 ، 1، ثم ادمج الكل. اختر 5 ، 1.يدعم SQL Server 2008 ميزة "منشئ الصفوف"، المحددة في معيار SQL:1999
اختر * من ( القيم ( 1 ، 1 )، ( 1 ، 2 )، ( 1 ، 3 )، ( 2 ، 1 )، ( 5 ، 1 )) كـ x ( أ ، ب )ملحوظات
- ↑ إن حذف عبارة FROM ليس معيارًا، ولكنه مسموح به من قبل معظم أنظمة إدارة قواعد البيانات الرئيسية.
مراجع
- ↑ مايكروسوفت (23 مايو 2023). "اتفاقيات بناء جملة Transact-SQL" .
- ↑ MySQL. "SQL SELECT Syntax" .
- ↑ "مرجع Transact-SQL". مرجع لغة SQL Server . كتب SQL Server 2005 على الإنترنت. مايكروسوفت. 15-09-2007 . تم الاطلاع عليه بتاريخ 17-06-2007 .
- ↑ دليل مستخدم إجراءات SQL في SAS 9.4 . معهد SAS (نُشر عام 2013). 10 يوليو 2013. ص 248. ISBN 9781612905686تم الاطلاع عليه بتاريخ 21-10-2015 .
على الرغم من أن حجة UNIQUE مطابقة لحجة DISTINCT، إلا أنها ليست معيارًا من معايير ANSI.
- ↑ ليون، ألكسيس ؛ ليون، ماثيوز (1999). "إزالة التكرارات - SELECT باستخدام DISTINCT". SQL: مرجع شامل . نيودلهي: تاتا ماكجرو هيل للتعليم (نُشر عام 2008). ص 143. ISBN 9780074637081تم الاطلاع عليه بتاريخ 21-10-2015 .
[...] الكلمة المفتاحية DISTINCT [...] تزيل التكرارات من مجموعة النتائج.
- ↑ وثائق PostgreSQL 9.1.24 - الفصل 3. الميزات المتقدمة
- ↑ برنامج OpenLink. "9.19.10. خيار التحديد العلوي" . docs.openlinksw.com . تم الاطلاع عليه في 1 أكتوبر 2019 .
- ↑ المهندس أوسكار بونيلا، ماجستير إدارة الأعمال
- ↑ نظرة داخلية على Microsoft SQL Server 2005: استعلامات T-SQL بقلم إيتزيك بن غان، ولوبور كولار، وديجان ساركا
مصادر
- التقسيم الأفقي والرأسي، كتب مايكروسوفت SQL Server 2000 على الإنترنت.
روابط خارجية
- كلمات SQL الرئيسية
