اختبار: Postgres المتقدم: الجزء 1
هل تجعلك SQL تصرخ؟
الجزء 1 من 2. انتقل إلى الجزء 2
PostgreSQL 🐘 هي بلا شك قاعدة البيانات المفضلة لدي! أتعلم دائمًا حيلًا ومزالق جديدة، لذا قررت جمعها في اختبار جديد!
يغطي هذا الاختبار مزيجًا من ميزات PostgreSQL المألوفة والأقل شهرة، بالإضافة إلى المزالق: من التجميعات المضمنة إلى تحويل الأنواع والقيود وغيرها.
حظًا موفقًا! 🍀
أي من تحويلات الأنواع التالية غير صالحة ❌؟
تدعم PostgreSQL ثلاث صيغ للتحويل:
- SQL القياسي (ANSI):
CAST(expression AS type). - PostgreSQL:
expression::type. - قيمة حرفية ذات نوع محدد:
type 'literal'.
جميعها متكافئة وظيفيًا، لكن:
CAST()هو الأكثر قابلية للنقل.::خاص بـ PostgreSQL لكنه شائع الاستخدام.- الصيغة الوسطية
type 'literal'أقل شيوعًا لكنها لا تزال صالحة.
كم عدد قيم NULL المسموح بها هنا؟
CREATE TABLE student_emails ( student_id INTEGER, email VARCHAR(255), UNIQUE(email));قيود UNIQUE في PostgreSQL:
- تسمح بعدة قيم NULL.
NULL≠NULLفي فحوصات التفرد.
لمنع قيم NULL، أضف NOT NULL:
CREATE TABLE student_emails ( student_id INTEGER, email VARCHAR(255) NOT NULL, UNIQUE(email));ماذا يُرجع هذا؟
SELECT '2024-11-27'::date + interval '24 hours';الفترات الزمنية (Intervals) أداة قوية لتبسيط عمليات نطاق التاريخ!
حساب التواريخ في PostgreSQL:
+ interval '24 hours'يضيف 24 ساعة+ interval '1 day'يضيف يومًا واحدًا+ interval '1 month'يضيف شهرًا واحدًا+ interval '1 year'يضيف سنة واحدة
النتيجة هي 2024-11-28 00:00:00.
أنواع تُربكك
أي من هذه الأنواع ليس ❌ نوعًا صالحًا في PostgreSQL؟
تمتلك PostgreSQL مجموعة غنية من أنواع البيانات، لكن STRING(100) ليس واحدًا منها.
أنواع السلاسل النصية الصحيحة تشمل:
VARCHAR(100)(سلسلة متغيرة الطول)CHAR(100)(سلسلة ثابتة الطول)TEXT(طول غير محدود)CHARACTER VARYING(100)(مثلVARCHAR(100))
أي من هذه الأنواع ليس ❌ نوعًا صالحًا في PostgreSQL؟
قد يبدو مألوفًا لأن decimal128 هو نوع في العديد من الأماكن (بما في ذلك Mongo و Java.) لكنه ليس نوعًا صالحًا في PostgreSQL، بينما decimal هو النوع الصحيح.
الأنواع الرقمية الصحيحة تشمل:
int(عدد صحيح 4 بايت)bigint(عدد صحيح 8 بايت)real(فاصلة عائمة 4 بايت)double precision(فاصلة عائمة 8 بايت)bigserial(عدد صحيح متزايد تلقائيًا 8 بايت)smallserial(عدد صحيح متزايد تلقائيًا 2 بايت)
ماذا يحدث عند حساب إجمالي أرقام الطلاب المحتملة؟
SELECT 256 * 256 * 256 * 256;نوع integer في PostgreSQL هو عدد صحيح موقّع 32 بت، يتراوح من -2,147,483,648 إلى 2,147,483,647.
العملية الحسابية 256^4 = 4,294,967,296 تتجاوز هذا النطاق.
للتعامل مع الأعداد الأكبر:
-- Use BIGINTSELECT 256::bigint * 256 * 256 * 256;
-- Or numeric for arbitrary precisionSELECT 256::numeric * 256 * 256 * 256;أي قيمة تحتوي على أقل عدد من الأرقام الكسرية يتجاوز دقة PostgreSQL القصوى البالغة ستة أرقام بعد الفاصلة؟
الطوابع الزمنية في PostgreSQL لها دقة ميكروثانية (6 منازل عشرية).
- الحد الأقصى:
.123456(6 أرقام) - يتم تقريب أو اقتطاع النانوثانية (9 أرقام) إلى الدقة المدعومة
- يتم قبول إزاحات المنطقة الزمنية لـ
timestamptz، ولكنها غير مطلوبة
مأزق غير شائع: بعض اللغات/الأطر ترسل دقة نانوثانية، لكن PostgreSQL يخزن الطوابع الزمنية بدقة ميكروثانية.
متى يتم التحقق من قيد grade؟
ALTER TABLE studentsADD CONSTRAINT valid_gradeCHECK ( (grade >= 0 AND grade <= 100) OR grade IS NULL) NOT VALID;القيود NOT VALID:
- يتم التحقق منها فورًا للإضافات والتحديثات الجديدة
- لا تتحقق من الصفوف الموجودة
- يمكن التحقق من الصفوف الموجودة لاحقًا باستخدام
VALIDATE CONSTRAINT - مفيدة للجداول الكبيرة
بدون NOT VALID:
- يتم التحقق من القيد فورًا
- يتم التحقق من جميع الصفوف الموجودة
- قد يكون بطيئًا على الجداول الكبيرة
أحسنت! لقد تعمقت في عدة مجالات من PostgreSQL! 🐘
أتمنى أن تكون قد تعلمت شيئًا جديدًا، أو على الأقل حصلت على درجة تتفاخر بها! 🏆
اطّلع على الجزء الثاني لمزيد من متعة Postgres! 🚀
هل تريد المزيد من الإثارة في الحياة؟ اطّلع على مجموعة الاختبارات الخاصة بي لمتعة لا نهائية*! 🎉
