유디의 공간정보·개발일기

1. 0716_ sql1 본문

SQL

1. 0716_ sql1

55yudi 2021. 10. 31. 17:14
--어떤 정보를 보여줄건지
--어떤 테이블에서 가져올건지
--어떤 조건으로 검색할 것인지

select *
from employees
--where department_id = 100;
where last_name = 'King';

select employee_id, last_name, first_name, salary
from employees;

--java에서의 identifier(식별자) : 변수/메서드/클래스/패키지의 이름
--DB에서의 identifier(식별자) : 테이블/컬럼의 이름

--부서번호와 부서명, 부서위치를 출력하시오.
select DEPARTMENT_ID 사번, DEPARTMENT_NAME, LOCATION_ID --사번 : 컬럼명 옆에 뭘 적으면 그게 새 컬럼명이 됨
from DEPARTMENTS;

--부서번호 100번에 근무하는 사원들의 사번, last이름, first이름, 급여, 입사일자를 출력하시오.
select EMPLOYEE_ID, FIRST_NAME, LAST_NAME, SALARY, HIRE_DATE --명령
from EMPLOYEES --어디로부터
where DEPARTMENT_ID = 100; --어떤 조건에 맞는
--영어 문장의 느낌이 강하다. SQL도 하나의 언어임

--연산자 사용하기
select EMPLOYEE_ID, SALARY, (SALARY * 12 + 1000) 연봉
from EMPLOYEES;

--NULL : 아무런 값도 정해지지 않은 것
--COMMISSION을 반영한 급여를 출력하시오. (null값이 출력안되게 해보기)
select last_name, SALARY, COMMISSION_PCT, SALARY*(1+nvl(commission_pct,0)) 커미션반영급여
from EMPLOYEES;

--사번과 이름과 커미션을 출력하시오. 단, 커미션을 받지 않으면 0으로 출력하시오.
select EMPLOYEE_ID, FIRST_NAME, LAST_NAME, nvl(COMMISSION_PCT,0) COMMISSION
from EMPLOYEES;

select *
from EMPLOYEES
--where last_name = King; --King이라는 컬럼이 없어서 오류가 난다
--where절의 연산자
--where DEPARTMENT_ID != 100; --부서번호가 100번 인 것을 제외하고 출력하라는 의미, != 는 not의 의미
--where DEPARTMENT_ID in (100, 110); -- 100 or 110
--where DEPARTMENT_ID = 100 or DEPARTMENT_ID = 110;
--where SALARY between 5000 and 10000;

--커미션을 받지 않는 직원들을 조회하시오.
--where COMMISSION_PCT is null;

--커미션을 받는 직원들을 조회하시오.
--where COMMISSION_PCT is not null;

--아직 부서에 배치되지 않은 직원을 조회하시오.
--where department_id is null;

--상위 관리자가 없는 직원을 조회하시오.
--where MANAGER_ID is null; --사장인가봄
--where last_name like 'K%';

--Steven King의 정보를 조회하시오.
where FIRST_NAME = 'Steven' and last_name = 'King';


--급여가 높은 순서로 출력하시오.
select *
from EMPLOYEES
where DEPARTMENT_ID = 100
order by SALARY desc;

--과제1
select EMPLOYEE_ID, FIRST_NAME, LAST_NAME, SALARY, HIRE_DATE, EMAIL
from EMPLOYEES
where salary > 10000 and COMMISSION_PCT is not null and (DEPARTMENT_ID = 80 or DEPARTMENT_ID = 100) and MANAGER_ID is not null and JOB_ID like 'P%'
order by HIRE_DATE asc;


--문자열 함수
select 'SQL Language' from dual; --from dual은 가상의 터미널(가상의 테이블로 생각)

select length('SQL Language') from dual; --문자열의 길이를 알 수 있음
select substr('SQL Language',3) from dual;
select substr('SQL Language',3,5) from dual;
select substr('SQL Language',-3) from dual; --오른쪽(뒤)에서부터 3글자를 출력

--숫자 함수
select round(3.141519) from dual; --round : 소수점아래 n자리까지 반올림
select round(1234.141519) from dual;
select round(1234.141519, 2) from dual;
select round(1234.141519, -2) from dual; --n값이 마이너스 이면 정수 부분에서 반올림
select trunc(1567.141519, -2) from dual; --trunc : 소수점아래 n자리 미만 버림

--근속년수를 출력하시오(소수 둘째 자리까지 반올림, 현재일자는 sysdate).
select round((sysdate - hire_date)/365.25, 2) 근속년수
from EMPLOYEES;

select sysdate+7/24 from dual; --지금 5:20 이니까 7/24일(7시간)을 더해주면 다음날로 출력됨
select 107*28 from dual;
select ceil(3.14) from dual; --4를 출력
select floor(3.14) from dual; --3을 출력

--입사 후 30주년이 되는 날짜를 출력하시오.
select EMPLOYEE_ID, HIRE_DATE, add_months(HIRE_DATE, 12*30)
from EMPLOYEES;
--날짜에 대한 round, trunc 응용(교재 p.41)
select round(sysdate) from dual; --오늘 날짜를 반올림하면? 오전이면 오늘 출력, 오후면 다음날이 출력
select trunc(sysdate) from dual; --오늘 날짜
select round(sysdate, 'month') from dual; --7/16에서 반올림하면 다음달인 8/01이 출력
select trunc(sysdate, 'month') from dual; --7/16에서 절삭하면 7/01이 출력
select round(sysdate, 'year') from dual; -- 21년 7월에서 반올림하면 다음년도 2022/01/01 출력
select trunc(sysdate, 'year') from dual; -- 21년 7월에서 절삭하면 이번년도 2021/01/01 출력

select to_char(sysdate+1/24, 'YYYY-MM-DD HH:MI:SS') from dual; --현재날짜시각으로부터 + 1시간

 

- select : 원하는 컬럼을 기술

- from : 테이블을 기술

- where : 조건을 지정하고 검색조건을 알려줌

- group by & having : 그룹화함 

- order by : 정렬 조건, asc(디폴트, 오름차순), desc(내림차순)

 

- Null : 아무런 값도 아직 안 정해진 것

- nvl(null인 값, 바꾸려는 값) : null값을 다른 값으로 변환할 때 사용

- Is null, Is not null

'SQL' 카테고리의 다른 글

5. 0811_ DDL 실습관련  (0) 2021.10.31
4. 0722_ sql4  (0) 2021.10.31
3. 0720_ sql3  (0) 2021.10.31
2. 0719_ sql2, Join  (0) 2021.10.31
[SQL] char, varchar, varchar2 차이점  (0) 2021.08.13