-- WHEN 조건식 THEN 수행문
-- WHEN 조건식 THEN 수행문
-- ELSE 수행문
--END
--CASE 컬럼/표현식
-- WHEN 값1 THEN 수행문
-- WHEN 값2 THEN 수행문
-- ELSE 수행문
--END
--문자열함수
-- length
-- substr
-- instr
-- replace
-- trim
-- rpad, lpad
-- upper, lower
--숫자함수
-- round, trunc, ceil, floor
--날짜함수
-- sysdate, months_between, add_months
-- 날짜+숫자, 날짜 - 숫자, 날짜 - 날짜
--변환함수
-- to_char(date/number. 'fmt'),to_date('string', 'pattern'), to_number('string', 'pattern')
--기타함수
-- nvil(col/exp, replace
-- case~when~else~end
-- decode
SELECT LAST_NAME, JOB_ID, SALARY,
CASE
WHEN JOB_ID = 'IT_PROG' THEN SALARY *0.15
WHEN JOB_ID = 'SA_REP' THEN SALARY *0.5
WHEN JOB_ID = 'SH_CLERK' THEN SALARY *0.2
ELSE
SALARY * 0.05
END AS "뽀나리"
FROM EMPLOYEES;
SELECT DECODE(
JOB_ID, 'IT_PROG', SALARY* 0.15
)
FROM EMPLOYEES;
--1. 데이타베이스 서버의 현재 날짜를 표시하는 쿼리
SELECT SYSDATE
FROM DUAL;
--2. 각사원의 사원번호, 이름, 급여, 15%인상된 급여를 정수로 표시하는 쿼리 인상된 급여는 New Salary로 별칭 부여
SELECT EMPLOYEE_ID, LAST_NAME, SALARY, (SALARY * 0.15) + SALARY AS "New Salary"
FROM EMPLOYEES;
--3. 2번쿼리에서 인상된 급여와 이전 급여의 차이를 표시하는 새로운 열을 표시하는 쿼리, 새로운 열의 별칭은 Increase
SELECT EMPLOYEE_ID, LAST_NAME, SALARY, (SALARY * 0.15) + SALARY AS "New Salary", ((SALARY * 0.15) + SALARY) - SALARY AS Increase
FROM EMPLOYEES;
--4. 이름이 J혹은 A혹은 M으로 시작하는 모든 사원의 이름과 이름의 길이를 표시하는 쿼리
SELECT LAST_NAME, LENGTH(LAST_NAME)
FROM EMPLOYEES
WHERE SUBSTR(LAST_NAME, 0, 1) IN ('J', 'A', 'M');
--5. 각 사원의 이름과 근무달수를 표시하는 쿼리(근무달수는 정수로표시
--현재날짜에서 기존날짜를 뺀다음 달을 출력
--MONTHS_BETWEEN(SYSDATE, HIRE_DATE)
--TO_DATE('0000-00-00', 'YYYY-MM-DD'))
SELECT ROUND(MONTHS_BETWEEN(sysdate, hire_date)) || '개월'
FROM EMPLOYEES;
--6. 사원의 이름과 COMMISSION을 표시하는 쿼리 커미션을 받지 못하는 사원은 "No Commission'이라고 표시
SELECT LAST_NAME, CASE WHEN commission_pct is null then 'No Commission' END
FROM EMPLOYEES;
--7. 사원의 급여를 *로 출력하는 쿼리(1000달러당 *하나를 출력)
--숫자 1000당 별표 표시
SELECT LPAD(' ', SALARY / 1000, '*') AS "별", SALARY
FROM EMPLOYEES;
--정규화 -> 테이블을 더작은 속성들의 세로로 쪼개는것
--조인
-- 조회할 데이터가 2개 이상의 테이블에 흩어져서 존재하는 경우 필요하다.
-- 조인할 테이블을 select문의 from절에 나열하면된다.
-- 조인할 때는 조인조건이 필요하다.
-- - 조인 조건은 WHERE절에 기술한다.
-- - 조인 조건은 서로 연관된 행끼리 어떻게 이어붙일 것인지를 정하는 것이다.
-- - 조인 조건은(조인한 테이블 개수 -1)개 만큼 있어야 된다.
--테이블 2개 조인
--SELECT TABLE1, COLUMN1, TABLE.COLUMN2, COLUMN5
--FROM TABLE1, TABLE2
--WHERE TABEL1.COLUMN = TABLE2.COLUMN;
--EMPLOYEE 테이블의 사원정보 (사원아이디, 이름, 부서아이디, 부서명, 부서위치 표시)
SELECT *
FROM EMPLOYEES A, DEPARTMENTS B
WHERE A.DEPARTMENT_ID = B.DEPARTMENT_ID;
--사원정보(사원아이디, 이름, 소속부서 아이디, 소속부서명)
SELECT *
FROM EMPLOYEES A, DEPARTMENTS B
WHERE A.EMPLOYEE_ID = B.DEPARTMENT_ID
AND JOB_ID = 'ST_MAN';
--EMPLOYEES에서 MANAGER_ID가 100인 사원들의 사원아이디, 이름, 직종아이디. 직종명을 표시
SELECT A.EMPLOYEE_ID, A.LAST_NAME, B.JOB_TITLE, C.DEPARTMENT_NAME
FROM EMPLOYEES A, JOBS B, DEPARTMENTS C
WHERE A.JOB_ID = B.JOB_ID
AND A.DEPARTMENT_ID = C.DEPARTMENT_ID
AND A.MANAGER_ID = 100;
--각 부서별 부서명과 소속 도시명 소속국가명
SELECT D.DEPARTMENT_NAME, L.CITY, C.COUNTRY_NAME
FROM DEPARTMENTS D, LOCATIONS L, COUNTRIES C
WHERE D.LOCATION_ID = L.LOCATION_ID
AND L.COUNTRY_ID = C.COUNTRY_ID;
SELECT *
FROM GOGAK A, GIFT B
WHERE A.POINT > B.G_START
AND A.POINT < B.G_END;
SELECT A.FIRST_NAME || A.LAST_NAME AS "사원",'의 매니져는' || B.FIRST_NAME || B.LAST_NAME AS "매니져"
FROM EMPLOYEES A, EMPLOYEES B
WHERE A.MANAGER_ID = B.EMPLOYEE_ID
AND A.FIRST_NAME = 'Neena';
--A.LAST_NAME LIKE 'L%';--사원 / 매니져
CREATE TABLE CATEGORY(
CAT_ID NUMBER,
CAT_NAME VARCHAR2(50),
PARENT_ID NUMBER
);
INSERT INTO CATEGORY VALUES(1, '가구', NULL);
INSERT INTO CATEGORY VALUES(1, '가전', NULL);
INSERT INTO CATEGORY VALUES(10, '침대', 1);
INSERT INTO CATEGORY VALUES(11, '쇼파', 1);
INSERT INTO CATEGORY VALUES(12, '책장', 1);
INSERT INTO CATEGORY VALUES(13, 'TV', 2);
INSERT INTO CATEGORY VALUES(14, '냉장고', 2);
INSERT INTO CATEGORY VALUES(15, '세탁기', 2);
SELECT A.CAT_NAME, B.CAT_NAME
FROM CATEGORY A, CATEGORY B
WHERE A.PARENT_ID = B.CAT_ID;
Account 클래스 작성
BankingServer
- BankingUI의 연결요청을 기다린다.
- 연결요청이 접수되면 Socket을 생성한다.
- BankingServerThread를 생성한다. <-- 통신에 필요한 Socket를 전달
- 스레드를 start시킨다.
BankingServerThread
- Account(계좌정보)를 저장하는 ArrayList가 있어야 된다.
- BankingServer에서 전달해준 Socket을 담을 변수가 있어야 한다.
- run() 메소드를 구현한다.
- 읽기/쓰기 스트림을 만든다.
- 반복시작
- 클라이언트가 보낸 메세지를 읽는다.
- 메세지를 적절히 자른다.
- 메세지의 타입에 따라 적절한 처리를 한다.
- "NEW" 일 때는 전달받은 정보(예금주,계좌번호, 비번, 금액)로
Account를 만들고 ArrayList에 담는다.
- "DEPOSIT" 일 때는 전달받는 정보(예금주, 계좌번호, 입금액)을 참조해서
ArrayList에서 해당되는 Account를 찾아서 값을 변경한다.
- "WITHDRAW"
- "FIRE" 일 때는 전달받은 정보(예금주, 계좌번호, 비밀번호)를 참조해서
ArrayList에서 해당되는 Account를 지운다.
- 해당되는 처리를 마치면 클라이언트에 응답메세지 보내기
(계좌정보 모두 보내기)
- 반복종료
BankingUI
- 버튼/ jtextarea
-서버와 연결하기 <-- 소켓 생성하기
- 읽기/쓰기 스트림 만들기
- ClientThread 생성, start시킨다.
- 버튼 누를때 마다 다이얼로그 창 표시하기
NewDialog
- 쓰기 스트림을 담을 변수
- 입력필드/ 버튼 배치
- 버튼 클릭하면 입력된 값을 NEW:홍길동:111-222:10000과 형식으로 만들어서
서버로 전송하기
DepositDialog
WithdrawDialog
FireDialog
ClientThread
- 읽기 스트림 담을 변수
- jtextarea 담을 변수
- run 구현
- 서버가 보낸 메세지를 해석해서 BankingUI 화면에 표시하기