리터럴 표기법

목차

  1. 1. 문자열
    1. 1.1 따옴표
    2. 1.2 backtick
  2. 2. 숫자
  3. 3. 날짜
  4. 4. 불리언

1. 문자열

1.1 따옴표

SQL표준에서의 문자열은 항상 홑따옴표( ' )를 사용한다. 하지만 MySQL에서는 쌍따옴표(")도 허용한다.

  • 쌍따옴표 허용을 통해 홑따옴 표기 시, 불편함을 해소할 수 있다.
    SELECT * FROM departments WHERE dept_no = 'd''001';
    SELECT * FROM departments WHERE dept_no = "d'001";
    
    • 쌍따옴표가 문자열에 포함되는 경우 홑따옴표로 묶어 반대로도 사용이 가능하다.

1.2 backtick

SQL에서 사용되는 예약어들과 키워드가 충돌하는 경우, 오라클과 PostgreSQL은 “"나 []로 감싸서 충돌을 피한다. MySQL에서는 backtick( ) 로 감싸서 충돌을 피할 수 있다.

SELECT `column` FROM test;
  • sql_mode의 변수값에 ANSI_QUOTES를 설정하면 쌍따옴표를 사용할 수 없다.
    • 그리고 테이블명이나 컬럼명 충돌을 피하기 위해서는 백틱이 아니라 쌍따옴표를 사용해야 한다.
  • SQL표준 표기법만 사용할 수 있도록 강제하기 위한 sql_mode 설정값: ANSI
    • 쿼리 작동 방식에 영향을 주기 때문에 운용 중인 서비스에서는 변경하는 것은 위험이 크다.

2. 숫자

숫자를 상수로 사용할 경우, 따옴표 없이 숫자를 입력하면 된다. 따옴표를 사용하여 문자열 형태로 사용하더라도 MySQL서버가 자동으로 변환해준다.

  • 숫자 타입과 문자열 타입을 비교할 때 우선 순위는 숫자 타입에 있다.
    • 따라서 문자열 타입을 숫자 타입으로 변환하여 비교한다.
      • 숫자 타입 컬럼을 문자열로 변환하는 경우, 상수값 하나만 변환하기 때문에 성능에 큰 영향을 주지 않는다.
      • 하지만 문자 타입 컬럼을 상수로 변환하는 경우, 컬럼의 모든 데이터를 숫자로 변환해서 비교를 하기 때문에 성능에 이슈가 발생할 수 있다.
        SELECT * FROM test WHERE number_col = '1000';
        SELECT * FROM test WHERE string_col = 1000;
        

3. 날짜

MySQL에서는 정해진 형태의 포맷으로 작성하면 MySQL서버가 자동으로 DATE 혹은 DATETIME으로 변환해준다.

  • STR_TO_DATE()를 사용하지 않아도 된다.
SELECT * FROM dept_emp WHERE from_date = STR_TO_DATE('2011-04-20', '%Y-%m-%d');
SELECT * FROM dept_emp WHERE from_date = '2011-04-20';
  • 첫번째 쿼리와 같이 강제로 변환하지 않고 두번째 쿼리처럼 작성하더라도 MySQL서버가 문자열을 DATE타입으로 변환해서 비교한다.

4. 불리언

BOOL, BOOLEAN 타입은 TINYINT타입과 동일하다. TRUE, FALSE 값을 정수로 매핑해서 사용한다.

  • 확인을 위해서 샘플 테이블을 만들어 보자.
    CREATE TABLE tb_boolean_test (name VARCHAR(255), is_deleted BOOLEAN);
    INSERT INTO tb_boolean_test VALUES('hello', true);
    INSERT INTO tb_boolean_test VALUES('world', false);
    
    SELECT * FROM tb_boolean_test;
    SELECT * FROM tb_boolean_test WHERE is_deleted = false;
    SELECT * FROM tb_boolean_test WHERE is_deleted = true;
    

  • TRUE나 FALSE로 조회를 하면 0, 1 이외의 다른 숫자는 조회되지 않는다.
    INSERT INTO tb_boolean_test VALUES('hbcho90', 10);
    SELECT * FROM tb_boolean_test WHERE is_deleted = true;
    SELECT * FROM tb_boolean_test WHERE is_deleted = false;
    SELECT * FROM tb_boolean_test WHERE is_deleted = 10;
    


맨 위로 ↑

Copyright © hyunbenny. 공부한 내용을 끄적거리는 낙서장입니다.