취미가 좋다
[5] Select 확장 본문
1 DISTINCT & AGGREGATE
1.1 DISTINCT
SELECT DISTINCT name FROM student;
student에서 name 필드의 값들을 가져올 때, 중복된 것은 하나만 가져온다.
1.2 AGGREGATE
집합(여러 값)들에 대해 동작하는 함수이다.
아래의 COUNT, MIN, MAX, SUM, AVG 이 있다.
1.3 COUNT()
SELECT COUNT(name) FROM student;
SELECT COUNT(*) FROM student;
SELECT COUNT(DISTINCT name) FROM student;
student 테이블에서 null 이 아닌 name 의 개수를 반환
student 테이블에서 null 이 아닌 레코드 의 개수를 반환
student 테이블에서 null 이 아닌 겹치지 않는 name 의 개수를 반환
1.4 MIN(), MAX()
SELECT MAX(age) FROM teacher;
SELECT MIN(age) FROM teacher;
특정 칼럼을 기준으로 최대, 최소값을 선택
숫자에만 사용하는 것이 좋다.
1.5 SUM(), AVG()
SELECT SUM(age) FROM teacher;
SELECT AVG(age) FROM teacher;
특정 칼럼을 기준으로 총합, 평균을 구한다.
2. GROUP BY & ORDER BY & LIMIT
SELECT FROM [JOIN ... ON] [WHERE] [GROUP BY] [HAVING] [ORDER BY] [LIMIT]
SELECT 에 포함될 수 있는 여러 절들이 있다.
2.1 GROUP BY 절
SELECT 묶은 필드이름, 그룹함수(필드이름)
FROM 테이블이름
[WHERE 조건]
GROUP BY 묶은 필드이름;
SELECT class FROM student GROUP BY class;
SELECT class, AVG(height) FROM student GROUP BY class;
특정 필드를 기준으로 그룹화하여 검색할 때 사용
group by 를 했을 때, select 대상이 하나로 지정될 수 있는 대상이어야 한다.
AVG(height)는 하나의 값이라 가능하지만, height는 불가능하다.
2.2 HAVING 절
SELECT 필드이름, 그룹함수(필드이름)
FROM 테이블이름
[WHERE 조건]
GROUP BY 필드이름
HAVING 조건;
SELECT class, AVG(height) FROM student
GROUP BY class HAVING AVG(height) > 175;
WHERE 절과 비슷하게, GROUP BY 절에 의해 반환되는 결과 집합의 조건을 설정
각 반을 기준으로 학생들의 반과 평균 키를 가져오는 데, 평균 키가 175가 넘는 결과만 가져온다.
2.3 ORDER BY & LIMIT 절
SELECT * FROM student ORDER BY height DESC;
SELECT * FROM student ORDER BY height ASC;
SELECT 필드이름 FROM 테이블이름 [WHERE 조건] LIMIT [원하는 레코드 개수];
SELECT * FROM student LIMIT 3;
SELECT * FROM student ORDER BY height DESC LIMIT 3;
데이터를 오름차순, 내림차순으로 정렬한다.
오름차순 ASC는 생략 가능하다.
LIMIT 절은 가져오는 데이터의 개수를 제한한다.
제일 아래와 같이 작성하면 키 상위 3명을 가져올 수 있다.
2.4 문법 작성 순서
- SELECT
- FROM
- JOIN
- ON
- GROUP BY
- HAVING
- ORDER BY
2.5 실행 작동 순서
- FROM
- ON
- JOIN
- WHERE
- GROUP BY
- HAVING
- SELECT
- DISTINCT
- ORDER BY
3. Alias & SubQuery
3.1 Alias
1. SELECT 필드이름 AS 별칭 FROM 테이블이름;
2. SELECT 필드이름 FROM 테이블이름 AS 별칭;
SELECT AVG(height) AS height_avg FROM student;
SELECT s.age, s.class FROM student AS s;
테이블 이름이나 필드 이름에 별칭을 지정할 수 있다.
복잡한 쿼리나 JOIN 문을 이용할 때 필요하다.
3.2 SubQuery
한 쿼리에 다른 쿼리를 포함해서 사용하는 것
외부 쿼리 (outer query) : 서브쿼리를 포함하고 있는 쿼리
내부 쿼리 (inner query) : 서브쿼리
서브쿼리는 반드시 괄호 ( ) 로 감싸져 있어야 한다.
서브쿼리 안에 서브쿼리가 또 있을 수 있다.
쿼리를 구조화시켜서, 쿼리의 각 부분을 명확히 구분할 수 있게 한다.
복잡한 JOIN 동작을 수행할 수 있는 또 다른 방법을 제공한다.
복잡한 JOIN 보다 더 읽기 편하다.
하지만 JOIN이 성능 상으로 더 좋기 때문에, 차선책으로 사용하는 게 좋다.
SELECT id FROM class WHERE name = "수학";
SELECT student.id FROM student
INNER JOIN student_class ON student.id = student_class.student_id;
SELECT student.id FROM student
INNER JOIN student_class ON student.id = student_class.student_id
WHERE student_class.class_id = (SELECT id FROM class WHERE name = "수학");
class에서 수학의 id를 가져온다.
수학을 수강하고 있는 학생들의 id 데이터를 가져온다.
SELECT AVG(avg_height) FROM (
SELECT class, avg(height) as avg_height FROM student GROUP BY class
) As avg_height_per_class;
파생 테이블 : FROM 절 아래에 서브쿼리로 만들어진 테이블
반드시 이름을 Alias 로 설정해야 한다.
각 반 키의 평균의 평균을 구할 수도 있다.
'Sparta Coding Club > Database & SQL' 카테고리의 다른 글
[6] Transaction (0) | 2021.08.11 |
---|---|
[4] DB 연관 관계 (0) | 2021.08.11 |
[3] DB CRUD (0) | 2021.08.11 |
[2] Database 기초 & 용어 (0) | 2021.08.11 |
[1] Database 개념 & 종류 (0) | 2021.08.11 |