WHERE 절을 활용한 실제 행 수 조건 처리
MySQL에서는 WHERE 절 안에 COUNT(*)를 포함하는 하위 쿼리를 사용하여 테이블의 실제 행 수를 조건으로 활용할 수 있습니다. 이 방식을 사용하면 테이블의 전체 행 수가 특정 값일 때만 결과를 반환하도록 쿼리를 제어할 수 있습니다.
기본 문법
SELECT yourColumnName1,yourColumnName2,...N FROM yourTableName WHERE ( SELECT COUNT(*) FROM yourTableName )=2;
위 쿼리는 테이블의 전체 행 수가 정확히 2개일 때만 모든 행을 반환하며, 그렇지 않은 경우에는 빈 결과 집합(Empty Set)을 출력합니다.
예제 테이블 생성
개념을 쉽게 이해하기 위해 먼저 테이블을 하나 생성해 보겠습니다.
mysql> create table CountWithSubqueryDemo - > ( - > Id int NOT NULL AUTO_INCREMENT PRIMARY KEY, - > EmployeeName varchar(20) - > ); Query OK, 0 rows affected (2.09 sec)
INSERT 명령어를 사용해 몇 개의 레코드를 삽입합니다.
mysql> insert into CountWithSubqueryDemo(EmployeeName) values('John');
Query OK, 1 row affected (0.54 sec)
mysql> insert into CountWithSubqueryDemo(EmployeeName) values(NULL);
Query OK, 1 row affected (0.36 sec)
mysql> insert into CountWithSubqueryDemo(EmployeeName) values('Carol');
Query OK, 1 row affected (0.23 sec)
mysql> insert into CountWithSubqueryDemo(EmployeeName) values('');
Query OK, 1 row affected (0.31 sec)
mysql> insert into CountWithSubqueryDemo(EmployeeName) values('Bob');
Query OK, 1 row affected (1.24 sec)
mysql> insert into CountWithSubqueryDemo(EmployeeName) values(NULL);
Query OK, 1 row affected (0.30 sec)
mysql> insert into CountWithSubqueryDemo(EmployeeName) values('Sam');
Query OK, 1 row affected (0.18 sec)
mysql> insert into CountWithSubqueryDemo(EmployeeName) values('Mike');
Query OK, 1 row affected (0.18 sec)
mysql> insert into CountWithSubqueryDemo(EmployeeName) values('James');
Query OK, 1 row affected (0.26 sec)SELECT 문으로 테이블의 모든 레코드를 조회해 보겠습니다.
mysql> select *from CountWithSubqueryDemo;
실행 결과는 다음과 같습니다.
+----+--------------+ | Id | EmployeeName | +----+--------------+ | 1 | John | | 2 | NULL | | 3 | Carol | | 4 | | | 5 | Bob | | 6 | NULL | | 7 | Sam | | 8 | Mike | | 9 | James | +----+--------------+ 9 rows in set (0.19 sec)
WHERE 절에서 행 수 사용하기
다음은 WHERE 절에서 실제 행 수를 사용하는 방법입니다.
mysql> select Id,EmployeeName from CountWithSubqueryDemo - > where - > ( - > select count(*) from CountWithSubqueryDemo - > )=2; Empty set (0.03 sec)
위 쿼리에서 빈 결과 집합이 반환된 이유는, 테이블에 정확히 두 개의 레코드가 있을 때만 행을 반환하도록 조건을 설정했기 때문입니다. 현재 테이블에는 9개의 레코드가 존재하므로 아무런 결과도 반환되지 않습니다.
따라서 테이블의 모든 레코드를 삭제한 후, 2개의 레코드만 다시 삽입해 보겠습니다.
mysql> truncate table CountWithSubqueryDemo; Query OK, 0 rows affected (1.95 sec)
mysql> insert into CountWithSubqueryDemo(EmployeeName) values('James');
Query OK, 1 row affected (0.15 sec)
mysql> insert into CountWithSubqueryDemo(EmployeeName) values(NULL);
Query OK, 1 row affected (0.46 sec)변경된 테이블의 전체 레코드를 다시 조회합니다.
mysql> select *from CountWithSubqueryDemo;
+----+--------------+ | Id | EmployeeName | +----+--------------+ | 1 | James | | 2 | NULL | +----+--------------+ 2 rows in set (0.00 sec)
행 수 조건이 적용된 최종 쿼리 실행
이제 다시 WHERE 절에서 행 수를 사용하는 쿼리를 실행해 보겠습니다.
mysql> select Id,EmployeeName from CountWithSubqueryDemo - > where - > ( - > select count(*) from CountWithSubqueryDemo - > )=2;
실행 결과는 다음과 같습니다.
+----+--------------+ | Id | EmployeeName | +----+--------------+ | 1 | James | | 2 | NULL | +----+--------------+ 2 rows in set (0.00 sec)
테이블의 전체 행 수가 정확히 2개이므로, 이번에는 모든 행이 정상적으로 반환되었습니다. 이처럼 WHERE 절 내의 하위 쿼리에서 COUNT(*)를 비교하면, 테이블의 실제 행 수에 따라 쿼리 결과를 유연하게 제어할 수 있습니다.