[DB][SQL][국비교육] Day 21

Ga02·2023년 1월 26일

국비교육

목록 보기
20/82

🔍 SELECT 구문 - DML, DQL (Data Query Language)

💡 반드시 FROM 절이 뒤따라와야함
테이블에 저장된 데이터를 조회할 때 사용하는 명령어

✔ 구문형식

SELECT * --2. 결과로 생성할 컬럼을 지정 / * : 모든 컬럼
FROM emp; --1. 조회할 테이블을 확인

SELECT empno, ename 👉🏻 조회할 컬럼을 하나씩 지정
FROM emp; 
  • FROM 먼저 실행 후 SELECT 실행
    👉🏻 테이블의 모든 데이터를 다 꺼낸 후 결과로 볼 컬럼 정하기

SQL은 대소문자 구분 없음 👉🏻 관념적으로 나눠서 작성

  • 대문자 : 문법요소, 키워드
  • 소문자 : 식별자, 변수이름, 테이블이름 ...

🔍 FROM절

조회하려는 대상을 지정하는 절 👉🏻 테이블(table)이 일반적

  • 뷰, view 객체
  • 인라인뷰, inline view 구문(서브쿼리)

🔍 SELECT 구문에서의 Alias, 별칭

조회하려는 컬럼명, 테이블명 등의 이름(식별자)에 별칭을 붙여서 구문을 작성

  • 별칭으로 한글, 영어, 숫자 전부 사용 가능 but, 웬만하면 영어로 구성하는 것이 좋음
  • 지정할 때 DDL을 사용 👉🏻 자료사전에 대문자로 저장되어있을 것
    ➡ 자료사전 내에 있는 데이터를 검색할 때 대문자로 해야함
    ✔ 테이블 데이터 내에 있는 내용은 대소문자 구분 👉🏻 조회시 대소문자 구분 필요
  • 별칭은 ""큰 따옴표로 묶어도 되고 없어도 되지만, 숫자나 기호, 띄어쓰기가 있으면 ""로 묶어서 표현해야 함
  • 컬럼에는 AS 키워드를 붙이고 별칭을 적거나, AS 없이 바로 옆에 적어서 적용(생략가능)
  • 테이블에는 AS 키워드 없이 바로 옆에 적어서 적용(생략)
SELECET 
	E.empno eno
    , ename AS 사원이름
    , sal AS "123"
    , deptno "부서 번호"
FROM emp E;

🔍 WHERE절

조건에 만족하는 데이터(행)만 조회되거나 처리될 수 있도록 설정 👉🏻 조건절 역할

  • SELECT, UPDATE, DELETE 구문에서 주로 사용됨

➰ 비교(관계) 연산자

  • = 같다
  • != <> ^= 같지 않다
  • < 작다
  • > 크다
  • <= 작거나 같다
  • >= 크거나 같다
--  sal(급여)가 2000 미만인 사원들 조회
SELECT * FROM emp
WHERE sal < 2000;

--  직무(job)가 SALESMAN인 사원들 조회
SELECT * FROM emp
WHERE job = 'SALESMAN';

➰ 논리 연산자

  • AND 두 조건이 모두 만족할 때 TRUE
  • OR 두 조건 중 하나라도 만족할 때 TRUE
  • NOT 논리부정
--  급여(sal)가 2500을 초과하며 직무(job)가 관리자(MANAGER)가 아닌 사원
SELECT * FROM emp
WHERE sal > 2500
--    AND job != 'MANAGER';
--    AND job ^= 'MANAGER';
--    AND job <> 'MANAGER';
    AND NOT(job = 'MANAGER');

➰ 기타 연산자

  • BETWEEN a AND b
    비교가능한 값 a와 b 사이의 데이터 조회(a, b 포함) 👉🏻 문자도 비교 가능(ASCII CODE)
    • ❗ 부정문 NOT BETWEEN a AND b
--  사원번호(empno)가 7700~7900인 사원들 조회
SELECT empno, ename FROM emp
WHERE empno BETWEEN 7700 AND 7900;

--  사원이름(ename)이 'ALLEN' ~ 'KING'사이인 사원들 조회
SELECT empno, ename FROM emp
WHERE ename BETWEEN 'ALLEN' and 'KING';

--  사원번호(empno)가 7700~7900이 아닌 사원들 조회
SELECT empno, ename FROM emp
WHERE empno NOT BETWEEN 7700 AND 7900;
  • IN (datalist)
    datalist는 ,콤마로 구분하여 여러개의 데이터 가능 👉🏻 일치하는 행이 없으면 출력을 안할 뿐 에러가 나진 않음
    • ❗ 부정문 NOT IN (datalist)
--사원번호가 ( )인 사원들 조회
SELECT empno, ename FROM emp
WHERE empno IN (7521, 7654, 7839, 8123, 6875);

--사원번호가 ( )이 아닌 사원들 조회
SELECT empno, ename FROM emp
WHERE empno NOT IN (7521, 7654, 7839, 8123, 6875);
  • LIKE '비교문자'
    비교문자에 서식문자를 추가하여 지정된 형식에 맞는 문자를 조회
    • % : 여러개의 문자, 문자가 없는 경우를 포함
    • _ : 단일 문자, 반드시 한 글자가 존재하는 경우
    • ❗ 부정문 NOT LIKE '비교문자'
SELECT empno, ename FROM emp
--WHERE ename LIKE 'SMITH';       --이름이 SMITH인 사람
--WHERE ename LIKE '%R';          --이름이 R로 끝나는 사람
--WHERE ename LIKE '%R%';         --이름에 R이 포함되는 사람
--WHERE ename LIKE '_';           --이름이 한글자인 사람
--WHERE ename LIKE '_A';          --이름이 두글자이면서 A로 끝나는 사람
--WHERE ename LIKE '_A%';         --이름의 두번째글자가 A인 사람
WHERE ename LIKE '%RD';         --이름의 RD로 끝나는 사람

SELECT empno, ename FROM emp
WHERE ename NOT LIKE '%RD';     --이름이 RD로 끝나지 않는 사람

✔ ESCAPE
LIKE에서 서식문자로 사용되는 _나 %를 단순문자로 취급할 수 있도록 ESCAPE 문자를 지정한 후 ESCAPE해줌

SELECT empno, ename
FROM emp
--WHERE ename LIKE '%/_%' ESCAPE '/';     -- /를 ESCAPE 문자로 사용
WHERE ename LIKE '%@_%' ESCAPE '@';     -- @를 ESCAPE 문자로 사용

✔ IN과 LIKE를 함께 사용할 수 없음 👉🏻 문법에러로 조회되지 않음 / 논리연산자를 사용할 것

SELECT empno, ename FROM emp
WHERE ename LIKE ( IN ('%R%', '%L%'));
			👇🏻
SELECT empno, ename FROM emp
WHERE ename LIKE '%R%'
    OR ename LIKE '%L%';
  • IS NULL
    컬럼의 값이 NULL인지 검사하는 연산자
    • 테이블의 데이터 중 (NULL)은 데이터가 없음을 나타냄 👉🏻 아무것도 없는 빈칸과 같음
    • 비교연산자(=)를 이용해서 NULL 키워드와 (NULL) 항목을 비교하면 아예 연산에 참여하지 않으므로(아무것도 조회되지 않음) IS NULL 연산자로 비교해야 함
    • ❗ 부정문 IS NOT NULL
SELECT * FROM emp
--WHERE comm IS NULL;
WHERE mgr IS NULL;

SELECT empno, ename, job, comm FROM emp
WHERE comm IS NOT NULL;

🔍 DB 탐색(조회) 방법, DB Scan

➰ 전체 탐색, Full Scan

테이블의 처음부터 끝까지 전부 확인하며 원하는 데이터를 찾아내는 방법 👉🏻 시간이 오래걸림

  • DB성능을 높이려면 풀스캔되는 상황을 줄여야하므로 프로그램을 작성할 때 풀스캔을 피하도록 작성
    ➡ 불필요한 컬럼들 가져오는거 줄이기 / * 쓰는거 자제하기

➰ 인덱스 탐색, Index Scan

인덱스 탐색은 인덱스를 우선적으로 확인하고 인덱스에 연결된 데이터를 빠르게 찾을 수 있도록 하는 방법 👉🏻 인덱스 탐색에 실패하면 풀탐색

  • 인덱스, Index : 테이블의 데이터를 빠르게 탐색할 수 있도록 도와주는 DB객체 ➡ 바이너리 트리셋이랑 연결되면 빨리 찾을 수 잇음
    • 테이블 공간과 분리된 별도의 공간을 만들어서 테이블의 대표 컬럼만 따로 저장
    • 추출된 테이블의 대표 데이터에 원본 테이블의 데이터행을 연결하는 위치를 기록해둠
      👉🏻 따로 공간이 필요, 시간이 많이 소요되므로 미리미리 해두기

➰ LIKE 연산자와 =연산자 차이

  • LIKE 연산자는 FULL SCAN만 수행
SELECT * FROM emp
WHERE ename LIKE 'FORD';
  • =연산자는 INDEX SCAN 후 FULL SCAN 수행
SELECT * FROM emp
WHERE ename = 'FORD';

💡 =연산자를 사용하는 것이 더 좋음

profile
IT꿈나무 댓츠미

0개의 댓글