Database
-
JOIN 두 개 이상의 테이블을 서로 연결하여 원하는 정보를 추출할 수 있다. 아래 그림처럼 employee table과 department table이 있다고 하자. emp 테이블에는 각 사원의 소속부서 번호(deptno)가 있는데, 이 번호 말고 이름과 위치 정보도 붙여서 가져오고 싶다. select a.ename, empno, job, a.deptno, dname, loc from hr.emp a join hr.dept b on a.deptno = b.deptno order by ename; 조인 컬럼 기준 1:M 조인의 경우 집합은 M 집합의 레벨을 그대로 유지한다. 1 집합 → 개별 key 값이 Unique한 경우 M 집합 → 개별 값이 중복으로 있다. → deptno의 값이 여러개가 있다는 의..
[PostgreSQL] JOIN - 데이터 집합 레벨 변화JOIN 두 개 이상의 테이블을 서로 연결하여 원하는 정보를 추출할 수 있다. 아래 그림처럼 employee table과 department table이 있다고 하자. emp 테이블에는 각 사원의 소속부서 번호(deptno)가 있는데, 이 번호 말고 이름과 위치 정보도 붙여서 가져오고 싶다. select a.ename, empno, job, a.deptno, dname, loc from hr.emp a join hr.dept b on a.deptno = b.deptno order by ename; 조인 컬럼 기준 1:M 조인의 경우 집합은 M 집합의 레벨을 그대로 유지한다. 1 집합 → 개별 key 값이 Unique한 경우 M 집합 → 개별 값이 중복으로 있다. → deptno의 값이 여러개가 있다는 의..
2023.04.02 -
Trigger는 설정된 테이블에 INSERT, UPDATE, DELETE와 같은 이벤트가 발생한 경우 미리 설정된 작업이 자동으로 실행되도록 할 수 있다. 예를 들어 고객이 물건을 구매해 구매 테이블에 정보가 insert되면, 등록된 트리거가 발동해 물품 테이블을 자동으로 update 쿼리문을 실행하도록 할 수 있다. 아래 쿼리문을 실행해 다음과 같은 테이블 2개를 생성하였다. CREATE DATABASE trigger_test; CREATE TABLE trigger_test.product( 상품명 varchar(100), 가격 int ); INSERT INTO trigger_test.product VALUES ("소파", 1000); CREATE TABLE trigger_test.counter( 자료 ..
[MySQL] TriggerTrigger는 설정된 테이블에 INSERT, UPDATE, DELETE와 같은 이벤트가 발생한 경우 미리 설정된 작업이 자동으로 실행되도록 할 수 있다. 예를 들어 고객이 물건을 구매해 구매 테이블에 정보가 insert되면, 등록된 트리거가 발동해 물품 테이블을 자동으로 update 쿼리문을 실행하도록 할 수 있다. 아래 쿼리문을 실행해 다음과 같은 테이블 2개를 생성하였다. CREATE DATABASE trigger_test; CREATE TABLE trigger_test.product( 상품명 varchar(100), 가격 int ); INSERT INTO trigger_test.product VALUES ("소파", 1000); CREATE TABLE trigger_test.counter( 자료 ..
2023.03.25 -
LIKE 연산자를 써서 검색을 할 수 있지만, %연산자를 사용하게되면 index를 사용하지 못하게 된다는 단점이 있다. 그럴때는 full text index를 활용하면 된다. 🎈FULLTEXT INDEX 생성 CREATE FULLTEXT INDEX 인덱스명 ON 테이블명(컬럼명); CREATE FULLTEXT INDEX 도서명 ON index_test.library(서명); 🎈FULLTEXT INDEX 를 사용해서 검색 SELECT * FROM library WHERE match(컬럼명) against("검색할단어"); SELECT * FROM library WHERE match(서명) against("대한민국"); 🎈IN BOOLEAN MODE 위와 같은 방법은 정확히 "대한민국"이라는 단어만 찾아준다..
[MySQL] 긴 글을 search 하는 방법 : FullText SearchLIKE 연산자를 써서 검색을 할 수 있지만, %연산자를 사용하게되면 index를 사용하지 못하게 된다는 단점이 있다. 그럴때는 full text index를 활용하면 된다. 🎈FULLTEXT INDEX 생성 CREATE FULLTEXT INDEX 인덱스명 ON 테이블명(컬럼명); CREATE FULLTEXT INDEX 도서명 ON index_test.library(서명); 🎈FULLTEXT INDEX 를 사용해서 검색 SELECT * FROM library WHERE match(컬럼명) against("검색할단어"); SELECT * FROM library WHERE match(서명) against("대한민국"); 🎈IN BOOLEAN MODE 위와 같은 방법은 정확히 "대한민국"이라는 단어만 찾아준다..
2023.03.24 -
특정 컬럼이 특정 값인 데이터를 찾기 위해서 아래와 같은 식을 사용하면 모든 데이터들을 하나씩 순차적으로 찾게 된다. 데이터 행이 100만개라면 100만개의 데이터를 훑어봐야 한다는 단점이 있다. SELECT * FROM db.table WHERE 특정컬럼 = 특정값; 이런 문제점을 해결하기 위해서 index 를 사용한다. 인덱스는 데이터베이스에서 검색 성능을 높여주는 자료 구조이다. 특정 컬럼에 인덱스를 생성하면 해당 컬럼의 데이터들을 정렬하여 별도의 메모리 공간에 데이터의 물리적 주소와 함께 저장한다. 이렇게 되면 검색할 때 전체 데이터를 검색하는 것이 아니라 인덱스를 검색하여 빠르게 원하는 데이터를 찾을 수 있다. 데이터베이스에서는 B+ tree를 이용한 인덱스를 많이 사용한다. B+ tree는 데..
[MySQL] index특정 컬럼이 특정 값인 데이터를 찾기 위해서 아래와 같은 식을 사용하면 모든 데이터들을 하나씩 순차적으로 찾게 된다. 데이터 행이 100만개라면 100만개의 데이터를 훑어봐야 한다는 단점이 있다. SELECT * FROM db.table WHERE 특정컬럼 = 특정값; 이런 문제점을 해결하기 위해서 index 를 사용한다. 인덱스는 데이터베이스에서 검색 성능을 높여주는 자료 구조이다. 특정 컬럼에 인덱스를 생성하면 해당 컬럼의 데이터들을 정렬하여 별도의 메모리 공간에 데이터의 물리적 주소와 함께 저장한다. 이렇게 되면 검색할 때 전체 데이터를 검색하는 것이 아니라 인덱스를 검색하여 빠르게 원하는 데이터를 찾을 수 있다. 데이터베이스에서는 B+ tree를 이용한 인덱스를 많이 사용한다. B+ tree는 데..
2023.03.23 -
MySQL은 procedure/function 안에서만 IF를 사용할 수 있다. IF 조건식1 THEN 조건식1이 참이면 실행할 쿼리문; ELSEIF 조건식2 THEN 조건식2가 참이면 실행할 쿼리문; ELSE 그 밖의 경우 실행할 쿼리문; END IF; DROP PROCEDURE IF EXISTS mart.sum_price; delimiter $$ CREATE PROCEDURE mart.sum_price() BEGIN IF (SELECT sum(가격) FROM mart.product) > 15000 THEN SELECT "15000원 초과"; ELSEIF (SELECT sum(가격) FROM mart.product)
[MySQL] procedure/function 안에서만 사용 가능한 IFMySQL은 procedure/function 안에서만 IF를 사용할 수 있다. IF 조건식1 THEN 조건식1이 참이면 실행할 쿼리문; ELSEIF 조건식2 THEN 조건식2가 참이면 실행할 쿼리문; ELSE 그 밖의 경우 실행할 쿼리문; END IF; DROP PROCEDURE IF EXISTS mart.sum_price; delimiter $$ CREATE PROCEDURE mart.sum_price() BEGIN IF (SELECT sum(가격) FROM mart.product) > 15000 THEN SELECT "15000원 초과"; ELSEIF (SELECT sum(가격) FROM mart.product)
2023.03.22 -
procedure과 비슷한 용도인 function이 있다. procedure : 긴 쿼리문을 재사용하고 싶을 때 function : 간단한 쿼리문(사칙연산 등)을 재사용하고 싶을 때 procedure과 function의 차이점 procedure은 CALL 문법과 함께 호출해야하나 function은 CALL이 필요없다. procedure은 RETURN이 필요없지만 function은 필요하다. function안에서는 SELECT문법으로 테이블 값을 출력할 수 없다. DETERMINISTIC 사용 이유 DETERMINISTIC으로 생성시, MySQL에서 이 함수가 입력값이 동일하면 출력값은 항상 동일하다는 것을 인지하고 단 1번만 이 함수를 호출해서 결과값으로 a컬럼을 검색한다. ⇒ 속도 측면에서 빠르다! d..
[MySQL] functionprocedure과 비슷한 용도인 function이 있다. procedure : 긴 쿼리문을 재사용하고 싶을 때 function : 간단한 쿼리문(사칙연산 등)을 재사용하고 싶을 때 procedure과 function의 차이점 procedure은 CALL 문법과 함께 호출해야하나 function은 CALL이 필요없다. procedure은 RETURN이 필요없지만 function은 필요하다. function안에서는 SELECT문법으로 테이블 값을 출력할 수 없다. DETERMINISTIC 사용 이유 DETERMINISTIC으로 생성시, MySQL에서 이 함수가 입력값이 동일하면 출력값은 항상 동일하다는 것을 인지하고 단 1번만 이 함수를 호출해서 결과값으로 a컬럼을 검색한다. ⇒ 속도 측면에서 빠르다! d..
2023.03.22 -
날짜&시간 데이터타입 DATE YYYY-MM-DD 9999년까지 저장가능 DATETIME YYYY-MM-DD hh:mm:ss 9999년까지 저장가능 TIMESTAMP YYYY-MM-DD hh:mm:ss 2038년까지 저장가능 TIMESTAMP는 현재 DB시간 기록용으로 사용하는 것 이외에는 잘 사용하지 않음 DATETIME(6) → 초단위 소수점 6자리까지 기록 테이블 생성 및 데이터 저장 YYYY-MM-DD hh:mm:ss 는 문자열 타입으로 입력하면 된다. CREATE TABLE blog.exercise( 날짜 datetime ); INSERT INTO blog.exercise (날짜) VALUES ("2023-03-21 12:00:00"); 데이터 필터링 입력할 때와 마찬가지로 YYYY-MM-DD ..
[MySQL] 날짜&시간 데이터날짜&시간 데이터타입 DATE YYYY-MM-DD 9999년까지 저장가능 DATETIME YYYY-MM-DD hh:mm:ss 9999년까지 저장가능 TIMESTAMP YYYY-MM-DD hh:mm:ss 2038년까지 저장가능 TIMESTAMP는 현재 DB시간 기록용으로 사용하는 것 이외에는 잘 사용하지 않음 DATETIME(6) → 초단위 소수점 6자리까지 기록 테이블 생성 및 데이터 저장 YYYY-MM-DD hh:mm:ss 는 문자열 타입으로 입력하면 된다. CREATE TABLE blog.exercise( 날짜 datetime ); INSERT INTO blog.exercise (날짜) VALUES ("2023-03-21 12:00:00"); 데이터 필터링 입력할 때와 마찬가지로 YYYY-MM-DD ..
2023.03.21 -
아래와 같이 가격이 6000이상인 product를 뽑아내는 procedure를 만든다면, 7000이상인 product를 필터링할 때는 새로운 procedure를 만들어주어야하는 번거로움이 있다. delimiter $$ $$ CREATE PROCEDURE mart.get_6000_over() BEGIN SELECT * FROM product WHERE 가격 > 6000; END $$ delimiter ; IN 파라미터 파라미터를 사용하면 이런 문제를 해결할 수 있다! DROP PROCEDURE IF EXISTS mart.get_all; delimiter $$ $$ CREATE PROCEDURE mart.get_all(cost int) BEGIN SELECT * FROM product WHERE 가격 > c..
[MySQL] "파라미터"를 사용해서 stored procedure 생성아래와 같이 가격이 6000이상인 product를 뽑아내는 procedure를 만든다면, 7000이상인 product를 필터링할 때는 새로운 procedure를 만들어주어야하는 번거로움이 있다. delimiter $$ $$ CREATE PROCEDURE mart.get_6000_over() BEGIN SELECT * FROM product WHERE 가격 > 6000; END $$ delimiter ; IN 파라미터 파라미터를 사용하면 이런 문제를 해결할 수 있다! DROP PROCEDURE IF EXISTS mart.get_all; delimiter $$ $$ CREATE PROCEDURE mart.get_all(cost int) BEGIN SELECT * FROM product WHERE 가격 > c..
2023.03.21