SQL - 부속 질의어

허재정·2024년 3월 18일

SQL

목록 보기
3/7

1. Affiliated DML (부속 질의어)

  • celeb 테이블 생성
    ID (int)
    Name (varchar)
    BIRTHDAY (date)
    AGE (int)
    SEX (char)
    JOB_TITLE (varchar)
    AGENCY (varchar)

(1) WHERE (조건 추가)
- Table 내에서 조건을 만족하는 데이터 조회

    SELECT column1, colunm2, ... FROM table_name WHERE condition;

(2) 비교 연산자

  • 관련 문제
    이름이 '아이유'인 데이터의 이름과 나이, 성별, 직업, 소속사를 조회
select name, age, sex, job_title, agency from celeb where name='아이유';

소속사가 'YG엔터테이먼트'가 이닌 데이터의 이름, 직업, 소속사를 조회

select name, job_title, agency from celeb where agency!='YG엔터테이먼트';

나이가 50세 미만인 데이터의 성별, 소속사, 이름, 나이를 조회

select sex, agency, name, age from celeb where age < 50;

(3) 논리 연산자

  • 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;
  • NOT : 조건을 만족하지 않을 때
SELECT column1, column2, ... FROM table_name WHERE NOT condition;

예제
(1) 남자이면서 YG엔터테이먼트 소속이거나, 나이가 30세 보다 작은 데이터를 나이, 소속사 순으로 정렬하여 검색

select * from celeb
where (sex='m' AND agency='YG엔터테이먼트') OR age<30
order by age, agency;

(2) 아이디가 홀수면서 성별이 남자이거나, 아이디가 짝수면서 소속사가 YG엔터테이먼트인 데이터를 나이순으로 정렬하여 검색

select * from celeb
where ((id%2)=1 and sex='m') or ((id%2)=0 and agency='YG엔터테이먼트')
order by age;

(3) 생일이 1990년 이후이면서 여자가 아니거나, 생일이 1979년 이전이면서 소속사가 안테나가 아닌 데이터를 검색

select * from celeb
where (birthday>19891231 AND NOT sex='f') OR (birthday<19800101 AND NOT agency='안테나');

================================================
(4) BETWEEN A AND B
조건값이 A ≤ column_value ≤ B 범위 사이

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;

예제
(1) 생년월일이 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);

(2) 나이가 30세에서 60세 사이이고 성별이 남자인 데이터를 나이순으로 정렬하여 조회

select * from celeb where age BETWEEN 30 AND 60 and sex='m' order by age;

(3) 나이가 30세에서 60세 사이가 아니거나 'YG엔터테이먼트' 소속인 데이터를 나이의 역순으로 정렬하여 조회

select * from celeb
where NOT age BETWEEN 30 AND 60 or agency='YG엔터테이먼트' 
order by age desc;

(4) 아이디가 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);

====================================
(5) IN / NOT IN

  • 집합 연산자로 조건값이 목록에 있음
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, ...);

예제
(1) 소속사가 나무엑터스, 안테나, 울림엔터테이먼트가 아니면서, 성별이 여자이거나 나이가 45세 이상인 데이터 검색

select * from celeb
where NOT agency IN ('나무엑터스', '안테나', '울림엔터테이먼트') and (sex='f' or age>=45);

(2) 아이유, 이미주, 송강 중에서 소속사가 '나무엑터스'인 데이터를 조회

select * from celeb where name IN ('아이유','이미주','송강') and agency='나무엑터스';

(3) 소속사가 안테나, YG엔터테이먼트 중 하나가 아니고, 성별이 여자인 데이터를 조회

 select * from celeb
where NOT agency IN ('안테나', 'YG엔터테이먼트') and sex='f';

(4) 아이유, 송강, 강동원, 차승원 중에 YG엔터테이먼트 소속이 아니거나 나이가 40세에서 50세 사이인 사람을 찾아본다.

select * from celeb
where name IN ('아이유', '송강', '강동원', '차승원') and (agency!='YG엔터테이먼트' or age between 40 and 50);

(6) LIKE / NOT LIKE

  • 패턴 연산자로 조건값이 패턴에 맞는지
SELECT column1, column2, ... FROM table_name WHERE col_name LIKE pettern;

예제
(1) 소속사 이름이 'YG'로 시작하는 패턴

SELECT * FROM celeb WHERE agency LIKE 'YG%';

(2) '엔터테이먼트'로 끝나는 소속사 이름을 가진 데이터 검색

SELECT * FROM celeb WHERE agency LIKE '%엔터에이먼트';

(3) 직업명에 '가수'가 포함된 패턴의 데이터 검색 '%가수%'는 '가수'로 시작해도 TRUE, '가수'로 끝나도 TRUE

SELECT * FROM celeb WHERE job_title LIKE '%가수%';

(4) 소속사 이름의 두번째 글자가 'G'인 패턴의 데이터를 검색 언더바로 글자수를 확보한다. 언더바가 두개면 세번째 글자가 G인 패턴이 된다.

SELECT * FROM celeb WHERE agency LIKE '_G%';

(5) 직업명이 '가'로 시작하고 최소 2글자 이상인 패턴의 데이터를 검색 언더바로 최소 두글자를 확보한다.

SELECT * FROM celeb WHERE job_title LIKE '가_%';

(6) 직업명이 '가'로 시작하고 최소 4글자 이상인 패턴의 데이터를 검색 언더바를 4개를 추가하면 최소 다섯글자를 확보할 수 있다.

SELECT * FROM celeb WHERE job_title LIKE '가_ _ _ _%';

(7) 직업명이 '영'으로 시작하고 '모델'로 끝나는 데이터를 검색 '영%모델' --> '영'으로 시작하고 '모델'로 끝나면서 그 사이에 몇 글자가 와도 상관 없다는 것임

SELECT * FROM celeb WHERE job_title LIKE '영%모델';

(8) 직업이 하나 이상인 연예인 중 영화배우 혹은 텔런트가 아닌 연예인 검색

SELECT * FROM celeb
WHERE job_title LIKE '%,%'
AND NOT (job_title LIKE '%영화배우%' OR job_title LIKE '%텔런트%');

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

SELECT col1, col2, ... FROM table_name ORDER BY col_1, col_2, ... ASC;

SELECT col1, col2, ... FROM table_name ORDER BY col_1, col_2, ... DESC;

예제
(1) celeb TABLE에서 이름, 생년월일, 성별, 소속사 컬럼을 소속사 순으로 정렬하여 조회

SELECT NAME, BIRTHDAY, AGE, AGENCY FROM celeb ORDER BY AGENCY;

(2) celeb TABLE에서 전체 컬럼을 소속사, 이름 순으로 정렬하여 조회

SELECT * FROM celeb ORDER BY AGENCY, NAME;

(3) 이름, 나이, 직업, 소속사 컬럼을 1. 소속사 순, 2. 나이 역순으로 정렬하여 조회

SELECT NAME, AGE, JOP_TITLE, AGENCY FROM celeb ORDER BY AGENCY ASC, AGE DESC;

========================================================================

2. Aggregate Functions (집계함수 - 하나의 결과값 반환 )

(1) COUNT (해당 컬럼의 총 tuple 수)

  • 속성(Column)의 Tuple 데이터 총 개수를 계산하는 함수로 이때 'NULL' 값은 제외 됨
SELECT COUNT(column_name) FROM table_name WHERE condition;

예제
(1) police_station 테이블에서 데이터는 총 몇개?

SELECT COUNT(*) FROM police_station;

(2) crime_station 테이블에서 경찰서는 총 몇 개?

SELECT COUNT(DISTINCT police_station) FROM crime_status;

(3) crime_type (범죄 유형)은 총 몇가지?

SELECT COUNT(DISTINCT crime_type) FROM crime_status;

============================================
(2) SUM (해당 컬럼의 숫자 데이터의 합계 계산)

SELECT SUM(column_name) FROM table_name WHERE condition;

예제
(1) 범죄 총 발생 건수?

SELECT SUM(case_number) FROM crime_status
WHERE status_type = "발생";

(2) 범죄 유형 중 살인의 총 발생 건수?

SELECT SUM(case_number) FROM crime_status
WHERE status_type = "발생" AND crime_type = "살인";

(3) 중부 경찰서에서 검거된 총 범죄 건수?

SELECT SUM(case_number) FROM crime_status
WHERE status_type = "검거" AND police_station = "중부";

===============================================
(3) AVG (해당 컬럼에 있는 숫자 데이터들의 평균 계산)

SELECT AVG(column_name) FROM table_name WHERE condition;

예제
(1) 평균 폭력 검거 건수?

SELECT AVG(case_number) FROM crime_status 
WHERE crime_type LIKE "폭력" AND status_type LIKE "검거";

(2) 중부경찰서의 범죄 평균발생 건수?

SELECT AVG(case_number) FROM crime_status
WHERE status_type = "발생" AND police_station LIKE "중부";

============================================================
(4) MIN (해당 컬럼에 있는 숫자 데이터들 중 최소값)

SELECT MIN(column_name) FROM table_name WHERE condition;

예제
(1) 강도 발생 건수가 가장 적은 경우 건수?

SELECT police_station, MIN(case_number) FROM crime_status
WHERE crime_type LIKE "강도" AND status_type LIKE "발생";

(2) 중부경찰서에서 가장 낮은 검거 건수?

SELECT MIN(case_number) FROM crime_status
WHERE status_type LIKE "검거" AND police_station LIKE "중부"

=============================================================
(5) MAX (해당 컬럼에 있는 숫자 데이터들 중 최대값)

SELECT MAX(column_name) FROM tabale_name WHERE condition;

예제
(1) 살인이 가장 많이 검거된 건수?

SELECT MAX(case_number) FROM crime_status
WHERE crime_type LIKE "살인";

(2) 강남경찰서에서 가장 맣이 발생한 범죄건수?

SELECT MAX(case_number) FROM crime_status
WHERE police_station LIKE "강남" AND status_type LIKE "발생";

================================================================
(6) 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_type
WHERE status_type LIKE "발생"
GROUP BY police_station HAVING count > 4000;

(2) 경찰서 별로 발생한 폭력과 절도의 범죄 건수 평균이 2000 이상인 경우를 검색

SELECT police_station, AVG(case_number) FROM crime_status
WHERE crime_type IN ("폭력" AND "절도") AND status_type LIKE "발생"
GROUP BY police_station
HAVING AVG(case_number) > 2000;
profile
Data Science 스터디로그

0개의 댓글