하위 쿼리는 테이블을 반환합니다.
마지막으로 세 번째 옵션은 하위 쿼리가 전체 테이블을 반환하는 경우입니다. 이것은 가장 일반적인 옵션입니다.
특정 테이블을 약간 조정하고 싶은 상황이 매우 자주 있습니다. 그런 다음 수정된 테이블을 다른 테이블과 조인(JOIN ON 연산자 사용)합니다.
JOIN으로 두 테이블을 조인하는 가장 간단한 경우부터 시작하겠습니다.
SELECT * FROM employee e JOIN task t ON e.id = t.emploee_id
그리고 기억하시겠지만 작업 테이블에는 아무에게도 할당되지 않은 작업이 있습니다. employee_id 는 NULL 입니다 .
수정된 테이블을 생성해 보겠습니다 . 여기에서 우리는 모든 중단된 작업을 감독(그의 ID = 4)에게 할당합니다.
이를 위해 IFNULL() 함수를 사용합니다 .
SELECT id, IFNULL(employee_id, 4) AS employee_id, name, deadline FROM task
그리고 이 쿼리의 결과는 다음과 같습니다.
ID | employee_id | 이름 | 마감 시간 |
---|---|---|---|
1 | 1 | 프런트엔드의 버그 수정 | 2022-06-01 |
2 | 2 | 백엔드의 버그 수정 | 2022-06-15 |
삼 | 5 | 커피를 사다 | 2022-07-01 |
4 | 5 | 커피를 사다 | 2022-08-01 |
5 | 5 | 커피를 사다 | 2022-09-01 |
6 | 4 | 사무실을 청소하다 | (없는) |
7 | 4 | 즐거운 삶 | (없는) |
8 | 6 | 즐거운 삶 | (없는) |
수정된 셀은 빨간색으로 표시됩니다.
이제 수정된 테이블을 쿼리로 대체해 보겠습니다.
SELECT * FROM employee e JOIN task t ON e.id = t.emploee_id
작업 테이블 대신 .
이러한 요청은 다음과 같습니다.
SELECT * FROM employee e JOIN ( SELECT id, IFNULL(employee_id, 4) AS employee_id, name, deadline FROM task ) t ON e.id = t.emploee_id
task 라는 단어 대신 괄호를 쓰고 그 안에 요청 본문을 넣었습니다.
그런데 중첩 쿼리의 별칭 t (alias)가 매우 유용했습니다. 중첩 쿼리는 테이블과 달리 자체 이름이 없으므로 별칭이 매우 적합하지 않습니다.
다음은 이러한 쿼리의 결과입니다.
ID | 이름 | 직업 | 샐러리 | 나이 | 가입 날짜 | ID | employee_id | 이름 |
---|---|---|---|---|---|---|---|---|
1 | 이바노프 이반 | 프로그램 제작자 | 100000 | 25 | 2012-06-30 | 1 | 1 | 프런트엔드의 버그 수정 |
2 | 페트로프 페트르 | 프로그램 제작자 | 80000 | 23 | 2013-08-12 | 2 | 2 | 백엔드의 버그 수정 |
4 | 라비노비치 모이샤 | 감독 | 200000 | 35 | 2015-05-12 | 6 | 4 | 사무실을 청소하다 |
4 | 라비노비치 모이샤 | 감독 | 200000 | 35 | 2015-05-12 | 7 | 4 | 즐거운 삶 |
5 | 키리엔코 아나스타샤 | 사무실 관리자 | 40000 | 25 | 2015년 10월 10일 | 4 | 5 | 커피를 사다 |
5 | 키리엔코 아나스타샤 | 사무실 관리자 | 40000 | 25 | 2015년 10월 10일 | 5 | 5 | 커피를 사다 |
5 | 키리엔코 아나스타샤 | 사무실 관리자 | 40000 | 25 | 2015년 10월 10일 | 삼 | 5 | 커피를 사다 |
6 | 바스카 | 고양이 | 1000 | 삼 | 2018-11-11 | 8 | 6 | 즐거운 삶 |
우리 이사는 "사무실 청소"라는 임무를 가지고 있습니다. 빨리 위임 할 사람을 찾을 것 같습니다 :) WITH 연산자 사용
그건 그렇고, MySQL 버전 8부터는 더 이상 모든 하위 쿼리를 최종 쿼리에 바로 넣을 필요가 없습니다. 별도로 수행할 수 있습니다. 이를 위해 WITH 문이 사용됩니다 .
이를 통해 가상 테이블(명명된 쿼리)을 생성할 수 있으며 그 모양은 템플릿에 의해 지정됩니다.
WITH Name AS (request)
고유한 이름을 할당하지 않은 COUNT(*)와 같이 하위 쿼리에 이름이 지정되지 않은 열이 있는 경우가 종종 있습니다. 이 경우 WITH 문에는 하위 쿼리에 대한 새 열 이름을 지정하는 옵션이 있습니다.
두 번째 형식은 템플릿에 의해 제공됩니다.
WITH Name(column1, column2, …) AS (request)
원하는 만큼 가상 테이블(명명된 쿼리)을 사용하고 서로 참조할 수 있습니다. 요청의 일반적인 형식은 다음과 같습니다.
WITH name1 AS (request1), name2 AS (request2), name3 AS (request3) SELECT * FROM name1 JOIN name2 ON …
이제 우리의 무서운 질문을 해보자:
SELECT * FROM employee e JOIN ( SELECT id, IFNULL(employee_id, 4) AS employee_id, name, deadline FROM task ) t ON e.id = t.emploee_id
그리고 WITH 문을 사용하여 다시 작성하십시오.
WITH task2(id, employee_id, name, deadline) AS (SELECT id, IFNULL(employee_id, 4), name, deadline FROM task) SELECT * FROM employee e JOIN task2 t ON e.id = t.emploee_id
또는 열 이름 없이 할 수 있지만 IFNULL() 함수에 대한 별칭을 지정해야 합니다.
WITH task2 AS ( SELECT id, IFNULL(employee_id, 4) AS employee_id, name, deadline FROM task ) SELECT * FROM employee e JOIN task2 t ON e.id = t.emploee_id
GO TO FULL VERSION