It's going to be one day 🍀

안녕하세요! 매일 매일 공부하려고 노력하는 백엔드 개발자 지망생의 공부 흔적입니다.

Back-End/DBMS

[DBMS] DML/내장함수/그룹화, 정렬/JOIN 기본

2jin2 2024. 2. 22. 16:45

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;

출력 결과 : address, age, replace한 text, length

이때 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문제 풀기!

https://github.com/drinkgalaxy/coding-practice/tree/main/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4

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