SQL - DQL

크리스탈 파워~UP·2021년 3월 8일
0

이론정리

목록 보기
2/3

SQL이란?

관계형 데이터에서 데이터를 조회하거나 조작하기 위해 사용하는 표준검색언어

  • DQL(Data Query Language) 데어터 검색 : SELECT
  • DML(Data Manipulation Language) 데이터 조작 : INSERT, UPDATE, DELETE
  • DDL(Data Definition Language) 데이터 정의 : CREATE, DROP, ALTER
  • TCL(Transaction Control Language) 트랜잭션 처리 : COMMIT, ROLLBACK

데이터 베이스의 특징

  1. 실시간 접근성 : 사용자가 데이터 요청시 실시간으로 결과 서비스
  2. 계속적인 변환 : 데이터 값은 시간에 따라 항상 바뀜
  3. 동시 공유: 서로 다른 업무, 또는 여러 사용자에게 동시공유
  4. 내용에 따른 참조 : 데이터의 물리적 위치가 아닌 데이터 값에 따라 접근

DQL

1. SELECT 문

SELECT {*||[DISTINCT] column [as alias]||계산식||함수식||...}
FROM table_name
[WHERE 컬럼명 비교연산자 비교값]
[ORDER BY 정렬할 컬럼명 정렬방식];
  • DISTINCT : 중복 행 제거 옵션
  • * 또는 컬럼명 : 조회할 컬럼 범위 지정
    • *은 모든 컬럼조회
    • 컬럼명을 적을 경우 해당컬럼만 조회
  • alias : 컬럼에 별칭을 부여할 때 사용. as는 생략가능
  • table_name : 조회 대상 테이블 명
  • WHERE : 조건절로 비교한 결과에 일치하는 행만 검색
  • ORDER BY : 정렬순서를 정함.
    • DESC(내림차순)
    • ASC(오름차순, default로 생략 가능)

*구문에서 []는 생략 가능 구문, {}은 안의 내용중 하나는 입력해야 한다는 의미

✨SQL문 작성 유의 사항

  • SQL문장은 대소문자 구별을 하지 않는다
  • SQL문장은 한 줄 또는 여러 줄에 입력될 수 있다.
  • 일반적으로 키워드는 대문자로 입력한다.
  • 다른 모든 단어, 즉 테이블 이름, 열 이름은 소문자로 입력을 권장
  • 가장 최근 명령어 한개가 SQL buffer에 저장된다.
  • SQL문 마지막절에 ;를 기술하여 명령의 끝을 표시한다.

✨오라클 DATATYPE

  • 오라클에서 문자열저장은 VARCHAR2권장. 처음에 크기는 할당하지만 들어오는 값에 따라 유동적.
  • CHAR도 문자열 오라클에서는 문자는 없다. 무조건 문자열. 고정적인 저장공간. 처음에 크기는 할당시 그대로..
  • NUMBER는 숫자보관시 정수,실수 구분없이 다 NUMBER
  • DATE 날짜

1-1. 모든 컬럼 조회하는 SELECT문

SELECT *         -- select절 : 컬럼 선택
FROM 테이블이름;  -- from절 :  검색대상 테이블 선택
  • SQL문이 끝나면 마침표시 ;를 넣고 엔터를 입력해야 한다!
  • SQLDeveloper 툴에서의 실행 : F5 또는 Ctrl+Enter
  • SELECT 뒤에 *를 넣으면 선택된 테이블의 모든 컬럼을출력하라는 의미

1-2. 특정 컬럼 조회하는 SELECT문

SELECT 컬럼이름1, 컬럼이름2, 컬럼이름3,...
FROM 테이블이름;
  • select 문에 작성된 컬럼 순서대로 출력
  • 원하는 컬럼이 한개일 경우 한나만 쓰고, 여러 개일 경우에는 ,로 구분하여 원하는 컬럼명을 적어주면 된다.

1-3. 컬럼명에 별칭 붙이기(Alias)

  1. SELECT 컬럼명 별칭, 컬럼명2 별칭2 FROM 테이블이름;
  2. SELECT 컬럼명 AS 별칭, 컬럼명2 AS 별칭 FROM 테이블이름;
  3. SELECT 컬럼명 "별칭", 컬럼명2 "별칭" FROM 테이블이름;
  • 컬럼을 다른 이름으로 사용하고 싶을 때, 컬럼 뒤에 AS 별칭 혹은 AS 없이 별칭을 기록하면 그 해당되는 이름으로 조회결과가 출력된다.
  • 별칭에는 한글, 영어 모두 사용가능! 다만, 띄어쓰기가 있을 경우 반드시 ""(쌍따옴표)로 묶어야 함
  • 별칭은 DB에 저장되어 있는 컬럼명이 바뀌는 것이 아니고 SELECT문을 이용하여 결과를 조회할때만 원하는 컬럼명으로 보여지는 것이다.
  • 컬럼명을 완전히 바꾸려면 ALTER문을 이용

1-4. 테이블 관련 정보 확인 SQL문

1-4-1. TAB 테이블

TAB 테이블은 table의 약자로 접속한 계정이 소유하고 있는 테이블의 정보를 알려주는 딕셔너리.
데이터 딕셔너리는 Oracle 시스템에서 객체(테이블)에 대한 정보를 저장하는 곳. 테이블에 대한 컬럼, 도메인, 제약조건에 대한 메타 데이터를 저장.

- 계정 확인

show user;

- 계정이 소유하고 있는 테이블 확인

SELECT * FROM tab;

1-4-2. DESC(DESCRIBE)를 활용한 테이블 정보확인

DESC 테이블명;

DESC테이블에 대한 컬럼, 제약조건 등을 정보를 확인하는 명령어로 사용자 소유의 테이블 정보를 확인하기 위해 사용한다.

1-5. 중복 제거 DISTINCT

값이 중복되는 행을 한개씩만 선택하고자 할때 사용하는 키워드

SELECT DISTINCT 컬럼명, 컬럼명1, 컬럼명2
FROM 테이블명;

1-6. 컬럼값 계산하는 산술연산자

+,-,*,/가 있으며 컬럼 모두 자료형이 숫자형(NUBMER)이나 날짜형(DATE)이어야 한다. 날짜형은 +,- 만 사용 가능

SELECT 10+20 FROM DUAL; 

DUAL은 오라클이 제공하는 테스트용 기본 테이블 ,결과는 LOW로 나옴

1-7. 연결연산자 ||

select문 조회시에 컬럼 사이에 특정 문자를 넣고 싶을 때 사용하는 연산자

SELECT 컬럼명||'문자리터럴'||컬럼명
FROM 테이블명;

SIMSON의 급여는 500만원 입니다.

SELECT name||'의 급여는 '||sal||'만원 입니다.'
FROM emp;

2. WHERE 구문

데이터를 조회할 떄 사용자가 원하는 조건에 맞는 데이터만을 조회하고 싶을 떄 사용하는 구문

2-1. 기본 WHERE절

SELECT 컬럼명, 컬럼명1
FROM 테이블명
WHERE 컬럼이름 비교연산자 조건값;
  • SELECT문 FROM절 다음에 위치
  • WHERE절은 조건식을 표현하는데, 이 조건은 테이블에서 비교 또는, 논리연산을 통해 조건을 만들고 결과를 출력

2-2. 오라클 기본 연산자

2-2-1. 비교연산자

  • = : 같다
  • > : 크다
  • < : 작다
  • >= : 크거나 같다
  • <= : 작거나 같다
  • <>,!=,^= : 같지않다

✨ 숫자형 값을 비교할 떄는 비교연산자 뒤나 앞에 그냥 숫자만 적어주면 된다. 하지만 문자형이나 날짜형을 비교할때는 값에 ' '를 붙여줘야 한다. 날짜를 비교할 경우 날자 형식에 맞춰서 비교하여 값을 '년/월/일'로 넣어 주면 된다.

  • 입사일이 2000/01/01이후 입사한 사원의 이름,부서,직책,입사일 출력하기
SELECT emp_name, dept_code, job_code, hire_date
FROM employee
WHERE hire_date>='00-01-01'; 
  • 형식대로쓰면 자동형변환되기 떄문에 문자열도 대소비교 가능
  • '00-01-01' '00/01/01' '000101' '2000 01 01'은 가능,
    '00년 01월 01일'은 불가
  • 원래 형변환하는 법
SELECT emp_name, dept_code, job_code, hire_date
FROM employee
WHERE hire_date>=TO_DATE('20000101','YYYYMMDD');

2-2-2. 논리연산자

  • 조건A AND 조건B : 두 가지 조건이 모두 만족되도록 결과 조회 (교집합)
    월급이 300만원이상이고 부서가 'D5'인 사원의 사원명, 부서코드, 월급을 조회하세요
    SELECT emp_name, dept_code, salary
    FROM employee
    WHERE salary>=3000000 AND dept_code='D5';
  • 조건A OR 조건B : 두 가지 조건 중 하나라도 만족되도록 결과 조회 (합집합)
  • NOT 조건A : 조건을 만족하지 않도록 결과 조회 (여집합)

✨ WHERE절은 기본적으로 앞에서부터 순차적으로 논리연산 진행!
()를 이용하여 논리연산의 우선순우를 사용자가 지정할 수 있음.
()가 있으면 ()안에 있는 연산을 우선 실행

2-2-3. 기타연산자

BETWEEN 조건A AND 조건B, NOT BETWEEN a AND b 연산자

일정 범위를 조회할 떄 사용하는 연산자

  • BETWEEN 조건A AND 조건B : A와 B 사이의 데이터 출력(A,B포함)
  • NOT BETWEEN a AND b : a와 b사이에 있지 않은 데이터를 출력(a,b포함되지 않음)
SELECT * 
FROM student
WHERE birthday BETWEEN '2002/01/01' AND '2002/12/31';
IN (list), NOT IN (list) 연산자

비교할 값이 여러개일 경우 사용하는 비교 연산자. 컬럼 값과 비교할 대상이 여러개 일 경우 IN(비교값,비교값1,...)을 사용.
복수값을 제외하고 싶을 경우 NOT IN(비교값,비교값1,...)
예)

SELECT * 
FROM student 
WHERE class_name IN ('햇님반','달님반');
LIKE, NOT LIKE 연산자

문자열 값이 지정하는 문자열패턴을 만족하면 TURE를 리턴하여 선택하도록 하는 연산자
문자열패턴 지정을 위해 와일카드문자(%,_)를 사용한다.

  • % : 0개이상의 임의의 문자열을 의미
  • _ : 문자 1개를 의미
  • Escape Option: 와일드카드(%,_)문자를 기록값으로 가진 데이터에서 기록값과 와일드 카드를 구분하기 위해 사용.
SELECT student_name, student_age 
FROM student
WHERE student_name LIKE '고%'; --이름이 김으로 시작하는 학생찾기
WHERE student_name LIKE '%양%'; --이름에 '아'가 들어가는 학생찾기
WHERE student_name LIKE '%이'; --이름이 '아'로 끝나는 학생찾기
  • 사원번호 마지막 글자가 '%K'인 직원정보 조회하기
SELECT *
FROM emp
WHERE emp_no LIKE '%#%K' ESCAPE '#';

ESCAPE 예외처리 지정한 글자 뒤에 오는 거 무시해

IS NULL, IS NOT NULL 연산자

데이터 값은 NULL값을 가질 수 있는데 NULL값은 0이나 빈공간이 아니라 미확정(알수 없는 값)을 의미한다.
따라서 NULL값은 연산, 할당, 비교가 불가능하여 =연산자 사용이 불가
NULL값 여부 확인은 IS NULL, IN NOT NULL로 가능

  • IS NULL : NULL값을 가진 데이터를 출력
  • IS NOT NULL : NULL값을 갖지 않는 데이터를 출력
SELECT * FROM student
WHERE address IS NULL;

3. 정렬을 위한 ORDER BY절

ORDER BY은 특정 컬럼의 데이터를 중심으로 오름차순(ASC)이나 내림차순(DESC)으로 정렬하는 기능을 하는 절

SELECT 컬럼명,컬럼명1 FROM 테이블명
WHERE 컬럼이름 연산자 조건값
ORDER BY 컬럼명 정렬방식(ASC,DESC);
  • 오름차순 (ASC) -> 기본 default로 생략가능
    • 숫자 : 작은 값부터 정렬
    • 문자 : 사전 순서대로 정렬
    • 날짜 : 빠른 날짜 순서로 정렬
    • NULL : 가장 마지막에 나옴
  • 내림차순 (DESC)
    • 숫자 : 큰 값부터 정렬
    • 문자 : 사전 순서 반대로 정렬
    • 날짜 : 늦은 날짜 순서로 정렬
    • NULL : 가장 먼저 나옴
  • ORDER BY절에 ' , '로 구분하여 두 개 이상의 정렬 기준을 기입하는 경우, 첫번째 컬럼으로 먼저 정렬을 하고 중복된 값에 대해서는 두번째 컬럼을 기준으로 정렬
  • 컬럼별로 정렬을 다르게 하고 싶다면
   SELECT * FROM student
   ORDER BY stdent_class ASC, student_name DESC;
  • ORDER BY를 적용할 컬럼의 표현은 컬럼명, 컬럼병칭, 컬럼순번 총 3가지로 표현 가능
   SELECT * FROM student
   ORDER BY 6 ASC, 5 DESC;
  • NULLS LAST : 기본적으로 되어있는 정렬에 옵션을 주어 NULL의 순서를 바꿀수 있다.
    SELECT DEPT_CODE, SALARY, BONUS
    FROM EMPLOYEE
    ORDER BY BONUS DESC NULLS LAST; 

4. 데이터 그룹화 GROUP BY절

데이터들을 원하는 그룹으로 나눌때 사용.
그룹을 나누고자 하는 컬럼명을 GROUP BY절 뒤에 추가하여 사용한다.
컬럼의 중복값들 끼리만 집계를 할 수 있게 해줌. 그룹별로 중복값이 있어야 한다. 그룹은 유일한 값끼리 묶이면 안됨!

부서별 임금의 합계는

SELECT DEPT_CODE, SUM(SALARY)
FROM EMPLOYEE 
WHERE DEPT_CODE IS NOT NULL  
GROUP BY DEPT_CODE;
  • 리절트셋의 기준으로 그룹바이
  • NULL도 널끼리 그룹으로 묶임.

5. 그룹함수 데이터의 선별 HAVING절

그룹함수에 대한 조건을 설정할때 사용
HAVING의 위치는 GROUP BY바로 뒤에 들어감.

부서별 월급의 평균이 300만원보다 큰 부서는조회

SELECT DEPT_CODE, AVG(SALARY)
FROM EMPLOYEE
GROUP BY DEPT_CODE
HAVING AVG(SALARY)>=3000000; 

SELECT문 실행순서

  • SELECT 컬럼,컬럼....--5
  • FROM 테이블명 --1
  • [WHERE 조건식] --2
  • [GROUP BY 컬럼명...]--3
  • [HAVING 조건식]--4
  • [ORDER BY 컬럼]--6

출처 및 참고자료

  • KH정보교육원 SQL활용 수업자료
profile
코딩러너! 걷지말고 뛰어라~

0개의 댓글