目次
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 行记录)