본문 바로가기

데이터 베이스

(21)
Ch.11 보안과 권한 관리 [데이터베이스 개론] 보안 데이터베이스의 보안을 유지하여 데이터를 보호하는 방법은 크게 세 가지 유형으로 구분된다. 물리적 환경에 대한 보안 자연재해처럼 데이터베이스에 물리적으로 손실을 발생시키는 위험으로부터 보호한다. 권한 관리를 통한 보안 접근이 허락된 사용자만 부여된 권한 내에서 데이터베이스를 사용할 수 있도록 한다. 계정이 발급된 사용자만 데이터베이스에 접근할 수 있도록 통제하고, 사용자별로 데이터베이스의 사용 범위와 수행 가능한 작업 내용을 제한할 수 있다. 운영 관리를 통한 보안 접근이 허락된 사용자들이 부여된 권한 내에서 데이터베이스를 사용하고, 정의된 제약조건을 위반하지 않도록 통제한다. 권한 관리를 통한 보안은 권한이 없는 사용자로부터 데이터베이스를 보호하는 것이고, 운영 관리를 통한 보안은 무결성 유지를 통..
Ch.10 회복과 병행 제어 [데이터베이스 개론] 트랜잭션 트랜잭션의 개념 트랜잭션(transaction)은 작업 하나를 수행하는 데 필요한 데이터베이스의 연산들을 모아놓은 것으로, 데이터베이스에서 논리적인 작업의 단위가 된다. 따라서 데이터베이스에 장애가 발생했을 때 데이터를 복구하는 작업의 단위가 된다. 데이터베이스는 항상 모순이 없는 정확한 데이터를 유지해야 한다. 그리고 장애가 발생하더라도 빠른 시간 내에 원래 상태로 복구할 수 있어야 한다. 이를 위해 DBMS는 다양한 기능을 제공하는데, 그 중심에 트랜잭션이 있다. 트랜잭션을 관리함으로써 데이터베이스의 회복과 병행 제어가 가능하다. 예를 들어, 인터넷뱅킹을 통해 계좌이체 작업을 수행하기 위해선 2개의 데이터베이스 연산을 처리해야 한다. 즉 계좌이체 트랜잭션은 2개의 연산으로 구성할 수 있다. ..
Ch.9 정규화 [데이터베이스 개론] 정규화의 개념과 이상 현상 정규화의 개념 데이터베이스를 설계한 후 설계 결과물을 검증하기 위해 사용한다. 데이터베이스를 잘못 설계하면 불필요한 데이터 중복이 발생하여 릴레이션에 대한 데이터의 삽입, 수정, 삭제 연산시 부작용이 발생할 수 있다. 이러한 부작용을 이상 현상이라고 하는데, 이상 현상을 제거하면서 데이터베이스를 설계해나가는 과정을 정규화라고 한다. 이상 현상의 종류 3가지 이상 현상이 존재한다. - 삽입 이상 : 새 데이터를 삽입하기 위해 불필요한 데이터도 함께 삽입해야 하는 문제 - 갱신 이상 : 중복 튜플 중 일부만 변경하여 데이터가 불일치하게 되는 모순의 문제 - 삭제 이상 : 튜플을 삭제하면 꼭 필요한 데이터까지 함께 삭제되는 데이터 손실의 문제 예시로 잘못 설계된 릴레이션을 참고해보자..
Ch.8 데이터베이스 설계 [데이터베이스 개론] - 데이터베이스 설계의 5단계를 설명하고, 각 단계에서 주요 작업은 무엇인가? 더보기 요구사항 분석 - 요구 사항 명세서 개념적 모델링 - 개념적 스키마(E-R 다이어그램) 논리적 모델링 - 논리적 스키마 물리적 모델링 - 물리적 스키마 구현 - 데이터베이스 - E-R 모델과 관계 데이터 모델의 차이는? 더보기 E-R 모델은 개체와 관계를 구분한다. 하지만 관계 데이터 모델의 개체와 관계를 구분하지 않고 모두 릴레이션으로 표현한다. 또 E-R 모델에서는 다중 값 속성과 복합 속성의 표현을 허용하는 반면, 관계 데이터 모델에선 허용하지 않는다. 데이터베이스 설계 단계 모든 조직 구성원들의 다양한 요구 사항을 만족시키는 데이터베이스 구축은 매우 어렵다. 그리고 데이터베이스는 한 번 잘못 구축되면 데이터베이스..
Ch.7 데이터베이스 언어 SQL [데이터베이스 개론] - 관계 해석과 SQL의 차이 : 관계 해석을 응용한 것이 SQL이다? - SQL문 직접 작성해보기 _ 테이블 생성 (제약조건, 외래키 설정) _ 원하는 데이터 조작하기 - 집계 함수의 종류와 주의 사항 더보기 SUM, AVG, COUNT, MAX, MIN SUM, AVG 는 숫자 데이터 타입만 사용할 수 있고, COUNT, MIN, MAX는 모든 데이터 타입에 사용 가능하다. NULL 값은 연산에 포함시키지 않으며, SELECT와 HAVING 절에서만 사용 가능하다. WHERE 절에선 사용 불가! - 뷰를 만들 수 있는 기반은 총 몇개이며 뭐라고 하는가? 더보기 기본 테이블, 뷰 - 뷰에 새로운 데이터를 추가할 때 WHERE 절에 정의된 조건의 데이터만 허용하는 키워드는 무엇인가? 더보기 WITH CH..
Ch.6 관계 데이터 연산 [데이터베이스 개론] - 관계 대수와 관계 해석의 공통점과 차이점 - 관계 대수의 종류 - 우리가 관계 대수와 관계 해석을 알아야 하는 이유 - 조인의 종류 관계 데이터 연산의 개념 연산(operation)은 원하는 데이터를 얻기 위해 릴레이션에서 필요한 처리 요구를 수행하는 것이다. 관계 데이터 모델의 연산은 크게 두 가지로 나뉜다. - 관계 대수 (relational algebra) - What + How 관계 대수는 수학적인 기법을 이용하여 데이터를 처리한다. 일련의 연산을 통해 데이터를 추출하고 조작하는데, 관계형 데이터베이스의 테이블과 열을 수학적으로 다룬다. 관계 대수로 원하는 결과를 얻기 위해선 데이터의 처리 과정을 순서대로 기술하기 때문에 절차 언어(procedural language)라고 한다. - 관계 해석..
Ch.5 관계 데이터 모델 [데이터베이스 개론] - 관계 데이터 모델의 정의는 무엇인가? - 관계 데이터 모델을 사용하는 이유? - 도메인의 예시와 장점은? - 릴레이션의 4가지 특성 - 키의 종류와 차이점 - 기본키를 선택할 때 고려해야 하는 기준? - 기본키를 참조하는 외래키의 특성 (이름 동일 여부, 도메인 동일 여부) - 외래키의 특성 (외래키는 기본키만 참조할 수 있는가?) - 무결성 제약조건의 종류와 예시 관계 데이터 모델의 개념 관계 데이터 모델이란 무엇인가? 데이터베이스 시스템을 구현하기 위해선, 먼저 개념적 모델링을 통해 데이터베이스에서 다룰 개념들 간의 관계를 정의해야 한다. 일반적으로 개체-관계 모델을 이용하며, E-R 다이어그램을 도구로 사용한다. 이후 개념적 모델링 결과물을 이용하여 데이터베이스의 테이블과 컬럼, 각 테이블의 관..
Ch.4 데이터 모델링 [데이터베이스 개론 도서] - 개념적 모델링과 논리적 모델리의 정의 - 속성의 종류 - 매핑 카디널리티 개념 - 관계의 유형과 예시 데이터 모델링과 데이터 모델의 개념 현실 세계의 모든 정보를 컴퓨터에 그대로 담기란 불가능하다. 그래서 현실 세계에 존재하는 데이터를 컴퓨터 세계의 데이터베이스로 옮기는 변환 과정을 거쳐야 한다. 이 과정을 데이터 모델링(data modeling)이라고 한다. 하지만 데이터 모델링은 쉽지 않은 과정이다. 현실 세계와의 큰 차이가 존재하고, 방대한 양의 데이터 중 필요한 데이터만 선별하는 것도 비용이 들기 때문이다. 그래서 일반적으로 현실 세계의 객체를 컴퓨터 세계로 옮길 땐 여러 단계를 거친다. 먼저 사람의 머릿속에 연상시킬 수 있는 중요한 데이터를 찾아 개념 세계로 옮긴 뒤, 이를 컴퓨터 세계에 저..
Ch.3 데이터베이스 시스템 [데이터베이스 개론 도서] - DB, DBMS, DMS의 차이 - 스키마와 테이블의 차이 - 3단계 데이터베이스 구조 - 3단계 데이터베이스로 구조를 나누는 이유 - 데이터 사전과 데이터 디렉토리는 사용자가 접근 가능한가? - 데이터 언어의 종류와 예시 SQL 명령어 데이터베이스 시스템의 정의 데이터베이스(DB), 데이터베이스 관리 시스템(DBMS), 데이터베이스 시스템(DBS)의 차이를 알고 있는가? - 데이터베이스(DB): 데이터를 저장하는 공간 - 데이터베이스 관리 시스템(DBMS): 데이터베이스를 관리하는 소프트웨어 - 데이터베이스 시스템(DBS): DB와 DBMS를 포함하는 상위 개념 데이터베이스의 구조 DB를 공부하다보면 스키마란 용어를 굉장히 많이 보게 된다. DB 입문자들은 '스키마'가 테이블(table)와 비슷하단..
[MySQL] 데이터베이스, 테이블, 열 정보를 찾는 쿼리문 MySQL에서 쿼리문을 작성할 때 내가 찾고자는 데이터베이스명, 테이블명, 열 이름이 기억나지 않을때가 있다. 그럴때마다 Workbench의 [navigator]를 통해 확인할 수 있지만, CLU 상황에선 여의치가 않다. 그래서 쿼리문으로 해당 정보를 찾는 방법을 알면 유용할 것이다. 가장 먼저 어떤 ' 데이터베이스 '가 있는지 확인하는 명령어다. [ SHOW DATABASES ; ] SHOW DATABASES; 어떤 ' 테이블 '이 있는지 확인하는 명령어는 다음과 같다. [ SHOW TABLE STATUS ; ] 단순히 테이블의 이름만 확인하고 싶으면 더 짧게 가능하다. [ SHOW TABLES ; ] SHOW TABLE STATUS; // 자세한 테이블 정보 SHOW TABLES; // 테이블명만 간..
[MySQL] '조인 연산자'와 '집합 연산자'의 차이 조인 연산자는 " 두 개 이상의 테이블을 연결하여 데이터를 검색하는 방법 " 이다. 쉽게 말해서 아예 두 테이블을 '가로로' 연결한 뒤에 연산을 처리한다. 그래서 '열'이 늘어난다. 대표적인 종류는 다음과 같다. - (INNER) JOIN : 두 테이블 모두에 공통된 행만 가져옴. - LEFT (OUTER) JOIN : 왼쪽 테이블 행은 모두 가져오고, 오른쪽은 공통된 것만 가져옴. 나머지는 null값. - RIGTH (OUTER) JOIN : 오른쪽 테이블 행은 모두 가져오고, 왼쪽은 공통된 것만 가져옴. 나머지는 null값. - FULL (OUTER) JOIN : 각 테이블의 모든 행을 가져옴. 일치하지 않는 내용은 null값. 집합 연산자는 " 2개 이상의 질의 결과를 하나의 결과로 만들어 주는 방..
[MySQL] 두 날짜의 차이를 구하라 (feat. DATEDIFF, TIMESTAMPDIFF) 시점 A 와 시점 B 간격의 차이를 구하는 방법은 무엇이 있을까? ' 시점 A - 시점 B ' 를 하지 않아도 날짜 사이의 차이를 구하는 함수가 있다. 바로 DATEDIFF 함수와 TIMESTAMPDIFF 함수다. DATEDIFF 함수는 순전히 ' 일 ' 차이만 계산한다. 쉽게 이야기해서 ' 날짜 A - 날짜 B ' 를 해준다. DATEDIFF('날짜1', '날짜2') -- 날짜1 에서 날짜2 를 뺀다. 반면 TIMESTAMPDIFF 함수는 ' 연(YEAR) ', ' 분기(QUARTER) ', ' 월(MONTH) ', ' 주(WEEK) ', ' 일(DAY) ' 시(HOUR) ', ' 분(MINUTE) ', ' 초(SECOND) ' 단위로 차이를 구할 수 있다. TIMESTAMPDIFF 함수에 원하는 단위..
[MySQL] 날짜와 시간 포멧 정하기 (feat. DATE_FORMAT) 주어진 날짜 및 시간을 원하는 형식으로 바꿀 수 있는 함수가 ' DATE_FORMAT ' 이다. DATE_FORMAT ( 시간 값 , '원하는 포멧' ) 형식으로 지정한다. 원하는 포멧은 대소문자를 가리기 때문에 주의해야 한다. %Y 4자리 년도 2022, 1990 %y 2자리 년도 22, 90 %c 숫자 월 (한자리) 1, 2, 3, ... 12 %M 긴 월 (영문) September %b 짧은 월 (영문) Jan, Feb, Mar %d 일자 (두자리) 01, 15, 30 %e 일자 (한자리) 1, 15, 30 %I 시간 (12시간) 01, 05, 11, 12 %H 시간 (24시간) 01, 05, 17, 21, 24 %i 분 00, 05, 30, 54 %s 초 00, 10, 34 SELECT NAME,..
[MySQL] 여러가지 NULL 처리 방법 (feat. IF , IFNULL , COALESCE , CASE) 데이터 값이 NULL 인 경우 다르게 처리해야 할 때가 있다. 이때 4가지 방법으로 NULL 을 다르게 처리할 수 있다. 1. IF 로 처리하기 IF ( 조건문 , '참일 경우', '거짓일 경우' ) IF 문으로 해당 컬럼의 값이 NULL 일 경우 처리할 수 있다. SELECT IF(NAME IS NULL, 'No name', NAME) FROM 테이블명; 2. IFNULL 로 처리하기 IFNULL ( 컬럼 명, 'NULL 일 경우 대체 값' ) IFNULL 문으로 해당 컬럼의 값이 NULL 일 경우 원하는 값으로 대체할 수 있다. SELECT IFNULL(NAME, 'No name') FROM 테이블명; 3. COALESCE 로 처리하기 COALESCE ( 첫 번째 표현식, 두 번째 표현식, 세 번째 ..
[MySQL] 특정 문자열 검색하기 (feat. LIKE 함수) 문자열에 특정 문자가 포함되어 있는지 확인할 필요가 있을 때가 있다. LIKE 함수를 사용하면 된다. ' % ' 는 0개 이상의 문자를 의미한다. 만약 LIKE ' %학교 ' 가 있다면 학교 앞에 어떤 단어가 있어도 상관없이 포함된다. 심지어 아무런 단어가 없어도 된다. 즉 마지막에 '학교' 끝나는 단어라면 해당된다. LIKE ' 전문% ' 이라면 앞에 '전문'으로 시작하는 단어를 나타낸다. LIKE ' %사람% ' 은 '사람'이란 단어를 포함한 단어를 선택한다. LIKE 키워드를 두 번 이상 쓰려면 AND 또는 OR 을 통해 이어주면 된다. select * from 테이블명 where title like '%아디다스%' AND '%나이키%';
[MySQL] 컬럼 생성시 unsigned을 사용하는 의미 테이블에서 컬럼을 생성할 때 unsigned 를 선언할 때가 있다. unsigned 는 해당 컬럼에서 '음수' 를 사용하지 않겠다는 의미이다. 예를 들어 int 형 범위는 - 2147483648 ~ 2147483647 인데 음수를 사용하지 않으면 절반은 낭비가 된다. 만약 쓸모없는 음수 범위를 버리고 양수로 사용한다면 사용 가능한 int 형 범위가 0 ~ 4294967295 로 넓어진다. 따라서 음수를 사용하지 않는 컬럼을 생성할 때 unsinged 선언을 해서 더 효율적인 구조를 만들 수 있다. CREATE TABLE test ( id INT(11) UNSIGNED NOT NULL, ... ... )
[MySQL] 문자열 함수, 'LENGTH( )'와 'CHAR_LENGTH( )'의 차이 LENGTH 는 문자열의 '바이트 길이'를 가져오는 함수이다. 한글은 한 글자를 표현하기 위해서 3 byte 를 사용하기 때문에, LENGTH 함수로 읽으면 한 글자당 3 을 출력한다. 따라서 LENGTH 로 '안녕' 을 읽으면 6 이 출력된다. 반대로 영어는 한 글자가 1 byte 이라서 알파벳 개수만큼 출력된다. SELECT LENGTH('안녕'); -- 6 SELECT LENGTH('abcd'); -- 4 CHAR_LENGTH 는 문자열의 길이를 가져오는 함수이다. 문자의 byte 수를 계산하기 않고 단순히 몇 개의 문자가 있는지를 가져오는 함수이다. 따라서 문자열의 길이를 알기 위해서는 CHAR_LENGTH 를 사용하는 것이 좋다. SELECT CHAR_LENGTH('안녕'); -- 2 SELEC..
[MySQL] SQL 쿼리는 꼭 대문자로 작성해야 하는가?
[MySQL] GROUP BY와 SELECT의 관계
[MySQL] NULL 값 기준으로 ORDER BY 정렬하기 기본적으로 NULL 값을 제외하려면 WHERE 절에서 IS NOT NULL 을 선택하면 된다. 그렇지 않고 ORDER BY 로 정렬하면 NULL 값이 가장 위에 올라온다. 즉 NULL 값이 우선시된다. 만약 ORDER BY 로 정렬했을 때 NULL 값을 가장 아래로 내리고 싶다면, ORDER BY 문에 ' IS NULL ASC ' 를 추가하면 된다. SELECT * FROM 테이블명 ORDER BY name IS NULL ASC; -- NULL이 아닌 값이 우선 조회됨 반대로 NULL 값이 우선적으로 취급되었으면 좋겠다면 ORDER BY 문에 ' IS NULL DESC ' 를 추가하면 된다. SELECT * FROM 테이블명 ORDER BY name IS NULL DESC; -- NULL 값이 우선적으로..
[MySQL] LIMIT 사용법 (feat. OFFSET) - LIMIT 원하는 행 개수 처음부터 몇개만 가져오기 SELECT * FROM 테이블명 LIMIT 10; -- 처음 부터 10개만 출력하기 (1 ~ 10) - LIMIT 시작 지점 , 원하는 행 개수 시작 지점을 정하고, 그 후 원하는 행 개수를 정하기 SELECT * FROM 테이블명 LIMIT 100, 10; -- 100번째부터 그 후 10개 출력하기 (101 ~ 110) - LIMIT 원하는 행 개수 OFFSET 시작 지점 어디서부터 몇 개를 가져올지 정하기 즉 OFFSET 은 시작 위치를 나타낸다. SELECT * FROM 테이블명 LIMIT 20 OFFSET 5; -- 5번째 행 부터 25행 까지 출력 (6 ~ 25) 아래 두 쿼리문은 동일한 결과를 가져온다. SELECT * FROM 테이블명..