공개

mysql 기본 명령어

sangwoon 2021. 6. 10. 21:25

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 

여기서 들으세요 흐름을 아는 것이 중요합니다