[MySQL] 내장 함수 & 연산자 정리

sua_ahn·2023년 1월 12일
2

MySQL

목록 보기
5/6
post-thumbnail

MySQL 내장 함수 & 연산자

1. 수학함수 & 산술 연산자

기본 산술

  • 사칙연산 : + - * /

  • 몫 : div

  • 나머지 : %, MOD, MOD(값, divisor)

  • 제곱 : POW(값, 지수), POWER(값, 지수)

  • 제곱근 : SQRT(값)

근삿값

  • 반올림 : ROUND(값, [소수점자릿수])

  • 올림 : CEIL(값, [소수점자릿수]), CEILING(값, [소수점자릿수])

  • 버림 : FLOOR(값, [소수점자릿수]), TRUNCATE(값, 소수점자릿수)

기타

  • 절댓값 : ABS(값)

  • 난수 생성 : RAND()

SELECT FLOOR(RAND() * 10);	-- 0 ~ 9

 

 


2. 논리함수 & 논리 연산자

  • 모두 참이면 참 : AND &&

  • 하나라도 참이면 참 : OR ||

  • 서로 다르면 참 : XOR

  • 대입 연산 : :=

  • 삼항 연산 : IF(조건식, 참의 반환값, 거짓의 반환값)

  • 값이 null일 때 반환값 : IFNULL(값, 반환값), COALESCE(값, 반환값)

 

 


3. 비교함수 & 비교 연산자

연산자

  • 크다, 작다 : > < >= <=

  • 같다, 다르다 : =, != <>

IS

  • null값 여부 : IS NULL, IS NOT NULL

  • 참 여부 : IS TRUE, IS NOT TRUE

  • 거짓 여부 : IS FALSE, IS NOT FALSE

범위

  • ( >= min) && ( <= max) : BETWEEN min AND max

  • ( < min) || ( > max) : NOT BETWEEN min AND max

  • 비교값들 중 존재 여부 : IN(비교값들 혹은 서브쿼리)

  • 서브쿼리가 반환하는 레코드(행) 존재 여부 : EXISTS(서브쿼리)

  • 비교값들 모두 만족하면 참 : ALL(비교값들 혹은 서브쿼리)

  • 비교값들 중 하나라도 만족하면 참 : ANY(비교값들 혹은 서브쿼리)

-- IN()
SELECT *
FROM employee
WHERE age IN(20, 30, 40);

-- EXISTS()
SELECT * 
FROM customers 
WHERE EXISTS(SELECT * FROM orders 
             WHERE orders_id = customers_id);

-- ANY()
SELECT *
FROM employees
WHERE age = ANY(SELECT age FROM employees
                WHERE location = '서울');

최대 / 최소

  • 최댓값 : GREATEST(값,...)

  • 최솟값 : LEAST(값,...)

 

 


4. 문자열함수

아스키 코드값

  • 문자 → 아스키 코드값 : ASCII('C')
  • 아스키 코드값 → 문자 : CHAR(정수)

문자열 수정

  • 합치기 : CONCAT(str,...), CONCAT_WS('구분자', str,...)

  • 대체 : REPLACE(str, 기존문자, 대체문자)

  • 자르기 : SUBSTR(str, start, length)

SELECT SUBSTRING('12345', 3, 2);	-- '34'

기타

  • 문자열 길이 : 바이트수 LENGTH(str), 문자수 CHAR_LENGTH(str)

  • 문자열 검색 : INSTR(str, 검색문자)

  • 문자열 포함 확인 : LIKE '%', NOT LIKE '_'

    • wildcard (대체 문자) : 단일문자 대체 _, 복수문자 대체 %
      → wildcard 검색 시, 앞에 역슬래시\를 추가

 

 


5. 날짜함수

  • 현재 날짜와 시간 : NOW(), CURRENT_TIMESTAMP()

  • 일 차이 : DATEDIFF(date1, date2)

  • 날짜 및 시간 차이 : TIMESTAMP(단위, date2, date1)

-- (date1 - date2) 계산
SELECT TIMESTAMPDIFF(HOUR, '2022-12-31', '2023-01-01'); -- 24
  • 원하는 값만 추출 : YEAR(날짜), MONTH(날짜), DAYOFMONTH(날짜),DAYOFWEEK(날짜) HOUR(시간), MINUTE(시간), SECOND(시간)
SELECT DAYOFWEEK('2022-12-31');	-- 7 (토요일)
SELECT DAYOFWEEK('2023-01-01');	-- 1 (일요일)
  • 형식 변경 : DATE_FORMAT(col, '%Y')

    📋 포맷 코드

    코드역할예시코드역할예시
    %Y2022%T시간00:00:00
    %y22%H00 ~ 23
    %MJanuary%h, %I01 ~12
    %bJan%k0 ~ 23
    %m01%l1 ~ 12
    %c1%i00
    %d01%S, %s00
    %e1%pA/PAM
    %W요일Sunday
    %a요일Sun

 

 


6. 기타

집계함수 (그룹함수)

  • 갯수, 합, 평균 : COUNT(col), SUM(col), AVG(col)

  • 최대, 최소 : MAX(col), MIN(col)

 

분석함수 (순위함수)

  • 순위 : RANK(), DENSE_RANK(), ROW_NUMBER()

    • 범위 제한 : LIMIT 시작인덱스, 갯수, LIMIT 갯수 OFFSET 시작인덱스

    EX)

    봉급RANKDENSE_RANKROW_NUMBER
    $2500111
    $2500112
    $2000323

 

윈도우함수

  • OVER() : 행과 행 간의 관계를 정의해주는 함수
    → 집계함수 혹은 분석함수와 함께 쓰임

    • 집계함수 사용을 위한 그룹화 : PARTITION BY
    • 분석함수 사용을 위한 정렬 : ORDER BY
    -- 기존 데이터에 부서별 평균임금
    SELECT name, salary, department,
    	AVG(salary)OVER(PARTITION BY department)
    FROM employees;
    
    -- 기존 데이터에 봉급 순위 추가 (1~10위로 제한)
    SELECT name, salary,
        ROW_NUMBER()OVER(ORDER BY salary DESC)
    FROM employees
    LIMIT 0, 10;
profile
해보자구

0개의 댓글