목록[Study]/Database (29)
기록
CURRENT_DATE - 현재 날짜 이 함수가 실행된 날을 반환 값으로 출력한다. 인수가 없기 때문에 괄호가 필요 없다. SELECT CURRENT_DATE; CURRENT_TIME - 현재 시간 함수가 실행된 시간을 취득한다. 인수가 없어서 괄호가 필요 없다. SELECT CURRENT_TIME; CURRENT_TIMESTAMP - 현재 일시 현재날짜와 현재시간 기능을 합친 기능을 가진 함수다. 취득한 결과로부터 날짜나 시간만 잘라낼 수도 있다. SELECT CURRENT_TIMESTAMP; EXTRACT - 날짜 요소 추출하기 날짜 데이터에서 일부분을 추출하는 것으로, 예를 들어 '년', '월' 또는 '시간'이나 '초'만 추출할 때 사용한다. 반환형은 날짜형이 아닌 숫자형이 된다. SELECT CU..
함수란? 어떤 값을 입력하면 그에 대응하는 값을 출력하는 기능. 이때 입력을 '인수(파라미터)'라 하며, 출력을 '반환 값'이라 한다. 함수 종류는 크게 다음과 같이 분류할 수 있다. - 산술 함수 (수치 계산) - 문자열 함수 (문자열 처리) - 날짜 함수 (날짜 처리) - 변환 함수 (데이터형이나 값 변환) - 집약 함수 (데이터 집계) ABS(수치) - 절대값 MOD(피제수, 제수) - 나머지 ROUND(대상수, 반올림 자릿수) - 반올림 (반올림 자릿수를 0으로 지정하면 소수점 이하 첫번째 자리에서 반올림) SELECT m, ABS(m) AS abs_col FROM SampleMath; SELECT n,p, MOD(n,p) AS mod_col FROM SampleMath; SELECT m, n, ..
상관 서브쿼리는 작은 그룹으로 나누어 비교할 때 사용한다. 상품분류 별로 평균 판매단가보다 높은 상품을 상품분류그룹에서부터 추출하고 싶다. SELECT goods_classify, goods_name, sell_price FROM Goods WHERE sell_price > (SELECT AVG(sell_price) FROM Goods GROUP BY goods_classify); 에러 발생 !! 스칼라 서브쿼리는 단일 데이터값을 반환해야 하기 때문이다. 해당 쿼리는 3행 값을 반환하고 있어서 스칼라 서브쿼리로서 역할을 못하고 있다. WHERE구에서 서브쿼리를 사용할 경우네는 반드시 결과가 1행이여야 한다. 해결 방법은? 여기서 등장하는 강력한 도구가 상관 서브쿼리이다. SELECT goods_class..
앞 포스팅에서 뷰라는 편리한 도구에 대해 배웠다. 이번 포스팅에서 배우는 '서브쿼리'는 이 뷰를 기반으로 하는 기술이다. 서브쿼리의 특징을 한마디로 정리하면 '일회용 뷰'다. 뷰란 데이터를 저장하는 것이 아니라 데이터를 추출하는 SELECT문을 저장하는 방법이였다. 반면, 서브쿼리는 뷰 정의 SELECT문을 그대로 FROM구에 삽입한 것이다. SELECT goods_classify, cnt_goods FROM (SELECT goods_classify, COUNT(*) AS cnt_goods -- 뷰 정의 SELECT문을 그대로 기술 FROM Goods GROUP BY goods_classify) AS GoodsSum; 이처럼 뷰 정의 SELECT문을 그대로 FROM구에 삽입한 것이 서브쿼리다. AS Go..
뷰와 테이블의 차이는, 실제 데이터를 저장하고 있는지의 여부이다. 보통, 테이블을 만들어서 INSERT문으로 데이터를 추가하면 데이터베이스에 데이터가 저장된다. 이 데이터가 실제 저장되는 위치는 컴퓨터 내의 기억장치(일반적으로 하드디스크)다. 따라서 SELECT문으로 데이터를 검색할 때는 실제로 기억장치에서 데이터를 끌어와서 다양한 계산 후 사용자에게 결과를 반환한다. 반면, 뷰는 데이터를 기억장치에 저장하지 않는다. 뷰가 저장하는 것은 'SELECT'문 자체이다. 뷰에서 데이터를 꺼내려 할 때, 뷰는 내부적으로 SELECT문을 실행해서 일시적인 가상 테이블을 만든다. - 뷰의 이점 1) 데이터를 저장하지 않아 기억장치용량을 절약할 수 있다. (테이블은 실제 데이터를 저장하는 반면, 뷰는 테이블에서 데이..
DBMS 트랜잭션에는 지켜야 할 네 가지 약속이 표준규격으로 정해져 있다. 1. 원자성 (Atomicity) 트랜잭션이 끝난 시점에 모든 갱신 처리가 실행된 상태 또는 모두 실행되지 않은 상태로 종료되는 것을 보증하는 성질이다. All or Nothing이라고도 한다. 앞의 예를 사용하면, 와이셔츠 값은 내렸는데 티셔츠 값은 올리지 않은 상태로 끝나는 트랜잭션은 절대로 없다는 것이다. 트랜잭션의 종료 상태는 둘 다 실행되거나(COMMIT) 둘 다 실행되지 않는(ROLLBACK) 양자택일이어야 한다. (트랜잭션의 어중간한 종료를 방지 위하여 원자성은 중요하다) 2. 일관성 (Comsistency) 트랜잭션에 포함되는 처리는 데이터베이스에 미리 설정된 제약을 지켜야 한다. ( 추후 책보고 다시 보완 ) 3...
트랜잭션이란 ? 데이터베이스에서 이루어지는 하나 이상의 갱신 처리를 모아서 부르는 명칭. 세트로 실행해야 할 하나 이상의 갱신 처리 집합이다. ex) 와이셔츠 판매단가를 1000원 내리고 대신에 티셔츠 판매단가를 1000원 올리는 것 트랜잭션 개시문과 트랜잭션 종료문으로 갱신 DML문을 감싸는 형식이다. -- BEGIN TRANSACTION; -- postgreSQL START TRANSACTION; -- MySQL UPDATE Goods SET sell_price = sell_price - 1000 WHERE goods_name = '와이셔츠'; UPDATE Goods SET sell_price = sell_price + 1000 WHERE goods_name = '티셔츠'; COMMIT; -- ROL..
SELECT goods_id, goods_name, sell_price, buy_price FROM Goods ORDER BY buy_price, sell_price DESC; 오름차순 : ASC (디폴트값) 내림차순 : DESC SELECT 이후에 실행되기 때문에 별명 사용 가능 실행 순서 : FROM - WHERE - GROUP BY - HAVING - SELECT - ORDER BY 집약 함수도 ORDER BY구에 이용 가능 SELECT goods_classify, COUNT(*) FROM Goods GROUP BY goods_classify ORDER BY COUNT(*)
집약한 결과가 정확히 2행인 그룹만 선택하려면 어떻게 해야할까? 조건 지정이라 하면 WHERE구가 바로 떠오를 수 있다. 하지만 WHERE구는 어디까지나 레코드(행) 선택을 위한 조건만 지정할 수 있기 때문에 그룹에 대한 조건 지정으로는 사용할 수 없다. ex) 포함되는 행 수가 2행, 평균 값이 500 이런 그룹에 대한 조건 지정을 위한 기능이 HAVING 구이다. SELECT goods_classify, COUNT(*) FROM Goods GROUP BY goods_classify HAVING COUNT(*) = 2; SELECT goods_classify, AVG(sell_price) FROM Goods GROUP BY goods_classify HAVING AVG(sell_price) >= 250..
지금까지 봐온 집약함수는 전체 테이블을 집약 범위로 계산했다. 이번에는 테이블을 몇 개의 그룹으로 나누어서 집약해 보도록 하자. 즉, 상품분류별이나 등록일별 등으로 집약하는 것을 의미한다. 우리말로는 ~마다, ~별, ~단위 등으로 자주 표현된다. 이때 사용하는 도구가 GROUP BY 구다. 우리말로 표현하면 '~에 의해 그룹을 나눈다'는 의미이다. 예를들어, 상품분류별로 행 수를 계산해보도록 하자. SELECT goods_classify, COUNT(*) FROM Goods GROUP BY goods_classify; GROUP BY를 사용하지 않았을 때는 1행밖에 없던 결과가 이번에는 복수행으로 늘었다. GROUP BY구를 적용하지 않은 경우는 테이블을 전체의 하나의 그룹으로 보고 처리하는 반면, GR..