9. 도서관/__사. Network

mysql SELECT 문의 형식

행복 금융 2008. 10. 16.
SELECT 문의 형식
http://radiocom.kunsan.ac.kr
【형식】 
SELECT [STRAIGHT_JOIN]
[SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT]
[SQL_CACHE | SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS] [HIGH_PRIORITY]
[DISTINCT | DISTINCTROW | ALL]
select_expression,...
[INTO {OUTFILE | DUMPFILE} 'file_name' export_options]
[FROM table_references
[WHERE where_definition]
[GROUP BY {undesigned_integer | col_name | formula} [ASC | DESC], ...]
[HAVING where_definition]
[ORDER BY {undesigned_integer | col_name | formula} [ASC | DESC], ...]
[LIMIT [offset,] rows | rows OFFSET offset]
[PROCEDURE procedure_name(argument_list)]
[FOR UPDATE | LOCK IN SHARE MODE]]

• SELECT에서 나타낼 필드 이름은 AS를 사용하여 alias할 수 있으며, 그 alias 된 이름은 컬럼 이름으로 사용할 수 있고, 또한 ORDER BY 절이나 HAVING 절에서도 사용할 수 있다.
    mysql> SELECT CONCAT(last_name,', ',first_name) AS full_name
FROM mytable ORDER BY full_name;

• WHERE절에서는 column alias가 허용되지 않는다.
• SELECT 문의 형식에서 사용된 예약어의 사용순서는 반드시 쓰인 순서를 지켜야 한다.

예를 들어, HAVING절은 GROUP BY 다음에 놓이고, ORDER BY 앞에 위치하여야 한다.

• FROM table_references 절은 가져올 row가 있는 테이블 이름이다. 테이블 이름이 둘 이상인 경우에 join이 실행된다. 각 테이블 이름도 alias를 지정할 수 있다.

       table_name [[AS] alias] [[USE INDEX (key_list)] | [IGNORE INDEX (key_list)]  | 
[FORCE INDEX]

• 현재의 데이터베이스 내에서는 table_name만 지정하여 테이블을 참조하며, dbname.tbl_name처럼 데이터베이스와 테이블 이름을 함께 지정할 수 있다. 또한 col_name이나 tbl_name.col_name, 또는 db_name.tbl_name.col_name 형식으로 컬럼을 지정할 수 있다.
• 사용할 테이블은 tbl_name [AS] alias_name처럼 별명을 붙여 사용할 수 있다. 예를 들어,
    mysql> select t1.name, t2.salary from employee AS t1, info AS t2 
-> where t1.name=t2.name;

mysql> select t1.name, t2.salary from employee t1, info t2
-> where t1.name=t2.name;


• 출력하기 위해 선택된 컬럼은 컬럼 name, 컬럼 alias, 컬럼 position으로 ORDER BY나 GROUP BY절에서 참조될 수 있다. 컬럼 position은 1부터 시작된다. order by에 의한 소팅은 ASC와 DESC에 의한 오름순이나 내림순으로 소팅되며 디폴트는 ASC이다.
    mysql> SELECT college, region, seed FROM tournament
-> ORDER BY region, seed;
☜ 컬럼 name으로
mysql> SELECT college, region AS r, seed AS s FROM tournament
-> ORDER BY r, s;
☜ 컬럼 alias로
mysql> SELECT college, region, seed FROM tournament
-> ORDER BY 2, 3;
☜ 컬럼 position으로

• WHERE 절 내에서 MySQL이 지원하는 함수를 사용할 수 있다.
• HAVING 절에서 컬럼이나 alias된 이름을 참조할 수 있지만, 클라이언트에게 직전의 item을 계속 적용하기 때문에 WHERE 절에 있는 item을 HAVING 절에서 사용하지 않아야 한다.
예를 들어, 
mysql> SELECT col_name FROM tbl_name HAVING col_name > 0; ☜ 잘못된 문장
mysql> SELECT col_name FROM tbl_name WHERE col_name > 0; ☜ 바른 문장
mysql> SELECT user, MAX(salary) FROM users
-> GROUP BY user HAVING MAX(salary) > 10;
☜ 바른 문장

• DISTINCT, DISTINCTROW, ALL는 중복되는 레코드의 출력을 지정하는데, 디폴트 ALL은 매칭되는 모든 rows를 출력하지만, DISTINCT, DISTINCTROW는 중복되는 rows중에서 유일한 row만 출력한다.
• 옵션 중에서 SQL_*, STRAIGHT_JOIN, HIGH_PRIORITY을 포함한 문장은 SQL-99를 지원한다.
• HIGH_PRIORITY는 테이블 update보다 select를 우선한다.
•SQL_BIG_RESULT는 GROUP BY나 DISTINCT에 사용하여 결과 셑이 많은 rows를 가지고 있어 최적화하도록 한다.
• SQL_BUFFER_RESULT는 결과를 임시 테이블에 놓이도록 한다.
• SQL_SMALL_RESULT는 GROUP BY나 DISTINCT에 사용하여 결과 셑이 적은 rows를 가지고 있어 최적화하도록 한다.
• SQL_CALC_FOUND_ROWS는 결과 셑의 rows를 알려준다. 또한 SELECT FOUND_ROWS로 rows 수를 알려준다.
• SQL_CACHE는 QUERY_CACHE_TYPE=2를 사용할 경우 쿼리 캐시에 쿼리 결과를 저장한다.
• SQL_NO_CACHE는 쿼리 캐시에 쿼리 결과를 저장하지 않도록 한다.
• GROUP BY는 ORDER BY를 사용한 것처럼 rows가 소팅되어 출력된다.
    mysql> SELECT a, COUNT(b) FROM test_table GROUP BY a DESC;

• GROUP BY는 GROUP BY절에서 언급하지 않은 필드도 select할 수 있다.
• STRAIGHT_JOIN는 FROM 절에 명시한 순서로 테이블을 join하도록 한다.
• LIMIT 절은 SELECT 문으로 반환될 rows의 수를 제한한다.
    mysql> SELECT * FROM table LIMIT 5,10;    ☜ 6-15번 라인 출력
mysql> SELECT * FROM table LIMIT 95,-1; ☜ 96-끝번 라인 출력
mysql> SELECT * FROM table LIMIT 5; ☜ 첫 5 라인 출력
LIMIT n은 LIMIT 0,n과 동일하다.

SELECT...INTO OUTFILE 'file_name' 문은 select한 rows를 파일에 저장한다. 이 경우 FILE권한이 있어야 하고, SELECT...INTO OUTFILE 문은 주로 동일 서버에서 테 이블을 빠르게 덤프하지만, 다른 서버에 덤프할 때는 mysqldump --tab나 mysql -e "SELECT..." > outfile을 사용한다. SELECT...INTO OUTFILE 문은 LOAD DATA INFILE과 상보이다. 저장된 텍스트 파일은 다음과 같은 ESCAPED BY 문자에 의해서 벗어날 수 있다:
        ESCAPED BY 문자
FIELDS TERMINATED BY에 있는 문자
LINES TERMINATED BY에 있는 문자

예를 들어,
SELECT a,b,a+b INTO OUTFILE "/tmp/result.text"
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY "\n"
FROM test_table;


• INTO OUTFILE 대신 INTO DUMPFILE 문을 사용하면, 오직 한 줄로 된 파일에 저장한다.
즉, 컬럼, line termination, escaping 문자가 없으므로 blob를 파일로 저장할 때 유용하다.
• INTO OUTFILE과 INTO DUMPFILE에 의해서 만들어진 파일은 모든 사용자에게 쓰기(w) 권한이 주어질 수 있음에 주의한다.
• FOR UPDATE문을 사용하면, storage engine은 page/row의 lock여부를 검사하여 write lock한다.

SELECT 문
LOAD DATA INFILE 문 자세히 보기

댓글

💲 추천 글