ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • SQLite 3. WHERE
    SQL/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

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

    반응형
Designed by Tistory.