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

SQL문에 조건을 추가해 준다.
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 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);
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);
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 '%텔런트%');
데이터를 특정 컬럼을 기준으로 오름차순(ASC, Ascending) 혹은 내림차순(DESC, Descending)으로 정렬한다.
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;

집계함수는 여러 컬럼 혹은 테이블 전체 컬럼으로부터 하나의 결과값을 반환하는 함수이다.
해당 컬럼에 있는 총 튜플의 개수
속성(Column)의 Tuple 데이터 총 개수를 계산하는 함수로 이때 'NULL' 값은 제외된다.
SELECT COUNT(column_name) FROM table_name WHERE condition;

SELECT SUM(column_name) FROM table_name WHERE condition;

SELECT AVG(column_name) FROM table_name WHERE condition;


SELECT MIN(column_name) FROM table_name WHERE condition;


SELECT MAX(column_name) FROM table_name WHERE condition;


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, ...; --> 정렬
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 '영등포';
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 '절도');