23. SQL develop

hanahana·2022년 7월 30일
0

Oracle - 학원수강

목록 보기
4/11
post-thumbnail

표를 만들고 다른 계정에서 열람하기

Create table coffee(
prodoct_name varchar2(20),
price number,
company varchar2(20));

insert into coffee values('맥심커피',30000,'MAXIM');
insert into coffee (prodoct_name, price, company)
values ('카누커피',50000,'MAXIM');
insert into coffee values ('네스카페',40000,'NESCAFE');

select * from coffee;

commit; //반드시 커밋이 필요함!! 그래야 표가 저장됨

아이디 권한 주기

  • 관리자 창에서 다른 아이디에게 권한을 준다
grant select on 표만든아이디.coffee to 권한줄아이디;
grant insert on 표만든아이디.coffee to 권한줄아이디;
  • 이제 권한받은 아이디에서 표를 열람하고 추가할수있다.
select * from 표만든아이디.coffee;
insert into 표만든아이디.coffee values('프렌치카페',10000,'남양유업');
commit;

데이터 추가 삭제하기

insert into 표이름 values(900,'장채현', '901123-2000000','jang_ch@aa.co.kr','01000009512','D1','J8','S3',430000,
0.2,'200',sysdate,null,default);
 //표에 데이터 추가

delete from 표이름
where 데이터가추가된컬럼명 = '장채현';
//이러면 입력한 데이터가 있는 행만 삭제된다

원하는 데이터를 구성하기

  • 사람이름, 월급만 있는 데이터에 연봉을 추가해서 표를 구성해보자
  • 실제 표가 변경되는것은 아니다.
select emp_name, salary , salary*12 as "연봉",'원' "단위"
from employee;

selcet 출력할표의칼럼,칼럼*12한값 as “출력할카테고리의이름”

으로 할수있다.

표에는 연봉과 단위는 존재하지 않지만 select로 임시로 구성한것이다

예제를 통한 활용해보기

-- 1. JOB테이블에서 JOB_NAME의 정보만 출력되도록 하시오

select job_name from job;

-- 2. DEPARTMENT테이블의 내용 전체를 출력하는 SELECT문을 작성하시오

select * from department;

-- 3. EMPLOYEE 테이블에서 이름(EMP_NAME),이메일(EMAIL),
-- 전화번호(PHONE),고용일(HIRE_DATE)만 출력하시오

select emp_name,email,phone,hire_date from employee;

-- 4. EMPLOYEE 테이블에서 고용일(HIRE_DATE) 이름(EMP_NAME),월급(SALARY)를 출력하시오

select hire_date, emp_name,salary from employee;

-- 5. EMPLOYEE 테이블에서 월급(SALARY)이 2,500,000원이상인 사람의 
-- EMP_NAME 과 SAL_LEVEL을 출력하시오 

select  emp_name, sal_level from employee
where salary>=2500000;

-- (힌트 : >(크다) , <(작다) 를 이용)
-- (힌트 : AND(그리고) , OR (또는))

-- 6. EMPLOYEE 테이블에서 월급(SALARY)이 350만원 이상이면서 
-- JOB_CODE가 'J3' 인 사람의 
-- 이름(EMP_NAME)과 전화번호(PHONE)를 출력하시오
-- (힌트 : AND(그리고) , OR (또는))

SELECT emp_name, phone from EMPLOYEE
where job_code='J3' and salary >= 3500000;
-- 간단 실습 문제
--1. EMPLOYEE 테이블에서 이름,연봉, 총수령액(보너스포함), 
-- 실수령액(총 수령액-(월급*세금 3%*12))
--가 출력되도록 하시오

select emp_name "이름", salary*12 as "연봉", salary*bonus+salary*12 "총수령액(보너스포함)",
salary*bonus+salary*12-(salary*0.03*12) "실수령액"
from employee;

--2. EMPLOYEE 테이블에서 이름, 근무 일수를 출력해보시오 
--(SYSDATE를 사용하면 현재 시간 출력)
select hire_date, ent_date, ent_yn from employee;

select emp_name "이름" ,Sysdate - hire_date "근무일수", (Sysdate - hire_date)/365 "근속연수"
from employee;
 

--3. EMPLOYEE 테이블에서 20년 이상 근속자의 이름,월급,보너스율를 출력하시오.
select emp_name "이름" ,salary "월급", bonus "보너스율"
from employee
where (Sysdate - hire_date)/365 >= 20;

DISTINCT

컬럼에 포함된 중복 값을 한번씩만 표시하고자 할 때 사용


SELECT DISTINCT JOB_CODE FROM EMPLOYEE;

-- 논리연산자(AND, OR)
-- 부서코드가 D6이고 급여를 2,000,000보다 많이 받는 
-- 사원의 이름, 부서코드, 급여를 조회하시오.
SELECT EMP_NAME, DEPT_CODE, SALARY
FROM EMPLOYEE
WHERE DEPT_CODE = 'D6' AND SALARY > 2000000;

-- 부서코드가 D5 또는 급여를 3,000,000보다 많이 받는 
-- 사원의 이름, 부서코드, 급여를 조회하시오
SELECT EMP_NAME, DEPT_CODE, SALARY
FROM EMPLOYEE
WHERE DEPT_CODE = 'D5' OR SALARY > 3000000;

연결 연산자(||)

-- 여러 컬럼을 하나의 컬럼인 것 처럼 연결하거나 컬럼과 리터럴 연결

SELECT EMP_NAME||DEPT_CODE "EMP_NAME", SALARY || '원' "SALARY"
FROM EMPLOYEE;

비교연산자

  • 비교연산자 ( >, >=, <, <=, .... )
  • BETWEEN A AND B ( A이상 B이하 )
    • WHERE SALARY BETWEEN 3500000 AND 6000000;
    • salry의 350000이상과 600000이하의 값이란뜻

-- 급여를 3500000원 이상 받고 6000000원 이하로 받는 직원의 이름과 급여
-- 조회하시오
SELECT EMP_NAME, SALARY
FROM EMPLOYEE
--WHERE SALARY >= 3500000 AND SALARY <= 6000000;
WHERE SALARY BETWEEN 3500000 AND 6000000;

-- BETWEEN AND
-- EMPLOYEE 테이블에서 고용일이 90/01/01 ~ 01/01/01인 사원의
-- 전체 내용을 출력하시오
SELECT * FROM EMPLOYEE
WHERE HIRE_DATE BETWEEN '90/01/01' AND '01/01/01';

-- 비교 연산자(LIKE)
-- 비교하려는 값이 지정한 특정패턴을 만족시키면 TRUE를 리턴하는 연산자로
-- '%'와 '_'를 와일드카드로 사용할 수 있음
-- *와일드 카드 : 아무 문자나 대체해서 사용할 수 있는 것
SELECT EMP_NAME, SALARY
FROM EMPLOYEE
WHERE EMP_NAME LIKE '이%'; -- 이, 이설, 이태리, 이태리바게트, 이것이자바다

SELECT EMP_NAME, SALARY
FROM EMPLOYEE
WHERE EMP_NAME LIKE '%전%'; -- 전, 1전, 1전2, 11전태일, 1232전봇대333, 

SELECT EMP_NAME, SALARY
FROM EMPLOYEE
WHERE EMP_NAME NOT LIKE '전%';

SELECT EMP_NAME, SALARY
FROM EMPLOYEE
WHERE EMP_NAME LIKE '전__'; -- 전자신문 (x), 전형돈, 전지연, 전도연, ...
-- 실습문제
--1. EMPLOYEE 테이블에서 이름 끝이 연으로 끝나는 사원의 이름을 출력하시오
SELECT EMP_NAME FROM EMPLOYEE WHERE EMP_NAME LIKE '__연'; -- %연
--2. EMPLOYEE 테이블에서 전화번호 처음 3자리가 010이 아닌 사원의 이름, 전화번호를
--출력하시오
SELECT EMP_NAME, PHONE FROM EMPLOYEE
WHERE PHONE NOT LIKE '010%';
--3. EMPLOYEE 테이블에서 메일주소의 's'가 들어가면서, DEPT_CODE가 D9 또는 D6이고
--고용일이 90/01/01 ~ 01/12/01이면서, 월급이 270만원이상인 사원의 전체 정보를 출력하시오
SELECT * FROM EMPLOYEE
WHERE EMAIL LIKE '%s%' AND (DEPT_CODE = 'D9' OR DEPT_CODE = 'D6')
AND HIRE_DATE BETWEEN '90/01/01' AND '01/12/01' AND SALARY >= 2700000;

--4. EMPLOYEE 테이블에서 EMAIL ID 중 @ 앞자리가 5자리인 직원을 조회한다면?
SELECT * FROM EMPLOYEE WHERE EMAIL LIKE '_____@%';
--5. EMPLOYEE 테이블에서 EMAIL ID 중 '_' 앞자리가 3자리인 직원을 조회한다면?
SELECT * FROM EMPLOYEE WHERE EMAIL LIKE '___#_%' ESCAPE '#';

-- 비교 연산자 ( IN )
-- 비교하려는 값 목록에 일치하는 값이 있으면 TRUE를 반환하는 연산자
-- EMPLOYEE 테이블에서 DEPT_CODE가 D9 또는 D6인 직원의 이름, 급여를 출력
-- 하시오.
SELECT EMP_NAME, SALARY FROM EMPLOYEE
--WHERE DEPT_CODE = 'D9' OR DEPT_CODE = 'D6';
WHERE DEPT_CODE IN ('D9', 'D6'); -- OR를 대체할 수 있음

-- 비교 연산자 ( IS NULL / IS NOT NULL )
-- NULL 여부를 비교하는 연산자
SELECT BONUS, MANAGER_ID
FROM EMPLOYEE
WHERE BONUS IS NOT NULL;

-- 1. 관리자(MANAGER_ID)도 없고 부서 배치(DEPT_CODE)도 받지 않은 직원의 이름 조회
SELECT EMP_NAME FROM EMPLOYEE
WHERE MANAGER_ID IS NULL AND DEPT_CODE IS NULL;
-- 2. 부서배치를 받지 않았지만 보너스를 지급하는 직원 전체 정보 조회
SELECT * FROM EMPLOYEE
WHERE DEPT_CODE IS NULL AND BONUS IS NOT NULL;

정렬 ORDER BY

  • SELECT한 컬럼에 대해 정렬을 할 때 사용하는 구문
    SELECT 구문의 가장 마지막에 작성(☆) 실행순서도 가장 마지막에 수행됨
    ASC : 오름차순 정렬, DESC : 내림차순 정렬
    DATE 옛날 -> 최신 최신 -> 옛날
    NULL NULL값이 아래로 NULL값이 위로
SELECT EMP_NAME, SALARY, HIRE_DATE, BONUS FROM EMPLOYEE
ORDER BY BONUS DESC;
  • SELECT 실행 순서
    FROM - WHERE - (GROUP BY - HAVING) - SELECT - ORDER BY
profile
hello world

0개의 댓글