문자열
SQL표준에서 문자열은 항상 홑따옴표(’’)를 사용해서 표기
MySQL에서는 문자열을 쌍따옴표(””)를 사용해서 표기 가능
SQL표준에서 문자열이 홑따옴표를 포함하는 경우 홑따옴표를 두 번 연속해서 입력
MySQL에서는 쌍따옴표와 홑따옴표를 혼합사용하여 해결
SQL문자열 표기
(SQL 표준) SELECT * FROM departments WHERE dept_no='d''100';
(SQL 표준) SELECT * FROM departments WHERE dept_no='d"100';
(MySQL only) SELECT * FROM departments WHERE dept_no-"d'001";
(MySQL only) SELECT * FROM departments WHERE dept_no="d""001";
식별자 충돌
숫자
숫자표기는 다른 DBMS처럼 따옴표없이 숫자만 입력하면 됨
만약, 따옴표를 사용하더라도 비교하는 과정에서 비교대상이 숫자라면 문자열을 숫자로 형변환을 하고 비교를 수행
MySQL은 숫자타입과 문자열 타입간의 비교에서 숫자타입을 우선시하기 때문에 문자열을 숫자타입으로 변환하여 비교 수행
SELECT * FROM tab_test WHERE number_column='10001';
SELECT * FROM tab_test WHERE string_column=10001;
위 첫번째 쿼리는 숫자컬럼과 문자열 상수의 비교이기 때문에 문자열 상수만 숫자타입으로 변환 후 비교 수행
두번째 쿼리의 경우 문자열 컬럼을 상수와 비교하기 때문에 모든 문자열 컬럼을 숫자타입으로 형변환 후 비교하기 때문에, 인덱스가 있더라도 활용하지 못하게 됨
만약 string_column에 ‘A’와 같은 문자열이 있다면 형변환이 불가능하여 쿼리가 실패할 수도 있음
이러한 이유로 숫자는 숫자타입의 컬럼에만 저장하도록 함
날짜
MySQL은 다른 DBMS와 달리 정해진 형태로 입력만 한다면 자동으로 DATE, DATETIME형식으로 변환하기 때문에 STR_TO_DATE()
같은 함수 사용하지 않아도 됨
SELECT * FROM dept_emp WHERE from_date='2011-04-29';
SELECT * FROM dept_emp WHERE from_date=STR_TO_DATE('2011-04-29', '%Y-%m-%d');
첫번째 쿼리는 날짜 타입의 컬럼과 문자열을 비교하는 경우 MySQL은 문자열값을 DATE타입으로 변환하여 비교
두번째 쿼리는 문자열을 DATE타입으로 강제 변환하여 비교하는 예제인데, 첫번쨰 쿼리와 차이점은 없음
두 쿼리 모두 from_date를 문자열로 변환하여 비교하는 것이 아니기 때문에 index활용에서는 문제가 없음
불리언
동등 비교(=, <=>)
SELECT * FROM <table_name> WHERE <string_column> <=> NULL
부정 비교(!=, <>)
NOT연산자(!)
나누기와 나머지 연산자
LIKE 연산자
REGEXP보다는 단순한 문자열 패턴 비교 연산자이지만 DBMS에서는 LIKE를 더 많이 사용
REGEXP 연산자는 인덱스를 전혀 사용하지 못함
LIKE는 인덱스를 사용해서 처리 가능함
LIKE에서 사용할 수 있는 와일드카드 문자
와일드카드 문자 자체를 비교한다면 ESCAPE절을 LIKE조건 뒤에 추가해 이스케이프 문자 설정 가능
SELECT ‘abc’ LIKE ‘a/%’ ESCAPE ‘/’;
인덱스 활용
SELECT * FROM employees WHERE first_name LIKE ‘Christ%’;
SELECT * FROM employees WHERE first_name LIKE ‘%rist’;
BETWEEN연산자
SELECT * FROM dept_emp WHERE dept_no=’d001’ AND emp_no=10001;
SELECT * FROM dept_emp WHERE dept_no BETWEEN ‘d003’ AND ‘d005’ AND emp_no=10001;
BETWEEN과 IN
SELECT * FROM dept_emp WHERE dept_no IN (’d003’, ‘d004’, ‘d005’) AND emp_no=10001;
윈도우 함수
LETERAL
BENCHMARK()
드라이빙, 드리븐 테이블
EXPLAIN 참조: https://denodo1.tistory.com/306
SELECT
SELECT * FROM salaries WHERE salary * 10 = 100000;
SELECT * FROM salaries WHERE salary = 100000 / 10;
col_1, col_2, col_3, col_4
(GROUP BY col_1, col_2)
**(GROUP BY col_2, col_3)
**(WHERE col_1 = ‘${상수}’ GROUP BY col_2, col_3)
**(GROUP BY col_1, col_2, col_3, col_4, col_5)
**