Do It SQL입문 03-4 와일드카드로 문자열 검색하기

stan·2023년 6월 20일
0

T - SQL (SQL Server)

목록 보기
8/12
  • 쿼리는 어떤 경우에는 자신이 검색할 대상을 몰라서 일부만 검색하기도 한다
    그럴때 사용하는 것이 LIKE이다.

LIKE를 사용하면 와일드 카드로 지정한 패턴과 일치하는 문자열, 날짜, 시간등을 검색 할 수 있다.

LIKE의 기본 형식

SELECT [열] FROM [테이블] WHERE [열] LIKE [조건값]

1) [열] : 조건을 적용할 열 이름을 입력
2) [조건값] : 조건값을 입력

LIKE와 %로 특정 문자열을 포함하는 문자열 검색하기

  • 특정 문자열을 포함하는 문자열을 검색할 때는 %를 사용
  • %는 0개 이상의 문자열과 대치한다
  • %의 위치에 따라 특정 문자열이 포함된 문자열을 검색할 수 있다.

%의 사용법

  • A% : A로 시작하는 모든 문자열
  • %A : A로 끝나는 모든 문자열
  • %A% : A를 포함하는 모든 문자열

symbol 열에서 A로 시작하는 문자열을 검색하는 쿼리

SELECT * FROM nasdaq_company
WHERE symbol LIKE 'A%'

결과를 보면 첫 번째 글자가 A로 시작하는 문자열을 출력


symbol열에서 AA로 시작하는 모든 문자열을 검색 하는 쿼리

SELECT * FROM nasdaq_company
WHERE symbol LIKE 'AA%'


symbol열에서 A또는 AA로 끝나는 모든 문자열을 검색한 쿼리

SELECT * FROM nasdaq_company
WHERE symbol LIKE '%A'


symbol열에서 AA로 끝나는 모든 문자열을 검색한 쿼리

SELECT * FROM nasdaq_company
WHERE symbol LIKE '%AA'


A를 포함한 모든 symbol을 검색하는 쿼리

SELECT * FROM nasdaq_company
WHERE symbol LIKE '%A%'


특정 문자열을 제외하고 데이터를 검색

NOT LIKE

symbol 열에서 첫 번째 글자가 A로 시작하지 않는 문자열 검색

SELECT * FROM nasdaq_company
WHERE symbol NOT LIKE 'A%'


LIKE를 사용해 문자열에 %가 포함된 데이터를 검색

  • %는 예약어이므로 '%'와 같은 방법은 안됨
  • ESCAPE를 사용한다

임시테이블 생성

WITH CTE (col_1) AS (
SELECT 'A%BC' UNION ALL
SELECT 'A_BC' UNION ALL
SELECT 'ABC'
)
SELECT * FROM CTE

%를 포함한 임시 테이블에서 A%BC만 검색

WITH CTE (col_1) AS (
SELECT 'A%BC' UNION ALL
SELECT 'A_BC' UNION ALL
SELECT 'ABC'
)
SELECT * FROM CTE
WHERE col_1 LIKE '%#%%' ESCAPE '#'

  • ESCAPE문이 쿼리를 실행할 때 #을 제거해 쿼리 명령 단계에서는 '%#%%'이 호출되고 실제 실행할 때는 '%%%'으로 해석되어, %를 포함하는 앞뒤 어떠한 문자가 와도 상관없는 데이터가 검색 되는 것이다.

  • ESCAPE에 사용할 문자는 #외에 &,!,/등 다른 것도 쓸 수 있다.
    ※※※ 다만 해당 문자가 실제 문자열에 쓰이지 않는 것이어야 한다. 그래야 의도하지 않은 데이터 오류를 방지 할 수 있다 ※※※

잘못된 예:

WITH CTE (col_1) AS (
SELECT 'A%BC' UNION ALL
SELECT 'A_BC' UNION ALL
SELECT 'ABC'
)
SELECT * FROM CTE
WHERE col_1 LIKE '%%%'

% 기호는 검색할 수 있는 값이 아닌, 0개 이상의 문자를 의미하는 예약어 이기 때문이다


====================================================

%를 포함한 임시 테이블에서 A%BC만 검색: ESCAPE와 !사용

WITH CTE (col_1) AS (
SELECT 'A%BC' UNION ALL
SELECT 'A_BC' UNION ALL
SELECT 'ABC'
)
SELECT * FROM CTE
WHERE col_1 LIKE '%!%%' ESCAPE '!'

명령어가 SQL로 전달될 때

SELECT * FROM CTE
WHERE col_1 LIKE '%!%%' ESCAPE '!'

데이터베이스 엔진이 SQL 명령을 수행할 때

SELECT * FROM CTE
WHERE col_1 LIKE '%%%'

※※※ ESCAPE로 !가 제거되고 실행


_ 로 특정 문자열을 포함하는 특정 깅리의 문자열 검색 하기

만약 해당 문자열을 포함하는 특정 길이의 문자열을 검색하려면 어떻게 해야 할까?

  • 그럴때는 _ 를 사용한다
  • 찾으려는 문자열 일부와 문자열의 길이를 알고 있다면 _ 를 사용하자
    - %를 사용하다 보면 검색된 데이터양이 매우 많아 원하는 데이터를 빠르게 찾이 못하는 경우가 있다

_ 의 사용 방법

  • A_ : A로 시작하면서 뒤의 글자는 무엇이든 상관없으며 전체 글자 수는 2개인 문자열
  • _A : A로 끝나면서 앞의문자는 무엇이든 상관없으며 전체 글자 수는 2개인 문자열
  • _A_ : 세 글자 중 가운데 글자만 A이며 앞뒤로는 무엇이든 상관없는 문자열

A로 시작하면서 어떠한 문자열이든 1개만 추가로 허용하는 symbol을 검색 (A를 포함해 문자열의 길이가 2인 symbol만 검색)

SELECT * FROM nasdaq_company
WHERE symbol LIKE 'A_'


A로 끝나면서 문자열의 길이가 2인 symbol을 검색

SELECT * FROM nasdaq_company
WHERE symbol LIKE '_A'


A로 시작하고 c로 끝나면서 문자열이 4개인 symbol을 검색

SELECT * FROM nasdaq_company
WHERE symbol LIKE 'A__C'


_ 와 % 를 조합해 문자열 검색

특정 문자열로 시작하면서 특정 범위에는 사용자가 원하는 문자열을 포함하는 데이터를 검색

A_C로 기작 하면서 이후로는 어떤 문자열이 오더라도 상관 없는 symbol을 검색

SELECT * FROM nasdaq_company
WHERE symbol LIKE 'A_C%'


__F로 시작 하면서 이후에는 어떤 문자열이라도 상관없는 symbol을 검색

SELECT * FROM nasdaq_company
WHERE symbol LIKE '__F%'


A로 시작하고, 마지막은 L_ 이기만 하면 되는 symbol을 검색

SELECT * FROM nasdaqcompany
WHERE symbol LIKE 'A%L
'


[ ]로 문자나 문자 범위를 지정해 문자열 검색하기

  • 모든 문자열이 아닌 A나 B를 포함한 문자열을 검색
    - [ ]로 문자나 문자 범위를 지정해 문자열을 검색

[ ]의 사용방법

  • [A,B,C]% 또는 [A-C]% : 첫 글자가 A 또는 B 또는 C로 시작하는 모든 문자열 검색
  • %[A, B, C] 또는 %[A-C] : 마지막 글자가 A또는 B또는 C로 끝나는 모든 문자열 검색

1번째 문자가 A, 2번째 문자가 A 또는 B 또는 C인 symbol검색:,사용

SELECT * FROM nasdaq_company
WHERE symbol LIKE 'A[A, B, C]'


A로 시작하면서 2번째 문자가 A-C 또는 G 또는 M-R인 symbol을 검색

SELECT * FROM nasdaq_company
WHERE symbol LIKE 'A[A-C, G, M-R]'


문자나 문자 범위를 제외한 문자열 검색하기

  • [ ]에서 특정 문자 제외 할때 ^를 쓴당
    - e.g. [^A]%는 첫 번째 글자가 A가 아닌 모든 문자열을 검색

첫 글자가 A이고 2번째 문자가 A,B,C가 아닌 symbol 검색

SELECT * FROM nasdaq_company
WHERE symbol LIKE 'A[^A, ^B, ^C]'


연속 범위를 포함하지 않으려면 다음과 같이

첫 글자가 A이고 2번째 문자가 A,B,C가 아닌 symbol 검색 : 연속 범위 미포함

SELECT * FROM nasdaq_company
WHERE symbol LIKE 'A[^A-C]'

  • 결과는 WHERE symbol LIKE 'A[^A, ^B, ^C]' 와 같음

다양한 방법으로 와일드카드 사용하기

  • 와일드카드 조합 잘 하면 원하는 데이터를 잘 검색 할 수 있엉

A로 시작하면서 2번째 문자는 C, P를 포함하고 3번째 문자는 T를 포함하지 않으면서 마지막 문자는 W로 끝나는 문자열을 검색

SELECT * FROM nasdaq_company
WHERE symbol LIKE 'A[C,P][^T]%W'


1번째 문자는 A, 2번째 문자는 A-C, 3번째 문자는 아무거나, 4번째 문자는 0인 문자열을 검색

SELECT * FROM nasdaq_company
WHERE symbol LIKE 'A[A-C]_O%'

※※※ O 뒤로는 아무거나 와도 상관없다


퀴즈 5.

nasdaq_company 테이블에서 company_name이 apple이라는 글자를 포함하는 목록을 출력

SELECT * FROM nasdaq_company
WHERE company_name LIKE '%apple%'

퀴즈 6.

nasdaq_company 테이블에서 symbol이 AA로 시작하면서 L, Q를 포함하는 목록을 출력

SELECT * FROM nasdaqcompany
WHERE symbol LIKE 'AA
[L,Q]%'

퀴즈 7.

nasdaq_comapny 테이블에서 close_price가 $10 이상, $20 이하이면서, company_name이 A를 포함하지 않으면서, ipo_year가 2017년 이상인 목록을 출력하세요. 이때 close_price 내림차순, ipo_year 오름차순으로 출력

SELECT * FROM nasdaq_company
WHERE close_price >=10 AND close_price <=20
AND company_name NOT LIKE '%A%'
AND ipo_year >= 2017
ORDER BY close_price DESC, ipo_year ASC

profile
이진 입니다

0개의 댓글