-
데이터베이스 기초(쿼리 위주)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