티스토리 뷰
(2) 2장. 테이블에서 데이터 검색
4~8강 검색 조건
4강. Hello World 실행하기
- SQL 명령은 키워드에 의해 '구'라는 단위로 나눌 수 있음 → ex) select구와 from구
- select 명령은 여러 개의 구(select구, from구...)로 구성됨
- 데이터베이스 객체명에는 예약어와 동일한 이름을 사용할 수 없음
- select 명령 실행 시 출력되는 표 형식 데이터 → 행(레코드) + 열(컬럼/필드)
- 행; 모두 동일한 형태로 되어있음
- 열; 옆으로 나열 된 것으로 열마다 이름이 지정되어 있음
- 셀; 각각의 행과 열이 만나는 부분으로 하나의 데이터 값이 저장되어 있음
- 각 열은 하나의 자료형만 가질 수 있음 ex) '수치형', '문자열형', '날짜시간형' ...
- 보통 column은 대소문자 구분X / table은 대소문자 구분O
- NULL 값은 '아무 것도 저장되지 않은 상태'를 의미
5강. 테이블 구조 참조하기
- 해당 테이블에 어떤 열이 정의되어 있는지 알 수 있음
- 자료형
- INTEGER; 수치형의 하나로 정수 값을 저장할 수 있으며 소수점은 포함할 수 없음
- BIGINT; 부호가 있는 경우에는 -922337036854775808 ~ 922337036854775807,
부호가 없는 경우에는 0 ~ 18446744073709551615 까지 데이터를 다룰 수 있으며,
저장할때 필요한 용량은 8바이트 - CHAR; 언제나 고정된 길이로 문자열 데이터가 저장됨 (고정 길이 문자열) → 최대 길이보다 작은 문자열을 저장할 경우 공백문자로 나머지를 채운 후 저장
- VARCHAR; 데이터 크기에 맞춰 저장 공간의 크기도 변경됨 (가변 길이 문자열)
- ENUM; 문자 형태인 value 를 숫자로 저장.
value 중에 하나만 저장하며, value 가 255 이하인 경우에는 1바이트,
65535 이하인 경우에는 2바이트를 사용. - DATE; 날짜값을 저장 ex) 2013년 2월 12일
- TIME; 시간을 저장 ex) 12시 30분 20초
- http://kb.globalsoft.co.kr/web/web_view.php?notice_no=260 ← 더 많은 자료형 참고
6강. 검색 조건 지정하기
- 데이터 검색 - 열(select구)을 지정하는 방법
- 열 지정 순서는 임의로 정할 수 있음 → 테이블에서 열이 정의된 순서와 동일한 순서로 지정할 필요 X
- 결과는 지정한 열의 순서대로 표시되며 동일한 열을 중복해서 지정해도 무관
- 데이터 검색 - 행(where구)을 지정하는 방법
- from구 뒤에 where구 표기
- select 열 from 테이블명 where 조건식
- 조건식 → '열과 연산자, 상수로 구성되는 식'
- 조건식의 구조 → emp_no(열이름) <(연산자) 10010(상수)
- 비교 연산자
- =; 좌변과 우변의 값이 같을 경우 참
- <; 좌변의 값이 우변보다 작을 경우 참
- <>; 좌변과 우변의 값이 다를 경우 참
- =; 좌변의 값이 우변보다 크커나 같을 경우 참
- <=; 좌변의 값이 우변보다 작거나 같을 경우 참
- 논리 연산자
- AND; 조건식1 AND 조건식2 → 좌우의 조건식이 모두 참일 경우 참
- OR; 조건식1 OR 조건식2 → 어느 조건식이든 하나만 참이면 참
- NOT; NOT 조건식 → 오른쪽에 지정한 조건식의 반대되는 값을 반환
- 문자열형, 날짜시간형을 비교할 경우 싱글쿼트(' ')로 둘러싸 표기
→ 연월일 '1990-02-18' / 시분초 '10:21:00' / 연월일시분초 '1990-02-18 10:21:00'
(+) BETWEEN에 날짜시간형을 사용할 경우 그 범위가 넓으면 인덱스를 안탈 수도 있으므로 주의 필요 - 열과 비교하기 위해서는 조건으로 지정할 값도 그 자료형에 맞춰 지정해야 함 → '리터럴’
- → 데이터 타입을 맞춰주지 않으면 SQL옵티마이저가 내부적으로 문자열 타입을 숫자 타입으로 변환 후 비교작업을 하기 때문에 인덱스 레인지 스캔이 불가능!
- → 테이블의 열은 숫자 타입인데 SQL의 비교 조건을 문자열 값과 비교하는 경우에는 이러한 현상 발생하지 않음
- ※ 문자열 비교보다는 숫자 값 비교가 빠르기 때문에 MySQL 옵티마이저가 숫자 타입에 우선권을 부여하기 때문..!
- 인덱스 열을 가공하여 다른 상수 값과 비교한다면 이 쿼리는 인덱스를 적절히 사용하지 못함
- → 두번째와 같이 열의 값을 변경하지 않고 검색하도록 유도할 수 있지만 MySQL 옵티마이저에서는 인덱스를 최적으로 이용할 수 있게 표현식을 변환하지는 못함
- → 따라서 열 값을 여러 개 곱하거나 더해서 비교해야하는 복잡한 연산의 경우 미리 계산된 값을 저장할 별도의 열을 추가하고 그 열에 인덱스를 생성하는 것이 유일한 해결책
※ 결론적으로 인덱스의 열을 변형해서 비교하는 경우에는 인덱스를 이용할 수 없게 된다는 점을 유의!
- NULL 값을 검색할 때는 = 연산자가 아닌 'IS NULL'을 사용
- NULL값이 아닌 행을 검색하고 싶다면 'IS NOT NULL' 사용
https://isstory83.tistory.com/131 ← 인덱스를 타지 않는 쿼리
https://jojoldu.tistory.com/243 ← 인덱스 조회 시 주의 사항
7강. 조건 조합하기
- AND는 OR에 비해 우선 순위가 높으므로 괄호를 잘 활용해야 함
- AND로 이루어진 조건식들의 경우, WHERE절에서 각 조건이 명시된 순서는 중요하지 않고, 그 열에 대한 조건이 있는지 없는지가 중요함 ↑
- 반면에 OR로 이루어진 경우 '풀 테이블 스캔'을 할 수 밖에 없음 → 각 조건식의 열에 대해 인덱스가 있다면 index_merge 접근 방법을 쓸 수도 있긴 하지만 여전히 느림※ 따라서 WHERE 절에 OR 연산자가 있다면 주의가 필요!
8강. 패턴 매칭에 의한 검색
- 'LIKE' 술어를 사용한 문자열의 일부분을 비교하는 부분 검색
- 열이름 LIKE '패턴' → 왼쪽에는 매칭 대상을 지정하고 오른쪽에는 패턴을 문자열로 지정 (단, 수치형 상수는 지정할 수 없음)
- 패턴 지정시에는 %_ 와 같은 메타 문자를 사용할 수 있음
- %; 임의의 문자열
- _; 임의의 문자 하나
- LIKE 연산자를 이용하요 검색을 할 경우 %를 앞에 넣어 사용하게 되면 인덱스를 타지 않는다→ %가 앞에 있을 경우 순차 정렬된 index가 아닌 random access를 하게되므로(full scan) 지양하는 것이 좋음
- 이스케이프 \ → 문자열 상수의 이스케이프 ' ex) It's → 'It''s'
- 더 많은 정규 표현식 메타문자를 사용하여 폭넓게 LIKE 패턴을 지정할 수 있음
- https://medium.com/@originerd/정규표현식-좀-더-깊이-알아보기-5bd16027e1e0
'MySQL' 카테고리의 다른 글
(6) 7장. 복수의 테이블 다루기 (0) | 2022.01.20 |
---|---|
(5) 5장. 집계와 서브쿼리 (0) | 2022.01.18 |
(4) 3장. 정렬과 연산 (0) | 2022.01.17 |
(3) 4장. 데이터의 추가, 삭제, 갱신 (0) | 2022.01.16 |
(1) 6장. 데이터베이스와 SQL (0) | 2022.01.13 |