[211208] 교육 38일차

ORDER BY

SELECT * FROM ScoreT ORDER BY stId (ASC);
SELECT * FROM ScoreT ORDER BY stId DESC;

ASC : 오름차순 정렬( 생략가능 )
DESC : 내림차순 정렬


GROUP BY

SELECT AVG(score), stId FROM ScoreT GROUP BY stId;

같은 stId 값을 가진 것들끼리 묶어서 평균을 낸다.


ROUND

SELECT AVG(score) AS AVG, stId FROM ScoreT GROUP BY stId; 
SELECT ROUND( AVG(score) ) AS AVG, 	-- 반올림
stId FROM ScoreT GROUP BY stId; 

SELECT ROUND( AVG(score) , 2 ) AS AVG,	-- 소수점 2자리 
stId FROM ScoreT GROUP BY stId; 

SELECT ROUND( AVG(score) , -1 ) AS AVG, -- 1자리 반올림
stId FROM ScoreT GROUP BY stId; 


VIEW

실제로 테이블이 생긴 것은 아니고 복잡한 SELECT 문을 편하게 쓰기 위한 객체

CREATE VIEW Avg_V AS
SELECT ROUND( AVG(score) , 2 ) AS AVG, stId FROM ScoreT GROUP BY stId;

SELECT * FROM Avg_V;


임시 테이블

VIEW 가 테이블을 볼 수 있는 창이라면 위의 코드는 실제 테이블을 생성하고 데이터 입력까지 할 수 있다.

CREATE TABLE avg_T AS 
SELECT ROUND( AVG(score) , 2 ) AS AVG, stId FROM ScoreT GROUP BY stId 

VIEW와 임시테이블의 차이
VIEW - 원본 테이블이 삭제되면 결과가 바로 반영된다.
임시테이블 - 새로 만든 테이블이기 때문에 원본 테이블이 삭제되어도 그대로 유지된다.


Having

통계처리 이후에 동작하여 AGGREGATE FUNCTION 의 결과를 제한할 수 있다.

SELECT AVG(score), stId FROM ScoreT GROUP BY stId HAVING AVG(score) > 75;

동작순서
SELECT & WHERE > GROUP BY > AGGREGATE FUNCTION > HAVING


JOIN

CROSS JOIN

SELECT * FROM StudentT , SubjectT

StudentT - 6 rows, SubjectT - 3 rows
Cross Join -> 18 rows
( 양쪽 레코드를 모든 경우의 수로 보여준다. 3 * 6 = 18 )

SELECT * FROM StudentT, SubjectT WHERE StudentT.stId = 10101;
SELECT * FROM StudentT A, SubjectT B WHERE A.stId = 10101;

필드명을 언급할 경우 소속 테이블을 명시하는 것이 좋다.

SELF JOIN

SELECT * FROM ScoreT A, ScoreT B;

같은 테이블을 합쳐서 보여준다. 동일한 데이터를 가진 레코드를 찾을때 주로 사용한다.

SELECT * FROM ScoreT A, ScoreT B WHERE A.score = B.score AND A.subId = 'ENG1';



INNER JOIN


PK-FK 사이에서 일어난다.

SELECT * FROM SubjectT A, ScoreT B;	

SubjectT.subId 를 ScoreT.subId 에서 참조해서 쓰는 중이라고 한다면

SELECT * FROM SubjectT A, ScoreT B WHERE A.subId = B.subId;

PK-FK 사이에서 공통 데이터를 가지고 JOIN 해주었다.

좋은 웹페이지 즐겨찾기