✿∘˚˳°∘°

18일차 : SELECT, 연산자 본문

국비수업/DB

18일차 : SELECT, 연산자

_HYE_ 2022. 12. 21. 18:00

2022/12/21

[ 1. DML(SELECT) ] ========================================================

DQL - SELECT 
데이터를 검색(추출)하기 위해 사용되는 언더
DML에 속해있으며 DML중 SELECT만을 따로 의미
Result Set : 데이터를 조회한 결과 
- 0개이상의 행을 포함하기때문에 한줄도없을수도있음(0포함)
- 특정기준에 의해 정렬가능(특정행/특정컬럼/다른테이블의특정컬럼과함께)

SELECT 컬럼명 FORM 테이블명 WHERE 조건식;

 

[ 실 습 ] 

-- 전체실행:F5 명령문실행:Ctrl+Enter
SELECT * FROM EMPLOYEE;
-- 주석
-- 특정테이블 조회하는 방법
/* 주석
SELECT 조회하고싶은컬럼1,조회하고싶은컬럼2(조회하고싶은 컬럼이 여러개면 ,로 이어준다)
FROM  조회하고싶은테이블 
WHERE 조회조건
-- 1.어떤테이블에서(FROM)
-- 2.어떤조건으로(WHERE 생략가능)
-- 3.어떤컬럼을 검색할지(SELECT)
*/
-- EMPLOYEE테이블에서 조건없이 이름, 주민번호, 이메일 조회하기 
SELECT EMP_NAME, EMP_NO, EMAIL
FROM EMPLOYEE;
-- WHERE 조건이없다면 생략

-- EMPLOYEE테이블에서 조건없이 모든정보
SELECT * 
FROM EMPLOYEE;

-- EMPLOYEE테이블에서 월급이 300만원이상인 직원이 이름,전화번호,월급 조회
SELECT EMP_NAME, PHONE, SALARY
FROM EMPLOYEE
WHERE SALARY >= 3000000;

-- 오라클에선 문자열을 'J2'(""안된다)
-- EMPLOYEE테이블에서 직급코드(JOB_CODE)가 J2인 직원이 이름,이메일,전화번호,직급코드 조회
SELECT EMP_NAME, EMAIL, PHONE, JOB_CODE
FROM EMPLOYEE
WHERE JOB_CODE = 'J2'; -- 자바(==)와 달리 오라클의 같다연산은 =

-- EMPLOYEE 테이블에서 월급이 350만원 이상이면서 직급코드가 J3인 직원의
-- 이름, 전화번호, 월급, 직급코드 조회
SELECT EMP_NAME, PHONE, SALARY, JOB_CODE
FROM EMPLOYEE
WHERE SALARY >= 3500000 AND JOB_CODE = 'J3';
-- AND, OR연산은 키워드로한다

-- EMPLOYEE 테이블에서 모든직원의 이름, 급여, 연봉 출력
SELECT EMP_NAME AS "이름", SALARY AS "급여", SALARY*12 AS "연봉" 
FROM EMPLOYEE;
-- 조회에 산술식(+-*/)을 적용해도 상관X / AS "바꿀컬럼명" 

SELECT EMP_NAME "이름", SALARY "급여", SALARY*12 "연봉" 
FROM EMPLOYEE;
-- AS는 빼도되지만 띄어쓰기는 꼭 해줘야한다

SELECT EMP_NAME 이름, SALARY 급여, SALARY*12 "연봉(원)" 
FROM EMPLOYEE;
-- 쌍따옴표("")는 없어도되는경우가 있고 있어야하는경우가있음(현재는 없어도됨)
-- 쌍따옴표가 필요한 경우 : 별칭에 특수기호가 들어가는경우 반드시 필요 / 순수텍스트는 없어도 됨

SELECT EMP_NAME, SALARY, '원' 
FROM EMPLOYEE;
-- '원' : 자바로따지면 리터럴(순수값) / 출력되는 모든 컬럼에 붙어서 출력

SELECT * FROM EMPLOYEE;

-- DISTINCT : 똑같은 결과는 한번만 보겠어(중복없이조회)
SELECT DISTINCT DEPT_CODE FROM EMPLOYEE; --(결과7개)
SELECT DISTINCT JOB_CODE FROM EMPLOYEE; --(결과7개)
-- 칼럼이 두개이상일 경우 동시에 일치하는것만 제거(모든컬럼값이 똑같은 것)
SELECT DISTINCT DEPT_CODE, JOB_CODE FROM EMPLOYEE; --(결과13개)

 

[ 2. 연산자 ]  =====================================================================

-- 연결연산자(||)
SELECT EMP_NAME, SALARY||'원' 월급 FROM EMPLOYEE;
-- 출력 이름 월급원 으로 출력된다

-- BETWEEN AND 연산자
-- 조건 : 급여가 350만원이상 600만원이하
SELECT EMP_NAME, SALARY
FROM EMPLOYEE
WHERE SALARY >= 3500000 AND SALARY <= 6000000;

SELECT EMP_NAME, SALARY
FROM EMPLOYEE
WHERE SALARY BETWEEN 3500000 AND 6000000;
-- BETWEEN A AND B : A B값이 포함될 때 사용 해당하는 급여가 A부터 B사이일 때

-- 날짜 계산에도 BETWEEN을 사용할 수 있다
SELECT EMP_NAME, HIRE_DATE
FROM EMPLOYEE
WHERE HIRE_DATE BETWEEN '90/01/01' AND '01/01/01';

-- LIKE, NOT LIKE 연산자
-- 와일드카드 : 아무거나 대체할수 있는 문자(_,%)
-- _ : 아무거나 한글자를 대체 (일반적인 세글자이름이라 생각하면 '전__')
-- % : 아무거나 대체(글자수제한이없음 -> 0글자 이상)
-- EMPLOYEE 테이블에서 이름중에 성이 전씨인 직원의 이름, 급여
SELECT EMP_NAME, SALARY
FROM EMPLOYEE
WHERE EMP_NAME LIKE '전__';
-- 연산자를 LIKE가 아닌 =로 하게되면 전__를 찾는다
-- 와일드 카드를 쓰기위한 연산자가 LIKE, NOT LIKE

SELECT EMP_NAME, SALARY
FROM EMPLOYEE
WHERE EMP_NAME LIKE '전%';
-- %로하면 두글자이름도 세글자이름도 상관x 전 한글자여도 들어옴

-- EMPLOYEE 테이블에서 이름중에 '전'이 포함된 직원의 이름, 급여
SELECT EMP_NAME, SALARY
FROM EMPLOYEE
WHERE EMP_NAME LIKE '%전%';
--전이 처음에있어도 중간에있어도 마지막에있어도 조회가능

-- 이메일 주소 중 _앞에 글씨가 3개인 직원(이메일에는 _가 포함되어있음)
SELECT EMP_NAME, EMAIL
FROM EMPLOYEE
WHERE EMAIL LIKE '___#_%' ESCAPE '#';
-- 주의점 '____%'(언더바4개%) 안됨 : 컴퓨터가 뭐가 와일드카드고 뭐가 문자열언더바인지 모름
-- #뒤에 오는건 와일드카드가 아니야 라고 신호를 주는것 와카와카와카#
-- 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 테이블에서 메일주소의 'S'가 들어가면서, DEPT_CODE가 D9 또는 D6이고
      고용일이 90/01/01 ~ 00/12/01 이면서, 월급이 270만원 이상인 사원의 전체정보 출력
*/
SELECT *
FROM EMPLOYEE
WHERE (EMAIL LIKE '%s%') AND
      (DEPT_CODE = 'D9' OR DEPT_CODE = 'D6') AND
      (HIRE_DATE BETWEEN '90/01/01' AND '00/12/01') AND
      (SALARY >= 2700000);
-- 칼럼명, 테이블명 등은 대소문자 구분을 안해도 되지만, 
-- 필드에 들어가는 값은 대소문자 구분을 해줘야함 
-- 연산자의 우선순위를 고려해줘야한다.( 우선순위 AND > OR )

-- IN, NOT IN 연산자
-- DEPT_CODE가 D6이거나 D9이거나 D5인 직원의 이름, 부서코드 조회
SELECT EMP_NAME, DEPT_CODE FROM EMPLOYEE
WHERE DEPT_CODE = 'D6' OR DEPT_CODE = 'D9' OR DEPT_CODE = 'D5';
-- 이걸 간단하게 써줄수있는게 IN연산자(단 OR일때만 사용가능)
SELECT EMP_NAME, DEPT_CODE FROM EMPLOYEE
WHERE DEPT_CODE IN('D6', 'D9', 'D5'); -- IN : 12명

SELECT EMP_NAME, DEPT_CODE FROM EMPLOYEE
WHERE DEPT_CODE NOT IN('D6', 'D9', 'D5'); --NOT IN : 9명

SELECT EMP_NAME, DEPT_CODE FROM EMPLOYEE; --전체 : 23명
-- 인원수에 차이가 나는 이유 : LIKE, NOT LIKE, IN, NOT IN 같은 연산자는 NULL을 제외

SELECT EMP_NAME, DEPT_CODE
FROM EMPLOYEE
WHERE DEPT_CODE IS NULL;

SELECT EMP_NAME, DEPT_CODE
FROM EMPLOYEE
WHERE DEPT_CODE IS NOT NULL;
-- NULL은 일반연산자로는 확인할 수 없어서 IS NULL / IS NOT NULL을 이용해야한다

SELECT EMP_NAME, SALARY, BONUS, (SALARY + SALARY*BONUS)*12 연봉
FROM EMPLOYEE
WHERE BONUS IS NOT NULL;
-- SALARY*BONUS 보너스가 없는사람은 연산이 안된다(NULL이기때문에)
-- 그래서 조건에 NULL을 제외해준다

-- 직원 중 직급코드(JOB_CODE)가 J7 또는 J2이고, 급여가 200만초과인 직원의
-- 이름, 급여, 직급코드 출력
SELECT EMP_NAME, SALARY, JOB_CODE 
FROM EMPLOYEE
WHERE JOB_CODE IN('J7', 'J2') AND SALARY > 2000000;
-- IN이라는연산자는 OR를 편하게 쓰려고 사용하는 것
-- IN연산자의 우선순위가 논리연산자보다 높기때문에 괄호를 사용하지않아도 OR와 다르게 정상처리

-- 날짜연산
SELECT EMP_NAME, HIRE_DATE, SYSDATE, SYSDATE+1, SYSDATE-1,
       SYSDATE+3-SYSDATE, SYSDATE-3-SYSDATE, FLOOR(SYSDATE-HIRE_DATE) 
FROM EMPLOYEE;
-- SYSDATE : 오늘 / SYSDATE+1 : 내일 / SYSDATE-1 : 어제
-- 날짜테이터 + or - 정수 => 정수만큼 더한날짜 or 뺀날짜
-- 날짜 - 날짜 -> 몇일차이나는지 계산
/*
 SYSDATE-HIRE_DATE : 소수점이 다 똑같음
 SYSDATE -> 현재 시스템시간 [년/월/일/시/분/초]를 가져옴 시분초는 보이지만 않을뿐
 SYSDATE +1 -> 현재 시스템 시간을 가져온 후 +1
 SYSDATE+1-SYSDATE -> SYSDATE의 시분초 정보가 모두 같기때문에 딱떨어져서 출력
 SYSDATE-HIRE_DATE : 시분초정보가 다르기때문에 소수점이 생기는것
 소수점은 FLOOR(값)로 제거할 수 있다.
*/

-- 조회 정렬
/*
  순서
   3 SELECT 컬럼
   1 FROM 테이블      
   2 WHERE 조건       
   4 ORDER BY 정렬기준
*/
SELECT EMP_NAME, EMAIL, SALARY 
FROM EMPLOYEE
ORDER BY 3 DESC , EMP_NAME ASC NULLS FIRST;
-- 생략 시 Default가 올림차순
-- 올림차순 : ASC(생략가능) / 내림차순 : DESC
-- 정렬기준은 여러개 잡아줄 수 있음
-- SALARY가 아닌 조회끝난기준 몇번째 컬럼(3)인지 적어도된다(동작순서가 SELECT가 먼저이므로)
-- 정렬자체는 SELECT로 조회하지않은 컬럼으로도 할 수 있다(단 이경우 몇번째컬럼x)
-- NULLS FIRST : NULL을 맨위로, NULLS LAST : NULL을 맨아래로

 

[ 문제실습 ]

-- 문제1. 
-- 입사일이 5년 이상, 10년 이하인 직원의 이름,주민번호,급여,입사일을 이름순으로 검색하여라
SELECT EMP_NAME, EMP_NO, SALARY, HIRE_DATE
FROM EMPLOYEE
WHERE (SYSDATE-HIRE_DATE) BETWEEN 5*365 AND 10*365
ORDER BY EMP_NAME;

-- 문제2.
-- 재직중이 아닌 직원의 이름,부서코드,입사일, 퇴사일을 검색하여라 (퇴사 여부 : ENT_YN)
SELECT EMP_NAME, DEPT_CODE, HIRE_DATE, ENT_DATE
FROM EMPLOYEE
WHERE ENT_YN = 'Y';

-- 문제3.
-- 근속년수가 10년 이상인 직원들을 검색하여
-- 출력 결과는 이름,급여,근속년수를 근속년수가 오름차순으로 정렬하여 출력하여라
SELECT EMP_NAME, SALARY, FLOOR((SYSDATE-HIRE_DATE)/365) AS 근속년수
FROM EMPLOYEE
WHERE (SYSDATE-HIRE_DATE)>= 10*365
ORDER BY 3 ASC;

-- 문제4.
-- 입사일이 99/01/01 ~ 10/01/01 인 사람 중에서 급여가 2000000 원 이하인 사람의
-- 이름,주민번호,이메일,폰번호,급여를 검색 하시오
SELECT EMP_NAME, EMP_NO, EMAIL, PHONE, SALARY
FROM EMPLOYEE
WHERE (HIRE_DATE BETWEEN '99/01/01' AND '10/01/01') AND (SALARY <= 2000000);


-- 문제5.
-- 급여가 2000000원 ~ 3000000원 인 여직원 중에서 4월 생일자를 검색하여 
-- 이름,주민번호,급여,부서코드를 주민번호 순으로(내림차순) 출력하여라​
SELECT EMP_NAME, EMP_NO, SALARY, DEPT_CODE
FROM EMPLOYEE
WHERE (SALARY BETWEEN 2000000 AND 3000000) AND
      (EMP_NO LIKE '___4%-2%')
ORDER BY EMP_NO DESC;

 

[ 후기 ] ---------------------------------------------------------------------------------------------------------------------------------------------------

오늘은 드디어JAVA를 끝내고(내년까진 이클립스 사용안한대요~) SQL이라는 새로운걸 배웠다.

아직초반이라 어렵진않지만 자꾸 짜잘한 실수를했다ㅎ 계속 실수하는 부분을 주의깊게 봐야겠다.

그리고 오늘 T스토리에 코드블럭이 있는걸 처음알았다..... java할때는 화면 전부 캡쳐하고 넣느라 블로그에서 확인하면 가독성도 떨어지고 작성도 번거롭고 불편했는데....오늘부터 천천히 수정해야겠다ㅠㅠ 그래도 더 늦기전에 발견해서 다행!

 

오늘 실수한 점

1. 와일드카드 사용시 LIKE, NOT LIKE연산자를 사용해야하는데 자꾸 = 사용 

'국비수업 > DB' 카테고리의 다른 글

23일차 : PL/SQL  (0) 2022.12.28
22일차 : ALTER, DROP / TCL / OBJECT  (0) 2022.12.27
21일차 : 서브쿼리 / DML / DDL  (0) 2022.12.26
20일차 : GROUP BY / JOIN  (0) 2022.12.23
19일차 : 함수  (0) 2022.12.22
Comments