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