본문 바로가기

NCS/SQL 활용

SQL 기초 다지기 #1

**Install HR schema on Oracle 18c

$ sqlplus / as sysdba

SQL> alter session set "_ORACLE_SCRIPT"=true;  

SQL> @?/demo/schema/human_resources/hr_main.sql 

hr
users
temp
$ORACLE_HOME/demo/schema/log/

**SQL
- DB에서 데이타를 추출할려면 sql select문을 사용해야 합니다.
- 테이블(실제저장소), 뷰(가상저장소) 라는 개체를 통해서 데이타를 보편적으로 추출합니다.
- 하나의 테이블에서 추출가능
- 여러개의 테이블에서 추출하기 위해서는 JOIN 문을 사용

Table format

table name : TBN1
column
--col1----|---col2---|---col3---|--col4---|---col5---

------|------|------|-----|------
------|------|------|-----|------
------|------|------|-----|------
------|------|------|-----|------

Display 의 모습
-------------------------------
SELECT col1,col2,col3,col4,col5
FROM TBN1 ;
-------------------------------
SELECT col3,col5,col1,col4,col2
FROM TBN1 ;
-------------------------------
SELECT col3,col2
FROM TBN1 ;
-------------------------------
SELECT  * (모든 컬럼)
FROM TBN1 ;

*SQL 문 작성
-SQL문은 대소문자를 구분하지 않는다.
select * 
FrOM tbn1 ;

- SQL문은 한줄, 또는 여러줄로 입력 가능
select  *  from  tbn1;

select  *  
from  tbn1;

-키워드는 약어를 사용해서 안된다.
sel * from tbn1;


**SQL
SELECT *
FROM hr.employees;

SELECT employee_id,last_name,first_name
FROM hr.employees;

SELECT last_name,first_name,salary
FROM hr.employees;


SELECT last_name,first_name,salary,
salary+300 as BONUS
FROM hr.employees;

**산술연산자 사용
-우선순위  규칙
-곱하기와 나누기는 더하기,빼기보다 우선한다.
-동일한 우선순위는 연산자 왼쪽에서 오른쪽으로 계산
-괄호는 기본 우선 순위보다 우선한다.


사원의 성, 급여 및 연간 총수입을 표시해 보세요.
SELECT last_name, salary,salary*12 as "Multi Salary"
FROM employees;


**Null 정의
-사용할 수 없거나, 할당되지 않거나, 정의되지 않은
알수 없는 값이다.
-공백과 0 하고는 다르다.
- null*0 오류발생
- null*1의 결과는 null
- null+문자의 결과는 문자


**별칭
-컬럼의 명을 별칭으로 대체한다.
-계산식 유용
-컬럼명 as 별칭명 ( 또는 컬럼명 별칭명)
-별칭명에 공백, 특수문자,대소문자을 구분할 경우
" " 로 묶는다.

SELECT last_name,12*salary*commission_pct Annual
FROM employees;

SELECT last_name,12*salary*commission_pct "Annual"
FROM employees;

SELECT last_name,12*salary*commission_pct "Annual Salary"
FROM employees;

SELECT last_name,12*salary*commission_pct AS "Annual Salary"
FROM employees;

**연결 연산자
-컬럼이나 문자열을 다른 컬럼에 연결한다.
-두개의 컬럼을 || 로 연결한다.
SELECT first_name||last_name as "Name"
FROM employees;


**리터럴 문자
-select절에 문자을 포함 할 수있다.
-작은 따옴표로 묶는다.
SELECT first_name||' '||last_name as "Name"
FROM employees;


SELECT last_name||'님 Did you have happy lunch?'
FROM employees;

SELECT last_name||q'[님 Do you have your's stuff?]'
FROM employees;

**중복 행 제거
-기본적으로 질의에 대한 결과는 중복되는 모든 행을 출력한다.
-중복된 행의 값을 하나의 값으로만 표현
SELECT job_id
FROM employees;

SELECT DISTINCT job_id
FROM employees;

**테이블 구조 파악
-테이블의 컬럼명, 데이타 타입 등의 정보를 출력
DESCRIBE tablename;
DESC tablename;

datatype
number(p,n); p는 최대자리수, n은 소숫점이하 자리수
varchar2(10); 10자리 문자열
date ; 날짜

 
**제한된 데이타
-원하는 행의 데이타만 출력
-조건절을 사용한다.
-SELECT... FROM...WHERE 조건
-WHERE절에 문자값은 대소문자 구별
-문자열은 ' '으로 열고 닫아야한다.
-숫자는 ' '이 필요없다.
-WHERE절은 FROM절 다음에 반드시 위치


FirstName이 Ellen의 샐러리을 출력
SELECT first_name, salary
FROM employees;

SELECT first_name, salary
FROM employees
WHERE first_name = 'Ellen';

SELECT first_name, salary
FROM employees
WHERE salary = 11000;

Q1]90번 부서에 있는 사용자의 성과 이름을 출력하세요
SELECT last_name, first_name
FROM employees
WHERE department_id = 90;

Q2]이름이 Steven King과 동일한 급여를 받는 사람들의
급여, 이름과 성을 출력하세요.

SELECT last_name,first_name,salary
FROM employees
WHERE first_name='Steven' and last_name='King';

값 : 24000

SELECT last_name,first_name,salary
FROM employees
WHERE salary = 24000;

Q2] 2007년 6월 2에 입사한 사원들의 이름과 성을 출력하세요.

**날짜
-날짜열도 문자열과 같이 ' ' 으로 열고 닫는다.
-대소문자 구별
-기본 날짜 형식 DD-MON-RR

SELECT first_name,last_name
FROM employees
WHERE hire_date = '02-06-07';


**비교 연산자
=  ; 같음
>  ; 보다 큼
>=  ; 보다 크거나 같음
<  ; 보다 작음
<=  ; 보다 작거나 같음
<>  ; 같지 않음
between...and.... ; 두 값 사이
IN ; 또는
LIKE ; 일치하는 패턴 검색(% ; 0개 이상의 문자열과 일치
_ ; 임의의 단일 문자와 일치
)
IS NULL ; 값이 NULL 인것

Q3]급여가 15000보다 많이 수령하는 사원의 이름, 성 그리고 급여를 출력하세요.

SELECT first_name, last_name, salary
FROM employees
WHERE salary > 15000;

SELECT first_name, last_name, salary
FROM employees
WHERE salary < 3000;

Q4]급여가 3000보다 많고 5000보다 작은 급여를 수령하는 사원의 이름, 성 그리고 급여를 출력하세요.

SELECT first_name, last_name, salary
FROM employees
WHERE salary BETWEEN 3000 AND 5000;


SELECT first_name, last_name, salary
FROM employees
WHERE last_name BETWEEN 'King' AND 'Stephen';

Q5]급여가 3000 또는 3200 수령하는 사원의 이름, 성 그리고 급여를 출력하세요.

SELECT first_name, last_name, salary
FROM employees
WHERE salary = 3000 OR salary = 3200;

Q6]급여가 3000 또는 3200 또는 3300 수령하는 사원의 이름, 성 그리고 급여를 출력하세요.

SELECT first_name, last_name, salary
FROM employees
WHERE salary = 3000 OR salary = 3200 OR salary = 3300;


SELECT first_name, last_name, salary
FROM employees
WHERE salary IN (3000,3200,3300);

Q7]사원의 이름이 S로 시작하는 이름, 입사일과 급여를 출력하세요.
SELECT first_name, hire_date, salary
FROM employees
WHERE first_name LIKE 'S%';

% ; 0개 이상의 문자열과 일치
_ ; 임의의 단일 문자와 일치

SELECT first_name, hire_date, salary
FROM employees
WHERE first_name LIKE '%n';

SELECT first_name, hire_date, salary
FROM employees
WHERE first_name LIKE 'S%n';

Q8]최고경영자의 이름,성과 급여를 출력하세요.
SELECT first_name, last_name, salary
FROM employees
WHERE manager_id IS NULL;


**논리 연산자
AND ; 주어진 조건이 모두 참인것
OR ; 주어진 조건중 하나가 참인것
NOT ; 조건이 거짓인 경우 참

Q9] 급여가 9000 이고 이름이 A로 시작하는 사원의 이름,성 그리고 급여를 출력하세요.
SELECT first_name, last_name, salary
FROM employees
WHERE salary = 9000 
AND first_name LIKE 'A%';


**우선 순위 규칙
-NOT 는 AND보다 우선 판단한다.
-AND 는 OR 보다 우선 판단한다.
(NOT > AND > OR)

Q9] 급여가 9000 이고 이름이 A 또는 D로 시작하는 사원의 이름,성 그리고 급여를 출력하세요.

SELECT first_name,last_name,salary
FROM employees
WHERE salary = 9000 AND first_name LIKE 'A%' OR salary = 9000 AND first_name LIKE 'D%';

SELECT first_name,last_name,salary
FROM employees
WHERE salary = 9000 AND (first_name LIKE 'A%' OR first_name LIKE 'E%');