04-1 MySQL의 데이터 형식
- 데이터 형식
- 정수형
- 소수점이 없는 숫자
- TINYINT(1byte), SMALLINT(2byte), INT(4byte), BIGINT(8byte)
- UNSIGNED 예약어
- 값의 범위가 -가 아닌 0부터 시작되는 예약어
- 예로 TINYINT는-128~127로 표현하면 TINYINT UNSIGNED는 0~255로 표현할 수 있다.
- 문자형
- 글자를 저장하기 위해 사용하며 입력할 최대 글자의 개수를 지정해야 한다.
- CHAR(1~255byte), VARCHAR(1~16383byte)
- CHAR은 고정길이 문자형으로 자릿수가 고정되어 있다. 예로 CHAR(10)에 3글자만 저장해도 10자리 모두 확보를 해서 7자리를 낭비하게 된다.
- VARCHAR은 가변길이 문자형으로 3글자를 저장하면 3자리만 사용한다.
- 공간은 VARCHAR이 효율적이지만 속도는 CHAR이 더 빠르다.
- 대량의 데이터 형식
- TEXT(1~65535byte), LONGTEXT(1~4294967295)
- 소설이나 영화 대본 같은 내용을 저장한다면 필요한 데이터 형식
- BLOB(1~65535byte), LONGBLOB(1~4294967295byte)
- Binary Long Object의 약자로 이미지, 동영상 등의 데이터를 저장할 때 사용
- TEXT(1~65535byte), LONGTEXT(1~4294967295)
- 실수형
- 소수점이 있는 숫자
- FLOAT(4byte), DOUBLE(8byte)
- FLOAT는 소수점 아래 7자리까지, DOUBLE은 소수점 아래 15자리까지 표현
- 날짜형
- 날짜 및 시간을 저장할 때 사용, 입력 시 작은 따옴표로 묶어서 사용
- DATE(3byte), TIME(3byte), DATETIME(8byte)
- DATE는 날짜만 저장하고 YYYY-MM-DD 형식
- TIME은 시간만 저장하고 HH:MM:SS 형식
- DATETIME은 날짜와 시간을 저장하고 YYYY-MM-DD HH:MM:SS 형식
- 정수형
- 변수의 사용
- SQL도 변수 선언 및 사용 가능, MySQL 워크벤치 종료 시 사라진다. (임시 사용)
- 기본 형식
- 변수 선언 및 대입: SET @변수이름 = 변수의값;
- 변수 값 출력: SELECT @변수이름;
- LIMIT에는 변수를 사용할 수 없다. PREPARE, EXECUTE 사용으로 가능
- 데이터 형 변환
- 명시적인 변환
- 예로 실수에서 정수로 변환할 때 사용
- CAST (값 AS 데이터형식 [(길이)])
- CONVERT (값, 데이터형식 [(길이)])
- 암시적인 변환
- 함수를 사용하지 않고 자연스럽게 형이 변환되는 것
- 예로 CONCAT(100, ‘200’) 은 100200 으로 결과가 나오고, 100 + ‘200’은 300이 출력된다.
- CONCAT(): 문자를 이어주는 역할
- 명시적인 변환
04-2 두 테이블을 묶는 조인
- 조인 (join)
- 두 개의 테이블을 서로 묶어서 하나의 결과를 만들어 내는 것
- 일대다 관계(one to many)
- 일대다 관계란 한쪽 테이블에는 하나의 값만 존재해야 하지만, 연결된 다른 테이블에는 여러 개의 값이 존재할 수 있는 관계를 말한다.
- 예로 1번 테이블의 아이디를 기본키로 지정했는데, 2번 테이블의 아이디에서는 n개의 해당 키를 찾을 수 있다. 그래서 2번 테이블의 아이디는 외래키로 설정했다.
- 1명의 회사원이 여러 번의 급여를 받는 것이나, 1명의 학생이 여러 과목의 학점을 받는 것과 같은 관계가 바로 일대다 관계
- 내부 조인
- 두 테이블을 연결할 때 가장 많이 사용되는 것, 그냥 조인이라고 부르면 내부 조인을 의미
- 두 테이블에 모두 데이터가 있어야만 결과가 나온다.
- 조인은 3개 이상의 테이블로도 할 수 있지만 대부분은 2개로 조인한다.
- 기본 형식
- INNER JOIN을 그냥 JOIN으로 써도 INNER JOIN으로 인식한다.
- ex) 두 개의 테이블에 동일한 열 이름이 존재한다면 테이블이름.열이름 형식으로 표기
SELECT * FROM buy INNER JOIN member **ON buy.mem_id = member.mem_id** WHERE buy.mem_id = 'GRL';
- 테이블 이름에 AS로 별칭을 주면 간결하게 표기할 수 있다.
- SELECT 열목록 FROM 첫번째테이블 INNER JOIN 두번째테이블 ON 조인될조건 [WHERE 검색조건]
- 중복된 결과 1개만 출력
- DISTINCT
- 열 이름 앞에 DISTINCT 표기 시 중복된 결과 1개만 출력 가능
- DISTINCT
- 외부 조인(outer join)
- 외부 조인은 한쪽에만 데이터가 있어도 결과가 나온다. (내부 조인은 양쪽 모두 있어야 결과 출력)
- 내부 조인보다 자주 사용되지는 않지만 가끔 사용
- 기본 형식
- SELECT 열목록 FROM 첫번째테이블(LEFT 테이블) <LEFT or RIGHT or FULL> OUTER JOIN 두번째테이블(RIGHT 테이블) ON 조인될조건 [WHERE 검색 조건]
- LEFT OUTER JOIN
- 첫번째 테이블(LEFT 테이블)의 내용은 모두 출력
- RIGHT OUTER JOIN
- 두번째 테이블(RIGHT 테이블)의 내용은 모두 출력
- FULL OUTER JOIN
- 왼쪽 외부 조인과 오른쪽 외부 조인이 합쳐진 것
- 왼쪽이든 오른쪽이든 한쪽에 들어 있는 내용이면 출력, 자주 사용되지는 않음
- 기타 조인
- 상호 조인(cross join)
- 한쪽 테이블의 모든 행과 다른 쪽 테이블의 모든 행을 조인시키는 기능
- 결과의 행 개수는 두 테이블의 각 행의 개수를 곱한 개수가 된다.
- 주 용도는 테스트를 위한 대용량의 데이터 생성할 때
- 기본 형식
- SELECT * FROM table1 CROSS JOIN table2;
- ON 구문 사용 불가, 랜덤으로 조인하기 때문에 결과의 내용은 무의미
- 자체 조인(self join)
- 자신이 자신과 조인한다는 의미 (1개의 테이블 사용)
- 기본 형식
- SELECT 열목록 FROM 테이블 별칭A INNER JOIN 테이블(위랑 같은테이블!) 별칭B ON 조인될조건 [WHERE 검색조건]
- 상호 조인(cross join)
04-3 SQL 프로그래밍
- 스토어드 프로시저
- MySQL에서 프로그래밍 기능이 필요할 때 사용하는 DB 개체
- SQL 프로그래밍은 스토어드 프로시저 안에 만들어야 한다.
- 기본 구조
- DELIMITER $$ CREATE PROCEDURE 스토어드프로시저이름() BEGIN <SQL 프로그래밍 코드> END $$ DELIMITER; CALL 스토어드프로시저이름() // 실행
- IF 문, IF-ELSE 문
- 조건문
- 기본 형식
IF 조건식 THEN SQL문장들 END IF;
- ex) 두 문장 이상 처리시 BEGIN~END로 묶어줘야 한다.
DELIMITER $$ CREATE PROCEDURE ifProc() BEGIN DECLARE myNum INT; // myNum 변수 선언 SET myNum = 200; // 변수 값 대입 IF myNum = 100 THEN SELECT '100입니다.'; ELSE SELECT '100이 아닙니다.'; END IF; END $$ DELIMITER; CALL ifProc(); // 함수 실행
- CASE 문
- 여러 가지 조건 중에서 선택하는 경우
- CASE와 END CASE 사이에 WHEN을 사용하여 여러 조건을 넣을 수 있다.
- 기본 형식
- CASE WHEN 조건1 THEN SQL문장들1 WHEN 조건2 THEN SQL문장들2 WHEN 조건3 THEN SQL문장들3 ELSE SQL문장들4 END CASE;
- WHILE 문
- 반복문
- 기본 형식
- WHILE 조건식 DO SQL문장 END WHILE;
- 반복문 중간에 프로그램 종료하는 함수
- ITERATE [레이블]
- 지정한 레이블로 가서 계속 진행
- LEAVE [레이블]
- 지정한 레이블을 빠져나감. WHILE 문 종료
- ITERATE [레이블]
미션
- 기본 미션
- p.195의 확인 문제 4번 풀고 인증하기
- 다음 SQL은 회원으로 가입만 하고, 한 번도 구매한 적이 없는 회원의 목록입니다. 빈칸에 들어갈 가장 적합한 것을 고르세요.
SELECT DISTINCT M.mem_id, B.prod_name, M.mem_name, M.addr FROM member M LEFT OUTER JOIN buy B ON M.mem_id = B.mem_id (빈칸) ORDER BY M.mem_id;
- 정답: 4번 WHERE B.prod_name IS NULL
- 이유: 해당 위치는 WHERE 검색 조건이 들어갈 위치이다!
- p.195의 확인 문제 4번 풀고 인증하기
'SQL' 카테고리의 다른 글
혼자 공부하는 SQL / Chapter 07 스토어드 프로시저 (0) | 2024.02.09 |
---|---|
혼자 공부하는 SQL / Chapter 06 인덱스 (0) | 2024.02.04 |
혼자 공부하는 SQL / Chapter 05 테이블과 뷰 (1) | 2024.01.29 |
혼자 공부하는 SQL / Chapter 03 SQL 기본 문법 (1) | 2024.01.10 |
혼자 공부하는 SQL / Chapter 01~02 데이터베이스와 SQL, 실전용 SQL 미리 맛보기 (2) | 2024.01.03 |