DML이란?
Data Manipulation Language의 약자로 데이터베이스에서 데이터를 조작하는데 사용함.
SQL을 이용하여 데이터를 조회, 삽입, 수정, 삭제하기 위한 문법임.
조회
- 모든 열을 조회하기
SELECT *
FROM students;
- 특정 열을 조회하기
학생의 이름과 나이만 조회함
SELECT name, age
FROM students;
- 별칭을 사용하여 열 이름 변경
학생의 이름에 해당하는 열을 "col1"로, 나이에 해당하는 열을 "col2"로 변경함.
SELECT name AS col1, age AS col2
FROM students;
- 조건을 사용하여 데이터 필터
조건을 만족하는 행만 조회함
SELECT *
FROM students
WHERE age >= 30;
- 중복된 행 제거
SELECT DISTINCT address
FROM students;
삽입
테이블에 새로운 행(row)을 삽입할 때 INSERT INTO 문을 사용함.
- 한 행 삽입
INSERT INTO students (name, age, address)
VALUES ('김이박', 40, '서울특별시');
- name에는 '김이박', age에는 40, address에는 '서울특별시'를 삽입한다는 뜻!
여기서 name과 address는 문자열이 와야하므로 작은따옴표를 사용함. age는 숫자(정수)가 와야하기 때문에 작은 따옴표를 사용하지 않음.
- 한 행 삽입 + 특정 열만
INSERT INTO students (name, age)
VALUES ('신기루', 41);
- address열은 not null 속성이라는 가정하에 에러가 날 것임. not null 속성이 아니면 address에 NULL로 입력가능.
- 여러 행 삽입 (bulk insert)
students 테이블에 세 명의 학생 정보 삽입
INSERT INTO students (name, age, address)
VALUES ('학생1', 20, '경기도'), ('학생2', 22, '경기도'), ('학생3', 23, '경기도');
- 조회 후 삽입
테이블을 조회한 후 그 결과를 삽입할 수 있음.
INSERT INTO students (name, age, address)
SELECT name, age, address FROM students WHERE age < 30;
- age가 30미만인 학생들의 정보를 INSERT
수정
테이블에 새로운 행(row)을 수정할 때 사용함.
- 필드 한 개 수정
UPDATE students
SET age = 99
WHERE name = '이황';
- '이황'이라는 이름을 가진 학생의 나이를 99로 수정.
- 필드 여러 개 수정
UPDATE students
SET age = 10,
address = '서울특별시'
WHERE name = '정약용';
- '정약용'이라는 이름을 가진 학생의 나이를 10으로, 주소를 '서울특별시'로 수정.
- 조건부 수정
UPDATE students
SET address = '인천광역시'
WHERE age < 33;
- 나이가 33살 미만인 학생들의 주소를 '인천광역시'로 수정.
삭제
테이블의 행(row)을 삭제할 때 사용함.
- 특정 행 삭제
DELETE
FROM students
WHERE name = '이황';
- '이황'이라는 이름을 가진 학생을 삭제.
- 여러 행 삭제
DELETE
FROM students
WHERE age BETWEEN 30 AND 33;
- 나이가 30~33살 사이인 학생을 삭제.
- 모든 행 삭제
DELETE
FROM students;
- 테이블의 모든 데이터를 삭제.
내장 함수
함수 : 입력 값을 받아 계산(작업)을 수행하고 결과를 반환하는 구조
내장 함수 : DBMS 에서 기본적으로 제공하는 함수
- SUM : 숫자의 합을 반환함
SELECT SUM(age) FROM students;
- AVG : 숫자의 평균을 반환함
SELECT AVG(age) FROM students;
- MAX : 숫자의 최대값을 반환함
SELECT MAX(age) FROM students;
- MIN : 숫자의 최소값을 반환함
SELECT MIN(age) FROM students;
- COUNT : 행의 개수를 반환함
SELECT COUNT(DISTINCT address) FROM students;
- CONCAT : 두 문자열을 연결함
SELECT CONCAT(name, address) FROM students;
- LENGTH : 문자열의 길이를 반환함
SELECT address, LENGTH(address) FROM students;
- REPLACE : 특정 문자열을 다른 문자열로 치환함
SELECT REPLACE(address, '도', '레') FROM students;
- NOW : 현재의 날짜와 시간을 반환함
SELECT NOW();
-> ex) 결과 : 2024-02-22 14:25:24.043742+09
+) REPLACE, LENGTH 실습
SELECT address, age, REPLACE(address,'도','레'), LENGTH(address)
FROM students;
이때 LENGTH는 REPLACE 전의 기존 address 길이를 가져온다.
그룹화
같은 값을 가진 행끼리 하나의 그룹으로 뭉치는 기능
GROUP BY
SELECT 열, 집계함수
FROM 테이블
[WHERE 필터 조건]
GROUP BY 열
- GROUP BY 절은 FROM, WHERE 절 뒤에 위치함.
- GROUP BY 절에는 어떤 열을 기준으로 그룹화할 지 명시해야함.
- GROUP BY 절에 명시된 열은 SELECT 절에도 존재해야함.
- WHERE 절 실행 후에 GROUP BY가 실행됨.
HAVING
GROUP BY 절에 의해 생성된 그룹 중 원하는 조건에 부합하는 그룹만을 선택하는 구문
SELECT 열, 집계함수
FROM 테이블
[WHERE 필터 조건]
GROUP BY 열
HAVING 그룹 필터 조건
- 실행 순서 : WHERE -> GROUP BY -> HAVING
ORDER BY
특정 기준에 따라 정렬하는 구문
SELECT 열, 집계함수
FROM 테이블
[WHERE 필터 조건]
GROUP BY 열
HAVING 그룹 필터 조건
ORDER BY 열 [ASC | DESC]
- 실행 순서 : WHERE -> GROUP BY -> HAVING -> ORDER BY
- ORDER BY 절에는 어떤 열을 기준으로 정렬할 지 명시해야함.
- ORDER BY에 명시된 열은 SELECT 절에 존재하지 않아도 됨. (GROUP BY와의 차이점)
- 옵션 : ASC-오름차순(default), DESE-내림차순
LIMIT
결과의 개수를 제한함. ex) LIMIT 3 -> 3개의 행만 출력
ex)
SELECT *
FROM students
WHERE age BETWEEN 30 AND 35
ORDER BY age DESC
LIMIT 1;
테이블 여러 개를 한번에 조회하려면??
JOIN
JOIN을 하기 위해선 테이블을 연결하기 위한 key가 있어야됨.
- INNER JOIN
두 테이블을 연결할 때 가장 많이 사용함. 보통 JOIN은 INNER JOIN
SELECT *
FROM students AS A
INNER JOIN classes AS B
ON A.name = B.name;
- ON 구문에는 어떤 열을 기준으로 INNER JOIN을 수행할지 조건을 적어줌.
- FULL OUTER JOIN
두 테이블 중 한 곳에만 데이터가 있어도 결과가 나옴. 다만 데이터가 없는 부분은 NULL로 채워짐.
Daily Quiz
프로그래머스 SQL 5문제 풀기!
SQL이 너무 좋다..... 자바 하다가 SQL하니까 드디어 숨이 쉬어진다 ㅋㅋㅋㅋㅋㅋㅋㅋㅋ
자바야.. 좀만 기다려 너도 곧....!!!
'Back-End > DBMS' 카테고리의 다른 글
[DBMS] 데이터 모델링 (0) | 2024.03.22 |
---|---|
[DBMS] ALTER/DB Index/DCL/정규화 (1) | 2024.02.27 |
[DBMS] JOIN 실습/UNION/서브 쿼리/제약조건 (0) | 2024.02.26 |
[DBMS] 데이터베이스와 SQL (0) | 2024.02.21 |