//Google AdSense

Stored Program

특징

  • 일련의 쿼리를 마치 하나의 함수 처럼 실행하기 위한 쿼리의 집합
  • MySQL 안에서 프로그래밍 언어와 같은 기능을 제공하는 프로그램 (DML 활용)
  • 자주 사용하는 복잡한 쿼리를 하나로 묶어 이름으로 지정하여 이름을 호출하여 실행되도록 설정
  • MySQl의 성능 향상
    • 긴 쿼리의 내용을 전송하지 않고 프로시저의 이름 및 매개변수 등만 전송하여 네트워크 부하를 줄일 수 있음
  • 유지관리가 간편
    • 직접 SQL 문을 작성하지 않고 저장된 이름만 호출함으로써 일관된 작업을 함
  • 모듈식 프로그래밍 가능
    • 한 번 Stored Program을 생성해 쿼리의 수정, 삭제 등의 관리가 수월
  • 보안을 강화
    • 사용자 별로 테이블에 접근 권한을 주지 않고 Stored Program에 접근 권한을 줌으로써 보안을 강화

종류

  • Stored Procedure - 프로시저
    • 쿼리문의 집합, 어떠한 동작을 일괄 처리하기 위한 용도로 사용
    • 리턴 값이 없다. (단독으로 문장 구성 가능)
  • Stored Function - 함수
    • 사용자 정의 함수 (내장함수가 제공하지 않는)
    • 리턴 값이 있다.(단독으로 문장을 구성할 수 없음)
  • Trigger
    • 테이블의 동작이 일어나면 자동 실행 (방아쇠)
    • 테이블의 DML문이 작동되면 자동으로 실행
  • Cursor - 커서
    • 테이블에서 여러 개의 행을 쿼리한 후에, 쿼리의 결과인 행 집합을 한 행 씩 철하는 방식
    • 일반 프로그래밍의 파일 처리와 비슷한 방법을 제공

Procedure


프로시저의 특징

  • 어떠한 동작을 일괄 처리하기 위한 용도
  • 자주 사용되는 일반적인 쿼리를 모듈화 시켜 필요할 때만 호출
  • MySQL 운영에 편리

프로시저의 단점

  • 유지보수 복잡성이 증가 - 각 기능을 담당하는 프로그램 코드가 자바와 MySQL 스토어드 프로그램으로 분산되어 관리하기 때문에 애플리케이션의 설치나 배포가 더 복잡해짐

프로시저의 형식 정의

DELIMITER $$

CREATE PROCEDURE Stored Procedure 이름 (IN/OUT 파라미터)
BEGIN


	SQL 프로그래밍 코딩


END $$
DELIMITER;

CALL Stored Procedure 이름();

프로시저 형식 실습

 


 


프로시저 실습 (제어문 IF)

 

DECLARE : 변수선언

DECLARE 변수명 변수타입;

 

 


프로시저 실습 (제어문 CASE)


프로시저 실습 (반복문 WHILE)

 

조건문 끝나는 수가 헷갈릴 때 ↓

더보기

while ( n-1 <n ) do

i = n-1+1

result = result + n 

n까지 다 돎


                             


프로시저 실습1

회원테이블의 아이디와 패스워드를 입력받아 일치하는 이메일을 출력하는 프로시저를 생성하고 호출하시오.

 


out으로 매개변수에 값을 담아 사용.


프로시저 실습2 

다음과 같이 약수와 약수의 합계를 구하는 프로시저를 만들고 250입력받아 호출하여 출력하시오.

WHILE / IF / CONCAT_WS


WHILE/ CASE / CONCAT 

BEGIN
	DECLARE i int;
	declare result1 varchar(50); 
	DECLARE result2 int;

	set i = 0;
	set result1 = '약수 : ';
	set result2 = 0;

while_i:	while ( i < intValue ) do
		set i = i + 1; 
		case
		when ( intValue % i = 0) and (i = 1) then
		set result1 = concat(result1,i);
		set result2 = result2 + i;
		when ( intValue % i = 0) and (i <> 1) then
		set result1 = concat(result1,', ',i);
		set result2 = result2 + i;
		else
			ITERATE while_i;
		end case;
	end while;
	
	select
		 result1 as '약수'
		, result2 as '약수합계';
END


LOOP / IF / CONCAT

BEGIN
	declare	i int;
	declare	resultSum int;
	declare	resultStr varchar(50);
	set i = 0;
	set resultSum = 0;
	set resultStr = '';

	LOOP_sum : LOOP
						if ( i = intValue) then
								leave LOOP_sum;
						end if;
						
						set i = i+1;
						
						if((intValue % i) = 0) then
							set resultSum = resultSum + i;
							
							if(i = 1) then
								set resultStr = concat ('약수 : ',i);
							else
								set resultStr = concat (resultStr, ', ', i);
							end if;
						
						end if;
					end loop;
				select
				resultStr as '약수'
				,resultSum as '약수총합';	
END


jdbc procedure call

'Database' 카테고리의 다른 글

[Database] SQL VIEW  (0) 2020.04.06
[Database] Sub Query / UNION  (0) 2020.04.01
[Database] 정규화(Normalization)  (0) 2020.04.01
[Database] 데이터베이스 설계  (0) 2020.03.25

사용자에게 접근이 허용된 자료만을 제한적으로 보여주기 위해 하나 이상의 기본 테이블로부터 유도된, 이름을 가지는 가상 테이블이다.

VIEW의 특징

  • 기본테이블로부터 유도된 테이블이기에 테이블과 같은 형태의 구조이며 조작도 테이블과 거의 같다.
  • 가상 테이블이기에 테이터의 논리적 독립성을 제공한다.
  • 뷰를 통해서만 데이터를 접근하여 뷰에 나타나지 않는 데이터 보안에 도움
  • 필요한 데이터만 뷰로 정의해서 처리하기에 관리가 용이하고 명령문이 간단함.

VIEW의 단점

  • 가상 테이블이기에 데이터의 논리적 독립성을 제공한다.
  • ALTER VIEW 문을 사용할 수 없다. (뷰의 정의를 변경할 수 없다.)
  • 뷰로 구성된 내용에 대한 삽입, 삭제, 갱신, 연산에 제약이 따른다. (사용하지 않는 것이 바람직.)

MySQL VIEW의 제약사항

  • 뷰의 정의는 select 구문이 허용하는 wher, group by와 같은 것을 모두 포함 가능.
  • TEMPORARY 뷰를 만들 수 없다.
  • 뷰와 함께 연결되는 트리거를 만들 수 없다,.
  • 뷰 정의에 있는 select 구문은 다음과 같은 구성을 포함할 수 없다.
    • from절 안 서브쿼리
    • TEMPORARY 테이블로 참조
    • 사용자 변수로 참조

view 생성 실습

1

회원 별 구매이력 중 구매금액이 가장 높은 금액의 상품명을 추출하여 회원아이디와 이메일을 포함한 뷰테이블을 생성하시오.

SELECT
	m.m_id								AS v_id
	,m.m_email							AS v_email
	,g.g_name							AS v_g_name
	,MAX(g.g_price* o.o_amount)	AS v_max_amt
FROM
	tb_order AS o
	INNER join
	tb_goods AS g
	on
	o.o_g_code = g.g_code
	INNER join
	tb_member AS m
	ON 
	m.m_id = o.o_id
GROUP BY m.m_id;


 

CREATE VIEW v_max_amt_member
AS 
SELECT
	m.m_id								AS v_id
	,m.m_email							AS v_email
	,g.g_name							AS v_g_name
	,MAX(g.g_price* o.o_amount)	AS v_max_amt
FROM
	tb_order AS o
	INNER join
	tb_goods AS g
	on
	o.o_g_code = g.g_code
	INNER join
	tb_member AS m
	ON 
	m.m_id = o.o_id
GROUP BY m.m_id;

 

2

tb_test 테이블을 다음과 같이 조회하시오.

SELECT
	t.t_season AS '계절'
	,SUM(if(t.t_name = '김성주',t.t_amount,0)) AS '김성주'
	,SUM(if(t.t_name = '정동영',t.t_amount, 0)) AS '정동영'
	,SUM(t.t_amount) AS '합계'
FROM
	tb_test AS t
GROUP BY t.t_season
;

 

3

매자별 구매이력 중 상품별로 구매수량이 20개 이상인 상품의 목록을 추출하여 다음과 같이 조회하시오.

SELECT
 	m.m_name AS '구매자'
 	,GROUP_CONCAT(DISTINCT g.g_name ORDER BY g.g_name) AS '상품명'
FROM
	tb_member AS m
	INNER JOIN
	tb_order AS o
	ON
	m.m_id = o.o_id
	INNER JOIN
	tb_goods AS g
	ON
	o.o_g_code = g.g_code
WHERE
	o.o_amount >= 20
GROUP BY m.m_name;

 

'Database' 카테고리의 다른 글

[Database] 프로시저  (0) 2020.04.13
[Database] Sub Query / UNION  (0) 2020.04.01
[Database] 정규화(Normalization)  (0) 2020.04.01
[Database] 데이터베이스 설계  (0) 2020.03.25

실습 ) 회원 별 구매이력 중 구매금액이 가장 높은 금액의 상품명을 추출하여 회원아이디와 이메일과 함께 조회 하시오.

SELECT
	m.m_id							AS '회원아이디'
	,m.m_email						AS '이메일'
	,g.g_name						AS '상품명'
	,max(o.o_amount * g.g_price)	AS '구매금액'
FROM 
	tb_member AS m
	INNER join
	tb_order AS o
	on
	o.o_id = m.m_id
	INNER join
	tb_goods AS g
	on
	o.o_g_code = g.g_code

GROUP BY m.m_id
ORDER BY 구매금액 DESC;	

 


Sub Query

  • SQL문 내에서 하위에 존재하는 쿼리 ( SQL문 안에 SQL )

예)

	SELECT
	*
FROM
	tb_goods AS g
WHERE
	g.g_price > ( SELECT
						ROUND(AVG(g.g_price),0)
					FROM
						tb_goods AS g ) ;

 

스칼라 서브쿼리 인라인 뷰 서브쿼리

SELECT 문에 있는 서브쿼리

(1행만 반환)

FROM 절에 있는 서브쿼리 WHERE 절에 있는 서브쿼리

인라인 : FROM절에 있는 서브쿼리

SELECT
   g.g_code
  ,g.g_name
  ,g.g_price
  ,g.g_seller_id
  ,g.g_reg_date
FROM
  tb_goods AS g
  JOIN
  ( SELECT
      ROUND(AVG(g.g_price), 0) AS '평균단가'
    FROM
      tb_goods AS g) AS gAvg
WHERE
  g.g_price > gAvg.평균단가;

스칼라 서브쿼리 : SELECT문에 있는 서브쿼리

 

SELECT
   g.g_code
  ,g.g_name
  ,g.g_price
  ,g.g_seller_id
  ,g.g_reg_date
FROM
  (SELECT
     *
    ,( SELECT
          ROUND(AVG(gAvg.g_price), 0)
       FROM
          tb_goods AS gAvg) AS '평균단가'
   FROM
     tb_goods ) AS g
WHERE
   g.g_price > g.평균단가;

서브쿼리 : WHERE절에 있는 서브쿼리

SELECT
   g.g_code
  ,g.g_name
  ,g.g_price
  ,g.g_seller_id
  ,g.g_reg_date
FROM
   tb_goods AS g
WHERE
   g.g_price > ( SELECT
                    ROUND(AVG(g.g_price), 0)
                 FROM
                    tb_goods AS g );

단일 행 서브쿼리

SELECT
  *
FROM
  tb_member AS m
WHERE
  m.m_level = ( SELECT
                  l.level_num
                FROM
                  tb_member_level AS l
                WHERE
                  l.level_num = 1 ); 

다중 행 서브쿼리

SELECT
  *
FROM
  tb_member AS m
WHERE
  m.m_level IN ( SELECT
                  l.level_num
                FROM
                  tb_member_level AS l ); 

다중컬럼 서브쿼리

SELECT
  *
FROM
  tb_member AS m1
WHERE
  (m1.m_id, m1.m_level) IN ( SELECT
                                m2.m_id
                               ,MIN(m2.m_level)
                             FROM
                               tb_member AS m2 );

UNION

*** SELECT의 개수가 동일해야 한다!

  • 여러 개의 쿼리의 합집합
  • 여러 개의 SQL문을 합쳐 하나의 SQL문으로 만들어주는 방법

UNION VS . UNION ALL

  • UNION : 여러 개의 쿼리의 중복 값을 제거한 결과
  • UNION ALL : 여러 개의 쿼리 결과가 중복이 되더라도 전부 결과에 반영
  • 속도 :  UNOIN ALL >  UNION

규칙

  • SELECT컬럼의 수가 같아야 한다.
  • 컬럼명이 같아야 한다. ( 같지 않을 경우 alias를 사용하여 같게 만듦)
  • 컬럼별 데이터타입이 같아야 한다. ( 반환 가능한 형태 )
  • 하나의 ORDER BY만 사용한다.
  • SELECT문들의 순서는 상관없다.

실습

 

실습1. DML - 1부터 시작하는 행의 번호를 포함하여 상품테이블을 출력하시오.

SELECT
	@rowNum:=(@rowNum+1) AS '행 번호'
	,g.*
FROM
	tb_goods AS g
	,(SELECT @rowNum:=0) r
	
ORDER BY	g.g_price DESC;

실습2. DML - 상품테이블의 단가 중 단가가 높은 상품 순서대로 순위를 포함하여 상품테이블을 출력하시오.

SELECT
	CASE
	WHEN (@gPri := g.g_price) THEN @rank:=(@rank+1)
	WHEN (@gPri = g.g_price) THEN @rank
	END AS '순위'
	,g.*
FROM
	tb_goods AS g
	,(SELECT @rank:=0, @gPri:=null) r
	
ORDER BY	g.g_price DESC;

실습3. DML - 관리자 제외 회원 별 로그인 평균 횟수보다 많이 로그인한 회원 아이디와 로그인 횟수를 조회 하시오.

SELECT
	l.login_id AS '아이디'
	,COUNT(l.login_id) AS '로그인횟수'
FROM
	tb_login AS l
	INNER JOIN 
	tb_member AS m
	ON 
	m.m_id =  l.login_id
	INNER JOIN
	tb_member_level AS ml
	ON 
	ml.level_num = m.m_level
WHERE
	ml.level_name NOT LIKE '%관리자%'
GROUP BY l.login_id
HAVING COUNT(l.login_id) > (SELECT 
											ROUND(AVG(cAvg.로그인횟수),1) AS '평균로그인횟수'
									 FROM
										(SELECT
											l.login_id AS '아이디'
											,COUNT(l.login_id) AS '로그인횟수'
										 FROM
											tb_login AS l
											INNER JOIN 
											tb_member AS m
											ON 
											m.m_id =  l.login_id
											INNER JOIN
											tb_member_level AS ml
											ON 
											ml.level_num = m.m_level
										 WHERE
											ml.level_name NOT LIKE '%관리자%'
										 GROUP BY l.login_id ) AS cAvg);

 

'Database' 카테고리의 다른 글

[Database] 프로시저  (0) 2020.04.13
[Database] SQL VIEW  (0) 2020.04.06
[Database] 정규화(Normalization)  (0) 2020.04.01
[Database] 데이터베이스 설계  (0) 2020.03.25

개념적설계의 결과 > E-R다이어그램

E-R다이어그램  >> 스키마설계 

이상현상(anomaly) 정규화(normalization)
불필요한 데이터 중복으로 인해 릴레이션에 대한 데이터 삽입 수정 삭제 연산을 수행할 때 발생할 수 있는 부작용

데이터의 일관성, 최소한의 데이터 중복, 최대한의 데이터 유연성을 위한 방법이며 데이터를 분해하는 과정.

 

즉 이상현상이 발생하지 않도록 릴레이션을 관련있는 속성들로만 구성하기 위해  릴레이션을 분해하는 과정.

함수적 종속성을 판단하여 정규화를 수행

함수적 종속성 (Functional Dependency)

속성들 간의 관련성

함수 종속성을 이용하여, 릴레이션을연관성이 있는 속성들로만 구성되도록 분해하여 이상현상이 발생하지 않는 릴레이션으로만들어가는 과정

이상현상(anomaly)

  1. 삽입이상
    • 릴레이션에 새 데이터를 삽입하려면 불필요한 데이터도 함께 삽입해야하는 문제
  2. 갱신이상 (Update anomaly)
    • 릴레이션의 중복된 튜플들 중 일부만 수정하여 데이터가 불일치하게 되는 모순
  3. 삭제이상 (Deletion anomaly)
    • 릴레이션에서 튜플을 삭제하면 꼭 필요한 데이터까지 손실되는 연쇄 삭제 현상이 발생하는 문제

함수 종속 (Functional Dependency)

X → Y

X Y를 함수적으로 결정한다.

Y X에 함수적으로 종속되어 있다

  1. X가 Y를 함수적으로 결정한다.
    • 릴레이션 내의 모든 튜플을 대상으로 하나의 X값에 대한 Y값이 항상 하나
    • YX에 함수적으로 종속되어 있다 와 같은 의미
    • X Y로 표현 (X는 결정자, Y종속자)
  2. 함수 종속 관계 판단
    • 속성 자체의 특성과 의미를 기반으로 함수 종속성을 판단
    • 속성 값은 계속 변할 수 있으므로 현재 릴레이션에 포함된 속성 값만으로 판단하면 안된다.
    • 일반적으로 기본키와 후보키는 릴레이션의 다른 모든 속성들을 함수적으로 결정한다.
    • 기본키나 후보키가 아니어도 다른 속성 값을 유일하게 결정하는 속성은 함수 종속 관계에서 결정자가 될 수 있다.  
  3.  완전 함수 종속 VS. 부분 함수 종속 
    1. 완전 함수 종속 (Full Functional Dependency)
      • 릴레이션에서 속성 집합 Y가 속성 집합 X에 함수적으로 종속되어 있지만, 속성 집합 X의 전체가 아닌 일부분에는 종속되지 않음을 의미
      • 일반적으로 함수 종속은 완전 함수 종속을 의미함
    2. 부분 함수 종속 (Partial Functional Dependency)
      • 릴레이션에서 속성 집합 Y가 속성 집합 X의 전체가 아닌 일부분에도 함수적으로 종속됨을 의미
  4. 결정자와 종속자가 같거나, 결정자가 종속자를 포함하는 것처럼 당연한 함수 종속 관계는 고려하지 않음

 

정규화를 통한 릴레이션 : 무손실 분해

  • 릴레이션은 의미적으로 동등한 릴레이션들로 분해되어야 하고 분해로 인한 정보의 손실이 발생하지 않아야 한다.
  • 분해된 릴레이션들을 자연 조인하면 분해 전의 릴레이션으로 복원 가능해야 한다.

정규형 (Normal Form)

  • 릴레이션이 정규화된 정도
  • 각 정규형마다 제약조건이 존재 (릴레이션 특성을 고려 적합한 정규형 선택)
  • 모든 릴레이션이5 정규형에 속해야만 바람직한 것은 아님
    • 정규형의 차수가 높아질수록 요구되는 제약조건이 많아지고 엄격해짐
  • 일반적으로 제 3 정규형이나 보이스/코드 정규형에 속하도록 릴레이션을 분해하여 데이터 중복을 줄이고 이상 현상을 해결하는 경우가 많음.
    • 3정규형까지 도달하면 이상현상이 현저히 적게 발생하기 때문에 실무적으로 보통 3정규화까지 함. (정규화가 과도하게 되어있으면 제약조건에 대한 처리와 처리속도에 영향을 미칠 수 있다.)

 

1. 제 1 정규형 (1NF)

  • 릴레이션의 모든 속성이 더는 분해되지 않는 원자 값만 가지면 제 1 정규형을 만족함
  • 1 정규형을 만족해야 관계 데이터베이스 릴레이션
  • 부분 함수 종속 때문에 이상현상 발생.
  • 부분 함수 종속이 제거되도록 릴레이션 분해 > 제 2 정규형

2. 제 2정규형 (2NF)

  • 릴레이션이1 정규형에 속하고, 기본키가 아닌 모든 속성이 기본키에 완전 함수 종속되면 제 2 정규형을 만족함.
  • 이행적 함수 종속이 존재하기 때문에 이상현상 발생.
  • 이행적 함수 종속이 제거되도록 릴레이션 분해 > 제 3 정규형

3. 제 3정규형 (3NF)

  • 릴레이션이2 정규형에 속하고, 기본키가 아닌 모든 속성이 기본키에 이행적 함수 종속되지 않으면 제 3 정규형을 만족함.
  • 후보키가 아닌 결정자가 존재할 수 있고 이 때문에 이상현상이 발생할 수 있음.
  • 후보키가 아닌 결정자가 제거되도록 릴레이션 분해 > 보이스/코드 정규형

4. 보이스/코드 정규형 (BCNF)

  • 하나의 릴레이션에 여러 개의 후보키가 존재하는 경우, 3 정규형까지 모두 만족해도 이상 현상이 발생할 수 있음.
  • 보이스/코드 정규형은 제 3 정규형에 속하지만, 3 정규형에 속하는 모든 릴레이션이 보이스/코드 정규형에 속하는 것은 아님.

5. 제 4정규형 (4NF)

  • 릴레이션이 보이스/코드 정규형을 만족하면서, 함수 종속이 아닌 다치 종속을 제거하면 제 4 정규형

6. 제 5정규형 (5NF)

  • 릴레이션이4 정규형을 만족하면서, 후보키를 통하지 않는 조인 종속제거하면 제 5 정규형에 속함.

 

정규화 VS. 반정규화

(정규화된 릴레이션( 빈번한 조인이 일어남) 검색보다 반정규화 릴레이션 검색 속도가 더 빠르다.)

'Database' 카테고리의 다른 글

[Database] SQL VIEW  (0) 2020.04.06
[Database] Sub Query / UNION  (0) 2020.04.01
[Database] 데이터베이스 설계  (0) 2020.03.25
[Database] join  (0) 2020.03.25

데이터베이스 설계 

사용자의 다양한 요구사항을 고려하여 데이터베이스를 생성하는 과정

 

과정 내에서 피드백이 가능하다.

 

요구사항 분석 목적

  • 사용자의 요구 사항을 수집 분석하여 개발할 데이터베이스의 용도 파악
  • 업무에 필요한 데이터, 데이터를 이용한 처리 방향 등을 고려
  • 결과물 : 요구사항 명세서

주요작업

  • 데이터베이스를 실제로 사용할 사용자의 범위를 결정
  • 사용자가 조직에서 수행하는 업무를 분석
  • 면담, 설문조사, 업무 관련 문서 분석 등의 방법을 이용해 요구사항 수집
  • 수집된 요구사항에 대한 분석 결과를 요구사항 명세서로 작성

요구사항 분석 예시 ((p.nn))

 

개념적 설계

개념적 설계 목적

  • DBMS에 독립적인 개념적 스키마 설계
  • 요구사항 명세서를 개념적 구조로 표현
  • 결과물 :  E-R 다이어그램

주요 작업

  • 요구사항 분석 결과를 기반으로 중요한 개체를 추출하고 개체간의 관계를 결정하여 E-R 다이어그램으로 표현

개체와 속성 추출

  • 저장할만한 가치가 있는 중요 데이터를 가진 사람이나 사물
  • ) 학사행정 데이터베이스 개발에 필요한 개체
    • 학사행정 운영에 필요한 사람 :  학생, 교수, 행정담당자 등
    • 학사행정 운영에 필요한 사물 :  강의실, 행정실, 교자재

개체 추출 방법

  • 요구 사항 문장에서 업무와 관련이 깊은 의미 있는 명사
    • 업무와 관련이 적은 일반적이고 광범위한 의미의 명사는 제외
    • 의미가 같은 명사가 여러 개일 경우는 대표 명사 하나만 선택
    • 추출된 명사를 개체와 속성으로 분류

개체와 속성 추출 예 ((p.nn))

 

 

'Database' 카테고리의 다른 글

[Database] Sub Query / UNION  (0) 2020.04.01
[Database] 정규화(Normalization)  (0) 2020.04.01
[Database] join  (0) 2020.03.25
[Database] SQL 활용 ②  (0) 2020.03.18

JOIN

두 개 이상의 테이블을 서로 묶어서 하나의 결과 집합으로 만들어내는 것 (사용자가 필요한 집합 결과 도출)

→범위산정

 

INNER JOIN  
OUTTER JOIN  
SELF JOIN 거의 사용 안하지만 계층 구도 만들 때 사용
CROSS JOIN  
NATURAL JOIN 같은 컬럼이어야 함. (=inner join과 같이 표현됨)



inner join

SELECT
	*
FROM
	tb_member_level AS l
	INNER join
	tb_member AS m
	on
	l.level_num = m.m_level
WHERE
	l.level_num > 1;

 

 

SELECT
	*
FROM
	tb_member_level AS l
	LEFT JOIN
	tb_member AS m
	on
	l.level_num = m.m_level;

 

null 비교는 is 로!

SELECT
	*
FROM
	tb_member_level AS l
	LEFT JOIN
	tb_member AS m
	on
	l.level_num = m.m_level
	WHERE
	m_id IS NULL;

 

 

SELECT
	*
FROM
	tb_member_level AS l
	LEFT JOIN
	tb_member AS m
	on
	l.level_num = m.m_level
	WHERE
	m_id IS not null;

	

>> inner join과 결과값이 같다.

 

 

self join

SELECT
	m1.m_id AS member1
	,m2.m_id AS memeber2
	,m1.m_addr AS address
FROM
	tb_member AS m1
	join
	tb_member AS m2
	on
	m1.m_id <> m2.m_id
	and
	m1.m_addr = m2.m_addr
	ORDER BY  m1.m_id;

 

cross join

SELECT
	*
FROM
	tb_member_level AS l
	CROSS JOIN 
	tb_member AS m
ORDER BY l.level_num,m.m_id; 

A행xB행 (곱집합)

 

 

 

'Database' 카테고리의 다른 글

[Database] 정규화(Normalization)  (0) 2020.04.01
[Database] 데이터베이스 설계  (0) 2020.03.25
[Database] SQL 활용 ②  (0) 2020.03.18
[Database] SQL 활용 ①  (3) 2020.03.18

SQL 실습

테이블 생성 - DDL

 

속성이 레벨번호, 레벨이름, 레벨등록날짜로 구성되고 기본키가 권한인 회원 권한테이블을 생성하시오.
CREATE TABLE tb_member_level  (
	level_num INT(11) NOT NULL AUTO_INCREMENT
	,level_name VARCHAR(300) NOT NULL
	,level_reg_date DATE NOT NULL
	,PRIMARY KEY(level_num)
);

 

속성이 회원 아이디, 비밀번호, 이름, 권한, 이메일, 주소, 회원등록날짜로 구성되고 기본키가 회원아이디, 회원 권한은 회원권한테이블의 아이디를 참조하는 회원테이블을 생성하시오.
CREATE TABLE tb_member (
	m_id VARCHAR(200) NOT NULL
	,m_pw VARCHAR(200) NOT NULL
	,m_name VARCHAR(200) NOT NULL
	,m_level INT(11) NULL DEFAULT NULL
	,m_email VARCHAR(200) NOT NULL
	,m_addr VARCHAR(200) NOT NULL
	,m_reg_date DATE NOT NULL
	,PRIMARY KEY (m_id)
	,CONSTRAINT FK_m_level FOREIGN KEY (m_level) REFERENCES tb_member_level(level_num)
);

 

속성이 상품코드, 상품이름, 상품가격, 판매자 아이디, 상품등록날짜 구성되고 기본키가 상품코드, 판매자 아이디는 회원테이블의 아이디를 참조하는 상품테이블을 생성하시오.
CREATE TABLE tb_goods (
	g_code VARCHAR(50) NOT NULL
	,g_name VARCHAR(50) NOT NULL
	,g_price INT(11) NOT NULL
	,g_seller_id VARCHAR(50) NOT NULL
	,g_reg_date DATE NOT NULL
	,PRIMARY KEY (g_code)
	,CONSTRAINT FK_g_seller_id FOREIGN KEY (g_seller_id) REFERENCES tb_member(m_id)
);

 

속성이 주문번호, 구매자 아이디, 주문상품코드, 주문수량, 주문등록날짜로 구성되고 기본키(자동증가)가 주문번호이고, 구매자 아이디는 회원테이블의 아이디를 참조하며 주문상품코드는 상품테이블의 상품코드를 참조하는 테이블을 생성하시오.
CREATE TABLE tb_order (
	o_num INT(11) NOT NULL AUTO_INCREMENT
	,o_id VARCHAR(200) NULL DEFAULT NULL
	,o_g_code VARCHAR(200) NULL DEFAULT NULL
	,o_amount INT(11) NULL DEFAULT NULL 
	,o_reg_date DATETIME NULL DEFAULT NULL
	,PRIMARY KEY (o_num)
	,CONSTRAINT FK_o_g_coed FOREIGN KEY (o_g_code) REFERENCES tb_goods (g_code)
	,CONSTRAINT FK_o_id FOREIGN KEY (o_id) REFERENCES tb_member (m_id)
);

 

로그인 번호, 로그인 아이디, 로그인 날짜, 로그아웃 날짜 속성으로 구성되고, 기본키(자동증가)가 로그인 번호이고, 로그인 아이디는 회원테이블의 아이디를 참조하는 로그인 테이블을 생성하시오.
CREATE TABLE tb_login (
	login_num INT(11) NOT NULL AUTO_INCREMENT
	,login_id VARCHAR(200) NOT NULL 
	,login_date DATE NOT NULL
	,logout_date DATE NOT NULL
	,PRIMARY KEY (login_num)
	,CONSTRAINT FK_login_id FOREIGN KEY (login_id) REFERENCES tb_member (m_id)
);

 

코멘트를 잘 작성하자!


다음과 같이 회원레벨 테이블에 삽입하는 SQL 문장을 작성하시오.

 

INSERT INTO tb_member_level
(level_num, level_name, level_reg_date)
VALUES
(1, '관리자', '2020-03-17')
,(2, '판매자', '2020-03-17')
,(3, '구매자', '2020-03-17');

 

각 데이터를 각 테이블에 삽입하는 SQL 문장 작성.
외래키가 참조된 순서에 맞추어 insert문을 작성해주어야 한다.

 


SQL 집계함수

SELCET 구문이나 HAVING절에서 사용한다.

집계 함수
함수명 함수표기 설명
SUM SUM() 합계를 구한다.
AVG AVG() 평균을 구한다.
MIN MIN() 최소값을 구한다.
MAX MAX() 최대값을 구한다.
COUNT COUNT() 행의 개수를 센다. (NULL무시)
COUNT DISTINCT COUNT(DISTINCT) 행의 개수를 센다. (중복은 1개만 인정)
SELECT
	o.o_id AS '구매자 아이디'
	,sum(o.o_amount) AS '총 주문수량'
	,AVG(o.o_amount) AS '평균 주문수량'
	,ROUND(AVG(o.o_amount),1) AS '평균 주문수량'
	,COUNT(o.o_amount) AS '총 주문횟수'
	,MAX(o.o_amount) AS '최대 주문수량'
	,MIN(o.o_amount) AS '최소 주문수량'
FROM
	tb_order AS o
GROUP BY o.o_id
;

round( n , 반올림 할 소수점 자리수 )

 

실행 순서 인지하기 (tb_order AS o 선언 시점이 사용 시점 이전에 있어야 한다!)

 


SQL 내장함수

데이터 형식 변환 함수

-- 형변환

SELECT
		NOW() AS 'DATETIME'
		,CAST(NOW() AS DATE) AS 'DATE'
		,CAST(NOW() AS TIME) AS 'TIME';
        
        
SELECT
    CONVERT (AVG(o.o_amount), SIGNED INTEGER) AS '평균 주문 개수'
FROM
    tb_order o;
    
 --   정수 타입: 음수까지 표현할 수 있는 SIGNED 타입
 --    		  양수만을 표현할 수 있는 UNSIGNED 타입

 

문자열 연결함수

-- 문자열 연결함수

SELECT
	CONCAT(m.m_id, ' : ',m.m_name) AS '회원 아이디 : 회원 이름'
FROM 
	tb_member m;

 

암시적인 형변환

-- 문자와 문자를 더함 (정수로 변환되서 연산됨)
SELECT '100' + '200’ ;
-- 문자와 문자를 연결 (문자로 처리)
SELECT CONCAT('100', '200’); 
-- 정수와 문자를 연결 (정수가 문자로 변환되서 처리)
SELECT CONCAT(100, '200’);

제어 흐름 함수

SELECT IF (조건식, true시 반환하는 값, false시 반환하는 값);

-- 조건이 null이 아닐 경우 조건을 반환.
SELECT IFNULL(조건, null일경우 반환하는 값);

-- 조건1과 조건2가 같을 경우 null값을 반환, 다를경우 조건1을 반환
SELECT NULLIF(조건1,조건2);

 

 

문자열 함수

-- 문자를 ascii 코드로 변환 / ascii코드를 문자로 변환
SELECT ASCII('A'), CHAR(65);

-- 공백을 제거
SELECT TRIM('   KSMART35   ') AS result;

-- 반복
SELECT REPEAT('KSMART', 3) AS result;

-- 문자열 대체
SELECT REPLACE ('KSMART35기', 'KSMART' , '한국스마트정보교육원') AS result;

-- 문자열을 거꾸로 출력
SELECT REVERSE ('KSMART35') AS result;

-- 공백을 추가, 문자열 연결
SELECT CONCAT('KSMART', SPACE(15), '35기') AS result;

 

날짜 함수

SELECT 
   ADDDATE('2020-03-18', INTERVAL 31 DAY)
  ,ADDDATE('2020-03-18', INTERVAL 1 MONTH)

  ,SUBDATE('2020-03-18', INTERVAL 31 DAY)
  ,SUBDATE('2020-03-18', INTERVAL 1 MONTH)

  ,ADDTIME('2020-03-18 23:59:59', '1:1:1')
  ,ADDTIME('15:00:00', '2:10:10')

  ,SUBTIME('2020-03-18 23:59:59', '1:1:1')
  ,SUBTIME('15:00:00', '2:10:10');

SELECT 
   YEAR(CURDATE())
  ,MONTH(CURDATE())
  ,DAYOFMONTH(CURDATE());

SELECT 
   HOUR(CURTIME())
  ,MINUTE(CURRENT_TIME())
  ,SECOND(CURRENT_TIME())
  ,MICROSECOND(CURRENT_TIME());

SELECT DATE(NOW()), TIME(NOW());

curdate() <현재날짜

year >int data type 으로 반환

SELECT 
   DATEDIFF('2020-08-06', NOW())
  ,TIMEDIFF('17:30:01', CURRENT_TIME());

SELECT 
   DAYOFWEEK(CURDATE())
  ,MONTHNAME(CURDATE())
  ,DAYOFYEAR(CURDATE());

SELECT LAST_DAY('2020-03-18');

시스템 함수

SELECT SLEEP(3);

SELECT 
    a.*
FROM 
    tb_member a,(SELECT SLEEP(3)) b;

n초 뒤에 결과 반환


MySQL 변수

SET @myNumber1 = 1;
SET @myNumber2 = 2.3;
SET @myStr1 = '합계:';

SELECT
    @myNumber1 AS '변수1'
   ,@myNumber2 AS '변수2';
 
SELECT
    @myStr1
   ,@myNumber1 + @myNumber2) AS '합계';
 
SELECT
    @myStr1
   ,ROUND((@myNumber1 + @myNumber2), 3) AS '합계';

SELECT 문 조건 연산자

비교 연산자 논리 연산자
연산자 의미 연산자 의미
= 같다 AND 모든 조건을 만족해야 검색
<> 다르다 OR 여러 조건 중 한가지만 만족해도 검색
< 작다 NOT 조건을 만족하지 않는 것만 검색
> 크다  
<= 작거나 같다
>= 크거나 같다

 

SELECT 문 조건 LIKE 키워드

사용 예 설명
LIKE '데이터%' '데이터'로 시작하는 문자열 (길이는 상관 없다.)

LIKE '%데이터'

'데이터'로 끝나는 문자열 (길이는 상관 없다.)
LIKE '%데이터%' '데이터'가 포함된 문자열
LIKE '데이터____' 데이터로 시작하는 7자 길이의 문자열
LIKE '__데%' 세번째 글자가 '데'인 문자열

 


SQL JOINS

INNER JOIN

SELECT
	m.m_id			AS '회원 아이디'
	,m.m_name		AS '회원 이름'
	,l.level_name	AS '회원 권한'
FROM
	tb_member m
	INNER join
	tb_member_level l
	on
	m.m_level = l.level_num
WHERE
	l.level_name LIKE '%판매%';

 

'Database' 카테고리의 다른 글

[Database] 데이터베이스 설계  (0) 2020.03.25
[Database] join  (0) 2020.03.25
[Database] SQL 활용 ①  (3) 2020.03.18
[Database] MySQL 실습  (0) 2020.03.11

데이터모델링

복잡한 현실 세계에 존재하는 데이터를 단순화 시켜 표현해 컴퓨터 세계의 데이터베이스로 옮기는 변환 과정

데이터 모델링 특성
추상화(Abstraction) 단순화(Simple) 명확성(Clarity)
현실세계를 간략하게 표현 누구나 쉽게 이해할 수 있도록 표현

명확하게 의미가 해석되어야 하고

한 가지 의미를 가져야 함.

 

현실 세계  개념적 구조 논리적 구조

개념적 데이터 모델

논리적 데이터 모델

사람의 머리로 이해할 수 있도록
현실 세계를 개념적인 형태로 모델링하여
데이터베이스의 개념적 구조로 표현하는 도구

개념적 구조를 논리적 형태로 모델링하여
데이터베이스의 논리적 구조로 표현하는 도구

데이터 모델링 (개체-관계 모델)

관계 (relationship)

  • 개체와 개체가 맺고 있는 의미 있는 연관성
  • 개체 집합들 사이의 대응관계, 즉 매핑(mapping)을 의미
  • 예) 고객 개체와 상품 개체 간의 구매 관계 > "고객은 상품을 구매한다."

관계의 유형

  • 일대일 (1 : 1) 관계
  • 일대다 (1 : N) 관계
  • 다대다 (N : M) 관계

E-R 다이어그램

E-R 다이어그램 도형 기호

 


관계형 데이터 모델

 

데이터 베이스의 구성

 

데이터베이스 스키마 (database schema)

  • 데이터베이스의 전체 구조
  • 데이터베이스를 구성하는 릴레이션 스키마의 모음

데이터베이스 인스턴스 (database instance)

  • 데이터베이스를 구성하는 릴레이션 인스턴스의 모음
릴레이션의 특성
튜플의 유일성 튜플의 무순서 속성의 무순서 속성의 원자성
하나의 릴레이션에는 동일한 튜플이 존재할 수 없다. 하나의 릴레이션에서 튜플 사이의 순서는 무의미하다. 하나의 릴레이션에서 속성사이의 순서는 무의미하다. 속성 값을 원자 값으로 사용할 수 있다.

 

릴레이션에서 튜플들을 유일하게 구별하는 속성 또는 속성들의 집합

 

키의 특성

유일성(uniqueness) 최소성(minimality)
데이터베이스를 구성하는 릴레이션 스키마의 모음 꼭 필요한 최소한의 속성들로만 키를 구성

 

키의 종류

기본키 (primary key) 후보키 (candidate key) 대체키 (alternate key) 슈퍼키 (super key)
후보키 중에서 기본적으로 사용하기 위해 선택한 키 유일성과 최소성을 만족하는 속성 또는 속성들의 집합 기본키로 선택되지 못한 후보키 유일성을 만족하는 속성 또는 속성들의 집합

외래키 ( foreign key)

  • 다른 릴레이션의 기본키를 참조하는 속성 또는 속성들의 집합
  • 릴레이션들 간의 관계를 표현
    • 참조하는 릴레이션 : 외래키를 가진 릴레이션
    • 참조되는 릴레이션 : 외래키가 참조하는 기본키를 가진 릴레이션

 

제약조건

 

무결성 제약조건 (integrity constraint)

- 데이터의 무결성을 보장하고 일관된 상태로 유지하기 위한 규칙

- 무결성 : 데이터를 결함이 없는 상태, 즉 정확하고 유효하게 유지하는 것

개체 무결성 제약조건 (entity integrity constraint) 참조 무결성 제약조건 (referential integrity constraint)
기본키를 구성하는 모든 속성은 null 값을 가질 수 없는 규칙

외래키는 참조할 수 없는 값을 가질 수 없는 규칙

※ 외래키의 속성이 null 값을 가진다고 참조 무결성을 위반하는 것 은 아니다

 


MySQL 데이터 타입

숫자 데이터 형식

데이터 형식 바이트 수  숫자범위 설명
BIT N/8   Bit 표현
TINYINT 1 -128 ~ 127 정수
SMALLINT 2 -32,768 ~ 32,767 정수
MEDIUMINT 3 -8,388,608 ~ 3,388,607 정수
INT 4 약 -21억 ~ 21억 정수
BIGINT 8 약 -900경 ~ 900경 정수
FLOAT 4 -3.40E+38 ~ 1.79E-38 소수점 7자리
DOUBLE 8 -122E-308 ~ 1.79E+308 소수점 15자리
DECIMAL(m,[d]) 5~17 -10^38+1 ~ 10^38 -1 소수점

 

문자 데이터 형식

데이터 형식 바이트 수  설명
CHAR 1~255 고정길이 문자형
VARCHAR 1~65535 가변길이 문자형
BINARY 1~255 고정길이의 이진 데이터 값
VARMINARY 1~255 가변길이의 이진 데이터 값
TEXT 1~65535 N크기의 TEXT데이터 값
BLOB 1~65535 N크기의 BLOB 데이터 값
ENUM 1 or 2 최대 65535개의 열거형 데이터 값
SET 1, 2, 3, 4, 8 최대 64개의 서로 다른 데이터 값

한글 데이터를 BINARY로 변환하여 ORDER BY 할 수 있음

 

날짜 데이터 형식

데이터 형식 바이트 수 설명
DATE 3

날짜 : 1001-01-01~999-12-31 까지 저장

날짜형식만 사용 'YYYY-MM-DD'

 

TIME 3

시간: -838:59:59.000000~838:59:59.000000까지 저장

형식: ‘HH:MM:SS’

DATETIME 8

날짜: 1001-01-01 00:00:00~9999-12-31 23:59:59 저장

형식: ‘YYYY-MM-DD HH:MM:SS

TIMESTAMP 4

날짜: 1001-01-01 00:00:00~9999-12-31 23:59:59 저장

형식: ‘YYYY-MM-DD HH:MM:SS

Time_zone 시스템 변수와 관련 있으며 UTC 변환 저장

YEAR 1

날짜: 1901~2155까지 저장.

형식: ‘YYYY’

 

 

 

 

'Database' 카테고리의 다른 글

[Database] join  (0) 2020.03.25
[Database] SQL 활용 ②  (0) 2020.03.18
[Database] MySQL 실습  (0) 2020.03.11
[Database] MySQL 설치 / 키워드 및 실습  (0) 2020.03.11

랜덤한 data를 얻을 수 있는 website

https://www.mockaroo.com/

 

Mockaroo - Random Data Generator and API Mocking Tool | JSON / CSV / SQL / Excel

Paste the header row from your CSV, TXT, or Excel file to create multiple fields at once.

www.mockaroo.com


db 생성

CREATE DATABASE db01 DEFAULT CHARACTER SET UTF8;
CREATE DATABASE db01 DEFAULT CHARACTER SET UTF8;
/* 영향 받은 행: 1  찾은 행: 0  경고: 0  지속 시간 1 쿼리: 0.016 sec. */


 

table 생성

CREATE TABLE costomer (
	c_id			VARCHAR(100) NOT NULL PRIMARY KEY 
	,c_pw 		VARCHAR(100) NOT NULL 
	,c_name		VARCHAR(100) NOT NULL 
	,c_birth		DATE			
	,c_add 		VARCHAR(100) NOT NULL 
	,c_phone		VARCHAR(100) NOT NULL 
	,c_balance		INT			NOT NULL 	
	,c_update		DATE		NOT NULL 
);

 


mokaroo에서 field name, type, table name을 알맞게 설정하고 랜덤한 데이터를 생성

연습용으로 500개의 데이터를 생성했다.

 

다운로드한 costomer.sql 파일을 MySQL의 쿼리 창에 드래그앤 드랍 한다.

MySQL의 쿼리창에 costomer.sql 이 불러오기 된다.

 

f9 로 실행시 데이터들이 추가된다!

 

.
.
.
.
insert into costomer (c_id, c_pw, c_name, c_birth, c_add, c_phone, c_balance, c_update) values ('com.sun.Overhold', 'DvUBBNrUW', 'Degoey', '1989-12-01', '77668 Arrowood Plaza', '985-746-8085', 69223481, '2019-12-26');
insert into costomer (c_id, c_pw, c_name, c_birth, c_add, c_phone, c_balance, c_update) values ('ca.cbc.Stringtough', 'bjCAP2a', 'Toulamain', '1976-10-17', '504 Londonderry Drive', '786-305-4802', 12367696, '2019-11-29');
insert into costomer (c_id, c_pw, c_name, c_birth, c_add, c_phone, c_balance, c_update) values ('com.discovery.Bigtax', 'mR9EyMKSn', 'Dring', '1969-11-25', '75165 Randy Hill', '683-451-3427', 80079873, '2019-08-11');
insert into costomer (c_id, c_pw, c_name, c_birth, c_add, c_phone, c_balance, c_update) values ('edu.uiuc.Cardify', 'sx9368zeS', 'Carruthers', '1997-12-08', '4 Grim Drive', '534-197-3281', 79275848, '2020-01-30');
/* SQL 오류 (1062): Duplicate entry 'edu.uiuc.Cardify' for key 'PRIMARY' */
/* 영향 받은 행: 354  찾은 행: 0  경고: 0  지속 시간 354 of 500 쿼리: 0.672 sec. */

Primary key 값으로 edu.uiuc.Cardify값이 중복되어 354번째 행에서 실행이 멈추었다.

(랜덤데이터에서 중복이 나오다니!)

 


 

 

'Database' 카테고리의 다른 글

[Database] SQL 활용 ②  (0) 2020.03.18
[Database] SQL 활용 ①  (3) 2020.03.18
[Database] MySQL 설치 / 키워드 및 실습  (0) 2020.03.11
[Database] SQL(Structured Query Language)  (0) 2020.03.11

Heidi SQL : SQL을 편리하게 작업할 수 있도록 GUI와 기능을 제공

MySQL : Database 서버를 만들고 접근할 수 있다

root 최상위관리자

 

DB생성

F9 > 실행

쿼리 2초 이상 : error로 간주

 

 

파일> 세션관리자 >> 데이터베이스 > 사용할 세션만 체크 > 저장

 

 

세션이 연결되어 시작됨

 

단축키 설정

 

db  > 보통 snake 표기법 사용 (abc_abc를 이용해 연결) 절대적이진 않음.

java > camel (abcAbc)

 


DDL - CREATE 구문

 

 

쿼리에서 코드를 작성하여 생성하기 

 

 gui를 활용하여 db>새로생성>테이블로 생성하기

<CREATE 코드> 탭에서 생성된 코드를 확인할 수 있다.

 


DML - INSERT 구문

데이터 삽입하기.

NOW()  > 현재 연월일시분초.

 

같은 코드를 두번 실행했을 경우 오류.

primary key 값은 중복되어 삽입되지 않음.

 

여러 데이터를 한번에 insert


DML - SELECT 구문

as > 별칭부여

 

* > 전체

 


DML - UPDATE 구문

**u_name 속성에 홍05 값을 가진 데이터가 있는지 확인**

 

u_name 속성이 홍05인 데이터의 u_add 속성의 값을 금암동으로 변경.

 

 


AS를 이용해 호출을 짧게!

 

 

 

 


DML - DELETE 구문

**usertb 테이블에 u_id이 값이 id011인 데이터가 있는지 확인**

 

**delete 구문을 사용할 때 where 조건이 있는지 꼭 확인!**

f9:실행


DML DELETE vs. DDL TRUNCATE

delete : 행들을 하나씩 전부 삭제

truncate : 테이블을 전체 드랍한 뒤 새로 생성함

 


 

 


복제

전체 복제

CREATE TABLE usertb_backup_all 
(SELECT 
      * 
 FROM 
    usertb); 

부분 복제

CREATE TABLE usertb_backup
(SELECT
    b.u_id
   ,b.u_pw
   ,b.u_name
 FROM
   usertb AS b);

ON DUPLICATE KEY UPDATE

중복 키 오류 발생 시 사용자가 원하는 값을 직접 설정

INSERT INTO usertb (u_id, u_pw, u_name, u_birth, u_add, u_mobile1, u_mobile2, u_date)
VALUES
('id001', 'pw001', '01', '2020-01-10', '덕진동', '010', '00010001', '2020-03-10')
ON DUPLICATE KEY UPDATE
u_birth = '2019-01-10’;


IGNORE

중복되면 오류 무시/ 중복되지 않으면 실행

INSERT IGNORE INTO usertb (u_id, u_pw, u_name, u_birth, u_add, u_mobile1, u_mobile2, u_date)
VALUES('id010','pw010','홍10','2020-10-10','덕진동','010','00010001','2020-03-10');
INSERT IGNORE INTO usertb (u_id, u_pw, u_name, u_birth, u_add, u_mobile1, u_mobile2, u_date)
VALUES('id011','pw011','홍11','2020-11-10','덕진동','010','00010001','2020-03-10');

 


ON DUPLICATE KEY UPDATE vs. INSERT IGNORE vs. REPLACE INTO

 

http://jason-heo.github.io/mysql/2014/03/05/manage-dup-key2.html

 

MySQL 중복 키 관리 방법 (INSERT 시 중복 키 관리 방법 (INSERT IGNORE, REPLACE INTO, ON DUPLICATE UPDATE)

안내 본 문서는 블로그의 운영자인 본인이 Stackoverflow에 올린 답변을 정리한 글입니다. Stackoverflow URL http://stackoverflow.com/questions/20342518/on-duplicate-key-update-value-inserting-same-values-twice/20342598 질문 다음과 같이 INSERT 구문을 사용 중이다. INSERT INTO person VALUES(NULL, 15, 'James'

jason-heo.github.io


 

ORDER BY

오름차순 DESC

 

내림차순 ASC

 

 


LIMIT

 

 

limit의 인자값 5에 맞추어 5개 행만 보이게 된다.

 

행은 0번부터 시작된다.

 

출력되는 행을 잘 확인하자


DISTINCT

중복 데이터 하나만 조회

 

GROUP BY

HAVING

 

'Database' 카테고리의 다른 글

[Database] SQL 활용 ①  (3) 2020.03.18
[Database] MySQL 실습  (0) 2020.03.11
[Database] SQL(Structured Query Language)  (0) 2020.03.11
[Database] 데이터베이스  (0) 2020.03.11

+ Recent posts