DBMS SQL ( Structured Query Language) 1
빅데이터 : 수학 / 개발 / DB
Database 파트
Database란 프로그램에 필요한 데이터를 저장하는 파일
DBMS : Database 파일의 안정성, 보안성, 성능효율 등을 책임지고 관리하는 솔루션
* SQL 명령어를 통해 데이터를 관리
- DDL : ( DB상의 객체를 제어하는 명령어 ) : Create / Alter / Drop
- DML : ( DB상의 데이터를 제어하는 명령어 ) : Insert / Delete / Update / Select
- DQL : ( 비표준문법 ) : Select
- DCL : ( DB상의 User 객체의 권한을 제어하는 명령어 ) : Grant / Revoke
- TCL : ( DB상의 Transaction 을 제어하는 명령어 ) : Commit / Rollback / Savepoint
Select : 데이터를 추려내겠다. 그런데 어떤 항목인데 ?
from : ~에서
Where절 : 조건을 추가하자 and, or
as : 엘리어스 별명, 컬럼명이 딱 떨어지지않는 경우에 사용.
sysdate : 현재 시각, 날짜
날짜끼리는 뺄셈 연산만 가능하다. 날짜의 대소비교도 가능하다. between 가능
문자일때는 싱글쿼테이션
문자는 is, is not 사용해서 비교
Oracle Sql Developer
DBMS에 명령어를 적어서 넘기는 역할을 하는 프로그램
Query문 (요청문)
* 관리자에서 계정 생성하는 방법(앞은 아이디, 뒤는 패스워드)
create user cafe identified by cafe;
* 계정 연결 및 리소스 권한 부여 방법
grant connect, resource to cafe;
실행할 라인에 커서 두고 ctrl + enter 누르면 실행 된다.
SQL ( Structured Query Language)
- 소프트웨어 개발자 기본기 문법
- 객체를 건드리는 문법 : DDL 문 (Data Definition Language) : create(만들기), drop(지우기), alter(수정)
- 데이터를 건드리는 문법 : DML 문 (Data Manipulation Language) : update, delete, insert, select
→ DQL 문 (Data Query Language) : select - 권한 통제 : DCL 문 (Data Control Language) : grant(권한부여), revoke(권한뺏기)
- 데이터 조작 : TCL 문 (Transaction Control Language) : rollback, commit, savepoint
- column 열
- record, row 행 (3행시, 4행시 생각)
객체를 만드는 create / 테이블 인스턴스를 만들겠다.
create table cafe_menu(
id number ,
name varchar(20),
price number
);
- 3개의 record로 만들어져있다. 3개가 합쳐져져서 하나의 메뉴
- 이름 / 자료형 쓰기(varchar에는 문자 개수()까지 작성)
- cafe menu 테이블 안에 데이터를 저장하라.
insert into cafe_menu values(1001, 'Americano', 2000);
insert into cafe_menu values(1002, 'Cafe Latte', 3000);
- desc 묘사해라
desc cafe_menu;
- cafe_menu 테이블 안에 모든 내용을 출력하라.
select * from cafe_menu;
- 테이블 이름 출력
select table_name from user_tables;
select 문법
존재하는 테이블 내에서 특정 데이터를 선별하여 출력하는 명령
select * from [테이블 이름]
- 전체 컬럼 모두 출력
select * from employee;
객체는 대소문자를 안가림. 문자열에서는 대소문자를 가림. 테이블 이름 출력
- 특정 컬럼명만 선택하여 출력
select emp_id, emp_name, email from employee;
- 특정 조건을 만족하는 Row만 출력
select * from employee where emp_id = 210;
- employee 에서 emp_id는 210과 같다.
select emp_id, emp_name, salary from employee where emp_id = 210;
- 문자열값은 대소문자를 가린다.
select * from employee where emp_name = '유하진';
select * from employee where dept_code = 'D8' and emp_name = '이태림';
- 테이블을 표현해주세요.
desc employee;
- 오라클은 맥락을 스스로 분석해서 - 를 보고 문자를 숫자로 바꿔서 연산을 한다.
select * from employee where salary = 8000000;
select * from employee where salary = '8000000';
select * from employee where salary = (10000000 - '2000000');
-- Quiz
--1. Job 테이블에서 Job_name의 정보만 출력해보세요.
select Job_name from Job;
--2. Department 테이블에서 모든 컬럼을 출력해보세요.
select * from department;
--3. Employee 테이블에서 이름, 이메일, 전화번호, 고용일만 출력해보세요.
select emp_name, email, phone, hire_date from employee;
--4. Employee 테이블에서 월급 250만원 이상인 사람의 이름과 급여등급만 출력해보세요.
select emp_name, sal_level from employee where 2500000<=salary;
--5. Employee 테이블에서 급여가 350만원 이상이면서 job_code가 J3인 사람의 이름과 전화번호를 출력해보세요.
select emp_name, phone from employee where job_code = 'J3' and 3500000<=salary;
--6. Employee 테이블에서 급여가 400만원 이상 600만원 이하인 사람의 사번, 이름, 부서코드, 급여를 출력해보세요.
select
emp_id,
emp_name,
dept_code,
salary
from employee
where salary between 4000000 and 6000000;
-- 4000000<=salary and salary<=6000000;
- 헤더 이름 넣기
select emp_name "사원명", salary * 12 "연봉", '원' as "원" from employee;
- select는 반복문과 같다.
- alias 별명, as, 생략 가능 as "" 같이 생략
- 데이터 영역에 들어가는 문자열은 '' single quotation
- 연봉은 header에 들어가는 문자열은 "" double quotation
select
emp_name 사원명,
salary * 12 연봉,
'원' 단위
from employee;
- 오라클 내에서 데이터 연결은 || 연산자
select emp_name 사원명, salary || '원' 급여 from employee;
- 더미 1개 생성
select * from dual;
daul 테이블 : 반복되지않음.
- 현재 시각 더미 1개 생성
select sysdate from dual;
- sysdate : java에서의 timestamp : 상수값 : SQL Developer가 날짜로 형 변환해서 보여줌
- 날짜는 덧셈 안됨, 뺄셈만 됨.
- 현재 날짜에서 과거 입사날짜 빼기
select emp_name, sysdate - hire_date from employee;
- hire_date 데이터 타입이 DATE
- . 앞에 숫자는 날자(일수) 차이
- Employee 테이블 내에서 20년 이상 근속한 직원의 이름, 급여, 보너스율을 출력하세요.
select emp_name, salary, bonus from employee where 365*20<=(sysdate-hire_date);
select
emp_name,
salary,
bonus
from employee
where
(sysdate-hire_date)/365 >= 20;
- 날짜 데이터끼리는 뺄셈 연산만 가능 (두 날짜 사이에 일수 차이 반환)
- 날짜는 대소 비교가 가능 (Between 도 가능)
select emp_name, hire_date from employee where hire_date between '00/01/01' and '10/12/31';
select emp_name, hire_date from employee where '00/01/01' <= hire_date and hire_date <= '10/12/31';
- 근속년수가 10년 이상 된 직원 중 급여가 200만원 이하인 직원의 이름과 급여, 직급 코드를 출력해보세요.
select emp_name, salary, job_code from employee
where salary <= 2000000 and (sysdate - hire_date) >= 10*365 ;
select emp_name, salary, job_code from employee
where ((sysdate - hire_date)/365 >= 10) and salary <= 2000000;
검색
- like ~인
select *
from employee
where emp_name like '하%';
select *
from employee
where emp_name like '%하';
select *
from employee
where emp_name like '%하%';
- %는 '하' 라는 글자가 어디든 포함이 되어있다면.
맨 앞이든, 중간에 어느 곳이든, 맨 뒤든 다 찾는다. 0글자 이상, 공백도 가능
select *
from employee
where emp_name like '하_';
- 언더바는 '하'로 시작해서 뒤에 한글자가 있는 데이터를 찾아준다.
- not like ~아닌
select *
from employee
where emp_name not like '하__';
- ESCAPE'#' _ 나 % 기호 자체를 검색하고 싶을 때
select email
from employee
where email like '___#_%'ESCAPE'#';
- #(아무기호)을 탈출하는 문자로 사용하겠다. 가지고 있는 특정 기능을 탈출하기 위함
- null 값을 찾을 때
select * from employee where bonus is null;
select * from employee where bonus is not null;
-- 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 테이블에서 생일이 9월자인 사원의 이름과 주민번호만 출력하세요.
select emp_name, emp_no from employee where emp_no like '___9%';
-- 4. employee 테이블에서 메일 주소에 s 가 들어가면서, dept_code 가 D9 또는 D6 인 직원들 중에서,
-- 고용일이 90년 1월 1일부터 2000년 12월 1일 사이에 입사했으며,
-- 급여가 270만원 이상인 사원의 전체 정보를 출력하세요.
select * from employee
where
(email like '%s%') and
(dept_code = 'D9' or dept_code = 'D6') and
(hire_date between '90/01/01' and '2000/12/01') and
(salary>=2700000);