[SQL] SELECT문 작성

지수·2023년 4월 2일
0

플레이데이터

목록 보기
11/50
post-thumbnail

💬 6일차 후기: 저번주는 처음 배우는 내용을 예습, 복습하느라 조금 힘들었는데 이번 주차부터는 전에 써보기도 했고 자격증(SQLD)도 취득한 SQL에 대한 수업을 들어서 마음이 한결 편하다. 전에 접해본 적 있는만큼 다시 복습하면서 내가 모르던 부분을 파악하는 것이 중요할 것 같다.

SQL 수업은 대부분 실습 코드 작성 위주로 이루어지므로,
이론 정리보다는 실습 내용 요약 + 복습 문제 풀이로 TIL을 구성할 것이다.


[ 실습 내용 ]

1. SELECT문 작성

기본 SELECT문의 구조

SELECT  (컬럼명, 혹은 *)  FROM  (테이블명);
  • 테이블의 모든 컬럼 검색 : SELECT * FROM (테이블명)
  • 테이블 종류 확인 : SELECT * FROM tab;
  • 특정 컬럼 검색 : SELECT a,b,c FROM alphabetDB;
  • 컬럼 구성 확인 : DESC alphabetDB;

SELECT문 내 산술식 사용

  • 산술식 사용 : 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의 이름은 배 지수입니다.
-- 리터럴 값('')과 연결 연산자(||)를 사용하여 문장처럼 이어서 출력 가능
  • 리터럴 값 : 컬럼 내용에 없는 문자(''), 숫자 등을 같이 출력
    SELECT절에 리터럴 값을 포함하면 해당 값을 담은 열 출력
  • NULL 값 확인 : SELECT한 결과값에 null 값이 있을 경우,
    SQL Developer 환경설정에 따라 빈 칸 혹은 (null)로 표현
  • 산술 연산에서의 NULL : 산술 연산에 null 값이 포함되면 결과도 null

날짜 연산 포멧 변경

ALTER SESSION SET nls_date_format = 'YYYY/MM/DD HH24:MI:SS';
ALTER SESSION SET nls_date_format = 'YYYY/MM/DD';

dual 테이블의 사용

: 함수에 대한 쓰임을 알고 싶을때 특정 테이블을 생성할 필요없이 dual 테이블을 이용하여 함수의 값을 리턴(return)받음
사용자가 함수(계산)를 실행할 때 임시로 사용하는데 적합

SELECT CURRENT_DATE FROM dual; 현재 날짜 출력
SELECT SYSDATE FROM dual; 현재 날짜 출력

TO_DATE()와 YY 포멧 주의사항

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) 안에 리터럴 값 입력


SELECT문 +a 조건

  • 컬럼 별칭(alias) : 본 컬럼명 별칭 또는 본 컬럼명 AS 별칭
    연산을 통해 새로 정의한 컬럼에도 별칭을 붙일 수 있음
  • 중복 행 제거 : SELECT DISTINCT ... FROM ...; 또는 SELECT UNIQUE ... FROM ...;
  • WHERE절 사용 : SELECT ... FROM ... WHERE (조건); 조건을 만족하는 값을 찾아서 출력

SELECT문 WHERE절 비교식

SELECT (컬럼명, 혹은 *) FROM (테이블명) WHERE (비교 조건);

: =(equal) 비교, 대소 비교, !=(not equal) 비교

  • 문자 =(equal) 비교 : WHERE city = 'Seoul'; ' '사용, 대소문자 구분
  • 날짜 =(equal) 비교 : WHERE birthday = '1997/12/02'; ' '사용 혹은 TO_DATE()로 변환
  • 대소비교 (숫자, 문자) : >, <, >=, <= 사용하여 대소 비교
  • 날짜 대소 비교 : WHERE birthday > '1997/12/02'; 생일이 1997/12/02 이후여야한다는 조건
  • 문자 대소 비교 : WHERE city > 'Seoul'; 사전식 배열에서 Seoul보다 뒤에 와야한다는 조건
  • !=(not equal) 비교 : =(equal) 비교와 동일한 방법으로 사용, <>도 동일한 의미

SELECT문 내 범위 검색

  • 숫자 범위 검색 : WHERE order_total BETWEEN 1000 AND 2000;
  • 날짜 범위 검색 : WHERE order_date BETWEEN '2021/01/01' AND '2021/07/05';
  • BETWEEN 범위 검색 주의사항 : BETWEEN A AND B 를 쓸 때
    A <= B여야 함, A = B이면 =(equal) 비교와 동일한 기능함
  • 범위 검색, AND 연산자 : 두 개 이상의 비교식을 AND로 연결하여 범위 검색 가능
  • 범위 검색, IN 연산자 : WHERE order_status IN (0, 8);
    =(equal) 비교 해야할 값이 여러 개 일 때,
    list를 만들고 list 안의 값을 가진 데이터를 출력 (숫자 ⭕, 문자 ⭕)
  • IN 연산자 대체 : WHERE country = 'USA' OR country = 'SPAIN';
    IN 연산자를 쓰지 않고 하나씩 풀어서 표현 가능, OR로 연결
    OR로 연결할 것이 너무 많을 때 IN 연산자 사용하면 됨



[ 복습 문제 풀이 ]

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

profile
사부작 사부작

0개의 댓글