💬 6일차 후기: 저번주는 처음 배우는 내용을 예습, 복습하느라 조금 힘들었는데 이번 주차부터는 전에 써보기도 했고 자격증(SQLD)도 취득한 SQL에 대한 수업을 들어서 마음이 한결 편하다. 전에 접해본 적 있는만큼 다시 복습하면서 내가 모르던 부분을 파악하는 것이 중요할 것 같다.
SQL 수업은 대부분 실습 코드 작성 위주로 이루어지므로,
이론 정리보다는 실습 내용 요약
+ 복습 문제 풀이
로 TIL을 구성할 것이다.
SELECT (컬럼명, 혹은 *) FROM (테이블명);
SELECT * FROM (테이블명)
SELECT * FROM tab;
SELECT a,b,c FROM alphabetDB;
DESC alphabetDB;
SELECT salary, salary*12 FROM emplyees;
hire_date + 100
입사일로부터 100일 후hire_date - 100
입사일로부터 100일 전SYSDATE - hire_date
입사일부터 지금까지 날짜 (일 단위로 출력)SYSDATE + 10
현재로부터 10일 후SYSDATE + 10/24
현재로부터 10시간 후SYSDATE + 10/1440
현재로부터 10분 후SELECT first_name || last_name FROM employees;
SELECT first_name || ' ' || last_name FROM employees;
공백 추가SELECT '사원번호 '||empno||'의 이름은 '||first_name||' '||last_name||'입니다.'
FROM emp;
>> 사원번호 7369의 이름은 배 지수입니다.
-- 리터럴 값('')과 연결 연산자(||)를 사용하여 문장처럼 이어서 출력 가능
빈 칸
혹은 (null)
로 표현✅ ALTER SESSION SET nls_date_format = 'YYYY/MM/DD HH24:MI:SS';
✅ ALTER SESSION SET nls_date_format = 'YYYY/MM/DD';
: 함수에 대한 쓰임을 알고 싶을때 특정 테이블을 생성할 필요없이 dual 테이블을 이용하여 함수의 값을 리턴(return)받음
사용자가 함수(계산)를 실행할 때 임시로 사용하는데 적합
✅ SELECT CURRENT_DATE FROM dual;
현재 날짜 출력
✅ SELECT SYSDATE FROM dual;
현재 날짜 출력
TO_DATE() 함수는 괄호 안의 값을 날짜형으로 변경해주는 기능을 함
SELECT TO_DATE('95/11/25', 'YY/MM/DD'), --2095/11/25로 인식
TO_DATE('95/11/25', 'RR/MM/DD') --1995/11/25로 인식
FROM dual;
✅ ''
'를 두 번 연속해서 입력
✅ q'[ ]'
(대체 인용 연산자 q) 안에 리터럴 값 입력
✅ q'( )'
(대체 인용 연산자 q) 안에 리터럴 값 입력
본 컬럼명 별칭
또는 본 컬럼명 AS 별칭
SELECT DISTINCT ... FROM ...;
또는 SELECT UNIQUE ... FROM ...;
SELECT ... FROM ... WHERE (조건);
조건을 만족하는 값을 찾아서 출력SELECT (컬럼명, 혹은 *) FROM (테이블명) WHERE (비교 조건);
: =(equal) 비교, 대소 비교, !=(not equal) 비교
WHERE city = 'Seoul';
' '사용, 대소문자 구분 WHERE birthday = '1997/12/02';
' '사용 혹은 TO_DATE()로 변환WHERE birthday > '1997/12/02';
생일이 1997/12/02 이후여야한다는 조건WHERE city > 'Seoul';
사전식 배열에서 Seoul보다 뒤에 와야한다는 조건<>
도 동일한 의미WHERE order_total BETWEEN 1000 AND 2000;
WHERE order_date BETWEEN '2021/01/01' AND '2021/07/05';
BETWEEN A AND B
를 쓸 때WHERE order_status IN (0, 8);
WHERE country = 'USA' OR country = 'SPAIN';
문제 1-5) 이름, 월급, 커미션, 월급+커미션을 출력하시오 (단, comm이 null인 경우는 1로 대체하여 출력하시오)
SELECT ename, sal, comm, sal+NVL(comm, 1)
FROM emp;
🔍 NVL() 함수와 NVL2() 함수
: NVL() 함수와 NVL2() 함수는 null 값을 초기화하여 연산이 가능하게 함
NVL(a, 1)
: a에 있는 null 값을 1로 대체
NVL2(a, 1, 2)
: a 값 중 null이 아닌 값은 1로, null 값은 2로 대체
문제 1-9) 아래와 같이 결과가 출력되게 하시오
EMPLOYEE
-------------------------------
SMITH's job is CLERK
ALLEN's job is SALESMAN
...
14 rows selected.
SELECT ename||q'['s job is ]'||job AS EMPLOYEE
FROM emp;
🔍 대체 인용 연산자 q
문자 리터럴 안에 작은 따옴표(')가 포함되어 있는 경우,
이것이 문자열 구분자로 해석되어 오류가 남
이런 경우, 대체 인용 연산자(q)를 사용하여 문자열 구간을 명확히 해야함 ([], {}, <>, AA 내부가 문자열 구간)
SELECT ename||q'['s job is ]'||job FROM emp;
SELECT ename||q'{'s job is }'||job FROM emp;
SELECT ename||q'<'s job is >'||job FROM emp;
SELECT ename||q'A's job is A'||job FROM emp;
문제 2-10) 1981년도에 입사한 사원들의 이름과 입사일을 출력하시오
SELECT Ename, hiredate
FROM emp
WHERE hiredate BETWEEN '1981/01/01' AND '1981/12/31';
🔍 범위 검색 BETWEEN ... AND ...
BETWEEN a AND b
는 숫자뿐 아니라 문자, 날짜에도 사용 가능
문자의 경우, 사전식 배열에서 앞, 뒤 = 작고, 크다
날짜의 경우, 날짜상 비교적 과거, 미래 = 작고, 크다