4장. 데이터베이스와 테이블 MySQL 데이터베이스 테이블의 생성 테이블 데이터 처리(삽입, 변경, 삭제) 작업 2019-02-05 쉽게 배우는 MySQL 5.x
4.1 MySQL 데이터베이스 생성 1) 학사("haksa") 데이터베이스 생성 작업 [실습 따라하기] ① MySQL접속 C:\>mysql -u root -p Enter password: ******* Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 4 Server version: 5.0.37-community-nt MySQL Community Edition (GPL) Type 'help;' or '\h' for help. Type '\c' to clear the buffer. mysql> ② MySQL 새로운 데이터베이스("haksa") 생성 mysql> create database haksa; Query OK, 1 row affected (0.00 sec) 2019-02-05 쉽게 배우는 MySQL 5.x
④ 생성된 Database 사용하기 위해 데이터베이스 변경 mysql> show databases; +--------------------+ | Database | | information_schema | | haksa | | mysql | | test | 4 rows in set (0.02 sec) mysql> ④ 생성된 Database 사용하기 위해 데이터베이스 변경 mysql> use haksa; Database changed 2019-02-05 쉽게 배우는 MySQL 5.x
2) 인사테이블("insa") 생성 및 데이터 입력 [실습 따라하기] mysql> create table insa( -> bunho int(1) auto_increment, -> name char(8) not null, -> e_name char(4) not null, -> town char(6) not null, -> primary key(bunho) -> ); Query OK, 0 rows affected, 1 warning (0.75 sec) mysql> insert into insa values('1','홍길동', 'Hong', '순천'); Query OK, 1 row affected (0.06 sec) mysql> insert into insa values('2','제갈공명', 'Je', '여수'); Query OK, 1 row affected (0.03 sec) mysql> insert into insa values('3','순자', 'Soon', '부산'); mysql> insert into insa values('4','이순신', 'Lee', '여수'); Query OK, 1 row affected (0.05 sec) mysql> select * from insa; 2019-02-05 쉽게 배우는 MySQL 5.x
Commit/Rollback 작업 1. Commit : 변경된 데이터를 데이터베이스에 적용시킨다. BUNHO NAME E_NAME TOWN 1 홍길동 Hong 순천 2 제갈공명 Je 여수 3 순자 Soon 부산 4 이순신 Lee ① “INSA" 테이블 질의 mysql> select * from insa; +-------+----------+--------+------+ | bunho | name | e_name | town | | 1 | 홍길동 | Hong | 순천 | | 2 | 제갈공명 | Je | 여수 | | 3 | 순자 | Soon | 부산 | | 4 | 이순신 | Lee | 여수 | 4 rows in set (0.00 sec) 2019-02-05 쉽게 배우는 MySQL 5.x
③ “INSA”테이블의 내용 변경 : 번호 4번 도시(TOWN)을 한산도로 변경 ② 주의사항 : MySQL은 명령어를 실행하면 자동(Default)으로 Commit을 하게 되어 있다. 우선 AutoCommit를 하지 않도록 한다. mysql> set autocommit = 0; Query OK, 0 rows affected (0.06 sec) ③ “INSA”테이블의 내용 변경 : 번호 4번 도시(TOWN)을 한산도로 변경 mysql> update insa -> set town = '한산도' -> where bunho = 4; Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0 - 변경된 “INSA”테이블 질의 mysql> select * from insa; +-------+----------+--------+--------+ | bunho | name | e_name | town | | 1 | 홍길동 | Hong | 순천 | | 2 | 제갈공명 | Je | 여수 | | 3 | 순자 | Soon | 부산 | | 4 | 이순신 | Lee | 한산도 | 4 rows in set (0.00 sec) 2019-02-05 쉽게 배우는 MySQL 5.x
④ 변경된 데이터 복구작업 : Rollback mysql> rollback; Query OK, 0 rows affected (0.03 sec) ⑤ “INSA” 테이블 질의 mysql> select * from insa; +-------+----------+--------+------+ | bunho | name | e_name | town | | 1 | 홍길동 | Hong | 순천 | | 2 | 제갈공명 | Je | 여수 | | 3 | 순자 | Soon | 부산 | | 4 | 이순신 | Lee | 여수 | 4 rows in set (0.00 sec) ⑥ “INSA” 테이블 내용 변경 : TOWN이 여수인 데이터를 “대구”로 변경 mysql> update insa -> set town = '대구' -> where town = '여수'; Query OK, 2 rows affected (0.00 sec) Rows matched: 2 Changed: 2 Warnings: 0 2019-02-05 쉽게 배우는 MySQL 5.x
⑦ “INSA” 테이블 내용 데이터베이스에 저장 : Commit mysql> commit; Query OK, 0 rows affected (0.00 sec) ⑧ 변경된 데이터 복구작업 : Rollback(복구가 되지 않음) mysql> rollback; Query OK, 0 rows affected (0.00 sec). ⑨ “INSA” 테이블 질의 mysql> select * from insa; +-------+----------+--------+------+ | bunho | name | e_name | town | | 1 | 홍길동 | Hong | 순천 | | 2 | 제갈공명 | Je | 대구 | | 3 | 순자 | Soon | 부산 | | 4 | 이순신 | Lee | 대구 | 4 rows in set (0.00 sec) 2019-02-05 쉽게 배우는 MySQL 5.x
Savepoint/Truncate 작업 Savepoint로 저장점을 저장하고 INSERT, DELETE, UPDATE작업을 수행 후 Rollback to 저장점을 수행하면 그 위치까지 다시 복구 ① “INSA" 테이블 변경 작업 : 번호 2의 도시(TOWN)을 “여수”로 변경 mysql> update insa -> set town = '여수' -> where bunho = 2; Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0 ② Savepoint "AA" 지정 mysql> savepoint aa; Query OK, 0 rows affected (0.00 sec) ③ 번호 3번 행 삭제 : DELETE 작업 mysql> delete from insa -> where bunho = 3; Query OK, 1 row affected (0.00 sec). 2019-02-05 쉽게 배우는 MySQL 5.x
⑤ “INSA” 테이블 Savepont “AA”까지 복구 mysql> select * from insa; +-------+----------+--------+------+ | bunho | name | e_name | town | | 1 | 홍길동 | Hong | 순천 | | 2 | 제갈공명 | Je | 여수 | | 4 | 이순신 | Lee | 대구 | 3 rows in set (0.00 sec) ⑤ “INSA” 테이블 Savepont “AA”까지 복구 mysql> rollback to aa; Query OK, 0 rows affected (0.00 sec) ⑥ “INSA” 테이블 질의 | 3 | 순자 | Soon | 부산 | 4 rows in set (0.00 sec) ① 작업을 수행한 후 Savepont “AA”를 지정했기 때문에 ①에서 변경 작업한 내용은 복구되지 않고, ③ 작업 이후만 복구 2019-02-05 쉽게 배우는 MySQL 5.x
⑦ Truncate 작업 : “INSA”테이블의 삭제 처리 (모든 행이 삭제 처리됨) mysql> truncate table insa; Query OK, 3 rows affected (0.08 sec) ⑧ Truncate 작업 후 “INSA”테이블 복구 (복구가 되지 않음) mysql> rollback; Query OK, 0 rows affected (0.00 sec). ⑨ “INSA” 테이블 질의 mysql> select * from insa; Empty set (0.00 sec) Truncate 작업의 “INSA”테이블 삭제 처리시 복구가 되지 않는다. 2019-02-05 쉽게 배우는 MySQL 5.x
4.2 SQL 명령문 SQL 명령문의 그룹 ① DDL : 데이터 정의언어(Data Definition Language) -데이터베이스 객체인 테이블, 인덱스, 뷰 등의 구성에 영향을 주는 명령문 -DBA(데이터베이스관리자)만이 권한을 갖는다. -CREATE TABLE, CREATE INDEX, CREATE VIEW, DROP TABLE, DROP INDEX, ALTER TABLE, RENAME ② DML : 데이터 조작언어(Data Manipulation Language) -테이블의 내용을 변경하고 질의하는 명령문 -SELECT, INSERT, UPDATE, DELETE, COMMIT, ROLLBACK, SAVEPOINT, LOCK ③ DCL : 데이터 제어언어(Data Control Language) -유저관리와 데이터 보호와 관련된 명령문 -GRANT, ROVOKE, CONNECT, DISCONNECT 2019-02-05 쉽게 배우는 MySQL 5.x
데이터 처리 함수들 1) 숫자 데이터형 ① 정수 데이터형(INT) : int 데이터형은 정수형 데이터(0, 음수, 양수)를 저장 ex) INT(n) ② 실수 데이터형(FLOAT) : 실수 데이터형은 소수점을 포함하여 값을 저장 ex) FLOAT(N, M) 2) 문자 데이터형(CHAR, VARCHAR, BLOB) ① CHAR 데이터형 -1바이트에서 255바이트까지의 고정 길이 문자열을 저장 -정의된 저장공간보다 입력 데이터가 짧으면 나머지 공간은 공백(SPACE)으로 -정의된 길이보다 입력 데이터가 길면 길이에 맞게 잘린 데이터가 입력 -테이블 생성시 저장할 데이터의 최대크기로 정의해야만 데이터의 손실 방지 ② VARCHAR 데이터형 -정의된 저장공간보다 긴 문자열이 입력되면 VARCHAR에서는 에러 값을 리턴 -최대로 정의할 수 있는 데이터의 길이는 255바이트까지 저장 -메모 등의 다양한 길이의 데이터에 적절하고, 가변적인 길이의 문자열을 저장 -VARCHAR가 CHAR보다 검색 속도가 훨씬 느리다. 2019-02-05 쉽게 배우는 MySQL 5.x
-BLOB와 TEXT는 65,535 이상의 거대한 텍스트 데이터를 저장할 때 사용 -BLOB는 검색시 대소문자를 구분 3) 날짜 데이터형 -날짜 및 시간 데이터를 저장하기 위해서 Date 데이터형을 제공 -SYSDATE이라는 함수를 사용해서 현재 OS의 날짜를 조회 mysql> select now(); +---------------------+ | now() | | 2007-09-07 15:03:35 | 1 row in set (0.03 sec) -select는 산술 계산의 결과나 날짜 등을 볼 수 있다. -위의 실행결과는 현재 오늘 시스템 날짜가 2007년 09월 07일인 경우 -Date형은 B․C. 4712년 1월 1일~A․D. 9999년 12월 31일까지 범위 값 저장 2019-02-05 쉽게 배우는 MySQL 5.x
NULL 값 4) 바이너리(binary) 데이터형 -음성, 화상(이미지), 동영상과 같은 데이터를 저장하기 위해서 바이너리 데이터형으로 RAW와 LONG RAW 데이터형을 사용 -제약점으로는 내장함수를 사용할 수 없다. ① RAW 데이터형 : 이진형 데이터를 255바이트까지 사용, 저장 공간의 제한점 때문에 많이 사용하지 않는다. ② LONG RAW 데이터형 : 이진형 데이터를 2GB까지 수용 ③ BLOB 데이터형 : 이진형 데이터를 4GB까지 수용 NULL 값 -NULL 값은 “값이 알려져 있지 않다” 또는 “값이 존재하지 않는다”라는 의미 -NULL 값은 다른 NULL 값과 결코 일치하지 않는다. -NOT NULL의 의미는 모든 행에서 해당 열은 특정한 값으로 채워져 있어야 한다는 것을 의미 - NOT NULL로 정의된 칼럼은 NULL값을 사용할 수 없다. 2019-02-05 쉽게 배우는 MySQL 5.x
테이블 생성 -테이블 생성 방법 : 명령어(Command) 방식, MySQL Query Browser 방식 -학사(“haksa”)데이터베이스는 전체 9개의 테이블로 구성 학사관리 테이블 생성(SQL 명령어 사용) #학과테이블 create table department( dept_code int(2) Not null, #학과번호 dept_name char(30) Not null, #학과명 dept_ename varchar(50), #학과영문이름 Create_date date default null, #학과생성날짜 primary key (dept_code) )type = innoDB; #우편번호테이블 create table post( post_no varchar(7) Not null, #우편번호 post_dong char(30) Not null, #동이름 post_address char(60) Not null, #주소 ddd char(4), #DDD 전화지역번호 primary key (post_no) 2019-02-05 쉽게 배우는 MySQL 5.x
stu_no char(10) Not null, #학번 stu_name char(10) Not null, #학생이름 #학적(학생신상)테이블 create table student( stu_no char(10) Not null, #학번 stu_name char(10) Not null, #학생이름 stu_ename varchar(30), #영문이름 dept_code int(2) Not null, #학과코드 grade int(1) Not null, # 학년 class int (1) Not null, #반 juya char(2), #주야구분 id_num varchar(14) Not null, #주민등록번호 post_no varchar(7), #우편번호 address varchar(100), #주소 tel varchar(14), #전화번호 phone_no varchar(14), #휴대전화번호 birth_year char(4), #출생년도 primary key (stu_no), constraint s_dp_fk foreign key(dept_code) #외래키 학과 테이블의 학과코드 references department(dept_code), constraint s_ps_fk foreign key(post_no) #외래키 우편번호테이블 우편번호코드 references post(post_no) ) type = innoDB; 2019-02-05 쉽게 배우는 MySQL 5.x
sub_code char(5) Not null, #과목번호 sub_name varchar(50) Not null, #과목명 #교과목테이블 create table subject( sub_code char(5) Not null, #과목번호 sub_name varchar(50) Not null, #과목명 sub_ename varchar(50), #영문과목명 create_year char(4), #개설년도 primary key (sub_code) )type = innoDB; #교수테이블 create table professor( prof_code char(4) Not null, #교수번호 prof_name char(10) Not null, #교수명 prof_ename varchar(30), #교수영문이름 Create_date date default null, #교수임용날짜 primary key (prof_code) 2019-02-05 쉽게 배우는 MySQL 5.x
stu_no char(10) Not null, #학번 att_year char(4) Not null, #수강년도 #수강신청 create table attend( stu_no char(10) Not null, #학번 att_year char(4) Not null, #수강년도 att_term int(1) Not null, # 수강학기 att_isu int(1) Not null, #이수구분 sub_code char(5) Not null, #과목코드 prof_code char(4) Not null, #교수번호 att_point int(1) Not null, #이수학점 att_grade int(3) default '0', #취득점수 att_div char(1) default 'N' Not null, #수강신청구분 att_jae char(1) default '1', #재수강 구분 1(본학기 수강), 2(재수강), 3(계절학기 수강) att_date date Not null, #수강처리일자 primary key (stu_no, att_year, att_term, sub_code, prof_code, att_jae), constraint su_att_fk foreign key(sub_code) #외래키 교과목 테이블의 과목코드 references subject(sub_code), constraint pr_att_fk foreign key(prof_code) #외래키 교수 테이블의 교수코드 references professor(prof_code) ) type = innoDB; 2019-02-05 쉽게 배우는 MySQL 5.x
stu_no varchar(10) Not null, #학번 fee_year varchar(4) Not null, #등록년도 #등록금테이블 create table fee( stu_no varchar(10) Not null, #학번 fee_year varchar(4) Not null, #등록년도 fee_term int(1) Not null, #등록학기 fee_enter int(7), #입학금 fee_price int(7) Not null, #등록금(수업료) fee_total int(7) Default '0' Not null, #등록금총액=입학금+수업료 jang_code char(2) Null, #장학코드 jang_total int(7), #장학금액 fee_pay int(7) Default '0' Not null, #납부총액=등록금총액-장학금액 fee_div char(1) Default 'N' Not null, #등록구분 fee_date date Not null, #등록날짜 primary key (stu_no, fee_year, fee_term) ) type = innoDB; 2019-02-05 쉽게 배우는 MySQL 5.x
stu_no char(10) Not null, #학번 sco_year char(4) Not null, #성적취득년도 #성적테이블 create table score( stu_no char(10) Not null, #학번 sco_year char(4) Not null, #성적취득년도 sco_term int(1) Not null, #학기 req_point int(2), #신청학점 take_point int(2), #취득학점 exam_avg float(2,1), #평점평균 exam_total int(4), #백분율 총점 sco_div char(1), #성적구분 sco_date date, #성적처리일자 primary key (stu_no, sco_year, sco_term) ) type = innoDB; 2019-02-05 쉽게 배우는 MySQL 5.x
cir_num int(4) Not null auto_increment, #동아리가입번호 #동아리테이블 create table circle( cir_num int(4) Not null auto_increment, #동아리가입번호 cir_name char(30) Not null, #동아리명 stu_no char(10) Not Null, #학번 stu_name char(10) Not Null, #이름 president char(1) default '2' Not null, #동아리회장(0), 부회장(1), 회원(2) primary key (cir_num), constraint s_ci_fk foreign key(stu_no) #외래키 학적 테이블의 학번 references student(stu_no) )type = innoDB; 2019-02-05 쉽게 배우는 MySQL 5.x
-테이블의 기본 키는 모든 값이 오직 한번만 나타난 열(또는 열의 조합)이다. -기본 키는 무결성 규칙의 특별한 자료형이다. 테이블에는 3개의 속성인 이름, 열, 기본 키를 정의 CREATE TABLE STUDENT ( STU_NO CHAR(10) NOT NULL, 열 NAME CHAR(10) NOT NULL, ENAME VARCHAR(30), PRIMARY KEY(STU_NO) 테이블 이름 기본 키 -테이블의 기본 키는 모든 값이 오직 한번만 나타난 열(또는 열의 조합)이다. -기본 키는 무결성 규칙의 특별한 자료형이다. -기본 키가 없다면 중복된 값이 입력될 수 있으므로 문제를 발생 -기본 키를 지원하지 않는 제품은 각 기본 키에 대한 유일한 인덱스를 생성 2019-02-05 쉽게 배우는 MySQL 5.x
인덱스를 생성하는 명령문 CREATE INDEX 인덱스이름 on 테이블(칼럼_) CREATE INDEX STU_PRIM ON STUDENT (STU_NO); CREATE INDEX ATT_PRIM ON ATTEND (STU_NO); CREATE INDEX FEE_PRIM ON STUDENT(STU_NO); CREATE INDEX SUB_PRIM SUBJECT(SUB_CODE); CREATE INDEX SCO_PRIM ON CREATE INDEX PRO_PRIM ON PROFESSOR(PROF_CODE); CREATE INDEX POS_PRIM ON POST(POST_NO); CREATE INDEX CIR_PRIM ON CIRCLE(CIR_NUM); CREATE INDEX DEP_PRIM ON DEPARTMENT(DEPT_CODE); 2019-02-05 쉽게 배우는 MySQL 5.x
4.3 테이블 데이터 처리(삽입, 변경, 삭제) 작업 테이블에 데이터 삽입 #DEPARTMENT 입력 4.3 테이블 데이터 처리(삽입, 변경, 삭제) 작업 테이블에 데이터 삽입 #DEPARTMENT 입력 INSERT INTO DEPARTMENT VALUES (10,'간호학과','Dept. of Nersing','1954-02-01'); (20,'경영학과','Dept. of Management','1980-02-10'); (30,'수학학과','Dept. of Mathematics','1984-02-20'); (40,'컴퓨터정보학과','Dept. of Computer Information','1995-02-01'); (50,'정보통신학과','Dept. of Information Communication','1997-02-10'); (60,'회계학과','Dept. of Accounting','1998-03-01'); 2019-02-05 쉽게 배우는 MySQL 5.x
INSERT INTO POST VALUES ('556-820', '화양면', '전라남도 여수시 화양면', '061'); ('556-820', '화양면', '전라남도 여수시 화양면', '061'); ('540-130', '생목동', '전라남도 순천시 생목동', '061'); ('451-800', '팽성읍', '경기도 평택시 팽성읍', '031'); ('545-800', '광양읍', '전람남도 광양시 광양읍', '061'); ('540-850', '해룡면', '전라남도 순천시 해룡면', '061'); ('550-130', '서교동', '전라남도 여수시 서교동', '061'); ('150-051', '신길1동', '서울특별시 영등포구 신길1동', '02'); ('500-170', '운암동', '광주광역시 북구 운암동', '062'); ('506-040', '소촌동', '광주광역시 광산구 소촌동', '062'); ('545-080', '광영동', '전라남도 광양시 광영동', '061'); 2019-02-05 쉽게 배우는 MySQL 5.x
INSERT INTO POST VALUES ('550-160', '봉강동', '전라남도 여수시 봉강동', '061'); ('550-160', '봉강동', '전라남도 여수시 봉강동', '061'); ('540-170', '남정동', '전라남도 순천시 남정동', '061'); ('550-260', '여서동', '전라남도 여수시 여서동', '061'); ('540-310', '안풍동', '전라남도 순천시 안풍동', '061'); ('546-121', '농성동', '광주광역시 서구 농성동', '062'); ('590-020', '향교동', '전라북도 남원시 향교동', '063'); ('548-820', '영남면', '전라남도 고흥군 영남면', '061'); 2019-02-05 쉽게 배우는 MySQL 5.x
INSERT INTO STUDENT VALUES ('20001001', '김유신', 'Kim Yoo-Shin', 40, 4, 3, '야', '811007-1632013','556-820','안포리 28번지','061)685-7818','011-617-1290','1981'); ('20001015', '박도준', 'Park Do-Jun', 40, 4, 1, '주', '780116-1580715','540-130','16-2번지','061)744-6126','011-611-9884','1978'); ('20001021', '이상길', 'Lee Sang-Gil', 40, 4, 1, '주', '750819-1227014','451-800','안정리 주공APT 107동 504호','031)691-5423',NULL,'1975'); ('20041002', '김유미', 'Kim Yoo-Mi', 40, 3, 2, '주', '830207-2629715','545-800','덕례리 산 16-1번지','061)763-1439','010-617-1290','1983'); ('20041007', '정인정', 'Jeung Yin-Jeung', 40, 2, 2, '주', '830315-2351225','540-850','부영7차APT 304동 1210호','061)723-1078','016-605-7837','1983'); ('20041033', '연개소문', 'Yean Gae-So-Moon', 40, 3, 3, '야', '810615-1633111','550-130','280-50번지','061)642-9304','018-641-9304','1981'); ('20061011', '박정인', 'Park Jung-In', 40, 2, 1, '주', '830403-1635213','150-051','985번지 롯데APT 102-306','02)652-2439','017-3142-1294','1983'); 2019-02-05 쉽게 배우는 MySQL 5.x
INSERT INTO STUDENT VALUES ('20061014', '고혜진', 'Ko Hea-Jin', 10, 2, 1,'주', '870307-2638759','500-170','삼익APT 101동 102호','061)781-5135',NULL,'1987'); ('20061048', '김영호', 'Kim Young-Ho', 10, 4, 3 ,'야', '860811-1548758','506-040','라인APT 207동 309호','062)678-1010','017-614-7575','1986'); ('20071001', '장수인', 'Jang Soo-In', 40, 1, 1 ,'주', '890209-1616822','545-080','금광APT 108동 1101호','061)791-1236',NULL,'1989'); ('20071010', '홍길동', 'Hong Gil-Dong', 40, 1, 3,'야', '880402-1850838','550-160','해태APT 104동 605호','061)642-4034','010-6425-9245','1988'); ('20071022', '이순신', 'Lee Sun-Shin', 10, 1, 3,'야', '890222-1218818','540-170','560-18번지','061)745-7667','010-7141-1860','1989'); ('20071300', '유하나', 'Yoo Ha-Na', 50, 1, 1 ,'주', '880921-2573717','550-260','주공APT 204동 512호','061)651-5992','019-651-0707','1988'); ('20071307', '김문영', 'Kim Moon-Young', 50, 1, 3,'야', '880418-2121623','540-170','380-2번지','061)745-5485','019-4624-0460','1988'); ('20071405', '최차영', 'Choi Cha-Young', 50, 1, 2 ,'주', '881003-2581516','540-310','금사리 1427','061)745-6893',NULL,'1988'); 2019-02-05 쉽게 배우는 MySQL 5.x
쉽게 배우는 MySQL 5.x #SUBJECT 입력 INSERT INTO SUBJECT VALUES ('4001', '데이터베이스 응용', 'Database Application', '2002'); ('4002', '웹사이트 구축', 'Web Site Construction', '2003'); ('4003', '소프트웨어공학', 'Software Engineering', '2003'); ('4004', '웹프로그래밍', 'Web Programming', '2002'); ('4005', '컴퓨터구조', 'Computer Structure', '2001'); ('4006', '정보처리실무', 'Information Process Practical business', '2001'); ('4007', 'UML', 'Unified Modeling Language', '2005'); ('4008', '운영체제', 'Operating System', '2002'); ('4009', '전자상거래 실무', 'Electronic Commerce', '2003'); ('4010', '윈도우즈 프로그래밍', 'Windows Programming', '1998'); ('4011', '자바프로그래밍', 'Java Programming', '1999'); ('4012', '네트워크 프로그래밍', 'Network Programming', '2005'); ('4013', '컴포넌트 프로그래밍', 'Component Programming', '2004'); 2019-02-05 쉽게 배우는 MySQL 5.x
INSERT INTO PROFESSOR VALUES ('4001','정진용','Jung jin-yong','1995-09-01'); ('4002','나인섭','Na in-sub','2006-02-02'); ('4003','정창부','Jung chang-boo','2003-03-01'); ('4004','박상철','Park sang-chul','2000-01-15'); ('4005','정병열','Jung byeong-yeol','1998-03-01'); ('4006','고진광','Go jin-gwang','1988-03-01'); ('4007','김영식','Kim young-sik','1986-03-01'); ('4008','최우진','Choi woo-jin','1997-03-01'); ('4009','문창수','Moon chang-soo','1995-03-01'); ('5010','정종필','Jung jong-phil','1997-03-01'); ('5011','최종주','Choi jong-joo','1992-03-05'); 2019-02-05 쉽게 배우는 MySQL 5.x
INSERT INTO ATTEND VALUES ('20061011','2006',1,3,4001,'4002',3, 99,'Y','1','2006-03-05'); ('20061011','2006',1,4,4002,'4003',3, 95,'Y','1','2006-03-05'); ('20061011','2006',1,4,4003,'4004',3, 97,'Y','1','2006-03-05'); ('20061011','2006',1,4,4004,'4001',3, 98,'Y','1','2006-03-05'); ('20061011','2006',1,4,4005,'4007',3, 96,'Y','1','2006-03-05'); ('20061011','2006',1,4,4006,'4008',3, 95,'Y','1','2006-03-05'); ('20061011','2006',2,3,4007,'4009',3, 93,'Y','1','2006-09-03'); ('20061011','2006',2,4,4008,'4005',3, 92,'Y','1','2006-09-03'); ('20061011','2006',2,4,4009,'4006',3, 94,'Y','1','2006-09-03'); ('20061011','2006',2,4,4010,'4001',3, 90,'Y','1','2006-09-03'); ('20061011','2006',2,4,4011,'4002',3, 91,'Y','1','2006-09-03'); 2019-02-05 쉽게 배우는 MySQL 5.x
INSERT INTO ATTEND VALUES ('20061011','2006',2,4,4012,'4003',3, 92,'Y','1','2006-09-03'); ('20071300','2007',1,3,4001,'4002',3, 99,'Y','1','2007-03-05'); ('20071300','2007',1,4,4002,'4003',3, 95,'Y','1','2007-03-05'); ('20071300','2007',1,4,4003,'4004',3, 97,'Y','1','2007-03-05'); ('20071300','2007',1,4,4004,'4001',3, 98,'Y','1','2007-03-05'); ('20071300','2007',1,4,4005,'4007',3, 93,'Y','1','2007-03-05'); ('20071300','2007',1,4,4006,'4008',3, 95,'Y','1','2007-03-05'); 2019-02-05 쉽게 배우는 MySQL 5.x
#FEE 입력 INSERT INTO FEE VALUES ('20061011','2006',1, 500000,3000000,3500000,01,500000,3000000,'Y','2006-02-18'); ('20061011','2006',2, NULL,3000000,3000000,10,2500000,500000,'Y','2006-08-20'); ('20061011','2007',1, NULL,3000000,3000000,11,2000000,1000000,'Y','2007-02-18'); ('20061011','2007',2, NULL,3000000,3000000,21,800000,2200000,'Y','2007-08-10'); INSERT INTO FEE VALUES ('20001015','2000',1,500000,2500000,3000000,02,1000000,2000000,'Y','2000-02-01'); ('20001015','2000',2, NULL,2500000,2500000,10,2500000,0,'Y','2000-08-10'); ('20001015','2001',1, NULL,2800000,2800000,10,2500000,300000,'Y','2001-02-15'); ('20001015','2001',2, NULL,2800000,2800000,10,2500000,300000,'Y','2001-08-16'); ('20001015','2006',1, NULL,3000000,3000000,10,2500000,500000,'Y','2006-02-14'); ('20001015','2006',2, NULL,3000000,3000000,10,2500000,500000,'Y','2006-08-18'); ('20001015','2007',1, NULL,3000000,3000000,11,2000000,1000000,'Y','2007-02-10'); ('20001015','2007',2, NULL,3000000,3000000,10,2500000,500000,'Y','2007-08-19'); 2019-02-05 쉽게 배우는 MySQL 5.x
INSERT INTO FEE VALUES ('20071300','2007',1, 500000,3000000,3500000,01,500000,3000000,'Y','2007-02-18'); ('20071300','2007',2, NULL,3000000,3000000,11,2000000,1000000,'Y','2007-08-10'); ('20071001','2007',1, 500000,3000000,3500000,01,500000,3000000,'Y','2007-02-18'); ('20071001','2007',2, NULL,3000000,3000000,NULL,NULL,3000000,'Y','2007-08-10'); ('20071010','2007',1, 500000,3000000,3500000,01,500000,3000000,'Y','2007-02-18'); ('20071010','2007',2, NULL,3000000,3000000,NULL,NULL,3000000,'Y','2007-08-10'); ('20071022','2007',1, 500000,3000000,3500000,01,500000,3000000,'Y','2007-02-18'); ('20071022','2007',2, NULL,3000000,3000000,NULL,NULL,3000000,'Y','2007-08-10'); ('20071307','2007',1, 500000,3000000,3500000,01,500000,3000000,'Y','2007-02-18'); ('20071307','2007',2, NULL,3000000,3000000,NULL,NULL,3000000,'Y','2007-08-10'); ('20071405','2007',1, 500000,3000000,3500000,01,500000,3000000,'Y','2007-02-18'); ('20071405','2007',2, NULL,3000000,3000000,10,2500000,500000,'Y','2007-08-10'); 2019-02-05 쉽게 배우는 MySQL 5.x
INSERT INTO SCORE VALUES ('20061011','2006',1,18,18,4.5,580,'Y','2006-08-10'); ('20061011','2006',2,18,18,4.0,552,'Y','2007-01-11'); ('20071300','2007',1,18,18,4.4,577,'Y','2007-08-09'); ('20071307','2007',1,18,18,4.4,575,'Y','2007-08-09'); ('20071405','2007',1,18,18,4.2,572,'Y','2007-08-09'); ('20061011','2007',2,18,18,0,0,'N','2007-11-10'); ('20061300','2007',2,18,18,0,0,'N','2007-11-10'); ('20061307','2007',2,18,18,0,0,'N','2007-11-10'); ('20061405','2007',2,18,18,0,0,'N','2007-11-10'); 2019-02-05 쉽게 배우는 MySQL 5.x
INSERT INTO CIRCLE VALUES (1,'컴맹탈출','20061011','고혜진','0'); (1,'컴맹탈출','20061011','고혜진','0'); (2,'컴맹탈출','20071300','유하나','1'); (3,'컴맹탈출','20071307','김문영','2'); (4,'Java길라잡이','20071001','장수인','2'); (5,'Java길라잡이','20041007','정인정','1'); (6,'Java길라잡이','20001015','박도준','0'); (7,'PHP길라잡이','20001021','이상길','0'); 2019-02-05 쉽게 배우는 MySQL 5.x
질의 테이블 SELECT 명령문은 테이블로부터 데이터를 검색할 때 사용 [예제 4-1] STUDENT 테이블로부터 성별이 남자인 각 학생의 학번, 이름, 영문이름, 학년, 주민등록번호를 영문이름 순서로 출력하라. mysql> select stu_no, stu_name, stu_ename, grade, id_num -> from student -> where substring(id_num, 8, 1) = 1 -> order by stu_ename; +----------+----------+------------------+-------+----------------+ | stu_no | stu_name | stu_ename | grade | id_num | | 20071010 | 홍길동 | Hong Gil-Dong | 1 | 880402-1850838 | | 20071001 | 장수인 | Jang Soo-In | 1 | 890209-1616822 | | 20001001 | 김유신 | Kim Yoo-Shin | 4 | 811007-1632013 | | 20061048 | 김영호 | Kim Young-Ho | 4 | 860811-1548758 | | 20001021 | 이상길 | Lee Sang-Gil | 4 | 750819-1227014 | | 20071022 | 이순신 | Lee Sun-Shin | 1 | 890222-1218818 | | 20001015 | 박도준 | Park Do-Jun | 4 | 780116-1580715 | | 20061011 | 박정인 | Park Jung-In | 2 | 830403-1635213 | | 20041033 | 연개소문 | Yean Gae-So-Moon | 3 | 810615-1633111 | 9 rows in set (0.00 sec) 2019-02-05 쉽게 배우는 MySQL 5.x
-FROM 다음에는 질의를 원하는 테이블을 지정 : FROM STUDENT -WHERE 다음에는 원하는 조건을 기술 SUBSTRING( )함수는 ID_NUM의 8번째 칼럼 1자리만큼을 선택하기 위한 함수 성별이 남자인 학생을 찾는 조건 : WHERE SUBSTRING(ID_NUM, 8, 1) = 1 -SELECT는 탐색하고자 하는 열을 선택 학생의 학번, 이름, 영문이름, 학년, 주민등록번호를 선택하여 출력 SELECT STU_NO, STU_NAME, STU_ENAME, GRADE, ID_NUM -ORDER BY 다음에는 출력될 데이터가 정렬되는 방법을 지정 ORDER BY STU_NAME SELECT 명령문의 결과로 나타나는 것은 SQL에 의해서 결정 ① 열의 폭은 열의 자료형에 의해서 결정 ② 표제의 이름은 SELECT 명령문에서 사용한 열의 이름과 동일하게 사용 ③ 열에 있는 값이 출력될 때 문자형 데이터는 왼쪽 정렬로 출력 ④ 수치 값은 오른쪽 정렬로 출력 ⑤ 출력 결과 테이블의 각 열 사이에는 1 칸의 공백이 존재 ⑥ NULL 값은 NULL또는 공백(SPACE)으로 출력 : INSERT할 때 입력한 값(NULL, 공백)에 따라 출력 2019-02-05 쉽게 배우는 MySQL 5.x
[예제 4-2] 학년이 1학년이고 성별이 남자인 각 학생의 학번과 이름을 출력하는데, 출력 순서는 학번 내림차순이다. mysql> select stu_no, stu_name -> from student -> where grade = 1 -> and substring(id_num,8,1) = 1 -> order by stu_no desc; +----------+----------+ | stu_no | stu_name | | 20071022 | 이순신 | | 20071010 | 홍길동 | | 20071001 | 장수인 | 3 rows in set (0.00 sec) 2019-02-05 쉽게 배우는 MySQL 5.x
[예제 4-3] 교과목 테이블에 관한 모든 정보를 출력하라. mysql> select * from subject; +----------+---------------------+---------------------------------------+--------------+ | sub_code | sub_name | sub_ename | create_year | | 4001 | 데이터베이스 응용 | Database Application | 2002 | | 4002 | 웹사이트 구축 | Web Site Construction | 2003 | | 4003 | 소프트웨어공학 | Software Engineering | 2003 | | 4004 | 웹프로그래밍 | Web Programming | 2002 | | 4005 | 컴퓨터구조 | Computer Structure | 2001 | | 4006 | 정보처리실무 | Information Process Practical business | 2001 | | 4007 | UML | Unified Modeling Language | 2005 | | 4008 | 운영체제 | Operating System | 2002 | | 4009 | 전자상거래 실무 | Electronic Commerce | 2003 | | 4010 | 윈도우즈 프로그래밍 | Windows Programming | 1998 | | 4011 | 자바프로그래밍 | Java Programming | 1999 | | 4012 | 네트워크 프로그래밍 | Network Programming | 2005 | | 4013 | 컴포넌트 프로그래밍 | Component Programming | 2004 | 13 rows in set (0.05 sec) 교과목(FROM SUBJECT)에 대하여 모든 열 값(SELECT *)을 출력하는 명령문 * 문자는 모든 열(“ALL COLUMNS”)을 나타내는 문자 2019-02-05 쉽게 배우는 MySQL 5.x
행의 갱신과 삭제 UPDATE 명령문은 행에 있는 열의 값을 변경할 때 사용 DELETE 명령문은 테이블에서 완전히 행을 삭제할 때 사용 [예제 4-4] 교과목 중 운영체제의 생성년도를 2006년으로 변경하라. mysql> UPDATE SUBJECT -> SET CREATE_YEAR = '2006' -> WHERE SUB_NAME ='운영체제'; -UPDATE SUBJECT : 교과목 테이블을 변경하라. -WHERE SUB_NAME = ‘운영체제’ : 조건은 교과목명이 운영체제인 것을 변경 -SET CREATE_YEAR = ‘2006’ : 변경할 내용은 생성년도를 2006년으로 변경 SET 다음에는 새로운 값으로 변경될 열을 지정한다. 이 때 값은 기존에 존재하는 값에 관계없이 변경된다. 2019-02-05 쉽게 배우는 MySQL 5.x
[예제 4-5] 교과목 테이블에서 교과목코드, 교과목명, 교과목영문이름, 생성년도를 출력하라. mysql> select sub_code, sub_name, sub_ename, create_year -> from subject; +----------+---------------------+---------------------------------------+--------------+ | sub_code | sub_name | sub_ename | create_year | | 4001 | 데이터베이스 응용 | Database Application | 2002 | | 4002 | 웹사이트 구축 | Web Site Construction | 2003 | | 4003 | 소프트웨어공학 | Software Engineering | 2003 | | 4004 | 웹프로그래밍 | Web Programming | 2002 | | 4005 | 컴퓨터구조 | Computer Structure | 2001 | | 4006 | 정보처리실무 | Information Process Practical business | 2001 | | 4007 | UML | Unified Modeling Language | 2005 | | 4008 | 운영체제 | Operating System | 2006 | | 4009 | 전자상거래 실무 | Electronic Commerce | 2003 | | 4010 | 윈도우즈 프로그래밍 | Windows Programming | 1998 | | 4011 | 자바프로그래밍 | Java Programming | 1999 | | 4012 | 네트워크 프로그래밍 | Network Programming | 2005 | | 4013 | 컴포넌트 프로그래밍 | Component Programming | 2004 | 13 rows in set (0.05 sec) 교과목 코드 4008번인 운영체제의 생성년도가 2006년으로 변경됨 2019-02-05 쉽게 배우는 MySQL 5.x
삭제처리(DELETE) 작업은 테이블의 내용을 제거할 때 행(ROW) 단위로 이루어진다. 만약에 “SAMPLE"이라는 테이블의 모든 행을 삭제한다면 다음과 같다. DELETE FROM SAMPLE; 위의 예제는 “SAMPLE" 테이블의 모든 행을 삭제처리 하나 테이블 자체가 없어진 것은 아니다. 테이블의 명세표, 인덱스, 부여된 권한 등 환경테이블 정보 자체를 완전히 없애버릴 때는 DROP명령어를 다음과 같이 사용한다. “DROP TABLE SAMPLE" 2019-02-05 쉽게 배우는 MySQL 5.x
[예제 4-6] 과목명(SUB_NAME)이 UML인 과목을 삭제하라. mysql> delete -> from subject -> where sub_name = 'UML'; Query OK, 1 row affected (0.06 sec) mysql> select * from subject; +----------+---------------------+---------------------------------------+--------------+ | sub_code | sub_name | sub_ename | create_year | | 4001 | 데이터베이스 응용 | Database Application | 2002 | | 4002 | 웹사이트 구축 | Web Site Construction | 2003 | | 4003 | 소프트웨어공학 | Software Engineering | 2003 | | 4004 | 웹프로그래밍 | Web Programming | 2002 | | 4005 | 컴퓨터구조 | Computer Structure | 2001 | | 4006 | 정보처리실무 | Information Process Practical business | 2001 | | 4008 | 운영체제 | Operating System | 2006 | | 4009 | 전자상거래 실무 | Electronic Commerce | 2003 | | 4010 | 윈도우즈 프로그래밍 | Windows Programming | 1998 | | 4011 | 자바프로그래밍 | Java Programming | 1999 | | 4012 | 네트워크 프로그래밍 | Network Programming | 2005 | | 4013 | 컴포넌트 프로그래밍 | Component Programming | 2004 | 12 rows in set (0.05 sec) 교과목 코드 4007번인 UML과목이 삭제됨 2019-02-05 쉽게 배우는 MySQL 5.x
[예제 4-7] 교과목 중 운영체제의 생성년도를 2002년으로 변경하라. mysql> UPDATE SUBJECT -> SET CREATE_YEAR = '2002' -> WHERE SUB_NAME = '운영체제'; [예제 4-8] 교과목 테이블에 교과목코드(4007), 교과목명(UML), 교과목영문이름(Unified Modeling Language), 생성년도(2005)인 새로운 행을 삽입하라. mysql> INSERT INTO SUBJECT VALUES ( -> '4007', 'UML', ‘Unified Modeling Language’, '2005'); 교과목테이블의 원래의 데이터로 복원하기 위하여 UPDATE, INSERT 명령을 수행해 보았다. 2019-02-05 쉽게 배우는 MySQL 5.x
질의(Query) 처리의 최적화 -생성년도(CREATE_YEAR)가 2002년이면 결과 테이블에 출력 mysql> SELECT * -> FROM SUBJECT -> WHERE CREATE_YEAR = '2002'; -생성년도(CREATE_YEAR)가 2002년이면 결과 테이블에 출력 -만약 테이블이 몇 개의 행만을 가지고 있다면 SQL은 아주 빠르게 작업을 수행 -수십만 개의 행을 가지고 있다면 각 행을 조사하기 때문에 많은 시간을 요구 -인덱스를 정의하게 되면 처리 속도가 훨씬 빠르게 수행 인덱스(index)는 열 또는 열의 조합으로 정의 CREATE INDEX CREATEIX ON SUBJECT (CREATE_YEAR) -SUBJECT 테이블에서 CREATE_YEAR 열에 대한 CREATEIX 인덱스를 정의 -인덱스는 WHERE 조건 절을 만족하는 행을 보기 위해서만 사용 -테이블에서 조건에 만족하는 행의 검색은 훨씬 더 빨라진다. -인덱스 CREATEIX는 행의 직접 접근을 제공 2019-02-05 쉽게 배우는 MySQL 5.x
∙인덱스는 SELECT 명령문의 처리를 최적화(빠르게 처리)하기 위해서 사용 인덱스를 사용하는 중요한 점 ∙인덱스는 SELECT 명령문의 처리를 최적화(빠르게 처리)하기 위해서 사용 ∙인덱스에 관한 내용은 SELECT 명령문에서 명확하게 표현하지는 않는다. ∙명령문을 처리할 때 SQL은 이미 존재하는 인덱스가 사용될 것인지 선택한다. ∙인덱스는 언제든지 생성되거나 삭제될 수 있다. ∙행을 추가하거나 삭제, 갱신이 발생할 때 테이블에 관련된 인덱스를 유지한다. ∙SELECT 명령문의 처리 시간을 감소시킨다는 것을 의미 ∙갱신 명령문(INSERT, UPDATE, DELETE 등)의 시간은 증가 -SQL은 최적화 처리를 위해서 이러한 유일한 인덱스를 사용 -유일한 인덱스(Unique index)는 또 다른 기능을 가지고 있는데, 이는 중복된 값이 없는 특별한 열 또는 열의 조합을 보장해야 한다. 2019-02-05 쉽게 배우는 MySQL 5.x
뷰(View) -뷰(Views) 테이블은 필요에 따라 사용자가 재 정의하여 생성해주는 테이블 뷰는 유도된(derived) 또는 가상(virtual) 테이블이라고도 한다. 뷰는 실제 데이터 행을 가지고 있는 것처럼 동작하지만 데이터 행은 없음 [예제 4-9] 학적 테이블의 학번, 이름, 출생년도, 나이를 출력하라. mysql> select stu_no, stu_name, birth_year "출생년도", -> year(now()) - birth_year + 1 "나이" -> from student; +----------+----------+----------+------+ | stu_no | stu_name | 출생년도 | 나이 | | 20001001 | 김유신 | 1981 | 27 | | 20001015 | 박도준 | 1978 | 30 | | 20001021 | 이상길 | 1975 | 33 | | 20041002 | 김유미 | 1983 | 25 | | 20041007 | 정인정 | 1983 | 25 | | 20041033 | 연개소문 | 1981 | 27 | | 20061011 | 박정인 | 1983 | 25 | | 20061014 | 고혜진 | 1987 | 21 | | 20061048 | 김영호 | 1986 | 22 | | 20071001 | 장수인 | 1989 | 19 | | 20071010 | 홍길동 | 1988 | 20 | | 20071022 | 이순신 | 1989 | 19 | | 20071300 | 유하나 | 1988 | 20 | | 20071307 | 김문영 | 1988 | 20 | | 20071405 | 최차영 | 1988 | 20 | 15 rows in set (0.01 sec) 열의 제목 중에서 출생년도(BIRTH_YEAR)를 출력할 때 “출생년도”로, 나타내고, NOW()함수는 현재의 년,월,일,시간을 나타내는 함수이고 YEAR()함수는 년도를 나타내는 함수이다. 따라서 NOW()함수로 현재의 날짜를 추출한 다음 다시 YEAR()함수로 년도만을 추출한다. 나이는 현재의 연도에서 출생년도를 감산하여 1를 더한 값으로 얻을 수 있다.(예를들면 현재의 날짜가 2007년 7월 25일)일 때 1981년생의 나이를 계산하면 다음과 같다. 나이=현재 연도-출생년도+1=2007-1981+1=27 2019-02-05 쉽게 배우는 MySQL 5.x
STUDENT 테이블의 출생년도를 계산하여 AGES라는 VIEW 테이블을 작성 mysql> create view ages(stu_no, stu_name, age) as -> select stu_no, stu_name, year(now()) - birth_year + 1 -> from student; Query OK, 0 rows affected (0.14 sec) mysql> select * from ages; +----------+----------+------+ | stu_no | stu_name | age | | 20001001 | 김유신 | 27 | | 20001015 | 박도준 | 30 | | 20001021 | 이상길 | 33 | | 20041002 | 김유미 | 25 | | 20041007 | 정인정 | 25 | | 20041033 | 연개소문 | 27 | | 20061011 | 박정인 | 25 | | 20061014 | 고혜진 | 21 | | 20061048 | 김영호 | 27 | | 20071001 | 장수인 | 19 | | 20071010 | 홍길동 | 20 | | 20071022 | 이순신 | 19 | | 20071300 | 유하나 | 20 | | 20071307 | 김문영 | 20 | | 20071405 | 최차영 | 20 | 15 rows in set (0.00 sec) -AGES 뷰의 내용은 데이터베이스에 저장되지는 않지만 SELECT 명령문(또 다른 명령문)이 실행되는 순간에 유도 -뷰의 사용은 기억 공간을 사용하는 부가적인 비용이 없고, 다른 테이블에 이미 저장된 데이터로 구성 뷰가 주로 사용되는 경우 • 반복되는 명령문이나 루틴(routine)을 간단히 사용하고자 할 때, • 테이블의 출력 방법을 재구성하고자 할 때, • 여러 단계에서 SELECT 명령문이 사용될 때, • 데이터를 보호하고자 할 때 2019-02-05 쉽게 배우는 MySQL 5.x
ROOT 사용자의 데이터 보안 -데이터베이스에 저장된 데이터는 부정확한 사용이나 잘못된 사용에 대비하여 보호되어야 한다. -GRANT라는 명령문을 사용하여 사용자의 접근을 등록할 수 있다. root 패스워드를 “12345”로 설정하기 mysql> use mysql; Database changed mysql> update user set password=password('12345') where user = 'root'; Query OK, 1 row affected (0.09 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> flush privileges; Query OK, 0 rows affected (0.08 sec) 2) 슈퍼 유저[Root] 패스워드 변경 2가지 ■ SET PASSWORD 사용하기 SET PASSWORD 문을 사용하여, root의 패스워드를 12345로 변경하는 예제 이다. flush privileges; 명령을 사용하지 않아도 바로 적용이 된다. 2019-02-05 쉽게 배우는 MySQL 5.x
-SET PASSWORD 문을 사용하여, root의 패스워드를 12345로 변경하는 예제 -flush privileges; 명령을 사용하지 않아도 바로 적용 mysql> set password for root@localhost = password('12345'); Query OK, 0 rows affected (0.05 sec) UPDATE 문으로 user 테이블 수정하기 -UPDATE 문을 사용하여 mysql 시스템 데이터베이스 안의 user 테이블을 수정 -flush privileges; 명령을 주어야 적용 mysql> update user set password=password('12345') -> where user='root'; Query OK, 0 rows affected (0.00 sec) Rows matched: 1 Changed: 0 Warnings: 0 mysql> flush privileges; 2019-02-05 쉽게 배우는 MySQL 5.x
-PASSWORD()는 해독할 수 없는 암호화 방식 -base64 인코딩 방식은 디코딩이 가능하지만, pasword()는 해독 함수가 존재 하지 않는다. -for 루프 등을 돌려서 추측할 수 있으므로, 비밀번호는 최소 8자 이상으로 설정 -비밀번호는 길이가 길어지면, 해독 시간이 늘어나기 때문 mysql> select password('12345'); +-------------------------------------------+ | password('12345') | | *00A51F3F48415C7D4E8908980D443C29C69B60C9 | 1 row in set (0.00 sec) 2019-02-05 쉽게 배우는 MySQL 5.x
사용자 생성 및 권한 부여 CREATE 문으로 user 생성하기 [형식] create user 사용자명 identified by '비밀번호'; ① CREATE 문을 사용하여 새로운 사용자 “choi”를 암호(Password) “choi123” 으로 생성해 보자. ② CREATE 문을 사용하여 새로운 사용자 “lee@localhost”를 암호(Password) “lee123” 으로 생성해 보자. ① mysql> create user choi identified by 'choi123'; Query OK, 0 rows affected (0.00 sec) ② mysql> create user lee@localhost identified by 'lee123'; Query OK, 0 rows affected (0.16 sec) 2019-02-05 쉽게 배우는 MySQL 5.x
사용자 “lee”는 host명이 “localhost”이므로 localhost로 접속이 가능 -테이블의 "user" 테이블에서 새로이 생성된 사용자를 확인하기 위해 호스트명, 사용자, 비밀번호를 출력해보자. mysql> select host, user, password from user; +-----------+------+-------------------------------------------+ | host | user | password | | localhost | root | *FAAFFE644E901CFAFAEC7562415E5FAEC243B8B2 | | % | choi | *C6A35C53FC3460B0050486E1FB5A9D6B916407FA | | localhost | lee | *694E6C3F78B6E0EE7CCC45C949CD225769EE7CA6 | 3 rows in set (0.00 sec) 사용자 “lee”는 host명이 “localhost”이므로 localhost로 접속이 가능 사용자 “choi”의 경우는 host명이 “%”이므로 원격에서 접속이 가능 사용자 권한부여 [형식1] grant all privileges on 데이터베이스명.* to 사용자명; [형식2] grant 부여할 권한 SQL명령문 on 데이터베이스명.* to 사용자명; 2019-02-05 쉽게 배우는 MySQL 5.x
①사용자 “lee”에게 “haksa” DB를 select, insert, update, delete 권한 부여 ① mysql> grant select, insert, update, delete on haksa.* to lee@localhost; Query OK, 0 rows affected (0.00 sec) ② mysql> grant all privileges on haksa.* to choi; Query OK, 0 rows affected (0.02 sec) ③ mysql> grant all privileges on *.* to lee@localhost; ①사용자 “lee”에게 “haksa” DB를 select, insert, update, delete 권한 부여 ②사용자 “choi”에게 “haksa” DB를 관리할 수 있는 모든 권한 부여 ③사용자 “lee”는 모든 DB를 모든 권한을 가지고 관리할 수 있도록 권한 부여 사용자 생성 및 권한부여를 동시에 처리 [일반형식] grant priv_type [(column_list)] [, priv_type [(column_list)] ...] on tbl_name | * | *.* | db_name.* to user_name [identified by 'password'] [, user_name [identified by 'password'] ...] [with grant option] [형식1] grant all privileges on DB명.* to DB계정명@localhost identified by '비밀번호' with grant option; [형식2] grant all privileges on DB명.* to DB계정명 identified by '비밀번호' with grant option; [형식1]의 경우는 localhost에서 'DB계정명' 이라는 사용자를 등록한 경우 [형식2]의 경우는 localhost 아닌 원격에서 접속시 호스트를 % 로 해준 경우 2019-02-05 쉽게 배우는 MySQL 5.x
①사용자 “kim”, password는 “kim123” 생성, “haksa” DB에 모든 권한 부여 ① mysql> grant all privileges on haksa.* to kim@localhost identified by 'kim123' with grant option; Query OK, 0 rows affected (0.00 sec) ② mysql> grant all privileges on *.* to han identified by 'han123' with grant option; ①사용자 “kim”, password는 “kim123” 생성, “haksa” DB에 모든 권한 부여 ②사용자 “han”, password는 “han123” 생성, 모든 DB에 모든 권한 부여 "user" 테이블에서 새로이 생성된 사용자를 확인하기 위해 호스트명, 사용자, 비밀번호를 출력해보자. mysql> select host, user, password from user; +-----------+------+-------------------------------------------+ | host | user | password | | localhost | root | *FAAFFE644E901CFAFAEC7562415E5FAEC243B8B2 | | localhost | kim | *DFC0E7A43E14F96552318E8651E32B546FE91C59 | | localhost | lee | *694E6C3F78B6E0EE7CCC45C949CD225769EE7CA6 | | % | choi | *C6A35C53FC3460B0050486E1FB5A9D6B916407FA | | % | han | *C4B2087D966138F5AB4470F41E7BEEFDC593157D | 5 rows in set (0.00 sec) 2019-02-05 쉽게 배우는 MySQL 5.x
[형식2] delete from user where user='해당유저이름'; 사용자 삭제 [형식1] drop user '해당유저이름'; [형식2] delete from user where user='해당유저이름'; [형식3] delete from db where user='해당유저이름'; [형식1]은 “user” 테이블과 "db" 테이블에서 해당유저를 완전히 삭제 [형식2]는 “user” 테이블에서 사용자를 삭제하는 경우 [형식3]은 "db" 테이블에서 해당유저에게 부여된 데이터베이스의 권한을 삭제 사용자의 데이터베이스를 권한을 알 수 있는 "db" 테이블의 정보를 알아보자. mysql> desc db; +-----------------------+---------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | | Host | char(60) | NO | PRI | | | | Db | char(64) | NO | PRI | | | | User | char(16) | NO | PRI | | | | Select_priv | enum('N','Y') | NO | | N | | | Insert_priv | enum('N','Y') | NO | | N | | | Update_priv | enum('N','Y') | NO | | N | | | Delete_priv | enum('N','Y') | NO | | N | | : : : | Drop_priv | enum('N','Y') | NO | | N | | | Execute_priv | enum('N','Y') | NO | | N | | 20 rows in set (0.00 sec) 2019-02-05 쉽게 배우는 MySQL 5.x
①의 경우는 사용자 “kim”을 완전히 삭제 처리한 경우 ②의 경우는 “user”테이블에서 사용자 “lee”를 삭제한 경우 새로이 생성된 사용자의 데이터베이스 권한을 확인하기 위해 “db”테이블에서 호스트명, DB명, 사용자, select 권한만을 출력해보자. mysql> select host, db, user, select_priv from db; +-----------+-------+------+-------------+ | host | db | user | select_priv | | localhost | haksa | lee | Y | | % | haksa | choi | Y | | localhost | haksa | kim | Y | 3 rows in set (0.00 sec) ① mysql> drop user kim@localhost; ② mysql> delete from user where user='lee'; ③ mysql> delete from db where user='lee'; ①의 경우는 사용자 “kim”을 완전히 삭제 처리한 경우 ②의 경우는 “user”테이블에서 사용자 “lee”를 삭제한 경우 ③의 경우는 “db”테이블에서 사용자 “lee”를 삭제한 경우 2019-02-05 쉽게 배우는 MySQL 5.x
[형식] revoke SQL명령문 on DB명.* from '해당유저이름'; 사용자 권한 회수 [일반형식] revoke priv_type [(column_list)] [, priv_type [(column_list)] ...] on tbl_name | * | *.* | db_name.* from user_name [, user_name ...] [형식] revoke SQL명령문 on DB명.* from '해당유저이름'; ① mysql> revoke select on haksa.* from choi@'%'; Query OK, 0 rows affected (0.00 sec) ② mysql> revoke select, update on haksa.* from lee@'localhost'; ① 사용자 “choi”을 “haksa” 데이터베이스에서 select할 수 있는 권한 회수 ② 사용자 “lee”을 “haksa” 데이터베이스에서 select, update 권한 회수 mysql> flush privileges; 사용자 “kim”과 “lee”의 권한이 회수되었는지 확인해 보자. mysql> select host, db, user, select_priv, update_priv from db; +-----------+-------+------+-------------+-------------+ | host | db | user | select_priv | update_priv | | localhost | haksa | lee | N | N | | % | haksa | choi | N | Y | 2 rows in set (0.00 sec) 2019-02-05 쉽게 배우는 MySQL 5.x