Database

[MySQL] SQL 고급 실습 연습하기1

31daylee 2024. 1. 24. 13:39
728x90

SQL 실습

테이블 생성~테이블 결합

 


 

 Guide Line

1️⃣ 총 3개의 테이블을 생성합니다. 각각의 테이블 이름은 [bank_account], [bank_customer], [bank_transaction] 이 되며, CREATE TABLE `테이블명`(`컬럼명1 자료형1, 컬럼명 2 자료형2`.. )으로 작성을 하면 됩니다.

 

2️⃣ 그 후 각각의 테이블에 데이터를 입력하는 과정을 진행합니다.

INSERT INTO `테이블명` VALUES(데이터1, 데이터2, 데이터3 ... );

 

 

 

 

 

 

✔ 관련 쿼리문

CREATE TABLE `bank_customer`(
	`c_no` 		VARCHAR(14) NOT NULL PRIMARY KEY,
	`c_name` 	VARCHAR(20) NOT NULL,
	`c_dist` 	INT NOT NULL DEFAULT 0,
	`c_phone`	CHAR(20) NOT NULL UNIQUE, 
	`c_addr` 	VARCHAR(100) 
);
CREATE TABLE `bank_account` (
	`a_no` 	        VARCHAR(11) NOT NULL PRIMARY KEY,
	`a_item_dist` 	VARCHAR(2) NOT NULL,
	`a_item_name` 	VARCHAR(20) NOT NULL,
	`a_c_no` 	    	VARCHAR(14) NOT NULL,
	`a_balance`   	INT DEFAULT 0,
	`a_open_date` 	DATE NOT NULL
);
CREATE TABLE `bank_transaction` (
	`t_no` 			  INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
	`t_a_no`			VARCHAR(11) NOT NULL,
	`t_dist` 		  INT NOT NULL,
	`t_amount`		INT NOT NULL DEFAULT 0,
	`t_datetime`	DATETIME NOT NULL 
);

 

 

 

 

 

✔ 테이블

Table Name: bank_account
Table Name: bank_customer
Table Name: bank_transaction

 

 

 

 

 


 

✔ 문제 1

가장 많은 잔고를 보유한 자유저축 예금계좌를 조회 하시오

 

 

 

작성 Query

#실습2-18
SELECT * FROM 
		`bank_account` 
WHERE 
		`a_item_name` = '자유저축예금' 
ORDER BY 
		`a_balance` DESC #내림차순으로 정렬 -> 가장 큰 값이 위로 실행 
LIMIT 1; #가장 큰 값 중 하나만 조회

#실습2-18(다른 버전)
SELECT * FROM `bank_account` 
WHERE `a_balance` = (SELECT MAX(`a_balance`) FROM `bank_account` WHERE `a_item_dist`='S1');

 

 

정렬하기_ ORDER BY

ORDER BY `칼럼명` DESC LIMIT 표시할_레코드수;

 

 

 

 

 

 

✔ 문제 2

거래내역에서 입금 건수, 출금 건수, 조회 건수를 조회 하시오

 

 

작성 Query

#실습2-20
SELECT
COUNT(case when t_dist = '1' then 1 END) AS `입금 건수`,
COUNT(case when t_dist = '2' then 1 END) AS `출금 건수`,
COUNT(case when t_dist = '3' then 1 END) AS `조회 건수`
FROM `bank_transaction`;

#실습 2-20(강사님버전)
SELECT
	COUNT(if(`t_dist`=1,1,NULL)) AS `입금 건수`,
	COUNT(if(`t_dist`=2,1,NULL)) AS `출금 건수`,
	COUNT(if(`t_dist`=3,1,NULL)) AS `조회 건수`
FROM `bank_transaction`;

 

 

 

조건_ CASE WHEN

조건_ COUNT

📃 CASE WHEN 함수

CASE WHEN [조건식] THEN ‘반환 값’ END ‘조건에 만족하지 않을 경우 반환 값’
📃 COUNT 함수

SELECT COUNT(*) FROM `테이블명`
- 조회된 전체행 건수 반환

SELECT COUNT(`컬럼명`) FROM `테이블명`
- 컬럼의 값이 NULL 인 행 제외한 데이터 건수 반환
- NULL 포함: NVL, DECODE 활용 -> COUNT(NVL(`컬럼명`,0))

SELECT COUNT(DISTINCT 컬럼명) FROM `테이블명`
- 중복 데이터 제외

 

 

 

🚨 관련 오류

SQL Error (1630): FUNCTION substring does not exist. 해결책 ⇒  COUNT함수와 괄호 사이에 공백을 없애기

 

 

 

 

 

 

 

✔ 문제 3

거래 구분이 입금이고 (t_dist :1)큰 거래 금액 순으로 아래와 같이 데이터가 조회 되도록 하시오

 

 

작성 Query

#실습2-29
SELECT
	`t_no`,
	`a_no`,
	`c_no`,
	`t_dist`,
	`a_item_name`,
	`c_name`,
	`t_amount`,
	`t_datetime`
FROM `bank_transaction` AS a
JOIN `bank_account`AS b ON a.t_a_no = b.a_no
JOIN `bank_customer` AS c ON b.a_c_no = c.c_no
WHERE `t_dist` =1
ORDER BY `t_amount` DESC;

 

 

내부조인_INNER JOIN

SELECT `칼럼명` FROM `테이블1` JOIN `테이블2` ON 테이블1.칼럼 = 테이블2.칼럼;

 

 

 

 

 

728x90