TIL 데이터베이스 (5장)

finelinefe·2020년 10월 21일
0

DATABASE

목록 보기
7/12
post-thumbnail

💡 COUNT, SUM, AVG, MIN, MAX

SELECT COUNT * FROM 테이블명 , (where) 구 추가
SELECT DISTINCT ~ FROM 테이블명
SELECT SUM(quantity) FROM 테이블명
SELECT AVG(quantity),SUM(quantity)/COUNT(quantity) FROM 테이블명
SELECT MIN(quantity), MAX(quantity) FROM 테이블명

일반적으로 COUNT 함수는 집계함수 주 하나로 테이블이 가진 행의 개수를 알려준다. 또한 WHERE 구를 추가하여 특정 조건을 가지는 모든 행의 개수를 집계할 수 있다.(여기서는 중복이 없어서 한 개)

❗️다만 NULL값이 있는 경우 집계 함수에서의 카운트는 무시된다.


DISTINCT 함수는 중복값을 제거한다. 추가된 음료라는 새로운 항목을 새로 INSERT 한 이후 열의 개수를 살핀 결과 기존의 143개에서 145개로 출력됐고, 이 부분에서 음료 이름이 중복되는 경우를 DISTINCT 함수를 통해 살친 결과 144개로 한 개의 중복값이 제거된 것을 알 수 있었다.

❗️DISTINCT 사용시 ALL, DISTINCT 어느것도 지정하지 않은 경우 중복값은 제거되지 않는다 = 생략할 경우 ALL 로 간주되는 것과 같다.


또한 이 두 함수를 포함하여 전체 열의 이름을 집계(COUNT)하되, 그 속에서 중복된 값은 제거하는 식으로 또 한번 출력할 경우 다음과 같이 나타난다. DISTINCT는 집계함수의 인수에 수식자로 지정할 수 있기 때문에 가능했다.


샘플이라는 테이블 안에 다섯 항목의 데이터를 넣고 SUM 함수 사용을 위한 quantity 부분을 추가했다. 이 테이블에서 모든 합계를 집계한 결과 다음과 같이 나온다.


또한 최대값과 최소값을 구할 수 있다. 샘플이라는 테이블 내에서 최소값과 최대값만 출력했고, 그 값들을 각각 가지는 필드의 이름이 무엇인지 조합하여 나타낼 수 있었다.


💡 GROUP BY / HAVING

SELECT * FROM 테이블명 GROUP BY 열1, 2..

샘플 테이블에서 이름을 기준으로 그룹핑을 해 보았다.GROUP BY 구를 사용해서 그룹화 할 수 있다.

여기에서는 이름이 겹치는 경우가 없기에 Having 구를 사용해도 모두 결과가 출력됐다.

❗️GROUP BY에서 지정한 열 이외의 열은 집계함수를 사용하지 않은 채 SELECT 구에 지정할 수 없다.

GROUP BY 구를 사용해 그룹화 한 경우에도 ORDER BY를 사용하여 정렬할 수 있다.(별도의 지시 없이는 ASC 자동정렬)

💡서브쿼리 = SELECT 명령에 대한 질의 & 하부 부수적 질의

(SELECT 명령)

1️⃣ 서브쿼리가 메인쿼리보다 먼저 돌아가야 한다.
2️⃣ 서브쿼리 결과값을 가지고 메인쿼리가 실행된다.
3️⃣ 서브쿼리는 반드시 괄호( )로 둘러싸야 한다.
4️⃣ 서브쿼리는 비교 연산자의 오른쪽에 있어야 한다.
5️⃣ 서브쿼리에 ORDER BY 절을 사용할 필요가 없다.(이유 : 어차피 메인쿼리에서 돌아가므로 정렬이 의미 없다.)
6️⃣ 서브쿼리는 FROM, WHERE, HAVING 절에서 사용한다.
7️⃣ 단일 행, 다중 행, 다중 열 서브쿼리가 있다.

❗️인라인 뷰를 사용하는 서브쿼리


FROM 구에 SELECT 를 사용하는 서브쿼리이다. 하지만 사진상에서는 SELECT 대신 DELETE를 사용해서 질의했다. 그리고 다음과 같은 오류가 났는데, 일반적으로 데이터를 추가하거나 갱신할 경우 같은 테이블에서 서브쿼리를 사용할 수 없다. 때문에 이러한 오류를 피하려면 내부에 인라인 뷰로 임시 테이블을 만들어 처리해아한다.위와 같이 인라인 뷰를 통해 임시테이블을 생성하고 처리 된 것을 볼 수 있다.

1️⃣ DELETE FROM sample WHERE quantity = (SELECT MIN(quantity) FROM sample);

2️⃣ DELETE FROM sample WHERE quantity = 
  (SELECT quantity FROM (SELECT MIN(quantity) AS quantity FROM sample) AS x)  
  -> X 라는 임시테이블생성하여 인라인뷰 사용

❗️스칼라 서브쿼리

반드시 한 행과 칼럼만 반환하는 서브쿼리이며 연산자를 사용한 비교일 때에는 스칼라 값끼리 비교한다


💡 EXISTS / NOT EXISTS

EXISTS (SELECT 명령)

NULL 값이 있는 것과 아닌 값이 혼재된 테이블의 경우 EXISTS / NOT EXISTS를 사용해 갱신이 가능하다.

💡 IN = 집합 안의 값이 있는지의 조사 가능

sample2 테이블에서 no가 3,4,10 인 A의 값을 반환할 수 있도록 IN 을 사용했다.

💡 상관서브쿼리

서브쿼리와 부모쿼리가 서로 연관된 경우 상관 서브쿼리를 사용함으로써 두 테이블을 조작할 수 있다.

profile
Backend Developer

0개의 댓글