CS/MySQL

[TCPschool][4장] 연산자와 함수

pythaac 2021. 8. 6. 01:31
이 글은 "TCPschool/코딩과 데이터/MySQL"을 읽고 주관적으로 작성된 글입니다.

https://tcpschool.com/mysql/intro

 

코딩교육 티씨피스쿨

4차산업혁명, 코딩교육, 소프트웨어교육, 코딩기초, SW코딩, 기초코딩부터 자바 파이썬 등

tcpschool.com

 

1. 산술 연산자

1) 연산자

  • 대부분 프로그래밍 언어에서 지원하는 기본 연산자를 모두 제공
  • 연산자를 사용하여 데이터 추출 /처리

2) 산술 연산자(arithmetic operator)

  • 이항 연산자
    • +
    • -
    • *
    • /
    • DIV
      - 소수부 버림
    • % 또는 MOD
SELECT 504.7 + 13,
504.7 * 0.9,
504.7 / 2,
504.7 DIV 2,
504.7 % 2;
  • 연산자의 우선순위
    • INTERVAL
    • BINARY, COLLATE
    • !
    • - ~
    • ^
    • * / DIV % MOD
    • - + (이항연산자)
    • << >>
    • &
    • |= <=> >= > <= < <> != IS LIKE REGEXP IN
    • BETWEEN, CASE, WHEN, THEN, ELSE
    • NOT
    • AND, &&
    • XOR
    • OR, ||
    • = :=

 

2. 대입 연산자

1) 대입 연산자

  • 변수 타입 대입
    • =
      - SET문 / UPDATE의 SET절 에서만 대입 연산자로 사용됨
      - 이외의 사용은 비교 연산자로 해석
    • :=
      - 그 외 대입연산
UPDATE Reservation
SET RoomNum = 504;

 

3. 비교 연산자

1) 비교 연산자

  • 참이면 1 / 거짓이면 0
    • <>
      - !=와 같음
    • <=>
      - 피연산자 모두 NULL이면 참
    • IS
      - 같으면 참
      - 오른쪽 피연산자가 BOOL(TRUE / FALSE / UNKWON)일 때 사용
    • IS NOT / IS NULL / IS NOT NULL
    • (NOT) BETWEEN min AND max
      - min보다 크거나 같고 max보다 작거나 같으면 참
    • (NOT) IN()
      - 피연산자 값이 인수로 전달받은 리스트에 존재하면 참
SELECT 3=3,         -- 1
0 = NULL,           -- NULL
1 IS TRUE,          -- 1
1 IS NULL,          -- 0
3 BETWEEN 2 AND 7,  -- 1
5 IN (2, 3, 4, 5);  -- 1

 

4. 논리 연산자

  • 생략

 

5. 비트 연산자

  • 생략

 

6. 흐름 제어

1) 흐름 제어

  • 순차적인 흐름을 제어할 때 사용하는 연산자와 함수 제공
    • CASE
    • IF()
    • IFNULL()
    • NULLIF()

2) CASE

  • CASE-WHEN-THEN-ELSE-END
    • value와 같은 WHEN의 THEN절을 실행
    • WHEN절의 조건이 참이면 THEN절 실행
SELECT CASE 0
    WHEN 0 THEN 'zero'
    WHEN 1 THEN 'one'
    ELSE 'more'
END;

3) IF()

  • IF( condition, if true, if false )
    • 삼항연산자(?:)와 같음
SELECT IF (0 < 1, 'yes', 'no');

4) IFNULL()

  • IFNULL( if not null, if null )
    • 첫번째항이 null이 아니면 첫번째 항
    • 첫번째항이 null이면 두번째 항
SELECT IFNULL(NULL, '전달 받을 값');

4) NULLIF()

  • 두 인자가 같으면 NULL, 아니면 첫 번째 인자 반환
    • 다음 SQL문과 같은 동작
-- CASE1
SELECT CASE value1
    WHEN value2 THEN NULL
    ELSE value1
END;

-- CASE2
SELECT CASE
    WHEN value1 = value2 THEN NULL
    ELSE value1
END;

-- IF
SELECT IF(value1=value2, NULL, value1);

 

7. 패턴 매칭

1) 패턴 매칭

  • 데이터의 특정 패턴을 검색하기 위한 매칭 연산자 제공
    • LIKE
    • REGEXP
  • 임의의 문자/문자열 대체를 위해 와일드카드(wildcard) 문자 사용 가능

2) LIKE

  • 특정 패턴을 포함하는 데이터만 검색
  • 예제
    • '장'으로 시작하는 Name row
    • '%'는 0개 이상의 문자라는 의미의 와일드카드
SELECT Name FROM Reservation
WHERE Name LIKE '장%';

3) 와일드카드

  • 문자열 내에서 임의의 문자/문자열 대체를 위해 사용되는 기호
    • %
      - 0개 이상의 문자 대체
    • _
      - 1개 이상의 문자 대체
  • 예제
    • RoomNum 필드가 20으로 시작, 바로 뒤에 두자리 숫자가 더 나옴
SELECT * FROM Reservation
WHERE RoomNum LIKE '20__';

4) REGEXP

  • LIKE보다 복잡한 패턴 검색에 사용
  • 정규 표현식을 토대로 패턴 매칭 연산
. 줄바꿈을 제외한 임의의 한 문자
* 해당 문자 패턴이 0번 이상 반복
+ 해당 문자 패턴이 1번 이상 반복
^ 문자열의 처음을 의미
$ 문자열의 끝을 의미
| 선택을 의미 (OR)
[...] []안에 있는 문자중 하나
[^...] []안에 있지 않은 문자중 하나
{n} 반복되는 횟수 지정
{m,n} 반복되는 횟수 범위 지정
  • 예제
    • Name 필드에 '홍'으로 시작하거나, '산'으로 끝나는 레코드
SELECT * FROM Reservation
WHERE Name REGEXP '^홍|산$';

 

8. 타입 변환

1) 타입 변환

  • 비교나 검색을 수행할 때 데이터 타입이 다를 경우, 내부적으로 타입이 같아지도록 자동 변환
  • 하지만 명시적으로 타입 캐스팅 지원
    • BINARY
    • CAST()
    • CONVERT()

2) BINARY

  • 뒤에 오는 문자열을 바이너리 문자열로 변환
  • BINARY 연산자로 문자가 아닌 바이트 기준으로 비교/검색 작업 수행
  • 예제
    • BINARY 연산자로 문자 'a'와 'A'를 비교
SELECT BINARY 'a' = 'A', -- 0
'a' = 'A';               -- 1

3) CAST()

  • CASE( value AS type)
  • 함수 인자로 전달받은 값을 명시된 타입으로 변환
  • type
    • BINARY
    • CHAR
    • DATE
    • DATETIME
    • TIME
    • DECIMAL
    • JSON
    • NCHAR
    • SIGNED [INTEGER]
    • UNSIGNED [INTEGER]
  • 예제
    • 문자열 데이터를 UNSIGNED 타입으로 변환
SELECT 
4 / '2',                     -- 2 : 문자열이 타입 변환으로 정수 타입이 반환
4 / 2,                       -- 2.0000 : 정수 / 정수는 실수 타입으로 반환
4 / CAST('2' AS UNSIGNED);   -- 2.0000

4) CONVERT()

  • CAST()와 같이 명시된 타입으로 변환
  • 두번째 인수에 변환하는 타입을 직접 전달
  • USING : 서로 다른 문자셋으로 변환할 때 사용
SELECT CONVERT(expr, type);
SELECT CONVERT(expr USING transcoding_name);
  • 예제
    • 문자열의 문자셋을 UTF-8로 변환
SELECT CONVERT('test' USING utf8);