Data Scientist 옌

매일 발전하는 IT문제해결사

국비지원교육 (22.01-22.07)/강의노트

22-03-08(화) 028일차 [Oracle] WHERE절, IN, BETWEEN A AND B, 산술연산자

옌炎 2022. 5. 10. 22:11
728x90

수업내용


1교시 (09:30-10:20)

  • 지난 시간 복습
-- 문자 : 싱글쿼테이션 : '문자열'
SELECT '문자열' FROM DUAL;

-- 숫자 : 숫자 또는 '숫자'(문자숫자)
SELECT 11, '11' FROM DUAL;

-- null 처리하는 함수 : NVL(NULL, 치환하고싶은 데이터)
SELECT NVL(NULL, 0) FROM DUAL;

-- 날짜 처리하는 함수 : 
-- TO_DATE() : 날짜 모양을 한 문자열을 날짜 데이터 형식으로 변환한다. 
SELECT '90/12/01' FROM DUAL;
SELECT TO_DATE('90/12/01') FROM DUAL;

-- TO_CHAR(첫번째 매개변수, 두번째 매개변수) : SimpleDateFormat
-- 첫번째 매개변수 : DATE 타입이어야 한다.
-- 두번째 매개변수 : 날짜 형식 :  YYYY-MM-DD, YYYY/MM/DD, YYYY.MM.DD
SELECT TO_CHAR(TO_DATE('90/12/01'), 'YYYY-MM-DD') FROM DUAL;

-- 날짜 처리하는 데이터타입 : 
-- 현재 날짜 : SYSDATE, SYSTIMESTAMP
SELECT TO_CHAR(TO_DATE(SYSDATE), 'YYYY-MM-DD') FROM DUAL;

2교시 (10:30-11:20)

  • 지난 시간 복습
-- 데이터 아이체킹
-- NULL CHECK
SELECT COMM FROM EMP WHERE COMM IS NULL;
SELECT COMM FROM EMP WHERE COMM IS NOT NULL;
-- 데이터타입 DATE 컬럼의 날짜 형식 
-- 숫자
-- 문자

-- DESC : 테이블 구조 : 컬럼명, 데이터 타입,  사이즈, NULL 여부
DESC EMP;

-- DISTINCT
SELECT DISTINCT EMPNO, DEPTNO FROM EMP;
SELECT DISTINCT DEPTNO, EMPNO FROM EMP;
SELECT DISTINCT DEPTNO FROM EMP;

-- ROWNUM()
SELECT * FROM EMP WHERE ROWNUM <= 10;

3교시 (11:30-12:20)

  • WHERE절
-- WHERE 절 
/*
SELECT
    SELECT 절 : SELECT * FROM DUAL;    
FROM 
    FROM 절 :  SELECT * FROM DUAL;
WHERE 
    WHERE 절 : SELECT * FROM DUAL;
    WHERE 절은 항상 TRUE 일 때만 수행한다.
    1=1 : 개발할 때만 사용한다.
    1=1 : 보안취약 점검 대상이다. 운영(계) REAL SERVER 에서는 사용금지이다.
    
연산자 및 서브쿼리를 사용할 수 있다.
AND, OR, IN, FROM ~ TO 연산, <, >, <=, >= ..... 
*/

SELECT * FROM EMP WHERE 1=1;
SELECT * FROM EMP WHERE 1=2;

/*
조건이 여러개인 쿼리를 만들 때는 
항상 조건 하나씩 쿼리를 만들어서 눈으로 확인한다.
확인이 되면 
쿼리문을 조합한다.

<-- 단문 쿼리로 확인해
<-- 복문 쿼리리 바로 쓰지말고 단문 쿼리로 확인하고 해 
*/

-- 부서번호 10 직책 MANAGER 
SELECT * FROM EMP WHERE DEPTNO = 10;
SELECT * FROM EMP WHERE JOB = 'MANAGER';

SELECT * FROM EMP WHERE DEPTNO = 10 AND JOB = 'MANAGER';

SELECT * FROM EMP 
WHERE 1=1
AND   DEPTNO = 10 
AND   JOB = 'MANAGER';

4교시 (12:30-13:20)

  • IN, BETWEEN A AND B
SELECT * FROM EMP 
WHERE 1=1
AND   DEPTNO = 10 
AND   JOB = 'MANAGER';

SELECT * FROM EMP 
WHERE 1=2
AND   DEPTNO = 10 
AND   JOB = 'MANAGER';

-- 부서번호 10 직책 MANAGER 
SELECT * FROM EMP WHERE DEPTNO = 10;
SELECT * FROM EMP WHERE JOB = 'MANAGER';

SELECT * FROM EMP WHERE DEPTNO = 10 OR JOB = 'MANAGER';

SELECT * FROM EMP 
WHERE 1=1
OR    DEPTNO = 10 
OR    JOB = 'MANAGER';

SELECT * FROM EMP 
WHERE 1=2
OR   DEPTNO = 10 
OR   JOB = 'MANAGER';

-- 부서번호 10 20 사원
SELECT * FROM EMP WHERE DEPTNO = 10;
SELECT COUNT(*) FROM EMP WHERE DEPTNO = 10;
SELECT * FROM EMP WHERE DEPTNO = 20;
SELECT COUNT(*) FROM EMP WHERE DEPTNO = 20;

SELECT * FROM EMP WHERE DEPTNO = 10 OR DEPTNO = 20;
SELECT COUNT(*) FROM EMP WHERE DEPTNO = 10 OR DEPTNO = 20;

-- IN() : 같은 컬럼에 여러개의 값을 조회 할 때 
SELECT COUNT(*) FROM EMP WHERE DEPTNO = 10 OR DEPTNO = 20;

-- 커미션이 300, 500, 1400 사원
SELECT * FROM EMP WHERE COMM IN (300, 500, 1400);
SELECT * FROM EMP WHERE COMM = 300 OR COMM = 500 OR COMM = 1400;

SELECT * FROM EMP WHERE COMM NOT IN (300, 500, 1400);

-- 10번 부서인 사원들 출력 
SELECT * FROM EMP WHERE DEPTNO = 10;

-- 10번 부서가 아닌 사원들 출력 
SELECT * FROM EMP WHERE NOT DEPTNO = 10;
SELECT * FROM EMP WHERE DEPTNO <> 10;
SELECT * FROM EMP WHERE DEPTNO != 10;
SELECT * FROM EMP WHERE DEPTNO ^= 10;

-- 급여 1000에서 1500 사이인 사원을 조회 하시오 
SELECT * FROM EMP WHERE SAL >= 1000;
SELECT * FROM EMP WHERE SAL <= 1500;

-- FROM ~ TO 구간 검색 
SELECT * FROM EMP 
WHERE SAL >= 1000
AND   SAL <= 1500;

SELECT  A.* 
FROM    EMP A
WHERE   1=1
AND     A.SAL <= 1500
AND     A.SAL >= 1000;

-- 급여가 1000 미만 이거나 1500 초과인 사원을 조회 

SELECT * FROM EMP A
WHERE 1=1
AND (SAL < 1000
OR SAL > 1500);

-- FROM ~ TO : 구간 검색 
-- BETWEEN A AND B
-- 특정 컬럼의 데이터 값이 하한값(A) 와 상한값(B) 사이에 포함된 로우를 반환한다.
SELECT * FROM EMP
WHERE  1=1
AND    SAL BETWEEN 1000 AND 1500;

SELECT * FROM EMP
WHERE 1=1
AND SAL >= 1000
AND SAL <= 1500;

-- 1981년에 입사한 사원을 조회하시오, 검색하시오, 출력하시오 
-- 19810101 ~ 19811231
-- 구간검색, BETWEEN A AND B
-- 81/02/20 자바처럼 문자열 쪼갤수 있나 ??  
-- 테이블 앨리어스
SELECT HIREDATE FROM EMP WHERE ROWNUM <= 5;

SELECT A.* FROM SCOTT.EMP A
WHERE  1=1
AND    A.HIREDATE BETWEEN '1981/01/01' AND '1981/12/31';

SELECT A.* FROM SCOTT.EMP A
WHERE  1=1
AND    A.HIREDATE <= '1981/12/31'
AND    A.HIREDATE >= '1981/01/01'; 

SELECT A.* FROM SCOTT.EMP A
WHERE  1=1
AND    A.HIREDATE <= TO_CHAR(TO_DATE('1981/12/31'), 'YYYYMMDD')
AND    A.HIREDATE >= TO_CHAR(TO_DATE('1981/01/01'), 'YYYYMMDD'); 

--##################################################################
SELECT A.* FROM SCOTT.EMP A
WHERE  1=1
AND    TO_CHAR(TO_DATE(A.HIREDATE), 'YYYYMMDD') <= TO_CHAR(TO_DATE('1981/12/31'), 'YYYYMMDD')
AND    TO_CHAR(TO_DATE(A.HIREDATE), 'YYYYMMDD') >= TO_CHAR(TO_DATE('1981/01/01'), 'YYYYMMDD'); 
--##################################################################

--##################################################################
SELECT A.* FROM SCOTT.EMP A
WHERE  1=1       
AND    TO_CHAR(TO_DATE(A.HIREDATE), 'YYYY') = '1981';

SELECT SUBSTR('81/02/20', 1, 2) FROM DUAL;

SELECT A.HIREDATE FROM SCOTT.EMP A
WHERE  1=1       
AND   SUBSTR(A.HIREDATE, 1, 2) = '81';

SELECT SUBSTR(A.HIREDATE, 1, 2) AS HIREDATE FROM SCOTT.EMP A
WHERE  1=1       
AND   SUBSTR(A.HIREDATE, 1, 2) = '81';
--##################################################################

5교시 (14:30-15:20)

  • 산술연산자
-- 스택 STACK, 큐 QUEUE

-- SUBSTR(문자열, 시작위치, 길이)
SELECT SUBSTR('SMITH', 1, 2) FROM DUAL;
SELECT SUBSTR('SMITH', 1) FROM DUAL;
SELECT SUBSTR('SMITH', -1, 2) FROM DUAL;
SELECT SUBSTR('SMITH', -1) FROM DUAL;
SELECT SUBSTR('SMITH', -3, 2) FROM DUAL;
SELECT SUBSTR('SMITH', -3) FROM DUAL;

SELECT NVL(NULL, 0) FROM DUAL;
SELECT NVL(NULL, 'A') FROM DUAL;
SELECT NVL(NULL, 'AB') FROM DUAL;

--############################################
SELECT NULL FROM DUAL;
SELECT NULL + 1 FROM DUAL;
SELECT NVL(NULL, 0) + 1 FROM DUAL;
--############################################

SELECT SAL, COMM FROM EMP;

--########################
SELECT SAL 
FROM EMP;

SELECT COMM
FROM EMP; 

SELECT COMM, SAL
FROM EMP;
--########################

SELECT COMM FROM EMP;
SELECT COMM FROM EMP WHERE COMM > 0;
SELECT NVL(COMM, 0) AS COMM FROM EMP WHERE COMM > 0;

-- 산술 연산자 + - * /
-- 사원의 급여와 연봉을 출력하시오 
SELECT 1 + 2 FROM DUAL;
SELECT 1 * 2 FROM DUAL;
SELECT 1 * 12 FROM EMP;

SELECT SAL, SAL * 12 AS TSAL FROM EMP;

SELECT DEPTNO * 100, DNAME, LOC  FROM DEPT;

-- 사원의 급여와 연봉, 수당을 출력하시오 
SELECT SAL, (SAL * 12) AS TSAL, COMM FROM EMP;

SELECT 'M' || TO_CHAR(SYSDATE, 'YYYYMMDD') || '0001' FROM DUAL;

-- 사원의 급여와 연봉, 수당, 수당을 포함한 연봉 을 출력하시오 
SELECT SAL, (SAL * 12) AS TSAL, COMM, (SAL*12)+COMM AS CSAL FROM EMP;
-- 컬럼을 조회 할 때는 NULL 여부를 꼭 체크해야 하고
-- 숫자 관련 데이터는 NULL 이면 디폴트 값으로 치환해 놓아야 한다. 
-- 문자열 관련 데이터는 NULL 이면 정해진 값으로 치환해 놓아야 한다. 
SELECT 
        A.SAL                       AS SAL   -- 급여
       ,A.SAL * 12                  AS TSAL  -- 연봉
       ,NVL(A.COMM, 0)              AS COMM  -- 수당 
       ,A. SAL * 12 + NVL(COMM, 0)  AS CSAL  -- 수당을포함한 연봉
FROM 
        EMP A
ORDER BY TSAL DESC;     

SELECT 
        A.SAL                       
       ,A.SAL * 12                  
       ,NVL(A.COMM, 0)              
       ,A. SAL * 12 + NVL(COMM, 0)  
FROM 
        EMP A
ORDER BY 3 DESC; 


-- 모든사원에게 급여를 300원을 인상해준다.
-- 사원이름 , 급여, 인상된 급여(연봉)를 출력하시오 
SELECT 
        A.ENAME             AS ENAME
       ,A.SAL               AS SAL
       ,A.SAL * 12 + 300    AS GSAL
FROM    EMP A;

-- 10번 부서의 사원들에게 수당을 300원씩 일괄 지급하시오 
-- 사원이름, 수당을 출력하시오 

SELECT   A.ENAME                    AS ENAME
        ,NVL(A.COMM,0) +300         AS COMM
FROM
         EMP A
WHERE
         A.DEPTNO = 10;
        
-- 1981년 9월 입사자, 수당 500 지급 
-- 사원번호, 사원이름, 직책, 입사일(YYYY-MM-DD), 수당을 출력하시오 
SELECT 
        A.EMPNO                             AS EMPNO
       ,A.ENAME                             AS ENAME
       ,A.JOB                               AS JOB
       ,TO_CHAR(A.HIREDATE, 'YYYY-MM-DD')   AS HIREDATE
       ,NVL(A.COMM, 0) + 500                AS COMM
FROM    EMP A
WHERE   1=1
AND     TO_CHAR(A.HIREDATE, 'YYYYMM') = '198109';

SELECT 
        A.EMPNO                             AS EMPNO
       ,A.ENAME                             AS ENAME
       ,A.JOB                               AS JOB
       ,TO_CHAR(A.HIREDATE, 'YYYY-MM-DD')   AS HIREDATE
       ,NVL(A.COMM, 0) + 500                AS COMM
FROM    EMP A
WHERE   1=1
AND     TO_CHAR(TO_DATE(A.HIREDATE), 'YYYYMMDD') <= TO_CHAR(TO_DATE('1981/09/31'), 'YYYYMMDD')
AND     TO_CHAR(TO_DATE(A.HIREDATE), 'YYYYMMDD') >= TO_CHAR(TO_DATE('1981/09/01'), 'YYYYMMDD');

6교시 (15:30-16:20)

  • 문제풀이
-- 반장님
SELECT 
        --A.*  
         A.ENAME
        ,A.JOB
        ,TO_CHAR(TO_DATE(A.HIREDATE,'YYYY.MM.DD'))
        ,NVL(A.SAL,0)
        ,NVL(A.SAL,0) * 12
        ,NVL(A.COMM,0)
FROM 
        EMP A
WHERE   1 = 1
AND     TO_CHAR(TO_DATE(A.HIREDATE),'YYYY-MM-DD') >= TO_CHAR(TO_DATE('1981-02-20'),'YYYY-MM-DD')
AND     TO_CHAR(TO_DATE(A.HIREDATE),'YYYY-MM-DD') <= TO_CHAR(TO_DATE('1981-05-01'),'YYYY-MM-DD')
ORDER BY 5 DESC;

7교시 (16:30-17:20)

  • OracleTest_3
package a.b.c.oracle;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;

public class OracleTest_3 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
			Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orclKSY00", "scott", "tiger");
			
//			Statement stmt = conn.createStatement();
//			// 시작점
//			ResultSet rsRs = stmt.executeQuery("SELECT * FROM EMP ORDER BY 1 DEESC");
			
			PreparedStatement stmt = conn.prepareStatement("SELECT * FROM EMP ORDER BY 1 DESC");
			// 시작점
			ResultSet rsRs = stmt.executeQuery();
			
			while (rsRs.next()) {
				System.out.print(rsRs.getString(1) + " : ");
				System.out.print(rsRs.getString(2) + " : ");
				System.out.print(rsRs.getString(3) + " : ");
				System.out.print(rsRs.getString(4) + " : ");
				System.out.print(rsRs.getString(5) + " : ");
				System.out.print(rsRs.getString(6) + " : ");
				System.out.print(rsRs.getString(7) + " : ");
				System.out.println(rsRs.getString(8));
			}
			
		} catch (Exception e) {
			System.out.println(e);
		}
	}
}

8교시 (17:30-18:30)

  • OracleTest_4
package a.b.c.oracle;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Scanner;

public class OracleTest_4 {

	// DataSource 정보 : 데이터베이스 연결 정보
	public static final String JDBC_DRIVER = "oracle.jdbc.driver.OracleDriver";
	public static final String JDBC_URL = "jdbc:oracle:thin:@localhost:1521:orclKSY00";
	public static final String JDBC_USER = "scott";
	public static final String JDBC_PASSWORD = "tiger";
	
	// sql Query
//	public static String sqlQuery = "SELECT EMPNO, ENAME, JOB, MGR FROM EMP WHERE EMPNO = 7369 AND ENAME = ?";
//	? :  플레이스 홀더 place holer 
//  setString(1, 7369);
//  setString(2, 'ALLEN');
	public static String sqlQuery = "SELECT EMPNO, ENAME, JOB, MGR FROM EMP WHERE EMPNO = ? ";
	
	// 생성자 
	public OracleTest_4() {

		try {
			Class.forName(JDBC_DRIVER);
		}catch(Exception e) {
			System.out.println("JDBC 드라이버를 찾지 못했어요 >>> : " + e.getMessage());
		}
	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		System.out.println("검색할 사번을 입력하세요 >>> : ");
		Scanner sc = new Scanner(System.in);
		String empno = sc.next();
		System.out.println("검색할 사번은 >>> : " + empno);
		
		try {
			
			Connection conn = DriverManager.getConnection(JDBC_URL, JDBC_USER, JDBC_PASSWORD);
			
			PreparedStatement pstmt = conn.prepareStatement(sqlQuery);
			// WHERE EMPNO = ? <--- empno 7369
			pstmt.setNString(1,  empno);
			
			// stmt.executeQuery("쿼리문"); 시작점
			ResultSet rsRs = pstmt.executeQuery();
			
			if (rsRs != null) {
				while (rsRs.next()) {
					System.out.print(rsRs.getString("EMPNO") + " : ");
					System.out.print(rsRs.getString("ENAME") + " : ");
					System.out.print(rsRs.getString("JOB") + " : ");			
					System.out.println(rsRs.getString("MGR"));
				}
			}
			
		} catch (Exception e) {
			System.out.println(e);
		}
		
		sc.close();
	}
}
  • OracleTest_5
package a.b.c.oracle;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Scanner;

import a.b.c.oracle.vo.EmpVO;

public class OracleTest_5 {

	// DataSource 정보 : 데이터베이스 연결 정보
	public static final String JDBC_DRIVER = "oracle.jdbc.driver.OracleDriver";
	public static final String JDBC_URL = "jdbc:oracle:thin:@localhost:1521:orclKSY00";
	public static final String JDBC_USER = "scott";
	public static final String JDBC_PASSWORD = "tiger";
		
	// sql Query 
	// EMPNO = ? 		:: place holder ? 1번 <-- pstmt.setString(1,  empno);
	// ENAME = UPPER(?) :: place holder ? 2번 <-- pstmt.setString(2,  ename);
	public static String sqlQuery = "SELECT EMPNO, ENAME, JOB, MGR FROM EMP WHERE EMPNO = ? AND ENAME = UPPER(?)";	
		
	// 생성자 
	public OracleTest_5() {

		try {
			Class.forName(JDBC_DRIVER);
		}catch(Exception e) {
			System.out.println("JDBC 드라이버를 찾지 못했어요 >>> : " + e.getMessage());
		}
	}
	
	public ArrayList<EmpVO> empSelect(String empno, String ename) {
		
		ArrayList<EmpVO> aList = null;
		
		try {
			
			Connection conn = DriverManager.getConnection(JDBC_URL, JDBC_USER, JDBC_PASSWORD);			
			
			PreparedStatement pstmt = conn.prepareStatement(sqlQuery);	
			System.out.println("쿼리 \n"+ sqlQuery);
			pstmt.setString(1,  empno); // place holder ? 1번
			pstmt.setString(2,  ename); // place holder ? 2번
			
			ResultSet rsRs = pstmt.executeQuery();
			
			if (rsRs !=null) {
				aList = new ArrayList<EmpVO>();
				
				while (rsRs.next()) {
					
					EmpVO evo = new EmpVO();
					
					evo.setEmpno(rsRs.getString("EMPNO"));
					evo.setEname(rsRs.getString("ENAME"));
					evo.setJob(rsRs.getString("JOB"));
					evo.setMgr(rsRs.getString("MGR"));
					
					aList.add(evo);
				}
			}	
		} catch (Exception e) {
			System.out.println(e);
		}
		
		return aList;
	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub

OracleTest_5 ot5 = new OracleTest_5();
		
		System.out.println("검색할 사원의 사번 과 이름을 입력하시오 >>> : ");
		Scanner sc = new Scanner(System.in);
		String empno = sc.next();
		System.out.println("검색할 사원의 사번 >>> : " + empno);
		String ename = sc.next();
		System.out.println("검색할 사원의 이름 >>> : " + ename);
		
		ArrayList<EmpVO> aList = ot5.empSelect(empno, ename);
		
		if (aList !=null && aList.size() > 0) {
			
			for (int i=0; i < aList.size(); i++) {
				EmpVO _evo = aList.get(i);
				System.out.print(_evo.getEmpno() + " : ");
				System.out.print(_evo.getEname() + " : ");
				System.out.print(_evo.getJob() + " : ");			
				System.out.println(_evo.getMgr());
			}
		}
		
		sc.close();
	}
}

 


Notes


728x90