외우지말고 이해하라.

외우는 것 보단 이해해서 내것으로 만들어 활용하기

Web Back-End/MySQL

MySQL 학습 01 - UNSIGNED, AUTO_INCREMENT , INNER JOIN

hyg4196 2021. 5. 18. 11:56
반응형

1. UNSIGNED

 

모든 Integer타입들은 속성으로 UNSIGNED를 가지고 있는데

 

이타입은 칼럼내에서 음수를 포함하지 않거나 혹은 수의 range를 양수쪽으로 더 넓게 가지고싶을때 사용한다.

 

쉽게 이해하기위해서 예를 들어보겠다. 위에테이블처럼 Type이 INT에 속성값이 UNSIGNED이면 컬럼의 range는 UNSIGNED없을때와 같지만 엔드포인트가 -2147483648 부터 2147483647 에서 --> 0 부터 4294967295. 로 늘어나게된다. 출처: https://donggu1105.tistory.com/28 [인생은 속도가 아니라 방향이다]

2. AUTO_INCREMENT

 

테이블 컬럼에 AUTO_INCREMENT 를 지정하기 위한 조건

 : 기본키여야 적용된다.

 

이미 만들어진 테이블에 AUTO_INCREMENT 타입으로 변경

  ALTER TABLE [테이블명] MODIFY [컬럼명] [데이터타입:int] AUTO_INCREMENT;

 

AUTO_INCREMENT 값 초기화 하기

  ALTER TABLE [테이블명] AUTO_INCREMENT=[시작할려는 순서]

 

AUTO_INCREMENT가 적용된 컬럼값 재정렬하기

  SET @COUNT = 0;

  UPDATE [테이블명] SET [컬럼명] = @COUNT:=@COUNT+1;

[출처] MySQL : auto_increment (값 자동증가) 및 초기화방법 및 초기화 되지 않을때|작성자 거셩

 

 

3. INNER JOIN

 

SELECT emp.*, dept.name FROM emp JOIN dept ON emp.deptId = dept.id;

 

ON 대신 WHERE를 쓸 수 있다.

INNER 조인은 MySQL에서는 간략히 JOIN으로 나타낸다. 일반적으로 사용하는 JOIN 이다.

 핵심은 JOIN뒤에 ON인데, 두 테이블이 결합하는 조건을 나타낸다. 

 


# a5 데이터베이스 삭제/생성/선택
DROP DATABASE IF EXISTS `a5`;
CREATE DATABASE `a5`;
USE `a5`;
# 부서(dept) 테이블 생성 및 홍보부서 기획부서 추가
CREATE TABLE dept(
    regDate DATETIME NOT NULL,
    NAME VARCHAR(100) NOT NULL,
    id INT(100) UNSIGNED AUTO_INCREMENT PRIMARY KEY
);

DROP TABLE dept;
DESC dept;

INSERT INTO dept SET regdate = NOW(), NAME ='홍보부서';
INSERT INTO dept SET regdate = NOW(), NAME ='기획부서';

# 사원(emp) 테이블 생성 및 홍길동사원(홍보부서), 홍길순사원(홍보부서), 임꺽정사원(기획부서) 추가
CREATE TABLE emp(
    id INT(100) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    regdate DATETIME NOT NULL,
    NAME VARCHAR(100) NOT NULL,
    deptName VARCHAR(100) NOT NULL
);

DROP TABLE emp;

INSERT INTO emp SET regdate = NOW(), NAME ='홍길순', deptName = '홍보부서';
INSERT INTO emp SET regdate = NOW(), NAME ='임꺽정', deptName = '기획부서';
INSERT INTO emp SET regdate = NOW(), NAME ='홍길동', deptName = '홍보부서';


DESC emp;
# 홍보를 마케팅으로 변경
UPDATE dept SET NAME = '마케팅부서' WHERE NAME = '홍보부서';
UPDATE emp SET deptName = '마케팅부서' WHERE deptName = '홍보부서';

# 마케팅을 홍보로 변경
UPDATE dept SET NAME = '홍보부서' WHERE NAME = '마케팅부서';
UPDATE emp SET deptName = '홍보부서' WHERE deptName = '마케팅부서';
# 홍보를 마케팅으로 변경
UPDATE dept SET NAME = '마케팅부서' WHERE NAME = '홍보부서';
UPDATE emp SET deptName = '마케팅부서' WHERE deptName = '홍보부서';

# 구조를 변경하기로 결정(사원 테이블에서, 이제는 부서를 이름이 아닌 번호로 기억)
ALTER TABLE emp ADD COLUMN deptId INT(10) UNSIGNED NOT NULL;
ALTER TABLE emp DROP COLUMN deptName;
UPDATE emp SET deptId = 1;
UPDATE emp SET deptId = 2 WHERE NAME = '임꺽정';

SELECT * FROM emp;
# 사장님께 드릴 인명록을 생성
SELECT * FROM emp;
# 사장님께서 부서번호가 아니라 부서명을 알고 싶어하신다.
# 그래서 dept 테이블 조회법을 알려드리고 혼이 났다.
SELECT * FROM dept;

# 사장님께 드릴 인명록을 생성(v2, 부서명 포함, ON 없이)
# 이상한 데이터가 생성되어서 혼남
SELECT emp.*, dept.name FROM emp JOIN dept;

# 사장님께 드릴 인명록을 생성(v3, 부서명 포함, 올바른 조인 룰(ON) 적용)
# 보고용으로 좀 더 편하게 보여지도록 고쳐야 한다고 지적받음
SELECT emp.*, dept.name FROM emp JOIN dept ON emp.deptId = dept.id;
# 사장님께 드릴 인명록을 생성(v4, 사장님께서 보시기에 편한 칼럼명(AS))
SELECT emp.id AS '사원번호', emp.name AS '사원이름', emp.regdate AS '입사일자',
 dept.name AS '소속부서' FROM emp JOIN dept ON emp.deptId = dept.id;

# 사장님께 드릴 인명록을 생성(v5, 테이블 AS 적용)
SELECT E.id AS '사원번호', E.name AS '사원이름', E.regdate AS '입사일자',
 D.name AS '소속부서' FROM emp AS E JOIN dept AS D ON E.deptId = D.id;
반응형

'Web Back-End > MySQL' 카테고리의 다른 글

JDBC, DBCP, JNDI 차이점  (1) 2024.09.08
MySQL 학습 02 - IFNULL, union, TRUNCATE  (0) 2021.05.21
MySQL 연습장 02  (0) 2021.05.18
MySQL 연습장 01  (0) 2021.05.17