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;
'Oracle DB 11g > 02.활용, SQL' 카테고리의 다른 글
[DB]02-06.Oracle DB 서브 쿼리(sub Query), IN, ALL, EXISTS (0) | 2018.10.05 |
---|---|
[DB]02-05.Oracle DB REFERENCE, 참조 제약 조건(외래키, Unique 제약 조건, 연계 참조 무결성 제약조건, Check 제약 조건) (0) | 2018.10.04 |
[DB]02-04.Oracle DB CONSTRAINT, 제약 조건, 기본키 (0) | 2018.10.04 |
[DB]02-03.Oracle DB 트랜잭션(TRANSACTION), SAVE POINT (0) | 2018.10.02 |
[DB]02-01.테이블 컨트롤,컬럼 타입 설정 (0) | 2018.10.01 |