집합 연산

레코드를 조회하고 분류한 뒤, 특정 작업을 하는 연산

 

1. GROUP BY

데이터를 조회할 때 그룹으로 묶어서 조회합니다.

 

ex 1. 고객 테이블의 State 에 따라 그룹화해서 조회해라.

SELECT * FROM customers
GROUP BY State;

 

* 만약 쿼리 결과 데이터의 중간이 비어있다면 ??

데이터베이스에서 데이터를 불러오는 과정에서 State 에 따라 그룹을 지정했지만,

그룹에 대한 작업없이 조회만 했습니다.

 

그래서 쿼리 결과로 나타나는 데이터는 각 그룹의 첫번째 데이터만 표현됩니다.

 

 

HAVING

GROUP BY 로 조회한 결과를 필터링 할 수 있습니다.

 

SELECT CustomerId, AVG(Total)
FROM invoices
GROUP BY CustomerId
HAVING AVG(Total) > 6.00

 

모든 고객의 주문서에서 가격의 평균을 구한 뒤에, 그 평균이 6.00을 넘는 결과만 조회합니다.

 

이렇게 GROUP BY로 그룹을 지은 결과에 필터를 적용할 때 HAVING 을 사용할 수 있습니다.

 

HAVING 은 WHERE 과는 적용방식이 다릅니다.

HAVING 은 그룹화한 결과에 대한 필터이고, WHERE 은 저장된 레코드를 필터링 합니다.

따라서 그룹화 전에 필터를 해야한다면, WHERE 를 사용하는것이 맞습니다.

 

 

COUNT , SUM , AVG , MAX , MIN

레코드의 갯수를 헤아릴 때 사용합니다.

 

ex. 모든 레코드에 대한 COUNT 함수 사용

SELECT * COUNT(*) FROM customers
GROUP BY State;

- 각 그룹의 첫번째 레코드와 각 그룹의 레코드 갯수를 집계하여 리턴합니다.

 

ex. 각 State 에 해당하는 레코드 갯수를 확인하는 COUNT 함수 사용

SELECT State, COUNT(*) FROM Customers
GROUP BY State;

- 그룹으로 묶인 결과의 레코드 갯수를 확인할 수 있습니다.

 

 

 

SELECT 실행 순서

- FROM

- WHERE

- GROUP BY

- HAVING

- SELECT

- ORDER BY

 

 

문제

1. 현재 있는 데이터베이스에 존재하는 모든 테이블 정보를 보여주기

SHOW TABLES;

 

2. USER 테이블의 구조를 보기위한 SQL 을 작성

DESCRIBE USER;

 

3. USER 테이블에 존재하는 모든 컬럼에 대한 데이터를 확인

SELECT * FROM USER;

 

4. USER 테이블에 name = 'kim', email='kim@gmail.com' 으로 데이터를 추가

INSERT INTO user(name,email) VALUES ('kim','kim@gmail.com')

 

5. USER 테이블에 name 이 kim 인 데이터를 찾아라

SELECT * FROM user WHERE user.name = 'kim';

 

6. USER 테이블에 name 이 kim 이 아닌 데이터를 찾아라

SELECT * FROM user WHERE user.name <> 'kim';

 

7. Content 테이블에 존재하는 모든 테이블에서 title 컬럼만을 찾기 위한 SQL 작성

SELECT Content.title FROM Content;

 

 

8. 위의 테이블에서 Content의 title 과 그 컨텐츠를 작성한 User 의 name 을 찾아라 ( 저자가 없어도 찾음 )

SELECT Content.title, User.name FROM Content LEFT JOIN User ON User.id = Content.id;

 

9. 위의 테이블에서 Content의 title 과 그 컨텐츠를 작성한 User 의 name 을 찾아라. ( 저자가 있는 컨텐츠의 타이틀만 찾음 )

SELECT Content.title, User.name FROM Content JOIN user ON user.id = content.userId;

 

10. Content 의 데이터를 수정하기 위한 SQL 을 작성해라.

( title이 database sprint인 content 데이터에서 body를 database is very easy로 수정해야합니다. )

UPDATE Content SET Content.body = 'database is very easy' WHERE Content.title = 'database sprint';

+ Recent posts