DanLevy.net

اختبار: Postgres المتقدم: الجزء 1

هل تجعلك SQL تصرخ؟


الجزء 1 من 2. انتقل إلى الجزء 2

PostgreSQL 🐘 هي بلا شك قاعدة البيانات المفضلة لدي! أتعلم دائمًا حيلًا ومزالق جديدة، لذا قررت جمعها في اختبار جديد!

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

حظًا موفقًا! 🍀

أي من التالي ليس دالة تجميعية مدمجة في PostgreSQL؟

SELECT
MIN(grade) as lowest,
MAX(grade) as highest,
AVG(grade) as average,
MEDIAN(grade) as middle
FROM grades;

MEDIAN ليست مدمجة! تحتاج إلى:

PERCENTILE_CONT(0.5)
WITHIN GROUP (ORDER BY grade)

الدوال التجميعية المدمجة الشائعة:

  • MIN, MAX, COUNT
  • AVG, SUM
  • ARRAY_AGG, STRING_AGG
  • دوال إحصائية متنوعة

أي من تحويلات الأنواع التالية غير صالحة ❌؟

تدعم PostgreSQL ثلاث صيغ للتحويل:

  1. SQL القياسي (ANSI): CAST(expression AS type).
  2. PostgreSQL: expression::type.
  3. دالة النوع: type 'literal'.

جميعها متكافئة وظيفيًا، لكن:

  • CAST() هو الأكثر قابلية للنقل.
  • :: خاص بـ PostgreSQL لكنه شائع الاستخدام.
  • الصيغة الوسطية type 'literal' أقل شيوعًا لكنها لا تزال صالحة.

كم عدد قيم NULL المسموح بها هنا؟

CREATE TABLE student_emails (
student_id INTEGER,
email VARCHAR(255),
UNIQUE(email)
);

قيود UNIQUE في PostgreSQL:

  • تسمح بعدة قيم NULL.
  • NULLNULL في فحوصات التفرد.

لمنع قيم 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.

ما هي أدق عبارة حول timestamptz و timestamp؟

كلاهما يشغلان 8 بايت، لكنهما لا يخزنان نفس النوع من القيمة.

إذن ما الفرق؟ الفرق في تحليل الإدخال.

timestamptz

  • يطبيع الإدخال إلى نقطة زمنية مطلقة.
  • يأخذ في الاعتبار إعداد TimeZone للخادم/الاتصال عند تحليل الإدخال بدون إزاحة صريحة وعند عرض المخرجات.

timestamp

  • يخزن تاريخًا ووقتًا بدون تحويل المنطقة الزمنية.
  • لا يحافظ على معلومات المنطقة الزمنية ولا يطبعها.

timestamp

  • يخزن التاريخ والوقت بدون معلومات المنطقة الزمنية.
  • مفيد لتخزين التواريخ الموحدة بشكل صريح، سواء في UTC أو منطقة زمنية محددة.

أي من هذه الأنواع ليس ❌ نوعًا صالحًا في 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 بايت)

أي من هذه الأنواع ليس ❌ نوعًا صالحًا في PostgreSQL؟

هل جعلك هذا محبطًا، بل غاضبًا؟ أنت لست وحدك! على حد قول أحد المساهمين المجهولين في “core”، “what the hell, Dan?! I crashed on the type questions! Thats violent sir! Not sharing my score, hah.” 😈 على الرحب والسعة.

مجموعة PostgreSQL الغنية من أنواع الشبكات لا تتضمن ipv4. في كل مرة أحاول استخدامه دون البحث، أخطئ فيه. ربما macaddr8 يجعلني أشعر أنه لا بد أن هناك أنواع ipv4 و ipv6. لا، inet يغطي كليهما. أيضًا، cidr يغطي أقنعة الشبكة لكليهما.

أنواع الشبكات الصالحة تشمل:

  • cidr (عنوان شبكة IPv4/IPv6)
  • inet (عنوان مضيف IPv4/IPv6)
  • macaddr (عنوان MAC)
  • macaddr8 (عنوان MAC EUI-64)

أي من هذه الأنواع ليس ❌ نوعًا صالحًا في PostgreSQL؟

تمتلك PostgreSQL مجموعة غنية من الأنواع المتخصصة، لكن currency ليس واحدًا منها!

الأنواع الصالحة تشمل:

  • xml (بيانات XML)
  • uuid (UUID)
  • money (مبلغ العملة)
  • interval (فاصل زمني)

أي من هذه الأنواع ليس ❌ نوعًا صالحًا في PostgreSQL؟

تحتوي PostgreSQL على مجموعة غنية من الأنواع المتخصصة، لكن triangle ليس واحدًا منها.

أعتقد أن الإصدارات القادمة من GEOS ستتضمن دعم Triangle وفقًا لمعايير OGC/WKT، مما يعني أنه يجب أن يُدرج في Postgis في النهاية. (ببساطة، قد تكون هذه الإجابة خاطئة في المستقبل.)

الأنواع المتخصصة الصحيحة تشمل:

  • box (مربع مستطيل)
  • line (خط لا نهائي)
  • point (نقطة ثنائية الأبعاد)
  • circle (دائرة ثنائية الأبعاد)
  • polygon (مضلع ثنائي الأبعاد)

ماذا يحدث عند حساب إجمالي أرقام الطلاب المحتملة؟

SELECT 256 * 256 * 256 * 256;

نوع integer في PostgreSQL هو عدد صحيح موقّع 32 بت، يتراوح من -2,147,483,648 إلى 2,147,483,647.

العملية الحسابية 256^4 = 4,294,967,296 تتجاوز هذا النطاق.

للتعامل مع الأعداد الأكبر:

-- Use BIGINT
SELECT 256::bigint * 256 * 256 * 256;
-- Or numeric for arbitrary precision
SELECT 256::numeric * 256 * 256 * 256;

ما هو أصغر نص حرفي timestamp يتجاوز أقصى دقة time في Postgres؟

CREATE TABLE class_sessions (
id INT GENERATED BY DEFAULT AS IDENTITY,
start_time timestamptz,
end_time timestamptz
);

الطوابع الزمنية في PostgreSQL لها دقة ميكروثانية (6 منازل عشرية).

  • الحد الأقصى: .123456 (6 أرقام)
  • يتم تقريب أو اقتطاع النانوثانية (9 أرقام) إلى الدقة المدعومة
  • يتم قبول إزاحات المنطقة الزمنية لـ timestamptz، ولكنها غير مطلوبة

مأزق غير شائع: بعض اللغات/الأطر ترسل دقة نانوثانية، لكن PostgreSQL يخزن الطوابع الزمنية بدقة ميكروثانية.

أي من هذه الأنواع ليس ❌ نوعًا صالحًا في PostgreSQL؟

(بجدية، هذه كلها أنواع حقيقية - في الغالب.)

يحتوي PostgreSQL على عدة أنواع هندسية وأنواع بحث نصي مدمجة، لكن tsrank ليس واحدًا منها.

الأنواع الهندسية وأنواع البحث النصي الصحيحة تشمل:

  • lseg (قطعة خطية)
  • bytea (بيانات ثنائية)
  • tsquery (استعلام بحث نصي)
  • tsvector (مستند بحث نصي)

متى يتم التحقق من قيد grade؟

ALTER TABLE students
ADD CONSTRAINT valid_grade
CHECK (
(grade >= 0 AND grade <= 100) OR
grade IS NULL
) NOT VALID;

القيود NOT VALID:

  • يتم التحقق منها فورًا للإضافات والتحديثات الجديدة
  • لا تتحقق من الصفوف الموجودة
  • يمكن التحقق من الصفوف الموجودة لاحقًا باستخدام VALIDATE CONSTRAINT
  • مفيدة للجداول الكبيرة

بدون NOT VALID:

  • يتم التحقق من القيد فورًا
  • يتم التحقق من جميع الصفوف الموجودة
  • قد يكون بطيئًا على الجداول الكبيرة

أحسنت! لقد تعمقت في عدة مجالات من PostgreSQL! 🐘

أتمنى أن تكون قد تعلمت شيئًا جديدًا، أو على الأقل حصلت على درجة تتفاخر بها! 🏆

اطّلع على الجزء الثاني لمزيد من متعة Postgres! 🚀

هل تريد المزيد من الإثارة في الحياة؟ اطّلع على مجموعة الاختبارات الخاصة بي لمتعة لا نهائية*! 🎉