SQL_

[SQL] Table 속에 저장된 데이터를 출력하고 수정하기

Joyfullyever 2025. 2. 13. 20:11

본 글에서 사용할 Table & Datas

 

#1 원하는 형태로 정보를 출력

Ex 1)

Buy Table에서 Customer 이름 중 "홍 ㅇ 동" 과 같은 으로 출력이 가능한가?

: Table에 저장된 데이터의 값을 바꾸는게 아니라, 단순 출력만 위에서 원하는 형태로 출력해야 하기 때문에,

를 사용하여 값을 변경하는게 아니라, SELECT를 사용하여 원하는 형태로 출력이 가능

SELECT INSERT(Customer,2,1,'O') AS Customer FROM BUY;

// SELECT를 사용하여 출력할 컬럼을 선택

INSERT를 사용하여 선택된 컬럼에 있는 값에 집어넣음

INSERT함수 = INSERT(문자열, 시작위치, 길이, '삽입할 문자');
위와 같이 입력을 하게 되면 문자열에서 시작위치~ 길이만큼의 문자를 지우고, 삽입할 문자를 해당 위치에 삽입

이름 중간의 값 변경

: Customer들의 이름에서 2번째 자리부터 1자리를 지우는 값을 집어넣고, 'O' 를 삽입할 문자에 넣어 값을 변경

 

Ex 2)

Product Table에서 Price가 40,000 이상인 데이터만 [상품명(할인상품)]과 같은 형식으로 출력이 가능한가?

: Ex 1)과 마찬가지로 데이터의 값을 변경하는 것은 아니기에 SELECT를 사용함

SELECT IF(PRICE>=40000, concat(name,'(할인상품)'),name) FROM PRODUCT;

IF를 사용하여, 값이 다르게 출력되게 설정

IF함수 = (조건식,참,거짓);
조건식의 값에 따라 참의 값을 출력하거나, 거짓의 값을 출력

CONCAT함수 = (문자열1, 문자열2);
입력한 2개의 문자열을 연결해주는 함수

설정된 이름 뒤에 추가 문자열 추가

: 만약 이름과 같은 레코드에 있는 Price의 값이 40000 이상이라면,

CONCAT함수를 통해 이름+(할인상품) 으로 출력, 거짓이라면 원래의 이름만 출력

 

Ex 3)

월별 매출합계를 출력 가능한가?

: 매출의 합계를 구하기 위해선 Product Table의 Sale_amount와 Price를 참고

SELECT DATE-FORMAT(REGISTER_DATE, '%Y-%M') AS MON, SUM(PRICE*SALE_AMOUNT) AS SUM
GROUP BY MON;


// Date-format
: 날짜가 출력되는 형식을 바꿀 수 있는 명령어
: 앞의 REGISTER_DATE = 날짜를 불러올 컬럼
: %Y-%M = 년도-월 의 형식으로 출력되도록 형식 지정

// SUM(PRICE*SALE_AMOUNT)
: 먼저 가격과 판매량을 곱한 후 모두 더하고

// GROUP BY MON
: 지정된 년도-월의 그룹으로 나누어 출력

년-월에 따라 판매량을 출력

Ex 4)

Price가 가장 높은(비싼) 상품 출력이 가능한가?

: 모든 정보를 얻어와서, 내림차순으로 정렬한 후, 최상단의 값만 출력.

SELECT * FROM PRODUCT
ORDER BY PRICE DESC
LIMIT 0,1;

1번 행
: PRODUCT의 모든 정보를 선택한다

2번 행
: 정렬의 순서를 가격순으로 하며, 내림차순으로 정의

3번 행
: 출력될 정보를 0번부터 시작하며, 1개의 값만 출력

가장 비싼 상품 : 피트니스 상하의
가장 비싼 품목 정상 출력!

Ex 5)

9월에 입고된 재고 상품을 PRODUCT_NON TABLE로 이동

PRODUCT_NON TABLE은 PRODUCT TABLE과 같은 형식

기존 PRODUCT TABLE에서는 삭제

Transaction 사용하기!

 

Transaction이란?

- 하나의 작업을 하기위한 명령어 묶음 단위

- 연관있는 작업들의 모임

- 하나라도 명령어가 완료되지 못한다면(error) >> 취소

모든 명령어가 완료되어야 다음 진행이 가능

완료와 취소를 나중에 결정하는 개념

데이터의 안전성 확보를 위한 방법

쓰는 경우는 적음 >> JAVA가 있어서

// 기본 구조
START TRANSATION;
명령어 1;
명령어 2;
COMMIT; or ROLLBACK;

명령어들은 DML에 해당하는 것
DDL/DCL은 포함 안됨

COMMIT = 작업 완료
ROLLBACK = 위에 작성한 명령어 모두 취소

 

: 데이터를 옮기기 전, 테이블을 먼저 생성해야함

CREATE TABLE IF NOT EXISTS PRODUCT_NON2
LIKE PRODUCT
;

// IF NOT EXISTS = 만약 동일한 이름이 없다면 생성
// LIKE = 형식을 복사해서 생성

PRODUCT에서 옮길 데이터
PRODUCT_NON2에 추가된 데이터, PRODUCT에선 삭제된 데이터

: Start transaction; 으로 명령어를 한번에 실행하겠다고 입력한 후,

: 입력한 명령어들을 한번에 실행하고

: Query OK 라는 출력이 있다면

: Commit; 으로 데이터를 저장

 

EX 6)

가장 많이 판매한 제품의 이름을 출력 가능한가?

: 제품의 이름으로 그룹을 만들고

: 내림차순으로 판매순을 정렬

: LIMIT을 걸어 1번부터 1개만 출력되도록.

 

→ LIMIT은 몇개를 출력할지 정해져 있는 상황에서만 하는게 좋음. 만약 동일한 최대수가 더 있다면 다른 최대수는 출력이 안되기 때문