분류 전체보기 37

[SQLD] 스칼라 서브쿼리

Scalar Subquery🔎 SELECT 절에서 단일 값을 반환하는 서브쿼리이다. 하나의 행(row)과 하나의 열(column)만 반환해야 한다. 📌 단일행 서브쿼리(Single-Row Subquery)와 차이점구분스칼라 서브쿼리단일행 서브쿼리반환 값하나의 단일 값 (1개의 행과 컬럼)하나의 행 (여러 컬럼 가능)사용 위치SELECT, WHERE, HAVING, ORDER BY 절 등WHERE, HAVING 절사용 방식일반 컬럼처럼 사용연산자(=, >, 실행 방식각 행마다 실행됨일반적으로 독립적인 쿼리 실행 🗒️ 예제SELECT A.ENAME, A.SAL, A.DEPTNOFROM EMP AWHERE (SELECT ROUND(AVG(X.SAL),2) FROM EMP X WHER..

✏️ SQLD 2025.03.03

[SQLD / 노랭이] p. 62: 49번

-- 주어진 오라클 SQLSELECT A.게시판ID, A.게시판명, COUNT(B.게시글ID) AS CNTFROM 게시판 A, 게시글 BWHERE A.게시판ID = B.게시판ID(+)AND B.삭제여부 = 'N'AND A.사용여부 = 'Y'GROUP BY A.게시판ID, A.게시판명ORDER BY A.게시판ID; ✏️ 정답: 1번SELECT A.게시판ID, A.게시판명, COUNT(B.게시글ID) AS CNTFROM 게시판 ALEFT OUTER JOIN 게시글 BON (A.게시판ID = B.게시판ID AND B.삭제여부 = 'N')WHERE A.사용여부 = 'Y'GROUP BY A.게시판ID, A.게시판명ORDER BY A.게시판ID;🔎 코드 분석1️⃣ SELECT A.게시판ID, A.게시판명, COU..

[SQLD / 노랭이] p.42: 19번

SELECT 고객이름, SUM(수량)FROM 고객, 상품, 주문WHERE 고객.고객번호 = 주문.고객번호 AND 상품.상품번호 = 주문.상품번호GROUP BY 고객.고객이름HAVING MAX(수량) > 10;🔎 코드 분석1️⃣ SUM(수량): 고객이 주문한 전체 수량의 합2️⃣ GROUP BY 고객.고객이름: 고객별 그룹화3️⃣ HAVING MAX(수량) > 10: 고객별 주문 중 가장 큰 단일 주문 수량이 10보다 커야 함  ➡️ 단일 주문 수량: 한 번의 주문에서 구매한 수량이 10개 초과일 때!4️⃣ MAX(수량): 고객이 주문한 수량 중 가장 큰 값을 찾음✏️ 정답: 2번 (수량이 10보다 큰 주문을 한 고객을 찾음) 더보기더보기열한 번 이상 상품을 주문한 고객이름과 주문한 수량의 합을 구한다..

[SQLD / 노랭이] p.49: 28번

ID100100200200200999999SELECT ID FROM TBL GROUP BY ID HAVING COUNT(*) = 2 ORDER BY (CASE WHEN ID = 999 THEN 0 ELSE ID END)🔎 코드 분석1️⃣ GROUP BY ID: ID 값을 기준으로 그룹화2️⃣ HAVING COUNT(*) = 2: 그룹 내 개수가 2인 ID만 선택ID 값개수1002 ✔️2003 ❌ (제외)9992 ✔️🟰 ID 100과 999만 선택3️⃣ ORDER BY (CASE WHEN ID = 999 THEN 0 ELSE ID END):  - ID = 999 이면 정렬 우선순위를 0으로 설정 🟰 가장 먼저 정렬됨  🧐 이게 무슨 소리나면:   - ID = 999 ➡️ 정렬 값이 0 ➡️ 제일 위..

[SQLD] WHERE절과 HAVING절의 차이

🔎 WHERE과 HAVING은 둘 다 조건을 필터링하는 역할을 한다.  ➡️ 그러나 실행 순서와 대상이 다르다! 🔎 SQL 실행 순서 (쿼리 실행 플로우)1️⃣ FROM: 테이블 지정2️⃣ WHERE: 행(row) 단위로 필터링3️⃣ GROUP BY: 그룹화 수행4️⃣ HAVING: 그룹화된 데이터 필터링5️⃣ SELECT: 최종 컬럼 선택6️⃣ ORDER BY: 정렬 수행 💡 WHERE vs HAVING 구분WHEREHAVING실행 순서GROUP BY 이전GROUP BY 이후작동 방식개별 행(row) 필터링그룹화된 데이터 필터링사용 가능 데이터원본 데이터만 사용 가능= ❌집계 함수 사용 불가 ❌집계 함수(AVG(), SUM(), COUNT()) 사용 가능필터링 대상개별 레코드그룹별 결과 📌 HA..

✏️ SQLD 2025.03.01

[SQLD] HAVING절

📌 HAVING/* HAVING 절 * GROUP BY 되거나 집계된 데이터를 필터링 */SELECT GROUP_NAME, ROUND(AVG(HEIGHT),2), MAX(HEIGHT), MIN(HEIGHT), AVG(FOOT_SIZE)FROM artistGROUP BY GROUP_NAMEHAVING AVG(FOOT_SIZE)>240;-- SELECT에 선택하지 않아도 필터링을 할 수 있다.SELECT GROUP_NAME, ROUND(AVG(HEIGHT),2), MAX(HEIGHT), MIN(HEIGHT)FROM artistGROUP BY GROUP_NAMEHAVING AVG(FOOT_SIZE)>240; 💡 HAVING은 GROUP BY 없이 단독으로 사용 가능!SELECT MAX(HEIGHT), M..

✏️ SQLD 2025.03.01

[SQLD] GROUP BY절, 집계함수, 제약사항

📌 GROUP BY-- 집계함수와 GROUP BY SELECT GROUP_NAME FROM artist GROUP BY GROUP_NAME;SELECT GROUP_NAME, COUNT(*), ROUND(AVG(HEIGHT),2), MAX(HEIGHT), MIN(HEIGHT), SUM(HEIGHT)FROM artist GROUP BY GROUP_NAME;SELECT GROUP_NAME, BIRTH_YEAR, COUNT(*), ROUND(AVG(HEIGHT),2), MAX(HEIGHT), MIN(HEIGHT), SUM(HEIGHT)FROM artist GROUP BY GROUP_NAME, BIRTH_YEAR;-- GROUP BY는 DISTINCT와 같은 결과를 낸다SELECT GROUP_NAME, BIR..

✏️ SQLD 2025.03.01

[SQLD / 노랭이] p.63: 50번

COL1COL2COL31020NULL15NULLNULL507020 🗒️ 해설1️⃣ SELECT SUM(COL2) FROM TAB1 결과가 NULL인지- SUM(COL2)는 NULL 값을 무시하고 합계를 계산한다.- COL2의 값: 20, NULL, 70 ➡️ NULL을 제외하고 계산하면 20+70=90❌결과는 90 ➡️ 1번은 틀림. 2️⃣ SELECT SUM(COL1 + COL2 + COL3) FROM TAB1 결과가 185인지- 각 행별로 (COL1+COL2+COL3) 계산:  - 첫 번째 행: 10+20+NULL= NULL  - 두 번째 행: 15+NULL+NULL= NULL  - 세 번째 행: 50+70+20= 140- SUM()은 NULL 값을 무시하고 남은 값만 더하므로 140만 남는다.❌ ..

[SQLD] WHERE 절: IN, BETWEEN, LIKE, IS NULL

📍 IN 연산자-- IN 연산자SELECT EMPNO, ENAME, DEPTNO, SAL FROM EMPWHERE DEPTNO IN (20, 30) /* (DEPTNO=20 OR DEPTNO=30) */AND (SAL>=1100 AND SAL=1100 AND SAL 📍 BETWEEN 연산자-- BETWEEN 연산자SELECT EMPNO, ENAME, DEPTNO, SAL FROM EMPWHERE DEPTNO IN (20, 30) AND SAL BETWEEN 1100 AND 2500; /* (SAL>=1100 AND SAL=1100 AND SAL 📍 LIKE 연산자-- LIKE 연산자-- _는 자리수를 표현-- A로 시작하는 직원 정보SELECT EMPNO, ENAME FROM EMP WHERE E..

✏️ SQLD 2025.03.01

[SQLD] WHERE 절: 논리 연산자, 연산자 우선순위

WHERE: 원하는 열들을 검색, 필터링해서 출력-- DEPTNO가 20인 직원 정보SELECT EMPNO, ENAME, DEPTNO, SAL FROM EMP WHERE DEPTNO=20;-- DEPTNO가 20이 "아닌" 직원 정보SELECT EMPNO, ENAME, DEPTNO, SAL FROM EMP WHERE DEPTNO20;-- 의 대체: !=, ^=-- 논리 연산자-- 부서번호가 20"이거나" 30인 직원 정보SELECT EMPNO, ENAME, DEPTNO, SAL FROM EMPWHERE DEPTNO=20 OR DEPTNO=30; ✒️ 연산자 우선순위1️⃣ ()2️⃣ 비교연산자 SQL 연산자3️⃣ NOT4️⃣ AND5️⃣ OR-- 부서번호가 20이거나 30이면서 SAL이 1100 이상인 직..

✏️ SQLD 2025.02.28