본문 바로가기
제약 (Constraint) 주로 열에 저장되는 데이터들을 제어하는 규칙을 정의하는 것을 제약이라고 한다. 제약은 데이터의 무결성을 유지하기 위해 필요하다. 데이터의 정확성, 일관성을 유지하는 것을 데이터의 무결성이 유지된다고 생각하면 된다. 데이터의 무결성은 데이터의 가치, 신뢰성면에서 꼭 필요한 속성이다. 제약은 컬럼 레벨과 테이블 레벨로 테이블 생성 시 줄 수 있다. 제약의 종류는 다음과 같다. NOT NULL UNIQUE PRIMARY KEY FOREIGN KEY CHECK DEFAULT NULL CONSTRAINT NOT NULL 제약은 특정 열이 NULL값을 가지지 못하도록 하는 제약이다. CREATE TABLE student ( ..., student_name VARCHAR(20) NOT NULL, student_age.. 2022. 8. 14.
(MySQL) INNER JOIN INNER JOIN //두 query의 결과는 같다. //INNER JOIN 사용 SELECT * FROM product INNER JOIN ordering ON product.product_id = ordering.product_id; //INNER JOIN 사용x SELECT * FROM product, ordering WHERE product.product_id = ordering.product_id; EQUI JOIN, NON-EQUI JOIN, NATURAL JOIN 1. EQUI JOIN 일반적인 INNER JOIN 형태로 두 테이블에서 기준 컬럼의 로우값이 같은 로우 반환 JOIN 조건 절에 EQUAL 연산자(=)로 연결 주로, Primary key와 Foreign key 컬럼이 조인할 때 .. 2022. 8. 12.
인덱스 인덱스는 테이블의 특정 열을 특정 자료구조에 맞게 정리한 것으로, I/O 빈도를 줄이고, 해당 자료구조에 맞는 특정 알고리즘으로 데이터를 빠르게 검색하는데 사용한다. 즉, 인덱스의 역할은 검색속도의 향상이다. 인덱스가 없으면 MySQL은 처음부터 끝까지 전체 테이블을 검색한다. (full table scan) DBMS의 인덱스는 레코드의 키 값을 기준으로 항상 정렬되어 있다. 항상 정렬되어 있기 때문에, 주로 SELECT 명령의 검색을 빠르게 하기 위해 사용한다. 테이블에 데이터를 INSERT, UPDATE, DELETE 할 때는 인덱스를 정렬하는 작업도 같이 하기 때문에, 데이터의 변경이 자주 일어나는 테이블에서는 인덱스의 사용을 조심해야 한다. 인덱스의 자료구조는 B-tree(혹은 B+tree) 방식.. 2021. 12. 6.
DELETE / TRUNCATE / DROP 비교 DELETE DML WHERE 구를 사용하여 원하는 행을 선택하여 삭제할 수 있고, 사용하지 않으면 테이블 모든 행을 삭제할 수 있다. 내부적으로 한줄씩 제거하는 과정을 거친다. 따라서 쿼리문 처리속도가 느릴 수 있다. 데이터는 삭제하지만 데이터가 있던 storage는 release되지 않고 그대로다. DELETE FROM table1; DELETE FROM table1 WHERE 조건식; ROLLBACK; COMMIT; TRUNCATE DDL 데이터를 전부 삭제하지만, 테이블 정의는 지워지지 않는다. 테이블이 최초 생성되었을 당시로 돌아간다. 즉, 최초 생성 시 storage만 남아있고, 데이터가 있던 stroage는 release 된다. TRUNCATE TABLE table1; DROP DML 테이블.. 2021. 12. 4.
테이블 생성 / 삭제 / 변경 테이블 생성 (CREATE) CREATE TABLE 테이블명 ( 열 정의1, 열 정의2, ... ); 열 정의는 열명 자료형 [DEFAULT 기본값] [NULL | NOT NULL] 형태다. 예) CREATE TABLE sample ( no INTEGER DEFAULT 0 NOT NULL, name VARCHAR(30), date DATE); 기본값은 DEFAULT + 해당 자료형 리터럴로 설정하거나 생략 가능하다. NOT NULL로 지정한 경우만 NULL을 허용하지 않고, NULL을 명시하거나 생략 시 NULL을 허용한다. 테이블 삭제 (DROP) DROP TABLE 테이블명; 여기서 DROP 명령은 테이블 안 데이터는 물론 테이블 정의까지 전부 다 삭제한다. 데이터 삭제 만일 테이블 정의는 그대로 두.. 2021. 12. 4.
데이터베이스 계층 구조 인스턴스 - 데이터베이스 - 스키마 - 테이블, 인덱스 .프로시저. 뷰 등등 표준 관계형 데이터베이스에선 4계층 구조를 가진다. MySQL에선 데이트베이스 = 스키마로 보는 3계층으로 이루어져있다. Oracle에선 4계층 구조를 지닌 듯 보이지만 인스턴스 아래 하나의 데이터베이스만 만들 수 있다. 그래서 인스턴스 바로 아래 스키마 층이 있는 것처럼 여겨지기도 한다. 2021. 12. 4.
IN / EXISTS / 상관 서브쿼리 IN 열명 IN (집합) 스칼라 값은 = 연산자로 비교가 가능하다. 하지만 비교대상이 집합인 경우에는 = 연산자를 사용할 수가 없기 때문에 IN 키워드를 사용하여 집합 내에 해당 값이 존재하는지 비교할 수 있다. 집합 내에 해당 값이 존재하면 참이다. 여러 OR 조건문을 하나의 식으로 쓴 것이다. IN 왼쪽에는 하나의 열만 지정되기 때문에 집합은 집합 패턴 1, 2의 경우만 가능하다. 예) table1 no name 1 aa 2 bb 3 cc 4 dd 5 NULL table2 no name 1 가가 2 나나 3 다다 SELECT * FROM table1 WHERE table1.no IN (SELECT table2.no FROM table2); 결과) no name 1 aa 2 bb 3 cc 먼저 tabl.. 2021. 12. 4.
서브쿼리 SQL 명령문 안에 지정하는, 하부 SELECT 명령으로 괄호로 묶어서 지정한다! 일반적인 4가지 패턴 1. 햐나의 값 반환 MIN(a) 10 이 경우 '스칼라 값을 반환한다.'고 한다. 만일 = 연산자를 사용하여 비교할 경우에는 스칼라 서브쿼리여야 한다. 2. 하나의 열, 여러개의 행 a 1 2 3 3. 하나의 행, 여러개의 열 MIN(a) MAX(b) COUNT(c) AVG(d) 12 40 70 8 4. 여러 행, 열 no a b 1 45 5 2 78 25 WHERE 구에서 주로 사용하고 SELECT 구, FROM 구, INSERT 구 등 다양한 곳에서 쓰일 수 있다. INSERT 명령과 서브쿼리 INSERT 명령에서는 1. VALUES 구의 일부로 서브쿼리를 사용하는 경우와 2. VALUES 구 대.. 2021. 12. 3.
그룹화 - GROUP BY GROUP BY 구에 열을 지정하여 그룹화하면 지정된 열의 값이 같은 행끼리 하나의 그룹으로 묶인다. 마치 DISTINCT와 같이 중복을 제거하는 효과가 있다. SELECT name, COUNT(name), SUM(quantity) FROM table GROUP BY name; name열 값을 기준으로 그룹화가 된다,. HAVING WHERE 구 조건식으로 행을 검색하는 처리가 GROUP BY로 그룹화하는 처리보다 먼저 일어난다. 따라서 WHERE 구에서, 그룹화가 필요한 집계함수를 사용할 수 없다. 집계 함수 결과값에 의해 조건식을 작성하기 위해 HAVING 구를 쓴다! GROUP BY 뒤에 작성하여 WHERE 구와 똑같이 조건식을 쓸 수 있다. WHERE로 행 검색 -> 검색 후 GROUP BY로 그.. 2021. 12. 3.
집계함수 - COUNT / SUM / AVG / MIN / MAX 집계함수 대표적인 집계함수로 COUNT(집합) SUM(집합) AVG(집힙) MIN(집합) MAX(집합) 집계함수는 인수로 집합을 지정한다. 또, 여러 값(집합)에서 하나의 값을 계산해내는 함수다. 따라서 SELECT 구에 쓰면 WHERE 구와 관계없이 하나의 행으로 결과값이 반환된다. 집계함수는 집합 안에 NULL 값이 있으면 무시한다. COUNT SELECT COUNT(*) FROM table WHERE 조건식; COUNT(*) 5 COUNT(집합) 집계함수로 조건식에 맞는 행 개수를 구할 수 있다. WHERE 구 먼저 처리 후, SELECT 구가 처리되기 때문에 WHERE 구 조건식에 맞는 행의 개수가 반환된다. * DISTINCT로 중복값 제거 SELECT ALL name FROM table; /*.. 2021. 12. 3.