1. 접속 계정 변경



SQL문을 작성하다가 다른 계정, 즉 sys 계정과 web_user 계정이 있을때


sys 계정에서 web_user 계정으로 접속하여 진행하고 싶을 때


화면 우측 중상단을 보면 작은 콤보박스가 보인다.




콤보박스를 클릭하면 좌측 리스트에 나와있는 접속된 계정들로 바꿀 수 있다.


비밀번호 저장을 설정하여 다시 물어보지 않게 해서인지 비밀번호는 물어보지 않는다.



2. 새 파일 만들기, 열기



새 SQL 파일과 같이 이 프로그램에서 새로운 파일을 만들고 싶을때는


다음 캡쳐와 같이 찾으면 된다.



화면 좌측 상단의


백지 + 버튼은 새로운 파일을 만들 때


열려있는 파일 버튼은 저장된 SQL을 불러올 때 쓴다.


백지+ 버튼을 누르면 아래와 같은 창이 뜨고







좌측의 범주를 보면 다양한 파일이 있지만 보통 SQL 파일을 사용








위와같이 마음에 드는 이름, 경로 설정 후 확인을 누르면 생성된다. 






파일을 새로 만들거나 불러오면 저번에 썻더라도 접속 계정이 할당되어 있지 않다.


고로 1번의 방법처럼 계정 접속을 설정해주면 된다.



3. UTF-8 코딩 설정





화면 상단 바의 도구 - 환경설정 - 환경 - 인코딩 설정을 UTF-8로 바꾼다.

DML은 데이터 조작 언어로 데이터를 검색, 등록 삭제, 갱신을 위한 언어이다.


단순하게 만든 테이블과 컬럼안의 데이터들을 다루는 언어이다.


컬럼을 만들었으므로 삽입부터 쭉 다룬다.


이 중 Merge는 조건이 맞을경우, 틀릴경우 작동하는데


jsp같은데서 사용할 때 조건문을 사용하지 db에서는 잘 쓰지 않는다.


이런게 있구나 하고 넘어가면 된다.




Insert, Update, Delete, Merge


-- DML은 테이블의 데이터를 입력/수정/삭제/읽기를 다룬다.
-- 
-- 1. 데이터 추가
-- INSERT INTO [테이블 명] ([컬럼 명], ...) VALUES ([넣을 값], ...);
DESC employees;

INSERT INTO employees (emp_no, first_name, family_name, email,
                        mobile, salary, commision)
        VALUES (111, '둘리', '고', 'asd@acomp.com', '01234567890', 10000000, 90);
INSERT INTO employees (emp_no, first_name, family_name, email,
                        mobile, salary, commision)
        VALUES (112, '또치', '고', 'asd@acomp.com', '01234567890', 10000000, 90);
INSERT INTO employees (emp_no, first_name, family_name, email,
                        mobile, salary, depart_no, commision)
        VALUES (113, '도넛', '고', 'asd@acomp.com', '01234567890', 10000000, 3, 90);

SELECT * FROM employees;

-- INSET INTO employees VALUES ( 모든 데이터 값 );와 같이 모든 값이 들어 갈 경우 컬럼명을 생략해도 된다.
-- 하지만 다른 사람이 읽을 때는 컬럼명을 생략했을때 알아보기 힘들어지므로 다 적는것을 추천
-- 현재 예제는 REG_DATE가 중간에 있어서 생략 할 시 오류가 발생, 마지막에 있다면 정상 작동 할 것.

-- 2. 데이터 수정
-- UPDATE [테이블] SET [컬럼] = [변경할 값] WHERE [조건]; 조건을 안붙이면 전부 수정해버리므로 주의!
UPDATE employees SET depart_no = 'DEV_002' WHERE depart_no IS NULL;

SELECT * FROM employees;

-- 커미션이 90인 사람을 10으로
UPDATE employees SET commision = 10 WHERE commision = 90;
-- 이름이 '김지훈'인 사람의 comission을 90으로
UPDATE employees SET commision = 90 WHERE first_name = '또치';

SELECT * FROM employees;

-- 3. 삭제
-- DELETE FROM [테이블] WHERE [조건]; 조건을 안붙이면 전부 지워버리므로 주의!
-- emp_no = 113인 사람 지우기

DELETE FROM employees WHERE emp_no = 113;

SELECT * FROM employees;

-- 삽입
-- emp_no = 113 ~ 117
-- dev_001 1명, 나머지 dev_002
-- commision은 null
INSERT INTO employees (emp_no, first_name, family_name, email,
                        mobile, salary, depart_no)
        VALUES (113, '도넛', '고', 'asd@acomp.com', '01234567890', 10000000, 'DEV_002');
INSERT INTO employees (emp_no, first_name, family_name, email,
                        mobile, salary, depart_no)
        VALUES (114, '길동', '고', 'asd@acomp.com', '01234567890', 10000000, 'DEV_001');
INSERT INTO employees (emp_no, first_name, family_name, email,
                        mobile, salary, depart_no)
        VALUES (115, '희동', '박', 'asd@acomp.com', '01234567890', 10000000, 'DEV_002');
INSERT INTO employees (emp_no, first_name, family_name, email,
                        mobile, salary, depart_no)
        VALUES (116, '이콜', '마', 'asd@acomp.com', '01234567890', 10000000, 'DEV_002');
INSERT INTO employees (emp_no, first_name, family_name, email,
                        mobile, salary, depart_no)
        VALUES (117, '실이', '공', 'asd@acomp.com', '01234567890', 10000000, 'DEV_002');

SELECT * FROM employees;

-- 4. MERGE
-- 특정 조건에 부합하면 수정 또는 삭제 그렇지 않으면 삽입하는 기능
-- MERGE INTO [테이블] USING (서브쿼리) ON (조건);
-- WHEN MATCHED THEN
-- [DELETE] 또는 [UPDATE]
-- WHEN NOT MATCHED THEN
-- [INSERT]
-- 서브 쿼리는 뒤에서 설명하지만 쿼리문으로 뽑아낸 특정 데이터를 쿼리문에서 사용하는 것.
-- 쿼리 안의 쿼리


-- 테이블 하나 사용 시
-- 1) depart_no가 dev_001인 데이터가 있으면 commision을 10으로 변경
-- UPDATE employees SET commision = 10 WHERE depart_no = 'dev_001';
-- DUAL은 가상 테이블로 지금은 텅 비어있음
MERGE INTO employees USING DUAL ON (depart_no = 'DEV_001')
    WHEN MATCHED THEN
        UPDATE SET commision = 10;
-- 여기까지, MATCHED만 사용 할 경우 UPDATE문이나 DELETE문과 다를게 없다.
SELECT * FROM employees;

-- 2) depart_no가 dev_003인 데이터가 있으면 commision을 10으로 변경하고 없으면 추가 한다.
MERGE INTO employees USING DUAL ON (depart_no = 'DEV_003')
    WHEN MATCHED THEN
        UPDATE SET commision = 10
    WHEN NOT MATCHED THEN
        INSERT (emp_no, first_name, family_name, email, mobile, salary, depart_no)
        VALUES (118, '계인', '외', 'E@email.net', '01012345678', 4000000, 'DEV_003');

SELECT * FROM employees;

-- 3) depart_no가 dev_002일 때 commision을 10으로 변경
--    그리고 EMP_NO = 117인 데이터 삭제
MERGE INTO employees USING DUAL ON (depart_no = 'DEV_002')
    WHEN MATCHED THEN
        UPDATE SET commision = 10
        DELETE WHERE emp_no = 117;

SELECT * FROM employees;

-- 테이블 2개 사용 시(스스로)






Select


Select는 데이터 베이스의 항목들을 조회, 읽어오는 것


가장 많이 쓰이고 데이터가 많아질 수록 복잡해진다.


그리고 보통 모든 항목을 표시하는 *을 자주 사용하는데


이는 다른 사람이 봤을때 따로 찾아봐야 하는 일이 생기므로 사용하는걸 권장 x



1. 조회

2. 특정 조건을 만족하는 데이터(WHERE)

3. AND 조건 (A&&B)

4. OR 조건(A||B)

5. BETWEEN AND

6. 중복 제거(DISTINCT)

7. IN

8. IS NULL / IS NOT NULL

9. LIKE

10. 정렬 (ORDER BY)

11. GROUP BY

12. HAVING


-- 1. 데이터 조회
-- 1) 특정 컬럼 조회
-- SELECT [column] FROM [table]
SELECT * FROM employees;
SELECT first_name, family_name, salary FROM employees;

-- 산술 표현(실제 데이터에 적용되지 않음)
SELECT first_name, family_name, salary/10000 FROM employees;

-- 연봉 알아보기(AS를 통해 항목 이름을 임시로 바꿔서 표현)
-- AS는 특정 컬럼에 별칭을 주는 것.
SELECT first_name, family_name, salary / 10000, ((salary/10000) * 12) AS 연봉 FROM employees;

-- 문자열 합치기 (||, 버티컬 바)
SELECT family_name||' ' ||first_name AS 이름, salary / 10000 AS 봉급, ((salary/10000) * 12) AS 연봉 FROM employees;
SELECT family_name||' ' ||first_name AS 이름, salary / 10000 || '만원' AS 봉급, ((salary/10000) * 12) || '만원' AS 연봉 FROM employees;

-- 2)특정 조건을 만족하는 데이터(WHERE)
-- SELECT [column] FROM [table] WHERE [condition];
-- family_name = '고'인 사람을 찾아보자
SELECT family_name||' ' ||first_name AS 이름, salary / 10000 || '만원' AS 봉급, ((salary/10000) * 12) || '만원' AS 연봉 FROM employees WHERE family_name = '고';
-- salary > 5000000
SELECT family_name||' ' ||first_name AS 이름, salary / 10000 || '만원' AS 봉급, ((salary/10000) * 12) || '만원' AS 연봉 FROM employees WHERE salary > 5000000;

-- 3) AND 조건 (A&&B)
-- salary > 3000000, salary <= 7000000
SELECT family_name||' ' ||first_name AS 이름, salary / 10000 || '만원' AS 봉급, ((salary/10000) * 12) || '만원' AS 연봉 FROM employees WHERE salary > 3000000 AND salary < 7000000;

-- 4) OR 조건(A||B)
-- family_name = '고' OR salary > 7000000
SELECT family_name||' ' ||first_name AS 이름, salary / 10000 || '만원' AS 봉급, ((salary/10000) * 12) || '만원' AS 연봉 FROM employees WHERE family_name = '고' OR salary > 7000000;

-- 5) BETWEEN AND
-- WHERE salary >= 3000000 AND salary <= 7000000
-- = WHERE salary BETWEEN 3000000 AND 7000000
-- BETWEEN을 사용하는 이유는 프로그램마다 읽는 방식이 다르기 때문에
-- 예를들어 html에선 <> 비교를 <P> 와 같이 사용하기 때문이다.
SELECT family_name||' ' ||first_name AS 이름, salary / 10000 || '만원' AS 봉급, ((salary/10000) * 12) || '만원' AS 연봉 FROM employees WHERE salary BETWEEN 3000000 AND 7000000;

-- 6) 중복 제거(DISTINCT)
-- SELECT DISTINCT [column] FROM [table];
SELECT DISTINCT salary FROM employees;

-- 7) IN
-- 여러개의 OR 조건을 표현 할 때(속도면에서 우월)
-- 문장이 짧아져 보기쉽고 프로그램 상 속도도 OR보다 빠르다.
SELECT * FROM employees WHERE
family_name = '고' OR family_name = '박' OR family_name = '마';

SELECT * FROM employees WHERE
family_name IN ('고', '박', '마');

-- 8) IS NULL / IS NOT NULL
-- DB에 NULL이 있는건 좋지 않기 때문에 쓸 일이 별로 없을것임.
SELECT * FROM employees WHERE commision IS NULL;
SELECT * FROM employees WHERE commision IS NOT NULL;

-- Like 실험을 위해 수정
UPDATE employees SET email = 'bsd@gmail.com' WHERE first_name = '도넛';
UPDATE employees SET email = 'bsd@gmail.com' WHERE first_name = '길동';
UPDATE employees SET email = 'csd@acomp.com' WHERE first_name = '희동';
UPDATE employees SET email = 'csd@acomp.com' WHERE first_name = '이콜';
-- 9) LIKE
-- 일부 비슷한 내용을 검색
-- WHERE [column] LIKE '[%를 포함한 문자열]'
-- %는 와일드 카드라고 함
-- 앞 자리가 as로 시작하는 ... => as%
-- 뒷 자리가 com으로 끝나는 ... => %com
-- b와 c를 포함하는 ... => %b%c%
SELECT * FROM employees WHERE email LIKE 'as%';
SELECT * FROM employees WHERE email LIKE '%com';
SELECT * FROM employees WHERE email LIKE '%b%c%';

-- gmail 이 포함된 내용을 찾아라
SELECT * FROM employees WHERE email LIKE '%gmail%';

-- 정렬 실험을 위한 UPDATE
UPDATE employees SET salary = 12000000 WHERE first_name = '또치';
UPDATE employees SET salary = 8000000 WHERE first_name = '길동';
UPDATE employees SET salary = 6000000 WHERE first_name = '이콜';
-- 10) 정렬 (ORDER BY)
-- 특정 컬럼을 기준으로 오름차순(ASC) 또는 내림차순 (DESC)
-- SELECT [column] FROM [table] ORDER BY [column] [ASC | DESC]
-- SELECT [column] FROM [table] WHERE [조건] ORDER BY [column] [ASC | DESC]
-- 급여가 높은 사람 순으로 정렬
SELECT * FROM employees ORDER BY salary DESC;
-- 성을 가나다 순으로 정렬
SELECT * FROM employees ORDER BY family_name ASC;
-- ASC, 오름차순은 생략 될 수 있다.
SELECT * FROM employees ORDER BY family_name;
-- 연봉이 높은 사람 기준으로 정렬
-- 별칭을 지정하였을 경우 별칭만 입력해도 됨
SELECT family_name||' ' ||first_name AS 이름, salary / 10000 || '만원' AS 봉급, ((salary/10000) * 12) || '만원' AS 연봉 FROM employees ORDER BY ((salary/10000) * 12) || '만원' ASC;

-- 11) GROUP BY
-- 데이터를 그루핑 하여 가져오는 경우 사용
-- Group by에 사용 할 컬럼은 Select 절의 컬럼에 반드시 있어야 함
-- SUM, AVG와 같은 계산 묶음을 사용하지 않으면 오류 발생, 그룹으로 묶으면 개별 정보를 표현할 수 없기 때문
-- 부서별 급여 합산, 평균
SELECT depart_no, SUM(salary) FROM employees GROUP BY depart_no;
SELECT depart_no, AVG(salary) FROM employees GROUP BY depart_no;
-- 부서별 급여 합과 평균 커미션
SELECT depart_no, SUM(salary), AVG(commision) FROM employees GROUP BY depart_no;


-- 12) HAVING
-- GROUP BY 결과로 부터 특정 조건의 값만 추출
-- HAVING에는 WHERE과 다르게 별칭을 사용할 수 없음.
-- 부서별 급여 합계와 성과급 평균 => 합계가 3000 미만인 그룹만 추출
SELECT depart_no, SUM(salary) as 합, AVG(commision) FROM employees GROUP BY depart_no
HAVING SUM(salary) < 30000000;
-- 부서별 합계가 3000만원 이하인 부서를 금액이 높은 순으로 정렬
SELECT depart_no, SUM(salary) as 합 FROM employees GROUP BY depart_no
HAVING SUM(salary) < 30000000 ORDER BY SUM(salary) DESC;




01-04의 게시물에선


관리자 계정을 이용하여 사용자 계정을 생성하였다.


이번에는 사용자 계정으로 접속하여 테이블을 다뤄본다.



저번에 접속한 SYS계정이 좌측에 보인다.


저번에 생성한 web_user로 접속하는데 생성 당시 비밀번호를 pass로 설정하였으니 그대로 입력하고


테스트를 눌러 확인하고 접속을 누른다.


창이 뜨면 아무거나 입력하고 저번과 같이 저장 경로를 새로 설정한다.




-- 1. 테이블 생성
-- CREATE TABLE [테이블 명] (
-- [컬럼명] [데이터타입] [크기지정]
-- [컬럼명] [데이터타입] [크기지정]
-- [컬럼명] [데이터타입] [크기지정]
-- );
-- 여러개를 집어 넣을 수 있다.

-- 데이터타입 종류 (오라클은 BOOLEAN은 없음)

-- 1) 문자타입(검색속도가 빠르다, DB에선 속도가 중요하지만 DB가 크지 않으므로 지금은 신경쓰지 않아도 된다.)
-- 고정형(사이즈 한번 설정)
-- CHAR(바이트 수) 영어 - 1, 한글 - 2, 한문 - 3 바이트
-- NCHAR(글자 수) 전부 3 바이트 잡아버림

-- 가변형(늘었다 줄었다.), 원래는 VARCHAR와 NVARCHAR였는데 2를 쓰라고 권고
-- VARCHAR2(바이트 수)
-- NVARCHAR2(글자 수)

-- 2) 숫자
-- NUMBER(전체 자릿수, 소숫점 자릿수)
-- NUMBER <-- 오라클이 알아서 계산, 지정해주므로 속도가 느려진다. 그러므로 지정을 하자

-- 3) 날짜
-- Date <-- 7byte(yyyy-mm-dd hh:mm:ss), DEFAULT SYSDATE를 하면 데이터를 입력했을때의 날짜가 입력됨
-- TIMESTAMP <- 10억분의 1초까지 저장
-- yyyy-mm-dd hh:mm:ss.FF9 FF는 소숫점 9번째
-- 타임 스탬프는 누군가가 먼저 등록을 했나, 우열을 가릴 때 사용, 데이터를 조금 더 많이 먹음

CREATE TABLE testtable(
    username NVARCHAR2(10),
    age NUMBER(3, 0),
    mobile NVARCHAR2(11),
    reg_date DATE DEFAULT SYSDATE
);

-- description, 테이블 구조 확인
-- DESC [테이블 명];
DESC testtable;

-- 테이블 리스트 확인
SELECT * FROM USER_TABLES;
SELECT table_name FROM USER_TABLES;

-- 테이블을 아래와 같이 만들어 보자
-- 테이블 명 : employees
-- emp_no 숫자형 3자리
-- first_name 문자열 8자리
-- last_name 문자열 2자
-- email 문자열 50자
-- mobile 문자열 11자
-- salary 숫자형 8자
-- reg_date 날짜 기본으로 SYSDATE 된다.


CREATE TABLE employees(
    emp_no NUMBER(3, 0),
    first_name NVARCHAR2(8),
    last_name NVARCHAR2(2),
    email NVARCHAR2(50),
    mobile NVARCHAR2(11),
    salary NUMBER(8, 0),
    reg_date DATE DEFAULT SYSDATE
);

DESC employees;
-- TABLE을 같은 이름으로 두번 Create 하면 오류가 출력됨
-- 고로 수정하고 싶으면 Drop 했다가 다시 Create하자

-- 2. 테이블 삭제
-- DROP TABLE [테이블 명]
SELECT table_name FROM USER_TABLES;
DROP TABLE testtable;
SELECT table_name FROM USER_TABLES;

-- 테이블 내 데이터 일괄 삭제(추천 하지 않는 기능)
-- DELETE 로 삭제 할 경우 ROLL BACK 가능, 휴지통에 버리기 처럼 남는다.
-- TRUNCATE TABLE [테이블 명]
-- TRUNCATE는 삭제하고 바로 휴지통에 비워버림, 완전 삭제, 복구 불가

-- 3. 테이블 수정(컬럼, 테이블 내부의 항목)

-- 1) 컬럼 이름 변경 - 기존 데이터가 있을 경우 삭제되어 버리므로 주의해야 한다.
-- ALTER TABLE [테이블 명] RENAME COLUMN [어떤 컬럼] TO [바꿀 이름];
ALTER TABLE employees RENAME COLUMN last_name TO family_name;
DESC employees;

-- 2) 컬럼 추가
-- ALTER TABLE [테이블 명] ADD ([컬럼 명] [데이터 타입(크기)]);
ALTER TABLE employees ADD (depart_no VARCHAR2(10));
DESC employees;
ALTER TABLE employees ADD (commision VARCHAR2(10));
ALTER TABLE employees ADD (etc VARCHAR2(100));
DESC employees;

-- 3) 컬럼 속성 변경 - 기존 데이터가 있으면 안된다.
-- ALTER TABLE [테이블 명] MODIFY ([컬럼 명] [데이터 타입(크기)]);
ALTER TABLE employees MODIFY (commision NUMBER(3,0));
DESC employees;

-- 4) 컬럼 삭제
-- ALTER TABLE [테이블 명] DROP COLUMN [컬럼 명];
ALTER TABLE employees DROP COLUMN etc;
DESC employees;




+ Recent posts