💬 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는 숫자뿐 아니라 문자, 날짜에도 사용 가능
문자의 경우, 사전식 배열에서 앞, 뒤 = 작고, 크다
날짜의 경우, 날짜상 비교적 과거, 미래 = 작고, 크다