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

دليل أساسي PostgreSQL

دليل متقدم PostgreSQL

واجهة PostgreSQL

قسمة WITH PostgreSQL

في PostgreSQL، توفر جملة WITH طريقة لكتابة جملة مساعدة يمكن استخدامها في استعلامات أكبر.

تساعد جملة WITH في تقسيم الاستعلامات المعقدة والمتطولة إلى أشكال بسيطة، مما يسهل القراءة. هذه الجمل تُعرف عادةً بـ Common Table Expressions (CTE)، ويمكن أن تكون أيضًا جدولًا مؤقتًا للاستعلام.

تساعد جملة WITH بشكل خاص في تنفيذ العبارات الفرعية عدة مرات، مما يسمح لنا باستخدام اسمها (ربما مرات متعددة) في الاستعلام.

يجب تعريف جملة WITH قبل استخدامها.

القواعد

القواعد الأساسية للجملة WITH كالتالي:

WITH
   name_for_summary_data AS (
      SELECT Statement)
   SELECT columns
   FROM name_for_summary_data
   WHERE conditions <=> (
      SELECT column
      FROM name_for_summary_data)
   [ORDER BY columns]

name_for_summary_data هو اسم جملة WITH،name_for_summary_data يمكن أن يكون الاسم نفسه للجدول الموجود، وله أولوية.

يمكن استخدام جمل INSERT, UPDATE أو DELETE في WITH، مما يسمح لك بإجراء عدة عمليات مختلفة في نفس الاستعلام.

WITH متكرر

يمكن استخدام بيانات الناتج الخاصة بالـ WITH في جملة WITH.

تعبير الجدول العام (CTE) يمتلك ميزة مهمة وهي القدرة على الاستعانة بنفسه لإنشاء CTE متكرر. CTE المتكرر هو تعبير جدول عام يعيد تنفيذ نفسه مرة أخرى لتحقيق مجموعة بيانات فرعية حتى يتم الحصول على مجموعة بيانات كاملة.

مثال علىlinedemo

إنشاء جدول COMPANY (تحميل ملف SQL الخاص بـ COMPANY ),محتويات البيانات كالتالي:

w3codeboxdb# select * from COMPANY;
 id | name  | age | address   | salary
----+-------+-----+-----------+--------
  1 | Paul  |  32 | California|  20000
  2 | Allen |  25 | Texas     |  15000
  3 | Teddy |  23 | Norway    |  20000
  4 | Mark  |  25 | Rich-Mond |  65000
  5 | David |  27 | Texas     |  85000
  6 | Kim   |  22 | South-Hall|  45000
  7 | James |  24 | Houston   |  10000
(7 rows)

سنستخدم جملة WITH لاستعلام البيانات في الجدول السابق:

With CTE AS
(Select
 ID
, NAME
, AGE
, ADDRESS
, SALARY
FROM COMPANY )
Select * From CTE;

الحصول على النتيجة كالتالي:

id | name  | age | address   | salary
----+-------+-----+-----------+--------
  1 | Paul  |  32 | California|  20000
  2 | Allen |  25 | Texas     |  15000
  3 | Teddy |  23 | Norway    |  20000
  4 | Mark  |  25 | Rich-Mond |  65000
  5 | David |  27 | Texas     |  85000
  6 | Kim   |  22 | South-Hall|  45000
  7 | James |  24 | Houston   |  10000
(7 rows)

سنستخدم الآن: RECURSIVE كتابة استعلام باستخدام الكلمات المفتاحية وWITH للبحث عن: SALARY (الراتب) البيانات التي يقل طولها عن 20000 وتحديد مجموعها:

WITH RECURSIVE t(n) AS (
   VALUES (0)
   UNION ALL
   SELECT SALARY FROM COMPANY WHERE SALARY < 20000
)
SELECT sum(n) FROM t;

الحصول على النتيجة كالتالي:

 sum
-------
 25000
(1 row)

سنقوم الآن بإنشاء جدول COMPANY1 مشابه لجدول COMPANY، باستخدام جملة DELETE و子جملة WITH لإزالة بيانات جدول COMPANY: SALARY (الراتب) البيانات التي يبلغ طولها 30000 أو أكثر، ويتم إدراج البيانات المزالة في جدول COMPANY1، لتحقيق نقل بيانات جدول COMPANY إلى جدول COMPANY1:

CREATE TABLE COMPANY1(
   ID INT PRIMARY KEY NOT NULL,
   NAME TEXT NOT NULL,
   AGE INT NOT NULL,
   ADDRESS CHAR(50),
   SALARY REAL
);
WITH moved_rows AS (
   DELETE FROM COMPANY
   WHERE
      SALARY >= 30000
   RETURNING *
)
INSERT INTO COMPANY1 (SELECT * FROM moved_rows);

الحصول على النتيجة كالتالي:

INSERT 0 3

في هذه اللحظة، بيانات جدول CAMPANY و CAMPANY1 كالتالي:

w3codeboxdb=# SELECT * FROM COMPANY;
 id | name | age | address | salary
----+-------+-----+------------+--------
  1 | Paul | 32 | California | 20000
  2 | Allen | 25 | Texas | 15000
  3 | Teddy | 23 | Norway | 20000
  7 | James | 24 | Houston | 10000
(4 أسطر)
w3codeboxdb=# SELECT * FROM COMPANY1;
 id | name | age | address | salary
----+-------+-----+-------------+--------
  4 | Mark | 25 | Rich-Mond | 65000
  5 | David | 27 | Texas | 85000
  6 | Kim | 22 | South-Hall | 45000
(3 أسطر)