PostgreSQL - Alt Sorgular

Alt sorgu veya İç sorgu veya İç içe sorgu, başka bir PostgreSQL sorgusu içindeki ve WHERE yan tümcesine gömülü olan bir sorgudur.

Bir alt sorgu, alınacak verileri daha da kısıtlamak için bir koşul olarak ana sorguda kullanılacak verileri döndürmek için kullanılır.

Alt sorgular SELECT, INSERT, UPDATE ve DELETE ifadeleriyle birlikte =, <,>,> =, <=, IN, vb. Gibi işleçlerle kullanılabilir.

Alt sorguların uyması gereken birkaç kural vardır -

  • Alt sorgular parantez içine alınmalıdır.

  • Alt sorgunun seçili sütunlarını karşılaştırmak için ana sorguda birden çok sütun olmadığı sürece, bir alt sorgunun SELECT yan tümcesinde yalnızca bir sütun olabilir.

  • ORDER BY, bir alt sorguda kullanılamaz, ancak ana sorgu ORDER BY kullanabilir. GROUP BY, bir alt sorguda ORDER BY ile aynı işlevi gerçekleştirmek için kullanılabilir.

  • Birden fazla satır döndüren alt sorgular yalnızca IN, EXISTS, NOT IN, ANY / SOME, ALL operatörü gibi birden çok değer operatörüyle kullanılabilir.

  • BETWEEN operatörü bir alt sorgu ile kullanılamaz; ancak, BETWEEN alt sorgu içinde kullanılabilir.

SELECT İfadesine sahip alt sorgular

Alt sorgular en çok SELECT deyimiyle kullanılır. Temel sözdizimi aşağıdaki gibidir -

SELECT column_name [, column_name ]
FROM   table1 [, table2 ]
WHERE  column_name OPERATOR
      (SELECT column_name [, column_name ]
      FROM table1 [, table2 ]
      [WHERE])

Misal

Aşağıdaki kayıtlara sahip ŞİRKET tablosunu düşünün -

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)

Şimdi, aşağıdaki alt sorguyu SELECT deyimi ile kontrol edelim -

testdb=# SELECT *
   FROM COMPANY
   WHERE ID IN (SELECT ID
      FROM COMPANY
      WHERE SALARY > 45000) ;

Bu, aşağıdaki sonucu verecektir -

id | name  | age |  address    | salary
----+-------+-----+-------------+--------
  4 | Mark  |  25 | Rich-Mond   |  65000
  5 | David |  27 | Texas       |  85000
(2 rows)

INSERT İfadesine sahip alt sorgular

Alt sorgular ayrıca INSERT deyimleriyle de kullanılabilir. INSERT deyimi, başka bir tabloya eklemek için alt sorgudan döndürülen verileri kullanır. Alt sorgudaki seçilen veriler karakter, tarih veya sayı işlevlerinden herhangi biri ile değiştirilebilir.

Temel sözdizimi aşağıdaki gibidir -

INSERT INTO table_name [ (column1 [, column2 ]) ]
   SELECT [ *|column1 [, column2 ] ]
   FROM table1 [, table2 ]
   [ WHERE VALUE OPERATOR ]

Misal

COMPANY tablosu ile benzer yapıya sahip bir COMPANY_BKP tablosu düşünün ve tablo adı olarak COMPANY_BKP kullanılarak aynı CREATE TABLE kullanılarak oluşturulabilir. Şimdi, COMPANY tablosunun tamamını COMPANY_BKP içine kopyalamak için, sözdizimi aşağıdadır -

testdb=# INSERT INTO COMPANY_BKP
   SELECT * FROM COMPANY
   WHERE ID IN (SELECT ID
      FROM COMPANY) ;

UPDATE İfadesine sahip alt sorgular

Alt sorgu, UPDATE ifadesiyle birlikte kullanılabilir. UPDATE deyimiyle bir alt sorgu kullanıldığında, bir tablodaki tek veya birden çok sütun güncellenebilir.

Temel sözdizimi aşağıdaki gibidir -

UPDATE table
SET column_name = new_value
[ WHERE OPERATOR [ VALUE ]
   (SELECT COLUMN_NAME
   FROM TABLE_NAME)
   [ WHERE) ]

Misal

Varsayalım ki, COMPANY tablosunun yedeği olan COMPANY_BKP tablosumuz var.

Aşağıdaki örnek, AGE'si 27 veya daha büyük olan tüm müşteriler için ŞİRKET tablosundaki MAAŞ'ı 0,50 kez günceller -

testdb=# UPDATE COMPANY
   SET SALARY = SALARY * 0.50
   WHERE AGE IN (SELECT AGE FROM COMPANY_BKP
      WHERE AGE >= 27 );

Bu, iki satırı etkiler ve son olarak ŞİRKET tablosu aşağıdaki kayıtlara sahip olur -

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

DELETE İfadesine sahip alt sorgular

Alt sorgu, yukarıda belirtilen diğer tüm ifadelerde olduğu gibi DELETE ifadesi ile birlikte kullanılabilir.

Temel sözdizimi aşağıdaki gibidir -

DELETE FROM TABLE_NAME
[ WHERE OPERATOR [ VALUE ]
   (SELECT COLUMN_NAME
   FROM TABLE_NAME)
   [ WHERE) ]

Misal

Varsayalım ki, COMPANY tablosunun yedeği olan COMPANY_BKP tablosumuz var.

Aşağıdaki örnek, AGE'si 27 veya daha büyük olan tüm müşteriler için COMPANY tablosundaki kayıtları siler -

testdb=# DELETE FROM COMPANY
   WHERE AGE IN (SELECT AGE FROM COMPANY_BKP
      WHERE AGE > 27 );

Bu, iki satırı etkiler ve son olarak ŞİRKET tablosu aşağıdaki kayıtlara sahip olur -

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