본문 바로가기

IT&코딩/국비지원

SQL - 1

728x90
반응형

■ SQL 언어(structured query language)

 

sql*plus는 tool이지 언어가 아니다.

 

1) query문 : select(검색) (CRUD의 R), 삽입(insert), 검색(read), 수정(update), 삭제(delete)

2) DML (Data Manipulation language) 데이터 조작(작동) 언어
-- insert, delete, update (crud의 c d u ) 
3) DDL (data definition language)
--  create 등.

 

<코딩규칙>

1) keyword는 대문자

2) 절단위로 줄을 바꿈

3) 문장의 끝에는 세미콜론(;)

 

SELECT *  -- 원래는 이런식으로 작성해야 한다.
FROM locations;

 

■ 실습(CRUD)

 

□ 사원 관리 테이블 만들기

 

CREATE TABLE sawon(
sa_id NUMBER(5),
sa_name CHAR(20),
sa_hiredate DATE,
sa_address VARCHAR2(100),
sa_copct NUMBER(7, 2) -- 정수 5자리, 소수 2자리, 7은 총 자릿수
);

 

1) C(INSERT) : 삽입

 

-- INSERT INTO 테이블명
-- VALUES (컬럼값, 컬럼값, 컬럼값, 컬럼값, 컬럼값);

 

DB SQL에서 문자열은 작은따옴표

 

INSERT INTO sawon
VALUES(1, 'hong', '22/03/10', 'seoul', 0.05);

삽입, 수정, 삭제 DML은 임시방에 들어가기 때문에 DB에 넣기 위해서는 반드시 COMMIT; 을 해줘야 한다.

그래야 임시방 buffer에 있는 자료가 전부 DB로 적용된다.

 

2) R(SELECT) : 검색

 

SELECT *
FROM sawon;

 

3) U(UPDATE) : 수정

 

-- UPDATE 테이블명
-- SET 컬럼명 = 칼럼값
-- WHERE 조건; 

 

-- 사원 id가 1번인 조건에 한해서 커미션을 0.05 -> 0.07로 수정

 

UPDATE sawon
SET sa_copct = 0.07
WHERE sa_id = 1;

COMMIT;

 

4) D(DELETE) : 삭제

 

-- DELETE FROM 테이블명
-- WHERE 조건;

 

-- 이름이 choi인 경우에 한해서 해당 사원을 삭제하시오

 

DELETE FROM sawon
WHERE sa_name = 'choi';

COMMIT;

 

□ casing 기법

 

1) pascal casing : BigPrice
2) camel casing : bigPrice
3) snake casing  : big_price

 

-- 오라클에서 big_price (X)

 

□ JDBC

 

-- pro*C (오라클 + C)
-- EXEC SELECT * ~

-- JDBC = 자바 + 오라클 (드라이버 : ojdbc14.jar, ojdbc6.jar, ojdbc8.jar)
-- (jar 파일 : .class 파일의 집합)

 


 

■ 자료형

 

□ 숫자, 문자

 

NUMBER(6) : 000000-999999 정수
NUMBER(8,2) : 000000.00 ~ 정수
VARCHAR2(25) : 25자가 입력되면 25자리를 차지, 5자리가 입력, 5자리 차지
CHAR(25) : 25자, 5자 상관없이 25자리 차지

□ VARCHAR vs CHAR

-- VARCHAR2(5) <=== 'babo'
-- CHAR(5) <=== 'babo'

SELECT 로 출력하면 둘다 babo가 나온다.  그러나 VARCHAR2 == CHAR 냐고 물어보면 다르다고 나온다. 
--      b a b o   b a b o (빈칸 1자리)
--      _ _ _ _   _ _ _ _ _ 

-- 비교시 babo == 빈칸을 자른 babo를 하면 같다고 나온다. 이때 사용하는 문법이 rtrim() : 오른쪽 공백제거 

 

□ 날짜

 

DATE, 크기가 없다.
dd-mon-yy (미국식) ex) 27-MAR-23
yy/mm/dd ==> RR/mm/dd (한국식) 


* 2023년(현재)인데 1923년생이 있다고 치면
(RR >= 50 이면 1900년도로 간주)
(RR ~ 49 2000년대)

 

-- 저장할 때는 
-- spool kalmoori.txt -> 바탕화면에 텍스트 파일 생성
-- 작업 후
-- spool off치면 텍스트 파일에 저장된다.

-- show user : 현재 사용자의 이름을 보여준다.
-- cl scr : 화면지우기

-- set pagesize 25
-- set linesize 100 (기본은 80)

 

■ 쿼리문

 

-- Q) 사원테이블에서 사원아이디, 사원명, 급여를 조회

 

SELECT employee_id, first_name, salary 
FROM employees;

 

-- Q) 사원테이블에서 사원아이디, 사원명, 급여를 조회 출력하시오 (단, 컬럼명을 한글 alias(별명)로 표현하시오)

 

SELECT employee_id AS 사원아이디, first_name AS 사원명, salary AS 급여
FROM employees;

 


 

-- Q) 사원테이블에서 사원아이디, 사원명, 연봉을 조회 출력하시오 (단, 컬럼명을 한글 alias(별명)로 표현하시오)

 

SELECT employee_id AS 사원아이디, first_name AS 사원명, salary*12 AS 1년급여
FROM employees;

 

-- 오류가 발생 왜? 숫자 1때문에

 

SELECT employee_id AS 사원아이디, first_name AS 사원명, salary*12 AS 일년 급여
FROM employees;

 

-- 오류 발생 왜? 띄어쓰기 때문에 

 

-- alias 를 만들 때 처음에 숫자가 나오면 안 되고, 빈칸이 있으면 안 된다.

 

SELECT employee_id AS 사원아이디, first_name AS 사원명, salary*12 AS 일년_급여
FROM employees;

 

-- BUT 나는 반드시 빈칸을 나타내고 싶으면
-- 이 경우에는 ""를 사용하면 된다. 이 경우에만 큰따옴표가 사용된다. 

 

SELECT employee_id AS 사원아이디, first_name AS 사원명, salary*12 AS "일 년 급 여"
FROM employees;

 


 

-- Q) 사원테이블에서 사원아이디, 사원명, 연봉을 조회 출력하시오 (단, 컬럼명을 한글 alias(별명)로 표현하시오)
-- 또한 작은따옴표와 비교라는 글자를 출력하시오

 

SELECT employee_id AS 사원아이디, first_name AS 사원명, salary*12 AS "일 년 급 여", '작은따옴표와 비교'
FROM employees;
-- ''은 칼럼 역할을 하고 있다. 

-- as 생략
SELECT employee_id 사원아이디, first_name 사원명, salary*12 "일 년 급 여", '작은따옴표와 비교'
FROM employees;
-- (참고) ajax
-- onreadystatechange (casing 기법이 적용되지 않음) 

-- sql*plust => tool(도구)
-- desc employees; (sql tool 명령 o, sql 언어 x)
-- describe
desc employees;

 

-- Q) 사원의 이름과 성명 중 성을 출력하시오
-- 그런 다음 이어서 아래와 같이 출력되도록 작성하시오.

--    <output layer>
--    
--        성명
--    ------------
--     king steven

 

SELECT last_name AS 성명
FROM employees;

 

방법) 성과 이름을 성명으로 결합하면 됨 
SQL 에서는 결합연산자 || ==> 자바의 + 기호와 같다. 
산술연산자 : +,  
관계연산자 : >, < 
논리연산자 : and, or

 

SELECT CONCAT(last_name, CONCAT(' ', first_name)) AS 성명
FROM employees;

SELECT last_name || ' ' || first_name 성명
FROM employees;

 

-- Q) 사원의 급여를 출력하되 salary에 1300이 있을 경우
-- 1300 달러로 출력하는 sql문을 작성하시오.
-- (단, 출력은 이름, 급여)

 

SELECT first_name 이름, salary || ' ' || '달러' 급여
FROM employees;

 

-- Q) 다음과 같이 출력해보자

-- Steven의 봉급은 24000이지말입니다. --> record 출력 내용
-- Lex의 봉급은 17000이지말입니다.
-- Alexander의 봉급은 9000이지말입니다.
-- Bruce의 봉급은 6000이지말입니다.

 

SELECT first_name || '의 봉급은 ' || salary || '이지 말입니다.' "이름과 봉급"
FROM employees;

 

-- Q) 각 부서의 부서아이디와 부서명을 출력하시오(alias 출력)

 

SELECT department_id 부서아이디, department_name 부서명
FROM DEPARTMENTS;

 

-- Q) 사원의 이름과 급여를 출력하시오.
-- (단, 급여가 10000 이상이 경우만)

 

SELECT first_name 이름, salary 급여
FROM employees
WHERE salary >= 10000;
-- 실행순서는 어떻게 될까?
-- employees(테이블) -> where(조건) -> SELECT

 

-- Q) 직원 중에서 연봉이 150000 이상인 직원들의 이름, 연봉을 출력하시오.
-- (단, 보너스는 200%로 한다. 그리고 연봉에 $도 출력한다)
-- 그리고 이름은 결합하여 출력하시오.

 

SELECT first_name || ' ' || last_name 이름, salary * 14 || '$' 연봉
FROM employees
WHERE salary*14 >= 150000;

 

-- Q) 사원아이디가 105번 사원의 이름, 입사일, 부서번호 조회 출력하시오.

 

SELECT first_name || ' ' || last_name 이름, hire_date 입사일, department_id 부서번호
FROM employees
WHERE employee_id = 105;

 

-- Q) 사원아이디가 120 이상이거나 부서번호가 90번인 사람 조회
-- (단, 출력은 사원 id, 이름, 부서번호)

 

-- sql and or ||(결합연산자)

select employee_id 사원id, first_name 이름, department_id 부서번호 -- 3
FROM employees -- 1
WHERE employee_id >= 120 OR department_id = 90 -- 2

 

-- Q) id가 120이상 이거나 부서번호가 90번인 사람 조회
-- (단, 출력은 사원id, 이름, 급여, 부서번호)
-- 그리고 추가로 급여가 11000 이상인 사원 조회

 

SELECT employee_id 사원id, first_name 이름, salary 급여, department_id 부서번호 -- 3
FROM employees -- 1
WHERE (employee_id >= 120 OR department_id = 90) AND salary >= 11000 -- 2

-- hint 추가조건은 무조건 and 추가 

 

-- Q)
-- 1) 급여가 12000 이상인 직원들의 이름, 급여, 부서id를 조회 출력
-- 2) 직원 중에서 연봉이 20000 이상인 직원들의 이름, 월급여, 연봉을 조회 출력

 

SELECT first_name 이름, salary 급여, department_id 부서id
FROM employees
WHERE salary >= 12000
SELECT first_name 이름, salary 월급여, salary*12 연봉
FROM employees
WHERE salary*12 >= 20000;

 

-- Q) 사원테이블에 어떤 부서 아이디가 있는지 출력하시오
-- (나온 결과를 보고자료에 사용할 예정)

 

SELECT department_id 부서아이디
FROM employees;
-- 중복을 피하고 싶다.
-- distinct : 중복배제 하려는 것 바로 앞에 사용.

SELECT DISTINCT department_id 부서아이디
FROM employees;

-- 178 Kimberely는 부서가 없다. 

 

-- Q) 부서번호가 90 or 50인 부서의 사원명, 부서번호, 급여 출력

 

SELECT first_name 이름, department_id 부서id, salary 급여
FROM employees
WHERE department_id = 90 OR department_id = 50;

 

-- Q) 부서id가 90이거나 80이거나 50인 사람 조회
-- (단, 출력은 이름, 부서id, 급여)

 

SELECT first_name 이름, department_id 부서id, salary 급여
FROM employees
WHERE department_id = 90 OR department_id = 50 or department_id = 80;

좀 더 간략하게 바꿔보면

 

SELECT first_name 이름, department_id 부서id, salary 급여
FROM employees
WHERE department_id IN (90, 80, 50);
-- WHERE department_id = (90, 80, 50); (X)
-- ===> sql tunning (어떤 것이 더 빠른가? 우리는 전혀 신경쓰지 않는다 일단은.)

 

-- Q) 급여가 5000부터 10000사이에 있는 직원의 
-- 이름과 급여 출력 

 

SELECT first_name 이름, salary 급여
FROM employees
WHERE salary >= 5000 and salary <= 10000;

-- BETWEEN을 사용한 다른 방법

SELECT first_name 이름, salary 급여
FROM employees
WHERE salary between 5000 and 10000;

 


 

□ 서점의 검색?

 

- 로그인이 맞는지 확인하는 방법
c언어 : strcmp()
java : equals()

 

- 서점의 검색은?

c언어 : strstr()
java : startsWith(), endsWith(), indexOf()
윈도우의 경우    
h*.txt : *는 all를 뜻함  
h?.txt : ?는 하나만

 

- 오라클의 경우
%가 all, -이 한글자
그렇다면 aa_price에서 _의 의미는? ==> 그냥 밑줄이다.

 

-- Q) 사원의 이름 중에서 이름이 A로 시작하는 사람 조회

 

SELECT *
FROM employees
WHERE first_name LIKE 'A%';

 

-- Q) 사원의 이름중 n이 들어있는 사람 조회 출력

 

SELECT *
FROM employees
WHERE first_name LIKE '%n%';

 

-- Q) 입사일중 입사날짜가 17일인 직원 이름, 입사일 출력

 

SELECT first_name 이름, hire_date 입사일
FROM employees
WHERE hire_date LIKE '%17';

 

-- Q) 2003년에 입사한 직원을 모두 출력하시오(부등호 사용)

 

SELECT first_name 이름, hire_date 입사일
FROM employees
WHERE hire_date >= '03/01/01' and hire_date <= '03/12/31';

SELECT first_name 이름, hire_date 입사일
FROM employees
WHERE hire_date between '03/01/01' and '03/12/31';

SELECT first_name 이름, hire_date 입사일
FROM employees
WHERE hire_date between '2003/01/01' and '2003/12/31';

 

-- Q) 2003년에 입사한 직원을 모두 출력하시오(% 사용)

 

SELECT first_name 이름, hire_date 입사일
FROM employees
WHERE hire_date LIKE '2003/%'; -- (X) 기본형이 RR로 잡혀있기 때문에 

SELECT first_name 이름, hire_date 입사일
FROM employees
WHERE hire_date LIKE '03/%'; -- (O)

 

□ 년도에 대한 짧은 메모

 

SELECT *
FROM nls_session_parameters;

-- America 19-NOV-20
-- 일 - 월 - 년

-- RR/mm/dd
-- 00 ~ 49 2000년대
-- 50 ~ 99 1900년대

-- 세월이 가서 년도가 많아지면 기준점이 2000년대에서 2100년대로 간다.

-- yy/mm/dd
-- 00~49 2000년대
-- 50~99 2000년대

 

SELECT first_name 이름, hire_date 입사일
FROM employees
WHERE hire_date LIKE '03______';

 

-- Q) 입사일 중 입사월이 8월인 직원 조회 출력 (%)

 

SELECT *
FROM employees
WHERE hire_date LIKE '%/08/%'; -- (O)

SELECT first_name 이름, hire_date 입사일
FROM employees
WHERE hire_date LIKE '___08___'; -- (O)

 

-- Q) job_id에 언더바(_) 있는 id 조회 출력하시오 (%등 사용)

 

SELECT job_id
FROM employees
WHERE job_id LIKE '%_%';

-- 여기서 밑줄은 한글자? 말 그대로 밑줄인가? --> 밑줄이 아니라 한 글자 앞뒤로 전부다라는 뜻이다. 
-- 즉 밑줄이 없어도 나옴

 

-- 그렇다면 밑줄(_) 포함된 사원 다 나와라

-- job_id 에서 _ 들어간 글자 다 나와라

SELECT job_id
FROM employees
WHERE job_id LIKE '%@_%' ESCAPE '@';

 

728x90
반응형

'IT&코딩 > 국비지원' 카테고리의 다른 글

SQL - 3  (0) 2023.04.13
SQL - 2  (0) 2023.04.13
네트워크 - 2 (네트워크)  (0) 2023.03.23
네트워크 - 1 (네트워크 이론 및 스레드)  (0) 2023.03.22
Java - 2  (0) 2023.03.22