TIL (DB)(SELECT,함수)

이우진·2023년 8월 3일
0

DBMS (DataBaseManagement System) 데이터 추출 조작 정의 제어 할수있게 해주는
데이터 베이스 전용 관리 프로그램

DML(SELECT)

주요 용어

1.행(Row) 2.컬럼(Column) 3.기본키(Primary Key) 중복X
4.외래키(Foreign Key)외부에 있는 키(참조키) 5. Null(값이 없음)

SQL(Structured Query Language) 질의어
관계형 데이터베이스에서 데이터를 조회하거나 조작하기 위해 사용하는 표준 검색 언어
원하는 데이터를 찾는 방법이나 절차를 기술하는 것이 아닌 조건을 기술하여 작성

Dql 데이터 검색 SELECT(DML로도 분류됨)
DML(테이플 안의 값을 조작) 데이터 조작 INSERT,UPDATE,DELETE
(데이터 삽입 수정 삭제 작업 지원)

DDL(객체 테이블 시퀀스) 데이터 정의 CREATE,DROP,ALTER
(데이터 구조 삭제 및 변경)

DCL 데이터 제어 (권한 제어) GRANT,REVOKE
(보안 무결성) 데이터 중복 최소화,데이터무결성 (일관성,정확성)보장

TCL 트랜젝션 제어 COMMIT(영구저장),ROLLBACK(되돌리다) 데이터 영구저장,삭제하기위해 씀

주요 데이터 타입

SELECT

SELECT (DML 또는 DQL) : 조회
데이터를 조회(SELECT)하면 조건에 맞는 행들이 조회됨.
이 때,조회된 행들의 집합을 "RESULT SET" (조회 결과의 집합) 이라고 한다.
-RESULT SET은 0개 이상의 행을 포함할 수 있다.
왜 0개? 조건에 맞는 행이 없을 수도 있어서.

[작성법]
SELECT 컬럼명 FROM 테이블명;
--> 어떤 테이블의 특정 컬럼을 조회 하겠다.

ex)
SELECT FROM EMPLOYEE;
-- '
' : all,모든,전부
-->EMPLOYEE 테이블의 모든 컬럼을 조회하겠다.

-- 사번,직원이름,휴대전화번호 조회
SELECT EMP_ID,EMP_NAME,PHONE FROM EMPLOYEE;

ex)
SELECT PROM EMPLOYEE;
'
' : ALL,모든,전부
--> EMPLOYEE 테이블의 모든 컬럼을 조회하겠다.

--<컬럼 값 산술 연산>
--컬럼 값 : 테이블 내 한 칸( == 한 셀)에 작성된 값(DATA)

-- EMPLOYEE 테이블에서 모든 사원의 사번,이름,급여,연봉 조회

ex)
SELECT EMP_ID,EMP_NAME,SALARY,SALARY * 12 FROM EMPLOYEE;

SELECT EMP_NAME + 10 FROM EMPLOYEE;
-- ORA-01722 : 수치가 부적합합니다.
-- 산술연산은 숫자(NUMBER 타입)만 가능하다!

SELECT EMP_ID + 10 FROM EMPLOYEE;

SELECT '같음'
FROM DUAL
WHERE 1 = '1';

-- 날짜(DATE) 타입 조회

ex)
-- EMPLOYEE 테이블에서 이름,입사일,오늘 날짜 조회
SELECT EMP_NAME,HIRE_DATE,SYSDATE FROM EMPLOYEE;

--2023-08-03 12:05:33.000
--SYSDATE : 시스템상의 현재 시간(날짜)를 나타내는 상수

SELECT SYSDATE FROM DUAL;
--DUAL(DUmy tAbLe) 테이블 : 가짜 테이블(임시 조회용 테이블)

-- 날짜 + 산술연산 (+,-)
SELECT SYSDATE -1, SYSDATE,SYSDATE + 1
FROM DUAL;
-- 날짜에 +/-연산 시 일 단위로 계산이 진행됨

<컬럼 별칭 지정>

컬럼명 AS 별칭 : 별칭 띄어쓰기 X,특수문자 X,문자만 O

컬럼명 AS "별칭 : 별칭 띄어쓰기 O,특수문자 O,문자만 O

AS 생략 가능

SELECT SYSDATE

리터럴
--JAVA 리터럴 : 값 자체를 의미
-- DB 리터럴 : 임의로 지정한 값을 기존 테이블에 존재하는 값처럼 사용하는 것
--> (필수) DB의 리터럴 표기법은 ''홑 따옴표

ex)
SELECT EMP_NAME,SALARY, '원 입니다' FROM EMPLOYEE;

-- DISTINCT : 조회 시 컬럼에 포함된 중복 값을 한 번만 표기
-- 주의사항 1) DISTINCT 구문 SELECT 마다 딱 한번씩만 작성 가능
-- 주의사항 2) DISTINCT 구문은 SELECT 제일 앞에 작성되어야 한다.

SELECT DISTINCT DEPT_CODE,JOB_CODE FROM EMPLOYEE;

순서
1.FORM 절 : FROM 테이블명
2.WHERE 절(조건절) : WHERE 컬럼명 연산자 값
3.SELECT 절 : SELECT 컬럼명
4.ORDER BY 컬럼명 | 별칭 | 컬럼 순서[ASC/DESC][NULLS FIRST | LAST]

ex)

--EMPLOYEE 테이블에서 급여가 3백만원 초과인 사원의
-- 사번,이름,급여,부서코드를 조회

SELECT EMP_ID ,EMP_NAME ,SALARY ,DEPT_CODE
FROM EMPLOYEE
WHERE SALARY > 3000000;

비교 연산자 : >,<,>=,<=,=(같다),!=,<> (같지 않다)
대입 연산자 : :=

ex)
-- EMPLOYEE 테이블에서 부서코드가 'D9'인 사원의
--사번,이름,부서코드,직급코드를 조회

SELECT EMP_ID,EMP_NAME,DEPT_CODE,JOB_CODE
FROM EMPLOYEE
WHERE DEPT_CODE = 'D9';

논리 연산자 : (AND,OR)

ex)
-- EMPLOYEE 테이블에서 급여가 300만 미만 또는 500만 이상인 사원의
--사번,이름,급여,전화번호 조회

SELECT EMP_ID,EMP_NAME,SALARY,PHONE
FROM EMPLOYEE
WHERE SALARY < 3000000 OR SALARY >= 5000000;

BETWEEN A AND B : A 이상 B 이하

ex)
-- 300만 이상, 600만 이하
SELECT EMP_ID,EMP_NAME,SALARY,PHONE
FROM EMPLOYEE
WHERE SALARY BETWEEN 3000000 AND 6000000;

--NOT 연산자 사용 가능!
ex)
SELECT EMP_ID,EMP_NAME,SALARY,PHONE
FROM EMPLOYEE
WHERE SALARY NOT BETWEEN 3000000 AND 6000000;

-- 날짜 (DATE) 에 BETWEEN 이용하기
-- EMPLOYEE 테이블에서 입사일이 1990-01-01~1999-12-31 사이인 직원의
--이름,입사일 조회
ex)
SELECT EMP_NAME, HIRE_DATE
FROM EMPLOYEE
WHERE HIRE_DATE BETWEEN '1990-01-01' AND '1999-12-31';

LIKE : ~처럼,~같이
비교하려는 값이 특정한 패턴을 만족시키면 조회하는 연산자

[작성법]
WHERE 컬럼명 LIKE '패턴이 적용된 값'

LIKE의 패턴을 나타내는 문자(와일드 카드)
--> '%' : 포함
--> '_' : 글자수

'%' 예시
'A%' : A로 시작하는 문자열
'%A' : A로 끝나는 문자열
'%A%' : A를 포함하는 문자열

'' 예시
'A
' : A로 시작하는 두 글자 문자열
''----A' : A로 끝나는 다섯글자 문자열
'A' : 세번째 문자가 A인 다섯글자 문자열
'_' : 다섯글자 문자열

eX)
-- EMPLOYEE 테이블에서 성이 '전'씨인 사원의 사번,이름 조회

SELECT EMP_ID,EMP_NAME
FROM EMPLOYEE
WHERE EMP_NAME LIKE '전%';

--EMPLOYEE 테이블에서 전화번호가 010으로 시작하지 않는 사원
--사번,이름,전화번호 조회

SELECT EMP_ID,EMP_NAME,PHONE
FROM EMPLOYEE
WHERE PHONE NOT LIKE '010%';

--EMPLOYEE 테이블에서 EMAIL의 _앞에 글자가 세글자인 사원만 조회
--이름,이메일

SELECT EMP_NAME,EMAIL
FROM EMPLOYEE
WHERE EMAIL LIKE '____%';

ESCAPE
ESCAPE문자 뒤에 작성된_는 일반 문자로 탈출한다는 뜻
-- #,^

ex)
SELECT EMP_NAME,EMAIL
FROM EMPLOYEE
WHERE EMAIL LIKE '__#%' ESCAPE '#';

--연습문제!!!
--EMPLOYEE 테이블에서
-- 이메일 '_'앞이 4글자 이면서
-- 부서코드가 'D9' 또는 'D6'이고 -> AND가 OR보다 우선순위가 높다, ()사용 가능
-- 입사일이 1990-01-01~2000-12-31이고
--급여가 270만 이상인 사원의
-- 사번,이름,이메일,부서코드,입사일,급여 조회

SELECT EMP_ID,EMP_NAME,EMP_EMAIL,DEPT_CODE,HIRE_DATE,SALARY
FROM EMPLOYEE
WHERE EMAIL LIKE '----#-%' ESCAPE '#'
AND (DEPT_CODE = 'D9'OR DEPT_CODE ='D6')
AND HIRE_DATE BETWEEN '1990-01-01 AND 2000-12-31'
AND SALARY >= 2700000;

연산자 우선순위
1. 산술연산자(+,-,*,/)
2. 연결 연산자( || )
3. 비교 연산자 (>,<,<=,>=,=,!= <>)
4. IS NULL / IS NOT NULL,LIKE,IN,NOT IN
5. BETWEEN AND / NOT BETWEEN AND
6. NOT (논리 연산자)
7. AND
8. OR

IN 연산자
비교하려는 값과 목록에 작성된 값 중
일치하는 것이 있으면 조회하는 연산자
[작성법]
WHERE 컬럼명 IN(값1,값2,값3...)

WHERE 컬럼명 = '값1'
OR 컬럼명 = '값2'
OR 컬럼명 = '값3';

ex)
--EMPLOYEE 테이블에서
--부서코드가 D1,D6,D9 인 사원의
--사번,이름,부서코드 조회

SELECT EMP_ID,EMP_NAME,DEPT_CODE
FROM EMPLOYEE
WHERE DEPT_CODE IN('D1','D6','D9');

-- NOT IN
SELECT EMP_ID,EMP_NAME,DEPT_CODE
FROM EMPLOYEE
WHERE DEPT_CODE NOT IN('D1','D6','D9') --12명
OR DEPT_CODE IS NULL; -- 부서코드 없는 2명 포함 14명

-IS NULL
-IS NOT NULL

NULL 처리 연산자

JAVA 에서 NULL : 참조하는 객체가 없음을 의미하는 값
DB에서 NULL : 컬럼에 값이 없음을 의미하는 값

1)IS NULL : NULL인 경우 조회
2)IS NOT NULL : NULL 이 아닌 경우

ex)

-- EMPLOYEE 테이블에서 보너스가 있는 사원의 이름, 보너스 조회

SELECT EMP_NAME,BONUS
FROM EMPLOYEE
WHERE BONUS IS NOT NULL; --9행

-- EMPLOYEE 테이블에서 보너스가 없는 사원의 이름, 보너스 조회
SELECT EMP_NAME,BONUS
FROM EMPLOYEE
WHERE BONUS IS NULL; -- 14행

ORDER BY 절

SELECT문의 조회 결과(RESULT SET)을 정렬할 때 사용하는 구문
SELECT 문 해석 시 가장 마지막에 해석된다!!!!

3.SELECT절
1.FROM절
2.WHERE절
4.ORDER BY 컬럼명 | 별칭 | 컬럼순서

ex)
-- EMPLOYEE 테이블 급여 오름 차순으로
--사번,이름,급여 조회

SELECT EMP_ID,EMP_NAME,SALARY
FROM EMPLOYEE
ORDER BY SALARY; -- ASC가 기본값 [ASC | DESC]

--급여 200만 이상인 사원의
--사번,이름,급여 조회
-- 단,급여 내림 차순으로 조회

SELECT EMP_IP,EMP_NAME,SALARY
FROM EMPLOYEE
WHERE SALARY >= 2000000
ORDER BY 3 DESC;

-- 입사일 순서대로 이름, 입사일 조회(별칭 사용)

SELECT EMP_NAME 이름, HIRE_DATE 입사일
FROM EMPLOYEE
ORDER BY 입사일;

/ 정렬 중첩 : 대분류 정렬 후 소분류 정렬 /
-- 부서코드 오름차순 정렬 후 급여 내림차순 정렬
SELECT EMP_NAME,DEPT_CODE,SALARY
FROM EMPLOYEE
ORDER BY DEPT_CODE, SALARY DESC;

함수

-- 함수 : 컬럼의 값을 읽어서 연산한 결과를 반환

-- 단일 행 함수 : N개의 값을 읽어서 N개의 결과를 반환

-- 그룹 함수 : N개의 값을 읽어서 1개의 결과를 반환(합계,평균,최대,최소)

-- 함수는 SELECT문 의
-- SELECT절,WHERE절, ORDER BY절, GROUP BY절,HAVING 절 사용 가능

-------------------------------------단일 행 함수------------------------

--LENGTH(컬럼명 | 문자열) : 길이 반환
SELECT EMAIL,LENGTH(EMAIL)
FROM EMPLOYEE;


-- INSTR(컬럼명 | 문자열, '찾을 문자열' [,찾기 시작할 위치,[순번] ] )
-- 지정한 위치부터 지정한 순번째로 검색되는 문자의 위치를 반환

-- 문자열을 앞에서부터 검색하여 첫번째 B위치 조회
-- AABAACAABBAA

SELECT INSTR('AABAACAABBAA', 'B') FROM DUAL; --3

-- 문자열을 5번째 문자 부터 검색하여 첫번째 B 위치 조회
SELECT INSTR('AABAACAABBAA', 'B', 5) FROM DUAL; --9

-- 문자열을 5번째 문자 부터 검색하여 두번쨰 B위치 조회
SELECT INSTR('AABAACAABBAA', 'B',5, 2) FROM DUAL; --10

-- EMPLOYEE 테이블에서 사원명,이메일,이메일 중 '@' 위치 조회

SELECT EMP_NAME,EMAIL,INSTR(EMAIL,'@')
FROM EMPLOYEE;


-- SUBSTR('문자열' | 컬럼명, 잘라내기 시작할 위치[, 잘라낼 길이])
-- 컬럼이나 문자열에서 지정한 위치부터 지정된 길이만큼 문자열을 잘라내서 반환
--> 잘라낼 길이 생략 시 끝까지 잘라냄

-- EMPLOYEE 테이블에서 사원명,이메일 중 아이디만 조회

--sun_di@KH.or>kr --> sun_di
SELECT EMP_NAME,SUBSTR(EMAIL,1, INSTR(EMAIL,'@')-1) 아이디
FROM EMPLOYEE;


-- TRIM( [옵션 '문자열' | 컬럼명 FROM] '문자열' | 컬럼명)
-- 주어진 컬럼이나 문자열의 앞,뒤,양쪽에 있는 지정된 문자를 제거
--> 양쪽 공백 제거에 많이 사용한다.

-- 옵션 : LEADING(앞쪽),TRAILING(뒤쪽),BOTH(양쪽,기본값)

SELECT TRIM(' HELLO ')
FROM DUAL; -- 양쪽 공백 제거

SELECT TRIM(BOTH '#' FROM '#####안녕#####')
FROM DUAL;


/ 숫자 관련 함수/

--ABS(숫자 | 컬럼명) : 절대값
SELECT ABS(10),ABS(-10) FROM DUAL;

SELECT '절대값 같음' FROM DUAL
WHERE ABS(10) = ABS(-10); -- WHERE 절 함수 작성 가능

-- MOD(숫자 | 컬럼명, 숫자 | 컬럼명) : 나머지 값 반환

-- EMPLOYEE 테이블에서 사원의 월급을 100만으로 나눴을때 나머지 조회
SELECT EMP_NAME,SALARY, MOD(SALARY,1000000)
FROM EMPLOYEE;

-EMPLOYEE 테이블에서 사번이 짝수인 사원의 사번,이름 조회
SELECT EMP_ID,EMP_NAME
FROM EMPLOYEE
WHERE MOD(EMP_ID, 2) =0;

-EMPLOYEE 테이블에서 사번이 짝수인 사원의 사번,이름 조회
SELECT EMP_ID,EMP_NAME
FROM EMPLOYEE
WHERE MOD(EMP_ID, 2) <> 0;

--ROUND(숫자 | 컬럼명,[,소수점 위치] ) : 반올림
SELECT ROUND(123.456) FROM DUAL; -- 123,소수점 첫번째 자리에서 반올림

SELECT ROUND(123.456, 1) FROM DUAL; -- 123.5,소수점 두번째 자리에서 반올림

SELECT ROUND(123.456, 0) FROM DUAL;

-- CEIL(숫자 | 컬럼명) : 올림
--FLOOR(숫자 | 컬럼명) : 내림
--> 둘다 소수점 첫째 자리에서 올림/내림 처리

SELECT CEIL(123.1), FLOOR(123.9) FROM DUAL;
-- 124 123

--TRUNC(숫자 | 컬럼명 [,위치]) : 특정 위치 아래를 버림(첨삭)

SELECT TRUNC(123.456) FROM DUAL; --123, 소수점 아래를 버림

SELECT TRUNC(123.456, 1) FROM DUAL; -- 123.4 소수점 첫째자리 아래버림

SELECT TRUNC(123.456, -1) FROM DUAL; --120, 10의 자리 아래 버림

/ 버림,내림 차이점/

SELECT FLOOR(-123.5), TRUNC(-123.5) FROM DUAL;

profile
이우진

0개의 댓글

관련 채용 정보