< 논리연산자 >
-- EMP 테이블에서, 부서코드가 30이면서 급여가 1000이상인 사원 조회
SELECT *
FROM EMP
WHERE DEPTNO
= 30 --WHERE 절 뒤에 **AND 연산자로 조건 추가**
AND SAL
>= 1000
-- EMP 테이블에서 급여가 2000이상이면서, JOB이 MANAGER인 사원 모든 칼럼 조회
SELECT *
FROM EMP
WHERE SAL
>= 2000 --WHERE 절 뒤에 AND 연산자로 조건 추가
AND JOB
= 'MANAGER'
;
--EMP 네이블에서 급여가 2000이상이면서 4000이하인 사원의 사번, 사원명, 부서코드, 급여 조회
SELECT EMPNO
, ENAME
, DEPTNO
, SAL
FROM EMP
WHERE SAL
>= 2000 --WHERE 절 뒤에 AND 연산자로 조건 추가
AND SAL
<= 4000;< BETWEEN AND >
💡 **[문법]** WHERE 비교대상칼럼 BETWEEN A AND B
- **WHERE 절에서 사용되는 구문**으로 범위에 대한 조건을 제시알 때 사용
- 비교대상 칼럼 값이 A 이상이고 B 이하인 경우 TRUE를 리턴
- 초과 연산은 불가. 이상 이하에서만 사용 가능.
--EMP 테이블에서 급여가 2000이상이면서 4000이하인 사원의 사번, 사원명, 부서코드, 급여 조회
SELECT EMPNO
, ENAME
, DEPTNO
, SAL
FROM EMP
WHERE SAL
BETWEEN 2000 AND 4000
--AND
--DEPTNO BETWEEN 20 AND 40 -- BETWEEN
;
-- EMP 네이블에서 급여가 2000이상이면서 4000이하가 아닌 사원의 사번, 사원명, 부서코드, 급여 조회
SELECT EMPNO
, ENAME
, DEPTNO
, SAL
FROM EMP
WHERE SAL
NOT BETWEEN 2000 AND 4000 -- NOT 은 칼럼 앞 또는 BETWEEN 앞에 작성 가능
;
-- EMP 테이블에서, 입사일이 81/01/01 ~ 81/12/31이 아닌 사원 모든 칼럼 조회
SELECT *
FROM EMP
WHERE HIREDATE
NOT BETWEEN '81/01/01' AND '81/12/31'
ORDER BY HIREDATE
DESC -- ORDER BY 값정렬! 기본적으로는 ASC(오름차순) -- DESC 내림차순
;
SELECT *
FROM EMP
WHERE SAL
< 1000
OR NOT SAL
>4000
;< LIKE>
💡 [문법] WHERE 비교칼럼 LIKE '패턴';
- 비교하려는 칼럼이 지정된 특정 패턴에 만족할 경우 TRUE 리턴-
- 특정 패턴에는 '%' , '' 를 와일드 카드로 사용 가능.
% : 0글자 이상일 때. / : 1글자
비교칼럼
LIKE '안녕%' => 비교칼럼 값 중 '안녕' 으로 시작하는 모든 행을 조회.
비교칼럼 LIKE '%안녕' => 비교칼럼 값 중 '안녕' 으로 끝나는 모든 행을 조회.
비교칼럼 LIKE '%안녕%' => 비교칼럼 값 중 '안녕' 을 포함하는 모든 행을 조회.
비교칼럼 LIKE '_안녕' => 비교칼럼 값 중 '안녕' 앞에 한 글자가 오는 행을 조회.
비교칼럼 LIKE '안녕_' => 비교칼럼 값 중 '안녕' 뒤에 한 글자가 오는 행을 조회.
비교칼럼 LIKE '안녕__' => 비교칼럼 값 중 '안녕'뒤에 두 글자가 오는 행을 조회.
비교칼럼 LIKE '__' => 비교칼럼 값 중 두 글자가 오는 행을 조회.
--EMP테이블에서 이름이 J로 시작하는 사원의 사번, 사원명, 부서코드
SELECT EMPNO
, ENAME
, DEPTNO
FROM EMP
WHERE ENAME
LIKE **'J%'**
;
--EMP테이블에서 이름이 N로 끝나는 사원의 사번, 사원명, 부서코드
SELECT EMPNO
, ENAME
, DEPTNO
FROM EMP
WHERE ENAME
LIKE '%N';
--EMP테이블에서 이름이 E가 포함되는 사원의 사번, 사원명, 부서코드
SELECT EMPNO
, ENAME
, DEPTNO
FROM EMP
WHERE ENAME
LIKE '%E%';
--EMP테이블에서 이름이 5글자인 사원의 사번, 사원명
SELECT EMPNO
, ENAME
FROM EMP
WHERE ENAME
LIKE '_____';
--EMP테이블에서 사원번호의 두 번째 자리가 '5'인 사원의 사번, 사원명
SELECT EMPNO
, ENAME
FROM EMP
WHERE EMPNO
LIKE '_5%'; -- 뒷자리에는 어떤게 들어올지 모르므로 '%' 붙여주기!
----------------------실습-----------------------------
--EMP테이블에서 이름의 첫 글자가 S 가 아닌 사원의 사번 이름 조회
SELECT EMPNO
, ENAME
FROM EMP
WHERE ENAME
NOT LIKE 'S%'; -- NOT 은 LIKE 앞 또는 칼럼명 앞에 쓸 수 있음. 💡 [문법] WHERE 비교칼럼 IN( 값, 값,
값, 값, ... 값); - 값 목록 중 일치하는 값이 있을 경우 TRUE 리턴
--EMP 테이블에서 JOD이 SALESMAN 이거나 MANAGER인 사원의 모든 칼럼
SELECT *
FROM EMP
WHERE JOB
IN ('SALESMAN', 'MANAGER');-- OR로도 쓸 수 있음. 💡
- SQL 마지막에 추가하여 정렬 기능-
- ASC, DESC로 오름차순, 내림차순 정렬 가능
- 기본적으로는 ASC로 설정되어 있음.
- 마지막에 추가하면 됨.
SELECT *
FROM EMP
ORDER BY COMM
ORDER BY COMM
**ASC -- 오름차순**
ORDER BY COMM
**DESC -- 내림차순**
ORDER BY COMM
DESC NULLS
**FIRST** -- 배열 시 NULL값을 처음 위치시킴.
ORDER BY COMM
ASC NULLS
LAST
--EMP 테이블의 EMPNO, ENAME, HIREDATE 데이터 조회
SELECT EMPNO 사번
, ENAME 사원명
, HIREDATE 입사일
FROM EMP
--ORDER BY HIREDATE
ORDER BY 입사일
-- **별칭 이용해서 조회 가능!**함수
<함수>
💡 칼럼값을 읽어서 계산 결과를 반환
단일행 함수 : N개의 값을 읽고 N개의 결과 리턴(매 행마다, 함수 실행 -> 결과 반환)
그룹 함수 : N개의 값을 읽고 1개의 결과 리턴(하나의 그룹 별로 함수 실행 -> 결과 반환)
: SELECT절에 단일행
함수와 그룹 함수를 **함께 사용할 수 없음**.(결과 행의 갯수가 다르므로)
: 함수를 기술할 수 있는 위치는 SELECT, WHERE, ORDER BY, HAVING 절에 기술할 수 있음.
단일행 함수
< 문자 관련 함수 >
LENGTH / LEGNTHB
💡 LENGTH (칼럼 | '문자열') : **`글자 수`** 반환 LENGTHB (칼럼 | '문자열') : 글자의 `**바이트 수**` 반환 한글 : 3BYTE 영문자, 숫자, 특수문자 : 1BYTE
*** DUAL 테이블**
- SYS 사용자가 소유하는 테이블
- SYS 사용자가 소유하지만, 모든 사용자가 접근이 가능한다.
- 한 행, 한 칼럼을 가지고 있는 DUMMY
테이블이다.
- 사용자가 함수를 사용할 때 임시로 사용하는 테이블.
SELECT LENGTH
('안녕'),LENGTHB
('안녕')
FROM DUAL
;
SELECT LENGTHB
('안녕')
FROM DUAL
;
SELECT
LENGTH
(EMPNO
), LENGTHB
(ENAME
)
FROM EMP
;INSTR
💡
- INSTR (칼럼 | '문자열', 찾을값 [ POSITION(==어떤 위치에서 시작할지 지정 가능)] , [OCCURENCE==몇번째 타겟인지]])
- 칼럼 | 문자열 과 찾을 값은 무조건 들어가야하며 나머지 뒤의 내용은 선택사항
- 지정한 위치부터 지정된 숫자 번째로 나타나는 문자의 시작 위치를 반환
SELECT INSTR
('AABAACAABBAA', 'B') FROM DUAL
; --3 : **B의 위치**
SELECT INSTR
('AABAACAABBAA', 'B', 1) FROM DUAL
; --3 : B의 위치
SELECT INSTR
('AABAACAABBAA', 'B', 1,2) FROM DUAL
; --9 : **B의 위치(2번째 B)**
SELECT INSTR
('AABAACAABBAA', 'B',-1) FROM DUAL
; --10 : **B의 위치(뒤에서부터 첫번째)**
SELECT INSTR
('AABAACAABBAA', 'B',-1,3) FROM DUAL
; --3 : B의 위치(뒤에서부터 세번째)
SELECT INSTR
('AABAACAABBAA', 'B',5) FROM DUAL
;-- 5는 다섯번째무터 탐색을 하겠다는 뜻
SELECT INSTR
('AABAACAABBAA', 'B',5,2) FROM DUAL
;
SELECT INSTR
('AABAACAABBAA', 'B',-4) FROM DUAL
;--**B를 찾을건데 뒤에서부터 4번째의 값부터 찾겠다**는 뜻LPAD / RPAD
💡 [문법]
LPAD | RPAD (칼럼|문자열 , 길이(바이트) [, 문자] )
- 문자에 대해 통일감 있게 표시하고자 할 때 사용한다.
- 제시된 칼럼|문자값에 임의의 문자를 왼쪽 또는 오른쪽에 덧붙여 최종 N 길이 만큼의 문자열 반환
-- 20만큼의 길이 중 ENAME 값은 오른쪽 정렬, **왼쪽은 공백으로** 채우기
SELECT LPAD
(ENAME
, 20)
FROM EMP
;
-- 20만큼의 길이 중 ENAME 값은 오른쪽 정렬, **왼쪽은 '#'으로** 채우기
SELECT LPAD
(ENAME
, 10,'#')
FROM EMP
;
-- 10만큼의 길이 중 ENAME 값은 왼쪽 정렬, **오른쪽은 공백**으로 채우기
SELECT RPAD
(ENAME
, 10)
FROM EMP
;
-- 10만큼의 길이 중 ENAME 값은 왼쪽 정렬, **오른쪽은 '@'**으로 채우기
SELECT RPAD
(ENAME
, 10,'@')
FROM EMP
;
SUBSTR
💡 [문법]
SUBSTR(칼럼 | 문자값, POSITION [,LENGTH])
- 문자 데이터에서 지정한 위치부터 지정한 갯수만큼의 문자열 추출해서 변환
SELECT 'HELLO WORLD' FROM DUAL
;
SELECT SUBSTR
('HELLO WORLD',3) FROM DUAL
;
SELECT SUBSTR
('HELLO WORLD',3, 5) FROM DUAL
; -- **3번째부터 5개** 리턴
SELECT SUBSTR
('HELLO WORLD',-5) FROM DUAL
; --뒤에서부터 5번째 부터 리턴
SELECT SUBSTR
('HELLO WORLD',-5,3) FROM DUAL
;--(**'값 ', 자르기 시작할 위치, 자를 개수**)CONCAT
💡 [문법]
SELECT CONCAT
('AAA', 'DDD')
FROM DUAL
;
SELECT 'AAA'||'DDD'
FROM DUAL
;REPLACE
💡 [문법]
REPLACE (칼럼 | 문자값 , TARGET , STR)
- 칼럼 또는 문자값에서 TRARGET 을 STR로 변경하여 반환
SELECT '서울시 강남구 역삼동' FROM DUAL
;
SELECT REPLACE ('서울시 강남구 역삼동', '서울시', '서울특별시') FROM DUAL
;
SELECT '안녕하세요 안녕히가세요' FROM DUAL
;
-- 중간에 있는 특정 글자 지우고 싶을 때!
SELECT REPLACE ('안녕하세요 안녕히가세요', '안녕','') FROM DUAL
; -- 안녕 찾아서 빈 문자열로 바꿔버림.< 숫자관련 함수 >
ABS(NUMBER)
💡 [문법]
ABS (NUMBER)
절댓값 구하는 함수
SELECT ABS
(-7) FROM DUAL
;MOD
💡 [문법]
MOD
MOD(NUMBER, NUMBER)
SELECT MOD(10,3) FROM DUAL
; ROUND
💡 [문법]
ROUND (NUMBER[, 위치])
- 반올림
- 위치 : 기본값 0 ( 0 = 생략 가능
SELECT ROUND(123.456) FROM DUAL
; -- ROUND는 반올림
SELECT ROUND(123.456, 1) FROM DUAL
; -- ,1 는 어디 자리에서 반올림을 할 건지
SELECT ROUND(123.456, 4) FROM DUAL
;
SELECT ROUND(123.456,-1) FROM DUAL
;-- 소수점 기준으로 왼쪽부터 반올림
SELECT ROUND(123.456,-2) FROM DUAL
;
SELECT ROUND(123.456,-3) FROM DUAL
;
SELECT ROUND(345.345,-3) FROM DUAL
;CEIL / FLOOR / TRANC (소수점 관련 함수)
💡 [문법]
- CEIL
CEIL(NUMBER)
- FLOOR
- FLOOR(NUMBER)
- (소수점 이하 내용을)무조건 버림
- TRANC
- TRANC
- 위치 지정하여 (그냥) 버림.
- 음수로 지정도 가능
SELECT CEIL
(123.456) FROM DUAL
;
SELECT FLOOR
(123.987) FROM DUAL
;
SELECT TRUNC
(123.456) FROM DUAL
;
SELECT TRUNC
(123.456, 1) FROM DUAL
;-- 소수점 아래 **위치를 지정할 수 있음.**
SELECT TRUNC
(123.456, 2) FROM DUAL
;
SELECT TRUNC
(123.456, -2) FROM DUAL
;< 날짜 관련 함수 >
CEIL / FLOOR / TRANC
💡 [문법]
- SYSDATE
- MONTHS_BTWEEN
- 두 날짜 사이의 개월 수를 리턴
- 리턴값은 NUMBER
- ADD_MONTHS
- NEXT_DAY
[문법]
NEXT_DAY(DATE, 요일(문자|숫자))
- LAST_DAY
- EXTRACT
- EXTRACT( YEAR | MONTH | DAY
FROM DATE )
- 리턴타입은 NUMBER
SELECT ENAME
, FLOOR
( MONTHS_BETWEEN
(SYSDATE
,HIREDATE
)) 근무개월수
, HIREDATE 입사일
FROM EMP
;
SELECT ADD_MONTHS
(SYSDATE
, 6) FROM DUAL
;
SELECT ADD_MONTHS
('2002/12/31', 6) FROM DUAL
;
SELECT SYSDATE
, NEXT_DAY
(SYSDATE
, '목요일') FROM DUAL
;
SELECT SYSDATE
, NEXT_DAY
(SYSDATE
, '수요일') FROM DUAL
;
SELECT SYSDATE
, NEXT_DAY
(SYSDATE
, '금') FROM DUAL
;
SELECT SYSDATE
, NEXT_DAY
(SYSDATE
, 1) FROM DUAL
;-- '1'이 일요일로 설정 되어있음
-- SELECT SYSDATE, NEXT_DAY(SYSDATE, 'SUNDAY') FROM DUAL;-- 영어로 하려면 언어 설정 변경해야 함
ALTER SESSION SET NLS_LANGUAGE
= AMERICAN
;-- 언어변경
SELECT SYSDATE
, NEXT_DAY
(SYSDATE
, 'SUN') FROM DUAL
;
SELECT SYSDATE
, NEXT_DAY
(SYSDATE
, 'FRI') FROM DUAL
;
ALTER SESSION SET NLS_LANGUAGE
= KOREAN
;-- 언어변경
SELECT SYSDATE
, NEXT_DAY
(SYSDATE
, '금') FROM DUAL
;
SELECT LAST_DAY
(SYSDATE
) FROM DUAL
; -- 이번 달의 마지막 날짜
SELECT LAST_DAY
('2002/03/01') FROM DUAL
;
SELECT LAST_DAY
('2022/08/01') FROM DUAL
;
SELECT EXTRACT
(YEAR FROM SYSDATE
) FROM DUAL
;
SELECT EXTRACT
(MONTH FROM SYSDATE
) FROM DUAL
;
SELECT EXTRACT
(DAY FROM SYSDATE
) FROM DUAL
;
-- 날짜 포맷 변경
SELECT SYSDATE
FROM DUAL
;
ALTER SESSION SET NLS_DATE_FORMAT
= 'YYYY-MM-DD HH:MI:SS AM';
ALTER SESSION SET NLS_DATE_FORMAT
= 'RR/MM/DD';< 형변환 함수 >
TO_CHAR / TO_DATE / TO_NUMBER
💡 [문법]
- TO_CHAR
- TO_DATE
- TO_NUMBER
- 문자열 데이터를 숫자로 변경.
SELECT 1234 FROM DUAL
; -- **숫자는 오른쪽정렬** 됨
SELECT TO_CHAR
(1234, '999999')FROM DUAL
; -- 6칸의 **공간 확보, 빈칸은 공백**으로 채움
SELECT TO_CHAR
(1234, '000000')FROM DUAL
; -- 6칸의 공간 확보, 빈칸은 0으로 채움
SELECT TO_CHAR
(1234, 'L999999')FROM DUAL
; -- **현재 설정된 나라의 화폐**단위
SELECT TO_CHAR
(1234, '$999999')FROM DUAL
; -- 달러로 표시
SELECT TO_CHAR
(1234, 'L999,999')FROM DUAL
; -- 6짜리 숫자 들어오고, 콤마찍기
-- 사원 테이블 급여 조회
SELECT EMPNO
, ENAME
, TO_CHAR
(SAL
, 'L99,999,999')
FROM EMP
;
-- 날짜 -> 문자
SELECT SYSDATE
FROM DUAL
;
SELECT TO_CHAR
(SYSDATE
) FROM DUAL
; -- 내가 **원하는 형태의 포멧으로** 쓰고싶을 때 사용
SELECT TO_CHAR
(SYSDATE
, 'YYYY-MM-DD') FROM DUAL
;
SELECT TO_CHAR
(SYSDATE
, 'YYYY-MM-DD HH:MI:SS AM') FROM DUAL
;
SELECT TO_CHAR
(SYSDATE
, 'YYYY-MM-DD HH24:MI:SS AM') FROM DUAL
;
SELECT TO_CHAR
(SYSDATE
, 'MON DY , YYYY') FROM DUAL
;
SELECT TO_CHAR
(SYSDATE
, 'MON DAY , YYYY') FROM DUAL
;
SELECT TO_CHAR
(SYSDATE
, 'YYYY-MM-DD(DY)') FROM DUAL
;
-- 숫자 > 날짜
SELECT TO_DATE
(20220706) FROM DUAL
;
-- 문자 > 날짜
SELECT TO_DATE
('20220706') FROM DUAL
;
SELECT TO_DATE
('2022/07/06') FROM DUAL
;
SELECT TO_DATE
('2022-07-06') FROM DUAL
;
SELECT TO_DATE
('2022.07.06') FROM DUAL
;
SELECT TO_NUMBER
('123456789') FROM DUAL
; --**오른쪽정렬 되면 숫자**!
SELECT '123' + '456' FROM DUAL
; -- 둘 다 문자열이지만 자동으로 숫자타입으로 형변환 후 연산처리
--SELECT '123' + '456A' FROM DUAL;-- 에러 : 숫자만 있을 땐 자동처리 되지만 문자 있으면 에러남
SELECT '10,000' + '20,000' FROM DUAL
;
SELECT TO_NUMBER
('10,000', '99,999,999') + TO_NUMBER
('20,000','99,999') FROM DUAL
;