이번 글에서는 별칭, 함수, 집합연산에 대해 알아보도록 하겠습니다.



1. 별칭 ( Alias )

AS 명령어로 별칭(별명)을 붙일 수 있습니다.

컬럼명이 길어서(또는 마음에 들지 않아서) 바꾸고 싶은 경우 또는 테이블명을 바꾸고 싶을 경우 사용합니다.



아래는 두 컬럼의 곱(컬럼1 * 컬럼2)으로 표현되는 컬럼명을 foo로 바꾸는 예제입니다.

# SELECT *, (컬럼1 * 컬럼2) AS foo FROM 테이블명;

  • 연산이 들어간 컬럼은 가독성을 위해 괄호 ( )로 묶어주는 것이 좋습니다.


별칭의 이름이 ASCII가 아닌 문자열일 경우 쌍 따옴표(")를 붙여야 합니다.

# SELECT *, (컬럼1 * 컬럼2) AS "금액" FROM 테이블명;


만약 조건문( where )에서 별칭을 사용한다면 에러가 발생합니다.

# SELECT *, (컬럼1 * 컬럼2) AS foo FROM 테이블명 WHERE foo >= 3;

  • SELECT 쿼리의 명령어 순서는 where -> select 이므로 Error가 발생합니다.


반면, ORDER BY 절은 SELECT 명령어 순서상 가장 마지막에 처리되므로 별칭을 사용할 수 있습니다.

# SELECT *, (컬럼1 * 컬럼2) AS foo FROM 테이블명 ORDER BY foo DESC;


테이블에 별칭을 부여할 수도 있습니다.

아래는 특정 테이블을 t1이라는 별칭으로 부여한 것입니다.

# SELECT * FROM 테이블명 AS t1;

  • 테이블에 별칭을 부여하는 것은 두 테이블을 결합하여 검색하는 JOIN 쿼리시에 유용합니다.





2. 함수

MySQL에서 사용자가 유용하게 사용할 수 있도록 제공하는 함수가 있습니다.

사용자가 함수를 직접 만들 수도 있는데, MySQL에서 제공하는 함수에 대해 알아보겠습니다.


1) 수학 관련

  • 반올림 : ROUND
  • 삼각함수 : SIN, COS
  • 루트 : SORT
  • 로그 : LOG


아래는 amount 컬럼을 반올림해서 조회하는 예제입니다.

# SELECT *, ROUND(amount) FROM products;


다음은 소수점 둘 째 자리에서 반올림하여 조회하는 예제입니다.

# SELECT *, ROUND(amount, 1) FROM products;
  • ROUND 함수는 기본적으로 소수점 첫 번째 자리에서 반올림 합니다.
    • 두 번째 매개변수로 1을 넘겨주면 소수점 두 번째 자리에서 반올림하며,
    • -1을 넘겨주면 일의 자리에서 반올림 합니다.




2) 집계 관련

  • 합계 : SUM
  • 개수 : COUNT
  • 최소값 : MIN
  • 최대값 : MAX
  • 평균 : AVG
  • 중복제거 : DISTINCT


아래는 products 테이블에 존재하는 데이터의 개수를 조회하는 예제입니다.

# SELECT COUNT(*) FROM products;

  • 만약 조건문(WHERE)이 추가된다면, SELECT문 실행 순서에 의해 WHERE가 먼저 실행된 후 COUNT함수가 실행됩니다.
  • COUNT(*)는 COUNT(컬럼)보다 성능이 좋습니다.
    • COUNT(*)와 COUNT(1)은 동일합니다.



다음은 name 컬럼의 중복을 제거하여 조회하는 예제입니다.

# SELECT DISTINCT name FROM products;



다음은 quantity 컬럼의 모든 값을 더해서 조회하는 예제입니다.

# SELECT SUM(quantity) FROM products;
  • AVG, MIN, MAX 등의 함수들도 이와 문법이 같습니다.




3) 문자열 관련

  • 문자열 결합 : CONCAT
  • 문자열 일부분 추출 : SUBSTR
  • 문자열 맨 끝 좌우의 공백제거 : TRIM
  • 문자열 길이 : CHAR_LENGTH


아래는 count와 unit 컬럼의 문자열을 합쳐서 조회하는 예제입니다.

# SELECT *, CONCAT(count, unit) FROM products;



4) 시간 관련

  • 시스템 시간 : CURRENT_TIMESTAMP
  • 날짜 간의 차이 : DATEDIFF

다음은 reg_date 컬럼에 시스템의 현재 시간으로 "YYYY-MM-DD HH-MM-SS" 포맷의 문자열 또는 "YYYYMMDDHHMMSS.uuuuuu" 포맷의 정수로 조회하여 추가하는 예제입니다.

# INSERT INTO board reg_date VALUES (SELECT CURRENT_TIMESTAMP());

  • 게시글의 등록 날짜, 회원 가입 날짜 등의 값으로 입력할 때 유용합니다.





3. 집합엽산

1) 합집합 

UNION 명령어는 두 테이블의 합집합을 연산하는 명령어 입니다.


아래는 products, items 두 테이블의 합집합을 연산해서 조회하는 예제입니다.

# (SELECT * FROM products) UNION (SELECT * FROM items);
  • 이 때 합집합을 하고자 하는 두 SELECT 쿼리의 컬럼명이 일치해야 합니다.

    • 예제의 쿼리에서는 *로 일치시켰습니다.

  • 각각의 SELECT 쿼리는 가독성을 위해 ( )로 묶었습니다.

  • UNION 연산은 두 쿼리의 중복을 제거하지만 UNION ALL은 중복된 값을 제거하지 않는 명령어 입니다.

    • 즉, 있는 그대로를 합치기 때문에 중복을 제거하는 연산이 없으므로 UNION보다 성능이 더 좋습니다.


2) 합집합 연산에서 정렬

합집합 연산을 한 후, 정렬을 할 수 있습니다.

# (SELECT products_no AS no FROM products) UNION (SELECT items_no AS no FROM items) ORDER BY no;

  • 합집합 연산에서 정렬을 하기 위해서는 마지막 SELECT 쿼리에 대해서만 정렬하는 것이 가능합니다.
    • 이 때 UNION을 하는 두 열의 이름이 다르다면 별칭(예제에서는 no)을 붙여서 정렬해야 합니다.


3)

합집합 연산 외에도 교집합(INTERSECT), 차집합(EXCEPT)이 있지만 MySQL에서는 따로 지원하는 명령어가 없습니다.

이 경우에는 테이블을 결합하는 JOIN 연산을 사용해서 해결해야 합니다. ( 링크 )





이상으로 Alias, Mysql에서 제공하는 함수, 집합연산(UNION)에 대해 알아보았습니다.


'Database > MySQL' 카테고리의 다른 글

[MySQL] SYSDATE()와 NOW()의 차이  (0) 2018.03.11
[MySQL] 조인( JOIN )  (0) 2018.03.11
[MySQL] 인덱스(Index table) , 뷰(View table)  (0) 2018.03.11
[MySQL] 서브쿼리 ( subquery )  (1) 2018.03.11
[MySQL] GROUP BY , HAVING  (0) 2018.03.11
[MySQL] DDL, DML 기본 명령어  (2) 2018.03.11
[MySQL] MySQL 시스템 기본 명령어  (0) 2017.10.17