English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

تعليم PostgreSQL الأساسي

تعليم PostgreSQL المتقدم

واجهة PostgreSQL

أنواع البيانات PostgreSQL

في هذا الفصل، سنناقش أنواع البيانات في PostgreSQL، حيث يتم تعيين نوع البيانات لكل حقل عند إنشاء جدول.

فوائد تعيين نوع البيانات:

يقدم PostgreSQL أنواعًا متنوعة من البيانات. يمكن للمستخدم استخدام الأمر CREATE TYPE لإنشاء أنواع جديدة في قاعدة البيانات. هناك العديد من أنواع البيانات في PostgreSQL، وسنوضح ذلك بشكل دقيق فيما يلي.

أنواع الأعداد

تتكون أنواع الأعداد من أعداد صحيحة بحجم 2 بايت أو 4 بايت أو 8 بايت وأعداد عشرية بحجم 4 بايت أو 8 بايت مع دقة اختيارية.

يوضح الجدول أدناه أنواع الأعداد المتاحة.

الاسمطول التخزينوصفمجال
smallint2 بايتعدد صغير في نطاق ضيق-32768 إلى +32767
عددي4 بايتالأعداد الصحيحة الشائعة-2147483648 إلى +2147483647
bigint8 بايتعدد كبير في نطاق واسع-9223372036854775808 إلى +9223372036854775807
decimalطول متغيردقة محددة من قبل المستخدم، دقيقة131072 مكان قبل نقطة العشرية؛ 16383 مكان بعد نقطة العشرية
numericطول متغيردقة محددة من قبل المستخدم، دقيقة131072 مكان قبل نقطة العشرية؛ 16383 مكان بعد نقطة العشرية
real4 بايتدقة متغيرة، غير دقيقةدقة عشرية 6 مرتبة
double precision8 بايتدقة متغيرة، غير دقيقةدقة عشرية 15 مرتبة
smallserial2 بايتعدد صغير متناسب في نطاق ضيق1 إلى 32767
serial4 بايتعدد صغير متناسب1 إلى 2147483647
bigserial8 بايتعدد كبير متناسب في نطاق واسع1 إلى 9223372036854775807

نوع المال

يخزن نوع money مبلغ النقد المحدد بدقة صغيرة ثابتة.

يمكن تحويل قيم numeric و int و bigint إلى money، ويُنصح بعدم استخدام الأعداد العشرية للتعامل مع أنواع المال، لأن هناك احتمال لحدوث أخطاء في التسوية.

الاسمالحجم التخزينيوصفمجال
money8 بايتمبلغ نقدي-92233720368547758.08 إلى +92233720368547758.07

أنواع الحروف

يوضح الجدول أدناه أنواع الحروف المدعومة من PostgreSQL:

الرقمالاسم & الوصف
1

character varying(n), varchar(n)

متغير الطول، مع حد للطول

2

character(n), char(n)

مقاس ثابت، يتم补足不足的部分用空格

3

text

متغير الطول، بدون حد للطول

أنواع التاريخ/الوقت

يوضح الجدول أدناه أنواع التاريخ والوقت المدعومة من PostgreSQL.

الاسمالمساحة المخزنةوصفأدنى قيمةأعلى قيمةدقة
timestamp [ (p) ] [ بدون منطقة زمنية ]8 بايتالتاريخ والوقت (بدون منطقة زمنية)4713 ق294276 م1 ملي ثانية / 14 موقع
timestamp [ (p) ] مع منطقة زمنية8 بايتالتاريخ والوقت، مع منطقة زمنية4713 ق294276 م1 ملي ثانية / 14 موقع
التاريخ4 بايتيستخدم فقط للأيام4713 ق5874897 م1 يوم
وقت [ (p) ] [ بدون منطقة زمنية ]8 بايتيستخدم فقط لوقت في اليوم الواحد00:00:0024:00:001 ملي ثانية / 14 موقع
وقت [ (p) ] مع منطقة زمنية12 بايتيستخدم فقط لوقت في اليوم الواحد، مع منطقة زمنية00:00:00+145924:00:00-14591 ملي ثانية / 14 موقع
فترة زمنية [ الحقول ] [ (p) ]12 بايتفترة الزمنية-178000000 سنة178000000 سنة1 ملي ثانية / 14 موقع

نوع boolean

يدعم PostgreSQL نوع البيانات boolean القياسي.

boolean لديه "true" (صحيح) أو "false" (خطأ) حالتان، والوضع الثالث "unknown" (غير معروف) الذي يتم تمثيله بـ NULL.

الاسمتنسيق التخزينوصف
boolean1 بايتصحيح/خطأ

أنواع المفردات

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

أنواع المفردات في PostgreSQL تشبه أنواع المفردات في لغة البرمجة C.

على عكس الأنواع الأخرى، تحتاج أنواع المفردات إلى استخدام الأمر CREATE TYPE لإنشائها.

CREATE TYPE mood AS ENUM ('sad', 'ok', 'happy');

إنشاء أيام الأسبوع كما يلي:

CREATE TYPE week AS ENUM ('Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun');

مثل الأنواع الأخرى، يمكن استخدام نوع المفردات بعد إنشائه في تعريف الجداول والوظائف.

CREATE TYPE mood AS ENUM ('sad', 'ok', 'happy');
CREATE TABLE person (
    الاسم نص,
    current_mood الحالة
);
INSERT INTO person VALUES ('Moe', 'happy');
SELECT * FROM person WHERE current_mood = 'happy';
 الاسم | الحالة الحالية 
------+--------------
 Moe | سعيد
(1 سطر)

أنواع الجغرافيا

أنواع البيانات الجغرافية تمثل الأجسام المسطحة في الثلاثة أبعاد.

الجدول أدناه يبين الأنواع الجغرافية التي يدعمها PostgreSQL.

أبسط أنواع: النقطة. إنها أساس الأنواع الأخرى.

الاسمالمساحة المخزنةالشرحطريقة التعبير
point16 بيتنقطة في المستوى العرضي(x,y)
line32 بيتالخط غير المحدود (لم يتم تنفيذه بشكل كامل)((x1,y1),(x2,y2))
lseg32 بيتالخط المحدود((x1,y1),(x2,y2))
box32 بيتمربع((x1,y1),(x2,y2))
path16+16n بيتالمسار المغلق (مثل المضلع)((x1,y1),...)
path16+16n بيتالمسار المفتوح[(x1,y1),...]
polygon40+16n بيتمضلع (مثل المسار المغلق)((x1,y1),...)
circle24 بيتالدائرة<(x,y),r> (مركز وعرض)

نوع عناوين الشبكة

يقدم PostgreSQL أنواع بيانات لتحديد عناوين IPv4 وIPv6 وMAC.

تخزين عناوين الشبكة باستخدام هذه الأنواع البيانية أفضل من استخدام أنواع النصوص النقية، لأن هذه الأنواع توفر التحقق من صحة المدخلات وتقديم عمليات خاصة وفئات.

الاسمالمساحة المخزنةوصف
cidr7 أو 19 بيتشبكة IPv4 أو IPv6
inet7 أو 19 بيتمزيج من أجهزة الحاسوب والشبكات IPv4 أو IPv6
macaddr6 بيتعنوان MAC

عند تصنيف بيانات نوع inet أو cidr، تكون عناوين IPv4 دائمًا في المقدمة من عناوين IPv6، بما في ذلك تلك المدمجة أو الم映射ة على عناوين IPv6، مثل ::10.2.3.4 أو ::ffff:10.4.3.2.

نوع السلسلة الثنائية

السلسلة الثنائية هي سلسلة من الأرقام 1 و0. يمكن استخدامها لتخزين وتوضيح وهموم البت.

بيانات نوع bit يجب أن تكون مطابقة للطول n، وال محاولة تخزين بيانات أقصر أو أطول هي خطأ. نوع البيانات bit varying هو نوع متغير الطول الأقصى n؛ سيتم رفض الأطوال الأطول. الكتابة بدون طول للـ bit هي bit(1)، والكتابة بدون طول للـ bit varying تعني عدم وجود حد للطول.

نوع البحث النصي

البحث الكامل النصي هو العثور على المستندات التي تتطابق مع الاستعلام من مجموعة مستندات باللغة الطبيعية.

يقدم PostgreSQL نوعين من أنواع البيانات لدعم البحث الكامل النصي:

الرقمالاسم & الوصف
1

tsvector

قيمة tsvector هي قائمة مرتبة من التكرارات المختلفة من الكلمات، وهي معيارية لبعض الأنواع المختلفة من نفس الكلمة.

2

tsquery

tsquery يحتوي على الكلمات الأساسية المستخدمة في البحث، ويستخدم أجهزة الاستدلال (AND)، (OR) و!(NOT) للدمجها، ويستخدم المثلثات للإشارة إلى مجموعات الأجهزة الاستدلالية.

نوع البيانات UUID

يستخدم نوع البيانات UUID لتخزين المعرّف الفريد الشامل (UUID) المحدد في RFC 4122، ISO/IEC 9834-8:2005 وأي معايير مرتبطة. (بعض النظم تعتبر هذا النوع من المعرّف الفريد الشامل أو GUID.). هذا المعرّف هو معرّف من 128 بت يتم إنشاؤه بواسطة خوارزمية، مما يجعله من المستحيل أن يكون مثل المعرّف الذي تم إنشاؤه بواسطة نفس الخوارزمية في مكونات أخرى. لذلك، بالنسبة للنظم الموزعة، يقدم هذا المعرّف ضمانًا أفضل للفريدية مقارنة بالسلاسل، لأن السلاسل يمكن أن تضمن الفريدية فقط داخل قاعدة البيانات الواحدة.

UUID يتم كتابته كسلسلة من الأرقام الستة عشر الصغيرة، مقسومة إلى عدة مجموعات، خاصةً مجموعة من 8 أرقام + ثلاث مجموعات من 4 أرقام + مجموعة من 12 أرقام، مما يعطي مجموع 32 رقمًا يمثل 128 بت، مثال على UUID المعياري كالتالي:

a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11

نوع البيانات XML

يمكن استخدام نوع البيانات xml لتحديد بيانات XML. الفوائد في تخزين بيانات XML في نوع النص هي أنه يمكن التحقق من جودة التركيب للقيم المدخلة، بالإضافة إلى دعم التحقق من نوعية الأمان للدوال. لتشغيل هذا النوع من البيانات، يجب استخدام configure --with-libxml عند التجميع.

يمكن لتخزين xml أن يحتوي على "مستند" صحيح من acordo مع o padrão XML، assim como aqueles definidos no padrão XML. XMLDecl? content الجزء المحدد "المحتوى"، بشكل عام، مما يعني أن جزء المحتوى يمكن أن يحتوي على عدة عناصر رئيسية أو عناصر نصية. يمكن استخدام التعبير xmlvalue IS DOCUMENT لتقييم ما إذا كانت قيمة xml معينة هي ملف كامل أو جزء محتوى.

إنشاء قيمة XML

استخدام الدالة xmlparse: لإنشاء قيمة xml من البيانات النصية:

XMLPARSE (DOCUMENT '<?xml version="1.0"?><book><title>Manual</title><chapter>...</chapter></book>')
XMLPARSE (CONTENT 'abc<foo>bar</foo><bar>foo</bar>')

نوع البيانات JSON

نوع البيانات JSON يمكن استخدامه لتخزين بيانات JSON (JavaScript Object Notation)، ويمكن أيضًا تخزين هذه البيانات ك نص، ولكن نوع البيانات JSON أكثر فائدة في التحقق من أن كل قيمة مخزنة قابلة للاستخدام كقيمة JSON.

إضافة إلى ذلك، هناك وظائف مرتبطة لتعامل بيانات JSON:}

مثالنتيجة مثال
array_to_json('{{1,5},{99,100}}'::int[])[[1,5],[99,100]]
row_to_json(row(1,'foo')){"f1":1,"f2":"foo"}

نوع المصفوفة

PostgreSQL يسمح بتعريف حقول مصفوفات متعددة الأبعاد.

يمكن أن تكون نوع اللائحة أي نوع أساسي أو نوع معرف مسبقًا، أو نوع معرف أو نوع معقد.

إعلان اللائحة

عند إنشاء الجدول، يمكننا إعلان اللائحة بالطريقة التالية:

CREATE TABLE sal_emp (
    name           text,
    pay_by_quarter عدد كامل[],
    جدول الزمني نص[][]
);

pay_by_quarter هو مصفوفة عدد كامل أحادية الأبعاد، وschedule هو مصفوفة نصية ثنائية الأبعاد.

يمكننا أيضًا استخدام كلمة المفتاح "ARRAY"، مثلما هو موضح أدناه:

CREATE TABLE sal_emp (
   الاسم نص,
   pay_by_quarter عدد كامل ARRAY[4],
   جدول الزمني نص[][]
);

قيم المدمجة

تستخدم القيم المدمجة في الدوائر المزدوجة {}، وتم فصل العناصر بالكومياء في {}:

INSERT INTO sal_emp
    VALUES ('Bill',
    '{10000, 10000, 10000, 10000}',
    '{{"meeting", "lunch"}, {"training", "presentation"}}');
INSERT INTO sal_emp
    VALUES ('Carol',
    '{20000, 25000, 25000, 25000}',
    '{{"breakfast", "consulting"}, {"meeting", "lunch"}}');

الوصول إلى اللائحة

الآن يمكننا تشغيل بعض الاستعلامات على هذه الجدول.

أولاً، سنعرض كيفية الوصول إلى عنصر اللائحة. هذه الاستعلام تبحث عن أسماء الموظفين الذين تغيرت رواتبهم في الربع الثاني:

SELECT name FROM sal_emp WHERE pay_by_quarter[1] <> pay_by_quarter[2];
 الاسم
-------
 Carol
(1 سطر)

رقم مؤشر اللائحة مكتوب داخل الدوائر المزدوجة.

تعديل اللائحة

نحن يمكننا تعديل قيم اللائحة:

UPDATE sal_emp SET pay_by_quarter = '{25000,25000,27000,27000}'
    WHERE name = 'Carol';

或者使用 ARRAY 构造器语法:

UPDATE sal_emp SET pay_by_quarter = ARRAY[25000,25000,27000,27000]
    WHERE name = 'Carol';

数组中检索

要搜索一个数组中的数值,你必须检查该数组的每一个值。

比如:

SELECT * FROM sal_emp WHERE pay_by_quarter[1] = 10000 OR
                            pay_by_quarter[2] = 10000 OR
                            pay_by_quarter[3] = 10000 OR
                            pay_by_quarter[4] = 10000;

另外,你可以用下面的语句找出数组中所有元素值都等于 10000 的行:

SELECT * FROM sal_emp WHERE 10000 = ALL (pay_by_quarter);

或者,可以使用 generate_subscripts 函数。例如:

SELECT * FROM
   (SELECT pay_by_quarter,
           generate_subscripts(pay_by_quarter, 1) AS s
      FROM sal_emp) AS foo
 WHERE pay_by_quarter[s] = 10000;

复合类型

复合类型表示一行或者一条记录的结构; 它实际上只是一个字段名和它们的数据类型的列表。PostgreSQL 允许像简单数据类型那样使用复合类型。比如,一个表的某个字段可以声明为一个复合类型。

声明复合类型

下面是两个定义复合类型的简单实例:

CREATE TYPE complex AS (
    r       double precision,
    i       double precision
);
CREATE TYPE inventory_item AS (
    name           text,
    supplier_id     integer,
    price           numeric
);

语法类似于 CREATE TABLE,只是这里只可以声明字段名字和类型。

定义了类型,我们就可以用它创建表:

CREATE TABLE on_hand (
    item inventory_item
    count integer
);
INSERT INTO on_hand VALUES (ROW('fuzzy dice', 42, 1.99), 1000);

إدخال قيمة النوع المدمج

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

يكون شكل قيمة النوع المدمج العامة كالتالي:

'(val1, val2, ...)'

مثالًا:

'("fuzzy dice",42,1.99)'

زيارة النوع المدمج

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

SELECT item.name FROM on_hand WHERE item.price > 9.99;

لن يعمل هذا، لأنه وفقًا لقواعد SQL، item يتم اختياره من اسم الجدول، وليس من اسم الحقل. يجب عليك كتابة مثلما يلي:

SELECT (item).name FROM on_hand WHERE (item).price > 9.99;

أو إذا كنت بحاجة أيضًا إلى استخدام اسم الجدول (مثل، في استعلام متعدد الجداول)، يمكنك كتابة:

SELECT (on_hand.item).name FROM on_hand WHERE (on_hand.item).price > 9.99;

الآن يتم تحليل الكيان المدمج في الأقواس بشكل صحيح كإشارة إلى حقل item، ثم يمكن اختيار المجالات منه.

نوع النطاق

نوع البيانات النطاق يمثل القيم في نطاق معين من نوع عنصر معين.

على سبيل المثال، قد يستخدم نطاق الزمن لت不代表 قاعة اجتماعات مخصصة لفترة معينة.

تضم PostgreSQL أنواع نطاقات مدمجة مثل:

  • int4range — مساحة integer

  • int8range — مساحة bigint

  • numrange — مساحة عددية

  • tsrange — الزمن بدون التوقيت المناطقي لمساحة الزمن

  • tstzrange — الزمن مع التوقيت المناطقي لمساحة الزمن

  • daterange — نطاق التاريخ

بالإضافة إلى ذلك، يمكنك تعريف نوع نطاق خاص بك.

CREATE TABLE reservation (room int, during tsrange);
INSERT INTO reservation VALUES
    (1108, '[2010-01-01 14:30, 2010-01-01 15:30)');
-- يحتوي
SELECT int4range(10, 20) @> 3;
-- التداخل
SELECT numrange(11.1, 22.2) && numrange(20.0, 30.0);
-- استخراج الحد العلوي
SELECT upper(int8range(15, 25));
-- حساب التداخل
SELECT int4range(10, 20) * int4range(15, 25);
-- ما إذا كان النطاق فارغًا
SELECT isempty(numrange(1, 5));

يجب اتباع النمط التالي لإدخال قيم النطاق:

(الحد السفلي، الحد العلوي)
(الحد السفلي، الحد العلوي]
[الحد السفلي، الحد العلوي)
[الحد السفلي، الحد العلوي]
空的

تظهر الأقواس العريضة أو المربعة الحدود السفلية والعلوية غير المضمونة أو المضمونة. يرجى ملاحظة أن النمط النهائي هو فارغ، مما يمثل نطاقًا فارغًا (نطاقًا لا يحتوي على قيم).

-- يشمل 3 ولا يشمل 7، ويشمل جميع النقاط بينهما
SELECT '[3,7)'::int4range;
-- لا يشمل 3 و7، ولكن يشمل جميع النقاط بينهما
SELECT '(3,7)'::int4range;
-- يشمل فقط القيمة 4
SELECT '[4,4]'::int4range;
-- لا يشمل النقطة (تم استبدالها بـ '空的')
SELECT '[4,4)'::int4range;

نوع معرف العنصر

يستخدم PostgreSQL معرف العنصر (OID) كمفتاح رئيسي في مختلف جداول النظام.

في نفس الوقت، لن يضيف النظام حقل OID النظام إلى الجداول التي أنشأها المستخدم (ما لم يتم تضمين WITH OIDS أو إعداد المعلمة default_with_oids على التشغيل). يمثل نوع OID معرف عنصر. بالإضافة إلى ذلك، لدى OID عدة أسماء مستعارة: regproc، regprocedure، regoper، regoperator، regclass، regtype، regconfig، وregdictionary.

الاسممرجعوصفمثال عدد
oidأيمعرف الكائن المُرقم564182
regprocpg_procاسم الوظيفةsum
regprocedurepg_procوظائف معادلة النوعsum(int4)
regoperpg_operatorاسم العملي+
regoperatorpg_operatorعمليات معادلة النوع(عددي،عددي) أو -(لا شيء،عددي)
regclasspg_classاسم العلاقةpg_type
regtypepg_typeاسم نوع البياناتعددي
regconfigpg_ts_configإعدادات البحث النصيإنجليزي
regdictionarypg_ts_dictقاموس البحث النصيبسيط

أنواع المزيفة

يحتوي نظام أنواع PostgreSQL على مجموعة من المدخلات الخاصة المستخدمة، وتُدعى هذه المدخلات أنواع مزيفة. لا يمكن استخدام أنواع المزيفة كنوع للحقول، ولكن يمكن استخدامها لتحديد نوع معاملات وظيفة أو ناتجها. تكون أنواع المزيفة مفيدة عندما لا تُقبل وظيفة ببساطة نوع بيانات SQL معين.

يُظهر الجدول أدناه جميع أنواع المزيفة:

الاسموصف
anyيعبر عن وظيفة تستقبل أي نوع بيانات إدخال.
anyelementيعبر عن وظيفة تستقبل أي نوع بيانات.
anyarrayيعبر عن وظيفة تستقبل أي نوع مصفوفة.
anynonarrayيعبر عن وظيفة تستقبل أي نوع غير مصفوفة.
anyenumيعبر عن وظيفة تستقبل أي نوع قائمة.
anyrangeيعبر عن وظيفة تستقبل أي نوع بيانات.
cstringيعبر عن وظيفة تستقبل أو تعود سلسلة C مُنتهية بكارتر.
داخلييعبر عن وظيفة تستقبل أو تعود نوع بيانات داخلي.
language_handlerيُعلن عن معالج لغة عملية لتكون مُعادلة language_handler.
fdw_handlerيُعلن عن وحدة بيانات خارجية لتكون مُعادلة fdw_handler.
سجليُشير إلى وظيفة تعود بنوع سطر غير مُعلن.
ترiggerيُعلن عن وظيفة الترigger.
لا شيءيعبر عن وظيفة لا تعود بمعدل.
غير شفافنوع قديم، كان يستخدم لجميع هذه الاستخدامات السابقة.