
입력
수정
삭제
생성
삭제
수정
CREATE
DROP(table 삭제)
ALTER
Transaction Control Language
저장
취소
/*DDL ==> CREATE or DROP */
CREATE TABLE table_name(
column_name DataType(arg)[, c/n d/t]
);
/*SQL은 대소문자를 구별하지않는다. BUT 예약어는 대문자, 식별자는 소문자로 가독성 확보*/
/*table_name에는 관리할 테이블의 이름 설정*/
/*column_name에는 Identifier 설정*/
/*DataType에는 NUMBER(arg), VARCHAR2(n) 등 datatype 설정*/
/*[, c/n d/t]은 0개 또는 n개로써 없을수도있고 있을수도있다. 반드시 1개이상은 있어야한다.*/
/*기본값 설정은 DEFAULT를 사용하여 추가한다.*/
/*Field가 추가되면 ,를 사용하여 이어짐 표시 후 추가할 Field가없으면 ,제거*/
===============생성,삭제 연습====================
CREATE TABLE ex_test(
id NUMBER(3),
name VARCHAR2(15),
salary NUMBER(15,2),
title VARCHAR2(15) DEFAULT '사원',
in_date DATE DEFAULT SYSDATE,
dept_name VARCHAR(15)
);
========================================
DESC ex_test;
DESCRIBE ex_test;
SELECT * FROM ex_test;
========================================
/*아래 테이블 생성은 오류발생(1개 이상의 column을 가진다.)*/
CREATE TABLE test_table(
);
========================================
CREATE TABLE test_table(
no NUMBER(10),
contents VARCHAR2(10)
);
DESC test_table;
SELEC * FROM test_table;
DROP TABLE test_table;
DESC test_table;
/*DML ==> INSERT or UPDATE or DELETE */
INSERT
INTO table_name(c/n [,c/n])
VALUES (value, value, ...);
/*아무것도 없는 값은 NULL로 표시된다.*/
/*입력데이터는 영구적인 데이터가아니다. COMMIT을 통해 저장을 해야한다*/
/*오라클은 PLSQL이기때문에 기본설정을 위한 오라클만의 명령어가 존재한다.*/
/*set linesize 1000 ==> 가로확장*/
/*set pagesize 1000 ==> 테이블의 세로 디스플레이확장*/
====================
/*dual*/
/*오라클 자체에서 제공되는 테이블*/
/*간단하게 함수를 이용해서 계산 결과값을 확인 할 때 사용하는 테이블*/
select sysdate from dual; /*현재 날짜 출력, 국가마다 다른표시*/
select 9*9 fome dual;/*사칙연산 출력*/
select user from dual;/*현재 사용자 정보 출력*/
=========================
insert
into ex_test(id, name, salary, title, in_date, dept_name)
values(1,'김사장', 100, '사장', '04-07-19', '개발부');
select * from ex_test;
=============================
insert
into ex_test /*table_name이 없으면 전부 다 넣겠다라는 의미*/
values(2,'홍길동', 100, '부사장', '04-07-19', '영업부');
===============================
insert
into ex_test(id, name, salary)
values(3,'홍길순',10000);
========================================
insert
into ex_test(id, name, title)
value(4,'이순신','장군');
===========================================
1.tcl ::commit :table record 입력 value 저장(?)
::rollback :table record 입력 value 취소(?)
::persistance data 저장(?) / 취소(?)
commit;
===========================================
insert
into ex_test(id, name, title)
value(4,'이순신','장군');
select*from ex_test;
/*ROLLBACK은 COMMIT전 상태로 되돌린다. 즉, 취소의 의미를 가진다.*/
rollback;
select*from ex_test;
///////////////////////////////////////////////////////////////
===========================================
insert
into ex_test
value(2,uesr, 1000,'부사장', sysdate, '영업부');
==================================================================
insert
into ex_test(id, name)
value(5,'장나라');
=============================================
insert
into ex_test
value(6,'신나라',NULL, null,",");
/*COMMIT은 영구적인 데이터로의 저장을 뜻한다.*/
commit;
/*DML ==> INSERT or UPDATE or DELETE */
/*수정을 위한 키워드는 UPDATE.*/
/*UPDATE t/n*/
/*SET c/n = value*/
/*WHERE 조건;*/
=================================
select*from emp_test;
update emp_test
/*수정할 데이터를 SET 키워드를 통해 값 수정*/
set id = 7
/*위치를 찾기위해 WHERE 키워드를통해 c/n과 value값 설*/
where name = 'scott';
select*from emp_test;
rollback
select*from emp_test;
==============================
==========================
update emp_test
set id = 7
where name = 'scott';
select*from emp_test;
commit;
==========실전예제=========
1. 홍길순 :: 사장 / 2000 / 영업팀으로 변경
UPDATE ex_test
SET title = '사장', salary = 2000, dept_name = '영업팀'
/*WHERE 절을 사용하여 조건을걸어 해당 c/n만 수정*/
WHERE name = '홍길순';
2. 월급이 1500이상인 직원 dept_name '대기발령' 변경
UPDATE ex_test
SET dept_name = '대기발령'
/*WHERE절에는 >= <=와 같은 연산자 사용 가*/
WHERE salary >= 1500;
3. 전직원 직급 '평사원' 변경 ==> 변경후 롤백
(WHERE 절이 없다면?? 전체적용)
UPDATE ex_test
SET dept_name = '평사원'
4. 전직원 임금인상 500 ==> 변경후 commit
UPDATE ex_test
SET salary = salary + 500
WHERE salary IS NOT NULL;
/*WHERE 절에서 NULL 판별은 IS와 IS NOT 사용*/
5. 부서명 없는 직원 대기발령 ==> 변경후 COMMIT
UPDATE ex_test
SET dept_name = '대기발령'
WHERE dept_name IS NULL;
/*DELETE 연습*/
/*DELETE에도 WHERE절을 사용하여 조건 가능*/
/*WHERE은 IS, IS NOT, 연산자 외에도 AND와 OR 연산자로 조건 가*/
delete from ex_test
/*delete ex_test 과 같이 FROM 생략가능 */
where title = '장군';
select * from ex_test;
commit;
----------------------------------
delete from ex_test
where id >= 6;
select * from ex_test;
rollback;
select * from ex_test;
----------------------------------
delete from ex_test
where id >= 5 and id <= 6;
select * from ex_test;
rollback;
select * from ex_test;
delete from ex_test
where id = 5 or id = 6;
select * from ex_test;
commit;
select * from ex_test;
----------------------------------
delete from ex_test
where id = 2 or id = 3;
select * from ex_test;
rollback;
select * from ex_test;
delete from ex_test
where id = 2 and id = 3;
----------------------------------
delete from ex_test;
select * from ex_test;
rollback;
select * from ex_test;
//주석문 사용, 이해, /* commit */
select
/*기존의 *를 사용하여 전체를 출력하기보다*/
/*c/n을 따로 지정하여 출력할 수 있다.*/
id, name
from ex_test;
select
name, id
from ex_test;
----------------------------------
select
/*c/n에 연산자를 추가하여 연산가능하다.*/
name, salary, salary*12
from ex_test;
----------------------------------
select
/*c/n AS 사용자지정문구를 사용하여 c/n의 표시이름을 바꿀수있다.*/
name AS 이름, salary AS 월급, salary*12 AS 연봉
from ex_test;
----------------------------------
select
/*AS는 생략이 가능하지만 명시성을위해 써주도록한다.*/
name 이름, salary 월급, salary*12 연봉
from ex_test;
----------------------------------
select
/*AS를 사용하여 이름을 지정할때 띄워쓰기, 특수문자를 쓰려면 더블쿼티 ""를 사용한다.*/
name 이름, salary 월급, salary*12 "연봉 (성과급 제외)"
from ex_test;
/*KEYWORD ::NVL / NVL2 / DECODE */
/*sql에서는 NULL값이 표시가 되지않는다.*/
/*이를 표시하기위해 NVL, NVL2, DECODE를 사용한다*/
/*NVL(c/n, 표시값) NVL2(c/n, NULL이 아니면, NULL이면 표시할값)*/
/*DECODE(c/n,
NULL, 표시할값, /*==>c/n이 NULL이면 표시할값출력*/
'value', '표시할값' /*c/n이 value와 같다면 표시할 값출력*/
'표시할값' /*==>NULL이 아니면 표시할 값출력*/
)*/
select
name, NVL(salary, 0)
from ex_test;
----------------------------------
select
name, NVL2(salary, salary, 0), NVL(salary, 0)
from ex_test;
select
name, NVL2(salary, salary*12, 0), NVL(salary*12, 0)
from ex_test;
select
name, NVL2(title, title, '<직급없음>'), NVL(title, '<직급없음>'),
NVL2(title, '<직급있음>', '<직급없음>')
from ex_test;
----------------------------------
select
name, decode(title,
NULL, '<직급없음>', /* if(title == null) <직급없음> */
'직급있음') /* else 아니면 직급있음 */
from ex_test;
select
name, decode(title,
NULL, '<직급없음>', /* if(title == null) <직급없음> */
'사장', '회사의 아버지', /* else if(title == '사장') 회사의 아버지 */
'부사장', '회사의 어머니', /* else if(title == '부사장') 회사의 어머니 */
'직급있음'), title /* else 아니면 직급있음 */
from ex_test;
/*KEYWORD :: ORDER BY / NULLS FIRST / NULLS LAST / ASC / DESC */
/*ORDER BY keyword를 사용하여 오름차순(ACS), 내림차순(DESC)로 sorting가능*/
/*ORDER BY의 DEFAULT 값은 오름차순(ACS)*/
SELECT
name 이름, salary*12 연봉
FROM ex_test
/*ORDER BY키워드를 사용하여 오름차순정렬인데 NULLS값을 먼저쓴다.*/
ORDER BY salary*12 ASC NULLS FIRST;
SELECT
name 이름, salary*12 연봉
FROM ex_test
/*ORDER BY키워드를 사용하여 내림차순정렬인데 NULLS값을 마지막에 쓴다.*/
ORDER BY salary*12 DESC NULLS LAST;
//=================================================
/*ORDER BY에는 연산이 와도 상관없으며 데이터에 존재하면 언제든 사용가능*/
/*ORDER BY에는 SELECT에서 선택한 순서, AS, c/n으로도 정렬가능*/
SELECT
name 이름, salary*12 연봉
FROM ex_test
ORDER BY salary*12;
SELECT
name 이름, salary*12 연봉
FROM ex_test
ORDER BY salary;
SELECT
name 이름, salary*12 연봉
FROM ex_test
ORDER BY 연봉;
SELECT
name 이름, salary*12 연봉
FROM ex_test
/*ORDER BY 1일경우 name, 2일경우 연봉 순으로 정렬*/
ORDER BY 1;
/////////////////////////////////////////////////////////////////////////////////////////
SELECT
name 이름, salary*12 연봉, dept_name 부서
FROM ex_test
ORDER BY dept_name;
SELECT
name 이름, salary*12 연봉
FROM ex_test
ORDER BY dept_name;
/////////////////////////////////////////////////////////////////////////////////////////
SELECT
name 이름, salary*12 연봉, dept_name 부서
FROM ex_test
ORDER BY salary;
SELECT
name 이름, salary*12 연봉, dept_name 부서
FROM ex_test
/*연봉을 오름차순 기준으로 부서명을 정렬하겠*/
ORDER BY salary, 부서;
SELECT
name 이름, salary*12 연봉, dept_name 부서
FROM ex_test
ORDER BY 부서, salary;
/////////////////////////////////////////////////////////////////////////////////////////
/*KEYWORD :: DISTINCT / || */
/*DISTINCT는 중복된 데이터를 제거*/
/*||파이프 CONCATENATION 사용으로 중간에 원하는 문자 추가 가능 */
//=================================================
1. KEYWORD :: || CONCATENATION (COLUMN 합성)
SELECT
name||title
FROM ex_test;
SELECT
name||' '||title
FROM ex_test;
//=================================================
1. KEYWORD :: || DISTINCT 중복된 행들 제거
SELECT dept_name 부서 FROM ex_test;
SELECT
DISTINCT dept_name 부서명
FROM ex_test;
SELECT
DISTINCT dept_name,name
FROM ex_test;
//////////////////////////////////////////////////////////////////////////////////////////
INSERT
INTO ex_test(name,dept_name)
VALUES('홍길동','관리부');
SELECT
dept_name, name
FROM ex_test;
SELECT
DISTINCT dept_name, name
FROM ex_test;
ROLLBACK;
//////////////////////////////////////////////////////////////////////////////////////////
/*KEYWORD :: ROUND / TRUNC */
1. 이름,부서,직책,입사일 조회(ALIAS 사용)
//AS를 사용하여 c/n의 가독성을 향상시킬 수 있다.
SELECT
name AS 이름, dept_name AS 부서, title AS 직책, in_date AS 입사일
FROM emp_test;
2. 이름,직책,연봉,특별 상여금 조회(ALIAS 사용)
(상여금은 연봉의 15%로 계산)
>>> QUERY 하나
NULL은 연산에서 제외(?) NULL은 어떻게 추출되는지 확인
>>> QUERY 둘
직책 NULL 인 경우 ==> 인사발령전
연봉 NULL 인경우 ==> 0
상여금 NULL 인경우 ==> 0
출력되도록 Query 변경
SELECT
name AS 이름, NVL(title,'인사발령전') AS 직책, NVL(salary*12, 0) AS 연봉, NVL(salary*12*0.15,0) AS 상여금
FROM emp_test;
3. 이름,월급,일당,시급을 조회(ALIAS 사용)
(일당 :30일, 시급 : 8시간 기준)
SELECT
name AS 이름, NVL(salary, 0) AS 월급, NVL(salary/30,0) AS 일당, NVL(salary/30/8,0) AS 시급
FROM emp_test;
4.위의 QUERY문을 아래의 함수를 사용하여 정리 추출(ALIAS 사용)
==> 반올림함수 ROUND(VALUE, 반올림자리수)
==> 버림 함수 TRUNC (VALUE, 버림자리수)
//ROUND의 반올림자리수가 0이면 소수 첫번째자리에서 반올림
//반올림자리수가 1이면 소수 2번째자리에서 반올림. 즉, 숫자만큼 소수자리가 출력
//TRUNC의 버림자리수에 1이들어가면 첫번째 소수를 남기고 나머지 버림
SELECT
name AS 이름, NVL(salary, 0) AS 월급, NVL(ROUND(salary/30,0),0) AS 일당, NVL(TRUNC(salary/30/8,0),0) AS 시급
FROM emp_test;
5. 위의 QUERY문(ROUND,TRUNC 사용한 것) 월급,일당,시급 NULL은 0 추출
SELECT
name AS 이름, NVL(salary, 0) AS 월급, NVL(ROUND(salary/30,0),0) AS 일당, NVL(TRUNC(salary/30/8,0),0) AS 시급
FROM emp_test;
/*KEYWORD :: ROUND / TRUNC */
1. || 사용 홍길동 님은 관리부에서 근무함 형식으로 출력
SELECT
//파이프라인이 마지막에올경우 생략.
name||' 님은 '||dept_name||'에서 근무함'
FROM emp_test
WHERE name = '홍길동';
2. || 사용 아래와 같이 출력 (ALIAS사용)
이름 직책 연봉 ?
------------------------------------------------------------------
김사장 님 사장이며 연봉은 7200 원
홍길동 님 부사장이며 연봉은 18000 원
홍길순 님 사장이며 연봉은 30000 원
김유신111 님 대리11이며 연봉은 13332 원
SCOTT 님 부사장이며 연봉은 18000 원
김유신222 님 대리22이며 연봉은 26664 원
333김유신 님 33대리이며 연봉은 39996 원
444김유신 님 44대리이며 연봉은 53328 원
이순신555 님 부장이며 연봉은 66660 원
이순신666 님 이며 연봉은 79992 원
주몽777 님 이며 연봉은 93324 원
평민888 님 대리이며 연봉은 0 원
한국990 님 이며 연봉은 119880 원
꺽다리991 님 이며 연봉은 0 원
짠돌이992 님 과장이며 연봉은 119904 원
15 개의 행이 선택되었습니다.
//파이프라인으로 작성하게되면 ALIAS는 하나만 쓸수있다.
SELECT
name||' 님은 '||title||'이며 연봉은'||salary*12||' 원'
FROM emp_test;
//==============================================//
//=================== 실 습 2 ===================//
//==============================================//
1. 개발부서의 김사장입니다 형식조회 (오름차순으로 정렬)
SELECT
dept_name||'의 '||name||'입니다'
FROM emp_test
ORDER BY name;
2. 부서별/연봉이 높은 순서 이름/부서/연봉 조회
SELECT
name AS 이름, dept_name AS 부서, salary*12 AS 연봉
FROM emp_test
ORDER BY dept_name, salary ASC;
3. 연봉이 높은순서, 입사연도가 빠른순서 연봉/입사년도/이름 조회
SELECT
salary*12 AS 연봉, in_date AS 입사년도 ,name AS 이름
FROM emp_test
ORDER BY salary ASC, in_date DESC ;
/*KEYWORD :: DISTINCT / LIKE / BETWEEN */
1. 직책 종류 조회(DISTINCT 사용)
SELECT
title
//DISTINCT는 행을 따로두어 중복을 제외하는 기능을 한다.
DISTINCT
FROM emp_test;
2. 2001년 입사자 이름, 직책, 입사일 조회
( 1번째 QUERY는 LIKE사용
2번째 QUERY는 BETWEEN사용 )
SELECT
name, title, in_date
FROM emp_test
//LIKE는 싱클쿼티션 안쪽 문자를 조건으로한다
//_는 _의 갯수만큼의 문자전부 해당, %는 이후에 나오는 모든 문자 해당
WHERE in_date LIKE '01%';
SELECT
name, title, in_date
FROM emp_test
WHERE in_date BETWEEN '01/01/01' AND '01-12-31';
3. 임금이 NULL인 사원의 모든 정보 입사일 오름차순 조회
SELECT
*
FROM emp_test
//NULL은 = 또는 IN을 사용안하며 IS 또는 IS NOT을 사용한다.
WHERE salary IS NULL
ORDER BY in_date ASC;
4. 관리부에서 급여가 6000이상 인 사람 이름/급여/부서 조회
SELECT
name, salary, dept_name
FROM emp_test
WHERE salary >=6000 AND dept_name = '관리부';
/*KEYWORD :: HAVING/ COUNT, AVG, SUM) */
1. 부서명 / 부서salary 평균 / 합 /인원수 조회 (부서명 null / 대기발령 제외)
SELECT
dept_name AS 부서명, AVG(salary) AS "부서salary 평균", SUM(salary) AS 합, COUNT(name) AS 인원수
FROM emp_test
WHERE dept_name IS NOT NULL AND dept_name <> '대기발령'
//그룹화는 기준이되는 컬럼을 잘 선택해야한다.
//1대n의 문제가 발생하면 어떤것을 그룹화 해야하는지 생각해보자
//여기서는 연산함수를 이용해 값을 하나로 만들었는데 그에해당하는 부서가 여러개이기때문에
//부서를 하나로 만들어 줄 필요가있다.
GROUP BY dept_name;
2. 부서명 / 부서salary 평균 / 합 /인원수 조회 (부서명 null / 대기발령 제외)
==> 인원수가 5이상만 출력
SELECT
dept_name AS 부서명, AVG(salary) AS "부서salary 평균", SUM(salary) AS 합, COUNT(name) AS 인원수
FROM emp_test
WHERE dept_name IS NOT NULL AND dept_name <> '대기발령'
GROUP BY dept_name
//HAVING 키워드를 사용하여 그룹화에 조건을 걸 수 있다.
HAVING COUNT(name)>=5;
3. 부서명 / 부서salary 평균 / 합 /인원수 조회 (부서명 null / 대기발령 제외)
==> 인원수가 5이상만 출력
==> 평균급여가 5000이상
SELECT
dept_name AS 부서명, AVG(salary) AS "부서salary 평균", SUM(salary) AS 합, COUNT(name) AS 인원수
FROM emp_test
WHERE dept_name IS NOT NULL AND dept_name <> '대기발령'
GROUP BY dept_name
HAVING COUNT(name)>=5 AND AVG(salary)>=5000;
//==============================================
# DDL :: CREATE : 제약조건(CONSTRAINT) 이해, 활용
//================================================//
//==> 1. CREATE : TABLE 생성시 제약조건을 주어 개체무결성 유지
: TABLE 에 결함이 없는 Data 입력 받을 수 있다
CREATE TABLE emp_test01(
id NUMBER(3) CONSTRAINT emp_test01_id_pk PRIMARY KEY,
name VARCHAR2(12) CONSTRAINT emp_test01_name_nn NOT NULL,
salary NUMBER(7,2) CONSTRAINT emp_test01_salary_ch CHECK (SALARY >=1000),
title VARCHAR2(15) DEFAULT '사원',
in_date DATE DEFAULT SYSDATE,
dept_name VARCHAR2(15)
);
//================================================//
//==> RECORD 입력 , 저장, 확인
INSERT
INTO emp_test01
VALUES(1 , '홍길동' , 2000 , '부장' , SYSDATE , '총무부' );
COMMIT;
SELECt * FROM emp_test01;
==> 무결성 제약조건에 위배되는 RECORD 입력 :: ERROR 확인
INSERT
INTO emp_test01
VALUES(1 , '홍길동' , 2000 , '부장' , SYSDATE , '총무부' );
INSERT
INTO emp_test01
VALUES( 2 , NULL , 3000, '사원' , SYSDATE , '총무부' );
INSERT
INTO emp_test01
VALUES(2,'홍길동',500,'사원',SYSDATE,'총무부');
//========================================================//
//==> JOIN : 하나 이상의 테이블로 부터 연관된 Data 조회
4가지 경우 : EQUI JOIN / NON-EQUI JOIN / SELF JOIN / OUTER JOIN
//========================================================//
//==> 1. EQUI JOIN : PK 와 FK로 관계의 무결성 보장 필요
//==> c_emp table 생성
CREATE TABLE c_emp(
id NUMBER(5) CONSTRAINT c_emp_id_pk PRIMARY KEY,
name CHAR(15) CONSTRAINT c_emp_name_nn NOT NULL,
salary NUMBER(7,2),
phone CHAR(15) CONSTRAINT c_emp_phone_ch CHECK(phone LIKE '3429-%'),
dept_id NUMBER(7) CONSTRAINT c_emp_s_dept_id_fk REFERENCES s_dept( id )
);
==> c_emp table 생성시 ERROR 발생 ???
//==> s_dept table 생성
CREATE TABLE s_dept(
id NUMBER(7) CONSTRAINT s_dept_id_pk PRIMARY KEY,
dept_name VARCHAR2(12) CONSTRAINT c_dept_name_uk UNIQUE
);
==> RECORD 입력
INSERT INTO c_emp VALUES(101,'김사장',1000,'3429-0001',1);
//==> ERROR 발생 ???
DELETE FROM s_dept;
INSERT INTO s_dept VALUES (1,'총무부');
INSERT INTO s_dept VALUES (2,'개발부');
INSERT INTO s_dept VALUES (3,'영업부');
INSERT INTO s_dept VALUES (4,'인사부');
INSERT INTO s_dept VALUES (5,'자재부');
INSERT INTO s_dept VALUES (6,'회계부');
COMMIT;
DELETE FROM c_emp;
INSERT INTO c_emp VALUES(101,'김사장',1000,'3429-0001',1);
INSERT INTO c_emp VALUES(102,'홍길동',2000,'3429-0002',1);
INSERT INTO c_emp VALUES(103,'홍길순',3000,'3429-0003',1);
INSERT INTO c_emp VALUES(104,'이순신',4000,'3429-0004',2);
INSERT INTO c_emp VALUES(105,'강감찬',5000,'3429-0005',2);
INSERT INTO c_emp VALUES(106,'류시원',1100,'3429-0006',2);
INSERT INTO c_emp VALUES(107,'이문세',1200,'3429-0007',3);
INSERT INTO c_emp VALUES(108,'강호동',1300,'3429-0008',3);
INSERT INTO c_emp VALUES(109,'강문영',1400,'3429-0009',3);
INSERT INTO c_emp VALUES(110,'추현재',1500,'3429-0010',4);
INSERT INTO c_emp VALUES(111,'박상민',2500,'3429-0011',4);
INSERT INTO c_emp VALUES(112,'박상면',3500,'3429-0012',4);
INSERT INTO c_emp VALUES(113,'유재석',4500,'3429-0013',5);
INSERT INTO c_emp VALUES(114,'노무현',5500,'3429-0014',5);
INSERT INTO c_emp VALUES(115,'전두환',1000,'3429-0015',5);
INSERT INTO c_emp VALUES(116,'김일성',2000,'3429-0016',6);
INSERT INTO c_emp VALUES(117,'김정일',3000,'3429-0017',6);
COMMIT;
JOIN::EQUI ~ JOIN :: 이름 부서번호,부서명조회
SELECT
c_emp.name, c_emp.dept_id, s_dept.id, s_dept.dept_name
FROM c_emp, s_dept
WHERE c_emp.dept_id = s_dept.id AND s_dept.dept_name IN('총무부');
SELECT
c.name, c.dept_id, s.id, s.dept_name
FROM c_emp c, s_dept s
WHERE c.dept_id = s.id AND s.dept_name IN('총무부');
//==============================================//
//================== 실 습 1 ====================//
//==============================================//
부서 s 연봉 c
1. 김씨성 직원의 이름 / 부서명 /연봉 조회
==> 연봉: \250,000 형식 , 연봉높은순
SELECT
name 이름, dept_name 부서명, TO_CHAR(salary*12, 'L999,999') 연봉
FROM c_emp c
INNER JOIN s_dept s ON c.dept_id = s.id
WHERE name LIKE '김%'
ORDER BY salary*12 ASC;
2. 월급이 2000이상 직원 부서명 / 이름 /일당 조회
==> 부서별 :: 오름차순
==> 이 름 :: 오름차순
==> 일 당 :: 30일기준, 소수점 0자리 버림, \250,000형식, 높은순
SELECT
dept_name 부서명, name 이름, TO_CHAR(TRUNC(salary/30,0),'L999,999') 일당
FROM c_emp c
INNER JOIN s_dept s ON c.dept_id = s.id
WHERE salary >= 2000
ORDER BY dept_name , name, salary/30;
3. 부서별 평균 월급 부서번호/부서명/평균월급 조회
==> 부서번호 :: 오름차순
SELECT
c.dept_id 부서번호, s.dept_name, AVG(c.salary)
FROM c_emp c
INNER JOIN s_dept s ON s.id = c.dept_id
GROUP BY c.dept_id, s.dept_name
ORDER BY c.dept_id;
4. 총무부 평균 월급 부서번호/부서명/평균월급 조회
SELECT
c.dept_id 부서번호, s.dept_name, AVG(c.salary)
FROM c_emp c
INNER JOIN s_dept s ON s.id = c.dept_id
WHERE s.dept_name IN('총무부')
GROUP BY c.dept_id, s.dept_name
ORDER BY c.dept_id;