ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 데이터베이스 기초(쿼리 위주)
    database 2021. 3. 16. 13:50

    SQL

    - DML : 데이터를 다루는 가장 기본적이고 자주 사용하는 쿼리

    - DDL : 데이터를 정의하는 테이블을 관리하는 쿼리

    - DCL : 트랜젝션과 같은 데이터를 제어하는 쿼리

     

    주요특징

    - 예약어와 데이터베이스 객체명은 대소문자를 구분하지 않는다

     

    DESC

    테이블 정보 확인하기

     

     

    CHAR VS VARCAHR

    CHAR(NUM)은 고정길이 문자열로 데이터 저장 시 NUM만큼 반드시 메모리가 할당된다.

    반면 VARCHAR(NUM)은 가변길이 문자열로 데이터 저장 시 저장한 만큼만 메모리가 할당되어 저장한다.

    괄호 안의 NUM은 최대 길이다.

     

     

    조건 검색(WHERE)

    - 열 조건 : SELECT CNAME1, CNAME2 ...

    - 행 조건 : WHRER ID = ...

    - 문자열 리터럴은 ''으로 감싸서 표기한다

    - 날짜에서 연월일은 하이픈으로, 시분초는 콜론으로 구분지은 뒤 ''으로 감싸서 표기한다

    - NULL 검색은 IS NULL 또는 IS NOT NULL을 활용한다

    - 복수의 조건으로 검색할 때는 AND 또는 OR를 활용하고 괄호를 이용하여 우선순위를 정한다

    - NOT을 이용하면 단항식을 조건식으로 유용하게 사용할 수 있다

    - 문자열 패턴매칭을 할 때는 LIKE 명령어가 있고 와일드카드로 %(문자열)과 _(문자)가 있다.

    - %은 빈문자열도 맞는 패턴으로 인식하지만 _은 빈문자열과는 매칭하지 않는다.

    - 매칭에서 '%'자체가 있는지 확인하고 싶으면 \을 붙인다.

     

     

    정렬(ORDER BY)

    - WHERE ... ORDER BY COLUMN NAME (기본 오름차순)

    - ORDER BY COLUMN NAME DESC(내림차순 정렬)

    - 날짜형도 숫자크기로 대소관계를 판별

    - 문자열은 사전식으로 정렬되고, 문자열 길이는 정렬에서 고려하지 않는다.

    - ORDER BY 순서에 맞게 복수의 정렬 기준을 정할 수 있다

    - NULL은 DB마다 정렬 기준이 다르며 MYSQL은 가장 작은 값으로 간주한다.

     

     

    제한(LIMIT)

    - LIMIT로 가져올 결과 행 개수를 정한다

    - OFFSET로 가져올 결과 행 시작 행을 지정한다(배열과 같게 생각)

    - LIMIT는 모든 결과 조회 후 짜르는 시스템인 반면 WHERE는 경우에 따라 타겟 레코드만 조회하도록 설계된다

     

     

    산술식

    - 수치연산을 이용해 결과열을 추가할 수 있다.

    - AS를 이용하면 결과열에 별칭을 넣어 결과를 반환받을 수 있다.(AS는 생략 가능)

    - 에일리어스를 한글로 사용하는 경우 ''로 감싸준다.

    - 예약어는 ""로 감싸주면 에일리어스로 사용할 수 있다.

    - WHERE 구 처리 후 SELECT이 실행되는데 이때 에일리어스가 적용된다. 즉, WHERE에서는 에일리어스 이용 X

    - ORDER BY 는 SELECT 후 실행되므로 에일리어스 활용이 가능타

    - ROUND(NUM, OFFSET) : 소수점 OFFSET자리에서 반올림, 없으면 첫째자리에서 반올림하여 정수로 만든다.

    - ROUNT에서 OFFSET에 음수를 주면 정수단위로 반올림한다.(예 ROUNT(125, -1) => 126)

     

     

    문자열 연산

    - A + || CONCAT B => AB

    - SUBSTRING('문자열', OFFSET, COUNT)

    - TRIM : 문자열에서 앞뒤로 넣어진 공백을 제거, CHAR(10)과 연계해서 자주 사용

    - CHAR_LENGTH : 문자열 길이 계산 VARCHAR와 찰떡궁합

     

     

    날짜 연산

    - 날짜시간 데이터는 숫자처럼 사칙연산이 가능하다.

    - CURRENT_TIMESTAMP : 현재시각 ( YYYY-MM-DD HH:MM:SS)

    - 두 날짜의 차 : DATEDIFF('DATE1', 'DATE2')

     

    CASE문으로 데이터 변환

    CASE 

      WHEN A1 THEN B1

      WHEN A2 THEN B2

      ELSE B3

    END

     

    - COALESCE(COLUMN, 'VALEU') : NULL인 경우 VALUE로 지정해주는 함수

    - CASE는 어느 구문에서도 사용 가능하다(간단한 익명치환함수 정도로 생각하면 될 것 같다)

     

     

    집계함수

    집계함수를 이용하면 하나의 행을 반환한다

    - COUNT : 지정한 칼럼의 개수를 반환(NULL의 개수는 집계하지 않는다)

    - SUM, AVG, MIN, MAX  참고로 AVG는 소수점까지 표기한 결과 반환

     

     

    GROUP BY

    그룹화를 이용하면 집계함수를 유용하게 사용할 수 있다.

     

    - 처리순서 : WHERE -> GROUP BY -> HAVING -> SELECT -> ORDER BY

    WHERE로 전체에서 1차 필터링, 열 그루핑, 그루핑한 새 그룹에서 HAVING필터링, 셀렉 후 정렬

    - 그루핑의 기준이 되는 열 이외의 열은 최종 SELECT에서 집계함수 없이 쓰일 수 없다->생각해보면 당연

     

     

    서브쿼리 조합

    - EXISTS (SUB QUERY) : 서브쿼리 내에 값이 존재하면 TRUE 아니면 FASLE;

    - NOT EXISTS 

    - IN과 EXISTS의 차이를 설명할 수 있는가?

    IN절은 서브쿼리를 먼저 수행한 뒤 메인 쿼리를 수행하기 때문에 메인쿼리의 칼럼을 서브쿼리와 함께 사용할 수 없다.

    반면 EXISTS는 메인쿼리의 칼럼을 서브쿼리의 WHERE에 넣을 수 있어 좀 더 최적화한 비교가 가능하다.

    간단한 집합 연산에서 IN절이 직관적이니 결과 칼럼수가 적으면 IN 사용

     

    인덱스

    주 역할 : 검색 속도 향상

     

     

    집합 연산

    - UNION : 칼럼의 자료형이 같다면 연산을 수행할 수 있고 별칭을 이용해 이름을 통일한 뒤 ORDER BY를 적용

     

     

    테이블 결합

    - 카티전곱 : FULL OUTER JOIN으로 이해 FROM TABLE_A, TABLE_B 이런 식으로 사용

    - (INNER) JOIN : ON 조건에 맞는 두 테이블의 합만 반환

    - LEFT OUTER JOIN : ON 조건에 맞지 않더라도 FROM절의 칼럼은 유지하고 나머지 필드에 NULL을 채움

    - RIGHT OUTER JOIN : JOIN절 칼럼을 유지하고 나머지는 NULL로 채움

     

    'database' 카테고리의 다른 글

    JDBC Timout 이해하기  (0) 2021.05.31
    트랜잭션과 트랜잭션 격리수준  (0) 2021.02.23
    RDBMS 아키텍처(MySQL)  (0) 2021.02.19

    댓글

Designed by Tistory.