코드 페이지에서 마우스 오른쪽을 눌러서 source -> generate constructor 를 이용

디폴트 생성자(없어도 호출됨 - 컴파일러가 자동으로만들어준다) - 초기화 용도
생성자를 수동으로 만든다면 디폴트 생성자를 만들어 주지 않는다.

package ch04;

// 상태와 행동
public class Person {

	String name;
	String job;
	int age;
	char gender;
	String bloodType;

	// 디폴트 생성자(없어도 호출됨 - 컴파일러가 자동으로만들어준다) - 초기화 용도
	// 생성자를 수동으로 만든다면 디폴트 생성자를 만들어 주지 않는다.
	// 매개변수가 없다
	public Person() { // 함수와 비슷하게 생겼지만 첫글자가 대문자며 클래스이름과 같다.

	}

	// 오버로딩(함수명이 같아도 매개변수가 다르면 다른 함수로 인식한다)
	public Person(String name, String job, int age, char gender, String bloodType) {
		this.name = name;
		this.job = job;
		this.age = age;
		this.gender = gender;
		this.bloodType = bloodType;
	}

}
package ch04;

public class PersonApp {
	public static void main(String[] args) {
		Person p1 = new Person(); // 인스턴스화
		p1.name = "최승희"; // 변수에 값넣기는 문법적으로는 가능하지만 현실적이지 않다. 이렇게 짜면 좋지 않다.
		p1.job = "의사";
		p1.gender = '여';
		p1.bloodType = "AB";
		p1.age = 45;

		Person p2 = new Person();
		p2.name = "이미녀";
		p2.job = "골프선수";
		p2.gender = '여';
		p2.bloodType = "O";
		p2.age = 28;

		Person p3 = new Person();
		p3.name = "김미남";
		p3.job = "교수";
		p3.gender = '남';
		p3.bloodType = "AB";
		p3.age = 47;

		System.out.println(p3.name);
		System.out.println(p3.job);
		System.out.println(p3.gender);
		System.out.println(p3.age);
		System.out.println(p3.bloodType);

		Person p4 = new Person(
			"홍길동",
			"학생",
			33,
			'남',
			"O"
		);
		
		System.out.println(p4.name);

	}
}

'Programming Language > Java' 카테고리의 다른 글

자바 public, private 비교  (0) 2020.03.27
자바 생성자 자동 생성하는법  (0) 2020.03.27
자바 final과 static 변수 이해하기  (0) 2020.03.27
200323 // STACK, 표현식, DAEMON  (0) 2020.03.23
이클립스 run 설정  (0) 2020.03.23

final변수는 한번초기화하면 바뀌지 않는 변수를 말한다.
보통 변수이름을 대문자로 적는다.

스타크래프트에서 유닛을 업그레이드하면 이미 있는 유닛뿐만 아니라
새로 생성되는 유닛들도 업그레이드된 채로 생성된다.

static 변수를 이용하여 업그레이드하면 가능.

package stars;

class Zealot {
	final String NAME; // 한번 초기화하면 Read Only , 대문자로 적는 것이 약속
	int hp;
	static int attack = 10;

	public Zealot(String name) {
		this.NAME = name;
		this.hp = 100;
	}

}

class Dragoon {
	final String NAME;
	int hp;
	static int attack = 15;

	public Dragoon(String name) {
		this.NAME = name;
		this.hp = 100;
	}

}

public class GameStart {
	public static void main(String[] args) {
		// 공격력 업그레이드하기
		Zealot.attack++;

		// 질럿 생성하기
		Zealot z1 = new Zealot("1번질럿");
		System.out.println(Zealot.attack);
	}
}

'Programming Language > Java' 카테고리의 다른 글

자바 생성자 자동 생성하는법  (0) 2020.03.27
자바 생성자와 오버로딩  (0) 2020.03.27
200323 // STACK, 표현식, DAEMON  (0) 2020.03.23
이클립스 run 설정  (0) 2020.03.23
자바 String  (0) 2020.03.23

실시간 데이터 처리
OLTP

정기적 데이터 처리
OLAP

GROUP BY ROLLUP(DEPTNO, JOB)
1. 그룹바이
2. DEPTNO별 소계 --ROLLUP의 특징
3. DEPTNO, JOB 소계 --GROUP의 원래기능

원본테이블

SELECT *
FROM CAL;

 

 

요일을 열이름으로 하여 달력만들기

SELECT
MAX(DECODE(DAY, '일', NUM_DAY)) "일", 
MAX(DECODE(DAY, '월', NUM_DAY)) "월",
MAX(DECODE(DAY, '화', NUM_DAY)) "화", 
MAX(DECODE(DAY, '수', NUM_DAY)) "수",
MAX(DECODE(DAY, '목', NUM_DAY)) "목", 
MAX(DECODE(DAY, '금', NUM_DAY)) "금",
MAX(DECODE(DAY, '토', NUM_DAY)) "토"
FROM CAL
GROUP BY WEEK
ORDER BY WEEK;

 

 

EMP 원본

SELECT *
FROM EMP;

 

 

직업별 부서별 인원수

SELECT DEPTNO, 
COUNT(DECODE(JOB, 'CLERK', 0)) "CLERK",
COUNT(DECODE(JOB, 'MANAGER', 0)) "MANAGER",
COUNT(DECODE(JOB, 'PRESIDENT', 0)) "PRESIDENT",
COUNT(DECODE(JOB, 'ANALYST', 0)) "ANALYST",
COUNT(DECODE(JOB, 'SALESMAN', 0)) "SALESMAN"
FROM EMP
GROUP BY DEPTNO
ORDER BY DEPTNO;

 

 

PROFESSOR 원본

SELECT *
FROM PROFESSOR;

 

 

교수직책별 평균급여

SELECT 
FLOOR(AVG(DECODE(POSITION, '정교수', PAY))) "정교수",
FLOOR(AVG(DECODE(POSITION, '조교수', PAY))) "조교수",
FLOOR(AVG(DECODE(POSITION, '전임강사', PAY))) "전임강사"
FROM PROFESSOR;

 

 

월급과 보너스를 합하기

원본

SELECT *
FROM EMP;

 

 

SELECT ENAME, JOB, SAL+DECODE(COMM, null, 0, COMM)
FROM EMP;

 

 

소계값, 총계값을 UNION ALL 로 만들기

SELECT ENAME, JOB, DEPTNO, TO_CHAR(S,'$999,999')
FROM
(
SELECT ENAME, JOB, SAL+DECODE(COMM, null, 0, COMM) "S", DEPTNO
FROM EMP
ORDER BY DEPTNO
)
WHERE DEPTNO = 10

UNION ALL

-- 유니온 올 하려면 타입을 같게 맟춰야한다 TO_CHAR까지...
SELECT '소계', NULL, NULL, TO_CHAR(SUM(SAL), '$999,999') "SUM"
FROM EMP
WHERE DEPTNO = 10

UNION ALL

SELECT ENAME, JOB, DEPTNO, TO_CHAR(S,'$999,999')
FROM
(
SELECT ENAME, JOB, SAL+DECODE(COMM, null, 0, COMM) "S", DEPTNO
FROM EMP
ORDER BY DEPTNO
)
WHERE DEPTNO = 20

UNION ALL

SELECT '소계', NULL, NULL, TO_CHAR(SUM(SAL), '$999,999') "SUM"
FROM EMP
WHERE DEPTNO = 20

UNION ALL

SELECT ENAME, JOB, DEPTNO, TO_CHAR(S,'$999,999')
FROM
(
SELECT ENAME, JOB, SAL+DECODE(COMM, null, 0, COMM) "S", DEPTNO
FROM EMP
ORDER BY DEPTNO
)
WHERE DEPTNO = 30

UNION ALL

SELECT '소계', NULL, NULL, TO_CHAR(SUM(SAL), '$999,999') "SUM"
FROM EMP
WHERE DEPTNO = 30

UNION ALL

SELECT '총계', NULL, NULL, TO_CHAR(SUM(SAL), '$999,999') "SUM"
FROM EMP;

 

 

SELECT DEPTNO, NULL JOB, ROUND(AVG(SAL),1) AVG_SAL, COUNT(*) CNT_EMP
FROM EMP
GROUP BY DEPTNO

UNION ALL

SELECT DEPTNO, JOB, ROUND(AVG(SAL),1) AVG_SAL, COUNT(*) CNT_EMP
FROM EMP
GROUP BY DEPTNO, JOB

UNION ALL

SELECT NULL DEPTNO, NULL JOB, ROUND(AVG(SAL),1) AVG_SAL, COUNT(*) CNT_EMP
FROM EMP
ORDER BY DEPTNO, JOB;

 

소계값, 총계값을 ROLLUP으로 구하기

SELECT DEPTNO, JOB, ROUND(AVG(SAL), 1) AVG_SAL, COUNT(*) CNT_EMP
FROM EMP
GROUP BY ROLLUP (DEPTNO, JOB);

 

 

--학생 테이블의 키의 평균을 구하시오.
SELECT AVG(HEIGHT)
FROM STUDENT;

 

 

--학생 테이블에서 DEPTNO1 별 학생들의 키의 평균을 구하시오. 
SELECT DEPTNO1, AVG(HEIGHT)
FROM STUDENT
GROUP BY DEPTNO1;

 

 

--학생 테이블에서 DEPTNO1별 학생들의  키의 평균과 소계값을 구하시오.
SELECT DEPTNO1, GRADE, ROUND(AVG(HEIGHT), 1) , COUNT(*)
FROM STUDENT
GROUP BY ROLLUP (DEPTNO1, GRADE);

 

 

-- 직업별 급여합계 조회 마지막줄에 총합계 추가해서 표시
SELECT JOB, SUM(SAL)
FROM EMP
GROUP BY ROLLUP (JOB);

 

 

--PANMAE 테이블에서 날짜별(P_DATE) 상품이(P_CODE) 몇개(P_QTY) 판매 되었는지와 소계값을 구하시오
SELECT P_DATE, P_CODE, SUM(P_QTY)
FROM PANMAE
GROUP BY ROLLUP (P_DATE, P_CODE);

 

 

--PANMAE 테이블에서 상품별(P_CODE)로 날짜마다(P_DATE) 얼마의 금액(P_TOTAL)이 판매 되었는지와 소계값을 구하시오
SELECT P_CODE, P_DATE, SUM(P_TOTAL)
FROM PANMAE
GROUP BY ROLLUP (P_CODE, P_DATE);

환경
윈도우10 64비트
오라클 18c 익스프레스

 

스캇 예제
예제를 확인하시려면

https://ondolroom.tistory.com/163

 

 

MAX

SELECT MAX(SAL), ENAME
FROM EMP;

MAX는 한줄 ENAME는 여러줄 이기 때문에 오류가 난다 

 

 

GROUP BY

SELECT MAX(SAL), DEPTNO
FROM EMP
GROUP BY DEPTNO;

 

 

-- GROUP BY에 나눌 컬럼을 적고 SELECT에 그룹핑할 컬럼을 적어라
-- 문법은 행의 개수를 맟추는 것
SELECT MAX(SAL), JOB
FROM EMP
GROUP BY JOB;

 

 

-- 그룹을 2가지 이상하면 많은 것을 기준으로 그룹
SELECT MAX(SAL), DEPTNO, ENAME
FROM EMP
GROUP BY DEPTNO, ENAME;

DEPTNO를 그룹으로 만들었으나 ENAME가 양이 더 많기때문에 중복으로 나타남

 

 

-- 부서별 월급의 총합을 구하고 부서를 오름차순으로 정렬 
SELECT SUM(SAL), DEPTNO
FROM EMP
GROUP BY DEPTNO
ORDER BY DEPTNO;

 

 

-- 직업별 직원수를 구하라
SELECT COUNT(*), JOB
FROM EMP
GROUP BY JOB;

 

 

-- 직업별 연봉의 평균(+소수점 탈락)
SELECT FLOOR(SUM(SAL)/COUNT(JOB)), JOB
FROM EMP
GROUP BY JOB
HAVING JOB != 'MANAGER';

 

 

HAVING을 쓰는 이유!

--그룹함수(AVG 등)은 무조건 GROUP BY 다음에 써야한다, 그래서 HAVING을 사용
SELECT DEPTNO, AVG(NVL(SAL,0))
FROM EMP
GROUP BY DEPTNO 
HAVING AVG(NVL(SAL,0)) > 2000;

 

서브쿼리

-- 서브쿼리 (셀렉트 문안에 또 셀렉트가 들어가는 것)
SELECT  -- 스칼라 서브쿼리
FROM  -- 인라인뷰 서브쿼리
WHERE   -- ? 서브쿼리

 

인라인뷰 서브쿼리

일단 테이블에서 원하는 자료만 추출한다

SELECT ENAME "EN"
FROM EMP;

해당코드를 FROM( 이곳 )에 넣는다

 

SELECT *
FROM
(
SELECT ENAME "EN"
FROM EMP
)
WHERE EN = 'SMITH';

 

 

ROWNUM

--ROWNUM은 하드디스크에서 가져온 순서대로 번호를 매김

SELECT ROWNUM
FROM GOGAK
WHERE ROWNUM > 0 AND ROWNUM < 9;

 

 

SELECT MAX(POINT)
FROM GOGAK
WHERE ROWNUM > 0 AND ROWNUM < 9;

 

UNION ALL

SELECT MAX(POINT)
FROM GOGAK
WHERE ROWNUM > 0 AND ROWNUM < 9

UNION ALL --합치기

--1번부터 불러오지 않으면 NULL이뜬다
SELECT MAX(POINT)
FROM 
( -- 서브쿼리
  SELECT GNO, POINT, ROWNUM "NO"
  FROM GOGAK
)
WHERE NO > 8 AND NO < 21;

 

위코드를 DECODE나 CASE를 사용해서 만들어본다

DECODE

-- DECODE로 구분하기, DECODE는 부등호를 쓸수 없다 
SELECT GNO, GNAME, POINT, DECODE(NO, 1, 1, 2) "NO" 
FROM 
( 
  SELECT GNO, GNAME, POINT, CEIL(ROWNUM /9) "NO" 
  FROM GOGAK 
);

CASE

-- CASE로 구분하기
SELECT GNO, GNAME, CASE WHEN NO < 9 THEN 1 ELSE 2 END "NO"
FROM
(
  SELECT GNO, GNAME, POINT, ROWNUM "NO"
  FROM GOGAK
);

 

위 코드들이 서브쿼리의 인수가 된다

SELECT NO, MAX(POINT)
FROM
(
  SELECT GNO, GNAME, POINT, DECODE(NO, 1, 1, 2) "NO"
  FROM
  (
    SELECT GNO, GNAME, POINT, CEIL(ROWNUM /9) "NO"
    FROM GOGAK
  )
)
GROUP BY NO;

 

또는

-- 세로연산의 핵심은 그룹을 만드는 것

SELECT MAX(POINT), G
FROM
(
    SELECT point, CASE WHEN rownum < 9 THEN 1 ELSE 2 END "G"
    FROM GOGAK
)
GROUP BY G;

 

 

-- 5명씩 끊어서 POINT의 합을 구하시오
SELECT SUM(POINT)
FROM
(
    SELECT POINT, CEIL(ROWNUM/5) "FIVE"
    FROM GOGAK
)
GROUP BY FIVE;

 

 

-- 같은 나이의 POINT의 합을 구하시오
SELECT SUM(POINT)
FROM
(
    SELECT POINT, SUBSTR(JUMIN, 1, 2) "NAI"
    FROM GOGAK
)
GROUP BY NAI;

 

 

-- 순위매기기
SELECT ENAME, SAL, ROWNUM
FROM
(
SELECT ENAME, SAL
FROM EMP
ORDER BY SAL DESC
);

'Database > OracleSQL' 카테고리의 다른 글

오라클 피벗 PIVOT 대신 직접짜기  (0) 2020.03.26
오라클 소계값, 총계값, ROLLUP  (0) 2020.03.26
오라클 SELECT , FROM, WHERE 문제  (0) 2020.03.25
오라클 명령어 실행순서  (0) 2020.03.25
오라클 DECODE  (0) 2020.03.25

환경
윈도우10 64비트
오라클 18c 익스프레스

 

스캇 예제
예제를 확인하시려면

https://ondolroom.tistory.com/163

 

 

문제 링크

https://blog.naver.com/codingspecialist/221056527127

https://blog.naver.com/codingspecialist/221056538130

https://blog.naver.com/codingspecialist/221056546987

 

정답

SELECT *
FROM emp;

--1
SELECT empno, ename, sal
FROM emp
WHERE deptno = 10;


--2
SELECT ename, hiredate, deptno
FROM emp
WHERE empno = 7369;


--3
SELECT *
FROM emp
WHERE ename = 'ALLEN';

DESC emp;


--4
SELECT *
FROM emp
WHERE hiredate = '1980/12/17';


--5
SELECT *
FROM emp
WHERE job != 'MANAGER';


--6
SELECT *
FROM emp
WHERE hiredate > '1981/04/02';


--7
SELECT ENAME, SAL, DEPTNO
FROM emp
WHERE SAL >= 800;


--8
SELECT *
FROM emp
WHERE DEPTNO >= 20;


--9
SELECT *
FROM emp
WHERE hiredate < '1981/12/09';


--10
SELECT EMPNO, ENAME
FROM emp
WHERE EMPNO <= 7698;


--11
SELECT *
FROM emp
WHERE hiredate BETWEEN '1981/04/03' AND '1982/12/08';


--12
SELECT *
FROM emp
WHERE SAL BETWEEN 1601 AND 2999;


--13
SELECT *
FROM emp
WHERE SAL < 7654 OR SAL > 7782;


--14
SELECT *
FROM emp
WHERE REGEXP_LIKE(SUBSTR(ENAME, 1,1), '[C-I]');


--15
SELECT *
FROM emp
WHERE SUBSTR(HIREDATE, 1, 2) <> '81';


--16
SELECT *
FROM emp
WHERE JOB = 'SALESMAN' OR JOB = 'MANAGER';


--17
SELECT *
FROM emp
WHERE DEPTNO != 20 AND DEPTNO != 30;


--18
SELECT empno, ename, hiredate, deptno
FROM emp
WHERE SUBSTR(ENAME, 1, 1) = 'S';


--19
SELECT *
FROM emp
WHERE SUBSTR(HIREDATE, 1, 2) = '81';


--20
SELECT *
FROM emp
WHERE ENAME LIKE '%S%';


--21
SELECT *
FROM emp
WHERE ENAME LIKE 'S%' AND ENAME LIKE '%T';


--22
SELECT *
FROM emp
WHERE ENAME LIKE '_A%';


--23
SELECT *
FROM emp
WHERE COMM IS NULL;


--24
SELECT *
FROM emp
WHERE COMM IS NOT NULL;


--25
SELECT ENAME, SAL, DEPTNO, COMM
FROM emp
WHERE deptno = 30 AND sal >= 1500;


--26
SELECT empno, ename, deptno
FROM emp
WHERE SUBSTR(ENAME, 1, 1) = 'k' or deptno = 30;


--27
SELECT *
FROM emp
WHERE sal >= 1500 and deptno = 30 AND JOB = 'MANAGER';


--28
SELECT *
FROM emp
WHERE deptno = 30
ORDER BY EMPNO;


--29
SELECT *
FROM emp
ORDER BY SAL DESC;

--30
SELECT *
FROM emp
ORDER BY DEPTNO, SAL DESC;


--31
SELECT *
FROM emp
ORDER BY DEPTNO DESC, ENAME, SAL DESC;


--32
SELECT *
FROM emp
WHERE COMM IS NOT NULL
ORDER BY (SAL+COMM) DESC;


--33
SELECT ENAME, SAL, SAL*0.13 "BONUS", deptno
FROM emp
WHERE DEPTNO = 10;


--34
SELECT ENAME, deptno, SAL, sal*12+sal*1.5 "INCOME"
FROM emp
WHERE DEPTNO = 30;


--35
SELECT ENAME, SAL, sal*0.15
FROM emp
WHERE sal >= 2000;


--36
SELECT ENAME, SAL, sal-sal*0.1
FROM emp
ORDER BY sal DESC;

 

+ Recent posts