'count'에 해당되는 글 1건

  1. 2008/09/30 [MySql] Querying for Data (SELECT 부터 집합함수)
Database/MySql2008/09/30 21:21

 지금부터 쿼리문의 가장 기초라 할 수 있는 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);

저작자 표시 비영리 동일 조건 변경 허락
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by afeleia