▶ 주요 용어
▶ SQL (Structured Query Language)
- 관계형 데이터베이스에서 데이터를 조회하거나 조작하기 위해 사용하는 표준 검색 언어
- 원하는 데이터를 찾는 방법이나 절차를 기술하는 것이 아닌 조건을 기술하여 작성
▶ SELECT
- 데이터를 조회(SELECT)하면 조건에 맞는 행들이 조회됨
→ 조회된 결과 행의 집합 = RESULT SET(결과 집합) - RESULT SET은 0행 이상이 포함될 수 있음
→ 조회 조건에 맞는 행이 없을 수도 있기 때문에, 0행도 포함됨 - EX-1) EMP 테이블에서 모든 사원의 정보 조회
SELECT * FROM EMPLOYEE;
-- * : ALL, 모든, 전부
- EX-2) EMP 테이블에서 모든 사원의 사번, 이름, 이메일, 급여 조회
SELECT EMP_ID, EMP_NAME, EMAIL, SALARY
FROM EMPLOYEE;
▶ SELECT _ 컬럼값 산술 연산
- 컬럼값 : 테이블의 한 칸(= 한 셀)에 적용된 값(DATA)
- SELECT문 작성 시 컬럼명에 산술 연산을 작성하면
조회되는 결과 컬럼값에 산술 연산이 반영됨 - EX-1) EMP 테이블에서 모든 사원의 사번, 이름, 급여, 급여+1000000 조회
SELECT EMP_ID, EMP_NAME, SALARY, SALARY+1000000
FROM EMPLOYEE;
▶ SELECT _ ★ ★ 오늘 날짜 조회 ★ ★
SELECT SYSDATE FROM DUAL;
- SYSDATE : 시스템 상의 현재 날짜
- DUAL(DUmmy tAbLe) : 가짜 테이블(임시 테이블, 단순 조회 테이블)
- ★ DB는 날짜 데이터의 연산( +, - )이 가능함 (일 단위) ★
SELECT SYSDATE, SYSDATE+1, SYSDATE-1 FROM DUAL;
- EX) EMP 테이블에서 사원명, 입사일, 오늘까지 근무한 날짜(년수) 조회
SELECT EMP_NAME, HIRE_DATE, (SYSDATE-HIRE_DATE) / 365
FROM DUAL;
▶ SELECT _ 컬럼 별칭 지정
- SELECT 조회 결과의 집합인 RESULT SET에 컬럼명 지정
- 1) 컬럼명 AS 별칭 : 띄어쓰기 X, 특수문자 X, 문자 O
- 2) 컬럼명 별칭 : 1번에서 AS만 생략한 것
- 3) 컬럼명 AS "별칭" : 띄어쓰기 O, 특수문자 O, 문자 O
- 4) 컬럼명 "별칭" : 3번에서 AS만 생략
- EX) EMP 테이블에서 사번, 이름, 급여(원), 근무 일수를 조회
SELECT EMP_ID AS 사번, EMP_NAME 이름, SALARY AS "급여(원)", (SYSDATE-HIRE_DATE) "근무 일수"
FROM EMPLOYEE;
▶ SELECT _ 리터럴
- DB에서의 리터럴 : 임의로 지정한 값을 기존 테이블에 존재하는 값처럼 사용
→ 리터럴 표기법 : ' ' (홑따옴표)
SELECT EMP_NAME, SALARY, '원' AS 단위
FROM EMPLOYEE;
▶ SELECT _ DISTINCT : 조회 시 컬럼에 포함된 중복 값을 한 번만 표시할 때 사용
- 주의사항
1) DISTINCT는 SELECT문에 딱 한 번만 작성할 수 있음
2) DISTINCT는 SELECT문 가장 앞에 작성되어야 함 - EX) EMP 테이블에 저장된 직원들이 속해 있는 부서코드 종류 조회
SELECT DEPT_CODE FROM EMPLOYEE; -- 전 직원의 부서코드 조회(중복값 포함)
-->
SELECT DISTINCT DEPT_CODE FROM EMPLOYEE; --중복값 제거
▶ SELECT _ WHERE절
- 테이블에서 조건을 충족하는 값을 가진 행만 조회하고자 할 때 사용
- 비교연산자 : >, <, >=, <=, = (같다), ( != / <>) (같지 않다)
- EX) EMP 테이블에서 급여가 300만원 초과인 직원의 사번, 이름, 급여, 부서코드 조회
SELECT EMP_ID, EMP_NAME, SALARY, DEPT_CODE
FROM EMPLOYEE
WHERE SALARY > 3000000;
- <해석 순서>
세 번째(3) : SELECT EMP_ID, EMP_NAME, SALARY, DEPT_CODE [ 해당 사원 정보 조회]
첫 번째(1) : FROM EMPLOYEE [ 전체 테이블에서 ]
두 번째(2) : WHERE SALARY > 3000000; [급여가 300만원 이상인 조건 ]
▶ SELECT _ 논리 연산자(AND, OR)
- EX-1) EMP 테이블에서 급여가 200만원 이상이고, 부서코드가 'D6'인 사원의
사원명, 급여, 부서코드 조회
SELECT EMP_NAME, SALARY, DEPT_CODE
FROM EMPLOYEE
WHERE SALARY >= 2000000
AND DEPT_CODE = 'D6';
- EX-2) EMP 테이블에서 부서코드가 'D6' 또는 'D9'인 사원의 사번, 사원명, 부서코드 조회
SELECT EMP_ID, EMP_NAME, DEPT_CODE
FROM EMPLOYEE
WHERE DEPT_CODE = 'D6'
OR DEPT_CODE = 'D9';
▶ SELECT _ 컬럼명 BETWEEN A AND B : 컬럼값이 A 이상 B 이하인 경우
- EX) EMP 테이블에서 급여가 300만원 이상, 500만원 이하인 직원의 사번, 이름, 급여 조회
SELECT EMP_ID, EMP_NAME, SALARY
FROM EMPLOYEE
WHERE SALARY BETWEEN 3000000 AND 5000000;
- 컬럼명 NOT BETWEEN A AND B : 컬럼값이 A 이상 B 이하가 아닌 경우
= 컬럼값이 A 미만, B 초과인 경우 - EX) EMP 테이블에서 급여가 300만원 미만, 500만원 초과인 직원의 사번, 이름, 급여 조회
SELECT EMP_ID, EMP_NAME, SALARY
FROM EMPLOYEE
WHERE SALARY NOT BETWEEN 3000000 AND 5000000;
- BETWEEN을 이용한 날짜 비교
- EX) EMP 테이블에서 입사일이 1990/01/01 ~ 1999/12/31( = 90년도 입사자 ) 직원의 사번, 이름, 입사일 조회
SELECT EMP_ID, EMP_NAME, HIRE_DATE
FROM EMPLOYEE
WHERE HIRE_DATE BETWEEN '1990/01/01' AND '1999/12/31';
※ 1990/01/01 날짜를 문자열 형식으로 작성하게 되면, DB가 알아서 판단하여 날짜타입(DATE)으로 형변환 진행
▶ SELECT _ LIKE
- LIKE : 비교하려는 값이 특정한 패턴을 만족시키면 조회하는 연산자
- [ 작성법 ]
WHERE 컬럼명 LIKE '패턴' - LIKE 패턴(와일드 카드) : ' % ' (포함) , ' _ ' (글자 수)
- % (포함)
%A : 문자열이 A로 끝나는 모든 컬럼값
A% : 문자열이 A로 시작하는 모든 컬럼값
%A% : A가 포함된 문자열 - _ (글자 수)
A_ : A 뒤에 아무거나 한 글자
___A : A 앞에 아무거나 세 글자(4글자 문자열이면서 A로 끝나야 함) - EX) EMP 테이블에서 성이 '이'씨인 사원의 사번, 이름 조회
SELECT EMP_ID, EMP_NAME
FROM EMPLOYEE
WHERE EMP_NAME = '이%';
- EX) EMP 테이블에서 전화번호가 010으로 시작하지 않는 직원 조회
- NOT LIKE (LIKE 결과 부정)
SELECT EMP_ID, EMP_NAME, PHONE
FROM EMPLOYEE
WHERE PHONE NOT LIKE '010%';
- EX) EMP 테이블에서 이메일에 _ 앞글자가 세 글자인 사원의 사번, 이름, 이메일 조회
SELECT EMP_ID, EMP_NAME, EMAIL
FROM EMPLOYEE
WHERE EMAIL LIKE '___$_%' ESCAPE '$';
※ 와일드 카드 문자( _ )와 패턴에 사용된 일반 문자 ( _ )의 모양이 같아서 문제 발생
→ ESCAPE OPTION을 이용하여 일반 문자로 처리할 ' _ ', ' % ' 앞에 아무 특수문자나 붙임
- 연산자 우선 순위
1) 산술 연산자
2) 연결 연산자 : ( | | )
3) 비교 연산자
4) IN NULL / IS NOT NULL / LIKE / IN / NOT IN
5) BETWEEN AND / NOT BETWEEN AND
6) NOT (논리 연산자)
7) AND (논리 연산자)
8) OR (논리 연산자)
▶ SELECT _ IN 연산자
- IN 연산자 : 비교하려는 값과 목록에 작성된 값 중 일치하는 것이 있으면 조회하는 연산자
→ OR 연산을 연달아 작성한 효과 - [ 작성법 ]
컬럼명 IN (값1, 값2, 값3, ...) - EX) EMP 테이블에서 부서코드가 D1 또는 D6 또는 D9인 사원의 사번, 이름, 부서코드 조회
SELECT EMP_ID, EMP_NAME, DEPT_CODE
FROM EMDPLOYEE
WHERE DEPT_CODE IN ('D1', 'D6', 'D9');
- EX) EMP 테이블에서 사번이 200, 205, 210이 아닌(NOT) 사원의 사번, 이름 조회
→ NOT IN
SELECT EMP_ID, EMP_NAME
FROM EMPLOYEE
WHERE EMP_ID NOT IN (200,'205',210); -- 숫자도 홑따옴표로 작성 가능
▶ SELECT _ 연결 연산자( | | )
- 연결 연산자( | | ) : 여러 값을 하나의 컬럼값으로 연결하는 연산자 (자바의 문자열 이어쓰기 효과)
- EX)
SELECT EMP_NAME || '의 급여는 ' || SALARY || '원 입니다.' AS 결과
FROM EMPLOYEE;
▶ SELECT _ NULL 처리 연산자
- DB에서 NULL : 컬럼값이 없다.
※ JAVA에서 NULL : 참조하는 객체가 없다. - 1) IS NULL : 컬럼값이 NULL인 경우 조회
- 2) IS NOT NULL : 컬럼값이 NULL이 아닌 경우 조회
- [ 작성법 ]
컬럼값 IN [NOT] NULL - EX) EMP 테이블에서 전화번호가 없는 사원의 사번, 이름, 전화번호 조회
SELECT EMP_ID, EMP_NAME, PHONE
FROM EMPLOYEE
WHERE PHONE IS NULL;
- EX) EMP 테이블에서 보너스를 받은 사원의 이름, 보너스 조회
SELECT EMP_NAME, BONUS
FROM EMPLOYEE
WHERE BONUS IS NOT NULL;
▶ SELECT _ ORDER 절
- ORDER절 : SELECT문의 조회 결과(RESULT SET)를 정렬할 때 작성하는 구문
- ★ ★ ★ SELECT문 가장 마지막에 해석★ ★ ★
- [ 해석순서 / 작성법 ]
세 번째(3) : SELECT 컬럼명 AS 별칭, 컬럼명, 컬럼명,...
첫 번째(1) : FROM 테이블명
두 번째(2) : WHERE 조건식
네 번째(4) : ORDER BY 컬럼명 | 별칭 | 컬럼순서 [정렬 방식(오름/내림)] [NULLS FIRST | LAST] - EX-1) EMP 테이블에서 급여 오름차순으로 이름, 급여 조회
SELECT EMP_NAME, SALARY
FROM EMPLOYEE
ORDER BY SALARY ASC; --ASCENT
-- ASC 생략 가능(ORDER BY 정렬 방식은 기본적으로 오름차순)
※ ASC 생략 가능 : ORDER BY 정렬방식은 기본적으로 오름차순
★ 정렬은 숫자, 문자, 날짜 모두 사용 가능 ★
- EX-2) EMP 테이블에서 급여 내림차순으로 이름, 급여 조회
SELECT EMP_NAME, SALARY
FROM EMPLOYEE
ORDER BY SALARY DESC; -- DESCENT
- EMP 테이블에서 보너스 정렬
SELECT EMP_NAME, BONUS
FROM EMPLOYEE
ORDER BY BONUS NULLS FIRST;
※ ORDER BY BONUS; : NULLS LAST 기본값
※ ORDER BY BONUS DESC; : NULLS FIRST 기본값
- 정렬 중첩 ( 큰 분류를 먼저 정렬하고, 내부에 작은 분류를 정렬 )
- EX) EMP 테이블에서 부서코드 오름차순 정렬 후 부서별 급여 내림차순 정렬
SELECT EMP_NAME, DEPT_CODE, SALARY
FROM EMPLOYEE
ORDER BY DEPT_CODE, SALARY DESC;
※ 오름차순(ASC) 기본값이라서 생략 가능
'SQL > 기본 개념' 카테고리의 다른 글
JOIN (0) | 2024.12.16 |
---|---|
GROUP BY / HAVING (0) | 2024.12.16 |
그룹(GROUP) 함수 (0) | 2024.12.16 |
함수 (0) | 2024.12.16 |
Database 개요 (0) | 2024.12.16 |