본문 바로가기

DB (SQL)/공부

[SQL] SELECT _ 2

▶LIKE
- 비교하려는 값이 특정한 패턴을 만족시키면 조회하는 연산자

[작성법]
WHERE 컬럼명 LIKE '패턴'
- LIKE 패턴(와일드카드) : '%'(포함), '_'(글자수)

'%' 예시
1) 'A%' : 문자열이 A로 시작하는 모든 컬럼 값
2) '%A' : 문자열이 A로 끝나는 모든 컬럼 값
3) "%A%' : 문자열에 A가 포함되는 모든 컬럼 값

'_'예시
1) 'A_' : A 뒤에 아무거나 한 글자
2) '___A' : A 앞에 아무거나 세 글자
3) 
    
-- EMPLOYEE 테이블에서 성이 '전'씨인 사원의 사번, 이름 조회
SELECT EMP_ID, EMP_NAME
FROM EMPLOYEE
WHERE EMP_NAME LIKE '전%';

-- EMPLOYEE 테이블에서 이름에 '하'가 포함된 사원의 사번, 이름 조회
SELECT EMP_ID, EMP_NAME
FROM EMPLOYEE
WHERE EMP_NAME LIKE '%하%';

-- EMPLOYEE테이블에서
--전화번호가 010으로 시작하는 사원의 사번, 이름, 전화번호 조회
SELECT EMP_ID, EMP_NAME, PHONE
FROM EMPLOYEE
WHERE PHONE LIKE '010%';

--(전화번호는 총 11자리)
SELECT EMP_ID, EMP_NAME, PHONE
FROM EMPLOYEE
WHERE PHONE LIKE '010________';

-- 010으로 시작하지 않는 사람들 조회 (NOT LIKE)
SELECT EMP_ID, EMP_NAME, PHONE
FROM EMPLOYEE
WHERE PHONE NOT LIKE '010%';

-- EMPLOYEE 테이블에서
-- 이메일에 _ 앞글자가 세글자인 사원의 사번, 이름, 이메일 조회
SELECT EMP_ID, EMP_NAME, EMAIL
FROM EMPLOYEE
WHERE EMAIL LIKE '____%';

-- 문제점 : 와일드 카드 문자(_)와 패턴에 사용된 일반 문자(_)의 모양이 같아 문제 발생
-- 해결방법 : ESCAPE OPTION을 이용하여 일반 문자로 처리할 '_', '%'앞에 아무 특수문자나 붙임

SELECT EMP_ID, EMP_NAME, EMAIL
FROM EMPLOYEE
WHERE EMAIL LIKE '___#_%' ESCAPE '#'; 
                        --> 달러 뒤 한글자만(_)을 일반문자 취급
                        
-- 연습문제
-- 1. EMPLOYEE 테이블에서 이름 끝이 '연'으로 끝나는 사원의 이름 조회
SELECT EMP_NAME
FROM EMPLOYEE
WHERE EMP_NAME LIKE '%연';

-- 2. EMPLOYEE 테이블에서 전화번호 처음 3자리가 010이 아닌 사원의 이름, 전화번호를 조회
SELECT EMP_NAME, PHONE
FROM EMPLOYEE
WHERE PHONE NOT LIKE '010%';

-- 3. EMPLOYEE 테이블에서 메일주소 '_'의 앞이 4자 이면서 DEPT_CODE가 D9 또는 D6이고
--    고용일이 90/01/01 ~ 00/12/01이고, 급여가 270만 이상인 사원의 전체를 조회   
SELECT *
FROM EMPLOYEE
WHERE EMAIL LIKE '____#_%' ESCAPE '#' AND
      (DEPT_CODE ='D9' OR DEPT_CODE ='D6') AND
      HIRE_DATE BETWEEN '1990/01/01' AND '2000/12/01' AND
      SALARY >= 2700000;

-- AND가 OR보다 우선순위가 높아서... 괄호를 적어주지 않으면 
-- (블라블라 AND 블라블라) OR (블라블라~ AND 블라블라 일케 됨)

▶ 연산자 우선순위
/*
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 연산자
- 비교하려는 값과 목록에 작성된 값 중 일치하는 값이 있으면 조회하는 연산자
--> OR연산을 연달아 작성한 효과

[작성법]
칼럼명 IN (값1, 값2, 값 3... ) >목록

-- EMPLOYEE 테이블에서
-- 부서코드가 D1 또는 D6 또는 D9인 사원의 사번, 이름, 부서코드 조회
SELECT EMP_ID, EMP_NAME, DEPT_CODE
FROM EMPLOYEE
-- WHERE DEPT_CODE = 'D1' OR DEPT_CODE = 'D6' OR DEPT_CODE = 'D9';
WHERE DEPT_CODE IN ('D1','D6','D9');

-- 사번이 200, 205, 210인 사원의 사번, 이름 조회
SELECT EMP_ID, EMP_NAME 
FROM EMPLOYEE
WHERE EMP_ID IN (200,205,210);

-- 반대의 경우(NOT IN)
SELECT EMP_ID, EMP_NAME 
FROM EMPLOYEE
WHERE EMP_ID NOT IN (200,205,210);

----------------------------------------------------
▶ 연결연산자 (||)
-- 여러 값을 하나의 컬럼값으로 연결하는 연산자
-- (자바의 문자열 + (이어쓰기)의 역할)

SELECT EMP_NAME || '의 급여는' || SALARY || '원 입니다.' AS 결과
FROM EMPLOYEE;

▶ NULL 처리 연산자
-- JAVA에서 NULL : 참조하는 객체가 없다.
-- DB에서 NULL :  칼럼 값이 없다.

1) IS NULL : 컬럼값이 NULL인경우 조회
2) IS NOT NULL : 컬럼값이 NULL이 아닌경우 조회

-- EMPLOYEE 테이블에서 전화번호가 없는 사원의 사번, 이름, 전화번호 조회
SELECT EMP_ID, EMP_NAME, PHONE
FROM EMPLOYEE
WHERE PHONE IS NULL;

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

▶ ORDER BY절
- SELECT 의 조회결과 (RESULT SET) 정렬시 작성

- SELECT문 가장 마지막에 해석 !

[작성법]
3 : SELECT 컬럼명, 컬럼명...
1 : FROM 테이블명
2 : WHERE 조건식
4 : ORDER BY 컬럼명 | 별칭 | 컬럼순서 [정렬방식 (오름/내림)] [NULLS FIRST | LAST]

-- EMPLOYEE 테이블에서 급여 오름차순으로 이름, 급여 조회
SELECT EMP_NAME, SALARY
FROM EMPLOYEE
ORDER BY SALARY ASC;

-- EMPLOYEE 테이블에서 급여 내림차순으로 이름, 급여 조회
SELECT EMP_NAME, SALARY
FROM EMPLOYEE
ORDER BY SALARY DESC;

--급여가 200만 이상인 사원을 오름차순 정렬
SELECT EMP_NAME, SALARY
FROM EMPLOYEE
WHERE SALARY >= 2000000
ORDER BY SALARY /* ORDER BY는 오름차순 디폴트. ASC 생략 가능 */;

-- 정렬은 숫자, 문자, 날짜 모두 사용가능

-- 이름 오름차순 정렬
SELECT EMP_NAME
FROM EMPLOYEE
ORDER BY EMP_NAME;

-- 고용일 내림 차순
SELECT EMP_NAME, HIRE_DATE
FROM EMPLOYEE
-- ORDER BY HIRE_DATE DESC;
ORDER BY 2 DESC; /* 컬럼 순서로 기재도 가능 */

-- 연봉 내림 차순
SELECT EMP_NAME, SALARY*12 AS 연봉
FROM EMPLOYEE
-- WHERE 연봉 > 5000000 WHERE절에 별칭 사용 불가.
-- 별칭 해석 전이기때문에 WHERE절에 별칭 사용시 오류발생

-- ORDER BY SALARY * 12 DESC;
-- ORDER BY 2 DESC;
ORDER BY 연봉 DESC;

-- 보너스 오름차순
SELECT EMP_NAME, BONUS
FROM EMPLOYEE
-- ORDER BY BONUS; -- NULLS LAST 기본값
-- ORDER BY BONUS DESC; -- NULLS FIRST 기본값
ORDER BY BONUS NULLS FIRST;

-- 오름차순 정렬시 NULLS LAST가 기본값,
-- 내림차순 정렬시 NULLS FIRST가 기본값

-- EMPLOYEE 테이블에서 부서코드 오름차순 정렬 후, 부서별 급여 내림차순
SELECT EMP_NAME, DEPT_CODE, SALARY
FROM EMPLOYEE
ORDER BY DEPT_CODE, SALARY DESC;

'DB (SQL) > 공부' 카테고리의 다른 글

[SQL] GROUP BY ~ HAVING  (0) 2022.03.28
[SQL] 함수_2  (0) 2022.03.28
[SQL] 함수  (0) 2022.03.22
[SQL] SELECT  (0) 2022.03.21
[SQL] DATA와 DATABASE  (0) 2022.03.21