SQLite 3. WHERE
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
이스케이프 처리는 [*] 이렇게 해주면 된다. 매우 간편...