행 (가로) + 컬럼 (세로) = 테이블 (표)
기본키 : 중복되지 않는 키, 행을 구분할 수 있는 키 → Primary Key (PK)
외부키 : 외부 테이블에서 가져온 키, 외부 테이블의 기본키 PK를 가져와서 참조 함
→ 외부 테이블의 기본키를 참조하기 때문에 참조키 라고도 불림
Java의
null
= 참조값이 없음 / DB에서의null
= 값(데이터)이 없음컬럼 값 : 한 칸에 들어있는 어떤 값
관계형 데이터베이스에서 데이터를 조회하거나 조작하기 위해 사용하는 표준 검색 언어
원하는 데이터를 찾는 방법이나 절차를 기술하는 것이 아닌 조건을 기술하여 작성
분류 | 용도 | 명령어 |
---|---|---|
DQL (Data Query Language) | 데이터 검색 | SELECT (SELECT는 DML로도 분류됨) |
DML (Data Manipulation Language) | 데이터 조작 | INSERT, UPDATE, DELETE |
DDL(Data Definition Language) | 데이터 정의 | CREATE, DROP, ALTER |
DCL (Data Control Language) | 데이터 제어 | GRANT, REVOKE |
TCL (Transaction Control Language) | 트랜젝션 제어 | COMMIT, ROLLBACK |
DML이 CRUD의 기능
DDL 은 테이블 수정 관련
DCL 은 권한 부여, 회수 같은 제어
TCL 은 데이터 일관성 관련, 데이터를 날렸거나 할 때
DQL (질의어)
- SELECT : 테이블에 저장된 데이터를 조회하는 데 사용되는 가장 기본적인 문법이고 가장 많이 사용됨
DML (데이터 조작어)
데이터를 삽입, 변경 삭제 즉 조작하는 역할을 하는 명령어 INSERT, UPDATE, DELETE- INSERT : 새로운 데이터를 삽입함- UPDATE : 기존의 데이터를 변경함- DELETE : 기존의 데이터를 삭제함
DDL (데이터정의어)
데이터베이스 객체들을 생성, 변경, 제거시 사용 CREATE, ALTER, DROP, RENAME, TRUNCATE- CREATE : 새로운 테이블을 생성함- ALTER : 기존의 테이블을 변경함 (컬럼을 추가하거나 변경)- RENAME : 테이블의 이름을 변경함- TRUNCATE : 테이블을 잘라냄(테이블 내의 저장된 내용 삭제)- DROP : 기존의 테이블을 삭제함 (테이블의 구조 자체를 제거)
TCL (트랜잭션 제어언어)
데이터의 일관성을 유지하면서 안정적으로 데이터를 복구시키기 위해서 사용
Transaction은 여러개의 DML(데이터조작어) 명령문들을 하나의 작업단위로 묶어놓은 집합이다.
실수 없이 완벽하게 입력한 명령어만 영구 저장하기 위해 TCL을 사용한다.
- COMMIT : 변경된 내용을 영구 저장
- ROLLBACK : 변경되기 이전 상태로 되돌림
- SAVAPOINT : 특정 위치까지를 영구 저장 혹은 이전 상태로 돌리기 위해 저장점을 만듬
데이터 타입 | 하위 데이터 타입 | 설명 |
---|---|---|
NUMBER | 숫자 | |
CHARACTER | CHAR / VARCHAR2 | 고정길이 문자(최대 2000바이트) 가변길이 문자(최대 4000바이트) |
DATE | 날짜 | |
LOB | CLOB / BLOB | 가변길이 문자 (최대 4기가 바이트) Binary Data |
데이터를 조회한 결과를 Result Set이라고 하는데 SELECT구문에 의해 조회된 행들의 집합을 의미.
Result Set은 0개 이상의 행이 포함될 수 있고 Result Set은 특정한 기준에 의해 정렬 가능.
한 테이블의 특정 컬럼, 특정 행, 특정 행/컬럼 또는 여러 테이블의 특정 행/컬럼 조회 가능
SELECT 컬럼 명 [, 컬럼명, …]
FROM 테이블 명
WHERE 조건식;
*
기호 사용 가능하며 조회 결과는 기술한 컬럼 명 순으로 표시 됨/* SELECT (DQL 또는 DML) : 조회
*
* - 데이터를 조회(SELECT)하면 조건에 맞는 행들이 조회됨.
* 이 때, 조회된 행들의 집합을 "RESULT SET" (조회 결과의 집합) 이라고 한다.
*
* - RESULT SET은 0개 이상의 행을 포함할 수 있다.
* 왜 0개? 조건에 맞는 행이 없을 수 있음
*
* */
-- [작성법]
-- SELECT 컬럼명 FROM 테이블명;
--> 어떤 테이블의 특정 컬럼을 조회하겠다.
SELECT * FROM EMPLOYEE;
-- '*' : ALL, 모든, 전부
-- 사번, 직원 이름, 휴대전화 번호 조회
SELECT EMP_ID, EMP_NAME, PHONE FROM EMPLOYEE;
--------------------------------------------------------------
-- <컬럼 값 산술 연산>
-- 컬럼 값 : 테이블 내 한 칸( == 한 셀 )에 작성된 값(DATA)
-- EMPLOYEE 테이블에서 모든 사원의 사번, 이름, 급여, 연봉(급여 * 12) 조회
SELECT EMP_ID, EMP_NAME, SALARY, SALARY * 12 FROM EMPLOYEE;
SELECT EMP_NAME + 10 FROM EMPLOYEE;
-- ORA-01722 : 수치가 부적합합니다
-- 산술 연산은 숫자(NUMBER 타입)만 가능하다!
-- JAVA의 같다는 == , DB는 =
--------------------------------------------------------------
-- 날짜(DATE) 타입 조회
-- EMPLOYEE 테이블에서 이름, 입사일, 오늘 날짜 조회
-- 활용 예시 : 게시판 등록 시간, 회원 가입 일시 등
SELECT EMP_NAME, HIRE_DATE, SYSDATE FROM EMPLOYEE;
-- 1990-02-06 00:00:00.000
-- SYSDATE : 시스템상의 현재 시간(날짜)를 나타내는 함수
-- 현재 시간만 조회하기
SELECT SYSDATE FROM DUAL;
-- DUAL(DUmmy tAbLe) 테이블: 가짜 테이블(임시 조회용 테이블)
-- 날짜 + 산술연산(+ , -)
SELECT SYSDATE -1, SYSDATE, SYSDATE +1
FROM DUAL;
-- 날짜에 +/- 연산 시 일(DAY) 단위로 계산 진행됨
--------------------------------------------------------------
-- <컬럼 별칭 지정>
/* 컬럼명 AS 별칭 : 별칭 띄어쓰기 X, 특수문자 X, 문자만 O
*
* 컬럼명 AS "별칭" : 별칭 띄어쓰기 O, 특수문자 O, 문자 O
*
* AS는 생략 가능
* */
-- SELECT 조회 결과의 집합인 RESULT SET에 출력되는 컬럼명을 지정
SELECT SYSDATE - 1 "하루 전", SYSDATE AS 현재시간, SYSDATE + 1 내일
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;
--------------------------------------------------------------
-- 앞에 숫자 = 해석 순서
-- 3. SELECT절 : SELECT 컬럼명
-- 1. FROM절 : FROM 테이블명
-- 2. WHERE절(조건절) : WHERE 컬럼명 연산자 값;
-- 4. ORDER BY 컬럼명 | 별칭 | 컬럼 순서 [ACS | DESC] [NULLS FIRST | LAST]
-- (오름 / 내림차순) (NULL 정렬)
-- EMPLOYEE 테이블에서 급여가 3백만원 초과인 사원의
-- 사번, 이름, 급여, 부서코드를 조회
SELECT EMP_ID, EMP_NAME, SALARY, DEPT_CODE
FROM EMPLOYEE
WHERE SALARY > 3000000;
-- EMPLOYEE 테이블에서 부서코드가 'D9'인 사원의
-- 사번, 이름, 부서코드, 직급코드 조회
SELECT EMP_ID, EMP_NAME, DEPT_CODE, JOB_CODE
FROM EMPLOYEE
WHERE DEPT_CODE = 'D9'; -- 비교연산자(=) / 대입연산자 (:=)
-- 비교연산자 : >, <, >=, <=, = (같다), !=, <> (같지 않다)
--------------------------------------------------------------
-- 논리 연산자 (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 SALARY > 3000000 AND SALARY < 5000000;
-- BETWEEN A AND B : A이상 B이하
-- 300만 이상, 600만 이하
SELECT EMP_ID, EMP_NAME, SALARY, PHONE
FROM EMPLOYEE
WHERE SALARY BETWEEN 3000000 AND 6000000;
-- NOT 연산자
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';
-- ex) 1 = '1'
SELECT '같음'
FROM DUAL
WHERE 1 = '1';
--------------------------------------------------------------
-- LIKE : ~처럼, ~같은
-- 비교하려는 값이 특정한 패턴을 만족시키면 조회하는 연산자
-- [작성법]
-- WHERE 컬럼명 LIKE '패턴이 적용된 값'
-- LIKE의 패턴을 나타내는 문자(와일드 카드)
--> '%' : 포함
--> '_' : 글자 수
-- '%' 예시
-- 'A%' : A로 시작하는 문자열
-- '%A' : A로 끝나는 문자열
-- '%A%' : A가 포함된 문자열
-- '_' : 예시
-- 'A_' : A로 시작하는 두글자 문자열
-- '_ _ _A' : A로 끝나는 네글자 문자열
-- '_ _A_ _' : 3번째 문자가 A인 다섯 글자 문자열
-- '_ _ _ _ _' : 다섯 글자 문자열
-- EMPLOYEE 테이블에서 성이 '전'씨인 사원의 사번, 이름 조회
SELECT EMP_ID, EMP_NAME
FROM EMPLOYEE
WHERE EMP_NAME LIKE '전%';
-- WHERE EMP_NAME LIKE '전__'; -- 이름이 3글자가 아닌 경우 곤란
-- 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 '___%';
-- ESCPAE
-- ESCPAE 문자 뒤에 작성된 _ 는 일반 문자로 탈출 한다는 뜻
-- #, ^ 를 이스케이프 문자로 많이 씀
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 INSERT
* 5. BETWEEN AND / NOT BETWEEN AND
* 6. NOT (논리연산자)
* 7. AND (논리연산자)
* 8. OR (논리연산자)
*
* */
--------------------------------------------------------------
/* IN 연산자
*
* 비교하려는 값과 목록에 작성된 값 중
* 일치하는 것이 있으면 조회하는 연산자
*
* [ 작성법 ]
* WHERE 컬럼명 IN(값1, 값2, 값3...)
* */
-- EMPLOYEE 테이블에서
-- 부서코드가 D1, D6, D9 인 사원의
-- 사번, 이름, 부서코드 조회
SELECT EMP_ID , EMP_NAME , DEPT_CODE
FROM EMPLOYEE
WHERE DEPT_CODE IN('D1', 'D6', 'D9'); -- 9명 / 23명
/* IN()을 쓰지 않는 경우
WHERE DEPT_CODE = 'D1'
OR DEPT_CODE = 'D6'
OR DEPT_CODE = 'D9');
*/
-- NOT IN
SELECT EMP_ID , EMP_NAME , DEPT_CODE
FROM EMPLOYEE
WHERE DEPT_CODE NOT IN('D1', 'D6', 'D9') -- 12명 / 23명
OR DEPT_CODE IS NULL; -- 14명 / 23명 (부서코드 없는 2명 포함)
-- IS NULL
-- IS NOT NULL
--------------------------------------------------------------
-- NULL 처리 연산자
-- JAVA에서 NULL : 참조하는 객체가 없음을 의미하는 값
-- DB에서 NULL : 컬럼에 값이 없음을 의미하는 값
-- 1) IS NULL : NULL인 경우 조회
-- 2) IS NOT NULL : NULL이 아닌 경우 조회
-- EMPLOYEE 테이블에서 보너스가 있는 사원의 이름, 보너스 조회
SELECT EMP_NAME , BONUS
FROM EMPLOYEE
WHERE BONUS IS NOT NULL;
--------------------------------------------------------------
-- ORDER BY절
-- EMPLOYEE 테이블 급여 오름차순으로
-- 사번, 이름, 급여 조회
SELECT EMP_ID, EMP_NAME, SALARY
FROM EMPLOYEE
ORDER BY SALARY; -- ASC가 기본값
-- 급여 200만 이상인 사원의
-- 사번, 이름, 급여 조회
-- 단, 급여 내림차순으로 조회
SELECT EMP_ID, EMP_NAME, SALARY
FROM EMPLOYEE
WHERE SALARY >= 2000000
ORDER BY SALARY DESC;
-- 입사일 순서대로 이름, 입사일 조회(별칭 사용)
SELECT EMP_NAME 이름, HIRE_DATE 입사일
FROM EMPLOYEE
ORDER BY 입사일;
-- 부서별 (DEPT_CODE)로 급여 내림차순 정렬
-- D1 부서에서 가장 많은 ~ 가장 적은 사람까지 내림차순 정렬
-- D2 부서에서 가장 많은 ~ 가장 적은 사람까지 내림차순 정렬
-- ...
-- 정렬 중첩 : 대분류 정렬 후 소분류 정렬
SELECT EMP_NAME, DEPT_CODE, SALARY
FROM EMPLOYEE
ORDER BY DEPT_CODE, SALARY DESC;