Loading...
MySQL 9.5 Reference Manual 9.5의 15.2.13 SELECT Statement의 한국어 번역본입니다.
아래의 경우에 피드백에서 신고해주신다면 반영하겠습니다.
감사합니다 :)
15.2.13.1 SELECT ... INTO Statement 15.2.13.2 JOIN Clause
1SELECT 2 [ALL | DISTINCT | DISTINCTROW ] 3 [HIGH_PRIORITY] 4 [STRAIGHT_JOIN] 5 [SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT] 6 [SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS] 7 select_expr [, select_expr] ... 8 [into_option] 9 [FROM table_references [PARTITION partition_list]] 10 [WHERE where_condition] 11 [GROUP BY [ {col_name | expr | position}, ... [WITH ROLLUP] 12 | ROLLUP ({col_name | expr | position}, ...)] ] 13 [HAVING where_condition] 14 [WINDOW window_name AS (window_spec) 15 [, window_name AS (window_spec)] ...] 16 [ORDER BY {col_name | expr | position} 17 [ASC | DESC], ... [WITH ROLLUP]] 18 [LIMIT {[offset,] row_count | row_count OFFSET offset}] 19 [into_option] 20 [FOR {UPDATE | SHARE} 21 [OF tbl_name [, tbl_name] ...] 22 [NOWAIT | SKIP LOCKED] 23 | LOCK IN SHARE MODE] 24 [into_option] 25 26into_option: { 27 INTO OUTFILE 'file_name' 28 [CHARACTER SET charset_name] 29 export_options 30 | INTO DUMPFILE 'file_name' 31 | INTO var_name [, var_name] ... 32} 33 34export_options: 35 [{FIELDS | COLUMNS} 36 [TERMINATED BY 'string'] 37 [[OPTIONALLY] ENCLOSED BY 'char'] 38 [ESCAPED BY 'char'] 39 ] 40 [LINES 41 [STARTING BY 'string'] 42 [TERMINATED BY 'string'] 43 ]
SELECT는 하나 이상의 테이블에서 선택된 행을 가져오는 데 사용되며,
UNION 연산과 서브쿼리를 포함할 수 있습니다.
INTERSECT 및
EXCEPT 연산 또한 지원됩니다.
UNION,
INTERSECT, 그리고 EXCEPT
연산자에 대해서는 이 섹션 뒷부분에서 더 자세히 설명합니다.
또한 Section 15.2.15, “Subqueries”도 참조하십시오.
SELECT 문은 시작 부분에
WITH 절을 사용하여
해당 SELECT 내에서 접근 가능한
공통 테이블 표현식을 정의할 수 있습니다.
Section 15.2.20, “WITH (Common Table Expressions)”를 참조하십시오.
SELECT 문에서 가장 흔히 사용되는 절은 다음과 같습니다:
각 select_expr 는 가져오려는 컬럼을 나타냅니다.
최소한 하나의 select_expr 가 있어야 합니다.
table_references 는 행을 가져올 테이블(들)을 나타냅니다.
해당 구문은 Section 15.2.13.2, “JOIN Clause”에 설명되어 있습니다.
SELECT는 테이블 이름 뒤의
table_reference 에 이어 파티션 또는 서브파티션 (또는 둘 다)의 목록과 함께
PARTITION 절을 사용하여 명시적인 파티션 선택을 지원합니다
(참조: Section 15.2.13.2, “JOIN Clause”).
이 경우, 지정된 파티션에서만 행이 선택되고, 테이블의 다른 파티션은 무시됩니다.
자세한 정보와 예시는 Section 26.5, “Partition Selection”을 참조하십시오.
WHERE 절이 주어지면, 선택될 행이 만족해야 하는 조건을 나타냅니다.
where_condition 은 선택할 각 행에 대해 true로 평가되는 표현식입니다.
WHERE 절가 없으면 문은 모든 행을 선택합니다.
WHERE 표현식에서는 MySQL이 지원하는 함수와 연산자를 사용할 수 있지만,
집계(그룹) 함수는 사용할 수 없습니다.
Section 11.5, “Expressions” 및
Chapter 14, Functions and Operators를 참조하십시오.
SELECT는 테이블을 참조하지 않고
계산된 행을 가져오는 데도 사용할 수 있습니다.
예:
1mysql> SELECT 1 + 1; 2 -> 2
어떠한 테이블도 참조되지 않는 상황에서, 더미 테이블 이름으로 DUAL을 지정할 수 있습니다:
1mysql> SELECT 1 + 1 FROM DUAL; 2 -> 2
DUAL은 모든 SELECT
문에 FROM 및 (필요할 경우) 다른 절이 있어야 한다고 요구하는
사용자를 위한 편의 기능일 뿐입니다.
MySQL은 이러한 절을 무시할 수 있습니다.
MySQL에서는 테이블이 참조되지 않는 경우 FROM DUAL을 요구하지 않습니다.
일반적으로, 사용되는 절은 구문 설명에 표시된 순서를 정확히 따라야 합니다.
예를 들어, HAVING 절은
GROUP BY 절 뒤에, 그리고 ORDER BY 절 앞에 와야 합니다.
INTO 절가 존재하는 경우, 구문 설명에서 표시된 위치라면 어느 곳에든 나타날 수 있지만,
특정 문 내에서는 단 한 번만 나타날 수 있고 여러 위치에 중복해서 나타날 수는 없습니다.
INTO에 대한 자세한 정보는
Section 15.2.13.1, “SELECT ... INTO Statement”를 참조하십시오.
select_expr 항의 목록은 가져올 컬럼을 지정하는 셀렉트 리스트를 구성합니다.
항은 컬럼 또는 표현식을 지정하거나
* 셔트핸드를 사용할 수 있습니다:
* 로만 구성된 셀렉트 리스트는
모든 테이블의 모든 컬럼을 선택하는 셔트핸드로 사용할 수 있습니다:1SELECT * FROM t1 INNER JOIN t2 ...
tbl_name.* 는 지정된 테이블의 모든 컬럼을 선택하는
한정된 셔트핸드로 사용할 수 있습니다:1SELECT t1.*, t2.* FROM t1 INNER JOIN t2 ...
테이블에 인비저블 컬럼이 있는 경우,
* 및 tbl_name.* 에는 해당 컬럼이 포함되지 않습니다.
인비저블 컬럼을 포함시키려면 명시적으로 참조해야 합니다.
셀렉트 리스트에서 다른 항목과 함께 한정되지 않은 * 를 사용하면
파스 에러가 발생할 수 있습니다. 예:
1SELECT id, * FROM t1
이 문제를 피하려면, 한정된 tbl_name.*
참조를 사용하십시오:
1SELECT id, t1.* FROM t1
셀렉트 리스트의 각 테이블에 대해 한정된
tbl_name.* 참조를 사용하십시오:
1SELECT AVG(score), t1.* FROM t1 ...
다음 목록은 다른 SELECT 절에 대한 추가 정보를 제공합니다:
select_expr 에 AS alias_name을 사용하여 별칭을 줄 수 있습니다.
별칭은 해당 표현식의 컬럼 이름으로 사용되며
GROUP BY, ORDER BY, 또는
HAVING 절에서 사용할 수 있습니다. 예:1SELECT CONCAT(last_name,', ',first_name) AS full_name 2 FROM mytable ORDER BY full_name;
식별자로 select_expr 를 별칭하는 경우
AS 키워드는 선택 사항입니다.
앞의 예는 다음과 같이 쓸 수도 있습니다:
1SELECT CONCAT(last_name,', ',first_name) full_name 2 FROM mytable ORDER BY full_name;
그러나 AS 가 선택 사항이기 때문에,
두 개의 select_expr 표현식 사이의 콤마를 빠뜨리면
미묘한 문제가 발생할 수 있습니다:
MySQL은 두 번째 항목을 별칭 이름으로 해석합니다.
예를 들어, 다음 문에서 columnb 는 별칭 이름으로 취급됩니다:
1SELECT columna columnb FROM mytable;
이러한 이유로, 컬럼 별칭을 지정할 때는
AS 를 명시적으로 사용하는 습관을 들이는 것이 좋습니다.
WHERE 절에서 컬럼 별칭을 참조하는 것은 허용되지 않습니다.
이는 WHERE 절가 실행될 때
컬럼 값이 아직 결정되지 않았을 수 있기 때문입니다.
Section B.3.4.4, “Problems with Column Aliases”를 참조하십시오.
FROM table_references 절는 행을 가져올 테이블(들)을 나타냅니다.
둘 이상의 테이블을 지정하면 조인을 수행하게 됩니다.
조인 구문에 대한 정보는
Section 15.2.13.2, “JOIN Clause”를 참조하십시오.
각 테이블에 대해 선택적으로 별칭을 지정할 수 있습니다.1tbl_name [[AS] alias] [index_hint]
인덱스 힌트의 사용은 옵티마이저에게 쿼리 처리 중 인덱스 선택 방법에 대한 정보를 제공합니다. 이러한 힌트를 지정하는 구문 설명은 Section 10.9.4, “Index Hints”를 참조하십시오.
MySQL이 테이블 스캔 대신 키 스캔을 선호하도록 강제하는 다른 방법으로
SET max_seeks_for_key=value 를 사용할 수 있습니다.
Section 7.1.8, “Server System Variables”를 참조하십시오.
기본 데이터베이스 내의 테이블은
tbl_name 또는
db_name.tbl_name 으로 참조하여 데이터베이스를 명시적으로 지정할 수 있습니다.
컬럼은
col_name,
tbl_name.col_name,
또는
db_name.tbl_name.col_name
으로 참조할 수 있습니다.
참조가 모호하지 않다면 컬럼 참조에
tbl_name 또는
db_name.tbl_name
접두사를 지정할 필요는 없습니다.
모호성 때문에 더 명시적인 컬럼 참조 형태가 필요한 예시는
Section 11.2.2, “Identifier Qualifiers”를 참조하십시오.
테이블 참조는
tbl_name AS alias_name 또는
tbl_name alias_name 을 사용하여 별칭을 지정할 수 있습니다.
다음 문은 동등합니다:
1SELECT t1.name, t2.salary FROM employee AS t1, info AS t2 2 WHERE t1.name = t2.name; 3 4SELECT t1.name, t2.salary FROM employee t1, info t2 5 WHERE t1.name = t2.name;
ORDER BY 및 GROUP BY
절에서 컬럼 이름, 컬럼 별칭 또는 컬럼 위치로 참조할 수 있습니다.
컬럼 위치는 정수이며 1부터 시작합니다:1SELECT college, region, seed FROM tournament 2 ORDER BY region, seed; 3 4SELECT college, region AS r, seed AS s FROM tournament 5 ORDER BY r, s; 6 7SELECT college, region, seed FROM tournament 8 ORDER BY 2, 3;
역순 정렬을 위해서는 정렬 대상 컬럼 이름 뒤에
DESC (내림차순) 키워드를 추가하십시오.
기본은 오름차순이며,
이는 ASC 키워드로 명시적으로 지정할 수 있습니다.
ORDER BY 가 괄호로 둘러싸인 쿼리 표현식 내부에 있고
outer 쿼리에도 적용되는 경우, 결과는 정의되지 않으며
향후 MySQL 버전에서 변경될 수 있습니다.
컬럼 위치 사용은 SQL 표준에서 구문이 제거되었기 때문에 더 이상 사용하지 않는 기능입니다.
SELECT에서
ORDER BY 또는 GROUP BY 로 컬럼을 정렬할 때,
서버는 max_sort_length 시스템 변수에 의해 지정된
초기 바이트 수만 사용하여 값을 정렬합니다.
MySQL은 GROUP BY 의 사용을 확장하여,
GROUP BY 절에 언급되지 않은 필드를 선택하는 것을 허용합니다.
쿼리가 기대한 결과를 반환하지 않는다면
Section 14.19, “Aggregate Functions”에 있는
GROUP BY 설명을 읽어 보십시오.
HAVING 절은 WHERE 절과 마찬가지로
선택 조건을 지정합니다.
WHERE 절은 셀렉트 리스트에 있는 컬럼에 대한 조건을 지정하지만
집계 함수를 참조할 수는 없습니다.
HAVING 절은 보통 GROUP BY 절로 형성된 그룹에 대한 조건을 지정합니다.
쿼리 결과에는 HAVING 조건을 만족하는 그룹만 포함됩니다.
(GROUP BY 가 없으면 모든 행이 암묵적으로 하나의 집계 그룹을 형성합니다.)
HAVING 절은 거의 마지막에 적용되며,
클라이언트로 항목이 전송되기 직전에 적용되고 최적화되지 않습니다.
(LIMIT 는 HAVING 이후에 적용됩니다.)
SQL 표준은 HAVING 에
GROUP BY 절에 있는 컬럼이나
집계 함수에 사용되는 컬럼만 참조할 수 있도록 요구합니다.
그러나 MySQL은 이 동작을 확장하여,
HAVING 이
SELECT 리스트의 컬럼 및
outer 서브쿼리의 컬럼도 참조하는 것을 허용합니다.
HAVING 절가 모호한 컬럼을 참조하는 경우 경고가 발생합니다.
다음 문에서 col2 는 별칭이자 컬럼 이름이므로 모호합니다:
1SELECT COUNT(col1) AS col2 FROM t GROUP BY col2 HAVING col2 = 2;
표준 SQL 동작에 우선권이 부여되므로,
HAVING 컬럼 이름이 GROUP BY 에서와
셀렉트 컬럼 리스트의 별칭 컬럼으로 모두 사용되는 경우,
GROUP BY 컬럼 쪽에 우선권이 부여됩니다.
WHERE 절에 있어야 할 항목에
HAVING 을 사용하지 마십시오.
예를 들어, 다음과 같이 작성하지 마십시오:1SELECT col_name FROM tbl_name HAVING col_name > 0;
대신 다음과 같이 작성하십시오:
1SELECT col_name FROM tbl_name WHERE col_name > 0;
HAVING 절은 WHERE 절가 할 수 없는
집계 함수를 참조할 수 있습니다:1SELECT user, MAX(salary) FROM users 2 GROUP BY user HAVING MAX(salary) > 10;
(이는 일부 오래된 MySQL 버전에서는 동작하지 않았습니다.)
select_expr 를 둘 이상 가질 수 있습니다.
이는 표준 SQL에 대한 확장입니다.
또한 MySQL은 GROUP BY 와
HAVING 에서
select_expr 값을 참조하도록 허용하므로,
이 때문에 모호성이 발생할 수 있습니다:1SELECT 12 AS a, a FROM t GROUP BY a;
이 문에서 두 컬럼 모두 이름이 a 입니다.
그룹화 시 올바른 컬럼이 사용되도록 보장하려면,
각 select_expr 에 대해 서로 다른 이름을 사용하십시오.
WINDOW 절가 존재하는 경우,
윈도 함수에서 참조할 수 있는 이름 있는 윈도를 정의합니다.
자세한 내용은 Section 14.20.4, “Named Windows”를 참조하십시오.
MySQL은 ORDER BY 절에서
한정되지 않은 컬럼 또는 별칭 참조를 해결할 때,
먼저 select_expr 값을, 그 다음으로
FROM 절의 테이블 컬럼을 검색합니다.
GROUP BY 또는 HAVING
절의 경우에는 FROM 절를 먼저 검색하고,
그 다음으로 select_expr 값을 검색합니다.
(GROUP BY 와 HAVING 에 대해서는
pre-MySQL 5.0에서 ORDER BY 와 동일한 규칙을 사용했던 동작과 다릅니다.)
LIMIT 절는
SELECT 문가 반환하는 행 수를 제한하는 데 사용할 수 있습니다.
LIMIT 는 하나 또는 두 개의 숫자 인자를 취하며,
둘 다 음수가 아닌 정수 상수여야 합니다.
예외는 다음과 같습니다:
LIMIT 파라미터를 ? 플레이스홀더 마커로 지정할 수 있습니다.LIMIT 파라미터를 정수 값의 루틴 파라미터 또는 로컬 변수로 지정할 수 있습니다.두 개의 인자를 사용하는 경우, 첫 번째 인자는 반환할 첫 행의 오프셋을 지정하고, 두 번째 인자는 반환할 최대 행 수를 지정합니다. 초기 행의 오프셋은 0 (1이 아님)입니다:
1SELECT * FROM tbl LIMIT 5,10; # Retrieve rows 6-15
결과 집합의 끝까지 특정 오프셋부터 모든 행을 가져오려면, 두 번째 파라미터에 매우 큰 숫자를 사용할 수 있습니다. 다음 문은 96번째 행부터 마지막까지 모든 행을 가져옵니다:
1SELECT * FROM tbl LIMIT 95,18446744073709551615;
인자가 하나만 있는 경우, 해당 값은 결과 집합의 시작부터 반환할 행 수를 지정합니다:
1SELECT * FROM tbl LIMIT 5; # Retrieve first 5 rows
즉, LIMIT row_count 는
LIMIT 0, row_count 와 동일합니다.
준비된 문의 경우 플레이스홀더를 사용할 수 있습니다.
다음 문는 tbl 테이블에서 한 행을 반환합니다:
1SET @a=1; 2PREPARE STMT FROM 'SELECT * FROM tbl LIMIT ?'; 3EXECUTE STMT USING @a;
다음 문는 tbl 테이블에서 두 번째부터 여섯 번째 행까지를 반환합니다:
1SET @skip=1; SET @numrows=5; 2PREPARE STMT FROM 'SELECT * FROM tbl LIMIT ?, ?'; 3EXECUTE STMT USING @skip, @numrows;
PostgreSQL과의 호환성을 위해, MySQL은
LIMIT row_count OFFSET offset 구문도 지원합니다.
LIMIT 가 괄호로 둘러싸인 쿼리 표현식 내에 있고
outer 쿼리에도 적용되는 경우, 결과는 정의되지 않으며
향후 MySQL 버전에서 변경될 수 있습니다.
SELECT ... INTO 형태의 SELECT는
쿼리 결과를 파일에 쓰거나 변수에 저장할 수 있게 해 줍니다.
자세한 내용은
Section 15.2.13.1, “SELECT ... INTO Statement”를 참조하십시오.
FOR UPDATE 를 페이지 또는 행 잠금을 사용하는 스토리지 엔진과 함께 사용하면,
쿼리에서 검사된 행은 현재 트랜잭션이 종료될 때까지 쓰기 잠금됩니다.
CREATE TABLE new_table SELECT ... FROM old_table ...과 같은 문의
SELECT 일부로
FOR UPDATE 를 사용할 수 없습니다.
(이렇게 시도하면 다음과 같은 에러와 함께 문가 거부됩니다:
Can't update table
' old_table' while
' new_table' is being
created.)
FOR SHARE 및 LOCK IN SHARE MODE 는 공유 잠금을 설정하여
다른 트랜잭션이 검사된 행을 읽을 수는 있지만
업데이트하거나 삭제할 수는 없게 합니다.
FOR SHARE 와 LOCK IN SHARE MODE 는 동등합니다.
그러나 FOR SHARE 는 FOR UPDATE 와 마찬가지로
NOWAIT, SKIP LOCKED, 및
OF tbl_name
옵션을 지원합니다.
FOR SHARE 는 LOCK IN SHARE MODE 를 대체하지만,
LOCK IN SHARE MODE 는 하위 호환성을 위해 여전히 사용 가능합니다.
NOWAIT 는 FOR UPDATE 또는 FOR SHARE 쿼리가
다른 트랜잭션이 보유한 잠금으로 인해 행 잠금을 얻을 수 없는 경우
에러를 반환하면서 즉시 실행되도록 합니다.
SKIP LOCKED 는 FOR UPDATE 또는 FOR SHARE 쿼리가
다른 트랜잭션에 의해 잠금된 행을 결과 집합에서 제외하면서
즉시 실행되도록 합니다.
NOWAIT 및 SKIP LOCKED
옵션은 스테이트먼트 기반 복제에 안전하지 않습니다.
참고
잠금된 행을 건너뛰는 쿼리는
데이터에 대한 일관되지 않은 뷰를 반환합니다.
따라서 SKIP LOCKED 는
일반적인 트랜잭션 작업에는 적합하지 않습니다.
그러나 여러 세션이 같은 큐 형태의 테이블에 접근할 때
잠금 경합을 피하기 위해 사용할 수는 있습니다.
OF tbl_name 은
FOR UPDATE 및 FOR SHARE 쿼리를 지정된 테이블에 적용합니다.
예:
1SELECT * FROM t1, t2 FOR SHARE OF t1 FOR UPDATE OF t2;
OF tbl_name 이 생략되면
쿼리 블록에서 참조하는 모든 테이블이 잠금됩니다.
따라서 OF tbl_name 없이
잠금 절를 사용하면서 다른 잠금 절을 함께 사용하면 에러가 반환됩니다.
같은 테이블을 여러 잠금 절에 지정하는 것도 에러를 반환합니다.
SELECT 문에서 테이블 이름으로 별칭이 지정된 경우,
잠금 절는 해당 별칭만 사용할 수 있습니다.
SELECT 문가 별칭을 명시적으로 지정하지 않은 경우,
잠금 절는 실제 테이블 이름만 지정할 수 있습니다.
FOR UPDATE 및
FOR SHARE 에 대한 자세한 정보는
Section 17.7.2.4, “Locking Reads”를 참조하십시오.
NOWAIT 및 SKIP LOCKED 옵션에 대한 추가 정보는
Locking Read Concurrency with NOWAIT and SKIP LOCKED를 참조하십시오.
SELECT 키워드 다음에는
문 동작에 영향을 주는 여러 수식어를 사용할 수 있습니다.
HIGH_PRIORITY,
STRAIGHT_JOIN, 그리고 SQL_ 로 시작하는 수식어는
표준 SQL에 대한 MySQL 확장입니다.
ALL 및 DISTINCT
수식어는 중복 행을 반환할지 여부를 지정합니다.
ALL (기본값)은 중복을 포함하여
일치하는 모든 행을 반환하도록 지정합니다.
DISTINCT 는 결과 집합에서 중복 행을 제거하도록 지정합니다.
두 수식어를 모두 지정하면 에러입니다.
DISTINCTROW 는 DISTINCT 의 동의어입니다.DISTINCT 는 WITH ROLLUP 을 사용하는 쿼리와 함께 사용할 수 있습니다.
HIGH_PRIORITY 는
SELECT 에게
테이블을 업데이트하는 문보다 더 높은 우선순위를 부여합니다.
이는 매우 빠르게 수행되어야 하며 즉시 완료되어야 하는 쿼리에만 사용해야 합니다.
테이블이 읽기 목적으로 잠금된 동안
SELECT HIGH_PRIORITY 쿼리가 실행되면,
해당 테이블이 프리 상태가 되기를 기다리는 업데이트 문가 있더라도 실행됩니다.
이는 MyISAM, MEMORY,
MERGE 와 같이 테이블 레벨 잠금만 사용하는 스토리지 엔진에만 영향을 줍니다.HIGH_PRIORITY 는
UNION 의 일부인
SELECT 문에서는 사용할 수 없습니다.
STRAIGHT_JOIN 은 옵티마이저가
FROM 절에 나열된 순서대로 테이블을 조인하도록 강제합니다.
옵티마이저가 비최적의 순서로 테이블을 조인하는 경우,
이를 사용하여 쿼리 속도를 높일 수 있습니다.
STRAIGHT_JOIN 은
table_references 리스트에서도 사용할 수 있습니다.
Section 15.2.13.2, “JOIN Clause”를 참조하십시오.STRAIGHT_JOIN 은 옵티마이저가
const 또는
system 테이블로 처리하는 테이블에는 적용되지 않습니다.
이러한 테이블은 단일 행을 생성하며,
쿼리 실행의 최적화 단계 동안 읽히고,
해당 컬럼 참조는 쿼리 실행이 진행되기 전에
적절한 컬럼 값으로 대체됩니다.
이들 테이블은
EXPLAIN 에 표시되는 쿼리 플랜의 첫 부분에 나타납니다.
Section 10.8.1, “Optimizing Queries with EXPLAIN”을 참조하십시오.
이 예외는 outer 조인의 NULL 보완 측면
(즉, LEFT JOIN 의 오른쪽 테이블 또는
RIGHT JOIN 의 왼쪽 테이블)에 사용되는
const 또는
system 테이블에는 적용되지 않을 수 있습니다.
SQL_BIG_RESULT 또는
SQL_SMALL_RESULT 는
GROUP BY 또는 DISTINCT 와 함께 사용하여
결과 집합이 많거나(SQL_BIG_RESULT),
또는 적다고(SQL_SMALL_RESULT) 옵티마이저에 알려줄 수 있습니다.
SQL_BIG_RESULT 의 경우,
MySQL은 디스크 기반 임시 테이블이 생성되면 이를 직접 사용하고,
GROUP BY 요소에 키가 있는 임시 테이블 사용 대신
정렬을 선호합니다.
SQL_SMALL_RESULT 의 경우,
MySQL은 정렬 대신 메모리 상의 임시 테이블을 사용하여
결과 테이블을 저장합니다.
일반적으로는 이 옵션이 필요하지 않습니다.
SQL_BUFFER_RESULT 는
결과를 임시 테이블에 넣도록 강제합니다.
이는 MySQL이 테이블 잠금을 일찍 해제하고,
결과 집합을 클라이언트로 전송하는 데 오랜 시간이 걸리는 경우에 도움을 줍니다.
이 수식어는 최상위 SELECT 문에만 사용할 수 있으며,
서브쿼리나
UNION 뒤에서는 사용할 수 없습니다.
SQL_CALC_FOUND_ROWS 는
LIMIT 절를 무시했을 때 결과 집합에
몇 개의 행이 있을지를 MySQL이 계산하도록 합니다.
행 수는 SELECT FOUND_ROWS() 로 가져올 수 있습니다.
Section 14.15, “Information Functions”를 참조하십시오.
참고
SQL_CALC_FOUND_ROWS 쿼리 수식어와
함께 사용되는 FOUND_ROWS() 함수는 더 이상 사용되지 않으며,
향후 MySQL 버전에서 제거될 수 있습니다.
대체 전략에 대한 정보는
FOUND_ROWS() 설명을 참조하십시오.
SQL_CACHE 및
SQL_NO_CACHE 수식어는
MySQL 9.5 이전의 쿼리 캐시와 함께 사용되었습니다.
쿼리 캐시는 MySQL 9.5에서 제거되었습니다.
SQL_CACHE 수식어도 함께 제거되었습니다.
SQL_NO_CACHE 는 더 이상 사용되지 않으며 아무 효과도 없습니다.
향후 MySQL 릴리스에서 제거될 수 있습니다.15.2.12 REPLACE Statement
15.2.14 Set Operations with UNION, INTERSECT, and EXCEPT