본문 바로가기
개발/SQL

[SQL] #1

by dangbok 2024. 1. 9.

도서 <혼자 공부하는 SQL> 참고

 

1) 데이터베이스와 SQL

  • 데이터베이스란 '데이터의 집합' <-- 관리하고 운영하는 소프트웨어를 DBMS
  • SQL 데이터베이스를 구축, 관리하고 활용하기 위해서 사용되는 언어
  • MySQL
  • 데이터베이스 모델링

 

2) SQL 기본문법

  • SELECT ~ FROM ~ WHERE

FROM 테이블_이름

WHERE 조건식

GROUP BY _이름

HAVING 조건식

ORDER BY _이름

LIMIT 숫자

  • ORDER BY: 결과의 정렬을 위함
  • LIMIT: 결과의 개수를 제한함
  • DISTINCT: 중복된 데이터를 제거함
  • GROUP BY: 지정한 열의 데이터들을 같은 데이터끼리 묶어서 결과를 추출함(합계, 평균, 개수 )
  • HAVING: GROUP BY절과 함께 사용(WHERE 동일)
  • INSERT INTO ~ VALUES ()

SET @@auto_increment_increment=3; -> 시스템 변수: MySQL에서 자체적으로 가지고 있는 설정값이 저장된 변수

  • 다른 테이블의 데이터를 한번에 입력하는 INSERT INTO ~ SELECT
  • UPDATE SET WHERE~
  • DELETE FROM WHERE~

 

3) SQL 고급문법

  • 데이터 형식

-> CHAR 글자의 개수가 고정된 경우, VARCHAR 글자의 개수가 변동될 경우에 사용

  • 대량의 데이터 형식: 문자형인 CHAR 최대 255자까지, VARCHAR느느 최대 1683까지 지정이 가능함
  • 실수형: 소수점이 있는 숫자 저장시 사용
  • 날짜형: DATE, TIME, DATETIME
  • 변수의 사용: 임시 사용

SELECT @변수이름;

  • PREPARE 실행하지 않고 SQL문만 준비해 놓고 EXECUTE에서 실행하는 방식
  • 데이터 변환
  • 테이블을 묶는 조인

FROM < 번째 테이블>

INNER JOIN < 번째 테이블>

ON <조인될 조건>

[WHERE 검색 조건]

Ex)

SELECT *

FROM buy

INNER JOIN MEMBER

        ON buy.mem_id = member.mem_id

WHERE buy.mem_id='GRL';

 

* 코드가 너무 길어져 복잡해 보일 때는 테이블의 이름 뒤에 별칭을 있음

  • 외부 조인: 양쪽 중에 한곳이라도 내용이 있을 조인되는 방식

FROM < 번째 테이블(LEFT 테이블)>

<LEFT | RIGHT | FULL> OUTER JOIN < 번째 테이블(RIGHT 테이블)>

ON <조인될 조건>

[WHERE 검색 조건];

EX)

SELECT M.MEM_ID, M.MEM_NAME, B.PROD_NAME, M.ADDR

FROM MEMBER M

LEFT OUTER join BUY B -> 왼쪽 테이블의 내용은 모두 출력되어야

        ON M.MEM_ID =B.MEM_ID

order by M.MEM_ID;

  • 기타 조인:

EX) SELECT * FROM BUY CROSS JOIN MEMBER;

  • ON 구문 불가능
  • 결과의 내용은 의미가 없음 랜덤으로 조인하기 때문
  • 상호 조인의 용도는 테스트하기 위해 대용량의 데이터를 생성시
  • 자체 조인: 자신이 자신과 조인한다는 의미

FROM <테이블> 별칭A

INNER JOIN <테이블> 별칭B

ON <조인될 조건>

[WHERE 검색 조건]

 

  • SQL 프로그래밍

CREATE PROCEDURE -> 스토어드_프로시저_이름()

BEGIN

-> 부분에 SQL 프로그래밍

END $$

DELIMITER;

CALL

  • IF

SQL문장들

END IF;

  • 문장 이상이 처리되어야 때는 BEGIN~END 묶어줘야
  • IF ~ ELSE
  • CASE

WHEN 조건1 THEN

SQL문장들1

WHEN 조건2 THEN

SQL문장들2

ELSE

SQL문장들3

END CASE;

  • WHILE

SQL문장들

END WHILE;

  • ITERATE [레이블]: 지정한 레이블로 가서 계속 진행
  • LEAVE [레이블]: 지정한 레이블을 빠져나감 WHILE 종료
  • 동적 SQL

 

4) 테이블과

  • 테이블

Ex) FOREIGN KEY(mem_id) REFERENCES member(mem_id) --> member 테이블의 mem_id에도 값이 있어야 한다는

  • 기본 , 외래 키의 제약조건 설정 필요

EX) ALTER TABLE member

ADD CONSTRAINT

CHECK (phone IN ('02', '031', '032'));

  • DEFAULT 정의

EX) ALTER TABLE member

ALTER COLUMN phone1 SET DEFAULT '02'; <-- 열에 DEFAULT 지정

  • NULL 허용

AS

SELECT ;

  • SELECT _이름 FROM _이름

[WHERE 조건];

  • 뷰는 기본적으로 읽기 전용으로 사용되지만 뷰를 통해서 원본 테이블의 데이터 수정 가능
  • 뷰를 사용하는 이유
  • 뷰의 실제 작동

, 뷰를 조회할 때는 이름에 공백이 있으면 백틱(`)으로 묶어줘야

  • 뷰의 수정은 ALTER VIEW 구문 사용하고 이름에 한글 사용 가능
  • 뷰의 삭제는 DROP VIEW 구문 사용
  • 뷰의 정보 확인은 DESCRIBE 구문 사용
  • 뷰를 생성할 CREATE VIEW 기존에 뷰가 있으면 오류가 발생하지만, CREATE OR REPLACE VIEW 기존에 뷰가 있어도 덮어쓰는 효과를 내기 때문에 오류 발생X
  • 뷰의 소스 코드 확인은 SHOW CREATE VIEW 구문 사용
  • WITH CHECK OPTION 통해 뷰에 설정된 값의 범위가 벗어나는 값은 입력되지 않도록 지정

EX) ALTER VIEW v_height167

       AS

SELECT * FROM member WHERE height >=167

WITH CHECK OPTION;

INSERT INTO v_hight167 VALUES('TOB', '텔레토비', 4, '영국', NULL, NULL, 140, '1995-01-01');

  • 뷰가 조회되지 않으면 CHECK TABLE 문으로 뷰의 상태 확인 가능

--> 뷰가 참조하는 테이블이 없어서 오류가 발생하는

 

5) 인덱스

  • 인덱스는 SELECT 사용해서 테이블을 조회할 결과를 빠르게 추출하도록 도와주는 기능
  • 하나의 열에 여러 개의 인덱스를 생성할 수도 있고, 여러 개의 열을 묶어서 하나의 인덱스 생성 가능하지만 드문 경우
  • 인덱스는 균형 트리의 자료구조로 구성됨
  • SHOW INDEX 문을 사용하면 인덱스 정보가 확인됨
  • WHERE 절의 열에 연산을 하면 인덱스를 사용하지 않음
  • CREATE INDEX 문을 사용하면 인덱스 생성 --> 보조 인덱스

ON 테이블_이름 (_이름) [ASC | DESC]

  • DROP INDEX 문을 사용하면 인덱스 제거

ALTER TABLE 문으로 기본 키나 고유 키를 제거하면 자동으로 생성된 인덱스 제거 가능

  • 클러스터형 인덱스와 보조 인덱스가 섞여 있을 때는 보조 인덱스를 먼저 제거하는 것이 좋음
  • 클러스터형 인덱스
  • 보조 인덱스
  • 고유 인덱스
  • 인덱스를 효과적으로 사용하는 방법

 

6) 스토어드 프로시저

  • 스토어드 프로시저는 SQL 프로그래밍 기능을 추가해서 일반 프로그래밍 언어와 비슷한 효과 가능
  • DELIMITER $$

CREATE PROCEDURE 스토어드_프로시저_이름( IN 또는 OUT 매개변수 )

BEGIN

SQL 프로그래밍 코드

END $$

DEELIMITER;

  • CREATE에서는 스토어드 프로시저 이름 뒤에 괄호를 붙이지만, DROP에서는 괄호를 붙이지 않음
  • 입력 매개변수는 스토어드 프로시저에 값을 전달함
  • 출력 매개변수는 스토어드 프로시저에서 계산된 결과를 돌려받음
  • 동적 SQL 다이나믹하게 SQL 생성한 실행
  • CALL 문을 통해서 스토어드 프로시저를 호출
  • 스토어드 함수

CREATE FUNCTION 스토어드_함수_이름(매개변수)

RETURNS 반환형식

BEGIN

부분에 프로그래밍 코딩

RETURN 반환값;

END $$

DELIMITER;

SELECT 스토어드_함수_이름();

  • 매개변수는 모두 입력 매개변수 IN 사용x
  • 스토어드 프로시저는 여러 SQL 문이나 숫자 계산 등의 다양한 용도로 사용하지만, 스토어드 함수는 어떤 계산을 통해서 하나의 값을 반환하는데 주로 사용
  • 스토어드 함수를 사용하기 위해서 먼저 권한 허용 필요
  • 스토어드 커서
  • 트리거

CREATE TRIGGER myTrigger

AFTER DELETE -- DELETE 문이 발생된 후에 트리거를 작동하라는 의미

ON trigger_tablee

FOR EACH ROW

BEGIN

SET @msg = '가수 그룹이 삭제됨' ; -- 트리거 실행 작동되는 코드들

END $$

DELIMITER;

  • 트리거는 데이터가 삭제 또는 수정되면 기존 데이터를 백업 테이블에 저장하도록 있음
  • 트리거에서 기존 데이터는 OLD 테이블에, 새로운 데이터는 NEW 테이블에 잠깐 저장됨

 

7) SQL 파이썬 연결

  • 파이썬과 pymysql 라이브러리를 설치한 후에는 MySQL 연동하는 데이터베이스 연동 프로그램 작성 가능
  • MySQL 연결하기

Conn = pymysql.connect(host=서버IP주소, user=사용자, password=암호, db=데이터베이스, charset=utf8) -> 연결자를 생성하고 연결 통로인 커서를 통해 파이썬에서 SQL 전송

  • 커서 생성하기
  • 테이블 만들기
  • 데이터 입력하기
  • 입력한 데이터 저장하기
  • MySQL 연결 종료하기
  • 파이썬에서 SELECT 문으로 데이터를 조회한 후에는 fetchone() 함수를 통해서 데이터를 행씩 가져옴
  • GUI 응용 프로그램