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 |
+-------+-----------+-------+
-------------------------------------------------------------------------------------
'java of educational by contents' 카테고리의 다른 글
Comments