SQL Basic

투민·2023년 8월 26일
post-thumbnail

SQL(Structured Query Language)

관계형 데이터베이스 관리 시스템(RDBMS)의 데이터를 관리하기 위해 설계된 특수 목적의 프로그래밍 언어

  • 단어장
    • DDL(Data Definition Language)
      • 데이터 구조 정의
    • DML(Data Manipulation Language)
      • 데이터 검색과 수정 등의 처리
    • DCL(Data Control Language)
      • 데이터베이스 사용자의 권한을 제어
    • Persistance Data
      • 영구적인 데이터
      • 영구적인 데이터는 Java.io로 관리하기 힘듦
      • 가장 신뢰성있는 DBMS인 oracle사용
      • 다른 DBMS를 써도 상관없다. SQL을 구현했기때문이다.
    • table( = Entity)
      • DB의 기본단위
      • 2차원 구조의 Data 저장소
      • Column, Row, Cell로 이루어져있다.
    • RDBMS(Relational DBMS)
      • 관계형 데이터베이스를 만들고 업데이트하고 관리하는 데 사용하는 프로그램
    • Row( = Record)
      • table의 행
      • value가 들어간다
    • Colums( = Data Type)
      • 이름, 부서와 같이 data type이 들어간다
    • Cell( = Field)
      • value와 data type이 교차하는 field이다
    • TCL(Transaction Control Language)
      • 데이터베이스에서 논리적인 작업 단위를 구성하는 세부적인 연산들의 집합을 의미한다
    • EXPRESSION
      • SQL에서 *, +, -과같은 산술식
    • 3rd part 라이벌

SQL KEY WORD

  1. 조회 / 검색(Query)
  • SELECT
  1. 입력

    수정

    삭제

  • INSERT
  • UPDATE
  • DELETE(Field 삭제)
  1. 생성

    삭제

    수정

  • CREATE

  • DROP(table 삭제)

  • ALTER

  • Transaction Control Language

  1. 저장

    취소

  • COMMIT
  • ROLLBAK
  1. 권한부여(추가예정)

PLSQL(오라클만의 sql명령어)

  1. 가로 라인 늘리기
  2. 테이블 디스플레이 세로확장
  • set linesize 숫자
  • set pagesize 숫자

DDL

/*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

/*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;
//////////////////////////////////////////////////////////////////////////////////////////

실습을 통한 개념 정리1

/*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 사용한 것) 월급,일당,시급 NULL0 추출

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;

실습을 통한 개념 정리2

/*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이며 연봉은 26664333김유신 님 33대리이며 연봉은 39996444김유신 님 44대리이며 연봉은 53328 원   
이순신555 님 부장이며 연봉은 66660 원 
이순신666 님 이며 연봉은 79992 원 
주몽777 님 이며 연봉은 93324 원   
평민888 님 대리이며 연봉은 0 원
한국990 님 이며 연봉은 119880 원
꺽다리991 님 이며 연봉은 0 원 
짠돌이992 님 과장이며 연봉은 11990415 개의 행이 선택되었습니다.
//파이프라인으로 작성하게되면 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 ;

실습을 통한 개념 정리3

/*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 = '관리부';

실습을 통한 개념 정리4

/*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;

실습을 통한 개념 정리5

//==============================================
# 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,'총무부');

실습을 통한 개념 정리6

//========================================================//
//==> 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;
profile
DevSecOps가 미래다

0개의 댓글