자격증/SQLD

[SQLD] SQL기본&활용 : 연산자, WHERE, GROUP BY, HAVING, ORDER BY, 문장실행순서

연_우리 2021. 11. 6. 16:55
반응형

 

https://lotuus.tistory.com/42

 

[SQLD] 21.11.20 제43회 SQL개발자 후기, 공부방법, 정리본, 43회 출제문제

2021년 11월 20일 토요일 제43회 SQL개발자 자격증 시험 후기 오늘 보고왔다! 내 공부방법과 정리본, 이번에 시험에 출제된 문제들을 기억나는대로 적어보겠다 개인적으로 기출이나 복원된 문제가

lotuus.tistory.com

 

[목차]

💚WHERE절, 연산자, ROWNUM, DUAL테이블

   WHERE절

   연산자

   가짜칼럼 ROWNUM, TOP(N)

   DUAL테이블(Oracle)

💚GROUP BY, HAVING절

   GROUP BY와 SELECT 칼럼

   GROUP BY와 집계함수

💚ORDER BY ASC/DESC

   Oracle과 SQL Server의 NULL취급

💚SELECT 문장 실행 순서

 

 

💚 WHERE절, 연산자, ROWNUM, DUAL 테이블

WHERE절

조회하려는 데이터에 특정 조건을 부여한다.

SELECT ~ FROM ~ WHERE 조건식;

 

연산자

 

가짜칼럼 ROWNUM, TOP(N)

Oracle SQL Server
SELECT ~ FROM ~
WHERE ROWNUM <= N;
SELECT TOP(N) [WITH TIES] 
FROM ~;
SELECT SAL FROM
(SELECT SAL FROM EMP ORDER BY SAL)
WHERE ROWNUM<4;
SELECT TOP(2) WITH TIES SAL
FROM EMP ORDER BY SAL;
//500, 300, 300
Oracle에서는 ORDER BY절이 같이 사용되면 정렬 전에
ROWNUM을 처리하게되어 무작위 결과가 추출된다.
SQL Server에서는 ORDER BY와 WITH TIES를 같이 사용하면 공동순위도 같이 출력해준다.

 

DUAL 테이블(Oracle)

사용자 테이블이 필요없는 SQL문장을 실행할 때 사용한다.

SELECT ~ FROM ~ 형식을 갖추기위한 일종의 DUMMY 테이블이다.

SELECT LENGTH('SQL Expert') FROM DUAL;

//결과
//LENGTH('SQL Expert')
//-------------------
//                10

SQL Server의 경우엔 SELECT로도 SQL문장이 수행 가능하기때문에 DUAL테이블이 없다.

select len('SQL Expert');

//결과
//(열 이름 없음)
//------------
//          10

 

반응형

 

💚 GROUP BY, HAVING절

GROUP BY 절은 행들을 소그룹화 한다.

SELECT ~ FROM ~ WHERE ~ GROUP BY 칼럼 HAVING 조건

 

HAVING절은 GROUP BY로 묶인 그룹들의 조건을 적용한다.

(WHERE절에는 개체 수준의 조건을 적용할 수 있다.)

 

NULL이 있을 경우엔 연산에서 제외된다. => 굳이 NVL함수로 NULL을 0으로 만들어줄 필요 X

GROUP BY절에는 ALIAS 별명을 사용할 수 없다. 

 

SELECT AGE 나이 FROM PLAYER GROUP BY 나이; --오류

 

GROUP BY와 SELECT 칼럼

GROUP BY절에서 그룹핑 기준을 정의하게 되면 

기준에 사용된 칼럼과 집계함수에 사용될 수 있는 숫자 데이터의 집합을 새로 만든다.

이때, 개별 데이터는 필요 없으므로 저장하지 않는다.

GROUP BY 이후 수행되는 SELECT, ORDER BY에서 개별 데이터를 사용하면 에러가 발생한다.

= 결과적으로 SELECT에서는 group by에 사용된 칼럼만 사용할 수 있다.

SELECT JOB, SAL FROM EMP GROUP BY JOB;
-- 실패
-- JOB과 SAL둘다 출력하고싶다면 SAL도 그룹화해야한다.

SELECT JOB, SAL FROM EMP GROUP BY JOB, SAL;
-- 성공
-- 출력하는 JOB, SAL이 GROUP BY절에서 모두 그룹화되어있다.

 

GROUP BY와 집계함수

집계함수는 여러행들의 그룹이 모여서 그룹당 하나의 결과를 돌려주는 함수이다. 

(COUNT(식), SUM(식), AVG(식), MAX(식), MIN(식) ... 등)

행의 그룹을 만들어주는 GROUP BY와 많이 사용된다.

 

집계함수는 GROUP BY 이후에 실행되는 HAVING, SELECT, ORDER BY절에서만 사용 가능하다. (WHERE절에서 사용 불가!!)

GROUP BY절에 정의하지 않은 칼럼도 집계함수를 사용하면 HAVING, SELECT, ORDER BY절에서 사용할 수 있다.

SELECT JOB FROM EMP GROUP BY JOB ORDER BY MAX(EMPNO), SUM(SAL);
-- 성공
-- 이미 JOB으로 그룹화되었기때문에 GROUP BY보다 수행이 늦은
-- HAVING, SELECT, ORDER BY에서 집계함수로 다른 칼럼을 그룹화할 수 있다.

SELECT JOB, MAX(EMPNO) FROM EMP GROUP BY JOB ORDER BY MAX(EMPNO), SUM(SAL);
-- 성공
-- JOB도 그룹화되었고, EMPNO도 집계함수로 그룹화되어있다.

SELECT JOB, EMPNO FROM EMP GROUP BY JOB ORDER BY MAX(EMPNO), SUM(SAL);
-- 실패
-- EMPNO가 그룹화되지 않은 칼럼이기때문에 실패한다.

 

집계함수 사용 시, 전체가 하나의 그룹이 되는 경우에는 GROUP BY절 없이 단독으로 사용 가능하다.

SELECT COUNT(*) "전체 행수", COUNT(HEIGHT) "키 건수"

 

 

💚 ORDER BY ASC/DESC

데이터들을 특정칼럼 기준으로 정렬하여 출력하게해준다.

SELECT ~ FROM ~ WHERE ~ GROUP BY ~ HAVING ~ ORDER BY 칼럼명 ASC/DESC;

오름차순 ASC(기본값), 내림차순 DESC

 

ORDER BY절에 별명 사용가능하다.

SELECT AGE 나이 FROM PLAYER ORDER BY 나이; --가능

 

조회하는 칼럼의 순서번호를 사용해도 가능하다.

SELECT AGE 나이, NAME 이름 FROM PLAYER ORDER BY 2; --이름 기준으로 오름차순정렬

 

조회하지 않는 칼럼으로 정렬할 수 있다.

SELECT AGE, NAME FROM PLAYER ORDER BY ID;

 

📌문제

PLAYER 테이블에서 선수명과 팀명은 오름차순, 연봉은 내림차순으로 조회하는 SQL 로 바른것은?

1) SELECT 선수명, 팀명, 연봉 FROM ORDER BY 선수명 DESC, 팀명 DESC, 연봉 ASC
2) SELECT 선수명, 팀명, 연봉 FROM ORDER BY 선수명 ASC, 팀명 ASC , 연봉
3) SELECT 선수명, 팀명, 연봉 FROM ORDER BY 선수명 ASC, 팀명, 3 DESC     //별명, 순서번호 혼합해서 사용 가능
4) SELECT 선수명, 팀명, 연봉 FROM ORDER BY 선수명, 팀명, DESC 연봉

 

 

Oracle과 SQL Server의 NULL 취급

Oracle SQL Server
NULL을 가장 큰 값으로 취급한다. NULL을 가장 작은 값으로 취급한다.

 

 

💚 SELECT 문장 실행순서

 

 

 

 

 

 

 

반응형
  • 네이버 블러그 공유하기
  • 페이스북 공유하기
  • 트위터 공유하기
  • 구글 플러스 공유하기
  • 카카오톡 공유하기