이안의 평일코딩

Oracle 2일차 - SQL WHERE 조건문 본문

Back-end/Oracle

Oracle 2일차 - SQL WHERE 조건문

이안92 2020. 8. 5. 10:50
반응형

2020.08.05(수)

 

DML : 데이터 처리

  = SELECT : 데이터 검색

  = INSERT : 데이터 추가

  = UPDATE : 데이터 수정

  = DELETE : 데이터 삭제

 

 

1) SELECT

  형식)

      SELECT * (전체를 검색) | column1, column2... (원하는 데이터)

      FROM table명(데이터가 저장된 위치) => 파일

      [

         1. WHERE (조건) => 일반 사용자가 요청한 데이터 검색

         2. GROUP BY => 지정된 그룹별로 데이터 처리

            HAVING => 그룹별 조건

         3. ORDER BY => 정렬 ASC(올림차순=Default) / DESC(내림차순)

      ]

 

 WHERE문장을 사용하기 위해서는 반드시 연산자

   오라클 => 연산자 (null과 연산시에는 null값)

   10+null => null

  1) 산술연산자

     +, -, *, /

   => / 는 0으로 나눌 경우에 오류 발생

       / 는 무조건 실수

       자바) 5/2 => 2

     오라클) 5/2 => 2.5

 

  2) 비교연산자

     = : 같다 (==)

     != : 같지않다 (<>, ^=)

     < : 작다

     > : 크다

     <= : 작거나 같다

     >= : 크거나 같다

     =============== 오라클 (문자열, 날짜를 비교할 수 있다)

     자바) 문자열 비교 (equals(), compare())

 

  3) 논리연산자

     자바) &&, ||

     오라클) & => Scanner   || => 문자열 결합

     OR : 둘중에 한개가 true => true

     AND : 두개의 조건이 true => true

 =================================

  4) NULL

        => NULL값일 경우에 처리

             IS NULL

        => NULL값이 아닐 경우에 처리

             IS NOT NULL

  5) IN

        => OR가 여러개 일 경우에 대체하는 연산자

        deptno = 10 OR deptno=20 OR deptno=30

        deptno = IN(10, 20, 30)

  6) BETWEEN ~ AND ==> 페이지

        => 기간, 범위

        => sal >= 100 && sal<=3000

        => sal BETWEEN 100 AND 3000 (100과 3000을 포함하고 있다)

  7) LIKE : 유사문자열 찾기

        => % : 문자열

        => _ : 한개문자

        예) 'A%' => A로 시작하는 모든 문자열 startsWith()

             Aa Aaa Aaaaa

            '%A' => A로 끝나는 모든 문자열 endsWith()

            '%A%' => A를 포함하고 있는 모든 문자열 contains()

            '_A' => 2글자 => A로 끝난 문자열

            '__C__' 글자수를 모를때는 % 글자수 알때는 _ underbar 사용

 

 ================================= 오라클에만 존재하는 연산자

 

 WHERE 컬럼명 연산자 값 => if(조건문)

 이름중에 KING

 WHERE ename = 'KING'

 WHERE ename > 'KING'

 WHERE ename < 'KING' => 값 (대소문자 구분, 반드시 ' '로)

 문자열도 비교해줌

 

-- 산술연산자

SELECT 10+3, 10*3, 10/3, 10-3 FROM DUAL;

SQL> SELECT 10+3, 10*3, 10/3, 10-3 FROM DUAL;

      10+3       10*3       10/3       10-3
---------- ---------- ---------- ----------
        13         30 3.33333333          7

emp (사원정보) => 급여(sal) => 연봉

SELECT ename "이름", sal "급여", sal * 12 "연봉" FROM emp;

 

WHERE 조건(true/false)

WHERE sal * 12

 

산술연산자 : 통계, 합 ==> SELECT 뒤에

나머지 연산자 : 조건 ==> WHERE 뒤에

 

-- 비교연산자 (=)

-- 사원중에 급여가 3000인 사원의 모든 정보 출력 (*)

SQL> SELECT * FROM emp WHERE sal=3000;

     EMPNO ENAME                JOB                       MGR HIREDATE
---------- -------------------- ------------------ ---------- --------
       SAL       COMM     DEPTNO
---------- ---------- ----------
      7788 SCOTT                ANALYST                  7566 82/12/09
      3000                    20

      7902 FORD                 ANALYST                  7566 81/12/03
      3000                    20

 

--사원중에 급여가 1500인 사원의 이름, 입사일, 급여 출력

SQL> SELECT ename, hiredate, sal FROM emp WHERE sal = 1500;

ENAME                HIREDATE        SAL
-------------------- -------- ----------
TURNER               81/09/08       1500

 

--사원중에 이름이 SCOTT인 사원의 이름, 입사일, 직위, 급여 출력 (대소문자 구분함)

SQL> SELECT ename, hiredate, job, sal FROM emp WHERE ename = 'SCOTT';

ENAME                HIREDATE JOB                       SAL
-------------------- -------- ------------------ ----------
SCOTT                82/12/09 ANALYST                  3000

SQL> SELECT ename, hiredate, job, sal FROM emp WHERE ename = 'scott';

no rows selected

 

-- 사원중에 직위(job)가 MANAGER인 사원의 모든 정보 출력

SQL> SELECT * FROM emp WHERE job = 'MANAGER';

     EMPNO ENAME                JOB                       MGR HIREDATE
---------- -------------------- ------------------ ---------- --------
       SAL       COMM     DEPTNO
---------- ---------- ----------
      7566 JONES                MANAGER                  7839 81/04/02
      2975                    20

      7698 BLAKE                MANAGER                  7839 81/05/01
      2850                    30

      7782 CLARK                MANAGER                  7839 81/06/09
      2450                    10

 

-- 입사일이 1982-12-9에 입사한 사원의 이름, 입사일, 급여 출력

SQL> SELECT ename, hiredate, sal FROM emp WHERE hiredate = '1982-12-9';

ENAME                HIREDATE        SAL
-------------------- -------- ----------
SCOTT                82/12/09       3000

SQL> SELECT ename, hiredate, sal FROM emp WHERE hiredate = '1982-12-09';

ENAME                HIREDATE        SAL
-------------------- -------- ----------
SCOTT                82/12/09       3000

SQL> SELECT ename, hiredate, sal FROM emp WHERE hiredate = '82/12/09';

ENAME                HIREDATE        SAL
-------------------- -------- ----------
SCOTT                82/12/09       3000

-- 문자열 (직위, 이름), 날짜 ==> ' '를 사용한다

-- 문자열일 경우에 대소문자를 구분한다

 

-- !=, <>

-- job이 CLERK이 아닌 사원의 이름, 직위 출력 (clerk이 아닌 대문자 CLERK로 해야함! 대소문자 구분)

SQL> SELECT ename, job FROM emp WHERE job != 'clerk';

ENAME                JOB
-------------------- ------------------
SMITH                CLERK
ALLEN                SALESMAN
WARD                 SALESMAN
JONES                MANAGER
MARTIN               SALESMAN
BLAKE                MANAGER
CLARK                MANAGER
SCOTT                ANALYST
KING                 PRESIDENT
TURNER               SALESMAN
ADAMS                CLERK

ENAME                JOB
-------------------- ------------------
JAMES                CLERK
FORD                 ANALYST
MILLER               CLERK

14 rows selected.

SQL> SELECT ename, job FROM emp WHERE job != 'CLERK';

ENAME                JOB
-------------------- ------------------
ALLEN                SALESMAN
WARD                 SALESMAN
JONES                MANAGER
MARTIN               SALESMAN
BLAKE                MANAGER
CLARK                MANAGER
SCOTT                ANALYST
KING                 PRESIDENT
TURNER               SALESMAN
FORD                 ANALYST

10 rows selected.

SQL> SELECT ename, job FROM emp WHERE job <> 'CLERK';

ENAME                JOB
-------------------- ------------------
ALLEN                SALESMAN
WARD                 SALESMAN
JONES                MANAGER
MARTIN               SALESMAN
BLAKE                MANAGER
CLARK                MANAGER
SCOTT                ANALYST
KING                 PRESIDENT
TURNER               SALESMAN
FORD                 ANALYST

10 rows selected.

 

-- < (작다)

-- 사원중에 급여가 1500보다 작은 사원의 이름, 급여 출력

-- WHERE sal<1500

=> SELECT ename, sal FROM emp WHERE sal<1500;

 

-- 입사일이 82/12/09보다 먼저 입사한 사원의 모든 정보 출력

-- WHERE hiredate < '82/12/09'

=> SELECT * FROM emp WHERE hiredate < '82/12/09';

 

-- 논리연산자

   조건 AND 조건

   조건 OR 조건

  AND OR
T T T T
T F F T
F T F T
F F F F

 

-- AND : 범위, 기간이 포함하는 경우 급여가 1500보다 크다 3000이하

=> SELECT * FROM emp WHERE sal>1500 AND(and) sal<3000;

 

-- NULL

-- WHERE comm NULL; IS NULL

-- 성과급이 없는 사원의 모든 정보

SELECT * FROM emp WHERE comm IS NULL;

-- 성과급이 있는 사원의 모든 정보

SELECT * FROM emp WHERE comm IS NOT NULL;

 

--사원중에 사수(mgr)가 없는 사원의 이름, 입사일, 직위 출력

SELECT ename, hiredate, job FROM emp WHERE mgr IS NULL;

 

-- IN

-- 사원중에 부서가 10이거나 20인 사원의 모든 정보 출력

SELECT * FROM emp WHERE deptno=10 OR deptno=20;

SELECT * FROM emp WHERE deptno IN(10, 20);

 

-- 사원중에 직위(job)가 MANAGER이거나 CLERK인 사원의 모든 정보 출력 

SELECT * FROM emp WHERE job IN('MANAGER', 'CLERK');

 

-- 81/06/09 , 81/11/17 , 82/01/23 사원의 모든 정보 출력

SELECT * FROM emp WHERE hiredate IN('81/06/09', '81/11/17', '82/01/23');

 

- 사원중에 부서(dpetno)가 10이거나 20이 아닌 사원의 모든 정보 출력

SELECT * FROM emp WHERE deptno NOT IN(10, 20); (느낌표 쓰면 안되고 NOT을 붙여야함!)

 

-- BETWEEN ~ AND => 기간, 범위 포함

-- BETWEEN 10 AND 100 => 10, 100이 포함 >=10 AND <=100

 

-- 1981에 입사한 모든 사원의 정보

SELECT * FROM emp WHERE hiredate BETWEEN '81/01/01' AND '81/12/31';

 

-- 1981에 입사하지 않은 모든 사원의 정보

SELECT * FROM emp WHERE hiredate NOT BETWEEN '81/01/01' AND '81/12/31';

 

-- ADAMS와 KING 알파벳 순서대로 중간애들 가져옴 (둘 다 포함!)

SQL> SELECT * FROM emp WHERE ename BETWEEN 'ADAMS' AND 'KING';

 

-- 문자, 날짜를 포함해서 처리가 가능

-- LIKE : 포함문자, 시작, 끝, 글자수 찾는 경우 사용

-- 형식) WHERE 컬럼명 LIKE '%A%' => 검색기

-- % => 문자의 갯수를 모르는 경우

-- _ => 한글자

-- 이름중에 A로 시작하는 사원의 모든 정보

SELECT * FROM emp WHERE ename LIKE 'A%';

-- 1982에 입사한 모든 사원의 정보

SELECT * FROM emp WHERE hiredate LIKE '82%';

 

-- 이름중에 S로 끝나는 사원의 모든 정보

SELECT * FROM emp WHERE ename LIKE '%S';

 

-- 이름중에 K를 포함하고 있는 사원의 모든 정보

SELECT * FROM emp WHERE ename LIKE '%K%';

 

-- 주소중에 신촌을 포함하고 있는 모든 주소를 출력

SELECT * FROM zipcode WHERE dong LIKE '%신촌%';

 

-- 글자가 5글자 가운데 O가 있는 사원의 정보출력

SELECT * FROM emp WHERE ename LIKE '__O__';

 

-- 이름이 4글자인 사원의 모든 정보

SELECT * FROM emp WHERE ename LIKE '____';

SELECT * FROM emp WHERE LENGTH(ename)=4;

 

 

 

* 오라클 2일차 교재 정리

1. 40page

원하는 조건만 골라내기 => WHERE

문법) SELECT * | column1, column2..

        FROM table명

        WHERE 컬럼명 연산자 값

    * 찾는 값을 입력시에는

      숫자 => 그대로 표기 WHERE sal=1000

      문자열, 날짜 => 반드시 작은 따옴표를 ' ' 사용한다

      저장된 값 문자 조회시 대소문자 구분

 

null값일때 연산처리가 null이됨. NVL이용 

SQL> SELECT ename, sal, comm, sal+comm FROM emp;

ENAME                       SAL       COMM   SAL+COMM
-------------------- ---------- ---------- ----------
SMITH                       800
ALLEN                      1600        300       1900
WARD                       1250        500       1750
JONES                      2975
MARTIN                     1250       1400       2650
BLAKE                      2850
CLARK                      2450
SCOTT                      3000
KING                       5000
TURNER                     1500
ADAMS                      1100

ENAME                       SAL       COMM   SAL+COMM
-------------------- ---------- ---------- ----------
JAMES                       950
FORD                       3000
MILLER                     1300

14 rows selected.

SQL> SELECT ename, sal, comm, sal+NVL(comm,0) FROM emp;

ENAME                       SAL       COMM SAL+NVL(COMM,0)
-------------------- ---------- ---------- ---------------
SMITH                       800                        800
ALLEN                      1600        300            1900
WARD                       1250        500            1750
JONES                      2975                       2975
MARTIN                     1250       1400            2650
BLAKE                      2850                       2850
CLARK                      2450                       2450
SCOTT                      3000                       3000
KING                       5000                       5000
TURNER                     1500                       1500
ADAMS                      1100                       1100

ENAME                       SAL       COMM SAL+NVL(COMM,0)
-------------------- ---------- ---------- ---------------
JAMES                       950                        950
FORD                       3000                       3000
MILLER                     1300                       1300

14 rows selected.

 

2. 정렬

FROM WHERE ORDER BY

SELECT FROM ORDER BY

** 오라클은 출력순서 => 저장된 순

** ORDER BY를 사용하게 되면 => 지정이 없는 경우 ASC

   ORDER BY 컬럼명 ASC | DESC

                           === 생략이 가능

사원을 출력 => 급여가 올림차순

SELECT ename, sal FROM emp;

 

SELECT ename, sal FROM emp ORDER BY sal ASC;

= SELECT ename, sal FROM emp ORDER BY sal;

= SELECT ename, sal FROM emp ORDER BY 2;

 

SELECT ename, sal FROM emp ORDER BY sal DESC;

 

SELECT ename, sal FROM emp ORDER BY sal DESC, ename DESC;

SELECT ename, sal FROM emp ORDER BY 2 DESC, 1 DESC;

SELECT ename, sal, deptno FROM emp ORDER BY deptno ASC, sal DESC;

 

 

====================================================

우편번호 검색기

 

SQL> DESC zipcode;
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 ZIPCODE                                            VARCHAR2(7)
 SIDO                                               VARCHAR2(20)
 GUGUN                                              VARCHAR2(20)
 DONG                                               VARCHAR2(100)
 BUNJI                                              VARCHAR2(100)

 

ZipcodeVO

package com.sist.dao;

public class ZipcodeVO {
	private String zipcode; // 우편번호
	private String sido;
	private String gugun;
	private String dong;
	private String bunji;
	private String address;
	public String getAddress() {
		return sido+" "+gugun+" "+dong+" "+bunji;
	}
	public void setAddress(String address) {
		this.address = address;
	}
	public String getZipcode() {
		return zipcode;
	}
	public void setZipcode(String zipcode) {
		this.zipcode = zipcode;
	}
	public String getSido() {
		return sido;
	}
	public void setSido(String sido) {
		this.sido = sido;
	}
	public String getGugun() {
		return gugun;
	}
	public void setGugun(String gugun) {
		this.gugun = gugun;
	}
	public String getDong() {
		return dong;
	}
	public void setDong(String dong) {
		this.dong = dong;
	}
	public String getBunji() {
		return bunji;
	}
	public void setBunji(String bunji) {
		this.bunji = bunji;
	}
	
}

 

ZipcodeDAO

package com.sist.dao;
import java.sql.*;
import java.util.*;
public class ZipcodeDAO {
	//연결
	private Connection conn;
	//문장 전송 => SQL
	private PreparedStatement ps;
	//연결 => 오라클 주소
	private final String URL="jdbc:oracle:thin:@localhost:1521:XE";
	
	//드라이버 등록
	public ZipcodeDAO() {
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
		}catch(Exception ex) {
			System.out.println(ex.getMessage());
		}
	}
	//연결
	public void getConnection() {
		try {
			conn=DriverManager.getConnection(URL,"hr","happy");
			//conn hr/happy
		}catch(Exception ex) {}
	}
	//닫기
	public void disConnection() {
		try {
			if(ps!=null) ps.close();
			if(conn!=null) conn.close();
			//exit
		}catch(Exception ex) {}
	}
	//우편번호 찾기
	/*
	 * String a,b,c,d
	 * int e,f
	 * "INSERT INTO member VALUES('"+a+"', '"+b+"', '"+c+"', '"+d+"', "+e+", "+f+")"
	 * "INSERT INTO member VALUES(?,?,?,?,?,?)
	 */
	public ArrayList<ZipcodeVO> postfind(String dong){
		ArrayList<ZipcodeVO> list = new ArrayList<ZipcodeVO>();
		try {
			//연결
			getConnection();
			//SQL문장 전송
			String sql = "SELECT * FROM zipcode "
					+"WHERE dong LIKE '%'||?||'%'";
			ps=conn.prepareStatement(sql);
			ps.setString(1, dong);
			ResultSet rs=ps.executeQuery(); //실행
			while(rs.next()) {
				ZipcodeVO vo = new ZipcodeVO();
				vo.setZipcode(rs.getString(1));
				vo.setSido(rs.getString(2));
				vo.setGugun(rs.getString(3));
				vo.setDong(rs.getString(4));
				vo.setBunji(rs.getString(5));
                list.add(vo); // 위 데이터들을 한곳에 다 모아라
			}
		}catch(Exception ex) {
			System.out.println(ex.getMessage());
		}
		finally {
			disConnection();
		}
		return list;
	}
}

 

PostMain

package com.sist.user;
import com.sist.dao.*;
import java.util.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.table.*;

public class PostMain extends JFrame implements ActionListener{
	JTextField tf;
	JLabel la;
	DefaultTableModel model;
	JTable table;
	public PostMain() {
		tf = new JTextField(15);
		la = new JLabel("입력");
		
		String[] col = {"우편번호","주소"};
		String[][] row = new String[0][2];
		
		model = new DefaultTableModel(row,col);
		table = new JTable(model);
		JScrollPane js = new JScrollPane(table);
		JPanel p = new JPanel();
		p.add(la);
		p.add(tf);
		add("North", p);
		add("Center", js);
		
		setSize(450, 500);
		setVisible(true);
		
		tf.addActionListener(this);
	}
	public static void main(String[] args) {
		new PostMain();
	}
	
	@Override
	public void actionPerformed(ActionEvent e) {
		if(e.getSource()==tf) {
			String dong = tf.getText();
			if(dong.length()<1) { // 입력이 안된 경우
				JOptionPane.showMessageDialog(this,"동/읍/면을 입력 하세요");
				return;
			}
			// 처리
			for(int i=model.getRowCount()-1; i>=0; i--) {
				model.removeRow(i);
			}
			ZipcodeDAO dao = new ZipcodeDAO();
			ArrayList<ZipcodeVO> list = dao.postfind(dong);
			
			// 출력
			for(ZipcodeVO vo: list) {
				String[] data= {
						vo.getZipcode(),
						vo.getAddress()
				};
				model.addRow(data);
			}
		}
		
	}
}
반응형
Comments