일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 자바의정석
- Oracle
- 국비코딩
- spring
- typescript
- 타입스크립트
- 정보처리기사정리
- CSS
- react
- 정보처리기사실기
- php
- 코딩테스트
- VUE
- 스프링
- Java의정석
- javascript
- 리액트
- 자바스크립트
- 자스코테
- 리액트네이티브
- 정보처리기사실기요약
- ReactNative
- 정보처리기사요약
- 이안의평일코딩
- 자바스크립트 코딩테스트
- 오라클
- 평일코딩
- 국비IT
- 정보처리기사실기정리
- 정보처리기사
- Today
- Total
이안의 평일코딩
Oracle 2일차 - SQL WHERE 조건문 본문
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);
}
}
}
}
'Back-end > Oracle' 카테고리의 다른 글
Oracle 5일차 - SQL 복수행함수 (0) | 2020.08.10 |
---|---|
Oracle 4일차 - SQL 단일행함수2 / 지니뮤직 (0) | 2020.08.07 |
Oracle 3일차 - SQL 단일행함수 (0) | 2020.08.06 |
Oracle 1일차 - SQL SELECT (2) | 2020.08.04 |
Oracle - 데이터 베이스 연결 (0) | 2020.08.03 |