728x90

 

[관련] 개념 설명

https://rise-up.tistory.com/719

 

계층형 쿼리(Hierarchical Query) 동작순서 + 설명

 

SQLD 자격검정 실전문제 P95/89

1.START WITH 라인을 먼저 뽑아냄

→ 001 홍길동,005이병헌

 

2.ORDERBY절

1번에서 뽑아낸 걸 오더바이절 조건대로 다시 정렬

 

3.CONNECT BY PRIOR

이전(PRIOR) 사원번호가 매니저사원번호인 ROW(행)을 찾아라

사원번호 = 매니저번호 조건에서 이전 사원번호가 001 홍길동이었으므로, 매니저사원번호가 001인 것들을 추려냄

 

4.AND 입사일자 BETWEEN ‘2013-01-01’ AND ‘2013-12-31’

입사일자 날짜 조건을 줘서 한번 걸러내므로 강감찬 탈락

003 이순신, 004 이민정만 추가

 

5.ORDER SIBLINGS BY

사원번호로 정렬

001 003 004 005 정렬이 맞으므로 순서 변화X

 

 

6.여기까지해서 또 계층 내려갈게 있는지 확인하려면, 매니저사원번호가 003,004인게 있는지 봐야한다

없으므로 내려갈 계층 더 없음. 이 계층은 여기서 끝

 

7.CONNECT BY PRIOR 사원번호 = 매니저사원번호

005 이병헌에서 매니저사원번호가 005인 ROW(행)을 찾아야한다

006,007,008이 존재함

 

 

8. AND 입사일자 BETWEEN ‘2013-01-01’ AND ‘2013-12-31’

AND의 입사일자 조건에 006,007,008 전부안맞아서 추가되는거 없음

 

9.결과값 도출

 

※만약 여기서 DESC로 정렬하고 싶으면 결과는?

DESC로 정렬하면 레벨1부터 정렬을 다시 해줘야하니 005가 맨 앞

다음 레벨2인 004가 003 위로가게됨

 

 

자료출처

https://www.youtube.com/watch?v=boNut__USIU&list=PLyQR2NzLKOCZU_jjLAdebyx9oE9dvvsrE&index=9 

https://www.youtube.com/watch?v=U4MlOLK2E9M&list=PLyQR2NzLKOCZU_jjLAdebyx9oE9dvvsrE&index=10 

https://yunamom.tistory.com/269?category=1006373#answer2

728x90
반응형
728x90

 

 

2중 조인 + 인라인뷰 서브쿼리 + RNUM 사용

테이블 조회 해보았다

RNUM의 별칭(alias)를 적용하기 위해서는 안쪽 셀렉트문에서 별칭이 선언되어야 밖의 쿼리에서 별칭이 적용될 수 있으니 유의!

 

SELECT * 
FROM BOARD B
    JOIN FOOD F ON(B.FOOD_NO = F.FOOD_NO)
    JOIN RESTAURANT R ON(B.RESTAURANT_NO = R.RESTAURANT_NO)
WHERE B.STATUS = 'Y' AND BOARD_TYPE = 1;



SELECT *
FROM (SELECT ROWNUM RNUM, DESCBOARD.*
      FROM (SELECT * 
            FROM BOARD B
                JOIN FOOD F ON(B.FOOD_NO = F.FOOD_NO)
                JOIN RESTAURANT R ON(B.RESTAURANT_NO = R.RESTAURANT_NO)
                WHERE B.STATUS = 'Y' AND BOARD_TYPE = 1) DESCBOARD)
WHERE RNUM >=2 AND RNUM
728x90
반응형
728x90

 

row 데이터 전체 조회 및 반환 코드

내부 쿼리문

 

package com.kh.test.model.TestDao;

import java.sql.Connection;
import java.sql.Date;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.List;
import com.kh.test.model.Test;

public class TestDao {

	
	public List<Test> selectList() {
		
		List<Test> list = null;
		Connection conn = null;
		Statement stmt = null;
		ResultSet rset = null;
		
		try {
			Class.forName("Oracle.jdbc.driver.OracleDriver");
			conn = DriverManager.getConnection("jdbc:oracle:thin:@192.168.10.3:1521:xe","kh","kh");
			
			String query = "SELECT * FROM TEST";
			
			stmt = conn.createStatement();
			rset = stmt.executeQuery(query);
			
			if(rset.next()) {
				int seq = rset.getInt("SEQ");
				String writer = rset.getString("WRITER");				
				String title = rset.getString("TITLE");				
				String content = rset.getString("CONTENT");				
				Date regDate = rset.getDate("DATE");		
				
				list.add(new Test(seq, writer, title, content,regDate));
			}
		} catch (ClassNotFoundException e) {
			e.printStackTrace();	
		} catch (SQLException e) {
			e.printStackTrace();

		} finally {
			try {
				rset.close();	
				stmt.close();   
				conn.close(); 	
			} catch (SQLException e) {
				e.printStackTrace();
			} 
		}
		return list;
	}
	
}

 

 

728x90
반응형
728x90

 

sql의 테이블 확인하고 

vo의 필드(전역변수) 세팅

필요한 값들을 필드에 넣기

 

package com.kh.test.model;

import java.sql.Date;

public class Test {
	
	public int seq;
	public String writer;
	public String title;
	public String content;
	public Date regDate;
	
	public Test() {}

	public Test(int seq, String writer, String title, String content, Date regDate) {
		super();
		this.seq = seq;
		this.writer = writer;
		this.title = title;
		this.content = content;
		this.regDate = regDate;
	}

	
	public int getSeq() {
		return seq;
	}

	public void setSeq(int seq) {
		this.seq = seq;
	}

	public String getWriter() {
		return writer;
	}

	public void setWriter(String writer) {
		this.writer = writer;
	}

	public String getTitle() {
		return title;
	}

	public void setTitle(String title) {
		this.title = title;
	}

	public String getContent() {
		return content;
	}

	public void setContent(String content) {
		this.content = content;
	}

	public Date getRegDate() {
		return regDate;
	}

	public void setRegDate(Date regDate) {
		this.regDate = regDate;
	}
	
	

}
728x90
반응형
728x90

 

db연결할 때 드라이버, 주소, sql 로그인 아이디, 비번 등

그리고 쿼리문을

코드 내부에 통합해서 작성할 수도 있지만,

외부 파일에 모아서 한번에 해결 가능하다 

 

이때 사용하는 자바 클래스 Properties

외부파일 확장자도 .properties이다

ex) sqlDriver.properties

어디서든 접근할 수 있게 선언은 필드로 한다

 

Dynamic Web프로젝트 파일에서의 Properties클래스 선언 및 외부파일 경로 지정

// 외부파일 로드용 클래스 Properties 선언
Properties prop = new Properties();

// 외부 파일 경로지정
public NoticeDAO() {
    String fileName = NoticeDAO.class.getResource("/sql/notice/notice-query.properties").getPath();

    try {
        prop.load(new FileReader(fileName));
    }catch(FileNotFoundException e) {
        e.printStackTrace();
    }catch(IOException e) {
        e.printStackTrace();
    }
}

 

쿼리문 사용 방법 예시

String query = prop.getProperty("selectList");

	public ArrayList<Notice> selectList(Connection conn) {
		// 고정값(공지사항)을 조회하는 거기에 Statement 사용
		Statement stmt = null;
		ResultSet rset = null;
		ArrayList<Notice> list = new ArrayList<>();
		
		String query = prop.getProperty("selectList");
        ...

 

드라이버 세팅 외부파일 처리

 

 

 

 

 

 

728x90
반응형
728x90

 

cmd로 들어가서 sqlplus 입력

sql에 진입

유저는 반드시 system권한을 가진 계정으로 해야한다

(아아디 비번을 틀리면 invalid username/pw; login denied 메세지가뜨면서 로그인 거부됨)

 

여기서 한번 더 conn/as sysdba로써 시스템 관리자로 들어간다

create user 사용할 아이디 indentified by 사용할 비번;

해서 계정 생성하고

grant connect,resource to id;

해서 권한 부여해준다

그리고 많이들 실수하는게 그냥 꺼버리는건데

commit까지 해줘야 완전히 저장된다

 

728x90
반응형
728x90

 

SELECT, FUCTION,  GROUP BY, HAVING, JOIN 100제 문제 풀이

100제 중 87문제 풀이 완료

 




--SELECT 문제
--1. EMPLOYEE 테이블의    사번, 이름, 급여   조회
SELECT EMP_NO, EMP_NAME,SALARY
FROM EMPLOYEE;
--2. EMPLOYEE 테이블의    모든    정보    조회
SELECT * FROM EMPLOYEE;
--3. JOB 테이블의   모든    정보   조회
SELECT * FROM JOB;
--4. JOB 테이블의   직급    이름   조회
SELECT JOB_NAME FROM JOB;
--5. DEPARTMENT 테이블의    모든    정보    조회
--6. EMPLOYEE 테이블의    직원    명, 이메일, 전화번호, 고용일    조회
--7. EMPLOYEE 테이블의    고용일, 사원    이름, 월급    조회
--8. EMPLOYEE 테이블에서    직원    명, 급여, 연봉    조회(연봉    = 급여*12)
SELECT EMP_NAME,SALARY,SALARY*12
FROM EMPLOYEE;
--9. EMPLOYEE 테이블에서    직원    명, 연봉, 보너스를    추가한    연봉    조회
SELECT EMP_NAME,SALARY,SALARY*12
FROM EMPLOYEE;
--10.EMPLOYEE  테이블에서      이름,  연봉,  총수령액(보너스      포함),  실수령액(총수령액-(연봉*세금 3%)) 조회
SELECT EMP_NAME 이름,SALARY 급여,SALARY*12-(SALARY*12*0.03) 총수령액, SALARY*12 연봉
FROM EMPLOYEE;
--11.EMPLOYEE  테이블에서      이름,  고용일,  근무일수(오늘      날짜      -  고용일)  조회,  오늘      날짜: SYSDATE
SELECT EMP_NAME, HIRE_DATE, SYSDATE - HIRE_DATE 근무일수, SYSDATE 오늘
FROM EMPLOYEE;
--12.EMPLOYEE 테이블에서    직원의    직원    번호, 사원    명, 급여, 단위    조회
--13.EMPLOYEE 테이블에서    직원의    직급    코드    조회
--14.EMPLOYEE 테이블에서    직원의    직급    코드를    중복    없이    조회
SELECT DISTINCT JOB_CODE
FROM EMPLOYEE;
--15.EMPLOYEE 테이블에서    직원의    부서    코드를    중복    없이    조회
SELECT DISTINCT DEPT_CODE
FROM EMPLOYEE;
--16.EMPLOYEE 테이블에서    부서    코드가    'D9'인    직원의    이름, 부서    코드    조회
SELECT EMP_NAME,DEPT_CODE
FROM EMPLOYEE
WHERE DEPT_CODE = 'D9';
--17.EMPLOYEE 테이블에서    급여가    4000000 이상인    직원의    이름, 급여    조회
SELECT EMP_NAME, SALARY
FROM EMPLOYEE
WHERE SALARY >= 4000000;
--18.EMPLOYEE 테이블에서    부서    코드가    ‘D9’가    아닌    사원의    사번, 이름, 부서    코드    조회
SELECT EMP_ID, EMP_NAME,DEPT_CODE
FROM EMPLOYEE
WHERE DEPT_CODE != 'D9';
--19.EMPLOYEE  테이블에서    퇴사    여부가    N인    직원을    조회하고    근무    여부를    재직중으로    표시하 고    사번, 이름, 고용일, 근무    여부    조회
SELECT EMP_ID, EMP_NAME, HIRE_DATE, ENT_YN 재직중
FROM EMPLOYEE
WHERE ENT_YN = 'N' ;
--20.EMPLOYEE 테이블에서    월급이    3000000이상인    사원의    이름, 월급, 고용일    조회
--21.EMPLOYEE 테이블에서    SAL_LEVEL이   ‘S1’인    사원의    이름, 월급, 고용일, 연락처    조회
--
--22.EMPLOYEE 테이블에서    실수령액(총수령액    - (연봉*세금%3))이    5천만원    이상인    사원의    이름, 급여, 실수령액, 고용일    조회
--23.EMPLOYEE  테이블에서    부서    코드가    ‘D6’이고    급여를    3000000보다    많이    받는    직원의    이름, 부서    코드, 급여    조회
--24.EMPLOYEE  테이블에서    부서    코드가    ‘D6’이거나    급여를    3000000보다    많이    받는    직원의    이 름, 부서   코드, 급여    조회
--25.EMPLOYEE  테이블에서    급여를    3500000  이상    6000000  이하를    받는    사원의    사번,  이름,  급 여, 부서코드, 직급코드
--26.EMPLOYEE테이블에    월급이    4000000이상이고    JOB_CODE가    ‘J2’인    사원의    전체    내용    조회
--27.EMPLOYEE 테이블에    DEPT_CODE가    ‘D9’이거나    ‘D5’인    사원    중에    고용일이    02년    1월    1일보 다    빠른   사원의    이름, 부서코드, 고용일   조회
--28.EMPLOYEE  테이블에서    급여를    3500000  미만    6000000  초과를    받는    사원의    사번, 이름,  급 여, 부서코드, 직급코드
--29. EMPLOYEE 테이블에    고용일이    90/01/01 ~ 01/01/01인    사원의    전체    내용을    조회
SELECT *
FROM EMPLOYEE
WHERE HIRE_DATE >= '90/01/01' AND HIRE_DATE <= '01/01/01';
--30. EMPLOYEE 테이블에서    성이    ‘전’씨인    사원의    사번, 고용일    조회
--31. EMPLOYEE 테이블에서    이름이    '하'가    포함된    직원의    이름, 주민번호, 부서코드    조회
--32. EMPLOYEE 테이블에서    전화번호    4번째    자리가    9로    시작하는    사원의    사번, 이름, 전화번호 조회
--33. EMPLOYEE  테이블에서    이메일    중    _의    앞    글자가    3자리인    이메일    주소를    가진    사원의    사 번, 이름, 이메일    주소    조회
SELECT EMP_ID,EMP_NAME, EMAIL
FROM EMPLOYEE
WHERE EMAIL LIKE '___!_%' ESCAPE '!';
--34. EMPLOYEE 테이블에서    이름    중    김씨    성을    가지지    않은    사원의    사번, 이름, 고용일   조회
--35. EMPLOYEE 테이블에서    이름    끝이    '연'으로    끝나는    사원    조회
SELECT *
FROM EMPLOYEE
WHERE EMP_NAME LIKE '%연';
--36. EMPLOYEE 테이블에서    전화번호    처음    세자리가    010이    아닌    사원의    이름, 전화번호    조회
SELECT EMP_NAME,PHONE
FROM EMPLOYEE
WHERE PHONE NOT LIKE '010%';
SELECT EMP_NAME,PHONE
FROM EMPLOYEE
WHERE NOT PHONE LIKE '010%';
--37. EMPLOYEE  테이블에서     메일주소     _의     앞이     4자이면서     DEPT_CODE가     ‘D9’     또는     ‘D6’이고, 
-- 고용일이    90/01/01 ~ 00/12/01이고, 급여가   2700000만    이상인    사원의    전체    정보    조회
SELECT *
FROM EMPLOYEE
WHERE EMAIL LIKE '____!_%' ESCAPE '!'
        AND (DEPT_CODE = 'D9' OR DEPT_CODE = 'D6')
        AND HIRE_DATE BETWEEN '90/01/01' AND '00/12/01'
        AND SALARY >= 2700000;
        
--38. EMPLOYEE 테이블에서    보너스를    받지    않는    사원의    사번, 이름, 급여, 보너스    조회
SELECT EMP_ID, EMP_NAME, SALARY,  NVL(BONUS, 0)---------------------
FROM EMPLOYEE
WHERE BONUS = 0;
--39. EMPLOYEE 테이블에서    보너스를    받는    사원의    사번, 이름, 급여, 보너스    조회
SELECT EMP_ID, EMP_NAME, SALARY, BONUS
FROM EMPLOYEE
WHERE BONUS IS NULL;
--40. EMPLOYEE  테이블에서 관리자도 없고 부서 배치도 받지 않은 직원의 이름,  관리자,  부서코드    조회
SELECT EMP_NAME, MANAGER_ID, DEPT_CODE
FROM EMPLOYEE
WHERE MANAGER_ID IS NULL AND DEPT_CODE IS NULL;

--41. EMPLOYEE  테이블에서    부서    배치를    받지    않았지만    보너스를    지급받는    직원의    이름,  보너 스, 부서코드   조회
SELECT EMP_NAME,BONUS,DEPT_CODE
FROM EMPLOYEE
WHERE DEPT_CODE IS NULL AND BONUS IS NOT NULL;
--42. ‘D6’부서와   ‘D9’부서원들의    이름, 부서코드, 급여    조회
--43. 직급   코드가   ‘J1’, ‘J2’, ‘J3’, ‘J4’인    사람들의    이름, 직급    코드, 급여    조회
SELECT EMP_NAME, JOB_CODE,SALARY
FROM EMPLOYEE
WHERE JOB_CODE IN ('J1','J2','J3','J4');
--44. EMPLOYEE 테이블에서    사번, 이름, 급여를    연결해서    조회    (EX. 200선동일8000000)
SELECT EMP_ID||EMP_NAME||SALARY
FROM EMPLOYEE;
--45. EMPLOYEE 테이블에서    '사원    명의    월급은    급여    원입니다' 형식으로    조회
SELECT '사원명 '||EMP_NAME||'의 월급은 급여 '|| SALARY||'원입니다'
FROM EMPLOYEE;
--
--
--
--FUNCTION 문제
--1. EMPLOYEE  테이블에서    사원    명,  입사일-오늘,  오늘-입사일    조회    (단,  별칭은    근무일수1,  근 무일수2로   하고    모두    정수    처리(내림)와    양수로    처리)
SELECT EMP_NAME, FLOOR(ABS(HIRE_DATE - SYSDATE)) 근무일수1 , FLOOR(ABS(SYSDATE - HIRE_DATE)) 근무일수2
FROM EMPLOYEE;
--2. EMPLOYEE 테이블에서    사번이    홀수인    직원들의    정보    모두    조회
SELECT *
FROM EMPLOYEE
--WHERE MOD(EMP_ID,2) = 1;
WHERE MOD(EMP_ID,2) != 0;
--3. EMPLOYEE 테이블에서    근무연수가    20년    이상인    직원    정보    조회
SELECT *
FROM EMPLOYEE
WHERE MONTHS_BETWEEN(SYSDATE, HIRE_DATE) >= 20;
--4. EMPLOYEE 테이블에서    사원    명, 입사일, 입사한    달의    근무일    수    조회
SELECT EMP_NAME, HIRE_DATE, LAST_DAY(HIRE_DATE)-HIRE_DATE "입사한 달의 근무일수"
FROM EMPLOYEE;
--5. EMPLOYEE 테이블에서    사원의    이름, 입사    연도, 입사    월, 입사일    조회
SELECT EMP_NAME, HIRE_DATE, LAST_DAY(HIRE_DATE)-HIRE_DATE "입사한 달의 근무일수"
FROM EMPLOYEE;
--6. EMPLOYEE테이블에서    사원의    이름,  입사일,  근무연수    조회    (단,  근무연수는    현재    연도    - 입 사연도로    조회)
SELECT EMP_NAME, HIRE_DATE, EXTRACT(YEAR FROM SYSDATE)-EXTRACT(YEAR FROM HIRE_DATE) 근무연수
FROM EMPLOYEE;
--7. EMPLOYEE 테이블에서    사원    명, 급여(\9,000,000 형식) 조회
SELECT EMP_NAME ,TO_CHAR(SALARY,'L9,000,000') 급여
FROM EMPLOYEE;
--8. EMPLOYEE 테이블에서    이름, 입사일(2022년    3월    15일    (화) 형식) 조회
SELECT EMP_NAME,TO_CHAR(HIRE_DATE, 'YYYY"년" FMMM"월" DD"일" (DY)')
FROM EMPLOYEE;
--9. 직원의 급여를 인상하고자 한다. 직급코드가 ‘J7’인 직원은 급여의 10%를 인상하고, 직급코 드가 ‘J6’인 직원은 급여의 15%를 인상하고, 
-- 직급코드가 ‘J5’인 직원은 급여의 20%를 인상 하며, 그 외 직급의 직원은 급여의 5%만 인상하며, 직원 테이블에서 직원명,  직급코드,  급 여, 인상급여(위 조건)을 조회
SELECT EMP_NAME, JOB_CODE, SALARY, 
        CASE JOB_CODE WHEN 'J7' THEN SALARY*0.1
                      WHEN 'J6' THEN SALARY*0.15
                      WHEN 'J5' THEN SALARY*0.2
                      ELSE SALARY*0.05
        END 인상급여
FROM EMPLOYEE;
SELECT EMP_NAME, JOB_CODE, SALARY, 
    CASE WHEN JOB_CODE = 'J7' THEN SALARY*1.1
         WHEN JOB_CODE = 'J6' THEN SALARY*1.15
         WHEN JOB_CODE = 'J5' THEN SALARY*1.2
         ELSE SALARY*1.05
    END 인상급여
FROM EMPLOYEE;

SELECT EMP_NAME, JOB_CODE, SALARY 월급, 
        DECODE(JOB_CODE,'J7',SALARY*0.1,
                        'J6',SALARY*0.15,
                        'J5',SALARY*0.2,SALARY*0.5) 인상급여
FROM EMPLOYEE;

                        
--10. EMPLOYEE 테이블에서    전    사원의    급여    총합    조회
SELECT SUM(SALARY) FROM EMPLOYEE;
--11. EMPLOYEE 테이블에서    남자사원의    급여    총합    조회
SELECT SUM(SALARY)
FROM EMPLOYEE
WHERE SUBSTR(EMP_NO,8,1)=1;
--12. EMPLOYEE 테이블에서    전    사원의    급여    평균    조회
SELECT AVG(SALARY)
FROM EMPLOYEE;
--13. EMPLOYEE 테이블에서 전 사원의 보너스 평균 (단, BONUS가 NULL인 사원은 0으로 처리)
SELECT AVG(NVL(BONUS,0))
FROM EMPLOYEE;
--14. EMPLOYEE 테이블에서    최소    급여와    최대    급여    조회
SELECT MIN(SALARY), MAX(SALARY)
FROM EMPLOYEE;
--15. 부서   코드가   있는    사원    수    (NULL 제외) 조회
SELECT COUNT(DEPT_CODE)
FROM EMPLOYEE;
SELECT COUNT(DEPT_CODE)
FROM EMPLOYEE;




--GROUP BY HAVING 문제
--1. 부서    별   급여    합계    조회
SELECT SUM(SALARY) 급여합계, DEPT_CODE
FROM EMPLOYEE
GROUP BY DEPT_CODE;
--2. EMPLOYEE 테이블에서 부서, 부서 별 급여 합계, 부서 별 급여 평균, 부서 별 인원 수 조회
SELECT DEPT_CODE 부서코드, SUM(SALARY)급여합계,/*AVG(SALARY)*/ CEIL(AVG(SALARY))급여평균, COUNT(*) 부서인원수
FROM EMPLOYEE
GROUP BY DEPT_CODE;
--3. EMPLOYEE 테이블에서    부서코드와    보너스    받는    사원    수    조회
SELECT DEPT_CODE, COUNT(BONUS) "보너스O사원수"
FROM EMPLOYEE
GROUP BY DEPT_CODE;
--4. EMPLOYEE 테이블에서    직급코드와    보너스    받는    사원    수    조회
SELECT JOB_CODE, COUNT(BONUS) "보너스 사원수"
FROM EMPLOYEE
GROUP BY JOB_CODE;
--5. EMPLOYEE 테이블에서    성별과    성별    별    급여    평균(정수처리(내림)), 급여    합계, 인원    수    조회 (인원    수로   내림차순)
SELECT DECODE(SUBSTR(EMP_NO,8,1),1,'남','여') 성별, FLOOR(ABS(AVG(SALARY))) "성별 별 급여평균", SUM(SALARY), COUNT(*)
FROM EMPLOYEE 
GROUP BY SUBSTR(EMP_NO,8,1)
ORDER BY COUNT(*) DESC;
--6. EMPLOYEE 테이블에서    부서    코드별로    같은    직급인    사원의    급여    합계    조회
SELECT DEPT_CODE, SUM(SALARY)
FROM EMPLOYEE
GROUP BY DEPT_CODE
HAVING DEPT_CODE IN('D1','D2','D3','D4','D5');

SELECT DEPT_CODE, JOB_CODE, SUM(SALARY)
FROM EMPLOYEE
GROUP BY DEPT_CODE, JOB_CODE
ORDER BY DEPT_CODE;
--7. 부서    코드와   급여    3000000이상인    직원의    그룹    별    평균    급여    조회
SELECT DEPT_CODE, AVG(SALARY)
FROM EMPLOYEE
GROUP BY DEPT_CODE, SALARY
HAVING SALARY >= 3000000;
--8. 부서    코드와   급여    평균    3000000이상인    그룹   별    평균    급여    조회
SELECT  DEPT_CODE, AVG(SALARY)
FROM EMPLOYEE
GROUP BY DEPT_CODE,SALARY
HAVING AVG(SALARY) >= 3000000;
--9. 부서 별 급여 합계 중 9000000을 초과하는 부서코드와 급여 합계 조회
SELECT DEPT_CODE,SUM(SALARY)
FROM EMPLOYEE
GROUP BY DEPT_CODE
HAVING SUM(SALARY) > 9000000;
--10.EMPLOYEE테이블에서 각 부서코드마다 직급코드 별 급여 합, 부서 별 급여 합, 총합 조회
SELECT DEPT_CODE,JOB_CODE, SUM(SALARY)
FROM EMPLOYEE
GROUP BY DEPT_CODE, JOB_CODE 
ORDER BY DEPT_CODE;
--11. EMPLOYEE  테이블에서 DEPT_CODE가 ‘D5’이거나 급여가 3000000을 초과하는 직원의 사번, 이름, 부서코드, 급여 조회
SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY
FROM EMPLOYEE
WHERE DEPT_CODE = 'D5' OR SALARY > 3000000;

--
--JOIN 문제
--내부 조인(INNER JOIN) : 일치하지 않는 컬럼 값은 제외시킴 
--1. 사번, 사원 명, 부서코드 조회
SELECT EMP_ID, EMP_NAME, DEPT_CODE FROM EMPLOYEE;
--2-1.사번, 이름,부서코드, 부서 명 조회(오라클 전용 구문) 
SELECT EMP_ID, EMP_NAME, DEPT_CODE, DEPT_TITLE
FROM EMPLOYEE, DEPARTMENT
WHERE DEPT_CODE = DEPT_ID;
SELECT EMP_ID, EMP_NAME, DEPT_CODE, DEPT_TITLE
FROM EMPLOYEE, DEPARTMENT
WHERE DEPT_CODE = DEPT_ID;
--2-2.사번, 이름,부서코드, 부서 명 조회(ANSI 표준 구문)
SELECT EMP_ID, EMP_NAME, DEPT_CODE, DEPT_TITLE
FROM EMPLOYEE
    JOIN DEPARTMENT ON(EMPLOYEE.DEPT_CODE = DEPARTMENT.DEPT_ID);
--3-1.사번, 사원 명, 직급코드, 직급명 조회(오라클 전용구문) 
SELECT EMP_ID, EMP_NAME, E.JOB_CODE, J.JOB_NAME
FROM EMPLOYEE E, JOB J
WHERE E.JOB_CODE = J.JOB_CODE;

SELECT EMP_ID,EMP_NAME, EMPLOYEE.JOB_CODE, JOB.JOB_NAME
FROM EMPLOYEE, JOB
WHERE EMPLOYEE.JOB_CODE = JOB.JOB_CODE;
--3-2.사번, 사원 명, 직급코드, 직급명 조회(ANSI 표준구문) 
SELECT EMP_ID, EMP_NAME, JOB_CODE, JOB_NAME
FROM EMPLOYEE E
    JOIN JOB J USING(JOB_CODE);
    
SELECT EMP_ID, EMP_NAME, E.JOB_CODE, J.JOB_NAME
FROM EMPLOYEE E
    JOIN JOB J ON(E.JOB_CODE = J.JOB_CODE);
--4-1.부서   명과   해당    부서의    지역    명    조회(오라클    전용    구문)
SELECT D.DEPT_TITLE, L.LOCAL_NAME
FROM DEPARTMENT D, LOCATION L
WHERE D.LOCATION_ID = L.LOCAL_CODE;

SELECT DEPT_TITLE,LOCAL_NAME
FROM DEPARTMENT, LOCATION
WHERE LOCATION_ID = LOCAL_CODE;
--4-2.    부서   명과   해당    부서의    지역    명    조회(ANSI 표준    구문)
SELECT DEPT_TITLE, LOCAL_NAME
FROM DEPARTMENT D
    JOIN LOCATION L ON(D.LOCATION_ID = L.LOCAL_CODE);
--5. 오라클    전용    구문    ANSI 표준    구문으로    바꾸기
--SELECT EMP_NAME, DEPT_TITLE FROM EMPLOYEE, DEPARTMENT WHERE DEPT_CODE = DEPT_ID(+);
SELECT EMP_NAME, DEPT_TITLE 
FROM EMPLOYEE E
    LEFT JOIN DEPARTMENT D ON (E.DEPT_CODE = D.DEPT_ID);
SELECT EMP_NAME, DEPT_TITLE 
FROM EMPLOYEE
    LEFT OUTER JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID);    
--6. 오라클    전용    구문    ANSI 표준    구문으로    바꾸기
--SELECT EMP_NAME, DEPT_TITLE FROM EMPLOYEE, DEPARTMENT WHERE DEPT_CODE(+) = DEPT_ID;
SELECT EMP_NAME, DEPT_TITLE 
FROM EMPLOYEE
    RIGHT OUTER JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID);
--7. 오라클    전용    구문에선    FULL [OUTER] JOIN 안    됨. 아래    구문    실행해도    에러    남. 그러니까 밑에    구문을    ANSI 표준으로    바꿔주셈.
--SELECT EMP_NAME, DEPT_TITLE FROM EMPLOYEE, DEPARTMENT WHERE DEPT_CODE(+) = DEPT_ID(+);
SELECT EMP_NAME, DEPT_TITLE 
FROM EMPLOYEE
    FULL OUTER JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID);
--8-1.   사번, 이름, 부서    코드, 부서    명, 지역    이름(LOCAL_NAME) 조회(오라클    전용    구문) 
SELECT EMP_ID,EMP_NAME, DEPT_CODE, DEPT_TITLE,LOCAL_NAME
FROM EMPLOYEE, DEPARTMENT,LOCATION
WHERE DEPT_CODE = DEPT_ID
    AND LOCATION_ID = LOCAL_CODE;
--8-2.   사번, 이름, 부서    코드, 부서    명, 지역    이름(LOCAL_NAME)(ANSI 표준    구문)
SELECT EMP_ID, EMP_NAME, DEPT_CODE, DEPT_TITLE, LOCAL_NAME
FROM EMPLOYEE
    JOIN DEPARTMENT ON ( DEPT_CODE = DEPT_ID)
    JOIN LOCATION ON ( LOCATION_ID = LOCAL_CODE);



--SUBQUERY 문제
--서브    쿼리(SUBQUERY) :  메인    쿼리를    위해    보조    역할을    하는    쿼리이며,  쿼리    안에    쿼리가    포 함되어   있음.
--1. 첫    번째   구문과    두    번째    구문    합쳐주셈.
--①
--SELECT DEPT_CODE FROM EMPLOYEE
--WHERE EMP_NAME = '노옹철';
--②
--
--SELECT EMP_NAME FROM EMPLOYEE
--WHERE DEPT_CODE = 'D9';
--2. 전    직원의   평균    급여보다    많은    급여를   받고    있는    직원의    사번, 이름, 직급    코드, 급여    조회
--3. 노옹철    사원의   급여보다    많이    받는    직원의    사번, 이름, 부서코드, 직급코드, 급여    조회
--4. 가장    적은   급여를    받는    직원의    사번, 이름, 직급코드, 부서코드, 급여    입사일    조회
--5. 부서    별   급여    합계    중    가장    큰    부서의   부서    명, 급여    합계
--6. 부서    별   최고    급여를    받는    직원의    이름, 직급    코드, 부서코드, 급여    조회
--7. 관리자와    일반    직원에    해당하는    사원    정보    추출    : 사번, 이름, 부서명, 직급, 구분(관리자/직 원)
--8. 대리    직급의    직원들    중에서    과장    직급의    최소    급여보다    많이    받는    직원의    사번, 이름, 직급, 급여    조회
--9. 차장    직급의   급여    중    가장    큰    값보다   많이    받는    과장    직급의    사번, 이름, 직급, 급여    조회
--10.퇴사한    여직원과    같은    부서, 같은    직급에    해당하는    사원의    이름, 직급    코드, 부서코드, 입사 일    조회
--11.자기    직급의    평균    급여를    받고    있는    직원의    사번,  이름,  직급    코드,  급여    조회    (단, 급여    평 균은    십   만원    단위로    계산    : TRUNC(컬럼    명, -5))
--12.전    직원   중    급여가    높은    상위    5명의   이름, 급여    조회
--13.전    직원   중    급여가    높은    상위    5명의   이름, 급여    조회

 

 

 

728x90
반응형
728x90

 

JDBC 연결 관련 클래스 5가지

1)Class.forName(”JDBC드라이버명”)

사용할 Database의 JDBC 드라이버 지정하는 역할

2)DriverManager

연결할 계정 정보 지정

3)Connection

데이터베이스에 연결된 실질적인 통로

4) Statement / PreparedStatement

쿼리를 전달하는 역할

5)ResultSet

SELECT문에 대한 결과값을 담고 있는 객체

 

 

package com.kh.model.dao;
import java.sql.Connection;
import java.sql.Date;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;

import com.kh.model.vo.Employee;

public class EmployeeDAO {
	
	
	// 목표 : 전체 사원 정보 조회
	public ArrayList<Employee> selectAll() {
		ArrayList<Employee> list = null;
		Connection conn = null;
		Statement stmt =  null;
		ResultSet rset =  null;
		
		// JDBC 드라이버 등록
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver"); // 오라클 드라이버 풀네임. 버젼마다 약간다름
			conn = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:xe", "SCOTT", "qrwe"); // 디벨로퍼에서 계정등록 시에 세부정보에서 포트번호,SID에 있는걸로 맞추면된다. 19c는 orcl일 것임. 
			
//			System.out.println(conn); // 주소값 반환 oracle.jdbc.driver.T4CConnection@f2a0b8e ← 모든 컴퓨터가 같게 뜬다
			
			String query = "SELECT * FROM EMP"; // SCOTT계정의 테이블정보 쿼리문 적기 // 주의 : 세미콜론 뒤에 안붙인다
			stmt = conn.createStatement();  	// java.sql.statement 임포트
			stmt.executeQuery(query); 			// select문 - executeQuery() - 객체 ResultSet 
			rset = stmt.executeQuery(query); 	// 과정설명 요약 : query에서 작성한 쿼리문을  stmt.executeQuery(query)에서 보내고, ResultSet rset = stmt.executeQuery(query)에서 결과를 반환 받음
			list = new ArrayList<Employee>(); // 순서 지키기 위해 ArrayList 사용
			while(rset.next()) { 	// ResultSet.next() : 다음 행이 존재하면 true반환, 없으면 false반환
				
				int empNo = rset.getInt("EMPNO"); // ResultSet 안에 있는 메소드 getInt() // SCOTT계정 EMP테이블의 empno컬럼 데이터 가져오기
				String empName = rset.getString("ENAME");
				String job = rset.getString("JOB"); 	// 컬렴명 소문자도 괜찮. 괄호 안 대소문자 관계x
				int mgr = rset.getInt("MGR");  
				Date hireDate = rset.getDate("HIREDATE"); 
				int sal = rset.getInt("SAL");
				int comm = rset.getInt("COMM");
				int deptNo = rset.getInt("DEPTNO");		// model.vo로 데이터를 넘기는 코드
				Employee e = new Employee(empNo, empName, job, mgr, sal, comm, deptNo); // empNo~deptNo까지의 데이터를 다 담아서 한 뭉텅이로 만든 코드
				
				list.add(e);  // ArrayList<Employee> list에 Employee e 객체를 담음
				
			}
			System.out.println(list);			// 전체 사원 14명의 전체 정보를 가져옴 
 
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			try {
				rset.close();
				stmt.close(); 
				conn.close(); 
			} catch (SQLException e) {
				e.printStackTrace();
			} 
		}
		
		return list; // view로 데이터를 보내는 코드 
		
		// model.vo로 가서 ArrayList<Employee> list에 값을 받는다고 코드 지정해줄 것
		
	}
	
	
}
728x90
반응형
728x90

메세지

ORA-08002: sequence SEQ_EMPID2.CURRVAL is not yet defined in this session

원인

아직 시퀸스명.NEXTVAL로 시퀸스를 실행시키지 않아서 에러.

해결

NEXTVAL에서 CURRVAL로 최초값을 받아오자.

 

--SEQ_EMPID에 대한 '현재 값' 조회
SELECT SEQ_EMPID.CURRVAL FROM DUAL;
-- ERROR : ORA-08002: sequence SEQ_EMPID2.CURRVAL is not yet defined in this session
-- 원인 : 아직 시퀸스명.NEXTVAL로 시퀸스를 실행시키지 않아서 에러. NEXTVAL에서 CURRVAL로 최초값을 받아오자.
SELECT SEQ_EMPID.NEXTVAL FROM DUAL; -- 300 // 305 // 310 누를 때마다 5씩 값 증가되서 출력됨. 최대치설정이310이라 멈춤
728x90
반응형
728x90

메세지

ORA-00998: must name this expression with a column alias

 

원인

컬럼에 별칭 짓겠다고 하고 안만들어서 난 에러

※별칭 생성해야만 할 때 : 서브쿼리 SELECT절 안에 함수가 포함되면 반드시 별칭 지정

 

728x90
반응형

+ Recent posts