리터럴 표기법
목차
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;