25.03.07 (금) 19일차 DB - 2

허배령·2025년 3월 7일

괴발개발 TIL

목록 보기
21/54

DML (SELECT)

주요 용어

기본키 : 중복되지 않고 행을 구별할 수 있게 하는 키.
외래키 : 외부에서 가지고 온 기본키, 다른 테이블에 있는 기본키를 참조하는 키.
(참조키)라고도 함.
null : Java에선 참조하는게 없다, DB에선 데이터가 없다(값이 없다)

SQL (Structured Query Language)

  • 구조적 질의 언어
    ex) Employy 테이블에서 나이가 20세 이상이고, 여자면서, 서울에 살고있는 사람을 조회해줄래??

  • 관계형 데이터베이스에서 데이터를 조회하거나 조작하기 위해 사용하는 표준 검색 언어

  • 데이터의 조회, 삽입, 수정, 삭제 등

  • 원하는 데이터를 찾는 방법이나 절차를 기술하는 것이 아닌 조건을 기술하여 작성

  • DQL : SELECT는 조회한다는 뜻
  • DML 중요!! insert(추가), update(수정), delete(삭제)
  • DDL은 데이터베이스를 Create(생성), drop(삭제), alter(수정)
  • DCL의 Grant는 권한을 주는 행위, revoke는 권한을 뺏는 행위
  • 트랜젝션 : 여러개의 DML문들을 하나의 작업단위로 묶어놓은 것.
    COMMIT : 영구적으로 저장하기 위함, ROOLLBACK : 다 엎어버리기, 돌아가기
    --> 실수없이 완벽한 데이터, 명령어만 영구 저장하기 위해서

주요 데이터 타입

NUMBER - 정수든 실수든
CHAR - 고정길이 문자는 주민등록번호같이 변하지 않는 수에 적당
ex) CHAR(10) -> 10 바이트만큼 공간을 차지하겠다.
CLOB - 장문의 텍스트를 저장해야 할 때 (웹소설, 논문, 뉴스기사)
BLOB - 이미지, 동영상, 오디오, 파일 등 (웹페이지 주소, 드라이브)

CHARACTER

VARCHAR2 / NVARCHAR2

N이 있을 경우 'AL16UTF16'
N이 없을 경우 'AL32UTF8'
N이 있으면 (n)은 글자수를 뜻함
VARCHAR2 를 흔하게 씀 NVACHAR2는 나중에^^
공백도 마찬가지!!

SELECT 절

  • 데이터를 조회(SELECT)하면 조건에 맞는 행들이 조회됨.
    이 때, 조회된 행들의 집합을 "RESULT SET"이라고 한다.

  • RESULT SET은 0개 이상의 행을 포함할 수 있다.
    왜 0개? 조건에 맞는 행이 없을 수도 있어서.

작성법

SELECT 컬럼 명 [, 컬럼명, ...]
FROM 테이블 명
WHERE 조건식;
ORDER BY 컬럼 명
-> 테이블의 특정 컬럼을 조회하고 정렬하겠다.

* SELECT : 조회하고자 하는 컬럼명 기술
여러 컬럼을 조회하는 경우 컬럼은 쉼표로 구분하고, 마지막 컬럼 다음은 쉼표를 사용하지 않음
모든 컬럼 조회 시 컬럼 명 대신 ‘*’ 기호 사용 가능하며 조회 결과는 기술한 컬럼 명 순으로 표시 됨

FROM : 조회 대상 컬럼이 포함된 테이블 명 기술

WHERE : 행을 선택하는 조건 기술
여러 개의 제한 조건을 포함할 수 있으며, 각각의 제한 조건은 논리 연산자로 연결
제한 조건을 만족시키는 행들만 Result Set에 포함

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

SELECT 작성 예시

-- EMPLOYEE 테이블의 모든 컬럼을 조회하겠다.
SELECT * FROM EMPLOYEE;
-- "*" : ALL, 전부, 모두

-- EMPLOYEE 테이블에서 사번, 직원이름, 휴대전화번호 컬럼만 조회
SELECT EMP_ID, EMP_NAME, PHONE FROM EMPLOYEE;

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

-- EMPLOYEE 테이블에서 모든 사원의 사번, 이름, 급여, 연봉 조회
SELECT EMP_ID, EMP_NAME, SALARY, SALARY * 12 FROM EMPLOYEE;

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

SELECT '같음' FROM DUAL WHERE 1 = '1';
-- ''는 문자열을 의미
-- NUMBER 타입인 1(숫자)과 문자열인 '1'이 같다라고 인식 중.
-- DUAL : ORACLE에서 사용하는 더미 테이블.
-- 더미테이블? 실제 데이터를 저장하는게 아닌, 임시 계산이나 테스트 목적

-- 문자열 타입이어도 저장된 값이 숫자면 자동으로 형변환 하여 연산 가능
SELECT EMP_ID + 10 FROM EMPLOYEE;

-- 날짜(DATE) 타입 조회

-- EMPLOYEE 테이블에서 이름, 입사일, 오늘 날짜 조회
SELECT EMP_NAME, HIRE_DATE , SYSDATE FROM EMPLOYEE;
SELECT EMP_NAME, HIRE_DATE , SYSDATE FROM EMPLOYEE;
-- 2025-03-07 15:47:28.000
-- SYSDATE : 시스템상의 현재 시간(날짜)를 나타내는 상수

SELECT SYSDATE FROM DUAL;
-- DUAL(DUmmy tAbLE)

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

-- 컬럼에 별칭 지정
/*
 * 컬럼명 AS 별칭 : 별칭 띄어쓰기 X, 특수문자 X, 문자만 O
 * 
 * 컬럼명 AS "별칭" : 별칭 띄어쓰기 O, 특수문자 O, 문자만 O
 * 
 * AS 생략 가능
 */
SELECT SYSDATE -1 "하루 전", SYSDATE AS 현재시간, SYSDATE + 1 AS "내일"
FROM DUAL;

-- JAVA 리터럴 : 값 자체를 의미
-- DB 리터럴 : 임의로 지정한 값을 기존 테이블에 존재하는 값처럼 사용하는 것.
--> (필수) DB의 리터럴 표기법은 '' 홑따옴표!!!
SELECT EMP_NAME, SALARY, '원 입니다' FROM EMPLOYEE;

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

SELECT DISTINCT DEPT_CODE, JOB_CODE FROM EMPLOYEE;

WHERE 절

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

-- EMPLOYEE 테이블에서 (FROM 절)
-- 급여가 3백만원 초과인 사원의 (WHERE 절)
-- 사번, 이름, 급여, 부서코드를 조회해라. (SELECT 절)

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

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

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

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

-- CTRL + SHIFT + 위아래방향키 : 줄 이동
-- CTRL + ALT + 위아래방향키 : 줄 복사

-- 논리 연산자 (AND, OR)

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

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

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

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

-- BETWEEN A AND B : A 이상 B 이하

-- EMPLOYEE 테이블에서
-- 급여가 300만원 이상 600만원 미만의 사원의
-- 사번, 이름, 급여, 전화번호 조회

SELECT EMP_ID, EMP_NAME, SALARY, PHONE
FROM EMPLOYEE
WHERE SALARY BETWEEN 3000000 AND 6000000;

-- NOT 연산자 사용 가능 BETWEEN 앞에 작성
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 사이인 직원의
-- 이름, 입사일 조회

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로 시작하는 두글자 문자열 EX) AH, AB
-- '____A' : (언더바 4개) : A로 끝나는 5글자 문자열 EX) BCBCA
-- '__A__' : 세번째 문자가 A인 다섯글자 문자열
-- '_____' : 다섯글자 문자열
-- EMPLOYEE 테이블에서 (FROM 절)
-- 성이 '전'씨인 (WHERE 절)
-- 사원의 사번, 이름 조회 (SELECT 절)
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 테이블에서 이메일에 '_'앞에 글자가 3글자인 사원만
-- 이름, 이메일 조회
SELECT EMP_NAME, EMAIL
FROM EMPLOYEE
WHERE EMAIL LIKE '___%';


이렇게 하면 제대로 안 나옴!!!! 그 해결책은 밑에

-- ESCAPE 문자
-- ESCAPE 문자 뒤에 작성된 _는 일반문자로 탈출한다는 뜻
-- #, ^
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, 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';			
*/

-- 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') -- NULL 미포함 총 12명 조회
OR DEPT_CODE IS NULL; -- 부서코드가 없는 (NULL) 2명 포함 총 14명 조회

/* NULL 처리 연산자
 * 
 * JAVA 에서 NULL : 참조하는 객체가 없음을 의미
 * DB 에서 NULL : 컬럼에 값이 없음을 의미
 * 
 * 1) IS NILL : NULL인 경우 조회
 * 2) IS NOT NULL : NULL이 아닌 경우 조회
 */

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

ORDER BY 절

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

-- EMPLOYEE 테이블에서 (FROM 절)
-- 급여 오름차순으로 (ORDER BY 절)
-- 사번, 이름, 급여 조회 (SELECT 절)
SELECT EMP_ID, EMP_NAME, SALARY
FROM EMPLOYEE
ORDER BY SALARY ; -- ASC(오름차순)가 기본값이라 생략 가능 [ASC | DESC]
-- 컬럼명 사용.

-- EMPLOYEE 테이블에서 (FROM 절)
-- 급여가 200만 이상인 사원의 (WHERE 절)
-- 사번, 이름, 급여 조회 (SELECT 절)
-- 단, 급여 내림차순으로 조회 (ORDER BY 절)
SELECT EMP_ID, EMP_NAME, SALARY
FROM EMPLOYEE
WHERE SALARY >= 2000000
ORDER BY 3 DESC; -- 컬럼 순서 사용. (SALARY를 3번째에 적었으니 ㅎㅎ)

-- 입사일 순서대로 이름, 입사일 조회 (별칭 사용)
SELECT EMP_NAME 이름, HIRE_DATE 입사일
FROM EMPLOYEE
ORDER BY 입사일;

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

많다 많아!!!!

profile
인생은 변수

0개의 댓글