지금부터 쿼리문의 가장 기초라 할 수 있는 SELECT 문에 대해 알아보겠습니다.
0. SYNTAX
SELECT values_to_display
FROM table_name
WHERE expression
GROUP BY how_to_group
HAVING expression
ORDER BY how_to_sort
LIMIT row_count;
-위와 같은 Syntax를 가지며 FROM 절부터는 옵션입니다. 옵션은 생략할 수 있으나 여기에 나오는 절들은(대문자) Syntax 순서대로 사용하셔야 합니다.
-MYSQL은 테이블에서 조회한 각각의 row들로 구성된 하나의 결과 셋(Result set)을 반환 합니다. 비어있다면 아무런 결과도 반환하지 않지만 문제될 것은 없습니다.
-기본적으로 테이블의 모든 컬럼을 스캔하는 경우 * (스타를 대신 사용할 수 있습니다.)
mysql>SELECT column1, column2, ... , columnLast FROM table_name;
mysql>SELECT * FROM table_name; 위 쿼리와 이 쿼리는 결과가 같음
=테이블의 모든 컬럼에서 데이터를 가져와야 하지만 컬럼 순서는 상관없을 때 *가 유용하나 특정한 순서로 가져오길 원하면 컬럼을 순서대로 일일히 기술하는게 좋다. 테이블의 특정 컬럼이 필요한데도 귀찮다고 * 을 사용한다는 것은 여러모로 큰 손실이다.(성능/ 속도 등등)
0. ALIAS
-컬럼명에 원하는 별칭을 달아주는 방법이다.
-AS 키워드는 옵션이다.
-ALIAS는 인용부호를 반드시 사용할 필요는 없지만 여러 개의 단어로 구성된 경우 반드시 인용부호를 사용해야 한다.
-컬럼 alias는 GROUP BY나 HAVING, 그리고 ORDER BY절이나 쿼리문 어디에서나 사용이 가능하지만 where 절에서는 사용할 수 없다.
-필자의 개인적인 소견이지만 FROM절에 사용하는 것을 추천한다.
0. FROM절
-FROM절은 보통 데이터를 가져오게될 TABLE을 명시한다.
-테이블명만 적었을 경우 디폴트 데이터베이스(USE Database_name) 안에 있다고 생각하게 되는데 디폴트 데이터베이스가 애매한 경우 데이터베이스명.테이블명 으로 하면 된다.
0. WHERE절
-데이터를 가져오는 조건을 적는다. 생략하면 모든 데이터를 가져오게 된다.
-조건이 여러개일때에 AND를 이용해서 적는다. ( mysql>WHERE i > 100 AND s > 100;)
-BETWEEN을 사용하여 범위 검색을 할 수 있다.
( mysql>WHERE column BETWEEN 1000 AND 2000)
-여러 수식의 우선 순위를 강제적으로 적용할때 괄호를 사용할 수 있다.
0. ORDER BY절
-기본적으로 SELECT한 결과는 특별한 순서없이 전달된다. 특정한 순서로 결과를 가져오고 싶을때 ORDER BY절을 사용해 결과를 정렬할 수 있다.
-하나 이상의 컬럼을 기준으로 데이터를 정렬 할 수 있으며 ,(콤마) 로 구분한다.
( mysql>ORDER BY name, code;)
-기본적으로 오름차순으로 정렬한다. 명시적으로 오름차순 정렬을 설정하려면 ASC를 넣어주고 내림차순으로 정렬하고 싶으면 DESC를 넣어주면 된다.
-column 대신에 정의한 alias를 사용할 수 있다.
-정렬하는 컬럼이 인덱스라면 속도는 빨라지겠지만 정렬을 위해 인덱스를 생성할 필요는 없다.
-DELETE문이나 UPDATE 문을 사용하여 특정 순서로 데이터를 삭제하거나 수정할 수 있다.
0. 데이터 타입에 따른 정렬 순서
-숫자형 컬럼은 디폴트로 오름차순 정렬되며 DESC를 사용하면 내림차순 정렬된다.
-날짜 컬럼은 시간순서로 오름차순 정렬된다.(가장 오래된 데이터가 먼저)
-ENUM이나 SET이외의 데이터 타입을 갖는 문자열 컬럼은 바이너리 값에따라 다르다.
=바이너리가 아닌 문자열일 경우 COLLATION에 정의된 순서로 정렬된다. 이 때의 COLLATION에 따라 대소문자를 구분하는 경우가 있고 아닐 때가 있다. (ex))CHAR컬럼)
=바이너리 문자열은 문자열 내에 저장된 바이트의 숫자 값을 기준으로 정렬된다.
-ENUM이나 SET은 내부적인 숫자값에 따라 정렬된다.
-NULL은 오름차순일때는 맨 처음 부분에 정렬되고 내림차순일때 마지막에 정렬된다.
0. LIMIT절
-SELECT문의 결과를 제한하기 위해 사용한다.
-LIMIT는 하나 또는 두개의 인자를 갖는다.
-하나의 인자를 갖을땐 그 갯수 만큼만 결과를 가져온다.
( mysql> LIMIT 10; //10건의 데이터를 가져온다.)
-두 개의 인자를 갖을 땐 첫 값을 스킵하고 두번째 값만큼 가져온다.
( mysql> LIMIT 20, 10; //20건을 패스하고 10건의 데이터를 가져온다. 흔히 페이징 구현에 쓰임)
0. Distinct
-쿼리의 결과에 중복 값이 있을 경우 유일한 값만 조회하기 위해 사용한다.
-NULL 값에 대하여 같은 값을 가졌다고 처리한다.
-논리적으로는 집합 함수를 사용하지 않고 전체 컬럼에 대해 GROUP BY를 사용하는 것과 동일
= mysql> SELECT DISTINCT id, name FROM t;
mysql> SELECT id, name FROM t GROUP BY id, name; 두 쿼리는 같은 결과!
-Distinct는 데이터를 정렬하지 않고 GROUP BY는 데이터를 정렬하는 점이 틀리다.
0. 집합함수
-종류(MIN()/MAX()/SUM()/AVG()/COUNT()/GROUP_CONCAT())
-GROUP BY절과 함께 사용할 수 도 있는데 만약 같이 사용하지 않는다면 결과셋 전체에 대한 요약 값을 계산하게 된다.
-MIN()은 최소값, MAX() 최대값을 리턴하고 NULL 값을 무시한다.
-SUM()은 합계, AVG()는 평균값을 리턴하고 NULL 값을 무시한다.
-COUNT()함수는 row나 값의 갯수를 세기 위해 몇가지 방식으로 사용되어질 수 있다.
=COUNT(*)은 전체 열의 갯수를 셀 수 있다.(NULL 값인 열 포함)
=COUNT(표현식)은 주어진 표현식에 대해 NULL이 아닌 값들이 몇 개인지 개수를 센다.
=COUNT(DISTINCT 표현식)은 주어진 표현식에 대해 NULL 값을 제외한 단일 값의 개수를 계산함
-GROUP_CONCAT()은 컬럼의 값들을 연결시켜 하나의 문자열로 만들 때 사용한다.(NULL 무시)
-GROUP BY절은 좀더 세밀하게 요약된 결과를 얻고자 할 때 사용할 수 있다.
=다르게 정렬을 원한다면 ORDER BY를 사용하면된다.
-소수점 2자리로 표현하기 ( mysql>ROUND(AVG(column), 2; )
-HAVING은 GROUP BY절에서 그룹핑한 결과셋중 특정한 집계 항목을 추려낸다. WHERE와 비슷해 보이지만 다른 양상으로 쿼리가 발생한다.
=WHERE는 테이블에서 조회한 데이터를 식별할 때 사용한다.
=GROUP BY는 선택된 결과를 그룹핑 하는데 사용한다.
=집합 함수는 각 그룹별로 요약 값을 계산한다.
=HAVING은 결과적으로 받을 그룹을 식별하는데 사용한다.
-WITH ROLLUP은 집합함수를 집계한다. 예를 들어 SUM()함수에 WITH ROLLUP이 사용된다면 마지막 row에 결과셋에 SUM() column 전체를 SUM()한 결과를 보여준다. AVG라면 AVG column 전체를 평균낸 값을 마지막 row에 보여주게된다.
0. UNION
-이 키워드는 두 개 이상의 SELECT 문 결과를 하나로 연결시켜서 표현 할 때 사용한다.
-기본적으로 중복된 것은 제거 하게 되는데 제거하지 않으려면 UNION ALL을 사용해야 한다.
-UNION ALL은 제거하지 않기 대문에 UNION보다 빠를지 몰라도 네트워크 전송량은 더 많다.
-여러개의 테이블에 비슷한 정보가 저장되어 있고 이 테이블들로 부터 데이터를 조회하는 경우에 매우 유용하다.
-하나의 테이블에서 하나의 WHERE 조건으로 성격이 다른 결과 셋을 조회해야 하는 경우에 UNION을 사용하면 각각의 결과 셋 별로 WHERE 조건을 사용할 수 있으며 조회 결과들을 합쳐서 하나의 결과로 보여줄 수 있다.
-다음은 예제이다. 그냥 보면 이해가 가는 부분일 것이다.
mysql>(SELECT subscriber, email FROM list1 ORDER BY email LIMIT 5)
mysql>UNION (SELECT name, address FROM list2 ORDER BY address LIMIT 5)
mysql>UNION (SELECT real_name, email FROM list3 ORDER BY email LIMIT 5);
'Database > MySql' 카테고리의 다른 글
| [MySql] NULL VALUE (널 값에 대해..) (0) | 2008/10/01 |
|---|---|
| [MySql]표현방법 (문자변환,LIKE 패턴매치) (0) | 2008/10/01 |
| [MySql] Querying for Data (SELECT 부터 집합함수) (0) | 2008/09/30 |
| [MySql]기본적인 형식과 SQL명령어 (0) | 2008/09/30 |
| [MySql] Storage Engine (스토리지 엔진) (0) | 2008/09/25 |
| [MySql] MySql Architecture (아키텍쳐) (0) | 2008/09/24 |
