[zero-base/] DS Part 5. SQL - 37일차 스터디 노트

손윤재·2024년 1월 24일

제로베이스 DS 22기

목록 보기
38/55
post-thumbnail

Affiliated DML

DML과 함께 쓰이는 부속(affiliation) 질의어들

🔸 WHERE

SQL문에 조건을 추가해 준다.

  • Table 내에서 조건을 만족하는 데이터를 조회한다.
    SELECT column1, colunm2, ... FROM table_name WHERE condition;

❕ 비교연산자

  // 이름이 '아이유'인 데이터의 이름과 나이, 성별, 직업, 소속사를 조회
  select name, age, sex, job_title, agency from celeb where name='아이유';
  +----------+------+------+-----------------+----------------------+
  | name     | age  | sex  | job_title       | agency               |
  +----------+------+------+-----------------+----------------------+
  | 아이유    |   29 | F    | 가수, 텔런트      | EDAM엔터테이먼트       |
  +----------+------+------+-----------------+----------------------+

  // 소속사가 'YG엔터테이먼트'가 이닌 데이터의 이름, 직업, 소속사를 조회
  select name, job_title, agency from celeb where agency!='YG엔터테이먼트';
  +----------+-----------------+-----------------------+
  | name     | job_title       | agency                |
  +----------+-----------------+-----------------------+
  | 아이유    | 가수, 텔런트      | EDAM엔터테이먼트        |
  | 이미주    | 가수             | 울림엔터테이먼트         |
  | 송강      | 텔런트           | 나무엑터스              |
  | 유재석    | MC, 개그맨       | 안테나                  |
  +----------+-----------------+------------------------+

  // 나이가 50세 미만인 데이터의 성별, 소속사, 이름, 나이를 조회
  select sex, agency, name, age from celeb where age < 50;

❕ 논리연산자

  • AND : 조건을 모두 만족하는 경우 TRUE
    SELECT column1, column2, ... FROM table_name
    	WHERE condition1 AND condition2 AND condition3 ...;

  💡 AND 연산자가 OR 연산자보다 우선 순위가 높다.

    select * from celeb
         where (age<29 AND sex='f') OR (age>30 AND sex='m')
         order by age;
         
    --> AND 연산자가 OR 연산자보다 우선 순위가 높으므로 괄호가 없어도 된다.
    --> 그러나 가독성을 위해 괄호를 써주는 게 좋다.
  • OR : 하나의 조건이라도 만족하는 경우 TRUE
    SELECT column1, column2, ... FROM table_name
    	WHERE condition1 OR condition2 OR condition3 ...;
  • NOT : 조건을 만족하지 않는 경우 TRUE
    SELECT column1, column2, ... FROM table_name WHERE NOT condition;
  • 예제
    // 남자이면서 YG엔터테이먼트 소속이거나, 나이가 30세 보다 작은 데이터를
    // 나이, 소속사 순으로 정렬하여 검색
    select * from celeb
        where (sex='m' AND agency='YG엔터테이먼트') OR age<30
        order by age, agency;

    // 아이디가 홀수면서 성별이 남자이거나, 아이디가 짝수면서
    // 소속사가 YG엔터테이먼트인 데이터를 나이순으로 정렬하여 검색
    select * from celeb
        where ((id%2)=1 and sex='m') or ((id%2)=0 and agency='YG엔터테이먼트')
        order by age;
        
    // 생일이 1990년 이후이면서 여자가 아니거나,
    // 생일이 1979년 이전이면서 소속사가 안테나가 아닌 데이터를 검색
    select * from celeb
        where (birthday>19891231 AND NOT sex='f') OR 
        	  (birthday<19800101 AND NOT agency='안테나');

❕ BETWEEN ~ AND

  • BETWEEN p AND q : 조건값이 p ≤ column_value ≤ q 범위 사이에 있으면 True
    SELECT column1, column2, ... FROM table_name
    	 WHERE col_name BETWEEN p_value AND q_value;
    	 -- 둘은 같은 표현이다. --
    	 WHERE col_name >= p_value AND col_name <= q_value;
  • 예제
    // 생년월일이 1980년에서 1995년 사이가 아니면서 여자이거나,
    // 소속사가 'YG엔터테이먼트'이면서 나이가 20세에서 45세 사이가 아닌 데이터 검색
    select * from celeb 
        where (NOT birthday BETWEEN 19800101 AND 19951231 and sex='f')
        	  or (agency='YG엔터테이먼트' and NOT age BETWEEN 20 AND 45);

    // 나이가 30세에서 60세 사이이고 성별이 남자인 데이터를 나이순으로 정렬하여 조회
    select * from celeb where age BETWEEN 30 AND 60 and sex='m' order by age;

    // 나이가 30세에서 60세 사이가 아니거나 'YG엔터테이먼트' 소속인 데이터를
    // 나이의 역순으로 정렬하여 조회
    select * from celeb
        where NOT age BETWEEN 30 AND 60 or agency='YG엔터테이먼트'
        order by age desc;

    // 아이디가 1에서 5 사이의 값이면서 성별이 여자이거나,
    // 아이디가 홀수이면서 성별이 남자이면서 나이가 20에서 30세 사이인 데이터를 조회
    select * from celeb
        where (id BETWEEN 1 AND 5 and sex='f')
        	  or ((id%2)=1 and sex='m' and age BETWEEN 20 AND 30);

❕ IN / NOT IN

  • 집합 연산자로 조건값이 목록에 있으면 TRUE
    SELECT column1, column2,... FROM table_name
    	WHERE col_name IN (value1, value2,...);
        
    SELECT column1, column2, ... FROM table_name 
    	WHERE NOT column_name IN (value1, value2, ...);
  • 예제
    // 소속사가 나무엑터스, 안테나, 울림엔터테이먼트가 아니면서,
    // 성별이 여자이거나 나이가 45세 이상인 데이터 검색
    select * from celeb
        where NOT agency IN ('나무엑터스', '안테나', '울림엔터테이먼트')
              and (sex='f' or age>=45);

    // 아이유, 이미주, 송강 중에서 소속사가 '나무엑터스'인 데이터를 조회
    select * from celeb where name IN ('아이유','이미주','송강') and agency='나무엑터스';

    // 소속사가 안테나, YG엔터테이먼트 중 하나가 아니고, 성별이 여자인 데이터를 조회
    select * from celeb
        where NOT agency IN ('안테나', 'YG엔터테이먼트') and sex='f';

    // 아이유, 송강, 강동원, 차승원 중에
    // YG엔터테이먼트 소속이 아니거나 나이가 40세에서 50세 사이인 사람을 찾아본다.
    select * from celeb
       where name IN ('아이유', '송강', '강동원', '차승원')
          	 and (agency!='YG엔터테이먼트' or age between 40 and 50);

❕ LIKE / NOT LIKE

  • 패턴 연산자로 조건값이 패턴에 맞으면 TRUE
    SELECT column1, column2, ... FROM table_name WHERE col_name LIKE pettern;
  • 예제
    // 소속사 이름이 'YG'로 시작하는 패턴
    SELECT * FROM celeb WHERE agency LIKE 'YG%';

    // '엔터테이먼트'로 끝나는 소속사 이름을 가진 데이터 검색
    SELECT * FROM celeb WHERE agency LIKE '%엔터에이먼트';

    // 직업명에 '가수'가 포함된 패턴의 데이터 검색
    // '%가수%'는 '가수'로 시작해도 TRUE, '가수'로 끝나도 TRUE
    SELECT * FROM celeb WHERE job_title LIKE '%가수%';

    // 소속사 이름의 두번째 글자가 'G'인 패턴의 데이터를 검색
    // 언더바로 글자수를 확보한다. 언더바가 두개면 세번째 글자가 G인 패턴이 된다.
    SELECT * FROM celeb WHERE agency LIKE '_G%';

    // 직업명이 '가'로 시작하고 최소 2글자 이상인 패턴의 데이터를 검색
    // 언더바로 최소 두글자를 확보한다.
    // 언더바를 4개를 추가하면 최소 다섯글자를 확보할 수 있다.
    SELECT * FROM celeb WHERE job_title LIKE '가_%';
    SELECT * FROM celeb WHERE job_title LIKE '가_ _ _ _%';

    // 직업명이 '영'으로 시작하고 '모델'로 끝나는 데이터를 검색
    // '영%모델' --> '영'으로 시작하고 '모델'로 끝나면서 그 사이에 몇 글자가 와도 상관 X
    SELECT * FROM celeb WHERE job_title LIKE '영%모델';

    // 직업이 하나 이상인 연예인 중 영화배우 혹은 텔런트가 아닌 연예인 검색
    SELECT * FROM celeb
		WHERE job_title LIKE '%,%'
			  AND NOT (job_title LIKE '%영화배우%' OR job_title LIKE '%텔런트%');

🔸 ORDER BY

데이터를 특정 컬럼을 기준으로 오름차순(ASC, Ascending) 혹은 내림차순(DESC, Descending)으로 정렬한다.

  • SELECT 문에서 데이트를 특정 컬럼 기준으로 ASC 혹은 DESC 정렬하여 조회할 수 있다.
    SELECT col1, col2, ... FROM table_name ORDER BY col_1, col_2, ... ASC|DESC;
  • 예제
    // celeb TABLE에서 이름, 생년월일, 성별, 소속사 컬럼을 소속사 순으로 정렬하여 조회
    SELECT NAME, BIRTHDAY, AGE, AGENCY FROM celeb ORDER BY AGENCY;

    // celeb TABLE에서 전체 컬럼을 소속사, 이름 순으로 정렬하여 조회
    SELECT * FROM celeb ORDER BY AGENCY, NAME;

    // 이름, 나이, 직업, 소속사 컬럼을 1. 소속사 순, 2. 나이 역순으로 정렬하여 조회
    SELECT NAME, AGE, JOP_TITLE, AGENCY FROM celeb ORDER BY AGENCY ASC, AGE DESC;



🔸 Aggregate Functions

집계함수는 여러 컬럼 혹은 테이블 전체 컬럼으로부터 하나의 결과값을 반환하는 함수이다.


❕ COUNT

  • 해당 컬럼에 있는 총 튜플의 개수

  • 속성(Column)의 Tuple 데이터 총 개수를 계산하는 함수로 이때 'NULL' 값은 제외된다.

    SELECT COUNT(column_name) FROM table_name WHERE condition;
  • 예제

❕ SUM

  • 해당 컬럼에 있는 숫자 데이터들의 합계를 계산하는 함수
    SELECT SUM(column_name) FROM table_name WHERE condition;
  • 예제

❕ AVG

  • 해당 컬럼에 있는 숫자 데이터들의 평균을 계산해주는 함수
    SELECT AVG(column_name) FROM table_name WHERE condition;
  • 예제


❕ MIN

  • 해당 컬럼에 있는 숫자 데이터들 중 최솟값을 구하는 함수
    SELECT MIN(column_name) FROM table_name WHERE condition;
  • 예제


❕ MAX

  • 해당 컬럼에 있는 숫자 데이터들 중 최댓값을 구하는 함수
    SELECT MAX(column_name) FROM table_name WHERE condition;
  • 예제



🔸 GROUP BY ~ HAVING

GROUP BY로 그룹화하여 데이터를 조회한다. 이때 HAVING은 GROUP BY의 조건자 역할을 한다.

  • 그룹별 데이터를 조회할 때 집계함수를 많이 사용한다.

  • 조건에 집계함수가 포함되는 경우 WHERE 대신 HAVING을 사용한다.

    SELECT column1, column2, ... FROM table_name WHERE condition
       GROUP BY column1, column2, ...   --> 그룹화
       HAVING condition(Aggregate Functions)
       ORDER BY column1, column2, ...;  --> 정렬
  • 예제
  1. 경찰서 별로 발생한 범죄 건수의 합이 4000 건보다 큰 경우를 검색
    SELECT police_station, SUM(case_number) count FROM crime_status
    	WHERE status_type LIKE '발생'
    	GROUP BY police_station HAVING count > 4000;
	<확인>
    SELECT SUM(case_number) FROM crime_status
    	WHERE status_type LIKE '발생' AND police_station LIKE '영등포';
  1. 경찰서 별로 발생한 폭력과 절도의 범죄 건수 평균이 2000 이상인 경우를 검색
    SELECT police_station, AVG(case_number) FROM crime_status
    	WHERE status_type='발생' AND crime_type IN ('폭력', '절도')
    	GROUP BY police_station HAVING AVG(case_number) >= 2000;
    <확인>
    SELECT AVG(case_number) FROM crime_status
    	WHERE police_station LIKE '영등포' AND status_type LIKE '발생'
    		  AND (crime_type LIKE '폭력' OR crime_type LIKE '절도'); 
profile
ISTP(정신승리), To Be Data Scientist

0개의 댓글