본문 바로가기
  • 한컴 AI 아카데미 AI개발자 4기
한컴 AI 아카데미

[스나이퍼팩토리] 한컴 AI아카데미 4기 8기 데이터 베이스 복습

by 타스타로스 2026. 2. 24.

SQL 데이터 베이스 예시문 작성 

다음으로 예시문을 작성하여 릴레이션, 연산자, 집계함수 등을 연습해 보자. 
CREATE TABLE로 STUDENT, PROFESSOR,  DEPARTMENT, SALGRADE, 를 만들고 그 안에 키 속성들을 두어 추출을 할 수 있게끔 각 각 의 문서를 만들어 두었다. 
사용할 릴레이즈 스키마는 다음과 같다.
 
STUDENT (STUDNO,NAME,USERID,GRADE,IDNUM,BIRTHDATE,TEL,HEIGHT, WEIGHT, DEPTNO, PROFNO)
PROFESSOR(PROFNO,NAME,USERID,POSITION,SAL,HIREDATE,COMM,DEPTNO)
DEPARTMENT(DEPTNO, DNAME, COLLEGE, LOC)
SALGRADE(GRADE, LOSAL, HISAL)

데이터 구조 한눈에 보기

  • STUDENT (학생): 학생 정보와 담당 교수(PROFNO), 소속 학과(DEPTNO)가 들어있습니다.
  • PROFESSOR (교수): 교수 정보와 소속 학과(DEPTNO), 급여(SAL)가 들어있습니다.
  • DEPARTMENT (학과): 학과 이름과 상위 학부/대학(COLLEGE) 정보가 들어있습니다. (SELF JOIN 연습용)
  • SALGRADE (급여 등급): 급여의 범위(LOSAL ~ HISAL)에 따른 등급이 들어있습니다. (NON-EQUI JOIN 연습용)

먼저 사용하기 위해 기본으로 들어갈 문장을 만들어 두겠다.
drop table 릴레이션;       -- TABLE 출력 취소.
select * from 릴레이션 ; -- *(모든 속성문서) 출력.
DESC 릴레이션 ;              -- KEY 속성 출력.
!! 이 Oracle SQL Developer 프로그램에서도 대, 소문자 구분을 철저히 해야 출력이 됩니다.( 에러도 안나와요!!) 
프로그램에선 대,소문자 구별은 안 하는데 고유 아이디는 구별을 합니다 그래서 UPPER(대문자), LOWER(소문자)라는 명령어를 사용해서 출력 선언 해야 해요   

데이터 조작어(DML)의 종류

명령어 기능 설명

  
 
 


학생테이블 작성

  • CREATE TABLE STUDENT (                 --  학생 테이블 작성
  • STUDNO          NUMBER(5),                 --  학생 번호
  • NAME               VARCHAR2(30),           --  학생 이름
  • USERID            varchar2(10),                -- 학생 아이디
  • GRADE             VARCHAR2(1),             -- 학과
  • IDNUM              VARCHAR2(13),           -- 아이디 번호
  • BIRTHDATE      DATE,                            -- 생일
  • TEL                    VARCHAR2(13),            -- 전화번호
  • HEIGHT            NUMBER(5,2),               -- 키   
  • WEIGHT            NUMBER(5,2),              -- 몸무게
  • DEPTNO            NUMBER(4),                 --학과 번호
  • PROFNO           NUMBER(4)                  -- 교수 번호
  • );

개인 신상 문서 작성
INSERT INTO STUDENT VALUES (10101,  이민구', 'jun123', '4', '7907021369824', TO_DATE('02-7월-1979','DD-MON-YYYY'), '051)781-2158', 176, 72, '101',9903);
INSERT INTO STUDENT VALUES (20101, '어이유', 'Dals', '1', '8312101128467', TO_DATE('10-12월-1983','DD-MON-YYYY'), '055)426-1752', 172, 64, '201',NULL);
INSERT INTO STUDENT VALUES (10102, '손석규', 'ansel414', '1', '8405162123648', TO_DATE('16-5월-1984','DD-MON-YYYY'), '055)261-8947', 168, 52, '101',NULL);
INSERT INTO STUDENT VALUES (10103, '구리나', 'mandu', '3', '8103211063421', TO_DATE('11-1월-1981','DD-MON-YYYY'), '051)824-9637', 170, 88 ,'101',9906);
INSERT INTO STUDENT VALUES (20102, '차은유', 'Ping2', '1', '8511241639826', TO_DATE('24-11월-1985','DD-MON-YYYY'), '051)742-6384', 182, 70, '201',NULL);
INSERT INTO STUDENT VALUES (10201, '박고은', 'simply', '2', '8206062186327', TO_DATE('06-6월-1982','DD-MON-YYYY'), '055)419-6328', 164, 48, '102',9905); INSERT INTO STUDENT VALUES (10104, '이도형', 'Gomo00', '2', '8004122298371', TO_DATE('12-4월-1980','DD-MON-YYYY'), '055)418-9627', 161, 42, '101',9907);
INSERT INTO STUDENT VALUES (10202, '쟈나', 'yousuk', '4', '7709121128379', TO_DATE('12-10월-1977','DD-MON-YYYY'), '051)724-9618', 177, 92, '102',9905);
INSERT INTO STUDENT VALUES (10203, '김영웅', 'hanal', '1', '8501092378641', TO_DATE('18-12월-1984','DD-MON-YYYY'), '055)296-3784', 160, 68, '102',NULL);
INSERT INTO STUDENT VALUES (10105, '박공유', 'YouJin12', '2', '8301212196482', TO_DATE('21-1월-1983','DD-MON-YYYY'), '02)312-9838', 171, 54, '101',9907);
INSERT INTO STUDENT VALUES (10106, '박보겸', 'seolly', '1', '8511291186273', TO_DATE('29-11월-1985','DD-MON-YYYY'), '051)239-4861', 186, 72, '101',NULL);
INSERT INTO STUDENT VALUES (10204, '조정수', 'Samba7', '3', '7904021358671', TO_DATE('02-4월-1979','DD-MON-YYYY'), '053)487-2698', 171, 70, '102',9905);
INSERT INTO STUDENT VALUES (10107, '강한구', 'huriky', '4', '8109131276431', TO_DATE('13-11월-1981','DD-MON-YYYY'), '055)736-4981', 175, 92, '101',9903);
INSERT INTO STUDENT VALUES (20103, '조수지', 'lovely', '2', '8302282169387', TO_DATE('28-2월-1983','DD-MON-YYYY'), '052)175-3941', 166, 51, '201',9902);
INSERT INTO STUDENT VALUES (20104, '김나라', 'Rader214', '1', '8412141254963', TO_DATE('16-9월-1984','DD-MON-YYYY'), '02)785-6984', 184, 62, '201',NULL);
INSERT INTO STUDENT VALUES (10108, '한석봉', 'cleanSky', '2', '8108192157498', TO_DATE('19-8월-1981','DD-MON-YYYY'), '055)248-3679', 162, 72, '101',9907);
select * from STUDENT;


교수 테이블 생성

  • CREATE TABLE PROFESSOR (                 --PROFESSOR 테이블 생성
  • PROFNO            NUMBER(4),                    -- 교수 번호
  • NAME                 VARCHAR2(30),              -- 교수 이름
  • USERID             VARCHAR2(10),              -- 교수 아이디
  • POSITION         VARCHAR2(20),              -- 직위
  • SAL                     NUMBER(10),                -- 급여
  • HIREDATE         DATE,                             -- 입사일
  • COMM                NUMBER(2),                   -- 수당
  • DEPTNO            NUMBER(4)                    -- 학과 번호  
  • );

교수 신상 작성
INSERT INTO PROFESSOR VALUES (9901, '최우형', 'capool', '교수', 500, TO_DATE('24-1월-1982','DD-MON-YYYY'), 20, 101);
INSERT INTO PROFESSOR VALUES (9902, '한연아', 'sweat413', '조교수', 320, TO_DATE('12-4월-1995','DD-MON-YYYY'), NULL, 201);
INSERT INTO PROFESSOR VALUES (9903, '마동식', 'Pascal', '조교수', 360, TO_DATE('17-5월-1993','DD-MON-YYYY'), 15, 101);
INSERT INTO PROFESSOR VALUES (9904, '임도연', 'Blue77', '전임강사', 240, TO_DATE('02-12월-1998','DD-MON-YYYY'), NULL, 102);
INSERT INTO PROFESSOR VALUES (9905, '지현수', 'refresh', '교수', 450, TO_DATE('08-1월-1986','DD-MON-YYYY'), 25, 102);
INSERT INTO PROFESSOR VALUES (9906, '박초영', 'Pocari', '부교수', 420, TO_DATE('13-9월-1988','DD-MON-YYYY'), NULL, 101);
INSERT INTO PROFESSOR VALUES (9907, '이명수', 'totoro', '전임강사', 210, TO_DATE('01-1월-2001','DD-MON-YYYY'), NULL, 101);
INSERT INTO PROFESSOR VALUES (9908, '장원현', 'Bird13', '부교수', 400, TO_DATE('18-11월-1990','DD-MON-YYYY'), 17, 202);


 
DEPARTMENT 테이블 생성

  • CREATE TABLE DEPARTMENT(                -- 부서 (학과)
  • DEPTNO                  NUMBER(4),               -- 학과 번호    
  • DNAME                    VARCHAR2(30),         -- 학과 명
  • COLLEGE                NUMBER(4),              -- 과 번호
  • LOC                          VARCHAR2(10)         -- 교실 위치
  • );

학과 정보 작성
INSERT INTO DEPARTMENT VALUES (101, '컴퓨터공학과', 100, '1호관');
INSERT INTO DEPARTMENT VALUES (102, '멀티미디어학과', 100, '2호관');
INSERT INTO DEPARTMENT VALUES (201, '전자공학과', 200, '3호관');
INSERT INTO DEPARTMENT VALUES (202, '기계공학과', 200, '4호관');
INSERT INTO DEPARTMENT VALUES (100, '정보미디어학부', 10, NULL);
INSERT INTO DEPARTMENT VALUES (200, '메카트로닉스학부', 10, NULL);
INSERT INTO DEPARTMENT VALUES (10, ‘AI대학', NULL, NULL);
 


SALGRADE 테이블 생성(급여 등급)

  • CREATE TABLE SALGRADE (          -- 급여 등급
  • GRADE              NUMBER(2),           --등급
  • LOSAL                NUMBER(5),          --최저급여
  • HISAL                NUMBER(5)            --최고급여
  • );

INSERT INTO SALGRADE VALUES (1, 100, 300);
INSERT INTO SALGRADE VALUES (2, 301, 400);
INSERT INTO SALGRADE VALUES (3, 401, 500);


처음으로 할 것은 추출 실행 연산자이다.
위에서 모든 행(듀플) 들을 CTRL+ENTER을 눌러 등록을 먼저 시켜줍니다. (끝에 ; 잊으면 혼나요)
실행 후엔 SELECT * FROM 릴레이즈를 실행시켜 등록시켜 둔 문서들이 전부 출력되는지 확인해 봅니다.
SELECT * FROM  STUDENT;
SELECT * FROM  PROFESSOR;
SELECT * FROM  DEPARTMENT;
SELECT * FROM SALGRADE;
두 번 실행시키면 두 번씩 출력될 수도 있으니 주의합시다
그 후엔 연사자를 사용하여 예제문을 풀어 봅시다 
가 봅시다 (지금 까지 준비 단계)


1. 조건검색

예제) 학생 테이블에서 1학년 학생만 검색하여 학번, 이름,
학과번호를 출력하시오(where절 이용)
SELECT studno, name, DEPTNO FROM STUDENT  --학생테이블에서 
where grade=1;                                                            --1학년 출력(조건)
 
 
 
2. 비교연산자 (=, <, >)
예제)  학생 테이블에서 몸무게 70킬로 이하인 한생만 출력
SELECT * FROM STUDENT    -- 
where WEIGHT <=70;         --비교연산

비교연산 질의결과

3. 논리연산자 (부정이 먼저 NOT, AND, OR)
예제) 학생 테이블에서 1학년 학생 이면서 몸무게 70킬로 이상 (and연산자 이용)
SELECT * FROM STUDENT
where grade='1' and WEIGHT >=70 ;    --AND 사용

비교연산 질의결과


예제) 학생 테이블에서 1학년 학생 이거나 몸무게 70키로 이상 (or연산자 이용)


SELECT studno, name, DEPTNO, WEIGHT FROM STUDENT
where grade='1' or WEIGHT <=70 ; -- OR 사용

 
 
 
 
 
 
 
예제) 학생 테이블에서 학과번호가 '101'이 아닌 학생의  한 번과 이름 학과번호를 출력하시오 (not연산자 이용)                      OR 사용



SELECT studno, name, DEPTNO FROM STUDENT
where not DEPTNO='101' ;
 
4. between 연산자
비등가조인 테이블에 조인할 똑같은 칼럼이 없을 때 사용하기도 하고,
a부터(and) b까지 조건 검색 시에도 사용
 
예제) 몸무게가 50킬로에서 70킬로 상이인 학생의 학번, 이름, 몸무게를 출력하시오.
SELECT studno, name, WEIGHT FROM STUDENT
where WEIGHT between 50 and 70;                                                                                                                        not연산자 이용
 
예제) 비등가 조인 교수 테이블과 급여등급 테이블에서 높은 급여와 낮은 급여를 표시하시오 
SELECT P.NAME, P.SAL, S.GRADE FROM PROFESSOR P, SALGRADE S
WHERE P.SAL BETWEEN S.LOSAL AND S.HISAL;


예제) 학생 테이블에서 81에서 83년도에 태어난 학생의 이름과 생년일을 출력하시오
SELECT studno, name, BIRTHDATE FROM STUDENT
where BIRTHDATE between '81/01/01' and '83/12/31';

5. IN 연산자
예제)  102번 학과와 201번 학과 학생의 이름, 학년, 학과번호를 출력
SELECT studno, name, DEPTNO FROM STUDENT
where DEPTNO IN (102,201);

6. LIKE 연산자                                                                                                                                                          between 연산자
1. 핵심 기호 (와일드카드)

  • % (퍼센트): 글자 수에 상관없이 모든 문자를 의미합니다. (0글자 포함)
  • _ (언더바):한 글자의 자리를 의미합니다.
    사용 예시 의미 검색 결과 예시
    '김%' '김'으로 시작하는 모든 이름 김유신, 김수한무거북이...
    '%석' '석'으로 끝나는 모든 이름 유재석, 마동석, 조정석
    '%이%' '이'라는 글자가 어디든 포함된 이름 아이유, 이도현, 수지(해당 없음)
    '이_ _' '이'로 시작하는 딱 세 글자 이름 이도현, 이광수 (이혜리는 안됨)

3. 주의사항

  • 대소문자 구분: 오라클은 기본적으로 문자열의 대소문자를 구분합니다. 'a%'와 'A%'는 결과가 다를 수 있으니 주의하세요. (해결책: UPPER(USERID) LIKE 'A%')
  • 성능: 데이터가 수백만 건일 때 앞부분에 %를 붙이는 것('%석')은 검색 속도가 느려질 수 있습니다.

예제) 지정한 문자 패턴과 부분적으로 일치하면 참이 되는 연산자
SELECT * FROM STUDENT
where NAME LIKE '이%';

SELECT * FROM PROFESSOR
where NAME LIKE '이%'
OR NAME LIKE '김%'
OR NAME LIKE '% 나%';

7. IS 연산자
예제) 교수 테이블에서 보직수당이 없는 교수의 이름, 직급, 보직수당을 출력하라.
SELECT * FROM PROFESSOR
WHERE COMM IS NOT NULL;

예제)  102번 학과의 학생 중에서 1학년 또는 4학년 학생의 이름, 학번, 학과 번호를 출력하라
SELECT * FROM STUDENT
where DEPTNO='102'
AND   (grade='1'  OR grade='4');
 

8.COUNT 연산자
 COUNT(*): NULL포함, COUNT(칼럼) NULL제외
SELECT COUNT(*) FROM PROFESSOR;

예제) 101번 학과 교수 중에서 보직수당을 받는 교수의 수를 출력
SELECT COUNT(COMM) FROM PROFESSOR
WHERE DEPTNO = 101;

9. GROUP BY 연산자  
SELECT DEPTNO, AVG(SAL) FROM PROFESSOR
GROUP BY DEPTNO
ORDER BY DEPTNO;

 

10.ORDER BY 연산자

정렬 연산자 DESC 내림차순, ASC 오름차순 ( ASC 생략 가능)
 

11. 평균(AVG) 연산자
예제) 학생 테이블에서 학과별 평균(AVG) 몸무게를 추출
SELECT DEPTNO, AVG(WEIGHT) FROM STUDENT
GROUP BY DEPTNO    --그룹으로 묶기
ORDER BY DEPTNO;   -- 오름차순   

예제)  교수 테이블에서 학과별로 교수 수와 보직수당을 받는 교수 수를 풀력하시요.
SELECT DEPTNO, COUNT(*), COUNT(COMM), AVG(SAL) FROM PROFESSOR
GROUP BY DEPTNO
ORDER BY DEPTNO;      --오더 바이는 마지막에 위치한다

 

12. MIN( ) , MAX( ) 연산자
 MIN 최소치,  MAX 최대치
예제) 학과별로 소속 교수들의 평균급여, 최소급여, 최대급여를 출력해라
SELECT DEPTNO, AVG(SAL) AS A, MIN(SAL), MAX(SAL)  FROM PROFESSOR
GROUP BY DEPTNO
ORDER BY DEPTNO;

13. HAVING 절

HAVING 절은 GROUP BY로 묶인 그룹들에 대해 조건을 걸 때 사용합니다. WHERE 절이 개별 행(Row)을 필터링한다면, HAVING 절은 통계 결과(그룹)를 필터링한다고 이해하시면 됩니다.

구분 WHERE 절 HAVING 절


예제) 학생수가 4명 이상인 학년에 학년, 학생수, 평균키, 평균 몸무게를 출력 단, 평균 키와 평균 몸무게는 소수점 첫 번째 자리에서 반올림하고 출력 순서는 평균키가 높은 순부터 내림차순 하라
SELECT GRADE, COUNT(*) 학생수, ROUND(AVG(HEIGHT)) 평균키, ROUND(AVG(WEIGHT))평균몸무게 FROM STUDENT
GROUP BY GRADE
HAVING COUNT(*) >= 4
ORDER BY 평균키 DESC;
-- 여기서 ROUND( )는 소수점 절삭기능

예제) 교수테이블에서 학과번호가 102, 201 인 평균급여 출력
SELECT DEPTNO 학과번호, AVG(SAL) 평균급여  FROM PROFESSOR
GROUP BY DEPTNO
HAVING DEPTNO = 102
OR DEPTNO = 201
ORDER BY DEPTNO;
 

14. JOIN 연산자

셀프조
조인(JOIN, =) 연산자는 두 개 이상의 테이블을 연결하여 하나의 결과로 보여주는 SQL의 핵심 기능입니다.
예제) 학번이 10101인 학생의 이름과 학과소속 를 출력하시오
select NAME, DNAME from STUDENT, DEPARTMENT
WHERE STUDNO = 10101 
AND STUDENT.DEPTNO = DEPARTMENT.DEPTNO;
 
14-1. NATURAL JOIN
을 이용하여 교수번호, 이름, 학과번호, 학과이름을 출력하라
SELECT PROFNO 교수번호, NAME 이름, DEPTNO 학과번호, DNAME 학과 
FROM PROFESSOR NATURAL JOIN DEPARTMENT;
 
14-2. JOIN USING
절을 이용하여 학번, 이름, 학과번호, 학과위치를 출력하라
SELECT STUDNO 학번, S.NAME 이름, DEPTNO 학과번호, LOC 학과위치 
FROM STUDENT S  JOIN DEPARTMENT D USING (DEPTNO);
 
14-3. JOIN ON
을 이용하여 성이 김 씨인 학생들의 이름, 학과이름, 학과위치를 출력
SELECT S.NAME 이름, DNAME 학과, LOC 학과위치 
FROM STUDENT S  JOIN DEPARTMENT D ON S.DEPTNO = D.DEPTNO
WHERE NAME LIKE '김%';

14-4. OUTER JOIN
아우터 조인

--SELECT A.column, B.COLUM
--FROM A, B
--WHERE A.COLUM = B.column(+)
아이유, 손석구 등은 PROFNO가 NULL입니다. 일반 조인을 하면 이 학생들은 사라지지만, (+)를 쓰면 나타납니다.

예제)  학생 테이블과 교수 테이블을 조인하여 이름, 학년, 지도교수이름, 직급을 출력하여라 단, 지도교수가 배정되지 않은 핵생도 출력
SELECT S.NAME, S.GRADE, P.NAME, P.POSITION FROM STUDENT S, PROFESSOR P
WHERE S.PROFNO = P.PROFNO(+);

SELECT S.NAME 학생, S.GRADE 학년, P.NAME 지도교수, P.POSITION 직위
FROM STUDENT S
FULL OUTER JOIN PROFESSOR P ON S.PROFNO = P.PROFNO;
 
💡 조인 연산자 선택 팁!

  • 최신 추세: 오라클도 이제는 가독성이 좋고 다른 DB(MySQL 등)와 호환되는 ANSI 표준 문법(JOIN ~ ON)을 권장합니다.
  • 주의사항: 조인을 할 때 조건(WHERE나 ON)을 빼먹으면 모든 경우의 수가 다 합쳐지는 **카테시안 곱(Cartesian Product)**이 발생해 데이터가 엄청나게 불어나니 주의해야 합니다.

 

15. 교수 테이블에서 급여의 표준편차와 분산을 출력하라
   STDDEV, VARIANCE
SELECT ROUND(STDDEV(SAL)), ROUND(VARIANCE(SAL)) FROM PROFESSOR;

 

16. '컴켓(CONCAT)'

  1. CONCAT 함수란?
CONCAT(문자열 1, 문자열 2) 형식으로 사용하며, 두 값을 연결하여 하나의 문장으로 만들어줍니다.

  •           예시: SELECT CONCAT('Hello', ' World') FROM DUAL;
  •          결과: Hello World

   2. 실무에서 자주 쓰는 방법 (연결 연산자 ||)
사실 오라클에서는 CONCAT 함수보다 || (파이프라인 두 개) 기호를 훨씬 더 많이 씁니다. 이유가 뭘까요?

  • CONCAT 함수의 단점: 한 번에 딱 2개의 문자열만 합칠 수 있습니다. 3개를 합치려면 함수 안에 함수를 또 써야 해서 복잡합니다.
  • CONCAT(CONCAT(NAME, '님은 '), POSITION) (복잡함)
  • || 연산자의 장점: 개수 제한 없이 계속 이어서 쓸 수 있어 훨씬 편합니다.
    • NAME || '님은 ' || POSITION (간결함)

예제)  부서 번호가 201 이상인 부서 이름과 상위 부서의 이름을 출력하라
SELECT B.DNAME || '의 소속은' || A.D NAME
FROM DEPARTMENT A, DEPARTMENT B
WHERE A.DEPTNO = B.COLLEGE
AND B.DEPTNO >= 201;

예제)  부서 번호가 201 이상인 부서 이름과 상위 부서의 이름을 문장으로 출력
SELECT B.DNAME || '의 소속은 ' || A.DNAME AS "소속 정보"
FROM DEPARTMENT A, DEPARTMENT B
WHERE A.DEPTNO = B.COLLEGE
AND B.DEPTNO >= 201;
 

17. 서브쿼리

1. 구조와 작동 순서
서브쿼리는 **"쿼리 안의 쿼리"**입니다. 전체 결과를 내기 위해 안쪽에서 계산을 먼저 한 뒤,
그 값을 바깥쪽으로 던져주는 방식이죠.
2. 핵심 유형 2가지
① 단일행 서브쿼리 (결과가 1개일 때)

  • 결과가 값 하나만 나오므로 =, >, < 연산자를 씁니다.
  • 예: 평균 키보다 큰 학생 찾기

② 다중행 서브쿼리 (결과가 여러 개일 때)

  • 결과가 목록으로 나오므로 IN, ANY, ALL 연산자를 써야 합니다.
  • 예: 컴퓨터공학과 학생들의 학번과 일치하는 사람 찾기

3. 왜 쓰나요?

  • 동적인 조건: "평균보다 큰 사람"처럼 값이 상황에 따라 변할 때 유용합니다.
  • 가독성: 조인(JOIN)보다 문장이 훨씬 직관적일 때가 많습니다.

주의할 점

  • 서브쿼리는 항상 괄호 ( ) 안에 써야 합니다.
  • 결과가 여러 개 나왔는데 = 연산자를 쓰면 에러가 나니, 그럴 땐 **IN**을 쓰세요.

예제)  101번 학과 학생들의 평균 몸무게 보다 몸무게가 적은 학생의 이름, 학과번호, 몸무게를 출력하라
SELECT name, deptno, WEIGHT FROM STUDENT
where WEIGHT < (select AVG(WEIGHT) FROM STUDENT WHERE DEPTNO=101);

예제)   20101번 학생과 학년이 같고, 키는 20101번 학생보다 큰 학생의 이름, 학년, 키를 출력해라
SELECT name, GRADE, HEIGHT FROM STUDENT
where HEIGHT > (select GRADE FROM STUDENT WHERE STUDNO=20101 AND GRADE=20101 );

예제)   20101번 학생과 학년이 같고, 키는 더 큰 학생 출력
SELECT NAME, GRADE, HEIGHT FROM STUDENT
WHERE GRADE = (SELECT GRADE FROM STUDENT WHERE STUDNO = 20101) -- 학년이 같고
  AND HEIGHT > (SELECT HEIGHT FROM STUDENT WHERE STUDNO = 20101); -- 키는 더 큰
  
예제)  정보미디어학부 (부서번호:100)에 소속된 모든 학생의 학번, 이름, 학과 번호를 출력하여라.(IN연산자)
SELECT STUDNO, NAME, DEPTNO FROM STUDENT
WHERE DEPTNO IN (SELECT DEPTNO FROM DEPARTMENT WHERE COLLEGE = 100);

예제)   모든 학생 중에서 4학년 학생 중에서 키가 가장 큰 학생보다, 모든 학생 중에 키가 큰 학생의 학번, 이름, 키를 출력하시오
SELECT STUDNO, NAME, HEIGHT FROM STUDENT
WHERE HEIGHT > ALL (SELECT HEIGHT FROM STUDENT WHERE GRADE='4');

예제)   90~93년에 입사한 교수의 평균 급여보다 많은 급여를 받는 교수 출력
SELECT PROFNO, NAME, SAL 
FROM PROFESSOR
WHERE SAL > (SELECT AVG(SAL) FROM PROFESSOR 
                           WHERE HIREDATE BETWEEN TO_DATE('1990-01-01', 'YYYY-MM-DD') 
                                                                       AND TO_DATE('1993-12-31', 'YYYY-MM-DD'));
                                 
18. RANK 순위

RANK는 오라클 SQL에서 순위를 매길 때 사용하는 함수입니다. 특정 기준에 따라 데이터에 1등, 2등 같은 번호를 붙여주는 역할을 합니다.
1. 기본 사용법
반드시 OVER절과 함께 사용하며, 어떤 기준으로 순위를 매길지(ORDER BY) 정해줘야 합니다.
2. '공동 순위' 처리 방식
RANK 함수의 가장 큰 특징은 공동 순위가 나오면 그다음 순위를 건너뛴다는 점입니다.

  • RANK(): 1등, 1등, 3등 (2등을 건너뜀)
  • DENSE_RANK(): 1등, 1등, 2등 (비어있는 번호 없이 이어서 매김)
  • ROW_NUMBER(): 1등, 2등, 3등 (중복 없이 무조건 고유 번호 부여)

3. 그룹별 순위 (PARTITION BY)
전체 학생이 아니라, 학과별로 순위를 따로 매기고 싶을 때 PARTITION BY를 추가합니다.


예제)   학생테이블에서 키를 내림차순으로 정렬하여 키가 큰 사람부터 순위를 부여하여 출력하시오, 학생번호, 이름, 키, 링크
SELECT STUDNO, NAME, HEIGHT,
예제)   순위를 동점 이후에 계속 표시할 땐 DENSE_RANK()를 사용한다
DENSE_RANK() OVER(ORDER BY HEIGHT DESC) AS HEIGHT_1
FROM STUDENT;

예제)  학과별로 몸무게가 작은 사람부터 순위를 부여하여 이름순서대로 출력하시오
SELECT DEPTNO, WEIGHT, NAME,
RANK() OVER(ORDER BY WEIGHT) AS WEIGHT_1
FROM STUDENT;

-- ROW_NUMBER() OVER
예제)  OVER절 안에 PARTITION BY 사용
SELECT NAME, DEPTNO, WEIGHT,
RANK() OVER (PARTITION BY DEPTNO ORDER BY WEIGHT ASC) AS "몸무게 순위",
DENSE_RANK() OVER (PARTITION BY DEPTNO ORDER BY WEIGHT ASC) AS "DENSE 순위",
ROW_NUMBER() OVER (PARTITION BY DEPTNO ORDER BY WEIGHT ASC) AS "ROW_NUMBER 순위"
FROM STUDENT;

SELECT D.DNAME AS "학과명", 
       S.NAME AS "학생이름", 
       S.WEIGHT AS "몸무게",
       ROW_NUMBER() OVER (PARTITION BY S.DEPTNO ORDER BY S.WEIGHT ASC) AS "학과 내_순위"
FROM STUDENT S, DEPARTMENT D
WHERE S.DEPTNO = D.DEPTNO;

예제)  학생 테이블에서 학번이 20101인 학생의 사용자 아이디를 소문자와 대문자로 변환해서 출력
SELECT USERID, LOWER(USERID), UPPER(USERID) FROM STUDENT
WHERE STUDNO = 20101;

19. 문자열 반환 함수 (LENGTH) 

1. 기본 사용법
단순히 글자 수를 숫자로 돌려줍니다.
2. 유사한 함수와 차이점 (LENGTH vs LENGTHB)
가장 많이 헷갈리는 부분입니다. 글자 수를 셀 것인지, **메모리 용량(바이트)**을 잴 것인지의 차이입니다.

  • LENGTH: 문자의 개수를 반환합니다. (한글, 영어 모두 1 글자면 1)
  •                  글자 수 그대로 세기 (한글 '가' = 1)
  • LENGTHB: 문자의 바이트(Byte) 수를 반환합니다. (한글은 보통 3바이트, 영어/숫자는 1바이트)
  •                     실제 차지하는 용량 세기 (한글 '가' = 3바이트)

예제)   부서 테이블에서 부서 이름의 길이를 문자 수를 출력하여라
SELECT DNAME, LENGTH(DNAME) FROM DEPARTMENT;


지금 까지 수업 중에 배운 거 복습하면서 적어 보았습니다.
이것도 뭐 사람이 만든지라 언어에 많은 영향을 받는 것 같습니다
뭔가 꼬이는 느 낌은 어쩔 수 없나 봅니다
데이터 베이스 맛보기는 여기까지만 하고 다음엔 노드로 다시 돌아갑니다 유후~
 

본 후기는 [한글과 컴퓨터 x한국생산성본부 x스나이퍼팩토리] 한컴 AI 아카데미 (B-log) 리뷰로 작성되었습니다.

#한컴 AI아카데미 #AI개발자 #AI개발자교육 #한글과 컴퓨터 #한국생산성본부 #스나이퍼팩토리 #부트캠프 #AI전문가양성 #개발자교육 #개발자취업