[sql] mysql 심화 - 뷰,인덱스,트랜잭션,권한 등

이유은·2023년 11월 23일

[Sql]

목록 보기
5/5

🔺 기본키, 고유키, 외래키

챕터 3에 나온 내용임 다시 복습

1. 기본키 (primary key)

  • 중복되지 않는 고유값만 허용
  • null 값 허용하지 않음
  • 테이블당 하나의 기본키만 지정 가능

    기본으로는 이렇게 하는데

    이런식으로 마지막에 지정도 가능합니다.

1-1 기본키 변경하기
alter table people Drop primary key;
이렇게 하면 어차피 테이블당 프라이머리 키는 하나니까 ~ 기본키 삭제됨.
alter table people add primary key (last_name);
이렇게 추가도 가능!

1-2 다중 기본키
프라이머리키를 여러개 둔다는 것이 아니라, 프라이머리키 안에 컬럼이 여러개 들어갈 수 있음
무슨말이냐? 컬럼들이 겹치지 않으면 됨..(?)
두가지가 다 같지 않아야 함 , 예를들어 펄스트네임, 라스트네임을 묶어서 프라이머리키로 했다면
같은 홍씨 같은 전씨 는 상관없고 같은 이름도 상관 없지만 , 같은 성+이름 조합이면 안되는 것!

2. 고유키(unique) 더 알기

  • 중복제한, null 값 가능
  • 기본키랑 똑같이, 옆에 unique 작성
  • 마지막에 unique(first_name) 해도 됨
  • 다중고유키도 같음!

3. 외래키

  • 외래키 추가하기

  • 지정하는 것도 있고 아닌 것도 있음

  • 용도상 개념은 섹션과 비즈니스 등 테이블간의 연결!!

  • 제약이 있지 않음 . 없는 번호라든지 중간 삭제해서 붕뜬다든지 하는 경우를 컨트롤 해주지 않음!

    요렇게 설정!

  • 외래키 삭제하기
    ALTER TABLE _자식테이블명 DROP FOREIGN KEY _자식테이블외래키

  • 외래키 제약


🔺 뷰-가상의 테이블

실제 테이블이 아니라 실제테이블에서 어떤 셀렉트문을 실행한 결과 또는 실제테이블들을 조인하거나 서브쿼리들을 이어서 표형태의 어떤 결과물을 출력한 것을 실제 테이블처럼 사용할 수 있도록 이름을 지어서 저장한 것

-- 뷰 생성
CREATE VIEW section_view AS
SELECT section_id, section_name
FROM sections;

쿼리를 테이블로 저장 하듯 !

-- 뷰 조회
SELECT * FROM section_view;

-- 뷰 삭제
DROP VIEW section_view;

왜 사용하는가 ?

1. 보안 - 테이블 구조 및 내용 숨기기
최상위 관리자 계정 말고 다른 계정에서는 한정된 테이블만 접근해야 한다면?
일부만 자유롭게 허가 하고 싶다면 !! 뷰를 만들어서 -> 일부 내용만 보게 권한을 줌!!

2. 편의 - 복잡한 쿼리 사전 구현
매번 쿼리 길게 쳐서 실행하는 것 귀찮으니까 그걸 한줄로 구현 해놔 !!

** 내용 수정이 가능한 뷰

위 내용 참고!


🔺 인덱스

다량의 데이터가 필요해욤
특정 컬럼에 대한 목차생성 - 검색 가속화
테이블 내용변경(추가,수정,삭제)시 시간 더 소모

** 인덱스를 사용하기 적합한 곳

  • 데이터의 변경이 잦지 않은 테이블
  • where, order by에 자주 사용되는 컬럼
  • join에 사용되는 컬럼
  • cardinality가 높은 컬럼 = 중복도가 낮은 컬럼 // 성별: 부적합, 이름: 적합!

** 인덱스의 종류(알고만 있어두댕)
1. B-Tree 인덱스

  • 기본인덱스
  • cardinality가 높은 컬럼에 적합

2. full-text 인덱스

  • 내용이 긴 텍스트에 유용
  • 데이터를 일정 단위로 분할하여 인덱싱
  • 특정 단어나 글 조각 찾을 때 유용

3. Hash 인덱스

  • 일치여부만 확인 (= 가능, >,>=,<,<=,like 등 불가)
  • 인덱스 크기가 작고 검색이 매우 빠름

4. 비트맵 인덱스

  • cardinality 낮은 컬럼에 적합
  • mysql에는 없음 ...

🔺 트랜잭션, 함께가 아니면 하지 않아!

만드는 프로그램에서 , 내부적으로 , 트랜잭션~ 돌린다 알고있기 위해..
모든 구문이 성공,혹은 실패 하도록 하기 위해
원자성을 갖기위해? 먼소리야
원자 - 더 나눠지지 않음
여러 구문을 실행했을 때, 어떤 것은 실패하고 어떤것은 성공하면 안되니까..?
은행 송금한다치면 a가 b한테 돈을 보내면 a계좌에선 빠져나가고 b는 입금돼야해
그런데 이 거래가 이뤄지는 순간에 오류발생해서
잘 안됐다면? 출금만 되고 입금이 되지 않았따면? 문제 생김
이런걸 막기위해 트랜잭션이 사용됨!

-- 트랜잭션 시작
START TRANSACTION;

DELETE FROM sections
WHERE section_id > 0;

SELECT * FROM sections;

-- 롤백
ROLLBACK;

SELECT * FROM sections;

일련의 작업을 하고 문제 생겨서 다시 백지화 시켜야 할때 - 롤백 쓰임
트랜잭션 지점까지 돌아가는듯..(?)

commit

  • 메모리상의 변화를 영구저장

savepoint

  • 롤백할 중간지점 설정
    savepoint 000;
    rollback to 000;

🔺 사용자와 권한 다루기

현재까지는 루트 계정을 이용했어!
루트 계정이라 함은 처음 깔 때 생기는 최고 권한

다양하게 활용할 때 루트계정 사용하면 위험, 실수, 악용, 해킹 위험 있어요
권한이 제한된 부계정을 만들어서 그걸로 사용하는 것이 좋아요

USE mysql;
SELECT * FROM user;

이거하면은 현재 내컴퓨터에 어떤 사용자가 있는지 살펴볼 수 있음!

localhost 127.0.0.1 현재 내컴퓨터 말함

새 사용자 추가해보자!!!

-- CREATE USER '사용자명'@'접속위치' IDENTIFIED BY '비밀번호';

-- CREATE USER 'user_1'@'localhost' IDENTIFIED BY 'abcdefg';
-- CREATE USER 'user_1'@'12.345.678.90' IDENTIFIED BY 'abcdefg';

CREATE USER 'user_1'@'%' IDENTIFIED BY 'abcdefg';
어떤위치든 가능하면 %로!!!
iden ~ 다음은 패스워드!!

그럼 추가돼용. ^^!

사용자 삭제
DROP USER 'user_1'@'%';

권한 !!!!!!!!!!

-- 사용자에 권한 추가
GRANT SELECT ON mydatabase.businesses
TO 'user_1'@'%';

// 그랜트 다음 ㅇㅇㅇ / 셀렉트 할 권한을 준거임!

GRANT UPDATE, DELETE ON mydatabase.businesses
TO 'user_1'@'%';
// 이렇게 업데이트 딜리트까지 주면댐 ~~

-- 사용자 권한 조회
SHOW GRANTS FOR 'user_1'@'%';

실수로 잘못주거나 바꿔야할 때

-- 사용자 권한 박탈
REVOKE DELETE ON mydatabase.businesses
FROM 'user_1'@'%';
//그랜트만 revoke로

SHOW GRANTS FOR 'user_1'@'%';

-- 데이터베이스의 모든 권한 부여
GRANT ALL PRIVILEGES ON mydatabase.*
TO 'user_1'@'%';
// 모든거주고싶으면 all ㄱㄱ

얄코 수업 참고(유료강의 부분)
https://www.yalco.kr/@sql-adv/4-2/

profile
우당탕코딩

0개의 댓글