DML에는 어떤 것들이 있을까?
데이터 조작어 (DML, Data Manipulation Language)
--
DML은
DB에 저장된 데이터를 조작(조회, 삽입, 수정, 삭제 등)하는 데 사용되는 SQL 명령어다.
DML 명령어 종류
- SELECT : 데이터 조회
- INSERT : 데이터 삽입
- UPDATE : 데이터 수정
- DELETE : 데이터 삭제
--
SELECT 문
--
SELECT문은
DB에서 원하는 데이터를 검색하고 조회할 때 사용하는 명령어로
특정 조건을 만족하는 행을 선택하여 원하는 정보를 검색할 수 있다.
SELECT문 기본 형식
SELECT [ALL | DISTINCT] <속성 이름(들)>
FROM <테이블 이름>
[WHERE <검색 조건(들)>]
[GROUP BY <속성 이름>]
[HAVING <검색 조건(들)>]
[ORDER BY <속성 이름 [ASC | DESC]>]
SELECT절
대상(FROM에서 지정한) 테이블에서 조회할 속성을 정의하는 파트다.
SELECT 작성 방법
- 모든 속성을 조회할 때에는 "*" 기호를 사용할 수 있다.
- 작성한 속성의 순서대로 테이블이 구성되어 조회된다.
- DISTINCT 옵션을 통해 중복된 데이터는 자동으로 제거된 후 조회된다.
(생략 시 중복 상관없이 모든 데이터를 조회하는 ALL 옵션으로 적용된다.) - "AS" 키워드를 통해 조회되는 속성에 별칭을 지정하여 조회 결과에 속성을 별칭으로 치환하여 반환할 수 있다.
(오직 조회된 결과에서만 별칭으로 반환하며, SELECT문 내에서는 원래 속성명으로 사용해야 한다.)
1. 한 개 이상의 속성을 정의할 수 있으며, 만약 모든 속성을 조회한다면 " * "기호로 대체하여 사용할 수도 있다.
(만약 2개 이상의 속성을 조회한다면 작성한 속성 순서에 따라 테이블이 구성되며 조회된다.)
SELECT bookname
FROM Book;
Book 테이블에서 bookname 속성의 데이터만 조회
SELECT bookname, price
FROM Book;
Book 테이블에서 bookname, price 속성의 데이터만 조회
SELECT *
FROM Book;
Book 테이블에서 모든 속성의 데이터를 조회
2. DISTINCT 옵션을 사용하면 조회 결과에 중복된 데이터를 제거되어 조회된다.
(옵션 생략 시 기본값 옵션인 ALL(중복 상관없이 모든 데이터) 옵션으로 적용된다.)
SELECT bookname AS 도서명, price AS 가격
FROM Book;
Book 테이블에서 bookname, price 속성의 데이터만 조회하는데
조회된 테이블에는 booname, price속성명이 "도서명", "가격"으로 조회된다.
FROM절
조회할 테이블 대상을 지정하는 파트다.
FROM 작성 방법
- "AS" 키워드를 통해 조회할 테이블에 별칭을 지정하여 SELECT문에서 해당 테이블을 별칭으로 작성할 수 있다.
(만약 테이블에 별칭을 정의했다면 SELECT문에서 해당 테이블을 지칭할 때 무조건 별칭으로만 사용해야 한다.) - 다수의 테이블을 합쳐 조회 대상 테이블로 지정할 수 있다.
(이러한 경우 WHERE절에서 어떠한 기준으로 합치는지 정의할 수 있다.) - 조인(join)을 통해 여러 테이블을 조합한 테이블을 조회할 대상 테이블로 지정할 수 있다.
1. "AS" 키워드를 통해 조회 대상 테이블에 별칭을 정의할 수 있다.
SELECT bookname
FROM Book AS 책리스트;
SELECT Book.bookname
FROM Book AS 책리스트;
// 불가 (Book에 정의한 별칭이 존재하면 별칭으로만 사용해야 한다.)
SELECT 책리스트.bookname
FROM Book AS 책리스트;
Book 테이블을 "책리스트"라는 별칭으로 지정하고 (Book == 책리스트)
해당 테이블에서 bookname 속성의 데이터만 조회한다.
2. 다수의 테이블을 WHERE절에 작성한 대로 합친 테이블을 대상으로 지정한다.
SELECT bookName, orderNumber
FROM Book, Order;
WHERE절 조건 없이 다수의 테이블을 결합하면
"카티전 프로덕트( X )" 연산을 수행한 테이블로 조회하게 된다.
예시로 Book의 행은 5개, Order의 행은 7로 구성된 테이블이라고 가정하면
위 코드로 조회할 때(조건 없이) 5 * 7개의 행으로 구성된 테이블을 조회하게 된다.
SELECT bookName, orderNumber
FROM Book, Order
WHERE Book.bookId = Order.bookId;
Book테이블과 Order테이블을 서로 bookId 속성을 기준으로 합친 테이블을 대상으로
bookName, orderNumber 속성의 데이터만 조회한다.
(JOIN절은 사용하지 않고 테이블을 합치는 경우 이를 "암시적 조인"이라고 부른다.)
SELECT bookName, userName, orderNumber
FROM Book, Order, User
WHERE Book.bookId = Order.bookId AND Order.userId = User.userId;
Book테이블과 Order테이블, User테이블이 WHERE절에 작성한 기준으로 합친 테이블을 대상으로
bookName, userName, orderNumber 속성의 데이터만 조회한다.
3. 조인을 사용하여 테이블 합치기
SELECT A.name, B.bId
FROM A JOIN B ON A.pay > 3000;
위 코드는 세타조인이다.
(비교 연산자 조건에 맞는 값들로만 조인)
A테이블과 B테이블을 조인(합치기)을 하는데
A.pay의 값이 3000초과된 것들만 조인을 한다.
SELECT A.name, B.bId
FROM A JOIN B ON A.testId = B.testId;
// A.aaId = B.bbId 처럼 다른 속성도 가능
위 코드는 동등조인이다.
('=' 연산자를 사용하여 같은 조건이 맞는 값들로만 조인)
A테이블과 B테이블을 조인(합치기)를 하는데
A.testId와 B.testId가 같은 것들만 조인을 한다.
SELECT A.name, B.bId
FROM A NATURAL JOIN B;
위 코드는 자연조인이다.
(두 테이블 간에 같은 이름의 속성(열)을 기준으로 자동으로 조인)
(동등조인에서 같은 속성으로 조인한 것과 동일)
(외래키로 참조한 것과 상관없이 속성명이 동일하기만 하면 된다.)
A테이블과 B테이블을 조인(합치기)를 하는데
두 테이블 간에 서로 같은 속성이 존재하면 해상 속성의 데이터가 같은 값들만 조인을 한다.
(동일한 속성이 없는 경우 "카티전 프로덕트"처럼 데카르트 곱으로 조인한다.)
(동일한 속성이 2개 이상인 경우 속성을 묶어 모두 동일한 데이터가 같은 값들만 조인한다.)
SELECT A.aId, A.name
FROM A
WHERE EXISTS (
SELECT *
FROM B
WHERE A.testId = B.testId
);
위 코드는 세미조인이다.
(두 테이블 간에 특정 속성에 일치한 값이 있는 확인 후 일치한 값을 가진 데이터만 뽑아낸다.)
(즉, 자연 조인 후, 왼쪽(Left세미조인) 테이블 값 or 오른쪽(Right세미조인) 테이블 값을 제거한 결과와 동일)
(보존되는 기준 테이블은 A테이블의 위치다.)
(즉, 무조건 Left세미조인처럼 구현되므로 Right세미조인을 원하면 A, B데이블의 위치를 변경해 주면 된다.)
(세미조인 같은 경우 일반적으로 EXISTS(중첩쿼리), IN(중첩쿼리)를 통해 구현된다.)
A테이블에서 B테이블과 동일한 testId속성을 가진 데이터만 뽑아낸다.
SELECT A.name, B.bId
FROM A LEFT OUTER JOIN B ON A.testId = B.testId;
// LEFT OUTER JOIN 을 줄여서 LEFT JOIN이라고도 사용가능
// LEFT OUTER JOIN
// RIGHT OUTER JOIN
// FULL OUTER JOIN
위 코드는 외부조인이다.
(조인조건(ON)에 '=' 연산자 외에도 다른 연산자 사용가능)
A와 B테이블을 조인조건에 알맞은 조인을 수행하고 나서
A테이블에서 조인에 포함되지 않은 데이터(행)가 있다면
이를 추가하고 B테이블의 데이터는 NULL로 대체한다.
SELECT A.name, B.bId
FROM A INNER JOIN B ON A.testId = B.testId;
// 조건에 =, >, < 등 모두 사용 가능
위 조인은 이너조인이다.
(이너조인은 교집합처럼 일반적으로 '=' 연산자로 조건을 사용하지만 무조건 '='만 사용할 수 있는 것은 아니다.)
(이너조인과 세타조인은 비슷하다고 볼 수 있다.)
두 테이블이 testId속성이 같은 데이터(행)만 결과로 나타낸다.
SELECT A.name, B.bId
FROM A CROSS JOIN B;
위 조인은 크로스조인이다.
해당 조인은 "데카르트 곱"을 수행하여 모든 경우의 수의 조합 테이블을 나타낸다.
"카티전 프로덕트"와 같은 결과를 나타낸다.
WHERE절
조회할 때 특정 조건에 맞는 데이터들만 조회하기 위해 조건을 정의하는 파트다.
조건 종류
LIKE 연산자 패턴 종류 (와일드 문자 종류)
FROM절에서 대상 테이블이 하나라면
기본적으로 속성명만 사용하면 된다.
SELECT *
FROM Book
WHERE price > 1000
다만 대상이 두 개이상이라면
일반적으로 어떠한 속성을 가리키는지 알아야 하므로 "테이블명.속성명"형식으로 지정해줘야 한다.
SELECT Book.bookId, Book.bookName, Order.orderId
FROM Book, Order
WHERE Book.bookId = Order.bookId AND Book.price > 1000
(만약 중복된 속성이 없다면 테이블명을 평상시처럼 생략할 수 있다.)
ORDER BY절
조회 시 특정 속성을 "오름차순" or "내림차순"으로 반환할지 정의하는 파트다.
ORDER BY 옵션
- ASC(기본값) : 오름차순
- DESC : 내림차순
1. 두 개 이상의 속성을 정렬하는 경우 순차적으로 정렬을 정의하게 된다.
SELECT *
FROM Book
ORDER BY price DESC, publisher ASC;
// ASC 생략 가능 = price DESC, publisher;
우선 price 속성의 데이터들을 내림차순으로 정렬 후
price의 내림차순에 영향이 없게끔 publisher속성의 데이터들을 오름차순으로 정렬한다.
즉, price를 내림차순 후 만약 price의 중복된 값이 존재하면 중복된 값 범위에 안에서 publisher를 오름차순 한다.
집계 함수
데이터의 집합에 대해 특정 계산을 수행하고 해당 단일 값을 따로 속성으로 추가하여 반환하는 함수다.
즉, SELECT절에 특정 데이터들의 집합에 대한 계산을 수행 후 반환할 값을 정의한다.
(집계 함수는 주로 GROUP BY절과 함께 사용된다.)
집계 함수 종류
- SUM(속성명) : 해당 속성의 모든 데이터를 더한 값
- AVG(속성명) : 해당 속성의 모든 데이터의 평균값
- MIN(속성명) : 해당 속성의 모든 데이터 중에 가장 작은 값
- MAX(속성명) : 해당 속성의 모든 데이터 중에 가장 큰 값
- COUNT(속성명) : 해당 속성의 모든 데이터의 개수
- GROUP_CONCAT(속성명) : 해당 속성의 모든 데이터(문자열)를 합친 데이터(문자열)
COUNT() 집계 함수에서
일반적인 COUNT(속성명)은 NULL이 아닌 데이터의 개수를 반환하지만
COUNT(*)인 경우에는 NULL도 포함한다.
집계 함수 작성 방법
- (속성명)은 하나만 작성이 가능하다.
- COUNT() 집계 함수에서는 일반적으로 NULL값은 제외하지만 COUNT(*)는 NULL도 포함한 개수를 반환한다.
( * 는 COUNT() 집계 함수에서만 사용할 수 있다.) - 결과 테이블에 보이는 집계 함수의 속성명은 집계함수 그대로 나오므로, 일반적으로 AS를 사용하여 별칭을 지어준다.
- DISTINCT옵션을 통해 중복된 데이터는 제거한 뒤에 계산을 수행한다.
1. 집계 함수로 계산할 속성은 하나만 정의할 수 있다.
SELECT SUM(price)
FROM Book;
Book테이블에 존재하는 price 속성에 담긴 모든 데이터 값의 합을 반환한다.
SELECT SUM(price, grade)
FROM Book;
// 2개 이상의 속성사용 불가능
SELECT SUM(price), COUNT(bookName)
FROM Book;
하나의 집계 함수에 여러 속성을 정의할 수 없으며, 정의하고 싶다면 나눠서 작성해야 한다.
2. 집계 함수를 사용하여 반환되는 속성이름은 집계 함수의 내용과 동일하므로 AS를 통해 별칭을 작성하는 것이 일반적
SELECT SUM(price) AS 총가격, COUNT(bookName) "권수", COUNT(bookId) 궈언수
FROM Book;
집계 함수에는 별칭을 지정할 때 "AS"를 생략할 수 있다.
만약 생략한다면 ""(큰따옴표)도 생략이 가능하다.
3. DISTINCT옵션을 사용하여 해당 속성에서 중복된 데이터는 미리 제거 후 계산을 수행한다.
SELECT SUM(DISTINCT price)
FROM Book;
GROUP BY절
데이터베이스에 특정 속성(열)을 기준으로 같은 값끼리 묶어서 그룹화를 하는 것으로 그룹화할 속성(열)을 지정한다.
GROUP BY 작성 방법
- SELECT절에는 GROUP BY에 명시한 속성 or 집계 함수만 조회할 수 있다.
1. Order 테이블에서 userId 속성을 기준으로 그룹화한다.
SELECT userId, COUNT(*) AS 구매도서수량, SUM(price) AS 총금액
FROM Orders
GROUP BY userId;
HAVING절
GROUP BY절의 결과에서 조건에 만족하는 데이터만 조회한다.
마치 FROM절에 정의한 테이블에서 WHERE절의 조건에 알맞은 데이터만 조회하는 것과 비슷한 느낌이다.
HAVING절 작성 방법
- GROUP BY와 함께 사용되어야 한다.
- 조건은 집계 함수 or 그룹화된 속성(열)을 기준으로 지정할 수 있다.
1. 총 구매 금액이 50000원 이상인 데이터 조회
SELECT userId, COUNT(*) AS 구매도서수량, SUM(price) AS 총금액
FROM Orders
GROUP BY userId
HAVING SUM(price) >= 50000;
SELECT문 실행 순서
--
INSERT문
--
INSERT문은
기존 테이블에 새로운 튜플(행)을 삽입하는 명령어다.
INSERT문 기본 형식
INSERT INTO 테이블명[(속성명 리스트)]
VALUE (각 속성에 해당하는 값들) [, (각 속성에 해당하는 값들), ...];
이때 테이블의 속성명 리스트는 생략할 수 있다.
단, VALUE에 작성하는 값들의 입력 순서가 일치해야 한다.
(속성명 리스트를 생략하면 해당 테이블의 모든 속성 리스트가 암시적으로 작성된 것과 같다.)
속성명 리스트를 작성할 때
기존 속성명 리스트의 순서와 다르게 작성 가능하다.
속성명 리스트를 작성할 때
일부 속성명만 작성할 수도 있다.
다만 이러한 경우 나머지 속성의 값은 NULL을 가진다.
INSERT문 예시 코드
INSERT INTO Book(bookId, bookName, price) VALUES (11, '자바에서 살아남기', '자바코리아', 15000);
INSERT INTO Book VALUES (11, '자바에서 살아남기', '자바코리아', 15000);
INSERT INTO Book(bookId, bookName) VALUES (11, '자바에서 살아남기', '자바코리아');
// price는 NULL값
--
UPDATE문
--
UPDATE문은
테이블에서 특정 속성의 값을 수정하는 명령어다.
UPDATE문 기본 형식
UPDATE 테이블명
SET 속성명 = 변경할 값 [, 속성명2 = 변경할 값2, ...]
[WHERE <검색조건>];
UPDATE문 예시 코드
UPDATE Members
SET Address = '대한민국 대전'
WHERE memberId = 5;
--
DELETE문
--
DELETE문은
테이블에서 기존에 존재하는 튜플(행)을 삭제하는 명령어다.
DELETE문 기본 형식
DELTE FROM 테이블명
[WHERE 검색 조건];
WHERE절을 생략하면
해당 테이블의 모든 튜플(행)이 삭제되고 빈 테이블이 된다.
DELETE문 예시 코드
DELETE FROM Members
WHERE memberid = 5;
DELETE FROM Members;
--
'SQL [DB]' 카테고리의 다른 글
[SQL문] 트랜잭션 제어어 (TCL) (0) | 2024.09.14 |
---|---|
[SQL문] 데이터 제어어 (DCL) (0) | 2024.09.13 |
[SQL문] 데이터 정의어 (DDL) (0) | 2024.09.12 |
관계 데이터 모델의 개념 (릴레이션, 무결성, 관계대수) (0) | 2024.09.10 |
데이터베이스 시스템의 구성 (0) | 2024.09.10 |