취미가 좋다

[5] Select 확장 본문

Sparta Coding Club/Database & SQL

[5] Select 확장

benlee73 2021. 8. 11. 16:13

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 문법 작성 순서

  1. SELECT
  2. FROM
  3. JOIN
  4. ON
  5. GROUP BY
  6. HAVING
  7. ORDER BY

2.5 실행 작동 순서

  1. FROM
  2. ON
  3. JOIN
  4. WHERE
  5. GROUP BY
  6. HAVING
  7. SELECT
  8. DISTINCT
  9. 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
Comments