샘플 스키마 : HR

설명하는 과정에서 예제로 주어진 문장은 눈으로 보지만 말고 직접 실행시켜 보길 권한다.




No. 01

 

 

단일 행 함수란?


단일 행 함수는 모든 행에 대하여 각각 적용되어 행의 개수와 동일한 결과를 제공한다.


단일 행 함수의 종류




단일 행 함수의 기능

  • 함수의 중첩이 가능하다.
  • 함수의 결과 값은 입력 값마다 하나씩 리턴 된다.
  • 함수의 인자는 컬럼명, 수식, 변수 등을 사용할 수 있다.
  • 데이터를 조작한다.




No. 02

 

 

문자 함수


문자 함수는 문자를 인자로 사용하고 결과 값도 문자를 반환하는 함수이다.

대소문자 조작 함수

함수명

기 능 

사 용 

LOWER

 문자열을 소문자로 변환한다.

 LOWER(문자열)

 LOSER('SQL Course') → sql course

 

UPPER

 문자열을 대문자로 변환한다.

 UPPER(문자열)

 UPPER('SQL Course') → SQL COURSE

 

INITCAP

 첫 문자만 대문자로 변환하고,

 나머지는 소문자로 변환한다.

 INITCAP(문자열)

 INITCAP('SQL Course') → Sql Course


◈ 예제

select first_name, lower(first_name), upper(first_name), initcap(first_name)

from employees;


▶ 이름이 'Amit'인 사원의 정보를 검색할 때

select employee_id, first_name, department_id, salary

from employees

where first_name = 'amit';

no rows selected


select employee_id, first_name, department_id, salary

from employees

where lower(first_name) = 'amit';


HR 스카마의 테이블에는 입력 원칙을 가지고 문자 데이터가 입력되어 있지만, 실제 현장에서는 입력 원칙이 정해지지 않아 데이터를 입력하는 사람 마음대로 입력된 데이터가 있을 가능성이 있다.

입력된 데이터에 대·소문자가 섞여 있는 경우 문자열을 검색하기 위하여 대·소문자 조작 함수를 사용한다. 하지만, 가장 좋은 방법은 입력 작업을 할 때 원칙을 정해서 대·소문자를 구별하여 함수를 사용하지 않도록 하는 것이 좋다.



▣ 문자 조작 함수

 함수명

기능 & 사용 

CONCAT

 두 개의 문자열을 연결한다. (연결 연산자와 비슷한 기능)

 CONCAT(문자열1, 문자열2)

 CONCAT('Hello', 'World') → HelloWorld

 

SUBSTR

 문자열 내에서 지정된 위치의 문자열을 반환한다.

 SUBSTR(문자열, 시작위치, 출력문자 개수)

 SUBSTR('HelloWrold',2,5) → elloW

  

LENGTH

 문자열의 길이를 반환한다.

 LENGTH(문자열)

 LENGTH('HelloWorld') → 10

 

INSTR

 지정된 문자의 위치를 리턴한다.

 INSTR(문자열, 검색문자, [시작위치, [횟수]])

 INSTR('HelloWorld','o') → 5

 

TRIM

 접두어나 접미어를 잘라낸다.

 TRIM([leading | trailing | both] 제외 문자 FROM 문자열)

 TRIM('H' FROM 'HelloWorld') → elloWorld

  

LPAD, RPAD

 지정된 문자열의 길이만큼 빈부분에 문자를 채운다.

 LPAD(문자열, 출력길이, 채울문자), RPAD(문자열, 출력길이, 채울문자)

 LPAD('World', 10, '*') → *****World,  RPAD('World', 10, '*') → World*****


◈ 예제

▶ CONCAT

select first_name, last_name, concat(first_name, last_name)

from employees;


 TIP  동일한 작업을 할 경우 함수보다 연결 연산자(||)의 성능이 더 좋다.


▶ SUBSTR

select first_name, substr(first_name,3), substr(first_name,-3), substr(first_name,2,5), substr(first_name,-5,3)

from employees;


시작위치가 '-'인 경우는 문자열의 끝에서부터 위치를 정한다.

예) -5 : 끝에서 다섯 번째


▶ LENGTH

select first_name, length(first_name)

from employees;


▶ INSTR

select instr('database', 'a'), instr('database', 'a', 3), instr('database', 'a', 1, 3)

from dual;


시작위치, 횟수를 쓰지 않을 경우 기본값은 시작위치=1, 횟수=1

instr('database', 'a') : 'database'라는 문자열에서 첫 번째 'a'의 위치

instr('database', 'a', 3) : 'database'라는 문자열에서 세 번째부터 검색한 'a'의 위치

instr('database', 'a', 1, 3) : 'database'라는 문자열에서 첫 번째부터 검색한 세 번째 'a'의 위치


▶ TRIM

select trim('r' from 'register'), trim(leading 'r' from 'register'), trim(trailing 'r' from 'register')

from dual;


기본값 : both

trim('r' from 'register') : 'register'라는 문자열의 'r'이라는 접두어와 접미어를 잘라낸다.

trim(leading 'r' from 'register') : 'register'라는 문자열에서 'r'이라는 접두어를 잘라낸다.

trim(tailing 'r' from 'register') : 'register'라는 문자열에서 'r'이라는 접미어를 잘라낸다.

문자열의 접두어와 접미어에 제외 문자가 없으면 문자열 그대로를 출력한다.

제외 문자는 한 글자만 가능하다. 잘못된 예) trim('re' from 'register')


▶ LPAD, RPAD

select first_name, rpad(first_name, 10, '#'), lpad(first_name, 10, '#')

from employees;



문자 치환 함수


함수명

기능 & 사용 

TRANSLATE

 문자 단위 치환된 값을 리턴한다.

 TRANSLATE(문자열, 검색문자, 치환문자)

 TRANSLATE('hello', 'e', '*') → h*llo

 

REPLACE

 문자열 단위 치환된 값을 리턴한다.

 REPLACE(문자열, 시작위치, 출력문자 개수)

 REPLACE('hello', 'el', '**')  → h**lo


◈ 예제

select translate('hello world', 'lo', '**') translate, replace('hello world', 'lo', '**') replace

from dual;


TRANSLATE는 'l'과 'o' 각각의 문자를 '*'로 치환하고,

REPLACE는 'lo'라는 문자열을 '**'문자열로 치환한다.


select translate('hello world', 'lo', '$*') translate

from dual;


문자 'l'은 '$'로 치환되고, 문자 'o'는 '*'로 치환



 TIP 

DUAL 테이블이란?

SELECT문에는 반드시 FROM절을 기술해야 한다.

예를 들어 10*20은 어느 테이블에서도 데이터를 가져오는 것이 아니기 때문에 FROM절에 기술할 테이블이 없다.

이런 경우 사용할 수 있는 DUMMY 테이블이 DUAL이다.


select 10*20

from dual;




'SQL' 카테고리의 다른 글

[SQL 08] 단일 행 함수 - 변환 함수  (0) 2017.12.03
[SQL 07] 단일 행 함수 - 숫자, 날짜 함수  (0) 2017.12.03
[SQL 05] ORDER BY 절  (0) 2017.12.03
[SQL 04] WHERE 절  (0) 2017.12.03
[SQL 03] SELECT 문  (0) 2017.11.30

샘플 스키마 : HR

설명하는 과정에서 예제로 주어진 문장은 눈으로 보지만 말고 직접 실행시켜 보길 권한다.


지정된 컬럼을 대상으로 정렬을 수행하는 ORDER BY 절에 대해서 배워본다.



No. 01

 

 

ORDER BY 절을 이용한 정렬된 데이터 검색


기본 구조

SELECT * | {[DISTINCT] 컬럼명 or 표현식 [별명], …}

FROM 테이블명

[WHERE 조건]

ORDER BY 컬럼 [ASC/DESC], 컬럼 [ASC/DESC] …;

  • ORDER BY 절은 SELECT 문의 마지막에 사용해야 한다.
  • ASC : 오름차순 정렬, DESC : 내림차순 정렬, (지정하지 않으면 ASC가 기본 값)
  • 정렬하는 컬럼이 여러 개인 경우 앞쪽 컬럼의 정렬이 깨지지 않는 범위 내에서 두 번째 컬럼의 정렬을 수행한다.
  • 정렬 대상은 컬럼이 아니더라도 사용 가능하다.
    1. 별명
    2. 검색 항목의 순서
    3. 수식


◈ 예제

▶ 사원의 정보를 급여 순으로 검색한다.(오름차순)

select employee_id, first_name, salary

from employees

order by salary asc;


▶ 사원의 정보를 급여 순으로 검색한다.(내림차순)

select employee_id, first_name, salary

from employees

order by salary desc;


▶ 사원의 정보를 연봉 순으로 검색한다.(오름차순, 별명사용)

select employee_id, first_name, salary*12 annsal

from employees

order by annsal;


select 절에서 지정한 별명을 사용할 수 있으며, 오름차순일 경우 asc를 생략해도 무방하다.


▶ 사원의 정보를 연봉 순으로 검색한다.(오름차순, 검색 항목의 순서사용)

select employee_id, first_name, salary*12

from employees

order by 3;


select 절에 기술된 순서를 지정해도 된다.

'salary*12'는 3번째 항이므로 'ORDER BY 3'이라고 써도 별명을 사용한 결과와 같다.


▶ 정렬하는 컬럼의 수가 여러개인 경우

select first_name, department_id, salary

from employees

order by department_id, salary desc;


두 개의 항목으로 정렬을 수행했다.

부서번호 컬럼은 정렬 방법을 생략했으므로 오름 차순(ASC) 정렬을 수행하고, 정렬된 부서번호 안에서 급여에 대해서 내림 차순(DESC)를 수행한 결과이다.



'SQL' 카테고리의 다른 글

[SQL 07] 단일 행 함수 - 숫자, 날짜 함수  (0) 2017.12.03
[SQL 06] 단일 행 함수 - 문자 함수  (0) 2017.12.03
[SQL 04] WHERE 절  (0) 2017.12.03
[SQL 03] SELECT 문  (0) 2017.11.30
[SQL 02] SQL Developer 간단 사용법 & SQL 언어  (0) 2017.11.29

샘플 스키마 : HR

설명하는 과정에서 예제로 주어진 문장은 눈으로 보지만 말고 직접 실행시켜 보길 권한다.


행의 조건을 기술함으로써 테이블 내의 원하는 결과만 검색하는 WHERE 절에 대해 배워본다.



No. 01

 

 

WHERE 절을 이용한 검색 조건


기본 구조

SELECT * | {[DISTINCT] 컬럼명 or 표현식 [별명], …}

FROM 테이블명

WHERE 조건;

  • WHERE 절은 FROM 절 바로 뒤에 쓴다.
  • 조건을 통해 컬럼 내에 데이터를 제한한다.
  • 검색 조건이 문자이거나 날짜인 경우 반드시 단일 인용 부호를 사용해야 한다.
  • 조건에 사용되는 비교 연산자

연산자

의 미

 

=

같다

 

>

크다

 

<

작다

 

>=

크거나 같다

 

<=

작거나 같다

 

<>, !=, ^=

같지 않다

 



◈ 예제

▶ 이름이 'Ellen'인 사원의 사원번호, 메일, 직업, 급여 정보

select first_name, employee_id, email, job_id, salary

from employees

where first_name = 'Ellen';


※ 조건의 내용이 영문일 경우 대소문자를 구별해야 한다.


▶ 100번 부서에 속한 사원들의 사원번호, 이름 정보

select employee_id, first_name

from employees

where department_id = 100;



널 값의 비교 연산

널 값을 검색하는 경우 널 값은 일반 연산, 비교 연산이 불가능하기 때문에 다음의 연산자를 사용한다.

IS NULL : 널 값을 검색

IS NOT NULL :  널이 아닌 값을 검색


◈ 예제

▶ 보너스를 받지 못하는 사원의 이름, 월급, 전화번호를 검색

select first_name, salary, phone_number

from employees

where commission_pct is null;




No. 02

 

 

논리 연산자


기본 구조

SELECT * | {DISTINCT] 컬럼명 or 표현식 [별명], …}

FROM 테이블명

WHERE 조건 [논리연산자 조건 …];

  • 논리 연산자는 여러 개의 조건을 사용할 때 쓰인다.
  • AND, OR, NOT의 논리 연산자를 이용한다.
  • 두 개 이상의 논리연산을 할 때는 반드시 괄호로 연산의 우선순위를 결정하는 것이 좋다.
  • AND 연산자가 OR 연산자보다 우선순위가 높다.

연산자

설 명

 

AND

 조건을 모두 만족해야만 검색

 

OR

 조건 중 하나만 만족해도 검색

 

NOT

 조건을 만족하지 않아야 검색

 사용 NOT IN, NOT BETWEEN, NOT LIKE, NOT NULL



◈ 예제

▶ 60번 부서원들 중 급여가 5000 이상인 사원의 이름, 사원번호, 메일, 직업, 상사번호 정보

select first_name, employee_id, email, job_id, manager_id

from employees

where department_id = 60

and salary >= 5000;


▶ 부서 번호가 60이거나 급여가 5000 이상인 사원의 이름, 사원번호, 메일, 직업, 상사번호 정보

select first_name, employee_id, email, job_id, manager_id

from employees

where department_id = 60

or salary >= 5000;


60번 부서원들과 급여가 5000 이상인 사원이 모두 검색 되었다.


▶ 부서 번호가 60이 아닌 사원의 이름, 사원번호, 메일, 직업, 상사번호 정보

select first_name, employee_id, email, job_id, manager_id

from employees

where not department_id = 60;


NOT 연산자는 보통 위의 예제처럼 단일로 쓰이지 않는다.

NOT 연산자를 사용할 경우 아직 배우지 않았지만 위에 명시한 연산자들과 자주 쓰인다.



※ 주의



▶ JOB_ID가 'IT_PROG' 또는 'FI_ACCOUNT' 이면서 급여가 7000 이상인 사원을 검색하려 할 때


A

select first_name, job_id, salary

from employees

where job_id = 'IT_PROG'

or job_id = 'FI_ACCOUNT'

and salary >= 7000;


B

select first_name, job_id, salary

from employees

where (job_id = 'IT_PROG'

or job_id = 'FI_ACCOUNT')

and salary > = 7000;


두 문장은 괄호를 제외하고 완전히 같은 문장이지만 결과는 다르다.

결과가 다른 이유는 AND 연산자가 OR 연산자보다 우선순위가 높기 때문이다.

A 문장은 job_id가 'FI_ACCOUNT' 이면서 급여가 7000 이상인 사원들과 job_id가 'IT_PROG'인 사원들을 검색한 문장이고,

B 문장은 job_id가 'IT_PROG'와 'FI_ACCOUNT'인 사원들 중에서 급여가 7000 이상인 사원들을 검색한 문장이다.

한마디로 논리 연산자를 두 개 이상 사용할 경우 괄호를 사용하여 우선순위를 정해주어야 정확한 결과를 얻을 수 있다.





No. 03

 

 

기타 연산자 (BETWEEN, IN, LIKE)


BETWEEN 연산자 기본 구조

SELECT * | {[DISTINCT] 컬럼명 or 표현식 [별명], …}

FROM 테이블명

WHERE 컬럼 BETWEEN 값1 AND 값2;

  • 컬럼의 값이 값1 이상 값2 이하인 값을 검색한다.
  • 값1은 반드시 값2보다 작아야 한다.
  • AND 연산자를 사용하여 대체가능 하지만, 가독성을 위해 'BETWEEN ~ AND ~'를 사용


◈ 예제
▶ 급여가 5000에서 7000이내인 사원의 이름, 급여 정보

select first_name, salary

from employees

where salary between 5000 and 7000;



IN 연산자 기본 구조

SELECT * | {[DISTINCT] 컬럼명 or 표현식 [별명], …}

FROM 테이블명

WHERE 컬럼 IN (값1, 값2, …);

  • 지정한 값 중 일치하는 값이 하나라도 있으면 검색한다.
  • OR 연산자 = 연산자로 대체 가능하다.


◈ 예제
▶ 10, 60번 부서에 속한 사원의 이름, 사원번호, 급여 정보

select first_name, employee_id, salary

from employees

where department_id in (10, 60);



LIKE 연산자 기본 구조

SELECT * | {[DISTINCT] 컬럼명 or 표현식 [별명], …}

FROM 테이블명

WHERE 컬럼 LIKE '비교 문자열';

  • 문자 전용 비교 연산자이다.
  • 문자열의 일부만으로 검색 할 수 있다.
  • 와일드 문자를 사용한다.
    1. '_' : 반드시 한 개의 문자를 대체한다.
    2. '%' : 문자열을 대체하며, 문자가 없는 경우도 포함된다.
  • 와일드 문자 자체를 검색할 때는 ESCAPE 절(ESCAPE '지정할 문자')을 사용한다.

와일드 문자 사용 예

 예 문

설 명 

 

 '%s'

 's'로 끝나는 모든 문자열

 

's%'

 's'로 시작하는 모든 문자열

 

'%s%'

 's'를 포함하는 모든 문자열

 

'_s'

 's'로 끝나는 두 글자 단어

 

's__'

 's'로 시작하는 세 글자 단어

 

'%s!_%'

 ESCAPE '!'으로 지정한 경우, 's_'가 포함된 문자열

 

'__!%'

 ESCAPE '!'으로 지정한 경우, '%'로 끝나는 세 글자 단어

 


◈ 예제
▶ 이름이 'J'로 시작하는 사원의 이름, 사원번호, 부서번호 정보

select first_name, employee_id, department_id

from employees

where first_name like 'J%';


▶ 이름의 두 번째 알파벳이 'o'인 사원의 이름, 사원번호, 부서번호 정보

select first_name, employee_id, department_id

from employees

where first_name like '_o%';


▶ 이름에 '%'가 포함된 사원의 이름, 사원번호, 부서번호 정보

select first_name, employee_id, department_id

from employees

where first_name like '%!%%' escape '!';

이 예제에서는 결과는 나오지 않는다.

SQL문이 잘못된 것이 아니라 이름에 '%가 포함된 사원이 없기 때문이다.

escape 문자로 지정한 '!' 문자 뒤에 쓰여진 '%'나 '_'는 와일드 문자가 아니라 일반 문자로 인식된다.



'SQL' 카테고리의 다른 글

[SQL 06] 단일 행 함수 - 문자 함수  (0) 2017.12.03
[SQL 05] ORDER BY 절  (0) 2017.12.03
[SQL 03] SELECT 문  (0) 2017.11.30
[SQL 02] SQL Developer 간단 사용법 & SQL 언어  (0) 2017.11.29
[SQL 01] HR schema 구조  (0) 2017.11.29

샘플 스키마 : HR

설명하는 과정에서 예제로 주어진 문장은 눈으로 보지만 말고 직접 실행시켜 보길 권한다.


문장의 구조를 표현할 때 기호의 의미

'|'  = 또는(=OR)

'[]' = 생략 가능한 문장(생략하게 되면 자동으로 기본값)


SELECT 구문은 테이블로부터 행을 검색하는데 이용하는 RDB의 가장 기본적인 문장이다.




No. 01

 

 

SELECT 문을 이용한 검색


기본 구조

SELECT * | {[DISTINCT] 컬럼명 or 표현식 [별명], …}

FROM 테이블명;

  • '*'는 모든 컬럼을 검색할 때 사용한다.
  • '*'는 컬럼명(or 표현식)과 같이 사용할 수 없고 반드시 단독으로 사용한다.
  • SELECT 절과 FROM 절은 생략할 수 없다.


◈ 예제

select * from departments;


select department_name from departments;


예제 외에도 다른 테이블과 다른 컬럼을 검색해 보도록 한다.



테이블의 구조를 검색

DESCRIBE 테이블명;    또는    DESC 테이블명;

  • 테이블의 구조(컬럼의 이름, 데이터 타입)을 확인할 수 있다.


◈ 예제

desc departments;


오라클이 지원하는 데이터 타입에 대해서는 나중에 설명하도록 하겠다.



모든 테이블 목록 검색

SELECT * FROM tab;

  • 현재 스키마의 모든 테이블 목록을 검색한다.





 TIP 

SQL Developer의 왼쪽 창을 보면 테이블, 뷰 등 여러가지 메뉴가 있다.

테이블을 클랙해보면 현재 스키마의 모든 테이블 목록을 보여준다.

테이블 목록에서 원하는 테이블을 클릭해보면 테이블의 구조를 확인 가능하다.

SQL Developer를 사용하지 않는 상황이라면 위의 명령어들로 스키마의 구조를 파악하는 것이 중요!




별명을 사용한 검색

SELECT 컬럼명 as 별명, 컬럼명 as "별명", 컬럼명 별명, 컬럼명 "별명", …

FROM 테이블명;

  • 별명은 결과를 출력할 때 컬럼의 이름을 별명으로 바꿔서 표현해준다.
  • 'as'는 생략 가능하다.
  • 위의 4가지 표현식 모두 사용 가능하다.
  • "(이중인용부호)를 사용하지 않으면 대문자로 표현된다.
  • "(이중인용부호)의 사용이 필요한 경우
    1. 대소문자를 구별하고 싶은 경우
    2. 특수 문자가 포함된 경우
    3. 공백이 포함된 경우

◈ 예제

select last_name as name, last_name as "Name", last_name Name, last_name "name"

from employees;


"(이중인용부호)를 사용할 때와 사용하지 않을 때의 차이점을 볼 수 있다.
세 번째 컬럼의 이름이 'NAME_1'인 이유는 같은 대문자 name표현이 되어야 하는데 다른 컬럼에 같은 컬럼명이 있기 때문에 구분해 주기 위해서 자동으로 이름이 바뀌어 출력된 것이다.


수식을 사용한 검색

SELECT 수식 [별명], …

FROM 테이블명;

  • 수식을 사용할 경우에는 컬럼명에 수식이 출력되므로 별명을 사용하는 것을 권장한다.
  • 수식을 사용할 때 컬럼에 NULL값이 존재할 경우 결과는 항상 NULL값이므로 주의한다.


◈ 예제

select last_name "Name", salary*12, salary*12 "Annual Salary"

from employees;


select last_name "Name", salary*12 + salary*12*commission_pct "annual Salary"

from employees;


보너스를 포함한 연봉을 수식을 이용하여 검색한 결과이다.

commission_pct는 보너스 비율을 나타낸 값으로 보너스를 받지 않는 사람은 null 값이다.

모든 직원은 월급이 있지만 결과는 null로 나타나고, 보너스를 포함한 연봉이 얼마인지 알 수 없다.

salary에는 null값이 없지만 null값을 가진 commission_pct와 계산할 경우 null값으로 되는 것을 볼 수 있다.


◆ NULL(널 값) 이란?

널 값은 0이나 공백과는 다른 값으로, 아직 정해지지 않은 특별한 값을 의미한다.

널 값이 포함된 컬럼은 보통 연산을 사용하는 경우 정확한 결과를 볼 수 없기 때문에 주의한다.



널 값을 연산하기 위한 NVL 함수

NVL(컬럼명, 변환 값)

  • 컬럼에 널 값이 있을 경우 변환 값으로 변환한다.
  • 널 값이 아닌 경우 원래 값이 출력된다.
  • 변환 값의 타입은 반드시 컬럼의 타입과 일치해야 한다.


◈ 예제

select last_name "Name", commission_pct, nvl(commission_pct, 0)

from employees;


널 값이 0으로 변환된 것을 볼 수 있다.


select last_name "Name", salary*12 + salary*12*nvl(commission_pct,0) "Annual Salary"

from employees;


이전의 보너스를 포함한 연봉을 검색하는 식을 nvl함수를 사용하여 검색하였다.

수식의 결과가 null 값이었던 것과는 달리 보너스를 포함한 연봉의 결과를 정확하게 볼 수 있다.




No. 02

 

 

연결 연산자


기본 구조

SELECT 컬럼명 || '문자열' || …

FROM 테이블명;

  • 연결 연산자(||)는 문자열이나 컬럼을 하나의 문자열로 검색한다.
  • 숫자를 사용할 경우 단일 인용부호(')를 생략 가능하다.
  • 연결 연산자(||)는 사칙연산 중 '+','-'보다 우선순위가 높다.


◈ 예제

▶ 컬럼끼리의 연결

select last_name || job_id "Employees"

from employees;

 

 last_name 컬럼과 job_id의 컬럼이 하나의 문자열로 검색된다.


▶ 컬럼과 문자열의 연결

select last_name || ' is a ' || job_id "Employees"

from employees;

 

 문자열을 이용하여 보기 좋게 검색할 수 있다.




▶ 연산자의 우선순위

select last_name || ' ' || salary+120

from employees;

ORA-01722: invalid number

01722. 00000 -  "invalid number"

*Cause:    The specified number was invalid.

*Action:   Specify a valid number.


SQL문만 보면 맞는 문장 같지만 위와 같은 에러가 생긴다.

에러가 생긴 이유는 연결 연산자(||)가 +, -보다 우선순위가 높기 때문인데,

연결 연산자를 이용한 결과는 모두 문자로 취급되기 때문에 위의 SQL문은 문자+120이 된 것이다.

정상적으로 결과를 얻기 위해서는 괄호를 이용하여 (salary+120)을 계산하고 수행하면 된다.


select last_name || ' ' || (salary+120)

from employees;


원래의 월급보다 120이 많은 월급의 결과를 이름과 함께 하나의 문자열로 결과를 볼 수 있다.



단일 인용부호(')를 포함한 문자의 연결

SELECT 컬럼 || '''문자열''' || …

또는 SELECT 컬럼 || q' <'문자열'>' || 

  • 나타내고 싶은 단일 인용부호(')옆에 단일 인용부호(')를 하나 더 추가하면 된다.
  • 두번째, select 절의 <>대신 (),[],{} 다양한 괄호 사용이 가능하다.


◈ 예제

select department_name || ', it''s good department' evaluation

from departments;


select department_name || q'<, it's good department>' evaluation

from departments;


두 개의 방법 모두 같은 결과를 볼 수 있다.

개인적으로 문장열이 복잡해 질수록 두 번째 방법이 더 사용하기 편할 것 같다.




No. 03

 

 

중복 제거


기본 구조

SELECT [DISTINCT | ALL] 컬럼명, 컬럼명, …

FROM 테이블명;

  • DISTINCT : 중복된 출력 값은 한번만 출력한다.
  • ALL : 중복된 값을 모두 출력한다.
  • DISTINCT 나 ALL 아무것도 쓰지 않으면 기본값은 ALL로 인식된다.


◈ 예제

▶ ALL

select department_id

from employees;

 

  중복된 모든 정보를 출력한다.


▶ DISTINCT

select distinct department_id

from employees;

 

  중복된 결과를 한번만 출력한다.


 TIP  DISTINCT의 잘못된 예

select distinct department_id, last_name

from employees;


위의 예는 DISTINCT를 잘못 사용한 경우이다.

중복을 제거할 경우에는 레코드 단위로 중복을 검사하기 때문에 department_id와 last_name이 둘다 같은 행이 있어야 중복으로 처리된다.

last_name이 같은 경우가 없다면 결국, ALL을 한 경우와 같다. 필요없는 작업을 한 것이다.

지금같이 데이터의 수가 적은 경우에는 문제없지만 대용량의 데이터가 쌓여있는 데이터베이스에서 DISTINCT를 사용한다면 오라클의 성능을 떨어뜨릴 가능성이 있다. 즉, 결과의 출력이 늦을 수 있다. 그러므로 결과를 조금 더 빠르게 보기 위해서는 필요한 경우를 제외하고 DISTINCT를 사용하지 말자!




'SQL' 카테고리의 다른 글

[SQL 05] ORDER BY 절  (0) 2017.12.03
[SQL 04] WHERE 절  (0) 2017.12.03
[SQL 02] SQL Developer 간단 사용법 & SQL 언어  (0) 2017.11.29
[SQL 01] HR schema 구조  (0) 2017.11.29
[SQL 00] SQL실습을 위한 Oracle XE 11g 설치 및 준비  (0) 2017.11.29




No. 01

 

 

SQL 이란?


Structured Query language의 약자이다.

다양한 유연성을 가진 비절차적 언어이며, 자연어에 가까운 언어이므로 배우고 구사하는 것이 쉽다.

한마디로 데이터베이스에 정보를 요구하는 표준 질의어라고 할 수 있다.




No. 02

 

 

SQL 분류


분  류

기  능

명령어

 QUERY

 ◆ 데이터베이스에서 원하는 데이터의 검색 

 SELECT

 DDL

 (Data Definition Language)

 ◆ 데이터 구조를 정의, 변경, 삭제

 CREATE

 ALTER

 DROP

 TRUNCATE 

 DML

 (Data Manipulation Language)

 ◆ 사용자와 DBMS간의 인터페이스 제공

 ◆ 데이터의 삽입, 삭제, 수정

 ◆ 데이터 및 저장공간 회수

 INSERT

 DELETE

 UPDATE

 RENAME 

 DCL

 (Data Control Language)

 ◆ 데이터 제어를 정의하고 기술하는 언어

 ◆ 데이터의 보안 

 GRANT

 REVOKE 

 TCL

 (Transaction Control Language)

 ◆ DML 문에 의해서 변경된 사항을 관리 

 COMMIT

 ROLLBACK

 SAVEPOINT 




No. 03

 

 

SQL 문 작성법


  • SQL문은 반드시 ';'으로 끝나야 한다.
  • SQL문은 대소문자를 구별하지 않는다.
  • 하나의 절(SELECT, FROM, WHERE, …)은 line을 나누어 쓰는 것이 좋다. (가독성을 위해)
  • 주석은 '--'(한줄 주석) 이나 '/* comment */'(범위 주석)을 사용하여 쓸 수 있다.




'SQL' 카테고리의 다른 글

[SQL 05] ORDER BY 절  (0) 2017.12.03
[SQL 04] WHERE 절  (0) 2017.12.03
[SQL 03] SELECT 문  (0) 2017.11.30
[SQL 01] HR schema 구조  (0) 2017.11.29
[SQL 00] SQL실습을 위한 Oracle XE 11g 설치 및 준비  (0) 2017.11.29

 

 

Human Resource schema 구조


다음은 HR 스키마의 구조이다. SQL문을 작성 시 구조를 파악한 후 정확하게 작성하는 것은 매우 중요하다.

앞으로의 과정에서 자연스럽게 알 수 있다.





'SQL' 카테고리의 다른 글

[SQL 05] ORDER BY 절  (0) 2017.12.03
[SQL 04] WHERE 절  (0) 2017.12.03
[SQL 03] SELECT 문  (0) 2017.11.30
[SQL 02] SQL Developer 간단 사용법 & SQL 언어  (0) 2017.11.29
[SQL 00] SQL실습을 위한 Oracle XE 11g 설치 및 준비  (0) 2017.11.29

운영체제 : Windows 10 64bit를 기준으로 작성

다른 운영체제를 사용하시는 분들은 그에 맞게 다운로드 하시고 진행하시면 됩니다.

No. 01

 

 

Oracle Express Edition 11g 다운로드


SQL 실습만을 사용하기엔 XE 만으로도 충분합니다. 필요하신 분들은 상위 버전을 받으시고 설치하셔도 상관없습니다.


1. https://www.oracle.com 에 접속하여 상위 메뉴에서 로그인을 한다.



아이디가 없으신 분들은 sign in/create an account를 클릭하여 회원가입을 한다.

회원가입을 할 때 나머지 항목들은 대충 적어도 되지만 주의할 것은 이메일은 인증메일이 날라오기 때문에 메일을 받을 수 있도록 정확하게 적는다.

비밀번호 같은 경우 대문자, 소문자, 숫자가 모두 조합된 비밀번호여야 한다.

메일 인증까지 끝낸 후 다음 단계를 진행하도록 한다.



2. Menu에서 다음과 같은 순서로 클릭하고 Oracle Database를 클릭한다.




3. Download 창 밑에 보면 Oracle 11g Express Edition의 download 부분을 누른다.




4. 라이센스 동의를 체크하고 윈도우 64bit용 버전을 받는다.





No. 02

 

 

Oracle Express Edition 11g 설치


1. 다운로드한 파일의 압축을 풀고 Setup파일을 찾아 실행시킨다.




2. 다음 과정대로 설치를 진행한다.





저의 경우는 oracle로 비밀번호를 설정. 나중에 쓰이게 되니 기억해두세요.







3. 오라클 설치는 끝났지만 수월한 실습을 위해서 몇 가지 설정해 주어야 하는 것이 있다.

윈도우 시작메뉴 → 모든 프로그램 → Oracle Database 11g Express Edition 으로 들어가서

Run SQL Command Line을 실행시키면 다음과 같은 창이 뜬다.





4. 다음과 같은 순서로 명령어를 실행해주면 된다.
    • connect sys/oracle as sysdba

 TIP   sys 계정으로 로그인하는 명령어이며, 여기서 oracle은 데이터베이스를 설치할 때 설정해주었떤 비밀번호이다.

    • alter user hr identified by hr account unlock;

 TIP   hr 계정의 비밀번호를 hr로 설정하고 잠겨있던 hr계정의 잠금을 해제하는 명령어이다.

        sys계정으로 로그인해야만 위의 명령어를 사용할 수 있기 때문에 sys계정을 먼저 로그인한 것이다.


밑의 나머지 명령어 2개는 하지 않아도 되는 명령이지만, 계정의 잠금이 잘 풀렷는지 확인하기 위해 실행해보자.





No. 03

 

 

Oracle SQL Developer 다운로드 및 실행


위의 SQL 커맨드 창에서 SQL문장을 실습할 수 있지만 더 편하게 결과를 보기 위하여 SQL Developer를 설치하도록 한다.


1. https://www.oracle.com 에 접속하여 Menu에서 다음과 같은 순서로 클릭하고 Developer Tools를 클릭한다.




2. Developer Tools 화면에서 SQL Developer를 클릭한다.




3. JDK를 기존에 설치하신 분은 밑의 파일을 다운받으시면되고, 설치하지 않으신분은 바로 위의 JDK8 included 파일을 받으시면 됩니다.




4. 다운로드한 파일의 압축을 풀고 sqldeveloper 실행파일을 실행한다.



sqldeveloper의 설치가 필요하지 않고 실행파일로 실행시킨다.

sqldeveloper 실행파일의 바로가기를 만들어 바탕화면에 놓고 사용하면 편하다.



5. JDK미포함 버전을 받았을 경우 SQL Developer를 처음 실행시키면 JDK가 설치된 폴더위치를 설정해주는 창이 나타난다.

   설치한 폴더로 지정해주면 된다.







6. SQL Developer가 실행되고 왼쪽을 보면 다음과 같은 창이 보인다. '+'버튼을 누른다.




7. 접속 이름 : HR, 사용자 이름 : hr, 비밀번호 : hr 로 작성한 뒤 비밀번호 저장을 누르고, 테스트 버튼을 누른다.




8. 왼쪽 하단에 "상태: 성공"이라고 표시되면 접속 버튼을 누른다.




9. 왼쪽 창의 접속에 HR 계정이 띄어져 있다면 성공적으로 접속이 된 것이다.

비밀번호 저장을 해놨기 때문에 이제 Developer만 실행하면 곧바로 HR 계정을 사용할 수 있다.





No. 04

 

 

참고


사용자 ID

설  명

SYS

 오라클 Super 사용자 명이며, 데이터베이스에서 발생하는 모든 문제들을 처리할 수 있는 권한을 가지고 있다. 

SYSTEM

 오라클 데이터베이스를 유지보수 관리 할 때 사용하는 사용자 명이며, SYS 사용자와 차이점은 데이터베이스를 생성할 수 있는 권한이 없다.

SCOTT

 처음 오라클을 사용하는 사용자를 위해 만들어 놓은 sample 사용자 ID 

HR

  처음 오라클을 사용하는 사용자를 위해 만들어 놓은 sample 사용자 ID 


앞으로의 SQL 실습은 HR 스키마를 사용하여 실습하도록 하겠습니다.




'SQL' 카테고리의 다른 글

[SQL 05] ORDER BY 절  (0) 2017.12.03
[SQL 04] WHERE 절  (0) 2017.12.03
[SQL 03] SELECT 문  (0) 2017.11.30
[SQL 02] SQL Developer 간단 사용법 & SQL 언어  (0) 2017.11.29
[SQL 01] HR schema 구조  (0) 2017.11.29

No. 01

 

 

조건문


조건문은 프로그래밍에 있어서 매우 중요하다. 조건문을 이용하여 조건의 참,거짓에 따라 서로 다른 작업을 수행할 수 있다.

조건문에 사용하는 조건식의 결과는 반드시 true 또는 false이어야 하며, 다음과 같은 종류가 있다.

if문, if-else문, if-else if문, switch




No. 02

 

 

단순 if문


if문

if(조건식) {

  ... 실행 문장...

}

  • 가장 기본적인 조건문이다.
  • '조건식'과 '괄호{}'로 이루어져 있다. 괄호를 '블럭(block)'이라고 한다.
  • 블럭 내의 문장이 하나뿐일 경우 괄호{}를 생략할 수 있다. (가독성을 위해 생략하지 않는 것을 추천)
  • 조건식이 참(true)이면  if 내부의 실행 문장이 실행되며, 거짓(false)이면 if문을 벗어난다.


예제1 (짝수, 홀수 판단)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import java.util.Scanner;
 
public class ControlStatement {
 
    public static void main(String[] args) {
        
        Scanner scanner = new Scanner(System.in);
        
        System.out.println("짝수 홀수를 판단할 숫자를 입력하세요.");        
        String input = scanner.nextLine();        
        int n = Integer.parseInt(input);        
        
        //짝수일 때만 실행
        if(n%2 ==0) {
            System.out.println(n+"은 짝수입니다.");
        }
        
        //홀수일 때만 실행
        if(n%2 != 0) System.out.println(n+"은 홀수입니다.");         
 
    }//main
    
}//class
                                                          Colored By Color Scripter

실행 결과

짝수 홀수를 판단할 숫자를 입력하세요.

23

23은 홀수입니다.


if문을 사용하여 짝수인지 홀수인지 구분하는 예제이다. 입력한 n을 나눈 나머지가 0이면 짝수이고 아니면 홀수이다.

if문의 조건식이 true 일 때만 if문 내부의 실행문장을 실행하고 false일 때는 건너띈다.

실행문장이 하나일 경우에만 괄호{}를 생략 가능하다.



◈ 예제2 (학점 판단)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import java.util.Scanner;
 
public class ControlStatement {
 
    public static void main(String[] args) {
        
        Scanner scanner = new Scanner(System.in);
        
        System.out.println("점수를 입력하세요.");        
        String input = scanner.nextLine();        
        int score = Integer.parseInt(input);        
        char grade = ' ';
        
        if(score >= 90) { grade = 'A'; }
        
        if(score >= 80 && score <=89) { grade = 'B'; }
        
        if(score >= 70 && score <=79) { grade = 'C'; }
        
        if(score >= 60 && score <=69) { grade = 'D'; }
        
        if(score <=59) { grade = 'F'; }
        
        System.out.println("당신의 학점은 : "+grade);
 
    }//main
    
}//class
                                           Colored By Color Scripter


실행 결과

점수를 입력하세요.

84

당신의 학점은 : B


점수를 입력받아 학점을 판단하는 예제이다.




No. 03

 

 

if-else문


단순 if문은 if문의 조건식이 참일 경우에만 실행 문장이 실행되고, 조건식이 거짓인 경우에는 아무 일도 하지 않고 if문을 벗어난다.

if-else문은 조건식이 거짓인 경우에 else블럭의 문장을 수행한다. 조건 연산자와 같은 역할을 하지만 가독성에서 뛰어 나기 때문에 if-else문을 선호한다.


if-else문

if (조건식) {

 조건식이 참일 경우 ... 실행 문장...

}

else {

 조건식이 거짓일 경우 ... 실행 문장...

}

  • else문 역시 실행문장을 블럭{}으로 감싸주어야 한다.
  • 조건식이 참(true)일 경우는 if문 블럭안의 실행문장을 거짓(false)일 경우 else문 블럭안의 실행 문장을 수행한다.


◈ 예제 (짝수, 홀수 판단)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import java.util.Scanner;
 
public class ControlStatement {
 
    public static void main(String[] args) {
        
        Scanner scanner = new Scanner(System.in);
        
        System.out.println("짝수 홀수를 판단할 숫자를 입력하세요.");        
        String input = scanner.nextLine();        
        int n = Integer.parseInt(input);
        
        if(n%2 ==0) {
            System.out.println(n+"은 짝수 입니다.");
        }
        else {
            System.out.println(n+"은 홀수 입니다.");
        }    
 
    }//main
    
}//class
                                                        Colored By Color Scripter


실행 결과

짝수 홀수를 판단할 숫자를 입력하세요.

23

23은 홀수입니다.


단순 if문은 if문의 수에 따라 조건식도 적어야 하지만 둘 중 하나를 선택해야 할 경우 if-else문을 사용하면 더 효율적으로 프로그래밍 할 수 있다.

조건 연산자로도 같은 결과를 볼 수 있지만 가독성 면에서 if-else문이 더 좋다.



No. 04

 

 

if-else if문 (다중 if문)


if-else문의 두 가지 경우 중 하나가 실행되는 구조다. 처리해야 할 경우의 수가 셋 이상일 경우에는 여러 개의 조건식을 쓸 수 있는 'if- else if'문을 사용하면 된다. 다중 if문은 여러 가지 모양으로 구성할 수 있으나 전형적인 모양은 다음과 같다.


if-else if문

if (조건식1) {

   조건식1이 참일 경우 ... 실행 문장...

}

else if (조건식 2) {

   조건식2가 참일 경우 ... 실행 문장...

}

else if (조건식 3) {

   조건식3이 참일 경우 ... 실행 문장...

}

else if (조건식 n) {

   조건식n이 참일 경우 ... 실행 문장...

}

else{

   위의 조건식 모두를 만족하지 않을 경우 ... 실행 문장...   

}

  • 여러 개의 조건식중 참(true)인 조건식을 만나면 해당 블럭의 실행문장을 수행하고 if문 전체를 벗어난다.(하나만 실행하고 종료)
  • 첫 번째 조건식부터 순서대로 비교한다.
  • else 블럭은 생략가능하다.


◈ 예제 (학점 판단)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import java.util.Scanner;
 
public class ControlStatement {
 
    public static void main(String[] args) {
        
        Scanner scanner = new Scanner(System.in);
        
        System.out.println("점수를 입력하세요.");        
        String input = scanner.nextLine();        
        int score = Integer.parseInt(input);
        char grade = ' ';
        
        if (score >= 90) { grade = 'A'; }
        else if(score >= 80) { grade = 'B'; } // score >= 80 && score <= 89
        else if(score >=70) { grade = 'C'; }  // score >= 70 && score <= 79
        else if(score >= 60) { grade = 'D'; } // score >= 60 && score <= 69
        else { grade = 'F'; }  // score <= 59
        
        System.out.println("당신의 학점은 : "+grade);
 
    }//main
    
}//class
                                                                        Colored By Color Scripter


실행 결과

점수를 입력하세요.

84

당신의 학점은 : B


첫 번째 조건식부터 차례대로 판단하기 때문에 90이상이 아니면 다음 if문을 검사하기 때문에 'score>=80 && score<=89'의 조건을 중복 해서 적지 않고 'score>=80'로 간단히 쓸 수 있다.

단순 if문으로 여러개 사용할 때보다 속도면에서도 효율적이다. 단순 if문은 조건식마다 모두 검사하는 반면 if-else if문은 차례로 조건식을 검사하면서 만족하는 조건식이 있으면 문장을 수행하고 다음 if문은 검사하지도 않고 종료하기 떄문이다.




No. 05

 

 

중첩 if문


if문 블럭 내에 또 다른 if문을 사용할 수 있다. 이것을 중첩 if문이라고 부르며, 횟수에느 제한이 없다.


◈ 예제1 (팔굽혀펴기 등급 판단)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
import java.util.Scanner;
 
public class ControlStatement {
 
    public static void main(String[] args) {
        
        Scanner scanner = new Scanner(System.in);
        
        System.out.println("당신의 나이를 입력하세요.");
        String input1 = scanner.nextLine();        
        int age = Integer.parseInt(input1);        
        
        System.out.println("팔굽혀펴기 횟수를 입력하세요.");        
        String input2 = scanner.nextLine();        
        int score = Integer.parseInt(input2);
        String grade = "";
        
        if(age <=25) { //나이가 25세 이하일 경우
            if(score >=72) {
                grade="특급";            
            }
            else if(score >= 64) {
                grade = "1급";
            }
            else if(score >= 56) {
                grade = "2급";
            }            
        }        
        else if(age <= 30) { // 26~30세 일 경우
            if(score >=70) {
                grade="특급";            
            }
            else if(score >= 62) {
                grade = "1급";
            }
            else if(score >= 54) {
                grade = "2급";
            }            
        }
        
        System.out.println("팔굽혀 펴기 등급  : "+grade);        
 
    }//main
    
}//class
                                                   Colored By Color Scripter


실행 결과

당신의 나이를 입력하세요.

23

팔굽혀 펴기 횟수를 입력하세요.

65

팔굽혀 펴기 등급  : 1급


팔굽혀펴기 등급을 판단하는 예제이다. 체력검정의 경우 나이에 따른 횟수에 등급이 판단되므로 위와 같이 중첩if문을 사용하여 프로그래밍 할 수 있다.

중첩 if문을 사용할 때 처럼 복잡해지는 경우 블럭{}으로 잘 구분해주어야 가독성에도 좋고 예상하지 못한 결과를 피할 수 있다.



No. 06

 

 

switch문


하나의 식의 값에 따라 여러 결과를 내고자 하는 경우 if문을 사용하게 되면 else-if를 계속 추가해야 하므로 조건식이 많아져서 복잡해지고 처리 시간도 많이 걸린다. 그래서 처리할 경우의 수가 많은 경우에는 if문보다 switch문으로 작성하는 것이 좋다. 다만, switch문은 제약조건이 있기 때문에 if문으로 처리 해야 하는 경우도 있다.


switch문

switch (조건식) {

case 값1 :

조건식이 값1일 경우 ... 실행 문장...

break;

case 값2 :

조건식이 값2일 경우 ... 실행 문장...

break;

case 값n :

    조건식이 값n일 경우 ... 실행 문장...

break;

default :

조건식의 결과에 맞는 값이 없는 경우 ... 실행 문장... 

}

  • 조건식을 계산하고 결과와 일치하는 case문으로 이동하여 문장을 실행한다.
  • switch문의 조건식 결과는 정수 또는 문자열이어야 한다.
  • case문의 값은 중복되지 않아야 한다.
  • break문이나 switch문의 끝을 만나면 switch문을 빠져나간다.
  • break문을 적지 않으면 다음 case문이 조건식의 값이 아니더라도 실행하므로 적어주어야 한다. (고의적으로 생략하는 경우도 있다.)


◈ 예제1 (학점 판단)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
import java.util.Scanner;
 
public class ControlStatement {
 
    public static void main(String[] args) {
        
        Scanner scanner = new Scanner(System.in);
        
        System.out.println("점수를 입력하세요.");        
        String input = scanner.nextLine();        
        int score = Integer.parseInt(input);
        char grade = ' ';
        
        switch(score/10) {
            case 10 :
                grade = 'A';
                break;
            case 9 :
                grade = 'A';
                break;
            case 8 :
                grade = 'B';
                break;
            case 7 :
                grade = 'C';
                break;
            case 6 :
                grade = 'D';
                break;
            default :
                grade = 'F';
                
        }//switch
        
        System.out.println("당신의 학점은 : "+grade);
 
    }//main
    
}//class
                                      Colored By Color Scripter


실행 결과

점수를 입력하세요.

75

당신의 학점은 : C


점수를 입력받아 학점을 판단하는 예제이다. 조건식을 보면 score/10 인데 점수를 나누면 몫을 얻을 수 있고 몇점대인지 알 수 있다.

이때 몇점대인지의 결과만 가지고 case문으로 판단하여 학점을 판단할 수 있다.



◈ 예제2 (학점 판단)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
import java.util.Scanner;
 
public class ControlStatement {
 
    public static void main(String[] args) {
        
        Scanner scanner = new Scanner(System.in);
        
        System.out.println("점수를 입력하세요.");        
        String input = scanner.nextLine();        
        int score = Integer.parseInt(input);
        char grade = ' ';
        
        switch(score/10) {
            case 10 :            
            case 9 :
                grade = 'A';
                break;
            case 8 :
                grade = 'B';
                break;
            case 7 :
                grade = 'C';
                break;
            case 6 :
                grade = 'D';
                break;
            default :
                grade = 'F';
                
        }//switch
        
        System.out.println("당신의 학점은 : "+grade);
 
    }//main
    
}//class
                                     Colored By Color Scripter


실행 결과

점수를 입력하세요.

75

당신의 학점은 : C


위의 결과와 같은 결과를 얻을 수 있지만 한가지 다른 것이 있다. 예제1에서는 만점을 받았을 경우 10 일때와 9일때 둘다 grade변수에 일일이 학점을 입력해주었으나 위와 같이 break문을 생략하면 10점일때와 9점일때 모두 하나의 실행문장으로 처리될 수 있다.

올바른 방법으로 이용한다면 문제가 되지 않지만 실수로 break문을 생략했다면 원하지 않는 결과가 나올 수 있으니 주의하여 사용하자.


switch문 역시 if문처럼 중첩으로 사용할 수 있으며, if문과도 조합하여 사용할 수도 있다.




'JAVA' 카테고리의 다른 글

[Java 16] 증감 연산자, 조건 연산자  (0) 2017.11.26
[Java 15] 논리 연산자, 비트 연산자, 쉬프트 연산자  (0) 2017.11.25
[Java 14] 비교 연산자  (0) 2017.11.23
[Java 13] 산술 연산자  (0) 2017.11.22
[Java 12] 연산자란?  (0) 2017.11.21

No. 01

 

 

증감 연산자  ++  --


증감연산자는 변수 자신의 값을 1증가 시키거나 감소시킨다. 연산자가 피연산자 앞 또는 뒤에 붙는가에 따라서 값이 달라지므로 주의하여야 한다.



예제1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public class Operator {
 
    public static void main(String[] args) {
        //증감 연산자의 독립 사용
        
        int i = 1;
        
        i++; // i = i + 1;과 같다.
        System.out.println("i++의 결과 :"+i);
        
        i = 1;
        ++i; // i = i + 1;과 같다.
        System.out.println("++i의 결과 :"+i);
        
        i = 1;
        i--; // i = i - 1;과 같다.
        System.out.println("i--의 결과 :"+i);
        
        i = 1;
        i--; // i = i - 1;과 같다.
        System.out.println("--i의 결과 :"+i);        
                        
    }//main    
 
}//class
                              Colored By Color Scripter


실행 결과

i++의 결과 : 2

++i의 결과 : 2

i--의 결과 : 0

--i의 결과 : 0


위의 예제처럼 단독으로 증감 연산자를 사용시 연산자를 사용한 위치에 대한 결과의 차이가 없다.



◈ 예제2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
public class Operator {
 
    public static void main(String[] args) {
        //증감 연산자의 독립 사용이 아닐 때
        
        int i = 1, j = 0;
        
        j = i++; // 연산 과정 : 1] j = i를 실행, 2] i를 1 증가 
        System.out.printf("j = i++의 결과 : i=%d, j=%d%n",i,j);
        
        i = 1;
        j = 0;
        j = ++i; // 연산 과정 : 1] i를 1증가, 2] j = i를 실행
        System.out.printf("j = ++i의 결과 : i=%d, j=%d%n",i,j);
        
        i = 1;
        j = 0;
        j = i--; // 연산 과정 : 1] j = i를 실행, 2] i를 1 감소 
        System.out.printf("j = i--의 결과 : i=%d, j=%d%n",i,j);
        
        i = 1;
        j = 0;
        j = --i; // 연산 과정 : 1] i를 1감소, 2] j = i를 실행
        System.out.printf("j = --i의 결과 : i=%d, j=%d%n",i,j);        
                        
    }//main    
 
}//class
                                                     Colored By Color Scripter


실행 결과

j = i++의 결과 : i=2, j=1

j = ++i의 결과 : i=2, j=2

j = i--의 결과 : i=0, j=1

j = --i의 결과 : i=0, j=0


· 증감 연산자가 단독으로 사용되지 않은 경우 연산자의 위치에 따른 결과는 다르다. 그러므로 사용시 위치에 주의해서 사용해야 한다.

· 뒤에 사용할 때는 앞의 식을 먼저 실행시킨후 자신의 값을 증가시키거나 감소시킨다.

· 앞에 사용할 때는 자신의 값을 증가시키거나 감소시킨후 식을 계산한다.




No. 02

 

 

조건 연산자  ? :


조건 연산자는 세 개의 피연산자로 구성되어 삼항 연산자라고도 한다. 


조건 연산자

조건식 ? 식1 : 식2

  • 조건식이 참(true)일 때 결과는 식1의 값이 된다.
  • 조건식이 거짓(false)일 때 결과는 식2의 값이 된다.
  • 조건식을 괄호()로 둘러싸면 가독성을 높일 수 있지만 필수는 아니다.


◈ 예제1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class Operator {
 
    public static void main(String[] args) {
        //조건 연산자  ? :
        
        int a = 10, b = 20;
        int result;
        
        // 1] 변수를 사용하여 저장
        result = (a>b)? (a-b) : (b-a);        
        System.out.println("1] 두 수의 차이 : "+result);
        
        // 2] 변수를 사용하지 않고 바로 출력
        System.out.println("2] 두 수의 차이 : "+ ((a>b)? (a-b) : (b-a)));        
        
    }//main    
 
}//class
                                                               Colored By Color Scripter


실행 결과

1] 두 수의 차이 : 10

2] 두 수의 차이 : 10


변수를 사용하여 저장할 수도 있고, 다른 연산과 바찬가지로 바로 print문 안에 사용하여 결과를 출력할 수도 있다.

두 수의 차이를 구하는 것이기 때문에 a에서 바로 b를 빼버리면 b가 클 경우 '-'값이 나오기 때문에 조건 연산자로 차이값만을 구할 수 있도록 하였다.

a>b보다 크다는 조건식이 참이면 a에서 b를 바로 빼고, 거짓이면 b에서 a를 빼서 차이값을 구한다.



◈ 예제2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import java.util.Scanner;
 
public class Operator {
 
    public static void main(String[] args) {
        //조건 연산자  ? :
        
        Scanner scanner = new Scanner(System.in);
        
        System.out.println("알파벳인지 판단할 문자를 입력하세요.");
        String strC = scanner.nextLine();
        char c = strC.charAt(0);
        System.out.println((('a'<=c && c<='z') || ('A'<=c && c<='Z'))? "입력한 문자는 알파벳이다.": "입력한 문자는 알파벳이 아니다.");
        
    }//main    
 
}//class
                                                                                                                              Colored By Color Scripter


실행 결과

알파벳인지 판단할 문자를 입력하세요.

입력한 문자는 알파벳이 아니다.


조건식에 따른 결과로 수식뿐만 아니라 문자열도 나오게 할 수 있다.




'JAVA' 카테고리의 다른 글

[Java 17] 조건문 - if, switch  (0) 2017.11.27
[Java 15] 논리 연산자, 비트 연산자, 쉬프트 연산자  (0) 2017.11.25
[Java 14] 비교 연산자  (0) 2017.11.23
[Java 13] 산술 연산자  (0) 2017.11.22
[Java 12] 연산자란?  (0) 2017.11.21

No. 01

 

 

논리 연산자  &&  ||  !


논리 연산자는 피연산자로 boolean형 또는 boolean형 값을 결과로 하는 조건식만을 허용한다.

논리 연산자 '&&'은 '그리고(AND)'에 해당하며, '||'은 '또는(OR)'에 해당한다.




논리 연산자의 연산 결과1

x

y

x || y

x && y

 true

true

true

true

 true

false

true

false

false

true

true

false

false

false

false

false


논리 연산자의 연산 결과2

x

!x

true

false

false

true



예제1 (AND, OR 연산자)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import java.util.Scanner;
 
public class Operator {
 
    public static void main(String[] args) {
        
        Scanner scanner = new Scanner(System.in);
        
        //1] 10 < x < 20에 있는지 판단
        System.out.println("1] 10과 20사이에 있는지 판단할 숫자 x를 입력하세요.");
        String strX = scanner.nextLine();
        int x = Integer.parseInt(strX);
        System.out.printf("x=%d, x > 10 && x < 20 인가?  %b%n",x, x>10 && x<20);
        System.out.println();
        
        //2] i가 2의 배수 또는 3의 배수인지 판단
        System.out.println("2] 2의 배수 또는 3의 배수인지 판단할 숫자 i를 입력하세요.");
        String strI = scanner.nextLine();
        int i = Integer.parseInt(strI);
        System.out.printf("i=%d, i%%2==0 || i%%3==0 인가?  %b%n",i, i%2==0 || i%3==0);
        System.out.println();
        
        //3] c가 알파벳인지 아닌지 판단
        System.out.println("3] 알파벳인지 판단할 문자 c를 입력하세요.");
        String strC = scanner.nextLine();
        char c = strC.charAt(0); //String -> char로 변환하는 메소드
        System.out.printf("c=%c, 입력한 문자는 알파벳인가?  %b%n",c, ('a'<=c && c<='z') || ('A'<=c && c<='Z'));
        
    }//main
 
}//class
                                                                                                          Colored By Color Scripter


실행 결과

1] 10과 20사이에 있는지 판단할 숫자 x를 입력하세요.

23

x=23, x > 10 && x < 20 인가?  false


2] 2의 배수 또는 3의 배수인지 판단할 숫자 i를 입력하세요.

41

i=41, i%2==0 || i%3==0 인가?  false


3] 알파벳인지 판단할 문자 c를 입력하세요.

B

c=B, 문자 c는 알파벳인가?  true


1]의 경우 일상생활에서 표현하는 것은 10 < x < 20 과 같이 표현할 수 있지만 자바에서는 이런 문법이 없고 하나씩 비교한다음 AND 연산자로 묶어 주어야 한다. x가 10보다 큰것도 만족하고 x가 20보다 작은것도 만족했을 때만 true가 나오는 것을 볼 수 있다.

2]의 경우 OR연산자를 사용한 경우로 2의 배수일때나 3의 배수 둘중 하나만 만족하여도 true가 나온다. 입력한 41은 둘다 만족하지 않았기 때문에 false값이 나왔다.

3]의 경우처럼 여러개의 연산도 논리연산자로 이어서 사용할 수 있다.



◈ 예제2(부정 연산자)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class Operator {
 
    public static void main(String[] args) {
        
        boolean b = true;
        int i = 15;
        
        System.out.printf("b=%b, !b의 결과 : %b%n",b,!b);
        System.out.printf("i=%d, !(i>10 && i<20)의 결과 : %b%n",i, !(i>10 && i<20)); 
        
    }//main
 
}//class
                                                                       Colored By Color Scripter


실행 결과

b=true, !b의 결과 : false

i=15, !(i>10 && i<20)의 결과 : false


부정 연산자를 사용하면 피연산자의 논리값에 반대되는 결과를 반환한다.

피 연산자가 true이면 false를, false이면 true를 반환한다.




No. 02

 

 

비트 연산자  &  |  ^  ~


비트 연산자는 피연산자의 각 비트들을 대상으로 연산이 이루어지며 총 4개의 연산자가 있다.




비트 연산자의 연산 결과1

x

y

x | y

x & y

x ^ y

1

1

1

1

0

1

0

1

0

1

0

1

1

0

1

0

0

0

0

0


비트 연산자의 연산 결과2

x

~x

1

0

0

1



◈ 예제(비트 연산자)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class Operator {
 
    public static void main(String[] args) {
        
        int x = 10; //2진수로 변환시 1010
        int y = 12; //2진수로 변환시 1100
        
        System.out.println("x = \t"+toBinaryString(x));
        System.out.println("y = \t"+toBinaryString(y));
        System.out.println("x|y = \t"+toBinaryString(x|y));
        System.out.println("x&y = \t"+toBinaryString(x&y));
        System.out.println("x^y = \t"+toBinaryString(x^y));
        System.out.println("~x = \t"+toBinaryString(~x));
                        
    }//main
    
    //10진 정수를 2진수로 변환하는 메서드
    static String toBinaryString(int number) {
        String zero = "00000000000000000000000000000000";
        String binary = zero + Integer.toBinaryString(number);
        return binary.substring(binary.length()-32);    
    }
 
}//class
                                                Colored By Color Scripter


실행 결과


toBainaryString() 메서드는 신경쓸 필요 없다 단지 비트연산자가 컴퓨터 내부에서 어떻게 처리되는지 문자열로 표현해주기 위해 사용했다.

비트 연산자를 사용한 결과가 어떻게 나오는지 볼 수 있다. 

· 비트AND연산자'&'은 피연산자 양 쪽이 모두 1이일 때만 1을 결과로 얻고, 그 외에는 0을 얻는다.

· 비트OR연산자'|'은 피연산자 중 한쪽이 1이면 1을 결과로 얻고, 그 외에는 0을 얻는다.

· 비트XOT연산자 '^'은 피연산자의 값이 서로 다를 때만 1을 결과로 얻고, 그 외에는 0을 얻는다.

· 비트 전환 연산자는 0은 1로, 1은 0으로 바꾼다.




No. 03

 

 

쉬프트 연산자  <<  >>


쉬프트 연산자는 피연산자의 각 비트들을 '오른쪽(>>)' 또는 '왼쪽(<<)'으로 이동시킨다.





◈ 예제(쉬프트 연산자)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class Operator {
 
    public static void main(String[] args) {
        
        int x = 10; //2진수로 변환시 1010
        int y = 12; //2진수로 변환시 1100
        
        System.out.println("x = \t\t"+toBinaryString(x));        
        System.out.println("x >> 1 = \t"+toBinaryString(x >> 1));// 오른쪽으로 1칸 이동
        System.out.println("x >> 2 = \t"+toBinaryString(x >> 2));// 오른쪽으로 2칸 이동
        System.out.println("y = \t\t"+toBinaryString(y));
        System.out.println("y << 1 = \t"+toBinaryString(y << 1));// 왼쪽으로 1칸 이동
        System.out.println("y << 2 = \t"+toBinaryString(y << 2));// 왼쪽으로 2칸 이동
                        
    }//main
    
    //10진 정수를 2진수로 변환하는 메서드
    static String toBinaryString(int number) {
        String zero = "00000000000000000000000000000000";
        String binary = zero + Integer.toBinaryString(number);
        return binary.substring(binary.length()-32);    
    }
 
}//class
                                                                          Colored By Color Scripter


실행 결과


지정한 숫자만큼 자리를 이동하는 것을 볼 수 있다.


· 왼쪽 쉬프트(<<n)는 을 곱한 결과와 같다.

· 오른쪽 쉬프트(>>n)는 으로 나눈 결과와 같다.




'JAVA' 카테고리의 다른 글

[Java 17] 조건문 - if, switch  (0) 2017.11.27
[Java 16] 증감 연산자, 조건 연산자  (0) 2017.11.26
[Java 14] 비교 연산자  (0) 2017.11.23
[Java 13] 산술 연산자  (0) 2017.11.22
[Java 12] 연산자란?  (0) 2017.11.21

+ Recent posts