2024. 10. 20. 14:07ㆍoracle
[SELECT문]
: 데이터를 조회하거나 검색할 때 사용하는 명령어
[ 표현법 ]
SELECT 조회하고자 하는 컬럼,
조회하고자 하는 컬럼,
조회하고자 하는 컬럼...
FROM 테이블명;
☆★ ResultSet: 조회된 행들의 집합 / SELECT구문을 통해 조회된 데이터의 결과물을 의미 ☆★
--------------------------------------------------------------------------------------------------------------------------------------------------
SELECT
EMP_NAME,
EMAIL,
PHONE
FROM
EMPLOYEE;
--------------------------------------------------------------------------------------------------------------------------------------------------
[ 칼럼의 값을 통한 산술 연산 ]
: 조회하고자 하는 칼럼들을 나열하는 SELECT절에 산술연산 ( +, -< *, / )을 기술해서 결과를 조회할 수 있음
-- EMPLOYEE테이블로부터 직원명, 월급, 연봉( == 월급 X 12)
SELECT
EMP_NAME,
SALARY,
SALARY * 12
FROM
EMPLOYEE
-- EMPLOYEE 테이블로부터 직원명, 월급, 보너스, 보너스가 포함된 연봉((월급 * 보너스 + 월급) * 12)
SELECT
EMP_NAME,
SALARY,
BONUS,
((SALARY * BONUS + SALARY) * 12)
FROM
EMPLOYEE;
→ 산술연산하는 과정에서 NULL값이 존재할 경우 산술연산의 과정 마저도 NULL이 된다.
--------------------------------------------------------------------------------------------------------------------------------------------------
- DATE → 년, 월, 일, 시, 분, 초
- DATE타입끼리도 연산 가능
- EMPLOYEE테이블에서 직원명, 입사일, 근무일수(오늘날짜 - 입사일)
- 오늘날짜: SYSDATE
SELECT
EMP_NAME,
HIRE_DATE,
SYSDATE - HIRE_DATE
FROM
EMPLOYEE;
→ 값이 지저분한 이유는 Date타입안에 시/분/초가 포함되어있어서 연산을 수행하기 때문
--------------------------------------------------------------------------------------------------------------------------------------------------
[ 컬럼명에 별칭 부여하기 ]
[ 표현법 ]
컬럼명 AS별칭, 컬럼명 AS "별칭", 컬럼명 "별칭", 컬럼명 별칭
SELECT
EMP_NAME AS 이름,
SALARY "급여(월)",
BONUS 보너스,
((SALARY * BONUS + SALARY) * 12) "총 소득"
FROM
EMPLOYEE;
--------------------------------------------------------------------------------------------------------------------------------------------------
[ 리터럴 ]
임의로 지정한 문자열('')을 SELECT절에 기술하게 되면
ResultSet을 반환받을 때 데이터를 붙여서 조회할 수 있음
-- EMPLOYEE 테이블로부터 사원명, 급여
SELECT
EMP_NAME,
SALARY
'원' 단위
FROM
EMPLOYEE;
--------------------------------------------------------------------------------------------------------------------------------------------------
[ DISTINCT ]
조회하고자하는 컬럼 앞에 작성하여 중복된 값을 딱 한번만 조회하는 용도로 사용
[ 표현법 ]
DISTINCT 컬럼명
(단, SELECT절에 DISTINCT구문은 한 개만 사용가능)
SELECT
DISTINCT DEPT_CODE
FROM
EMPLOYEE;
--------------------------------------------------------------------------------------------------------------------------------------------------
SELECT문에서 조건을 부여하는 방법!
[ WHERE 절 ]
조회하고자 하는 테이블에 특정 조건을 제시해서
조건에 만족하는 데이터만을 조회하고자 할 때 기술하는 구문
[ 표현법 ]
SELECT 조회하고자 하는 컬럼명, 컬럼명, 컬럼명, ...
FROM 테이블명
WHERE 조건식;
실행순서: FROM > WHERE > SELECT 순서로 동작
조건식에 다양한 연산자들을 사용할 수 있음
[ 비교 연산자 ]
>, <, >=, <= 대소비교
(일치하는가 ? 자바에서는 동등비교 == 였음)
=
!= (일치하지않는가?
--------------------------------------------------------------------------------------------------------------------------------------------------
EMPLOYEE 테이블로부터 부서코드가 D9가 아닌 사원들의 사원명, 전화번호 조회
SELECT
EMP_NAME,
PHONE
FROM
EMPLOYEE
WHERE
DEPT_CODE != 'D9';
DEPT_CODE ^= 'D9';
DEPT_CODE <> 'D9';
<실습문제>
1. EMPLOYEE테이블에서 급여가 250만원 이상인 사원들의 이름, 급여, 입사일 조회
SELECT
EMP_NAME "이름",
SALARY "급여",
HIRE_DATE "입사일"
FROM
EMPLOYEE
WHERE
SALARY >= 2500000;
2. EMPLOYEE테이블에서 직급코드가 J2인 사원들의 이름, 급여, 보너스 조회
SELECT
EMP_NAME "이름",
SALARY "급여",
BONUS "보너스"
FROM
EMPLOYEE
WHERE
DEPT_CODE = 'J2';
3. EMPLOYEE테이블에서 현재 재직중인 사원(ENT_YN == 'N')들의 사번, 이름, 입사일 조회
SELECT
EMP_ID "사번",
EMP_NAME "이름",
HIRE_DATE "입사일"
FROM
EMPLOYEE
WHERE
ENT_YN = 'N';
4. EMPLOYEE테이블에서 연봉이 5000만원이 이상인 사원들의 이름, 급여, 연봉, 입사일 조회
SELECT
EMP_NAME 사원,
SALARY 급여,
SALARY*12 연봉,
HIRE_DATE 입사일
FROM
EMPLOYEE
WHERE
SALARY*12 >= 50000000;
-- 연봉 >= 50000000; (오류)
--> SELECT절에 부여한 별칭을 WHERE절에 사용할 수 없는 이유는 WHERE절에 실행순서가 더 빠르기 때문
-- 별칭은 SELECT절에서 부여했지만 실행순서가 WHERE절에서 조건을 먼저 검사하고 SELECT문으로 가기때문에
-- WHERE절에서는 별칭을 알 수 없음
-----------------------------------------------------------------------------------------------------------------------------------------------------------
-- 모든 데이터가 구조를 잡아서 테이블 형태로 저장해놓는다
-- 테이블구조에서 원하는걸 찾을 때 사용하는 것이 SELET문인데 조회는 항상 행단위로 이루어진다
-- 조회해서 나온 행들이 집합 = RESULTSET!!중요
-- 조회에 아무것도 뜨지 않으면 조회를 해 왔는데 조회된 행의 결과가 0인것! (조회가 안된게 아님)
-- 오류라면 오류문구가 뜸
-----------------------------------------------------------------------------------------------------------------------------------------------------------
[ 논리 연산자 ]
여러 개의 조건을 엮을 때 사용
AND(~~이면서, 그리고) /OR(~~거나, 또는)
EMPLOYEE테이블로부터 부서코드가 'D9'이면서 급여가 500만원 이상인 사원들의 사원명, 부서코드, 급여 조회
SELECT
EMP_NAME,
DEPT_CODE,
SALARY
FROM
EMPLOYEE
WHERE
DEPUT_CODE = 'D9'
AND
SALARY >= 5000000;
EMPLOYEE테이블로부터 부서코드가 D6이거나 급여가 300만원 이상인 사원들의 이름, 부서코드, 급여 조회
SELECT
EMP_NAME,
DEPT_CODE,
SALARY
FROM
EMPLOYEE
WHERE
DEPUT_CODE = 'D6'
OR
SALARY >= 3000000;
-----------------------------------------------------------------------------------------------------------------------------------------------------------
[ BETWEEN AND ]
몇 이상 몇 이하인 범위에 대한 조건을 제시할 때 사용
[ 표현법 ]
비교대상컬럼명 BETWEEN 하한값 AND 상한값
EMPLOYEE테이블로부터 급여가 350이상 500이하인 사원들의 사번 이름 급여 직급코드 조회
SELECT
EMP_ID,
EMP_NAME,
SALARY,
JOB_CODE
FROM
EMPLOYEE
WHERE
SALARY BETWEEN 3500000 AND 5000000;
-- 위 조건에 포함되는 것말고 그 나머지를 찾고싶은 경우
-- EMPLOYEE테이블로부터 급여가 350만 미만이거나 500만을 초과하는 사원들의 사번, 이름, 급여, 직급코드 조회
-- BETWWEN앞에 NOT을 붙여주면 부정의 의미로 반대값이 출력된다 (자바에서 !와 같은 역할)
SELECT
EMP_ID,
EMP_NAME,
SALARY,
JOB_CODE
FROM
EMPLOYEE
WHERE
SALARY NOT BETWEEN 3500000 AND 5000000;
-- BETWEEN AND 연산자는 DATE형식에도 사용 가능
-- 입사일이 '90/01/01' ~ '03/01/01' 인 사원들의 이름과 입사일 조회
SELECT
EMP_NAME,
HIRE_DATE
FROM
EMPLOYEE
WHERE
HIRE_DATE BETWEEN '90/01/01' AND '03/01/01';
-----------------------------------------------------------------------------------------------------------------------------------------------------------
[ LIKE '특정패턴' ]
비교하려는 컬럼의 값이 내가 지정한 특정 패턴에 만족할 경우 조회
[ 표현법 ]
비교대상컬럼명 LIKE '특정패턴'
- 특정패턴 -> 와일드 카드(데이터베이스 커리에서 특정패턴을 만들기 위한 특정문자들)
- '%', '_' (와일드카드)를 가지고 패턴을 만들어낼 수 있음
- LIKE문에는 와일드카드가 같이 사용된다
- 부정일 경우 NOT 붙이기
'%' : 0글자 이상
EX) 비교대상컬럼명 LIKE 'A%' => 비교대상컬럼 값 중 'A'로 시작하는 것만 조회 -> Apple, Add, A
비교대상컬럼명 LIKE '%A' => 비교대상컬럼 값 중 'A'로 끝나는 것만 조회 -> Banana, Golila, A
비교대상컬럼명 LIKE '%A%' => 비교대상컬럼 값 중 'A'가 포함되는 것을 모두 조회
'_' : 1글자(무조건 한글자가 있어야함)
EX) 비교대상컬럼명 LIKE '_A' => 해당 컬럼 값중에 'A'앞에 무조건 1글자가 있으면 조회
비교대상컬럼명 LIKE '__A' => 해당 컬럼 값중에 'A'앞에 무조건 2글자가 있으면 조회
언더버 한개당 한글자를 의미('_A_'이면 두번째 글자가 A인 글자 조회)
-- EMPLOYEE 테이블로부터 성이 '강'씨인 사원들의 사원명, 부서코드 조회
SELECT
EMP_NAME,
DEPT_CODE
FROM
EMPLOYEE
WHERE
EMP_NAME LIKE '강%';
-- EMPLOYEE 테이블로부터 이름에 '민'이라는 글자가 포함된 사원들의 사원명, 부서코드
SELECT
EMP_NAME,
DEPT_CODE
FROM
EMPLOYEE
WHERE
EMP_NAME LIKE '%민%';
-- EMPLOYEE 테이블로부터 이름의 두번째 글자가 '길'인 사원들의 사원명, 부서코드
SELECT
EMP_NAME,
DEPT_CODE
FROM
EMPLOYEE
WHERE
EMP_NAME LIKE '_길_';
-- EMPLOYEE 테이블로부터 이름의 두번째 글자가 '길'이 아닌! 사원들의 사원명, 부서코드
SELECT
EMP_NAME,
DEPT_CODE
FROM
EMPLOYEE
WHERE
EMP_NAME NOT LIKE '_길_';
-----------------------------------------------------------------------------------------------------------------------------------------------------------
< 실습문제 >
-- 1. EMPLOYEE테이블로부터 전화번호 4번째 자리가 9로 시작하는 사원들의 사원명, 전화번호 조회
SELECT
EMP_NAME,
PHONE
FROM
EMPLOYEE
WHERE
PHONE LIKE '___9%';
-- 2. EMPLOYEE테이블로부터 이름이 '동'으로 끝나는 사원들의 이름, 입사일 조회
SELECT
EMP_NAME,
HIRE_DATE
FROM
EMPLOYEE
WHERE
EMP_NAME LIKE '%동';
-- 3. EMPLOYEE테이블로부터 전화번호 처음 3글자가 010이 아닌 사원들의 이름, 전화번호 조회
SELECT
EMP_NAME,
PHONE
FROM
EMPLOYEE
WHERE
PHONE NOT LIKE '010%';
-- 4. DEPARTMENT 테이블로부터 해외영업과 관련된 부서들의 부서명 조회
SELECT
DEPT_TITLE
FROM
DEPARTMENT
WHERE
DEPT_TITLE LIKE '해외%';
-----------------------------------------------------------------------------------------------------------------------------------------------------------
[ IS NULL ]
[ 표현법 ]
비교대상컬럼 IS NULL : 컬럼값이 NULL일 경우
비교대상컬럼 IS NOT NULL : 컬럼값이 NULL이 아닐 경우
-- EMPLOYEE테이블로부터 보너스를 받지 않은 사원들의 사원명, 보너스 조회
SELECT
EMP_NAME,
BONUS
FROM
EMPLOYEE
WHERE
BONUS IS NULL;
-----------------------------------------------------------------------------------------------------------------------------------------------------------
-- EMPLOYEE테이블로부터 부서코드가 D6이거나 D8이거나 D5인 사원들의 사원명, 부서코드 조회
SELECT
EMP_NAME,
DEPT_CODE
FROM
EMPLOYEE
WHERE
DEPT_CODE = 'D6'
OR
DEPT_CODE = 'D8'
OR
DEPT_CODE = 'D5';
-- 이코드도 맞지만 비교연산을 많이 해서 코드가 길어짐 그럴때 아래와 같은 IN을 사용할 수 있다
< IN >
비교대상 컬럼 값에 내가 제시한 목록들 중에서 일치하는 값이 있는지
[표현법]
비교대상컬럼 IN {값, 값, 값, ...}
SELECT
EMP_NAME,
DEPT_CODE
FROM
EMPLOYEE
WHERE
DEPT_CODE IN ('D6', 'D8', 'D5');
-----------------------------------------------------------------------------------------------------------------------------------------------------------
[ 연산자 우선순위 ]
0. ( ) 괄호
1. 산술연산자 +, -< *, /
2. 연결연산자 ||
3. 비교연산자 >, <, >=, <=
4. ISNULL, LIKE, IN
5. BETWEEN AND
6. NOT
7. AND
8. OR
EX]
WHERE
DEPT_CODE = 'D6'
OR
DEPT_CODE = 'D8'
AND
DEPT_CODE = 'D5';
=> AND연산이 먼저 실행되어 D8과 D5의 AND연산이 먼저 이루어진다 값은 NULL이 결과이고 다음
D6과 OR연산이 이루어진다
-----------------------------------------------------------------------------------------------------------------------------------------------------------
[ 연결 연산자 ]
여려개의 컬럼값들을 마치 하나의 컬럼인것처럼 연결시켜주는 연산자
컬럼값 또는 리터럴(임의의 문자열)을 전부 다 연결 할 수 있음
RESULTSET에서 따로따로 나오는 것이 아니라 하나의 값처럼 출력
칼럼값뿐만 아니라 문자열도 같이 포함하여 연결할 수 있어 문장처럼 만들 수도 있다
System.out.println("num : " + num);
SELECT
EMP_ID ||
EMP_NAME
FROM
EMPLOYEE;
SELECT EMP_ID || '번 사원' || EMP_NAME || '님의 핸드폰 번호는 ' || PHONE || '입니다.' AS "사원정보"
FROM
EMPLOYEE;
-- 200번 사원이승철님의 핸드폰 번호는 01099546325입니다.
----------------------------------------------------------------------------
★< ORDER BY 절 >★
조회된 RESULTSET을 정렬하는 용도로 사용
SELECT문 가장 마지막에 가입하는 문법 + 실행순서 또한 항상 가장 마지막
사용하지 않는 경우 RESULTSET은 정렬하지 않기 때문에 정렬하고 싶다면 반드시 작성해야함!
(조회결과가 2행 이상이고 SELECT절을 사용했으면 무조건 정렬하기위해 항상 사용되는 절)
[ 표현법 ]
SELECT
조회할 컬럼명,
조회할 컬럼명,
...
FROM
조회할 테이블명
WHERE
조건식(생략가능)
ORDER
BY
[정렬기준으로 잡고싶은 컬럼명 / 컬럼의 별칭/ 컬럼의 순번] [ASC / DESC ] [ NULLS FIRST / NULLS LAST] (생략가능)
- ASC : 오름차순 (생략 시 기본 값)
- DESC : 내림차순
- NULLS FIRST : 정렬하고자 하는 컬럼값에 NULL값이 존재할 경우 해당 NULL값들을 조회 결과의 위쪽으로 배치(내림차순일 경우 기본값)
- NULLS LAST : 정렬하고자 하는 컬럼값에 NULL값이 존재할 경우 해당 NULL값들을 조회 결과의 하단으로 배치(오름차순일 경우 기본값)
- 정렬기준을 여러개로 잡을 수도 있음
(첫번째로 제시한 정렬기준의 컬럼값이 동일할 경우 두번째 정렬 기준을 가지고 또 정렬을 할 수 있음 )
- 실행순서가 맨마지막에 실행 (SELECT절에서 별칭을 지었다면 ORDER BY절에서 사용가능)
-- 보너스 컬럼의 값을 가지고 정렬
SELECT
EMP_ID,
EMP_NAME,
BONUS
FROM
EMPLOYEE
ORDER
BY
BONUS; → ASC/ DESC 생략시 기본값은 ASC(오름차순). NULL값은 하단에 배치
BONUS DESC; → 내림차순으로 정렬 시 기본적으로 NULLSFIRST NULL값이 상단에 배치
BONUS DESC NULLS LAST; → 내림차순으로 정렬하고 NULL값을 하단에 배치해라
BONUS, EMP_ID ASC; → 보너스값을 ASC로 먼저 정렬하고 같은 값끼리 EMP_ID를 ASC로 정렬
→ 첫번째로 제시한 정렬기준의 컬럼값이 동일할 경우 두번째 정렬 기준을 가지고 또 정렬을 할 수 있음
SELECT
EMP_NAME 사원명,
SALARY * 12 연봉
FROM
EMPLOYEE
ORDER
BY
-- 연봉; : 별칭사용가능
[기억하기]
행단위로 조회된다
조회결과를 RESULTSET이라 한다
순서
ORDER BY절을 사용하자
'oracle' 카테고리의 다른 글
| Oracle_DDL_CREATE / ALTER / DROP (1) | 2024.10.27 |
|---|---|
| Orcale_DML_INSERT / UPDATE / DELETE (0) | 2024.10.27 |
| Orcale_DDL_CREATE / ALTER/ DROP (5) | 2024.10.23 |
| Oracle_DML_SUB QUERY 서브쿼리 (3) | 2024.10.21 |
| Oracle_DML_FUNCTION (2) | 2024.10.20 |