[SQL] DML(2) - Filtering data(DITINCT, WHERE, LIKE, IN, BETWEEN, LIMIT)

문지은·2023년 4월 8일
0

Database with SQLite

목록 보기
4/7
post-thumbnail

데이터를 필터링하여 중복을 제거하는 방법과, 조건을 설정하는 등 쿼리를 제어하는 방법에 대해 알아보자.
사용한 파일명과 테이블 명은 이전 게시글과 같다.


SELECT DISTINCT clause

SELECT DISTINCT select_list FROM table_name;
  • 조회 결과에서 중복된 행을 제거
  • DISTINCT 절은 SELECT 에서 선택적으로 사용할 수 있는 절
  1. DISTINCT 절은 SELECT 키워드 바로 뒤에 나타나야 함
  2. DISTINCT 키워드 뒤에 컬럼 또는 컬럼 목록 작성

SELECT DISTINCT 예제

  • 중복 없이 모든 지역 조회하기
SELECT DISTINCT country FROM users;
  • 지역 순으로 오름차순 정렬하여 중복 없이 모든 지역 조회하기
SELECT DISTINCT country FROM users ORDER BY country;
  • 이름과 지역이 중복 없이 모든 이름과 지역 조회하기
SELECT DISTINCT first_name, country FROM users;
  • 이름과 지역 중복 없이 지역 순으로 오름차순 정렬하여 모든 이름과 지역 조회하기
SELECT DISTINCT first_name, country
FROM users
ORDER BY country;

WHERE clause

SELECT column_list FROM table_name
WHERE search_condition;
  • 조회 시 특정 검색 조건을 지정
  • WHERE 절은 SELECT 문에서 선택적으로 사용할 수 있는 절
    • SELECT 문 외에도 UPDATE 및 DELETE 문에서 WHERE 절을 사용할 수 있음
  • FROM 절 뒤에 작성

WHERE의 검색 조건 작성 형식

left_expression COMPARISON_OPERATOR right_expression
WHERE column_1 = 10

WHERE column_2 LIKE 'Ko%'

WHERE column_3 in (1,2)

WHERE column_4 BETWEEN 10 AND 20

SQLite comparison operators (비교연산자)

=, <> or != , <, >, <=, >=

SQLite logical operators (논리연산자)

  • 일부 표현식의 truth를 테스트할 수 있음
  • 1, 0 또는 NULL 값을 반환
  • SQLite는 Boolean 데이터 타입을 제공하지 않으므로 1은 TRUE를 의미하고 0은 FALSE를 의미
  • ALL, AND, ANY, BETWEEN, IN, LIKE, NOT, OR 등

WHERE 예제

  • 나이가 30살 이상인 사람들의 이름, 나이, 계좌 잔고 조회하기
    SELECT first_name, age, balance FROM users
    WHERE age >= 30;
  • 나이가 30살 이상이고 계좌 잔고가 50만원 초과인 사람들의 이름, 나이, 계좌 잔고 조회하기
    SELECT first_name, age, balance FROM users
    WHERE age >= 30 AND balance > 500000;

LIKE operator

  • Qurey data based on pattern matching
  • 패턴 일치를 기반으로 데이터를 조회
  • SELECT, DELETE, UPDATE 문의 WHERE 절에서 사용
  • 기본적으로 대소문자 구분하지 않음
  • SQLite는 패턴 구성을 위한 두 개의 와일드카드(wildcards)를 제공
    1. % (percent)
      • 0 개 이상의 문자가 올 수 있음을 의미
    2. _ (underscore)
      • 단일(1개) 문자가 있음을 의미

% wildcard 예시

  • ‘영%’ : 영으로 시작하는 모든 문자열과 일치 (영, 영미, 영미리 등)
  • ‘%도’ : 도로 끝나는 모든 문자열과 일치 (도, 수도, 경기도 등)
  • ‘%강원%’ : 강원을 포함하는 모든 문자열과 일치 (강원, 강원도, 강원도에 살아요 등)

_ wildcard 예시

  • ‘영_’ : 영으로 시작하고 총 2자리인 문자열과 일치 (영미, 영수, 영호 등)
  • ‘_도’: 도로 끝나고 총 2자리인 문자열과 일치 (수도, 과도 등)

LIKE 예제

  • 이름에 '호'가 포함되는 사람들의 이름과 성 조회하기
SELECT first_name, last_name FROM users
WHERE first_name LIKE '%호%';
  • 이름이 ‘준’으로 끝나는 사람들의 이름 조회하기
SELECT first_name FROM users
WHERE first_name LIKE '%준';
  • 서울 지역 전화번호를 가진 사람들의 이름과 전화번호 조회하기
SELECT first_name, phone FROM users
WHERE phone LIKE '02-%';
  • 나이가 20대인 사람들의 이름과 나이 조회하기
SELECT first_name, age FROM users
WHERE age LIKE '2_';
  • 전화번호 중간 4자리가 51로 시작하는 사람들의 이름과 전화번호 조회하기
SELECT first_name, phone FROM users
WHERE phone LIKE '%-51__-%';

IN operator

  • 값이 값 목록 결과에 있는 값과 일치하는지 확인
  • 표현식이 값 목록의 값과 일치하는지 여부에 따라 true 또는 false 반환
  • IN 연산자의 결과를 부정하려면 NOT IN 연산자 사용

IN 예제

  • 경기도 혹은 강원도에 사는 사람들의 이름과 지역 조회하기
SELECT first_name, country FROM users
WHERE country IN ('경기도', '강원도');
  • IN 연산자 대신 OR 연산자를 사용하여 동일한 결과를 반환할 수 있다.
SELECT first_name, country FROM users
WHERE country == '경기도' or country ='강원도';
  • 경기도 혹은 강원도에 살지 않는 사람들의 이름과 지역 조회하기
SELECT first_name, country FROM users
WHERE country NOT IN ('경기도', '강원도');

BETWEEN operator

test_expression BETWEEN low_expression AND high_expression
  • 값이 범위 안에 있는지 테스트
  • 값이 지정된 범위에 있으면 true를 반환
  • SELECT, DELETE, 및 UPDATE 문의 WHERE 절에서 사용할 수 있음
  • BETWEEN 연산자의 결과를 부정하려면 NOT BETWEEN 연산자 사용

BETWEEN 예제

  • 나이가 20살 이상, 30살 이하인 사람들의 이름과 나이 조회하기
    • AND 연산자를 사용하여 동일한 결과 반환할 수 있음
SELECT first_name, age FROM users
WHERE age BETWEEN 20 AND 30;
SELECT first_name, age FROM users
WHERE age >= 20 AND age <= 30;
  • 나이가 20살 이상, 30살 이하가 아닌 사람들의 이름과 나이 조회하기
    • OR 연산자를 사용하여 동일한 결과 반환할 수 있음
SELECT first_name, age FROM users
WHERE age NOT BETWEEN 20 AND 30;
SELECT first_name, age FROM users
WHERE age < 20 OR age > 30;

LIMIT clause

SELECT column_list FROM table_name LIMIT row_count;
  • Constrain the number of rows returned by a query
  • 쿼리에서 반환되는 행 수를 제한
  • SELECT 문에서 선택적으로 사용할 수 있는 절
  • row_count는 반환되는 행 수를 지정하는 양의 정수를 의미

LIMIT 예제

  • 첫 번째부터 열 번째 데이터까지 rowid와 이름 조회하기
    SELECT rowid, first_name FROM users LIMIT 10;
  • 계좌 잔고가 가장 많은 10명의 이름과 계좌 잔고 조회하기
    • ORDER BY 절과 함께 사용하여 지정된 순서로 여러 행을 가져올 수도 있음
    • LIMIT 절에 지정된 행 수를 가져오기 전에 결과를 정렬하기 때문
SELECT first_name, balance FROM users
ORDER BY balance DESC LIMIT 10;
  • 나이가 가장 어린 5명의 이름과 나이 조회하기
SELECT first_name, age FROM users
ORDER BY age LIMIT 5;

OFFSET keyword

  • LIMIT 절을 사용하면 첫 번째 데이터부터 지정한 수 만큼의 데이터를 받아올 수 있지만, OFFSET과 함께 사용하면 특정 지정된 위치에서부터 데이터를 조회할 수 있음
  • 11번째부터 20번째 데이터의 rowid와 이름 조회하기
SELECT rowid, first_name FROM users
LIMIT 10 OFFSET 10;

📍 요약

-- 중복 없이 모든 지역 조회하기
SELECT DISTINCT country FROM users;

-- 지역 순으로 오름차순 정렬하여 중복 없이 모든 지역 조회하기
SELECT DISTINCT country FROM users ORDER BY country;

-- 이름과 지역이 중복 없이 모든 이름과 지역 조회하기
SELECT DISTINCT first_name, country FROM users;

-- 이름과 지역 중복 없이 지역 순으로 오름차순 정렬하여 모든 이름과 지역 조회하기
SELECT DISTINCT first_name, country
FROM users
ORDER BY country;

-- 나이가 30살 이상인 사람들의 이름, 나이, 계좌 잔고 조회하기
SELECT first_name, age, balance FROM users
WHERE age >= 30;

-- 나이가 30살 이상이고 계좌 잔고가 50만원 초과인 사람들의 이름, 나이, 계좌 잔고 조회하기
SELECT first_name, age, balance FROM users
WHERE age >= 30 AND balance > 500000;

-- 이름에 '호'가 포함되는 사람들의 이름과 성 조회하기
SELECT first_name, last_name FROM users
WHERE first_name LIKE '%호%';

-- 이름이 ‘준’으로 끝나는 사람들의 이름 조회하기
SELECT first_name FROM users
WHERE first_name LIKE '%준';

-- 서울 지역 전화번호를 가진 사람들의 이름과 전화번호 조회하기
SELECT first_name, phone FROM users
WHERE phone LIKE '02-%';

-- 나이가 20대인 사람들의 이름과 나이 조회하기
SELECT first_name, age FROM users
WHERE age LIKE '2_';

-- 전화번호 중간 4자리가 51로 시작하는 사람들의 이름과 전화번호 조회하기
SELECT first_name, phone FROM users
WHERE phone LIKE '%-51__-%';

-- 경기도 혹은 강원도에 사는 사람들의 이름과 지역 조회하기
SELECT first_name, country FROM users
WHERE country IN ('경기도', '강원도');

SELECT first_name, country FROM users
WHERE country == '경기도' or country ='강원도';

-- 경기도 혹은 강원도에 살지 않는 사람들의 이름과 지역 조회하기
SELECT first_name, country FROM users
WHERE country NOT IN ('경기도', '강원도');

-- 나이가 20살 이상, 30살 이하인 사람들의 이름과 나이 조회하기
SELECT first_name, age FROM users
WHERE age BETWEEN 20 AND 30;

SELECT first_name, age FROM users
WHERE age >= 20 AND age <= 30;

-- 나이가 20살 이상, 30살 이하가 아닌 사람들의 이름과 나이 조회하기
SELECT first_name, age FROM users
WHERE age NOT BETWEEN 20 AND 30;

-- 첫 번째부터 열 번째 데이터까지 rowid와 이름 조회하기
SELECT rowid, first_name FROM users LIMIT 10;

-- 계좌 잔고가 가장 많은 10명의 이름과 계좌 잔고 조회하기
SELECT first_name, balance FROM users
ORDER BY balance DESC LIMIT 10;

-- 나이가 가장 어린 5명의 이름과 나이 조회하기
SELECT first_name, age FROM users
ORDER BY age LIMIT 5;

-- 11번째부터 20번째 데이터의 rowid와 이름 조회하기
SELECT rowid, first_name FROM users
LIMIT 10 OFFSET 10;
profile
코드로 꿈을 펼치는 개발자의 이야기, 노력과 열정이 가득한 곳 🌈

0개의 댓글