티스토리 뷰

(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
공지사항
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31