[SQL] Table 속에 저장된 데이터를 출력하고 수정하기
본 글에서 사용할 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 = 형식을 복사해서 생성
: Start transaction; 으로 명령어를 한번에 실행하겠다고 입력한 후,
: 입력한 명령어들을 한번에 실행하고
: Query OK 라는 출력이 있다면
: Commit; 으로 데이터를 저장
EX 6)
가장 많이 판매한 제품의 이름을 출력 가능한가?
: 제품의 이름으로 그룹을 만들고
: 내림차순으로 판매순을 정렬
: LIMIT을 걸어 1번부터 1개만 출력되도록.
→ LIMIT은 몇개를 출력할지 정해져 있는 상황에서만 하는게 좋음. 만약 동일한 최대수가 더 있다면 다른 최대수는 출력이 안되기 때문