SQL/Sqlite

SQLite 3. WHERE

컴닥 2021. 12. 29. 08:34
반응형

IF문과 유사한 개념이다.
비교 조건에 해당되는 행만 출력한다. 

 

단일 값

SELECT * 
FROM mlb_players
WHERE Position="Catcher"
ORDER BY Team

 

일치하지 않는 값

SELECT * 
FROM mlb_players
WHERE Position!="Catcher"
ORDER BY Team
SELECT * 
FROM mlb_players
WHERE Position<>"Catcher"
ORDER BY Team

'!=', '<>' 둘 다 가능하다.

 

범위

SELECT * 
FROM mlb_players
WHERE 23.01<=Age AND Age<=24.2
ORDER BY Age
SELECT * 
FROM mlb_players
WHERE Age BETWEEN 23.01 AND 24.2
ORDER BY Age

이 둘은 같은 의미다. 

 

비교 연산자의 종류

= Equal to
<> or != Not equal to
< Less than
> Greater than
<= Less than or equal to
>= Greater than or equal to

 

논리 연산자의 종류

ALL returns 1 if all expressions are 1.
AND returns 1 if both expressions are 1, and 0 if one of the expressions is 0.
ANY returns 1 if any one of a set of comparisons is 1.
BETWEEN returns 1 if a value is within a range.
EXISTS returns 1 if a subquery contains any rows.
IN returns 1 if a value is in a list of values.
LIKE returns 1 if a value matches a pattern
NOT reverses the value of other operators such as NOT EXISTS, NOT IN, NOT BETWEEN, etc.
OR returns true if either expression is 1

 

IN

SELECT * 
FROM mlb_players
WHERE Position IN ('Starting Pitcher', 'Shortstop')
ORDER BY Position, Team
SELECT * 
FROM mlb_players
WHERE Position='Starting Pitcher' OR Position='Shortstop'
ORDER BY Position, Team

둘은 같다. 하지만 IN을 사용하는 것이 깔끔하다. 

 

NOT

SELECT * 
FROM mlb_players
WHERE NOT Position='Catcher'
ORDER BY Position, Team

이런 구문도 가능하나 가독성이 좋지 않아 쓸 일이 없다. '<>', '!='가 더 편하다. 

SELECT * 
FROM mlb_players
WHERE Position NOT IN ('Starting Pitcher', 'Shortstop')
ORDER BY Position, Team

'NOT BETWEEN'도 실습해보자. 

* SQLite는 'EXISTS' 문에 NOT을 함께 쓸 수 있다. (Maria DB도 그러하다.)
* SQLite는 임베디드(내장된) DB로 주로 사용되기 때문에,
별도의 DB설정 과정을 거치는 않고,
프로그램(앱)내에서 DB 설정을 하는 경우가 많다. 
이 때 CREATE TABLE IF NOT EXISTS, DROP IF EXISTS 를 많이 쓰게 된다. 

 

IS NULL

SELECT * 
FROM mlb_players
WHERE "Weight(lbs)" IS NULL

SQLite에서 문자열은 'text', 컬럼명 또는 테이블 명은 "table name"을 사용해야 한다.

LIKE

'='과 비슷하지만,
LIKE는 문자열에서만 사용할 수 있고,
와일드 카드를 사용할 수 있는 차이점이 있다. 

SELECT * 
FROM mlb_players
WHERE Position='Catcher'
ORDER BY Position, Team
SELECT * 
FROM mlb_players
WHERE Position LIKE 'Catcher'
ORDER BY Position, Team

SELECT * 
FROM mlb_players
WHERE Name='jon%' -- 에러가 발생하진 않고, %를 문자로 인식한다. 결과는 0행
ORDER BY Name
SELECT * 
FROM mlb_players
WHERE Name like 'jon%'  -- 대소문자 구분이 없다. 
ORDER BY Name

jon%는 Jon으로 시작하는 모든 문자열이다. 
%ss는 ss로 끝나는 모든 문자열이다. 
%ns%는 가운데 ns가 들어가는 모든 문자열이다. 
R%z는 R로 시작하고 z로 끝나는 모든 문자열이다. 

%는 길이에 상관 없이 모든 문자열을 의미한다. 
단 NULL은 제외~!

_는 1개의 모든 문자를 의미한다. 

SELECT * 
FROM mlb_players
WHERE Name like '_a%z'
ORDER BY Name

이름의 두번째 글자가 a이고 마지막 글자는 z인 모든 행을 출력한다. 

와일드 카드를 이용한 검색은 일반적으로 느리다. 아껴서 쓰자. 

escape 처리
위 DB에서는 적당한 예가 없다. 
like '%_%' 라고 하면 모든 문자값들이 다 나올 텐데... 
like '%$_%' escape '$' 라고 $으로 _를 이스케이프 한다고 알려줘야 한다. 

 

GLOB

like와 달리 대소문자 구분이 있다.

도스와 유닉스에서 사용되는 와일드 카드(*, ?)를 쓴다. 
*는 like에서의 %와 같고, ?은 like에서의 _와 같다.

[]를 사용할 수 있는데, 정규식과 비슷하다. 
[abc] a or b or c 중 하나와 일치
[a-d] a에서 d까지 중 하나와 일치

SELECT * 
FROM mlb_players
WHERE Name glob '[AB]*z'
ORDER BY Name

이스케이프 처리는 [*] 이렇게 해주면 된다. 매우 간편... 

반응형