
기본키 : 중복되지 않고 행을 구별할 수 있게 하는 키.
외래키 : 외부에서 가지고 온 기본키, 다른 테이블에 있는 기본키를 참조하는 키.
(참조키)라고도 함.
null : Java에선 참조하는게 없다, DB에선 데이터가 없다(값이 없다)
구조적 질의 언어
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 - 이미지, 동영상, 오디오, 파일 등 (웹페이지 주소, 드라이브)

N이 있을 경우 'AL16UTF16'
N이 없을 경우 'AL32UTF8'
N이 있으면 (n)은 글자수를 뜻함
VARCHAR2 를 흔하게 씀 NVACHAR2는 나중에^^
공백도 마찬가지!!
데이터를 조회(SELECT)하면 조건에 맞는 행들이 조회됨.
이 때, 조회된 행들의 집합을 "RESULT SET"이라고 한다.
RESULT SET은 0개 이상의 행을 포함할 수 있다.
왜 0개? 조건에 맞는 행이 없을 수도 있어서.
SELECT 컬럼 명 [, 컬럼명, ...]
FROM 테이블 명
WHERE 조건식;
ORDER BY 컬럼 명
-> 테이블의 특정 컬럼을 조회하고 정렬하겠다.
* SELECT : 조회하고자 하는 컬럼명 기술
여러 컬럼을 조회하는 경우 컬럼은 쉼표로 구분하고, 마지막 컬럼 다음은 쉼표를 사용하지 않음
모든 컬럼 조회 시 컬럼 명 대신 ‘*’ 기호 사용 가능하며 조회 결과는 기술한 컬럼 명 순으로 표시 됨
FROM : 조회 대상 컬럼이 포함된 테이블 명 기술
WHERE : 행을 선택하는 조건 기술
여러 개의 제한 조건을 포함할 수 있으며, 각각의 제한 조건은 논리 연산자로 연결
제한 조건을 만족시키는 행들만 Result Set에 포함
ORDER BY : SELECT 문의 조회 결과(RESULT SET)를 정렬할 때 사용하는 구문
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;
-- 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 절 * * - 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;
많다 많아!!!!