가쟤의 해변일기 🐳

풀스택과정 DB - MySQL 서브 쿼리 | UseCase 다이어그램 본문

풀스택과정

풀스택과정 DB - MySQL 서브 쿼리 | UseCase 다이어그램

바닷가쟤 2025. 5. 26. 18:19
💡 2025 05 26  수업 이슈

1. Sub Query
- 단일행 서브쿼리
- 다중행 서브쿼리
- 서브쿼리에서 null값 다루기

2.  분석 설계 Flow
- UseCase 시나리오 작성
- SRS 명세서 (요구사항 정의서)
- UseCase Diagram

 

DB 프로젝트 끝나면 프론트기술 할 예정

html5, css, jquery, bootstrap 한다고 한다....


서브쿼리

  • 서브쿼리(SubQuery)란 하나의 SQL문안에 포함되어 있는 또 다른 SQL문을 말한다.
  • 서브쿼리는 알려지지 않은 기준을 이용한 검색을 위해 사용한다.
  • 일반적으로 서브쿼리가 먼저 실행되고, 그 결과를 사용하여 메인쿼리(Main query)에 대한 질의 조건을 완성한다.

서브쿼리의 반대 → 메인쿼리

(서브쿼리)Inner 쿼리의 반대 → Outer 쿼리

  1. 서브쿼리는 하나의 SQL문 안에 포함되어 있는 또 다른 SQL문이다.
  2. 서브쿼리는 ?에 해당하는 부분을 먼저 검색하는데 사용한다.
  3. 서브쿼리가 먼저 실행되고 그 결과를 사용해서 메인 쿼리가 실행된다.
  4. 서브쿼리에서는 ORDER BY절이 의미가 없다.
  5. 서브쿼리의 종류로는 WHERE절/HAVING절/FROM절에 사용하는 서브쿼리가 있다.

JOIN과 함께 서브쿼리가 굉장히 많이 사용된다.

-- 2번의 질의를 DB에 함(DB Access를 2번 진행) --> 효율성, 성능 저하
SELECT sal FROM emp WHERE ename='ADAMS'; -- 1100
SELECT ename, sal FROM emp WHERE sal >= 1100;

?에 해당하는 것을 먼저 알아내야하기에 ( )로 ?에 해당하는 쿼리를 싸준다.

( ) 실행한 결과가 전체 쿼리에서 실행된다.

SELECT ename, sal
FROM emp
WHERE sal > (SELECT sal FROM emp WHERE ename='ADAMS');

이렇게 바꿀 수 있다.

1 ROW 1 COULMN의 값을 스칼라값 혹은 스칼라 서브쿼리라고 한다.

서브쿼리 수행 결과로 스칼라 값이 나오면 단일행 연산자를 사용해야 한다.

-- 업무별 가장 적은 평균 급여를 검색 

-- step 1.
-- 그룹 함수 중첩 ❌❌
SELECT job, avg(sal)
FROM emp
GROUP BY job
HAVING avg(sal) = (SELECT min(avg(sal)) FROM emp GROUP BY job;

-- step 2.
-- 아래처럼 하면 된다 ✅
SELECT job, min(AvgSal) -- 그룹함수 Alias 필요
FROM (SELECT job, avg(sal) AvgSal FROM emp GROUP BY job) e -- table Alias 필요
GROUP BY job;

-- step 3.
-- limit (서브쿼리 사용 안 함, 정렬 사용)
SELECT job, avg(sal) AvgSal
FROM emp
GROUP BY job
ORDER BY 2
LIMIT 1;

MySQL은 그룹 함수 중첩이 안 된다!

그래서 그룹 함수(avg(sal)) Alias와 Table Alias를 사용하면 된다.

-- SCOTT의 급여보다 더 많은 급여를 받는 사원을 검색
-- step 1.
SELECT ename, sal
FROM emp
WHERE sal > (SELECT sal FROM emp WHERE ename='SCOTT');

-- step 2. 
SELECT ename, a.sal, job FROM emp a, (SELECT sal FROM emp WHERE ename='SCOTT') b
WHERE a.sal > b.sal;

Table Alias를 달아서 step 2처럼 사용할 수 있다.

-- 다중행 연산자와 함게 사용된 서브 쿼리
SELECT empno, ename
FROM emp
WHERE sal=(SELECT min(sal) FROM emp GROUP BY deptno); -- ERROR 이건 단일행이 아니기 때문

-- 다중행 연산 + 서브쿼리 (IN 사용)
SELECT empno, ename, sal
FROM emp
WHERE sal IN (SELECT min(sal) FROM emp GROUP BY deptno);

단일행 스칼라 서브쿼리 → 다중행 서브쿼리 - 연산자가 달라짐 !

연산자 의미

> ANY 집합 중 최소값보다 크면 참 (1개라도 크면 참)
< ANY 집합 중 최대값보다 작으면 참 (1개라도 작으면 참)
> ALL 집합 중 모든 값보다 커야 참 (최대값보다 커야 참)
< ALL 집합 중 모든 값보다 작아야 참 (최소값보다 작아야 참)

자바 + DB 프로젝트 설명

유스케이스 시나리오

요구사항 정의서 (SRS 명세서)

유스케이스 다이어그램⭐ 후 → 방사형 확장

DB Modeling | Class Diagram | (화면설계 _ 이번 플젝땐 X)

UseCase Diagram

구성 요소 : Actor / UseCase / System boundary, Relation

UseCase간의 관계 설정

  • Include : 특정한 기능이 수행되기 전에 선행되어져야 하는 선행 조건 기능
  • Extend : 일반적인 기능에서 세부적인 기능으로 확장된 기능
  • Generalization : 주로 Actor에서 많이 사용한다.

Actor와 UseCase간의 관계

—> Association / Direct Association

사람 모양 : Actor

타원 : UseCase

관계들..

draw.io로 작업하다가 피그잼이 편해서 안 쓰기로 했다.

이런 식으로 해봤는데 잘했다고 해주셨다.

은근 세세한 부분까지 신경써서 가독성 좋게 직관적으로 해야 할 것 같다.

 

그리고 DB에 테이블을 생성해준다.

 

자바 프로젝트를 만들고 book 테이블의 정보를 담고 있는 VO 클래스를 생성한다.

DOMAIN(Record) --> VO --> DTO 지금은 똑같지만 JPA때 VO, DTO 완전히 다른 의미이다.

빠르게 기본 생성자 2개와 setter/getter, 그리고 toString까지 Source > generate …로 만들어준다.

만들었다^!^ 

꿀잼

728x90