yoni

[38][JDBC] MySQL Data Type, 기본 SQL, 기본 SQL 실습, AUTO_INCREMENT 본문

java of educational by contents

[38][JDBC] MySQL Data Type, 기본 SQL, 기본 SQL 실습, AUTO_INCREMENT

yoni-1117 2018. 12. 15. 16:37

[01] 테이블을 만들기 위한 MySQL 컬럼의 데이터 타입

      - (*): 많이 사용되는 유형
 
1. 숫자형
    - tinyint       1 -128 ~ 127 
    - smallint     2 -32768 ~ 32767        
    - mediumint 3 -8388608 ~ 8388607, 8백만정도.  
    - int(*)         4 -2147483648 ~ 2147483647, 21억 정도 
    - integer      4 
    - bigint       8   ← JAVA: long
    - float         4 -10^38 ~ 10^38-1  
    - double      8 -10^308 ~ 10^308-1  
    - double precision, real, decimal 8 
 
 
 
2. 문자형 - CHAR  
   - CHAR(10)은 한글 10자 저장, 영/숫자 10자 저장. 
 
   - CHAR(m): 1~255개의 문자 지정, 데이터가 고정 길이문자,
     선언된 용량을 사용하지 않으면 공백으로 채움, 속도는 고속
 
     선언: CODE  CHAR(4)   NOT NULL,  <- 고정 길이 데이터 권장 
            TITLE   CHAR(50) NOT NULL   <- 메모리 낭비 발생 가능성 높음
 
     CODE  TITLE
     ------   ------------------------- 
     A001   Seoul/  낭비 구간  /    
     A002   Incheon Namdong-gu 
     A003   Busan/  낭비 구간  /  
 
 
 
3. 문자형 - VARCHAR(*)
   - VARCHAR(m): 1~65535개의 가변 길이 문자 데이터 지정, 메모리
     재사용, CHAR 타입에 비해서 속도는 늦으나 대용량이 아니면
     큰 차이는 없음 (*) 
 
     . title VARCHAR(100): 제목 내용이 10바이트만 사용되면 char와는
       다르게 나머지 90바이트는 재사용합니다. 
 
   - TEXT: 65535개의 문자 지정 가능, 기본값을 지정할 수 없음.
 
   - MEDIUMTEXT: 16777215개의 문자 지정 
    
   - LONGTEXT: 4GB의 문자 지정(빅 데이터)
   
   
4. 날짜형
   - DATETIME  8 (*)  <- 2014-01-01 12:30:21 
   - DATE        3      <- 2014-01-01 
   - TIMESTAMP(8)    <-yyyymmdd 
 
 
 
5. 테이블 생성시 기본 SQL
    CREATE TABLE news( 
 
      PRIMARY KEY(newsno)
    );  
 
 
Project Type: java project 
         name: oop
     package: jdbc
 
  
  
   
[02] News 테이블 생성하기 [jdbc 선택 -> New -> File] 
- 파일의 확장자는 sql이나 ddl을 사용할 것.
- '--': 주석 선언시 공백 한칸을 띄울 것. 
 
 


▷ /src/jdbc/news.sql
-------------------------------------------------------------------------------------
1. news 테이블의 생성 
   - PRIMARY KEY(newsno)
     newsno 컬럼에 같은 값이 2번이상 등록되는 것을 차단,
     테이블에서 레코드를 고유하게 구분하는 역활을 함.
 
   - 테이블은 1개이상의 PK(Primary Key)를 가지고 있어야합니다.
     예) 상품 번호, 사원 번호, 주민등록 번호, 전화 번호, 송장 번호,
          지역 코드, 업무 코드, 부서 코드...
 
* /mysql56/bin/mysqld.exe를 먼저 실행 후 SQL을 실행 합니다.
* -- 주석 표시 다음에는 공백을 한반이상 꼭 띄웁니다.
 
CREATE TABLE news(        -- news: 테이블명, Excel sheet 이름과 동일
  newsno   INT,                -- 컬럼, 뉴스 고유 기사 번호
  title        VARCHAR(20),  -- 컬럼, 제목, 한글/영어/숫자 20자 
  rdate      DATETIME,       -- 컬럼, 등록일(날짜/시간) 
  PRIMARY KEY(newsno)   
);  
-- PRIMARY KEY(newsno): 고유한 값만 newsno 컬럼에 할당 가능
 

->실행 하려면 Execute Selected Text 를 사용하면 된다.



-- 생성된 테이블 목록: 
SHOW TABLES;
+------------------+
| Tables_in_javadb |
+------------------+
| news               |
+------------------+
 
 
2. 테이블 삭제
DROP TABLE news;
  
 
3. 등록
   - '': 문자열 값의 시작과 종료를 나타냅니다.
   - now(): MySQL 함수, 현재 날짜와 시간을 만듭니다.
   
1) 날짜의 산출
mysql> SELECT now();
+---------------------+
| now()               |
+---------------------+
| 2015-08-07 19:52:28 |
+---------------------+
 
 
2) 일반적인 등록
    INSERT INTO news(newsno, title, rdate)
    VALUES(1, '한강 전 구간에 다시 조류경보', now());
 
    SELECT * FROM news; -- *: 모든 컬럼
+--------+---------------------------------+-----------------------+
| newsno | title                           | rdate                 |
+--------+---------------------------------+-----------------------+
|   1    | 한강 전 구간에 다시 조류경보     | 2015-10-06 19:56:52   |
+--------+---------------------------------+-----------------------+    
 
 
3) ""의 등록
   - 문자열의 시작과 종료를 " ' ", " ' "(Single quotation)로 사용합니다.
   - java: System.out.println("동시방류 6차례...\"효과 없다\"");
 
   INSERT INTO news(newsno, title, rdate)
   VALUES(2, '동시방류 6차례..."효과 없다"', now());
 
mysql> SELECT * FROM news;
+--------+------------------------------------------+---------------------+
| newsno | title                                    | rdate               |
+--------+------------------------------------------+---------------------+
|      1 | 한강 전 구간에 다시 조류경보             | 2015-12-03 19:43:17 |
|      2 | 동시방류 6차례..."효과 없다"             | 2015-12-03 19:47:54 |
+--------+------------------------------------------+---------------------+
 
 
4) " ' "의 등록: \' 표현
   INSERT INTO news(newsno, title, rdate)
   VALUES(3, '이통3사 사내유보금 '27조 원'', now());
 
   You have an error in your SQL syntax; 
   check the manual that corresponds to your MySQL server version
   for the right syntax to use near '27조 원'', now())' at line 2
 
   INSERT INTO news(newsno, title, rdate)
   VALUES(3, "이통3사 사내유보금 '27조 원'", now());
 
   INSERT INTO news(newsno, title, rdate)
   VALUES(4, '철도파업 한 달째..\'82.8%\'', now());
 
mysql> SELECT * FROM news;
+--------+------------------------------------------+---------------------+
| newsno | title                                    | rdate               |
+--------+------------------------------------------+---------------------+
|      1 | 한강 전 구간에 다시 조류경보             | 2016-10-25 21:56:25 |
|      2 | 동시방류 6차례..."효과 없다"             | 2016-10-25 22:01:22 |
|      3 | 이통3사 사내유보금 '27조 원'             | 2016-10-26 19:49:09 |
|      4 | 철도파업 한 달째..'82.8%'                | 2016-10-26 19:57:08 |
+--------+------------------------------------------+---------------------+
 
4. 조회 목록
   1) 모든 컬럼의 모든 레코드 출력
      SELECT * FROM news;
+--------+------------------------------------------+---------------------+
| newsno | title                                    | rdate               |
+--------+------------------------------------------+---------------------+
|      1 | 한강 전 구간에 다시 조류경보             | 2016-10-25 21:56:25 |
|      2 | 동시방류 6차례..."효과 없다"             | 2016-10-25 22:01:22 |
|      3 | 이통3사 사내유보금 '27조 원'             | 2016-10-26 19:49:09 |
|      4 | 철도파업 한 달째..'82.8%'                | 2016-10-26 19:57:08 |
+--------+------------------------------------------+---------------------+
     
   2) newsno, title 컬럼만 출력하고 newsno 컬럼을 기준으로 오름차순
      정렬을 진행합니다.
      - ORDER BY newsno ASC: newsno 컬럼 기준으로 오름 차순 출력
      - ORDER BY newsno DESC: newsno 컬럼 기준으로 내림 차순 출력
      
     SELECT newsno, title
     FROM news
     ORDER BY newsno ASC;
+--------+------------------------------------------+
| newsno | title                                    |
+--------+------------------------------------------+
|      1 | 한강 전 구간에 다시 조류경보             |
|      2 | 동시방류 6차례..."효과 없다"             |
|      3 | 이통3사 사내유보금 '27조 원'             |
|      4 | 철도파업 한 달째..'82.8%'                |
+--------+------------------------------------------+
        
  3) newsno 컬럼을 기준으로 내림차순 정렬을 진행합니다.
     - 가장 고가의 상품 먼저 출력
  
     SELECT newsno, title
     FROM news
     ORDER BY newsno DESC;
+--------+------------------------------------------+
| newsno | title                                    |
+--------+------------------------------------------+
|      4 | 철도파업 한 달째..'82.8%'                |
|      3 | 이통3사 사내유보금 '27조 원'             |
|      2 | 동시방류 6차례..."효과 없다"             |
|      1 | 한강 전 구간에 다시 조류경보             |
+--------+------------------------------------------+
 
  4) SQL은 한줄로도 표현 가능(식별이 잘 안되어 권장 아님)  
     SELECT newsno, title, rdate FROM news ORDER BY newsno DESC;
 
 
5. 한건 조회
   - 보통 한건이나 특정 조건의 레코드를 출력하는 기능을 말합니다.
   - WHERE 문은 Java의 IF문과 같은 기능을 합니다. 
   - WHERE newsno = 1: newsno 컬럼의 값이 1인 레코드 출력
   - WHERE 문은 일반적인 관계 연산자를 사용 가능합니다.
     예) newsno > 1, newsno < 1, newsno >= 1, newsno <= 1, =, !=
         OR, AND, NOT, <>, ()등도 사용 가능
   
   SELECT newsno, title
   FROM news
   WHERE newsno = 1;
 
+--------+------------------------------------------+
| newsno | title                                    |
+--------+------------------------------------------+
|        1 | 한강 전 구간에 다시 조류경보            |
+--------+------------------------------------------+
 
 
6. 수정
   - 컬럼의 값을 변경합니다.
   - WHERE문 생략시 모든 레코드가 변경됨으로 일반적으로
     WHERE를 사용합니다.
   
1) 수정
   - 모든 레코드 변경(권장 아님) 
   UPDATE news
   SET title = '김치 종주국의 잃어버린 명예';
 
   SELECT newsno, title, rdate
   FROM news
   ORDER BY newsno ASC;
+--------+-----------------------------------------+---------------------+
| newsno | title                                   | rdate               |
+--------+-----------------------------------------+---------------------+
|      1 | 김치 종주국의 잃어버린 명예             | 2016-10-25 21:56:25 |
|      2 | 김치 종주국의 잃어버린 명예             | 2016-10-25 22:01:22 |
|      3 | 김치 종주국의 잃어버린 명예             | 2016-10-26 19:49:09 |
|      4 | 김치 종주국의 잃어버린 명예             | 2016-10-26 19:57:08 |
+--------+-----------------------------------------+---------------------+
   
   - 특정 레코드만 변경(권장)
   UPDATE news
   SET title = '내일 출근 빙판길 우려...'
   WHERE newsno = 1;
   
2) 수정한 내용 확인
   SELECT newsno, title
   FROM news
   WHERE newsno = 1;
+--------+-----------------------------------+
| newsno | title                             |
+--------+-----------------------------------+
|      1 | 내일 출근 빙판길 우려...          |
+--------+-----------------------------------+
 
3) 2 번 레코드의 title='한반도서 지진 7.0 발생할 수도' 변경
   UPDATE news
   SET title = '한반도서 지진 7.0 발생할 수도'
   WHERE newsno = 2;
 
4) 3 번 레코드의 title='4대강 다시 자연으로' 변경
   UPDATE news
   SET title = '4대강 다시 자연으로'
   WHERE newsno = 3;
 
5) 4 번 레코드의 title='저무는 스마트폰 왕국...' 변경
   UPDATE news
   SET title = '저무는 스마트폰 왕국...'
   WHERE newsno = 4;
 
  
   SELECT newsno, title
   FROM news
   ORDER BY newsno ASC;
 
 newsno title
 ------ ------------------
      1 내일 출근 빙판길 우려...
      2 한반도서 지진 7.0 발생할 수도
      3 4대강 다시 자연으로
      4 저무는 스마트폰 왕국...
    
  
7. 삭제
   - WHERE 문을 생략하면 모든 레코드가 삭제됩니다.
    
1) 삭제
   - 모든 레코드 삭제(권장하지 않음)
     DELETE FROM news;
   
   - 특정 레코드 삭제(권장)
     DELETE FROM news
     WHERE newsno = 4;
   
2) 삭제 확인   
   SELECT newsno, title
   FROM news
   ORDER BY newsno ASC;
 
 newsno title
 ------ ------------------
      1 내일 출근 빙판길 우려...
      2 한반도서 지진 7.0 발생할 수도
      3 4대강 다시 자연으로
   
3) newsno 컬럼의 값이 3인 레코드 삭제
 
4) newsno 컬럼의 값이 2인 레코드 삭제
 
3) newsno 컬럼의 값이 1인 레코드 삭제
 
 
-------------------------------------------------------------------------------------
 
 
   
 
[03] AUTO_INCREMENT
     - NOT NULL: INSERT문에 값이 반드시 있어야합니다.
     - AUTO_INCREMENT: 일련번호 자동 증가 예) 1,2,3,4,5...
     - PRIMARY KEY(hakno): 고유한 값만 지정된 컬럼에 등록 가능,
       레코드를 고유하게 구분하는 기능을 함.
 
▷ /src/jdbc/auto.sql
-------------------------------------------------------------------------------------
1. 테이블 생성
CREATE TABLE sungjuk(
  hakno INT NOT NULL AUTO_INCREMENT, -- 고유 일련 번호
  name  VARCHAR(10) NOT NULL, -- 필수 입력
  grade  INT                     NULL,   -- Insert 시 NULL은 생략 가능
  PRIMARY KEY(hakno)                 -- 중복된 값이 오면 안됨.
);   
 
DROP TABLE sungjuk;
 
 
2. 실습
 
1) 자동 증가 컬럼(hakno)은 등록시 컬럼명을 명시하지 않습니다.
INSERT INTO sungjuk(name, grade)
VALUES('왕눈이', 3);
 
-- WHERE문이 없음으로 모든 레코드 출력, *는 모든 컬럼
SELECT * FROM sungjuk;
+-------+-----------+-------+
| hakno | name      | grade |
+-------+-----------+-------+
|   1      | 왕눈이    |   3   |
+-------+-----------+-------+
 
2) grade 컬럼은 NULL 속성이 지정되어있어 생략 가능함.
- NULL: 컬럼에 데이터 입력이 발생한 적이 없음. 
 
INSERT INTO sungjuk(name)
VALUES('아로미');
 
SELECT * FROM sungjuk;
+-------+-----------+-------+
| hakno | name      | grade |
+-------+-----------+-------+
|     1   | 왕눈이     |     3    |
|     2   | 아로미     |  NULL |
+-------+-----------+-------+
 
 
INSERT INTO sungjuk(name)
VALUES('홍길동');
 
SELECT * FROM sungjuk;
+-------+-----------+-------+
| hakno | name      | grade |
+-------+-----------+-------+
|     1 | 왕눈이    |     3 |
|     2 | 아로미    |  NULL |
|     3 | 홍길동    |  NULL |
+-------+-----------+-------+
 
INSERT INTO sungjuk(name)
VALUES('가길순');
 
SELECT * FROM sungjuk;
+-------+-----------+-------+
| hakno | name      | grade |
+-------+-----------+-------+
|     1 | 왕눈이    |     3 |
|     2 | 아로미    |  NULL |
|     3 | 홍길동    |  NULL |
|     4 | 가길순    |  NULL |
+-------+-----------+-------+
 
 
3. NOT NULL 컬럼인 name을 생략한 경우
INSERT INTO sungjuk(grade)
VALUES(2);
 
- 에러 메시지
ERROR 1364 (HY000): Field 'name' doesn't have a default value
 
- NOT NULL 컬럼은 insert시에 반드시 값이 있어야 합니다.
  . 회원의 경우 '성명/이메일/아이디/패스워드' 등이 생략되면 회원을 나타내는
    데이터가 너무 빈약해짐(정보로서 활용하기 어려움)으로 생략하면 안됨. 
 
 
3. AUTO_INCREMENT로 발생한 숫자가 삭제되어도 처음 상태로
   변경 불가능합니다. 중복값 발생을 피하기위해 증가만 합니다.
 
DELETE FROM sungjuk
WHERE hakno = 4;
 
SELECT * FROM sungjuk;
+-------+-----------+-------+
| hakno | name      | grade |
+-------+-----------+-------+
|     1 | 왕눈이    |     3 |
|     2 | 아로미    |  NULL |
|     3 | 홍길동    |  NULL |
+-------+-----------+-------+
 
INSERT INTO sungjuk(name, grade)
VALUES('투투투', 1);
 
SELECT * FROM sungjuk;
+-------+-----------+-------+
| hakno | name      | grade |
+-------+-----------+-------+
|     1 | 왕눈이    |     3 |
|     2 | 아로미    |  NULL |
|     3 | 홍길동    |  NULL |
|     5 | 투투투    |     1 |
+-------+-----------+-------+
 
-------------------------------------------------------------------------------------
 
 
 


Comments