المحتوى عن 'سلسلة sql للمحترفين'.



مزيد من الخيارات

  • ابحث بالكلمات المفتاحية

    أضف وسومًا وافصل بينها بفواصل ","
  • ابحث باسم الكاتب

نوع المُحتوى


التصنيفات

  • التخطيط وسير العمل
  • التمويل
  • فريق العمل
  • دراسة حالات
  • نصائح وإرشادات
  • التعامل مع العملاء
  • التعهيد الخارجي
  • التجارة الإلكترونية
  • الإدارة والقيادة
  • السلوك التنظيمي
  • مقالات ريادة أعمال عامة

التصنيفات

  • PHP
    • Laravel
    • ووردبريس
  • جافاسكريبت
    • Node.js
    • jQuery
    • AngularJS
    • Cordova
    • React
  • HTML
    • HTML5
  • CSS
  • SQL
  • لغة C#‎
  • لغة C++‎
  • بايثون
    • Flask
    • Django
  • لغة روبي
    • Sass
    • إطار عمل Bootstrap
    • إطار العمل Ruby on Rails
  • لغة Go
  • لغة جافا
  • لغة Kotlin
  • برمجة أندرويد
  • لغة Swift
  • لغة R
  • لغة TypeScript
  • ASP.NET
    • ASP.NET Core
  • سير العمل
    • Git
  • صناعة الألعاب
    • Unity3D
    • منصة Xamarin
  • سهولة الوصول
  • مقالات برمجة عامة

التصنيفات

  • تجربة المستخدم
  • الرسوميات
    • إنكسكيب
    • أدوبي إليستريتور
    • كوريل درو
  • التصميم الجرافيكي
    • أدوبي فوتوشوب
    • أدوبي إن ديزاين
    • جيمب
  • التصميم ثلاثي الأبعاد
    • 3Ds Max
    • Blender
  • نصائح وإرشادات
  • مقالات تصميم عامة

التصنيفات

  • خواديم
    • الويب HTTP
    • قواعد البيانات
    • البريد الإلكتروني
    • DNS
    • Samba
  • الحوسبة السّحابية
    • Docker
  • إدارة الإعدادات والنّشر
    • Chef
    • Puppet
    • Ansible
  • لينكس
  • FreeBSD
  • حماية
    • الجدران النارية
    • VPN
    • SSH
  • مقالات DevOps عامة

التصنيفات

  • التسويق بالأداء
    • أدوات تحليل الزوار
  • تهيئة محركات البحث SEO
  • الشبكات الاجتماعية
  • التسويق بالبريد الالكتروني
  • التسويق الضمني
  • التسويق بالرسائل النصية القصيرة
  • استسراع النمو
  • المبيعات
  • تجارب ونصائح

التصنيفات

  • إدارة مالية
  • الإنتاجية
  • تجارب
  • مشاريع جانبية
  • التعامل مع العملاء
  • الحفاظ على الصحة
  • التسويق الذاتي
  • مقالات عمل حر عامة

التصنيفات

  • الإنتاجية وسير العمل
    • مايكروسوفت أوفيس
    • ليبر أوفيس
    • جوجل درايف
    • شيربوينت
    • Evernote
    • Trello
  • تطبيقات الويب
    • ووردبريس
    • ماجنتو
  • أندرويد
  • iOS
  • macOS
  • ويندوز

التصنيفات

  • شهادات سيسكو
    • CCNA
  • شهادات مايكروسوفت
  • شهادات Amazon Web Services
  • شهادات ريدهات
    • RHCSA
  • شهادات CompTIA
  • مقالات عامة

أسئلة وأجوبة

  • الأقسام
    • أسئلة ريادة الأعمال
    • أسئلة العمل الحر
    • أسئلة التسويق والمبيعات
    • أسئلة البرمجة
    • أسئلة التصميم
    • أسئلة DevOps
    • أسئلة البرامج والتطبيقات
    • أسئلة الشهادات المتخصصة

التصنيفات

  • ريادة الأعمال
  • العمل الحر
  • التسويق والمبيعات
  • البرمجة
  • التصميم
  • DevOps

تمّ العثور على 4 نتائج

  1. تستعرض هذه المقالة العبارة CASE، والتي تُستخدم لكتابة الشيفرات الشرطية (if-then). استخدام CASE لحساب عدد الصفوف في العمود الذي يلبي شرطا معينًا يمكن استخدام ‎CASE‎ مع SUM لحساب عدد العناصر المطابقة لشرط محدد (تشبه العبارة ‎COUNTIF‎ في Excel.) الحيلة التي سنعتمدها هي أنّنا سنعيد نتائج ثنائية (binary) للدلالة على مطابقة الشرط، حيث يشير 1 إلى أنّ المدخل يطابق الشرط، فيما يشير 0 إلى عدم المطابقة، بعد ذلك سنجمع الوحدات التي حصلنا عليها للحصول على عدد المطابقات. في الجدول ‎ItemSales‎ التالي، سنحاول عدّ العناصر الثمينة (EXPENSIVE): table { width: 100%; } thead { vertical-align: middle; text-align: center; } td, th { border: 1px solid #dddddd; text-align: right; padding: 8px; text-align: inherit; } tr:nth-child(even) { background-color: #dddddd; } Id ItemId Price PriceRating 1 100 34.5 EXPENSIVE 2 145 2.3 CHEAP 3 100 34.5 EXPENSIVE 4 100 34.5 EXPENSIVE 5 145 10 AFFORDABLE سنستخدم الاستعلام التالي: SELECT COUNT(Id) AS ItemsCount, SUM ( CASE WHEN PriceRating = 'Expensive' THEN 1 ELSE 0 END ) AS ExpensiveItemsCount FROM ItemSales سنحصل على الخرج التالي: ItemsCount ExpensiveItemsCount 5 3 هذا استعلام آخر بديل: SELECT COUNT(Id) as ItemsCount, SUM ( CASE PriceRating WHEN 'Expensive' THEN 1 ELSE 0 END ) AS ExpensiveItemsCount FROM ItemSales البحث الشرطي يمكن استخدام CASE مع العبارة SELECT لتصفية النتائج حسب شرط معيّن، بحيث لا تُعاد إلا النتائج التي تعيد القيمة المنطقية TRUE (هذا يختلف عن استخدام case العادي، والذي يتحقق من التكافؤ مع المُدخل وحسب). SELECT Id, ItemId, Price, CASE WHEN Price < 10 THEN 'CHEAP' WHEN Price < 20 THEN 'AFFORDABLE' ELSE 'EXPENSIVE' END AS PriceRating FROM ItemSales سنحصل على الخرج التالي: Id ItemId Price PriceRating 1 100 34.5 EXPENSIVE 2 145 2.3 CHEAP 3 100 34.5 EXPENSIVE 4 100 34.5 EXPENSIVE 5 145 10 AFFORDABLE الشكل المُختزل لـ CASE يقيّم الشكل المختزل لـ ‎CASE‎ تعبيرًا ما (عادةً ما يكون عمودًا)، ويقارنه بعدة قيم. هذا الشكل أقصر قليلاً من الشكل العادي، ويُعفيك من تكرار التعبير المقيَّم. يمكن استخدام صياغة ‎ELSE‎ في الشكل على النحو التالي: SELECT Id, ItemId, Price, CASE Price WHEN 5 THEN 'CHEAP' WHEN 15 THEN 'AFFORDABLE' ELSE 'EXPENSIVE' END as PriceRating FROM ItemSales من المهم أن تدرك أنه عند استخدام الشكل المختصر، فسيُقيَّم التعبير بالكامل في كل عبارة ‎WHEN‎. لذلك، فإنّ الشيفرة التالية: SELECT CASE ABS(CHECKSUM(NEWID())) % 4 WHEN 0 THEN 'Dr' WHEN 1 THEN 'Master' WHEN 2 THEN 'Mr' WHEN 3 THEN 'Mrs' END قد تعيد القيمة المعدومة ‎NULL‎. لأنّه في كل عبارة ‎WHEN‎، تُستدعى ‎NEWID()‎ مع نتيجة جديدة. هذا يكافئ: SELECT CASE WHEN ABS(CHECKSUM(NEWID())) % 4 = 0 THEN 'Dr' WHEN ABS(CHECKSUM(NEWID())) % 4 = 1 THEN 'Master' WHEN ABS(CHECKSUM(NEWID())) % 4 = 2 THEN 'Mr' WHEN ABS(CHECKSUM(NEWID())) % 4 = 3 THEN 'Mrs' END لذلك يمكن أن تُفوِّت جميع عبارات ‎WHEN‎، لتُنتج القيمة ‎NULL‎. استخدام CASE في عبارة ORDER BY في الشيفرة، أدناه سنستخدم الأرقام 1،2،3 .. لتصنيف الطلب إلى أنواع: SELECT * FROM DEPT ORDER BY CASE DEPARTMENT WHEN 'MARKETING' THEN 1 WHEN 'SALES' THEN 2 WHEN 'RESEARCH' THEN 3 WHEN 'INNOVATION' THEN 4 ELSE 5 END, CITY الخرج الناتج: ID REGION CITY DEPARTMENT EMPLOYEES_NUMBER 12 New England Boston MARKETING 9 15 West San Francisco MARKETING 12 9 Midwest Chicago SALES 8 14 Mid-Atlantic New York SALES 12 5 West Los Angeles RESEARCH 11 10 Mid-Atlantic Philadelphia RESEARCH 13 4 Midwest Chicago INNOVATION 11 2 Midwest Detroit HUMAN RESOURCES 9 استخدام CASE في UPDATE يزيد المثال التالي الأسعار في قاعدة البيانات: UPDATE ItemPrice SET Price = Price * CASE ItemId WHEN 1 THEN 1.05 WHEN 2 THEN 1.10 WHEN 3 THEN 1.15 ELSE 1.00 END استخدام CASE مع القيم المعدومة NULL في هذا المثال، يمثل الرقم "0" االقيم المعروفة، والتي توضوع في البداية، فيما يمثل "1" القيم NULL، و هي موضوعة في آخر الترتيب: SELECT ID ,REGION ,CITY ,DEPARTMENT ,EMPLOYEES_NUMBER FROM DEPT ORDER BY CASE WHEN REGION IS NULL THEN 1 ELSE 0 END, REGION سنحصل على الخرج التالي: ID REGION CITY DEPARTMENT EMPLOYEES_NUMBER 10 Mid-Atlantic Philadelphia RESEARCH 13 14 Mid-Atlantic New York SALES 12 9 Midwest Chicago SALES 8 12 New England Boston MARKETING 9 5 West Los Angeles RESEARCH 11 15 NULL San Francisco MARKETING 12 4 NULL Chicago INNOVATION 11 2 NULL Detroit HUMAN RESOURCES 9 استخدام CASE في عبارة ORDER BY لترتيب السجلات حسب القيمة الدنيا لعمودين لنفترض أنك بحاجة إلى ترتيب السجلات حسب القيمة الدنيا في عمودين. قد تستخدم بعض قواعد البيانات الدالتين غير التجميعيتين ‎MIN()‎ أو ‎LEAST()‎ (مثلا: ‎... ORDER BY MIN(Date1, Date2)‎)، ولكن في SQL القياسية، يجب استخدام التعبير ‎CASE‎. يبحث التعبير ‎CASE‎ في الاستعلام أدناه في العمودين ‎Date1‎ و ‎Date2‎ ، ويبحث عن العمود الذي له أدنى قيمة، ثم يرتب السجلات وفقًا لتلك القيمة. إليك الجدول التالي: Id Date1 Date2 1 2017-01-01 2017-01-31 2 2017-01-31 2017-01-03 3 2017-01-31 2017-01-02 4 2017-01-06 2017-01-31 5 2017-01-31 2017-01-05 6 2017-01-04 2017-01-31 إليك الاستعلام التالي: SELECT Id, Date1, Date2 FROM YourTable ORDER BY CASE WHEN COALESCE(Date1, '1753-01-01') < COALESCE(Date2, '1753-01-01') THEN Date1 ELSE Date2 END الخرج النتائج: Id Date1 Date2 1 2017-01-01 2017-01-31 3 2017-01-31 2017-01-02 2 2017-01-31 2017-01-03 6 2017-01-04 2017-01-31 5 2017-01-31 2017-01-05 4 2017-01-06 2017-01-31 كما ترى ، الصف ذو المعّرف ‎Id = 1‎ جاء أولًا، وذلك لأنّ العمود ‎Date1‎ يحتوي أدنى سجل في الجدول، وهو ‎2017-01-01‎، الصف ذو المعرّف ‎Id‎ = ‎3‎ جاء ثانيًا، لأنّ العمود ‎Date2‎ يحتوي القيمة‎2017-01-02‎‎، وهي ثاني أقل قيمة في الجدول، وهكذا دواليك. لقد رتّبنا السجلات من ‎2017-01-01‎ إلى ‎2017-01-06‎ تصاعديًا، بغض النظر عن العمود ‎Date1‎ أو ‎Date2‎ الذي جاءت منه تلك القيم. ترجمة -وبتصرّف- للفصول 7 و 8 و 9 من الكتاب SQL Notes for Professionals
  2. سلسلة sql للمحترفين

    سنتحدث في هذه المقالة عن كيفية استخدام العبارتين GROUP BY و ORDER BY لأجل تجميع نتائج الاستعلامات في SQL وترتيبها. التجميع عبر GROUP BY يمكن تجميع نتائج استعلام SELECT حسب عمود واحد أو أكثر باستخدام عبارة ‎GROUP BY‎ والتي تُجمّع كل النتائج التي لها نفس القيمة في الأعمدة المُجمَّعة (grouped columns). وينتج عنها جدول من النتائج الجزئية، بدلًا من إرجاع نتيجة واحدة. يمكن استخدام GROUP BY مع دوال التجميع (aggregation functions) لتحديد كيفية تجميع الأعمدة باستخدام العبارة ‎HAVING‎. مثال على استخدام GROUP BY تشبه GROUP BY عبارة for each المُستخدمة في الكثير من لغات البرمجة. إليك الاستعلام التالي: SELECT EmpID, SUM (MonthlySalary) FROM Employee GROUP BY EmpID في الشيفرة أعلاه، نريد الحصول على مجموع الحقل MonthlySalary لكل قيم EmpID، مثلًا، في الجدول التالي: +-----+----------------------+ |EmpID|MonthlySalary| +-----+----------------------+ |1 |200 | +-----+----------------------+ |2 |300 | +-----+----------------------+ سنحصل على النتيجة التالية: +-+---+ |1|200| +-+---+ |2|300| +-+---+ لا يبدو أنّ Sum تفعل أيّ شيء، وذلك لأنّ مجموع عدد ما يساوي العدد نفسه. إليك الآن الجدول التالي: +-----+---------------------+ |EmpID|MonthlySalary| +-----+---------------------+ |1 |200 | +-----+---------------------+ |1 |300 | +-----+---------------------+ |2 |300 | +-----+---------------------+ سنحصل بتطبيق الاستعلام نفسه على النتيجة التالية: +-+---+ |1|500| +-+---+ |2|300| +-+---+ ترشيح نتائج GROUP BY باستخدام عبارة HAVING ترشِّح عبارة HAVING نتائج GROUP BY. سنستخدم في الأمثلة التالية قاعدة البيانات Library المُعرّفة في الفصل الأول. أمثلة إعادة جميع المؤلفين الذين كتبوا أكثر من كتاب (مثال حي). SELECT a.Id, a.Name, COUNT(*) BooksWritten FROM BooksAuthors ba INNER JOIN Authors a ON a.id = ba.authorid GROUP BY a.Id, a.Name HAVING COUNT(*) > 1 -- HAVING BooksWritten > 1 يكافئ ; إعادة جميع الكتب التي أُلِّفت من قبل ثلاثة مؤلفين أو أكثر (مثال حي). SELECT b.Id, b.Title, COUNT(*) NumberOfAuthors FROM BooksAuthors ba INNER JOIN Books b ON b.id = ba.bookid GROUP BY b.Id, b.Title HAVING COUNT(*) > 3 -- HAVING NumberOfAuthors > 3 يكافئ ; استخدام GROUP BY لحساب عدد الصفوف لكل مدخل فريد في عمود معيّن لنفترض أننا نريد عدّ أو حساب مجاميع فرعية لقيمة معينة في عمود. إليك الجدول التالي: table { width: 100%; } thead { vertical-align: middle; text-align: center; } td, th { border: 1px solid #dddddd; text-align: right; padding: 8px; text-align: inherit; } tr:nth-child(even) { background-color: #dddddd; } Name GreatHouseAllegience Arya Stark Cercei Lannister Myrcella Lannister Yara Greyjoy Catelyn Stark Sansa Stark في حال عدم استخدام العبارة GROUP BY، ستعيد COUNT إجمالي عدد الصفوف: SELECT Count(*) Number_of_Westerosians FROM Westerosians سنحصل على الخرج الناتج: Number_of_Westerosians 6 في حال استخدام GROUP BY، يمكن عدّ المستخدمين لكل قيمة في عمود معين كما يوضح المثال التالي: SELECT GreatHouseAllegience House, Count(*) Number_of_Westerosians FROM Westerosians GROUP BY GreatHouseAllegience الخرج الناتج: House Number_of_Westerosians Stark 3 Greyjoy 1 Lannister 2 من الشائع الجمع بين العبارتين GROUP BY و ORDER BY لترتيب النتائج تصاعديا أو تنازليًا: SELECT GreatHouseAllegience House, Count(*) Number_of_Westerosians FROM Westerosians GROUP BY GreatHouseAllegience ORDER BY Number_of_Westerosians Desc الخرج الناتج: House Number_of_Westerosians Stark 3 Lannister 2 Greyjoy 1 تجميع ROLAP (استخراج البيانات) - ROLAP aggregation يوفر معيار SQL معاملين تجميعيَين (aggregate operators) إضافيين. تُستخدم القيمة ALL للكناية عن جميع القيم التي يمكن أن تأخذها السمة (attribute). المُعاملان هما: with data cube: يوفّر كل التوليفات الممكنة لسمات وسيط العبارة (argument attributes of the clause). with roll up: يوفر المجموع الناتج عن اعتبار السمات مُرتّبة من اليسار إلى اليمين مع مقارنتها بكيفية إدراجها في وسيط العبارة (argument of the clause). تدعم إصدارات SQL القياسية التالية هذه الميزات: 1999 - 2003 - 2006 - 2008 - 2011. أمثلة إليك الجدول التالي: Food Brand Total_amount Pasta Brand1 100 Pasta Brand2 250 Pizza Brand2 300 استخدام عبارة cube: select Food,Brand,Total_amount from Table group by Food,Brand,Total_amount with cube الخرج الناتج: Food Brand Total_amount Pasta Brand1 100 Pasta Brand2 250 Pasta ALL 350 Pizza Brand2 300 Pizza ALL 300 ALL Brand1 100 ALL Brand2 550 ALL ALL 650 استخدام roll up: select Food,Brand,Total_amount from Table group by Food,Brand,Total_amount with roll up الخرج الناتج: Food Brand Total_amount Pasta Brand1 100 Pasta Brand2 250 Pizza Brand2 300 Pasta ALL 350 Pizza ALL 300 ALL ALL 650 الترتيب عبر ORDER BY الترتيب حسب رقم العمود (بدلاً من اسمه) يمكنك استخدام رقم العمود (يبدأ العمود الموجود في أقصى اليسار من الرقم "1") للإشارة إلى العمود الذي يستند الترتيب إليه. إيجابيات: هذا الخيار مناسب في حال كانت هناك إمكانية لتغيير أسماء الأعمدة لاحقًا، لأنّه سيجنّبك كسر الشيفرة. سلبيات: سيُضعف استخدام رقم العمود بدل اسمه مقروئية الاستعلام (وازن مثلا بين ORDER BY Reputation و 'ORDER BY 14'.). يرتب الاستعلام التالي النتيجة حسب المعلومات الموجودة في العمود رقم ‎3‎ بدلاً من الاعتماد اسم العمود ‎Reputation‎. SELECT DisplayName, JoinDate, Reputation FROM Users ORDER BY 3 الخرج الناتج: DisplayName JoinDate Reputation Community 2008-09-15 1 Jarrod Dixon 2008-10-03 11739 Geoff Dalgas 2008-10-03 12567 Joel Spolsky 2008-09-16 25784 Jeff Atwood 2008-09-16 37628 استخدام ORDER BY مع TOP لإعادة أعلى س صفًّا بناءً على قيمة العمود في هذا المثال، يمكنك استخدام GROUP BY و TOP لتحديد الصفوف المُعادة وترتيبها. لنفترض أنّك تريد الحصول على أفضل 5 مستخدمين من حيث السمعة في موقع متخصص في الأسئلة والأجوبة. بدون ORDER BY يعيد هذا الاستعلام أعلى 5 صفوف مرتبة حسب الإعداد الافتراضي، والذي هو Id في هذه الحالة، أي العمود الأول في الجدول (رغم أنّه لن يظهر في النتائج). SELECT TOP 5 DisplayName, Reputation FROM Users الخرج الناتج: DisplayName Reputation Community 1 Geoff Dalgas 12567 Jarrod Dixon 11739 Jeff Atwood 37628 Joel Spolsky 25784 استخدام ORDER BY سنستخدم ORDER BY في المثال التالي: SELECT TOP 5 DisplayName, Reputation FROM Users ORDER BY Reputation desc الخرج الناتج: DisplayName Reputation JonSkeet 865023 Darin Dimitrov 661741 BalusC 650237 Hans Passant 625870 Marc Gravell 601636 ملاحظات تستخدم بعض إصدارات SQL (مثل MySQL) العبارة ‎LIMIT‎ في نهاية ‎SELECT‎ ، بدلًا من استخدام ‎TOP‎ في البداية كما هو موضّح في المثال التالي: SELECT DisplayName, Reputation FROM Users ORDER BY Reputation DESC LIMIT 5 الترتيب المخصص لترتيب الجدول ‎Employee‎ حسب القسم department، يمكنك استخدام التعليمة ‎ORDER BY Department‎. أمّا إن أردت ترتيبه ترتيبًا غير أبجدي، فيجب عليك تحويل قيم ‎Department‎ إلى قيم أخرى قابلة للترتيب؛ يمكن فعل ذلك باستخدام عبارة CASE: Name Department Hasan IT Yusuf HR Hillary HR Joe IT Merry HR Ken Accountant في المثال التالي: SELECT * FROM Employee ORDER BY CASE Department WHEN 'HR' THEN 1 WHEN 'Accountant' THEN 2 ELSE 3 END; سنحصل على الخرج: Name Department Yusuf HR Hillary HR Merry HR Ken Accountant Hasan IT Joe IT الترتيب بالكنى بسبب طريقة معالجة الاستعلامات المنطقية، يمكن ترتيب نتائج الاستعلامات حسب الكُنى (Order by Alias). SELECT DisplayName, JoinDate as jd, Reputation as rep FROM Users ORDER BY jd, rep كما يمكن استخدام الترتيب النسبي (relative order) للأعمدة -أي الترتيب حسب رقم العمود- في عبارة الاختيار select. سنعود إلى المثال أعلاه، ولكن بدلاً من استخدام الكُنية، سنستخدم الترتيب النسبي. SELECT DisplayName, JoinDate as jd, Reputation as rep FROM Users ORDER BY 2, 3 الترتيب حسب عدة أعمدة في المثال التالي: SELECT DisplayName, JoinDate, Reputation FROM Users ORDER BY JoinDate, Reputation سيكون الخرج: DisplayName JoinDate Reputation Community 2008-09-15 1 Jeff Atwood 2008-09-16 25784 Joel Spolsky 2008-09-16 37628 Jarrod Dixon 2008-10-03 11739 Geoff Dalgas 2008-10-03 12567 المُعاملان المنطِقيان AND و OR AND و OR معاملان منطقيان يُستخدمان لبناء الشروط المنطقية. إليك الجدول التالي: Name Age City Bob 10 Paris Mat 20 Berlin Mary 24 Prague في المثال التالي: select Name from table where Age>10 AND City='Prague' سنحصل على الخرج: Name Mary وفي هذا المثال: select Name from table where Age=10 OR City='Prague' سنحصل على الخرج: Name Bob Mary ترجمة -وبتصرّف- للفصول 7 و 8 و 9 من الكتاب SQL Notes for Professionals
  3. تُستخدَم العبارة SELECT في معظم استعلامات SQL. وتتحكم في تحديد النتائج التي يجب أن يعيدها الاستعلام، وتُستخدم في العادة مع العبارة FROM، والتي تحدد الجزء (أو الأجزاء) من قاعدة البيانات المُستعلَم عنها. استخدام حرف البدل * لاختيار جميع الأعمدة إليك قاعدة البيانات التالية المؤلفة من الجدولين التاليين: جدول الموظفين Employees: table { width: 100%; } thead { vertical-align: middle; text-align: center; } td, th { border: 1px solid #dddddd; text-align: right; padding: 8px; text-align: inherit; } tr:nth-child(even) { background-color: #dddddd; } Id FName LName DeptId 1 James Smith 3 2 John Johnson 4 جدول الأقسام Departments: Id Name 1 Sales 2 Marketing 3 Finance 4 IT عبارة select بسيطة يمثل الرمز ‎*‎ حرفَ البدل، ويُستخدم لاختيار جميع الأعمدة المتاحة في الجدول. عند استخدامه بديلًا عن الأسماء الصريحة للأعمدة، فإنه يعيد جميع الأعمدة في جميع الجداول التي يحددها الاستعلام ‎FROM‎. ينطبق هذا الأمر على جميع الجداول التي يصل إليها الاستعلام عبر عبارات JOIN. إليك الاستعلام التالي: SELECT * FROM Employees سيعيد الاستعلام أعلاه جميع الحقول من جميع صفوف جدول ‎Employees‎: Id FName LName DeptId 1 James Smith 3 2 John Johnson 4 الصياغة النقطية Dot notation لاختيار كل القيم من جدول محدّد، يمكن تطبيق حرف البدل على الجدول باستخدام الصياغة النقطية. إليك الاستعلام التالي: SELECT Employees.*, Departments.Name FROM Employees JOIN Departments ON Departments.Id = Employees.DeptId سيعيد هذا المثال مجموعة بيانات تحتوي كافة الحقول الموجودة في الجدول ‎Employee‎، متبوعةً بـالحقل ‎Name‎ من الجدول ‎Departments‎: Id FName LName DeptId Name 1 James Smith 3 Finance 2 John Johnson 4 IT تنبيهات يوصى عمومًا بتجنّب استخدام ‎*‎ في شيفرة الإنتاج، إذ يمكن أن تتسبّب في مجموعة من المشاكل، منها: حمل الدخل والخرج الزائد (Excess IO)، والحمل الزائد على الشبكة، واستنزاف الذاكرة، وغيرها، وذلك بسبب أنّ محرك قاعدة البيانات سيقرأ بيانات غير مطلوبة. وينقلها إلى شيفرة الواجهة الأمامية. وقد يصبح الأمر أسوأ إن كانت هناك حقول كبيرة، مثل تلك المستخدمة لتخزين الملاحظات الطويلة أو الملفات المرفقة. زيادة الضغط على الدخل والخرج إذا احتاجت قاعدة البيانات إلى تخزين النتائج الداخلية على القرص كجزء من عملية معالجة استعلامات أكثر تعقيدًا من العبارة البسيطة ‎SELECT <columns> FROM <table>‎ معالجة زائدة (و / أو مزيد من عمليات الدخل والخرج IO) إذا كانت هناك أعمدة غير ضرورية من نوع: الأعمدة المحسوبة (computed columns) في قواعد البيانات التي تدعم هذا النوع من الأعمدة في حالة الاختيار من معرض (view)، فيشمل ذلك الأعمدة من جدول / معرض معيّن، والتي كان من الممكن أن يُحسّنها "مُحسِّن الاستعلام" (query optimiser) احتمال حدوث أخطاء غير متوقعة عند إضافة أعمدة إلى الجداول والمعارض لاحقًا، مما قد يؤدي إلى أسماء أعمدة غير واضحة. على سبيل المثال: SELECT * FROM orders JOIN people ON people.id = orders.personid ORDER BY displayname‎ في حال إضافة عمود يُسمى displayname إلى جدول الطلبات - orders - قصد السماح للمستخدمين بتقديم طلباتهم تحت أسماء من اختيارهم ليسهل عليهم الرجوع إليها مستقبلًا، فسيظهر اسم العمود مرتين في المخرجات، ونتيجة لذلك قد لا تكون عبارة ‎ORDER BY‎ واضحة، وهو ما قد يتسبب في خطأ ("ambiguous column name" في إصدارات MS SQL Server الحديثة). في المثال أعلاه، قد يعرض التطبيق اسم الطلب مكان اسم الشخص بالخطأ، نتيجة أنّ العمود الجديد سيُعاد أولًا. متى يمكنك استخدام حرف البدل *؟ يُفضل عمومًا تجنّب استخدام ‎*‎ في شيفرة الإنتاج، لكن لا مشكلة في استخدامها كاختصار عند تنفيذ الاستعلامات اليدوية في قاعدة البيانات عند العمل على النماذج الأولية. كما قد يفرض عليك تصميم التطبيق أحيانًا استخدام حرف البدل (في مثل هذه الظروف، يُفضل استخدام ‎tablealias.*‎ بدلًا من ‎*‎ حيثما أمكن ذلك). عند استخدام ‎EXISTS‎، كما في: ‎SELECT A.col1, A.Col2 FROM A WHERE EXISTS (SELECT * FROM B where A.ID = B.A_ID) فذلك لن يعيد أيّ بيانات من B. وبالتالي لن يكون الضمّ (join) ضروريًا، كما أنّ محرّك (engine) قاعدة البيانات يعلم أنه لن تُعاد أيّ قيمة من B، وبالتالي لن يتأثّر الأداء جرّاء استخدام ‎*‎. من جهة أخرى، لا بأس في استخدام ‎COUNT(*)‎، لأنها لا تُعيد أيًا من الأعمدة فعليًا، إذ تحتاج فقط إلى قراءة ومعالجة الأعمدة المستخدمة في التصفية. استخدام SELECT مع كُنى الأعمدة تُستخدم الأسماء المستعارة أو الكُنى - aliases - لاختصار أسماء الأعمدة أو جعلها ذات معنى. ويساعد ذلك على اختزال الشيفرة وجعلها أكثر مقروئية جرّاء تجنّب أسماء الجداول الطويلة وتمييز الأعمدة (على سبيل المثال، قد يكون هناك مُعرِّفان في الجدول، بيْد أنّ واحدًا منهما فقط سيستخدم في العبارة)، بالإضافة إلى تسهيل استخدام أسماء وصفية أطول في قاعدة بياناتك مع إبقاء الاستعلامات الجارية عليها مختصرة. علاوة على ذلك، قد تكون الكنى إجبارية في بعض الأحيان (على سبيل المثال في المعارض) من أجل تسمية المخرجات المحسوبة (computed outputs). جميع إصدارات SQL يمكن إنشاء الكنى في جميع إصدارات SQL باستخدام علامات الاقتباس المزدوجة (‎"‎). SELECT FName AS "First Name", MName AS "Middle Name", LName AS "Last Name" FROM Employees إصدارات خاصة من SQL يمكنك استخدام علامات الاقتباس المفردة (‎'‎)، وعلامات الاقتباس المزدوجة (‎"‎) والأقواس المربّعة (‎[]‎) لإنشاء كُنية في Microsoft SQL Server. SELECT FName AS "First Name", MName AS 'Middle Name', LName AS [Last Name] FROM Employees سينتج عن الشيفرة أعلاه الخرج: First Name Middle Name Last Name James John Smith John James Johnson Michael Marcus Williams ستعيد هذه العبارة عمودين ‎FName‎ و ‎LName‎ يحملان الاسم المحدّد (الكنية). وقد تمّ ذلك باستخدام العامل ‎AS‎ متبوعًا بالكنية، أو بكتابة الكنية مباشرةً بعد اسم العمود. ستكون للاستعلام التالي نفس النتيجة الواردة أعلاه. SELECT FName "First Name", MName "Middle Name", LName "Last Name" FROM Employees First Name Middle Name Last Name James John Smith John James Johnson Michael Marcus Williams كما تلاحظ، فإنّ النسخة الصريحة (أي استخدام العامل ‎AS‎) أفضل، لأنّها أكثر مقروئية. إذا كانت الكنية مؤلفة من كلمة واحدة، ولم تكن كلمة محجوزة، فيمكن كتابتها بدون علامات الاقتباس المفردة أو المزدوجة أو الأقواس المربعة: SELECT FName AS FirstName, LName AS LastName FROM Employees FirstName LastName James Smith John Johnson Michael Williams هناك شكل إضافي متاح في MS SQL Server، وهو ‎<alias> = <column-or-calculation>‎، إليك المثال التالي: SELECT FullName = FirstName + ' ' + LastName, Addr1 = FullStreetAddress, Addr2 = TownName FROM CustomerDetails والذي يكافئ: SELECT FirstName + ' ' + LastName As FullName FullStreetAddress As Addr1, TownName As Addr2 FROM CustomerDetails وسيؤدي كلاهما إلى النتيجة: FullName Addr1 Addr2 James Smith 123 AnyStreet TownVille John Johnson 668 MyRoad Anytown Michael Williams 999 High End Dr Williamsburgh يرى البعض أنّ استخدام ‎=‎ بدلاً من ‎As‎ أفضل من ناحية المقروئية، فيما يوصي آخرون بتجنّب استخدامها لأنّها ليست قياسية، وبالتالي لا تدعمها جميع قواعد البيانات، كما قد يتداخل استخدامها مع الاستخدامات الأخرى للمحرف ‎=‎. جميع إصدارات SQL إن كنت بحاجة إلى استخدام الكلمات المحجوزة، فيمكنك استخدام الأقواس المربعة أو علامات الاقتباس لتهريب الكُنية (escape): SELECT FName as "SELECT", MName as "FROM", LName as "WHERE" FROM Employees إصدارات خاصة من SQL بالمثل، يمكنك تهريب الكلمات المفتاحية في MSSQL عبر عدة مقاربات: SELECT FName AS "SELECT", MName AS 'FROM', LName AS [WHERE] FROM Employees SELECT FROM WHERE James John Smith John James Johnson Michael Marcus Williams يمكن أيضًا استخدام كنى الأعمدة في أيّ من العبارات النهائية في نفس الاستعلام، من قبيل العبارة ‎ORDER BY‎: SELECT FName AS FirstName, LName AS LastName FROM Employees ORDER BY LastName DESC بالمقابل، لا يجوز استخدام الشيفرة التالية لإنشاء كنية تساوي الكلمات المحجوزة (‎SELECT‎ و ‎FROM‎)، لأنّ ذلك سيتسبّب في العديد من الأخطاء في مرحلة التنفيذ. SELECT FName AS SELECT, LName AS FROM FROM Employees ORDER BY LastName DESC اختيار أعمدة فردية SELECT PhoneNumber, Email, PreferredContact FROM Customers ستعيد العبارة أعلاه الأعمدة ‎PhoneNumber‎ و ‎Email‎ و ‎PreferredContact‎ من جميع صفوف الجدول ‎Customers‎. كا ستُعاد الأعمدة بالتسلسل الذي تظهر به في عبارة ‎SELECT‎. وها هي النتيجة: PhoneNumber Email PreferredContact 3347927472 william.jones@example.com PHONE 2137921892 dmiller@example.net EMAIL NULL richard0123@example.com EMAIL إذا تمّ ربط عدة جداول معًا، فيمكنك اختيار الأعمدة من جداول معيّنة عن طريق وضع اسم الجدول قبل اسم العمود على النحو ‎[table_name].[column_name]‎ التالي: SELECT Customers.PhoneNumber, Customers.Email, Customers.PreferredContact, Orders.Id AS OrderId FROM Customers LEFT JOIN Orders ON Orders.CustomerId = Customers.Id تعني العبارة * ‎AS OrderId‎ أنّ الحقل ‎Id‎ من الجدول ‎Orders‎ سيُعاد كعمود يُسمى ‎OrderId‎. راجع قسم الاختيار عبر الكنى أسفله لمزيد من المعلومات. لتجنب استخدام أسماء الجداول الطويلة، يمكنك تكنية الجدول، فهذا سيخفف من صعوبات كتابة أسماء الجداول الطويلة مع كل حقل تختاره في عمليات الضمّ (joins). وعند استخدام الضمّ الذاتي - self join - (أي ضم نسختين من الجدول نفسه)، فعليك تكنِية الجداول لتمييزها عن بعضها. يمكن كتابة كنية الجدول على النحو التالي: ‎Customers c‎ أو ‎Customers AS ‎c‎، إذ تتصرّف ‎c‎ هنا ككُنية لـ ‎Customers‎، يمكننا الآن أن نختار مثلا الحقل ‎Email‎ عبر الصيغة: ‎c.Email. SELECT c.PhoneNumber, c.Email, c.PreferredContact, o.Id AS OrderId FROM Customers c LEFT JOIN Orders o ON o.CustomerId = c.Id اختيار عدد معيّن من السجلات عرّف معيار SQL 2008 العبارة ‎FETCH FIRST‎ كطريقة لاختيار عدد السجلات المُعادة. SELECT Id, ProductName, UnitPrice, Package FROM Product ORDER BY UnitPrice DESC FETCH FIRST 10 ROWS ONLY لم يُدعم هذا المعيار إلا في الإصدارات الأخيرة من بعض أنظمة إدارة قواعد البيانات (RDMSs). فيما توفّر الأنظمة الأخرى صياغة غير قياسية. أيضًا يدعم Progress OpenEdge 11.x الصياغة ‎FETCH FIRST <n> ROWS ONLY‎. بالإضافة إلى ذلك، تسمح إضافة العبارة ‎OFFSET <m> ROWS‎ قبل ‎FETCH FIRST <n> ROWS ONLY‎ بتخطي عدد من الصفوف قبل جلب الصفوف. SELECT Id, ProductName, UnitPrice, Package FROM Product ORDER BY UnitPrice DESC OFFSET 5 ROWS FETCH FIRST 10 ROWS ONLY الاستعلام التالي مدعوم في SQL Server و MS Access: SELECT TOP 10 Id, ProductName, UnitPrice, Package FROM Product ORDER BY UnitPrice DESC لفعل الشيء نفسه في MySQL أو PostgreSQL، يجب استخدام الكلمة المفتاحية ‎LIMIT‎: SELECT Id, ProductName, UnitPrice, Package FROM Product ORDER BY UnitPrice DESC LIMIT 10 وفي Oracle، ينبغي استخدام ‎ROWNUM‎: SELECT Id, ProductName, UnitPrice, Package FROM Product WHERE ROWNUM <= 10 ORDER BY UnitPrice DESC وينتج عن هذا 10 سجلات. Id ProductName UnitPrice Package 38 Côte de Blaye 263.50 12 - 75 cl bottles 29 Thüringer Rostbratwurst 123.79 50 bags x 30 sausgs. 9 Mishi Kobe Niku 97.00 18 - 500 g pkgs. 20 Sir Rodney's Marmalade 81.00 30 gift boxes 18 Carnarvon Tigers 62.50 16 kg pkg. 59 Raclette Courdavault 55.00 5 kg pkg. 51 Manjimup Dried Apples 53.00 50 - 300 g pkgs. 62 Tarte au sucre 49.30 48 pies 43 Ipoh Coffee 46.00 16 - 500 g tins 28 Rössle Sauerkraut 45.60 25 - 825 g cans الفروق بين الأنظمة جدير بالذكر أنّ الكلمة المفتاحية ‎TOP‎ في نظام Microsoft SQL تعمل بعد عبارة ‎WHERE‎، وتعيد عددًا محددًا من النتائج في حال كانت تلك النتائج متوافرة في أيّ مكان من الجدول، بينما تعمل ‎ROWNUM‎ كجزء من عبارة ‎WHERE‎، لذا إذا لم تتحقّق الشروط الأخرى في العدد المحدد من الصفوف في بداية الجدول، فلن تحصل على أيّ نتيجة، حتى لو كان من الممكن العثور على نتائج أخرى. الاختيار الشرطي يمكن استخدام العبارتين SELECT و WHERE معًا على النحو التالي: SELECT column1, column2, columnN FROM table_name WHERE [condition] يمكن أن يكون الشرط [condition] أيّ تعبير صالح في SQL يستخدم المعاملات المنطقية: > و < و = و ‎‎>=‎‎ و ‎‎<=‎‎‎‎ و LIKE و NOT و IN و BETWEEN وغيرها. تُعيد العبارة التالية جميع الأعمدة من الجدول "Cars" ذات الحالة "READY": SELECT * FROM Cars WHERE status = 'READY' الاختيار باستخدام CASE تُستخدم عبارة CASE لتطبيق عملية معينة على النتائج مباشرة. SELECT CASE WHEN Col1 < 50 THEN 'under' ELSE 'over' END threshold FROM TableName يمكن أيضًا سلسَلَة CASE على النحو التالي: SELECT CASE WHEN Col1 < 50 THEN 'under' WHEN Col1 > 50 AND Col1 <100 THEN 'between' ELSE 'over' END threshold FROM TableName يمكن أيضا استخدام عبارة ‎CASE‎ داخل أخرى: SELECT CASE WHEN Col1 < 50 THEN 'under' ELSE CASE WHEN Col1 > 50 AND Col1 <100 THEN Col1 ELSE 'over' END END threshold FROM TableName اختيار الأعمدة التي تحمل أسماء لكلمات مفتاحية محجوزة عندما يتطابق اسم العمود مع كلمة مفتاحية محجوزة، ينص معيار SQL على ضرورة أن تحُاط بعلامات اقتباس مزدوجة: SELECT "ORDER", ID FROM ORDERS لاحظ أنّ هذا يجعل اسم العمود حساسًا لحالة الأحرف. بعض نظم إدارة قواعد البيانات لديها طرق خاصة لاقتباس الأسماء. على سبيل المثال، يستخدم SQL Server أقواس مربعة: SELECT [Order], ID FROM ORDERS بينما تستخدم MySQL (و MariaDB) افتراضيا علامة اقتباس مائلة (backtick): SELECT `Order`, id FROM orders الاختيار باستخدام كُنى الجداول إليك المثال التالي: SELECT e.Fname, e.LName FROM Employees e أُعطِي جدول الموظفين Employees الكنية "e" مباشرةً بعد اسمه. يساعد ذلك في إزالة الغموض في حال احتوت العديد من الجداول حقولًا تحمل نفس الاسم، وكنت تحتاج إلى تحديد الجدول الذي تريد استخلاص البيانات منه. SELECT e.Fname, e.LName, m.Fname AS ManagerFirstName FROM Employees e JOIN Managers m ON e.ManagerId = m.Id لاحظ أنه بمجرد تعريف الكنية، فلن يكون بمقدورك استخدام اسم الجدول الأساسي بعد الآن، لهذا ستطرح الشيفرة التالية خطأً: SELECT e.Fname, Employees.LName, m.Fname AS ManagerFirstName FROM Employees e JOIN Managers m ON e.ManagerId = m.Id تجدر الإشارة إلى أنّ كنى الجداول - أو "متغيرات النطاق" (range variables) إن أردنا التقيد بالتسميات الرسمية - قُدِّمت في لغة SQL لحل مشكلة الأعمدة المكرّرة التي تنجم عن استخدام ‎INNER JOIN‎. وقد صحّح معيار SQL 1992 هذه الثغرة من خلال إدخال ‎NATURAL JOIN‎ (مطبّقة حاليًا في mySQL و PostgreSQL و Oracle ولكن ليس في SQL Server بعدُ)، وقد ضمن ذلك ألا تحدث مشكلة الأسماء المكررة للأعمدة. في المثال أعلاه، تُضمّ الجداول في الأعمدة ذات الأسماء المختلفة (‎Id‎ و ‎ManagerId‎) ولكن ليس في الأعمدة التي تحمل الاسم نفسه (‎LName‎، ‎FName‎)، هذا الأمر يتطلّب إعادة تسمية الأعمدة قبل عملية الضمّ: SELECT Fname, LName, ManagerFirstName FROM Employees NATURAL JOIN ( SELECT Id AS ManagerId, Fname AS ManagerFirstName FROM Managers ) m; رغم أنّه يجب الإعلان عن متغير الكنية / النطاق الخاص بالجدول المُعدَّل (أو ستطرح SQL خطأً)، إلا أنّه من غير المنطقي أبدًا استخدامه فعليًا في الاستعلامات. الاختيار بناءً على عدة شروط تُستخدم الكلمة المفتاحية ‎AND‎ لإضافة المزيد من الشروط إلى الاستعلام. Name Age Gender Sam 18 M John 21 M Bob 22 M Mary 23 F إليك المثال التالي: SELECT name FROM persons WHERE gender = 'M' AND age > 20; سينتج عن هذا: Name John Bob يمكن أيضًا استخدام المعامل المنطقي ‎OR‎ على النحو التالي: SELECT name FROM persons WHERE gender = 'M' OR age < 20; سينتج عن هذا: Name Sam John Bob يمكن دمج هذه الكلمات المفتاحية لبناء شروط أكثر تعقيدًا: SELECT name FROM persons WHERE (gender = 'M' AND age < 20) OR (gender = 'F' AND age > 20); سينتج عن هذا: Name Sam Mary الاختيار دون قفل الجدول في بعض الأحيان، عندما تُستخدم الجداول لأجل القراءة أساسًا (أو حصرًا)، فإنّ الفهرسة (indexing) لا تكون ضرورية، لذا لن تكون هناك حاجة إلى قفل (LOCK) الجدول أثناء الاختيار. هذه بعض الأمثلة على ذلك: SQL Server: SELECT * FROM TableName WITH (nolock) MySQL SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; SELECT * FROM TableName; SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ; Oracle SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; SELECT * FROM TableName; DB2 SELECT * FROM TableName WITH UR; العبارة ‎UR‎ كناية عن "قراءة غير ملتزم بها" (uncommitted read). في حال استخدامها على جدول أثناء تعديل أحد حقوله، فقد تحدث نتائج غير متوقعة. الاختيار باستخدام الدوال التجميعية aggregate functions حساب المتوسط تعيد الدالة التجميعية ‎AVG()‎ متوسط القيم المحددة. SELECT AVG(Salary) FROM Employees يمكن أيضًا استخدام الدوال مع عبارة where على النحو التالي: SELECT AVG(Salary) FROM Employees where DepartmentId = 1 ويمكن أيضًا استخدام الدوال مع العبارة GROUP BY. مثلًا، إذا تم تصنيف الموظف في عدة أقسام، وأردنا أن نحدّد متوسط الراتب في كل قسم، فيمكننا استخدام الاستعلام التالي. SELECT AVG(Salary) FROM Employees GROUP BY DepartmentId القيمة الصغرى تعيد الدالة التجميعية ‎MIN()‎ الحد الأدنى من القيم المحددة. SELECT MIN(Salary) FROM Employees القيمة الكبرى تعيد الدالة التجميعية ‎MAX()‎ الحد الأقصى للقيم المحددة. SELECT MAX(Salary) FROM Employees التعداد تعيد الدالة التجميعية ‎COUNT()‎ عدد القيم المحددة. SELECT Count(*) FROM Employees يمكن أيضًا دمجها مع العبارة where للحصول على عدد الصفوف التي تفي بشروط محددة. SELECT Count(*) FROM Employees where ManagerId IS NOT NULL يمكن أيضًا اختيار عمود معيّن للحصول على عدد القيم في ذلك العمود. لاحظ أنّ القيم المعدومة ‎NULL‎ لا تُحتسب. Select Count(ManagerId) from Employees يمكن أيضًا دمج Count مع الكلمة المفتاحية DISTINCT. Select Count(DISTINCT DepartmentId) from Employees التجميع تعيد الدالة التجميعية ‎SUM()‎ مجموع القيم المُختارة في جميع الصفوف. SELECT SUM(Salary) FROM Employees الاختيار من بين قيم معيّنة من عمود المثال التالي: SELECT * FROM Cars WHERE status IN ( 'Waiting', 'Working' ) يكافئ: SELECT * FROM Cars WHERE ( status = 'Waiting' OR status = 'Working' ) إذ أنّ ‎value IN ( <value list> )‎ هي مجرّد اختصار لمعامل OR المنطقي. تطبيق الدوال التجميعية على مجموعات من الصفوف يحسب المثال التالي عدد الصفوف بناءً على قيمة محددة من العمود: SELECT category, COUNT(*) AS item_count FROM item GROUP BY category; ويحسب المثال التالي متوسط الدخل حسب القسم: SELECT department, AVG(income) FROM employees GROUP BY department; الشيء الأساسي هنا هو اختيار الأعمدة المحددة في عبارة ‎GROUP BY‎ حصرًا، أو استخدامها مع الدوال التجميعية. يمكن أيضًا استخدام العبارة ‎WHERE‎ مع ‎GROUP BY‎، إلّا أنّ ‎WHERE‎ ستصفّي السجلات قبل تجميعها (grouping): SELECT department, AVG(income) FROM employees WHERE department <> 'ACCOUNTING' GROUP BY department; إن أردت تصفية النتائج بعد الانتهاء من التجميع، مثلًا إن أردت ألّا تعرض إلا الأقسام التي يتجاوز معدل دخلها 1000، سيكون عليك استخدام العبارة ‎HAVING‎. SELECT department, AVG(income) FROM employees WHERE department <> 'ACCOUNTING' GROUP BY department HAVING avg(income) > 1000; الاختيار مع ترتيب النتائج SELECT * FROM Employees ORDER BY LName ستعيد هذه العبارة جميع الأعمدة من الجدول ‎Employees‎. Id FName LName PhoneNumber 2 John Johnson 2468101214 1 James Smith 1234567890 3 Michael Williams 1357911131 SELECT * FROM Employees ORDER BY LName DESC أو SELECT * FROM Employees ORDER BY LName ASC تغيّر عبارة ASC اتجَاه الترتيب. يمكن أيضا إجراء الترتيب وفق عدّة أعمدة على النحو التالي: SELECT * FROM Employees ORDER BY LName ASC, FName ASC سيرتِّب هذا المثال النتائج حسب الحقل ‎LName‎ أولّا، أمّا بالنسبة للسجلات التي لها نفس قيمة الحقل ‎LName‎، فسيرتِّبها حسب ‎FName‎. سينتج عن هذا قوائم مشابهة للقوائم التي تجدها في دفتر الهاتف. إن أردت تجنّب إعادة كتابة اسم العمود في عبارة ‎ORDER BY‎، يمكنك استخدام رقم العمود بدلاً من اسمه. انتبه إلى أنّ أرقام الأعمدة تبدأ من 1. SELECT Id, FName, LName, PhoneNumber FROM Employees ORDER BY 3 يمكن أيضًا تضمين عبارة ‎CASE‎ في عبارة ‎ORDER BY‎. SELECT Id, FName, LName, PhoneNumber FROM Employees ORDER BY CASE WHEN LName='Jones' THEN 0 ELSE 1 END ASC سترتّب هذه الشيفرة النتائج بحيث تكون السجلات التي يساوي حقل ‎LName‎ خاصتها القيمة "Jones" في الأعلى. استخدام null لأجل الاختيار إليك المثال التالي: SELECT Name FROM Customers WHERE PhoneNumber IS NULL تختلف صياغة الاختيار باستخدام القيم المعدومة null عن الصياغة العادية، إذ أنّها لا تستخدم معامل التساوي ‎=‎، وإنّما تستخدم ‎IS NULL‎ أو ‎IS NOT NULL‎. اختيار قيم غير مكرّرة SELECT DISTINCT ContinentCode FROM Countries; سيعيد هذا الاستعلام جميع القيم الفريدة والمختلفة عن بعضها من العمود ‎ContinentCode‎ في الجدول ‎Countries‎ ContinentCode OC EU AS NA AF هذا مثال حي. اختيار الصفوف من عدة جداول إليك الشيفرة التالية: SELECT * FROM table1, table2 SELECT table1.column1, table1.column2, table2.column1 FROM table1, table2 تُسمّى هذه العملية الجداء المتقاطع (cross product) في SQL، وهي مكافئة للجداء المتقاطع في المجموعات. تعيد هذه العبارات أعمدة مُختارة من عدّة جداول في استعلام واحد، ولا توجد علاقة محددة بين الأعمدة المُعادة من كل جدول. ترجمة -وبتصرّف- للفصل Chapter 6: SELECT من الكتاب SQL Notes for Professionals
  4. سلسلة sql للمحترفين

    لغة الاستعلامات الهيكلية SQL اختصار إلى Structured Query Language هي لغة برمجة متخصصة في إدارة قواعد البيانات العلائقية RDBMS اختصار إلى Relational database management system. كما تُستخدم اللغات المشتقة من SQL في أنظمة إدارة مجاري البيانات العلائقية RDSMS اختصار إلى Relational Data Stream Management Systems، أو في إدارة قواعد بيانات SQL الحصرية NoSQL. تتألف SQL من ثلاث لغات فرعية أساسية، وهي: لغة تعريف البيانات DDL: تُستعمل لإنشاء وتعديل بنية قاعدة البيانات. لغة معالجة البيانات DML: تستعمل لتنفيذ عمليات قراءة البيانات وإدراجها وتحديثها وحذفها. لغة التحكم في البيانات DCL: تُستعمل للتحكم في الوصول إلى البيانات المخزّنة في قاعدة البيانات. تتألف DML من أربع عمليات أساسية، وهي عمليات الإنشاء (Create) والقراءة (Read) والتحديث (Update) والحذف (Delete)، ويُطلق عليها اختصارًا CRUD، تُنفّذ هذه العمليات عبر التعليمات ‎INSERT‎ و ‎SELECT‎ و ‎UPDATE‎ و ‎DELETE‎ على التوالي. أُضيفت مؤخرًا تعليمة ‎MERGE‎، والتي تنفّذ العمليات INSERT و UPDATE و DELETE معًا. تُقدَّم العديد من قواعد بيانات SQL على هيئة نُظم عميل / خادم (client/server systems). ويُطلق على هذه الخوادم مصطلح "خادم SQL". أنشأت ميكروسوفت قاعدة بيانات تسمى "SQL Server". ورغم أنّها تُعدّ من لهجات SQL، إلا أنّنا لن نتحدث عنها في هذه السلسلة، إن كنت تريد تعلّمها فيمكنك الرجوع إلى توثيقها. المعرفات identifiers يستعرض هذا القسم موضوع المعرّفات (identifiers)، وتشرح قواعد تسمية الجداول والأعمدة وباقي كائنات قاعدة البيانات. سنحاول أن تغطي الأمثلة الاختلافات بين تقديمات SQL المختلفة. المعرفات غير المقتبسة Unquoted identifiers يمكن أن تحتوي المعرّفات غير المُقتبسة على الحروف (‎a‎ - ‎z‎) والأرقام (‎0‎ - ‎9‎) والشرطة السفلية (‎_‎)، وفي جميع الأحوال، ينبغي أن تبدأ بحرف. اعتمادًا على تقديم SQL المُستخدم، و / أو إعدادات قاعدة البيانات، قد يجوز استخدام أحرف أخرى، وبعضها يمكن أن تُستخدم حرفًا أولًا للمعرّف. هذه بعض الأمثلة على الأحرف الجائزة: MS SQL:‏ ‎@‎ و ‎$‎ و ‎#‎ وباقي محارف اليونيكود -Unicode - الأخرى، المصدر MySQL:‏ ‎$‎، المصدر Oracle:‏ ‎$‎ و ‎#‎ وبافي الأحرف من مجموعة أحرف قاعدة البيانات، المصدر PostgreSQL:‏ ‎$‎ وباقي أحرف اليونيكود الأخرى، المصدر المعرّفات غير المقتبسة غير حسّاسة لحالة الأحرف عمومًا. بيْد أنّ طريقة التعامل مع حالة الأحرف تختلف بحسب تقديم SQL، مثلًا: MS SQL: تحافظ على الحالة (Case-preserving)، إذ تُحدّد مسألة الحساسية لحالة الأحرف عبر مجموعة أحرف قاعدة البيانات (database character set)، لذا يمكن أن تكون حساسة لحالة الأحرف. MySQL: تحافظ على الحالة، وتعتمد الحساسية على إعدادات قاعدة البيانات ونظام الملفات الأساسي. Oracle: تُحوّل إلى أحرف كبيرة، ثم تُعامل كمعرفّات مقتبسة. PostgreSQL: تُحوّل إلى أحرف صغيرة، ثم تُعامل مثل المعرّفات المقتبسة. SQLite: تحافظ على الحالة. وعدم حساسيتها تقتصر على أحرف ASCII. أنواع البيانات Data Types DECIMAL و NUMERIC يمثل النوعان ‎DECIMAL‎ و ‎NUMERIC‎ أعدادّا عشرية ذات دقة ثابتة، وهما متكافئان وظيفيًا. ويُصاغان على النحو التالي: DECIMAL ( precision [ , scale] ) NUMERIC ( precision [ , scale] ) أمثلة: SELECT CAST(123 AS DECIMAL(5,2)) --returns 123.00 SELECT CAST(12345.12 AS NUMERIC(10,5)) --returns 12345.12000 FLOAT و REAL يمثل نوعًا الأعداد FLOAT و REAL الأعداد التقريبية، ويُستخدمان لتمثيل البيانات الرقمية ذات الفاصلة العائمة (floating point numeric data). SELECT CAST( PI() AS FLOAT) --returns 3.14159265358979 SELECT CAST( PI() AS REAL) --returns 3.141593 الأعداد الصحيحة Integers يمثل النوع Integers البيانات العددية الصحيحة. نوع البيانات النطاق مساحة التخزين bigint -2^63 (-9,223,372,036,854,775,808) إلى 2^63-1 (9,223,372,036,854,775,807) 8 بايتات int -2^31 (-2,147,483,648) إلى 2^31-1 (2,147,483,647) 4 بايتات smallint -2^15 (-32,768) إلى 2^15-1 (32,767) بايتان tinyint من 0 إلى 255 بايت واحد table { width: 100%; } thead { vertical-align: middle; text-align: center; } td, th { border: 1px solid #dddddd; text-align: right; padding: 8px; text-align: inherit; } tr:nth-child(even) { background-color: #dddddd; } MONEY و SMALLMONEY يمثل النوعان MONEY و SMALLMONEY البيانات التي تمثل القيم النقدية أو العملات. نوع البيانات النطاق مساحة التخزين money -922,337,203,685,477.5808 إلى 922,337,203,685,477.5807 8 بايتات smallmoney -214,748.3648 إلى 214,748.3647 4 بايتات BINARY و VARBINARY يمثل النوعان BINARY و VARBINARY البيانات الثنائية ذات الطول الثابت أو المتغير. ويُصاغان على النحو التالي: BINARY [ ( n_bytes ) ] VARBINARY [ ( n_bytes | max ) ] يمكن أن يكون ‎n_bytes‎ أي عدد محصور بين 1 إلى 8000 أثمون. وتشير قيمة max إلى أنّ الحد الأقصى لمساحة التخزين هو ‎2^31-1‎‏. أمثلة: SELECT CAST(12345 AS BINARY(10)) -- 0x00000000000000003039 SELECT CAST(12345 AS VARBINARY(10)) -- 0x00003039 CHAR و VARCHAR يمثل النوعان CHAR و VARCHAR البيانات النصية ذات الطول الثابت أو المتغير. ويُصاغان على النحو التالي: CHAR [ ( n_chars ) ] VARCHAR [ ( n_chars ) ] أمثلة: SELECT CAST('ABC' AS CHAR(10)) -- 'ABC ' (إزاحة بمسافات بيضاء إلى اليمين) SELECT CAST('ABC' AS VARCHAR(10)) -- 'ABC' (لا إزاحة) SELECT CAST('ABCDEFGHIJKLMNOPQRSTUVWXYZ' AS CHAR(10)) -- 'ABCDEFGHIJ' (تُقصّ إلى عشرة أحرف فقط) NCHAR و NVARCHAR يمثل النوعان NCHAR و NVARCHAR نصوص اليونيكود ذات الطول الثابت أو المتغير. ويُصاغان على النحو التالي: NCHAR [ ( n_chars ) ] NVARCHAR [ ( n_chars | MAX ) ] استخدم ‎MAX‎ لأجل السلاسل النصية الطويلة التي يمكن أن تتجاوز 8000 حرفًا. UNIQUEIDENTIFIER يمثل هذا النوع مُعرّفا كونيا فريدًا (Universally Unique IDentifier أو UUID) أو معرّفًا عامّا فريدًا (globally unique identifier أو GUID) مُخزّنا على 16 أثمونًا. DECLARE @GUID UNIQUEIDENTIFIER = NEWID(); SELECT @GUID -- 'E28B3BD9-9174-41A9-8508-899A78A33540' DECLARE @bad_GUID_string VARCHAR(100) = 'E28B3BD9-9174-41A9-8508-899A78A33540_foobarbaz' SELECT @bad_GUID_string, -- 'E28B3BD9-9174-41A9-8508-899A78A33540_foobarbaz' CONVERT(UNIQUEIDENTIFIER, @bad_GUID_string) -- 'E28B3BD9-9174-41A9-8508-899A78A33540' الكلمة المفتاحية NULL تمثل الكلمة المفتاحية ‎NULL‎ في SQL، وكذلك في لغات البرمجة الأخرى، القيمة المعدومة، أو "لا شيء". وتُستخدم عادة في SQL للإشارة إلى "عدم وجود قيمة". من المهم التمييز بينها وبين القيم الفارغة، مثل السلسلة النصية ‎''‎ الفارغة أو الرقم ‎0‎، إذ لا يُعدّ أي منهما في الواقع معدومًا (‎NULL‎). من المهم أيضًا تجنّب إحاطة ‎NULL‎ بعلامات الاقتباس، على شاكلة ‎'NULL'‎، والتي يمكن استخدامها في الأعمدة التي تقبل القيم النصية، بيد أنّها لا تمثّل القيمة ‎NULL‎، ويمكن أن تسبّب أخطاءً، وتفسد البيانات. ترشيح NULL في الاستعلامات تختلف صياغة ترشيح ‎NULL‎ (أي عدم وجود قيمة) في كتل ‎WHERE‎ عن ترشيح القيم الأخرى: SELECT * FROM Employees WHERE ManagerId IS NULL ; SELECT * FROM Employees WHERE ManagerId IS NOT NULL ; لاحظ أنّه لمّا لم تكن ‎NULL‎ مساوية لأيّ شيء آخر، ولا حتى لنفسها، فستُعيد عوامل الموازنة ‎= NULL‎ أو ‎<> NULL‎ (أو ‎!= NULL‎ ) دائمًا القيمة المنطقية الخاصة UNKNOWN، والتي ترفضها WHERE. ترشِّح ‎WHERE‎ كل الصفوف التي يساوي شرطها القيمة ‎FALSE‎ أو UNKNOWN، ولا تحتفظ إلا بالصفوف ذات الشرط الصحيح (‎TRUE‎). الأعمدة المعدومة في الجداول عند إنشاء الجداول، يمكن جعل العمود قابلًا للإلغاء (nullable) أو غير قابل للإلغاء. CREATE TABLE MyTable ( MyCol1 INT NOT NULL, -- non-nullable MyCol2 INT NULL -- nullable ) ; افتراضيًا، تكون جميع الأعمدة قابلة للإلغاء (باستثناء تلك الموجودة في قيد المفتاح الأساسي - primary key constraint) ما لم نعيّن القيد عند القيمة ‎NOT NULL‎ صراحة. وسينتج خطأ عن محاولة تعيين ‎NULL‎ لعمود غير قابل للإلغاء. INSERT INTO MyTable (MyCol1, MyCol2) VALUES (1, NULL) ; -- صحيح INSERT INTO MyTable (MyCol1, MyCol2) VALUES (NULL, 2) ; لا يمكن إدراج القيمة NULL في العمود 'MyCol1' في الجدول 'MyTable' لأنّ العمود لا يسمح بالقيمة المعدومة، لذا ستفشل عملية الإدراج INSERT. إسناد NULL إلى حقل إسناد القيمة ‎NULL‎ إلى حقل يشبه إسناد أيّ قيمة أخرى: UPDATE Employees SET ManagerId = NULL WHERE Id = 4 إدراج الصفوف التي تحتوي حقولًا معدومة (NULL fields) على سبيل المثال، إدراج بيانات موظف بدون رقم هاتف، وبدون مدير في جدول الموظفين Employees: INSERT INTO Employees (Id, FName, LName, PhoneNumber, ManagerId, DepartmentId, Salary, HireDate) VALUES (5, 'Jane', 'Doe', NULL, NULL, 2, 800, '2016-07-22') ; أمثلة على قواعد البيانات والجداول إليك بعض الأمثلة التوضيحية عن قواعد البيانات. قاعدة بيانات متجر السيارات سوف نستعرض في المثال التالي قاعدة بيانات لمتجر يبيع السيارات، سنخزّن في القاعدة قوائم تضمّ الأقسام والموظفين والعملاء وسيارات العملاء. وسنستخدم المفاتيح الخارجية (foreign keys) لإنشاء علاقات بين مختلف الجداول. هذا تطبيق حي للمثال: العلاقات بين الجداول يضم كل قسم 0 موظف أو أكثر، ولكل موظف مدير واحد أو أكثر، وقد يكون لكل عميل 0 سيارة أو أكثر الجدول Departments: Id Name 1 HR 2 Sales 3 Tech لننشئ الجدول عبر SQL: CREATE TABLE Departments ( Id INT NOT NULL AUTO_INCREMENT, Name VARCHAR(25) NOT NULL, PRIMARY KEY(Id) ); INSERT INTO Departments ([Id], [Name]) VALUES (1, 'HR'), (2, 'Sales'), (3, 'Tech') ; الجدول Employees: Id FName LName PhoneNumber ManagerId DepartmentId Salary HireDate 1 James Smith 1234567890 NULL 1 1000 01-01-2002 2 John Johnson 2468101214 1 1 400 23-03-2005 3 Michael Williams 1357911131 1 2 600 12-05-2009 4 Johnathon Smith 1212121212 2 1 500 24-07-2016 لننشئ الجدول: CREATE TABLE Employees ( Id INT NOT NULL AUTO_INCREMENT, FName VARCHAR(35) NOT NULL, LName VARCHAR(35) NOT NULL, PhoneNumber VARCHAR(11), ManagerId INT, DepartmentId INT NOT NULL, Salary INT NOT NULL, HireDate DATETIME NOT NULL, PRIMARY KEY(Id), FOREIGN KEY (ManagerId) REFERENCES Employees(Id), FOREIGN KEY (DepartmentId) REFERENCES Departments(Id) ); INSERT INTO Employees ([Id], [FName], [LName], [PhoneNumber], [ManagerId], [DepartmentId], [Salary], [HireDate]) VALUES (1, 'James', 'Smith', 1234567890, NULL, 1, 1000, '01-01-2002'), (2, 'John', 'Johnson', 2468101214, '1', 1, 400, '23-03-2005'), (3, 'Michael', 'Williams', 1357911131, '1', 2, 600, '12-05-2009'), (4, 'Johnathon', 'Smith', 1212121212, '2', 1, 500, '24-07-2016') الجدول Customers: Id FName LName Email PhoneNumber PreferredContact 1 William Jones william.jones@example.com 3347927472 PHONE 2 David Miller dmiller@example.net 2137921892 EMAIL 3 Richard Davis richard0123@example.com NULL EMAIL لننشئ الجدول: CREATE TABLE Customers ( Id INT NOT NULL AUTO_INCREMENT, FName VARCHAR(35) NOT NULL, LName VARCHAR(35) NOT NULL, Email varchar(100) NOT NULL, PhoneNumber VARCHAR(11), PreferredContact VARCHAR(5) NOT NULL, PRIMARY KEY(Id) ); INSERT INTO Customers ([Id], [FName], [LName], [Email], [PhoneNumber], [PreferredContact]) VALUES (1, 'William', 'Jones', 'william.jones@example.com', '3347927472', 'PHONE'), (2, 'David', 'Miller', 'dmiller@example.net', '2137921892', 'EMAIL'), (3, 'Richard', 'Davis', 'richard0123@example.com', NULL, 'EMAIL') ; الجدول Cars: Id CustomerId EmployeeId Model Status Total Cost 1 1 2 Ford F-150 READY 230 2 1 2 Ford F-150 READY 200 3 2 1 Ford Mustang WAITING 100 4 3 3 Toyota Prius WORKING 1254 تعليمات SQL لإنشاء الجدول: CREATE TABLE Cars ( Id INT NOT NULL AUTO_INCREMENT, CustomerId INT NOT NULL, EmployeeId INT NOT NULL, Model varchar(50) NOT NULL, Status varchar(25) NOT NULL, TotalCost INT NOT NULL, PRIMARY KEY(Id), FOREIGN KEY (CustomerId) REFERENCES Customers(Id), FOREIGN KEY (EmployeeId) REFERENCES Employees(Id) ); INSERT INTO Cars ([Id], [CustomerId], [EmployeeId], [Model], [Status], [TotalCost]) VALUES ('1', '1', '2', 'Ford F-150', 'READY', '230'), ('2', '1', '2', 'Ford F-150', 'READY', '200'), ('3', '2', '1', 'Ford Mustang', 'WAITING', '100'), ('4', '3', '3', 'Toyota Prius', 'WORKING', '1254') ; قاعدة بيانات المكتبة سننشئ في هذا المثال قاعدة بيانات خاصة بمكتبة، ستحتوي القاعدة على جداول لتخزين المؤلفين والكتب والكتاب. هنا تجد مثالًا حيًّا للقاعدة. يُعرف جدولَا المؤلفين والكتب بالجداول الأساسية (base tables)، لأنهما يحتويان على تعريف العمود، وكذا البيانات الخاصة بالكيانات الفعلية في النموذج العلائقي (relational model). ويُعرف الجدول BookAuthors باسم جدول العلاقة (relationship table)، لأنّه يحدّد العلاقة بين جدول الكتب Books والمؤلفين Authors. العلاقات بين الجداول يمكن أن يكون لكل مؤلف كتاب واحد أو أكثر. كل كتاب يمكن أن يكون له مؤلف واحد أو أكثر الجدول Authors (عرض الجدول): Id Name Country 1 J.D. Salinger USA 2 F. Scott. Fitzgerald USA 3 Jane Austen UK 4 Scott Hanselman USA 5 Jason N. Gaylord USA 6 Pranav Rastogi India 7 Todd Miranda USA 8 Christian Wenz USA لننشئ الجدول الآن: CREATE TABLE Authors ( Id INT NOT NULL AUTO_INCREMENT, Name VARCHAR(70) NOT NULL, Country VARCHAR(100) NOT NULL, PRIMARY KEY(Id) ); INSERT INTO Authors (Name, Country) VALUES ('J.D. Salinger', 'USA'), ('F. Scott. Fitzgerald', 'USA'), ('Jane Austen', 'UK'), ('Scott Hanselman', 'USA'), ('Jason N. Gaylord', 'USA'), ('Pranav Rastogi', 'India'), ('Todd Miranda', 'USA'), ('Christian Wenz', 'USA') ; الجدول Books ( عرض الجدول): Id Title 1 The Catcher in the Rye 2 Nine Stories 3 Franny and Zooey 4 The Great Gatsby 5 Tender id the Night 6 Pride and Prejudice 7 Professional ASP.NET 4.5 in C# and VB عبارات SQL لإنشاء الجدول: CREATE TABLE Books ( Id INT NOT NULL AUTO_INCREMENT, Title VARCHAR(50) NOT NULL, PRIMARY KEY(Id) ); INSERT INTO Books (Id, Title) VALUES (1, 'The Catcher in the Rye'), (2, 'Nine Stories'), (3, 'Franny and Zooey'), (4, 'The Great Gatsby'), (5, 'Tender id the Night'), (6, 'Pride and Prejudice'), (7, 'Professional ASP.NET 4.5 in C# and VB') ; الجدول BooksAuthors (عرض الجدول): BookId AuthorId 1 1 2 1 3 1 4 2 5 2 6 3 7 4 7 5 7 6 7 7 7 8 تعليمات SQL لإنشاء الجدول: CREATE TABLE BooksAuthors ( AuthorId INT NOT NULL, BookId INT NOT NULL, FOREIGN KEY (AuthorId) REFERENCES Authors(Id), FOREIGN KEY (BookId) REFERENCES Books(Id) ); INSERT INTO BooksAuthors (BookId, AuthorId) VALUES (1, 1), (2, 1), (3, 1), (4, 2), (5, 2), (6, 3), (7, 4), (7, 5), (7, 6), (7, 7), (7, 8) ; الآن، إن أردت عرض جميع المؤلفين، فاكتب ما يلي (عرض المثال الحي): SELECT * FROM Authors; عرض جميع عناوين الكتب (عرض مثال حي): SELECT * FROM Books; عرض جميع الكتب ومؤلفيها (عرض مثال حي): SELECT ba.AuthorId, a.Name AuthorName, ba.BookId, b.Title BookTitle FROM BooksAuthors ba INNER JOIN Authors a ON a.id = ba.authorid INNER JOIN Books b ON b.id = ba.bookid ; جدول الدول سننشئ في هذا المثال جدولًا للبلدان. يُستخدم جدول البلدان في العديد من المجالات، وخاصة في التطبيقات المالية التي تشمل العملات وأسعار الصرف. هذا مثال حي. تطلب بعض البرمجيات الخاصة بتحليل الأسواق مثل بلومبرج ورويترز أن تعطيهم رمزًا مؤلفًا من حرفين أو ثلاث يمثل الدولة، إلى جانب رمز العملة. يحتوي الجدول التالي على عمود يحتوي رموز ‎ISO‎ المؤلفة من حرفين، وكذلك على عمود يحتوي رموز ‎ISO3‎ المكونة من 3 أحرف، والتي تمثل الدول. الجدول Countries (عرض الجدول): Id ISO ISO3 ISONumeric CountryName Capital ContinentCode CurrencyCode 1 AU AUS 36 Australia Canberra OC AUD 2 DE DEU 276 Germany Berlin EU EUR 2 IN IND 356 India New Delhi AS INR 3 LA LAO 418 Laos Vientiane AS LAK 4 US USA 840 United States Washington NA USD 5 ZW ZWE 716 Zimbabwe Harare AF ZWL لننشئ جدول الدول في SQL: CREATE TABLE Countries ( Id INT NOT NULL AUTO_INCREMENT, ISO VARCHAR(2) NOT NULL, ISO3 VARCHAR(3) NOT NULL, ISONumeric INT NOT NULL, CountryName VARCHAR(64) NOT NULL, Capital VARCHAR(64) NOT NULL, ContinentCode VARCHAR(2) NOT NULL, CurrencyCode VARCHAR(3) NOT NULL, PRIMARY KEY(Id) ) ; INSERT INTO Countries (ISO, ISO3, ISONumeric, CountryName, Capital, ContinentCode, CurrencyCode) VALUES ('AU', 'AUS', 36, 'Australia', 'Canberra', 'OC', 'AUD'), ('DE', 'DEU', 276, 'Germany', 'Berlin', 'EU', 'EUR'), ('IN', 'IND', 356, 'India', 'New Delhi', 'AS', 'INR'), ('LA', 'LAO', 418, 'Laos', 'Vientiane', 'AS', 'LAK'), ('US', 'USA', 840, 'United States', 'Washington', 'NA', 'USD'), ('ZW', 'ZWE', 716, 'Zimbabwe', 'Harare', 'AF', 'ZWL') ; ترجمة -وبتصرّف- للفصول الخمسة الأولى من الكتاب SQL Notes for Professionals