관리 메뉴

개발 노트

3/29 4주차 본문

학부 공부 : 21.03.02~06.20/데이터베이스 이론 및 실습

3/29 4주차

hayoung.dev 2021. 3. 29. 11:03

[ sql developer로 table 다루기]

 

1. @안쓰고 start 해도 실행 됨

start \oraclexe\demobld.sql

 

 

2. 모든 table 가져와라

select * from tab;
DESC EMP;

 

 

3. EMP의 모든 테이블 가져와라

SELECT * FROM EMP;

 

 

4. 행 삽입 (날짜 형식이 이게 맞음)

INSERT INTO EMP VALUES (7370, 'SMITH', 'CLERK', 7902, to_date('80-12-17'), 800, NULL, 20);

 

 

5. 삽입한 행 7370 보여줘라

SELECT * FROM EMP WHERE empno=7370;

 

 6. 행 7371 넣고 보여주기

INSERT INTO EMP(empno, ename, job, deptno) VALUES (7371, 'SMITH', 'CLERK', 20);
SELECT * FROM EMP WHERE empno=7371;

 

 

7. DROP은 테이블 삭제

DROP TABLE EMP;
DROP TABLE DEPT;

 

 

8. 2주차 demobld.sql 코드 파일 내용 중

set termout off		#터미널 출력 off

#테이블 삭제
DROP TABLE EMP;
DROP TABLE DEPT;
DROP TABLE BONUS;
DROP TABLE SALGRADE;
COMMIT;		#커밋 반영

SET TERMOUT ON		#글자 출력
PROMPT Demonstration table build is complete.

EXIT		#터미널창 빠져나감

 

 

 

9.  화면 사이즈를 1000으로 조절

SET LINESIZE 1000;

 

 

10. SELECT해서 일부분(empno, ename)만 가져와라

SELECT empno, ename from EMP;

 

 

11. select문으로 연산 가능

SELECT ENAME, SAL/12 FROM EMP; #sal 열에서 x12로 연봉을 계산하여 보여줌

SELECT ENAME, SAL/30 FROM EMP; #sal 열에서 /30으로 하루에 얼마를 버는 지 보여줌

 

 

12. where 사용 시에는 조건이 중요함. 

SELECT EMPNO, ENAME FROM EMP WHERE DEPTNO=20;	#부서 번호가 20번인 EMPNO, ENAME 가져오기

 

13.

SELECT EMPNO, ENAME FROM EMP WHERE ENAME like '%LA';	#LA로 끝나는 것 select
SELECT EMPNO, ENAME FROM EMP WHERE ENAME like 'LA%';	#LA로 시작하는 것 select
SELECT EMPNO, ENAME FROM EMP WHERE ENAME like '%LA%';	#LA가 들어가는 것 select

세번째 줄 실행 결과

 

14. 7371인 행 삭제

DELETE FROM EMP WHERE EMPNO=7371;
SELECT * FROM EMP;

 

 

15. 급여 2000 이상인 사람 확인

SELECT EMPNO, ENAME, SAL, MGR FROM EMP WHERE SAL > 2000;

16. 급여가 2000보다 크면 지움

DELETE FROM EMP WHERE SAL > 2000;

 

 

17. EMPNO이 7369인 데이터 가져옴

SELECT EMPNO, JOB FROM EMP WHERE EMPNO=7369;

 

18. EMPNO이 7369인 행의 JOB을 SALESMAN으로 바꿔라  **외우기!!

UPDATE EMP SET JOB='SALESMAN' WHERE EMPNO=7369;	

 

 

19. 급여 10% 인상하기

SELECT SAL FROM EMP;
UPDATE EMP SET SAL=SAL*1.1

기존값

코드 실행 후 값 (10%증가하였음)

 

20. 테이블 사이즈를 20으로 바꾸기 (alter는 테이블 속성)

ALTER TABLE EMP MODIFY ename VARCHAR2(20);

기존 테이블

 

코드 실행 후 속성이 변경된 테이블

 

(직접 메뉴에서 테이블을 편집할 수도 있음)

하지만 sql developer를 사용 못 하는 환경이 있을 수도 있음. 그럴 땐 쿼리 사용 필요.

 

 

 

 

21. emp테이블에 password 열을 넣고 싶을 때 (자리수는 20)

ALTER TABLE EMP ADD password VARCHAR2(20);

결과

22. column password 지우기

ALTER TABLE EMP DROP COLUMN password;

결과값 : password column이 사라짐

 

 

23. 컬럼 이름 바꾸기

ALTER TABLE 테이블명 RENAME COLUMN 원래컬럼명 TO 바꿀컬럼명
ALTER TABLE EMP RENAME COLUMN ename TO empname;

결과 : 두번째 줄 이름 바뀜

 

24. 사원번호에 자동으로 증가하는 시퀀스 만들기 

*교재 11장 연습문제에 시퀀스에 대한 내용 나와있음

CREATE SEQUENCE empno_seq;

위처럼 아무런 말이 없으면 하단처럼 1부터 시작하여 1씩 증가하는 게 기본값임

CREATE SEQUENCE empno_seq INCREMENT BY 1 START WITH 1;

 

 

ESEQ_ID라는 이름의 시퀀스 만들기

CREATE SEQUENCE ESEQ_ID INCREMENT BY 10 START WITH 100;

결과 : increment_by를 보면 둘째 줄은 1씩 증가셋째 줄은 10씩 증가를 알 수 있음

SELECT * FROM user_sequences;

 

 

25. 시퀀스도 삭제 가능

DROP SEQUENCE ESEQ_ID;
SELECT * FROM user_sequences;

 

26. 7371이 없는 것을 확인한 후, 숫자에 신경 안쓰고 nextval을 통해 다음 값으로 자동으로 설정함

SELECT * FROM EMP WHERE empno=7371;
INSERT INTO EMP(empno, ename, job, deptno) VALUES (empno_seq.NEXTVAL, 'SMITH', 'CLERK', 20);

 

결과값 1,2,3으로 들어간 것 확인 가능

 

empno에 증가는 1씩, 시작은 8000부터 자동으로 넣기

DROP SEQUENCE empno_seq;
CREATE SEQUENCE empno_seq INCREMENT BY 1 START WITH 8000;

 

위의 4줄 전부 실행하면 다음과 같이 empno가 8000부터 만들어진 것 확인 가능

 

 

27. empno 순서대로 보기

SELECT * FROM EMP;
SELECT * FROM EMP ORDER BY empno;

 

SELECT * FROM EMP ORDER BY empno ASC;
SELECT * FROM EMP ORDER BY empno DESC;

오름차순 asc(아무것도 안 써도 오름차순)

desc는 내림차순

 

empno 내림차순 결과

 

28. enpno는 내림차순, ename은 오름차순

SELECT empno, ename, sal FROM EMP ORDER BY empno DESC, sal ASC;

29. 날짜 직접 입력 대신 오늘의 날짜 자동으로 입력하기

hiredate는 저장된 날짜 값 가져오기

sysdate는 오늘 날짜 입력하기

SELECT sysdate from DUAL;
INSERT INTO EMP VALUES (empno_seq.NEXTVAL, 'SMITH', 'CLERK', 7902, SYSDATE,  800, NULL, 20);
SELECT empno, ename, sal, hiredate FROM EMP ORDER BY empno DESC, sal ASC;

 

30. 날짜 년도를 4자리로 가져오기

SELECT hiredate FROM EMP;
SELECT TO_CHAR(hiredate, 'YYYY-MM-DD') FROM EMP;

 

31. empno 7499 comm의 수를 1 증가시킨다.

UPDATE Emp SET COMM=COMM+1 WHERE empno=7499;
SELECT * FROM EMP  WHERE empno=7499;

실행 전

실행 후

 

32.  mgr 7698이고 sal 1375인 경우 출력

SELECT * FROM EMP WHERE mgr=7698 and sal=1375;

결과

33.  like는 검색 기능

SELECT * FROM EMP WHERE ename like '%LA%';

 

34. 집계함수 : 20번 부서 사원이 몇 명인가

SELECT count(*) FROM EMP where deptno=20;

결과

 

35. 집계함수 : 20번 부서 사원의 급여 합계

SELECT sum(sal) FROM EMP where deptno=20;

 

 

36.  부서를 group으로 잡기

SELECT deptno, count(*) FROM EMP GROUP BY deptno;

결과 : 30부서가 7, 10부서가 2, 20 부서가 16명 있다.

 

 

37. 36번에서 group으로 잡은 부서 중 급여의 최고값, 최저값, 평균값 구하기

SELECT max(sal), min(sal), avg(sal) FROM EMP;

결과

 

38. emp의 depno와 dept의 depno가 같은 것 가져오기

SELECT emp.*, dept.* from emp, dept where emp.deptno=dept.deptno;

SELECT e.*, d.* from emp e, dept d where e.deptno=d.deptno;		#이름을 e와 d로 줄여 표현

SELECT e.empno, e.ename, e.job, e.mgr, e.hiredate, e.sal, e.comm, d.dname, d.loc from emp e, dept d where e.deptno=d.deptno;
#필요한 항목만 표현

SELECT empno, ename, job, mgr, hiredate, sal, comm, dname, loc from emp e, dept d where e.deptno=d.deptno;
#e.과 d.을 생략하여 표현

 

39. deptno로 그룹을 잡았을 때 가장 큰 개수

부서 중 가장 많은 수가 몇 명인가.

SELECT max(count(*)) FROM EMP GROUP BY deptno;

출력결과 16임.

40. 어느 부서가 (16으로) 가장 많은가

 

SELECT deptno FROM EMP WHERE rownum=1 GROUP BY deptno  ORDER BY count(*) DESC;

 

41. 서브쿼리(Select안에 Select가 있는 구조)

E.deptno와 D.deptno가 같고

E.DEPTNO(부서번호)가 20인 ({}괄호 안의 SELECT deptno FROM EMP B WHERE rownum=1 GROUP BY B.deptno의 결과값이 20임)

E.ENAME, E.SAL, D.dname, D.loc을 출력해라

SELECT  E.ENAME, E.SAL, D.dname, D.loc FROM  EMP E, Dept D
   WHERE  E.deptno=D.deptno and E.DEPTNO = (
   	SELECT deptno FROM EMP B WHERE rownum=1 GROUP BY B.deptno
    );

결과

 

 

[Java, Emp, Dept 응용 오브젝트 배열과 Vector 클래스]

 

1. Eclipse 접속 후 Project 생성

 

2. src 우클릭 > new > class

 

3. Emp class 생성

 

4. 우클릭 후 Source . Generate Constructor using Fields > OK

실행 시 생성자 코드가 자동으로 생성 됨

public class Emp {
	int empno;
	String empname;
	int deptno;
	public Emp(int empno, String empname, int deptno) {
		super();
		this.empno = empno;
		this.empname = empname;
		this.deptno = deptno;
	}

}

 

5. 우클릭 > Source > Generate toString

하단 소스코드 생성 됨

@Override
	public String toString() {
		return "Emp [empno=" + empno + ", empname=" + empname + ", deptno=" + deptno + "]";
	}

 

6. Source > Generate Getters and Setters > select all 생성

public int getEmpno() {
		return empno;
	}

	public void setEmpno(int empno) {
		this.empno = empno;
	}

	public String getEmpname() {
		return empname;
	}

	public void setEmpname(String empname) {
		this.empname = empname;
	}

	public int getDeptno() {
		return deptno;
	}

	public void setDeptno(int deptno) {
		this.deptno = deptno;
	}

 

 

7. src > new > class > 클래스명 Dept 생성 후 4, 5, 6번 반복

 

8. default package 우클릭 > New > Class

 

9. class 이름 설정

*Emp.java와 Dept.java는 실행하는 것이 아닌 가져다 씀.

 

9. 위와 같이 EmpDept 생성

public class EmpDept {
	int deptno;
	int empcnt;
	
	public EmpDept(int deptno, int empcnt) {
		super();
		this.deptno = deptno;
		this.empcnt = empcnt;
	}

	public String toString() {
		return "EmpDept [deptno=" + deptno + ", empcnt=" + empcnt + "]";
	}

	public int getDeptno() {
		return deptno;
	}

	public void setDeptno(int deptno) {
		this.deptno = deptno;
	}

	public int getEmpcnt() {
		return empcnt;
	}

	public void setEmpcnt(int empcnt) {
		this.empcnt = empcnt;
	}
}

 

 

10. EmpDeptMnt 생성

import java.util.Iterator;

import java.util.*;

public class EmpDeptMnt {
	Emp emps[];
	Dept depts[];
	Vector ed;
	
    String _emps[][] = {
            {"10", "Kim", "200" },
            {"20", "Lee", "100" },
            {"30", "Park", "200" },
            {"40", "Choi", "300" },
            {"50", "Kwon", "300" },
            {"60", "Shim", "300" },
            {"70", "Hwang", "200" },
            {"80", "Jenny", "300" }
            };
    
    String _depts[][] = {
            {"100", "Marketing" },
            {"200", "Planning" },
            {"300", "Financing" }
            };
	
	public EmpDeptMnt() {
		emps = new Emp[8];	//8칸 공간 생성, 고정길이 배열
		depts = new Dept[3];	//3칸 공간 생성, 고정길이 배열
		ed = new Vector();	//가변길이 배열
		//emps[0] = new Emp(10, "Kim", 200);

		
		//틀을 만듦
		for (int i = 0; i < _emps.length; i++) {
			emps[i] = new Emp(Integer.parseInt(_emps[i][0]), _emps[i][1], Integer.parseInt(_emps[i][2]));
		}
		
		for (int i = 0; i < _depts.length; i++) {
			depts[i] = new Dept(Integer.parseInt(_depts[i][0]), _depts[i][1]);
		}
		
		//getAllEmp();	//사원 리스트 출력
		//getAllDept();	//부서 리스트 출력
		getAll(emps);	//사원 리스트 출력
		getAll(depts);	//부서 리스트 출력
		getAllEmpwithDeptname();	//사원 리스트와 부서명 함꼐 출력
		getNumDept();	//부서별 인원수 구하기
		int maxempdept = getMaxNumDept();	// 인원수가 가장 많은 부서번호 출력
		getMaxDeptEmpList(maxempdept);	//인원수가 가장 많은 부서의 사원 리스트(부서명 포함) 출력
		
	}
	
	private void getMaxDeptEmpList(int maxempdept) {		//인원수가 가장 많은 부서의 사원 리스트(부서명 포함) 출력
		for (int i = 0; i < emps.length; i++) { 
			for (int j = 0; j < depts.length; j++) { 
				if (emps[i].deptno == depts[j].deptno && depts [j].deptno == maxempdept) 
					System.out.println(emps[i].empno +", "+ emps[i].empname +", "+ depts[j].deptname);
			}
		}
	}

	private int getMaxNumDept() {			//인원수가 가장 많은 부서번호 출력
		int deptmax=-1, maxempdept=0;
		
		for(int i=0; i<ed.size(); i++) {
			EmpDept obj = (EmpDept)ed.get(i);
			
			if(obj.deptno > deptmax) {
				deptmax=obj.empcnt;
				maxempdept=obj.deptno;
			}
		}
		System.out.println("deptmax:" + deptmax + ", maxempdept:" + maxempdept);
		
		return maxempdept;
	}

	private void getNumDept() {		//부서별 인원수 구하기
		boolean found = false;
		
		System.out.println("* Get the # of emp grouping by deptname...");
		
		for(int i=0; i < emps.length; i++) {
			found = false;
			//기존 같은 부서 번호가 있으면 그 부서번호의 인원수를 1 증가시킨다.
			for(int j=0; j < ed.size(); j++) {		//백터의 사이즈만큼 반복
				EmpDept obj = (EmpDept)ed.get(j);
				if(emps[i].deptno == obj.deptno) {
					obj.empcnt++;
					found=true;
				}
			}
			if(!found) {	//없었다면(found가 true 이면) 부서를 새로 추가한다.
				ed.add(new EmpDept(emps[i].deptno, 1));
			}
		}
		
		for(int i = 0; i< ed.size(); i++) {
			EmpDept obj = (EmpDept)ed.get(i);
			System.out.println(obj.toString());
		}		
	}

	private void getAllEmpwithDeptname() {	//사원 리스트와 부서명 함께 출력
		for (int i = 0; i < emps.length; i++) { //EMP 
			for (int j = 0; j < depts.length; j++) { //DEPT 
				if (emps[i].deptno == depts[j].deptno) 
					System.out.println(emps[i].empno +", "+ emps[i].empname +", "+ depts[j].deptname);
			}
		}

	}

	private void getAll(Dept[] depts2) {
		for (int i = 0; i < depts2.length; i++) {
			System.out.println(depts2[i].toString());
		}
	}

	private void getAll(Emp[] emps2) {
		for (int i = 0; i < emps2.length; i++) {
			System.out.println(emps2[i].toString());
		}		
	}

	private void getAllDept() {
		for (int i = 0; i < depts.length; i++) {
		System.out.println(depts[i].toString());
		}
	}

	private void getAllEmp() {
		for (int i = 0; i < emps.length; i++) {
			System.out.println(emps[i].toString());
		}
	}
		
		public static void main(String[] args) {
			new EmpDeptMnt();
		}
}

 

출력 결과

사원 리스트 출력

 

부서 리스트 출력

 

사원 리스트와 부서명 함께 출력

 

부서별 인원수 구하기

 

인원수가 가장 많은 부서번호 출력, 300번 부서에 4명 있다는 뜻

 

인원수가 가장 많은 부서의 사원리스트(부서명 포함) 출력, 인원수가 가장 많은 300번 부서의 사원들이 출력됨.

 

반응형