mysql 기본 명령어
database만들기
database: 데이터가 실질적으로 적재되는 테이블들을 분류하는 상위 개념
만드는 방법:
CREATE DATABASE `limsangwoon` CHARACTER SET utf8 COLLATE utf8_general_ci;
로 해주면 limsangwoon 이라는 datebase 이 만들어 진다]
그다음에
show databases;
를 하여
현재 데이터 베이스 서버의 생성된 데이터 베이스 리스트가 나오는데 우리가 만든 데이터 베이스도 있을 것이다
이번에는 우리가 만들었던 데이터 베이스를 삭제해 보자
방법:
drop database 'limsangwoon';
이라고 치면 된다
그 다음으로는
CREATE DATEBASE `class` CHARCTER SET utf8 COLLATE utf8_general_ci;
으로 데이터 베이스 생성 후
use class;
만든 데이터베이스을 사용하겠다는 use를 써준다
table
데이터가 실질적으로 저장되는 저장소
스키마
테이블에 적재될 데이터의 구조와 형식을 정의 하는 것
실습)
CREATE TABLE `student` (
`id` tinyint NOT NULL ,
`name` char(4) NOT NULL ,
`sex` enum('남자','여자') NOT NULL ,
`address` varchar(50) NOT NULL ,
`birthday` datetime NOT NULL ,
PRIMARY KEY (`id`)
);
생성한 후 테이블을 확인하고 싶으면
show tables;
라고 해주면 된다
show tables;는 그냥
테이블이 잘 생성 되었는지 보여주지만
desc student;
로 보면 안에 설정한 속성들과 이름들을 보여준다
NULL은 어떤 값이 존재하지 않는다 즉 NULL을 사용하면 값이 존재하지 않을 수 있다 (NULL값을 허용한다)
NOT NULL은 값이 존재해야 한다 이런 식이라고 보면 된다 (NULL값을 허용하지 않는다)
Default는 어떤 값을 지정하지 않고 사용했을 때 기본적으로 들어갈 값이다(해당 필드값을 전달하지 않으면, 자동으로 성정된 기본값을 저장하는 것이다 그 설정을 default에서 하는 것이고)
데이터 타입에 대해
중요한 데이터 타입
--문자
char() // 0 ~ 255자까지 표현 가능 고정 문자
varchar() // 0 ~255 가변 문자
이 둘의 공통점은 (숫자) 만큼 숫자byte만큼 공간이 할당된다는 것이고 둘 다 대소문자를 구분하지 않는다
이 둘의 차이점은 char는 20byte로 공간을 할당 해두고 2 byte만큼의 문자만 넣어도 20byte만큼의 데이터를 잡게 된다는 것이다. 이것이 char 고정 문자의 특성이고
varchar는 20byte에서 2byte의 문자를 넣으면 딱 넣은 2byte만큼만 공간을 차지한다는 것이다
char에서는 고정된 것
varchar은 주소 처럼 많이 변하는 것을 지정해 주면 유리하다
text는 최대 65535 문자 길이가 들어가는 것으로 자연어 검색을 가능하게 하기도 한다
text는 그만큼 용량을 많이 사용하기 때문에 많은 용량을 사용할 때 text를 사용하라(문자형)
--숫자
int() -2147483648~2147483648 까지 사용 가능하다 하지만 UNSIGNED를 사용하면 0~4294967295까지 사용 가능하다
tinyint() : -128 ~ - 127 까지 사용 가능하다 하지만 UNSIGNED를 사용하면 0~255까지 사용 가능하다
MEDIUMINT()
FLOAT() : 작은 부동 소수점
DOUBLE(.) : 큰 부동 소수점 //소수점이 필요한 경우
--날짜
DATE : YYYY-MM-DD 는 Y는 년도 M은 월 D 날
DATETIME : YYYY-MM-DD HH:MM:SS 년 월 일 시 분 초 까지 기록 가능
--정해진 값
ENUM(): 정해진 값을 넣어한다
이번에는 삽입에 관련된 것이다
INSERT INTO table_name VALUES(value1,value2,value3....) // 이것도 마찬가지로 컬럼의 순서대로 작성해야 한다
INSERT INTO table_name(column1,column2,coloumn3...) VALUES (value1,value2,value3.....) // 앞에 있는 컬럼들과 정확하게 일치해야만 한다
실습)
INSERT INTO `student` VALUES('2','leez','여자','서울','2000-10-26');
하면 값이 들어갈 것이다(컬럼의 크기를 잘 파악해 줘야 한다)
SELECT * FROM student;
치면 student 의 입력한 값을 알 수 있다
INSERT INTO `student`(`id`,`name`,`sex`,`address`,`birthday`)VALUES('1','egoi','남자','seoul','2000-11-16');
이렇게 해주면 된다
두 번째 insert로 하는 이유가 뭘까 굳이 컬럼을 써가면서 시간을 낭비할 필요가 있을까?
그 이유는 쓸 필요가 없는 데이터를 넣지 않아도 된다는 것이다
본인이 넣고 싶은 컬럼들만 열어서 값을 넣어주면 되기 때문이다
실습)
INSERT INTO `student`(`id`,`name`,`sex`,`address`)VALUES('1','egoi','남자','seoul');
이렇게 해서 넣으려고 한다
하지만 잘 안 될 것이다
그 이유는 우리가 테이블을 생성할 때 PRIMARY(`id`)로 설정했기 때문이다
기본키 = PRIMARY 는 중복이 되면 안 되기 때문이다
그렇다면 3으로 값을 바꾸어 준다음 삽입을 해보자
INSERT INTO `student`(`id`,`name`,`sex`,`address`)VALUES('3','egoi','남자','seoul');
값이 들어간다
근데 mysql 사용할 시 안 될 수도 있다
이번에는 변경이다
문법:
UPDATE 테이블명 SET 컬럼1 = 컬럼1의 값, 컬럼2 = 컬럼2의 값 WHERE 대상이 될 컬럼명 = 컬럼의 값
일단 UPDATE를 사용하기 전에
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
`id` tinyint(4) NOT NULL,
`name` char(4) NOT NULL,
`sex` enum('남자','여자') NOT NULL,
`address` varchar(50) NOT NULL,
`birthday` datetime NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `student` VALUES (1, '이숙경', '여자', '청주', '1982-11-16 00:00:00');
INSERT INTO `student` VALUES (2, '박재숙', '남자', '서울', '1985-10-26 00:00:00');
INSERT INTO `student` VALUES (3, '백태호', '남자', '경주', '1989-2-10 00:00:00');
INSERT INTO `student` VALUES (4, '김경훈', '남자', '제천', '1979-11-4 00:00:00');
INSERT INTO `student` VALUES (8, '김정인', '남자', '대전', '1990-10-1 00:00:00');
INSERT INTO `student` VALUES (6, '김경진', '여자', '제주', '1985-1-1 00:00:00');
INSERT INTO `student` VALUES (7, '박경호', '남자', '영동', '1981-2-3 00:00:00');
이 코드를 입력해 개발 환경을 만들어 준다
만약 UPDATE와 DELETE가 사용되지 않는다면
https://jun7222.tistory.com/371
MySQL workbench safe mode 해제하기
Error Code: 1175. You are using safe mode and you tried to update a table without a WHERE that uses a KEY column To disable safe mode. MySQL workbench에서 table을 UPDATE나 DELETE할 때 where 조건절을..
jun7222.tistory.com
여기에서 설정하라는 데로 해라
UPDATE 'STUDENT' SET ADDRESS = '서울';
이라고 한 후에
SELECT * FROM STUDENT 로 확인 해주면
address 부분이 전부 서울로 되어 있을 것이다
이번에는 이름을 바꿀 것인데 address처럼 다 바꾸는 것이 아니라 어느 부분을 바꾸는 것을 해 보겠다
UPDATE `student` SET name = '이진경' where id = 1; // name을 변경하는데 where id 부분에 1쪽을 한다
select * from student; 을 하면 변경 된 것이 보일 것이다
update `student` set name = '이고잉', birthday = '2001-4-1' where id = 3;
3번 id 행에서 birthday와 name을 둘 다 바꿔 주는 실습이다
데이터나 테이블 삭제
문법:
DELETE FROM 테이블명 WHERE 삭제하려는 칼럼 명 = 값
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
`id` tinyint(4) NOT NULL,
`name` char(4) NOT NULL,
`sex` enum('남자','여자') NOT NULL,
`address` varchar(50) NOT NULL,
`birthday` datetime NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `student` VALUES (1, '이숙경', '여자', '청주', '1982-11-16 00:00:00');
INSERT INTO `student` VALUES (2, '박재숙', '남자', '서울', '1985-10-26 00:00:00');
INSERT INTO `student` VALUES (3, '백태호', '남자', '경주', '1989-2-10 00:00:00');
INSERT INTO `student` VALUES (4, '김경훈', '남자', '제천', '1979-11-4 00:00:00');
INSERT INTO `student` VALUES (8, '김정인', '남자', '대전', '1990-10-1 00:00:00');
INSERT INTO `student` VALUES (6, '김경진', '여자', '제주', '1985-1-1 00:00:00');
INSERT INTO `student` VALUES (7, '박경호', '남자', '영동', '1981-2-3 00:00:00');
일단 설정을 해둠
delect from student where id = 2;
select * from student;
id =2인 것이 삭제 되어 있음을 알 수 있다
delete from student;
하면 student 안에 있는 모든 데이터가 사라진다
TRUNCATE student;
student의 모든 정보가 사라진다
나중에 배울 외래키를 삭제하는데 좋다
이번에는 table을 삭제하는 명령어이다
drop table student
show tables
로 table이 삭제가 됬는지 확인한다
조회
테이블에서 데이터를 조회
select
select * from student where id = 3;
이런식으로 그 줄을 볼 수가 있고
select * from student where sex = '남자' and address= '서울';
두 개의 조건이 만족하는 줄을 출력한다
select * from student where sex = '여자' or birthday = '~~(알아서 치세요)' ;
or은 둘 중 하나만 만족해도 출력함
select * from student LIMIT 3;
STUDENT 테이블에서 3번째 줄 데이터까지 출력
SELECT * FROM STUDENT LIMIT 0,1; //0번째 데이터에서 1개의 데이터를 조회한다
SELECT * FROM STUDENT LIMIT 1,1;
SELECT * FROM STUDENT LIMIT 2,1;
SELECT * FROM STUDENT WHERE SEX = '남자' LIMIT 2; //SEX가 남자인 데이터를 2개 불러온다
그룹핑
GORUP BY
특정 칼럼을 기준으로 데이터를 그룹핑하는 것이다
SELECT *FROM 테이블명 GROUP BY 그룹핑 할 기준 칼럼명
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
`id` tinyint(4) NOT NULL,
`name` char(4) NOT NULL,
`sex` enum('남자','여자') NOT NULL,
`address` varchar(50) NOT NULL,
`distance` INT NOT NULL,
`birthday` datetime NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `student` VALUES (2, '박재숙', '남자', '서울', 10, '1985-10-26 00:00:00');
INSERT INTO `student` VALUES (1, '이숙경', '여자', '청주', 200, '1982-11-16 00:00:00');
INSERT INTO `student` VALUES (3, '백태호', '남자', '경주', 350, '1989-2-10 00:00:00');
INSERT INTO `student` VALUES (4, '김경훈', '남자', '제천', 190, '1979-11-4 00:00:00');
INSERT INTO `student` VALUES (8, '김정인', '남자', '대전', 200, '1990-10-1 00:00:00');
INSERT INTO `student` VALUES (6, '김경진', '여자', '제주', 400, '1985-1-1 00:00:00');
INSERT INTO `student` VALUES (7, '박경호', '남자', '영동', 310, '1981-2-3 00:00:00');
기본적인 세팅을 하고 이번 테이블에는 DISTANCE라는 거리를 측정하는 칼럼이 추가 되었다
select sex from student group by sex;
sex 컬럼 안에서 sex의 값이 무엇이 있는지 보여줌
group 이란
예
이렇게 생긴 테이블에서
type을 그룹화 한다고 치면 1234로 쪼르륵 나온다
실습 2
select sex, sum(distance) , avg(distance) from student group by sex;
칼럼 sex의 값과 sum의 값과 avg의 값을 보여주는데 sum은 거리의 합 avg는 거리의 평균을 구해주는 명령어 이다
이렇게 그룹을 쓰면 합계나 평균을 쉽고 간단하게 구할 수 있다
정렬
ORDER
저장된 컬럼을 기준으로 행을 정렬
SELECT * FROM 테이블명 ORDER BY 정렬의 기준으로 사용할 열 DESC | ASC
DESC는 큰게 먼저 오고 점점 작아지게 정렬하는 방식
ASC 는 작은 게 먼저 오고 점점 작아지게 정렬하는 방식
그럼 기본 구성을 해주자
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
`id` tinyint(4) NOT NULL,
`name` char(4) NOT NULL,
`sex` enum('남자','여자') NOT NULL,
`address` varchar(50) NOT NULL,
`distance` INT NOT NULL,
`birthday` datetime NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `student` VALUES (2, '박재숙', '남자', '서울', 10, '1985-10-26 00:00:00');
INSERT INTO `student` VALUES (1, '이숙경', '여자', '청주', 200, '1982-11-16 00:00:00');
INSERT INTO `student` VALUES (3, '백태호', '남자', '경주', 350, '1989-2-10 00:00:00');
INSERT INTO `student` VALUES (4, '김경훈', '남자', '제천', 190, '1979-11-4 00:00:00');
INSERT INTO `student` VALUES (8, '김정인', '남자', '대전', 200, '1990-10-1 00:00:00');
INSERT INTO `student` VALUES (6, '김경진', '여자', '제주', 400, '1985-1-1 00:00:00');
INSERT INTO `student` VALUES (7, '박경호', '남자', '영동', 310, '1981-2-3 00:00:00');
SELECT FROM으로 조회
SELECT * FROM STUDENT ORDER BY DISTANCE DESC;
거리를 점점 작아지게 만드는 형태이다
DESC 내림차순
SELECT * FROM STUDENT ORDER BY DISTANCE ASC;
ASC 오름 차순으로
DINSTANCE 가 점점 커지는 형태
SELECT * FROM order by distance desc, address asc;
먼저 앞에 있는 distance를 기준으로 내림차순 정렬이 되고 distance 안에서 중복이 되는 값 안에서 address값이 오름차순 정렬이 된다
조회
index에 대해
색인, 조회할 때 원하는 행을 바르게 찾을 수 있게 준비해둔 데이터
primary: 중복되지 않는 유일한 키
normal: 중복을 허용하는 인덱스
unique: 중복을 허용하지 않는 유일한 키
foreign : 다른 테이블과의 관걔성을 부여하는 키
full text:자연어 검색 , myisam에서만 지원
이것들을 전부 인덱스라고 한다
실습 환경 설정
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
`id` tinyint(4) NOT NULL AUTO_INCREMENT,
`name` char(4) NOT NULL,
`address` varchar(50) NOT NULL,
`department` enum('국문과','영문과','컴퓨터공학과','전자공학과','물리학과') NOT NULL,
`introduction` text NOT NULL,
`number` char(255) NOT NULL,
PRIMARY KEY (`id`), # 중복이 없음
UNIQUE KEY `idx_number` (`number`) USING BTREE, # 중복이 없음
KEY `idx_department` (`department`), # normal key
KEY `idx_department_name` (`department`,`address`), #중복키
FULLTEXT KEY `idx_introduction` (`introduction` ) # full text
) ENGINE=MyISAM AUTO_INCREMENT=9 DEFAULT CHARSET=utf8;
INSERT INTO `student` VALUES (1, '이숙경', '청주', '컴퓨터공학과', '저는 컴퓨터 공학과에 다닙니다. computer', '0212031');
INSERT INTO `student` VALUES (2, '박재숙', '서울', '영문과', '저는 영문과에 다닙니다.', '0512321');
INSERT INTO `student` VALUES (3, '백태호', '경주', '컴퓨터공학과', '저는 컴퓨터 공학과에 다니고 경주에서 왔습니다.', '0913134');
INSERT INTO `student` VALUES (4, '김경훈', '제천', '국문과', '제천이 고향이고 국문과에 다닙니다.', '9813413');
INSERT INTO `student` VALUES (6, '김경진', '제주', '국문과', '이번에 국문과에 입학한 김경진이라고 합니다. 제주에서 왔어요.', '0534543');
INSERT INTO `student` VALUES (7, '박경호', '제주', '국문과', '박경호입니다. 잘 부탁드립니다.', '0134511');
INSERT INTO `student` VALUES (8, '김정인', '대전', '영문과', '김정인입니다. 대전에서 왔고, 영문과에 다닙니다.', '0034543');
primary key
- 테이블 전체를 통틀어서 중복되지 않는 값을 지정해야 한다.
- where 문을 이용해서 데이터를 조회할 때 가장 고속으로 데이터를 가져올 수 있다.
- 테이블마다 딱 하나의 primary key를 가질 수 있다.
select * from student where id = 3;
unique key
- 테이블 전체를 통틀어서 중복되지 않는 값을 지정해야 한다. (== primary key)
- 고속으로 데이터를 가져올 수 있다.
- 여러개의 unique key를 지정할 수 있다.
select * from student where number=0534543;
normal key
- 중복을 허용한다.
- primary, unique 보다 속도가 느리다.
- 여러개의 키를 지정할 수 있다.
select * from student where department = '국문과'
Full Text
- mysql의 기본설정(ft_min_word_len)이 4로 되어 있기 때문에 최소 4글자 이상을 입력하거나 이 값을 조정해야 한다.
- mysql은 전문 검색 엔진이 아니기 때문에 한글 검색이 잘 안된다.
전문검색엔진으로 lucene, sphinx 참고 - 스토리지 엔진 중 myisam에서만 사용가능
select introduction, MATCH(intorduction) AGAINST('영문과에') FROM STUDENT WHERE MATCH (introduction) AGAINST('영문과에');
하지만 스토리지 엔진은 engine = myisam 를 저렇게 create 한 후에 처 줘야 가능하다
한국어를 잘 인식 못 할 수도 있다
중복키
- 하나의 키에 여러개의 칼럼을 포함
1 | select * from student where department='국문과' AND address='제주'; |
인덱스의 정의 방법
- 자주 조회되는 칼럼에 적용
- 조회 시 오랜시간을 소모하는 컬럼에 적용
- 데이터가 긴 경우 인덱스를 사용하지 않는다.
join
여러개의 테이블 사용하기
이터의 규모가 커지면서 하나의 테이블로 정보를 수용하기가 어려워지면 테이블을 분활하고 테이블 간의 관계성을 부여한다
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
`id` tinyint(4) NOT NULL,
`name` char(4) NOT NULL,
`sex` enum('남자','여자') NOT NULL,
`address` varchar(50) NOT NULL,
`distance` INT NOT NULL,
`birthday` datetime NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `student` VALUES (2, '박재숙', '남자', '서울', 10, '1985-10-26 00:00:00');
INSERT INTO `student` VALUES (1, '이숙경', '여자', '청주', 200, '1982-11-16 00:00:00');
INSERT INTO `student` VALUES (3, '백태호', '남자', '경주', 350, '1989-2-10 00:00:00');
INSERT INTO `student` VALUES (4, '김경훈', '남자', '제천', 190, '1979-11-4 00:00:00');
INSERT INTO `student` VALUES (8, '김정인', '남자', '제주', 400, '1990-10-1 00:00:00');
INSERT INTO `student` VALUES (6, '김경진', '여자', '제주', 400, '1985-1-1 00:00:00');
INSERT INTO `student` VALUES (7, '박경호', '남자', '영동', 310, '1981-2-3 00:00:00');
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
`id` tinyint(4) NOT NULL,
`name` char(4) NOT NULL,
`sex` enum('남자','여자') NOT NULL,
`location_id` tinyint(4) NOT NULL,
`birthday` datetime NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
ROP TABLE IF EXISTS `location`;
CREATE TABLE `location` (
`id` tinyint UNSIGNED NOT NULL AUTO_INCREMENT ,
`name` varchar(20) NOT NULL ,
`distance` tinyint UNSIGNED NOT NULL ,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;;
# 위에 테이블을 보면 알 수 있다 우리는 지금 위에 태이블을 분활하여 다른 함수에다가 넣은 것이다
INSERT INTO `location` VALUES (1, '서울', 10);
INSERT INTO `location` VALUES (2, '청주', 200);
INSERT INTO `location` VALUES (3, '경주', 255);
INSERT INTO `location` VALUES (4, '제천', 190);
INSERT INTO `location` VALUES (5, '대전', 200);
INSERT INTO `location` VALUES (6, '제주', 255);
INSERT INTO `location` VALUES (7, '영동', 255);
INSERT INTO `location` VALUES (8, '광주', 255);
INSERT INTO `student` VALUES (1, '이숙경', '여자', 1, '1982-11-16 00:00:00');
INSERT INTO `student` VALUES (2, '박재숙', '남자', 2, '1985-10-26 00:00:00');
INSERT INTO `student` VALUES (3, '백태호', '남자', 3, '1989-2-10 00:00:00');
INSERT INTO `student` VALUES (4, '김경훈', '남자', 4, '1979-11-4 00:00:00');
INSERT INTO `student` VALUES (6, '김경진', '여자', 5, '1985-1-1 00:00:00');
INSERT INTO `student` VALUES (7, '박경호', '남자', 6, '1981-2-3 00:00:00');
INSERT INTO `student` VALUES (8, '김정인', '남자', 5, '1990-10-1 00:00:00');
student 테이블에서 location_id 가 1 일 때 location 아이디가 (서울 10) 이고 2일 때 location 아이디가 (청주 200) 이다
JOIN의 종류
- OUTTER JOIN : 매칭되는 행이 없어도 결과를 가져오고 매칭되는 행이 없는 경우 NULL로 표시한다.
LEFT JOIN과 RIGHT JOIN이 있다. - INNER JOIN : 조인하는 두개의 테이블 모두에 데이터가 존재하는 행에 대해서만 결과를 가져온다.
LEFT JOIN
가장 많이 사용되는 조인의 형태
1 | SELECT s.name, s.location_id, l.name AS address, l.distance FROM student AS s LEFT JOIN location AS l ON s.location_id = l.id; |
AS 별명을 정의 함
student as s
location as l 로 정의 함
즉 l.distance 는 location 에 distance를 가르키고
s.location_id 는 student에 location_id를 가르킨다
LEFT JOIN(OUTTER JOIN의 한 형태)
LEFT JOIN 은 왼쪽을 기준으로 오른쪽의 테이블의 데이터를 가져온다
ON은 무엇이냐
ON은 location_id = l.id; 둘이 같다라는 조건을 주는 것이다
우리가
이걸하는 이유는 id도 123456~이렇게 숫자를 입력해 주었고 location_id또한 12345으로 지정을 해주었는데
on 이 없이 그냥 주면 어떤 데이터를 어디에다가 줄 지 알겠냐는 거다
그래서 location_id와 id를 동일하게 만들어서 id = 1 의 데이터는 location_id = 1에 들어가게 된다는 것이다
~~~!
여기서 다른 조건을 추가하면
select s.name, s.location_id , l.name as address, l.distance from student as s LEFT JOIN location as l ON s.location_id = l.id where l.distance = 10;
출력
이숙경 1 서울 10 이런식으로 출력이 된다
OUTTER JOIN과 INNER JOIN의 차이
Location에서 제주를 삭제 후 OUTTER JOIN(LEFT JOIN)과 INNER JOIN의 차이를 비교
DELETE FROM location WHERE name='제주';
SELECT s.name, s.location_id, l.name AS address, l.distance FROM student AS s LEFT JOIN location AS l ON s.location_id = l.id;
제주가 없어졌어도 제주 값만 NULL이 되고 나머지 값들은 살아 있다
SELECT s.name, s.location_id, l.name AS address, l.distance FROM student AS s INNER JOIN location AS l ON s.location_id = l.id;
제주가 없어지면 그 행이 전부 없어진다
INNER JOIN // 삭제 되면 그 행을 없엔다
OUTTER JOIN // 삭제 되었어도 삭제된 값만 NULL을 하고 다른 값들은 살려 둔다
사용자 관리
권한이란
사용자에 따라서 접근할 수 있는 데이터와 사용할 수 있는 기능을 제한
GRANT 권한 ON 데이터베이스.테이블 TO '아이디'@'호스트'IDENTIFIED BY '비밀 번호'
사용자의 제한
데이터베이스 서버에 접속하는 사용자를 제한한다. // 동일한 아이디를 가지고 있을 경우에 허용된다
아이디@호스트 중에서 호스트는 접속자가 사용하는 머신의 IP를 의미한다. IP를 특정하지 않으려면 '%' 를 사용
egoing @ 123.100.100.100 :IP 123.100.100.100 인 머신에서 접속한 ID egoing
egoing@%: IP 관계없이 ID 가 egoing 인 사용자
대상의 제한
사용자가 제어할 대상이 되는 데이터 베이스, 테이블을 지정
*를 사용하면 모든 데이터베이스,테이블을 제어 대상으로 함
권한(기능) 사용할 수 있는 권한을 제한(권한은 아래 표 참조)
예)
GRANT all ON class.student
모든 권한을 class 라는 데이터 베이스 아래 student 테이블에 주겠다는 것이다
GRANT all ON class.*
class데이터 베이스 아래있는 테이블에게 모든 권한
권한 템플릿
예) //역할의 분배
개발자 : DELETE,INSERT,SELECT,UPDATE
설계자:ALTER,CREATE,DELETE,DROP,INDEX,INSERT,SELECT,UPDATE,DELETE,INSERT,SELECT,UPDATE
DBA:ALL // DBA 데이타 베이스 관리자
예제)
GRANT DELETE,INSERT,SELECT,UPDATE ON class.* TO `dev`@`%` IDENTIFIED BY '1234';
일단 DELETE,INSERT,SELECT,UPDATE 를 쓸 수 있고
이 권한을 CLASS.*에 주며
DEV라는 ID를 가진 사용자가 IP 상관없이 들어올 수 있고 IDENTIFIED BY '1234' 는 비밀번호를 뜻 한다
GRANT ALTER, CREATE, DELETE, DROP, INDEX, INSERT, SELECT, UPDATE, DELETE, INSERT, SELECT,
UPDATE ON *.* TO `archi`@`100.100.100.100` IDENTIFIED BY '1234';
SHOW GRANTS
자신의 권한이나, 특정 사용자의 권한을 열람
SHOW GRANTS [FOR 사용자]
예제) SHOW GRANTS FOR DEV;
SHOW GRANTS를 하면 자신의 권한만 볼 수 있고
SHOW GRANTS FOR [특정 아이디] 하면 자신 이외의 권한을 볼 수 있다
REVOKE
사용자의 권한을 제거
문법
REVOKE 권한 ON 데이터 베이스 테이블 FROM 사용자
사용자 DEV의 데이터베이스 CLASS 의 DELETE 권한을 제거
REVOKE DELETE on class.* from dev;
DROP USER
사용자를 삭제
문법
DROP USER user[,user]...
예제
DROP USER `dev`@`%`;
user dev 를 없앤다는 뜻
프로그래밍과 데이터베이스의 관계
1.프로그래밍과 데이터베이스는 무관하다
2. 데이터베이스는 독립적인 시스템으로 프로그래밍과 상관 없이 사용될 수 있다
3.데이터베이스를 이해하고 있다면 여기 프로그래밍을 결합해서 더 많은 일을 할 수 있다.
API
데이터 베이스는 API 를 제공한다
PHP와 같은 프로그래밍 언어들은 이 API 를 이용해서 데이터베이스를 이용한다
데이터 베이스의 내용을 웹으로 출력하기
STEP 1 . 데이터 입력
CREATE DATABASE `class` CHARACTER SET utf8 COLLATE utf8_general_ci;
USE class;
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
`id` tinyint(4) NOT NULL AUTO_INCREMENT,
`name` char(4) NOT NULL,
`address` varchar(50) NOT NULL,
`department` enum('국문과','영문과','컴퓨터공학과','전자공학과','물리학과') NOT NULL,
`introduction` text NOT NULL,
`number` char(255) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `idx_number` (`number`) USING BTREE,
KEY `idx_department` (`department`),
KEY `idx_department_name` (`department`,`address`),
FULLTEXT KEY `idx_introduction` (`introduction`)
) ENGINE=MyISAM AUTO_INCREMENT=9 DEFAULT CHARSET=utf8;
INSERT INTO `student` VALUES (1, '이숙경', '청주', '컴퓨터공학과', '저는 컴퓨터 공학과에 다닙니다. computer', '0212031');
INSERT INTO `student` VALUES (2, '박재숙', '서울', '영문과', '저는 영문과에 다닙니다.', '0512321');
INSERT INTO `student` VALUES (3, '백태호', '경주', '컴퓨터공학과', '저는 컴퓨터 공학과에 다니고 경주에서 왔습니다.', '0913134');
INSERT INTO `student` VALUES (4, '김경훈', '제천', '국문과', '제천이 고향이고 국문과에 다닙니다.', '9813413');
INSERT INTO `student` VALUES (6, '김경진', '제주', '국문과', '이번에 국문과에 입학한 김경진이라고 합니다. 제주에서 왔어요.', '0534543');
INSERT INTO `student` VALUES (7, '박경호', '제주', '국문과', '박경호입니다. 잘 부탁드립니다.', '0134511');
INSERT INTO `student` VALUES (8, '김정인', '대전', '영문과', '김정인입니다. 대전에서 왔고, 영문과에 다닙니다.', '0034543');
STEP2.웹 페이지 만들기
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" >
<style>
table{border:1px solid gray; border-collapse:collapse;}
td{border:1px solid gray;padding:5px;}
</style>
</head>
<body>
<?php
$conn = mysql_connect("localhost", "root", "1234");
mysql_query('SET NAMES utf8');
if (!$conn) {
echo "Unable to connect to DB: " . mysql_error();
exit;
}
if (!mysql_select_db("class")) {
echo "Unable to select mydbname: " . mysql_error();
exit;
}
$sql = "SELECT *
FROM student
LIMIT 10";
$result = mysql_query($sql);
if (!$result) {
echo "Could not successfully run query ($sql) from DB: " . mysql_error();
exit;
}
if (mysql_num_rows($result) == 0) {
echo "No rows found, nothing to print so am exiting";
exit;
}
// While a row of data exists, put that row in $row as an associative array
// Note: If you're expecting just one row, no need to use a loop
// Note: If you put extract($row); inside the following loop, you'll
// then create $userid, $fullname, and $userstatus
echo "<table>";
while ($row = mysql_fetch_assoc($result)) {
echo "<tr><td>{$row['id']}</td><td>{$row['name']}</td><td>{$row['department']}</td></tr>";
}
echo "</table>";
mysql_free_result($result);
?>
</body>
</html>
나머지 설명은
https://www.youtube.com/watch?v=ECGuJLJpf1w&t=5s
여기서 들으세요 흐름을 아는 것이 중요합니다