PgSQL - 学習ノート 17: サブクエリ

目次

PostgreSQLのサブクエリ

SELECT ステートメントでのサブクエリの使用法

INSERT ステートメントでのサブクエリの使用法

UPDATE ステートメントでのサブクエリの使用法

DELETE ステートメントでのサブクエリの使用法


PostgreSQLのサブクエリ

  • サブクエリは内部クエリまたはネストされたクエリとも呼ばれ、PostgreSQL クエリの WHERE 句にクエリ ステートメントを埋め込むことを指します。
  • 1 つの SELECT ステートメントのクエリ結果は、別のステートメントの入力値として使用できます。
  • サブクエリは、SELECT、INSERT、UPDATE、DELETE ステートメントで使用でき、=、<、>、>=、<=、IN、BETWEEN などの演算子を使用できます。

サブクエリが従う必要のあるルールをいくつか示します。

  • サブクエリは括弧で囲む必要があります。
  • サブクエリの選択された列と比較されるメイン クエリに複数の列がある場合を除き、サブクエリの SELECT 句には 1 つの列のみを含めることができます。
  • ORDER BY はメインクエリでは使用できますが、サブクエリでは使用できません。
  • GROUP BY はサブクエリで使用でき、ORDER BY と同じ機能を持ちます。
  • サブクエリは複数の行を返し、 IN 演算子などの複数値演算子でのみ使用できます。
  • BETWEEN 演算子はサブクエリでは使用できませんが、BETWEEN はサブクエリ内で使用できます。

SELECT ステートメントでのサブクエリの使用法

サブクエリは、SELECT ステートメントとともによく使用されます。基本的な構文は次のとおりです。

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

INSERT ステートメントでのサブクエリの使用法

サブクエリは INSERT ステートメントでも使用できます。INSERT ステートメントは、サブクエリによって返されたデータを使用して別のテーブルに挿入します。

サブクエリで選択されたデータは、任意の文字、日付、または数値関数を使用して変更できます。基本的な構文は次のとおりです。

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

UPDATE ステートメントでのサブクエリの使用法

サブクエリは UPDATE ステートメントと組み合わせて使用​​できます。UPDATE ステートメントでサブクエリを使用すると、テーブル内の 1 つまたは複数の列が更新されます。基本的な構文は次のとおりです。

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

DELETE ステートメントでのサブクエリの使用法

サブクエリは、前述の他のステートメントと同様に、DELETE ステートメントと組み合わせて使用​​できます。基本的な構文は次のとおりです。

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

例:

mydb=# select * from company;
 id | name  | age |                      address                       | salary | join_date
----+-------+-----+----------------------------------------------------+--------+-----------
  1 | Paul  |  32 | California                                         |  20000 |
  3 | Teddy |  23 | Norway                                             |  20000 |
  5 | David |  27 | South-Hall                                         |  85000 |
  8 | Paul  |  24 | Houston                                            |  20000 |
  9 | James |  44 | Norway                                             |   5000 |
 10 | James |  45 | Texas                                              |   5000 |
  6 | Kim   |  22 |                                                    |        |
  7 | James |  24 |                                                    |        |
(8 行记录)

/*1、在 SELECT 语句中使用子查询:*/
mydb=# SELECT * FROM COMPANY WHERE ID IN (SELECT ID FROM COMPANY  WHERE SALARY > 45000) ;
 id | name  | age |                      address                       | salary | join_date
----+-------+-----+----------------------------------------------------+--------+-----------
  5 | David |  27 | South-Hall                                         |  85000 |
(1 行记录)

/*假设 COMPANY1 的结构与 COMPANY 表相似,且可使用相同的 CREATE TABLE 进行创建,只是表名改为 COMPANY1。*/
/*2、现在把整个 COMPANY 表复制到 COMPANY1,语法如下:*/
mydb=# INSERT INTO COMPANY1 SELECT * FROM COMPANY  WHERE ID IN (SELECT ID FROM COMPANY) ;
INSERT 0 8

/*假设,我们有 COMPANY1 表,是 COMPANY 表的备份。*/
/*2、下面的实例把 COMPANY 表中所有 AGE 大于 27 的客户的 SALARY 更新为原来的 0.50 倍:*/
mydb=# UPDATE COMPANY SET SALARY = SALARY * 0.50 WHERE AGE IN (SELECT AGE FROM COMPANY1 WHERE AGE >= 27 );
UPDATE 4
mydb=# select * from company1;
 id | name  | age |                      address                       | salary | join_date
----+-------+-----+----------------------------------------------------+--------+-----------
  3 | Teddy |  23 | Norway                                             |  20000 |
  8 | Paul  |  24 | Houston                                            |  20000 |
  6 | Kim   |  22 |                                                    |        |
  7 | James |  24 |                                                    |        |
  1 | Paul  |  32 | California                                         |  10000 |
  5 | David |  27 | South-Hall                                         |  42500 |
  9 | James |  44 | Norway                                             |   2500 |
 10 | James |  45 | Texas                                              |   2500 |
(8 行记录)

/*假设,我们有 COMPANY_BKP 表,是 COMPANY 表的备份。/*
/*4、下面的实例删除 COMPANY 表中所有 AGE 大于或等于 27 的客户记录:*/
mydb=# DELETE FROM COMPANY WHERE AGE IN (SELECT AGE FROM COMPANY1 WHERE AGE > 27 );
DELETE 3
mydb=# select * from company;
 id | name  | age |                      address                       | salary | join_date
----+-------+-----+----------------------------------------------------+--------+-----------
  5 | David |  27 | South-Hall                                         |  21250 |
  3 | Teddy |  23 | Norway                                             |  20000 |
  8 | Paul  |  24 | Houston                                            |  20000 |
  6 | Kim   |  22 |                                                    |        |
  7 | James |  24 |                                                    |        |
(5 行记录)

おすすめ

転載: blog.csdn.net/qq_41361442/article/details/124867527