SQL 첫걸음

1장 데이터베이스와 SQL

3. 데이터베이스 서버

  • RDBMS의 클라이언트/ 서버
    • 웹 시스템에는 없었던 사용자 인증이 필요하다
    • 사용자 별로 데이터베이스 접근을 제한
  • SQL 명령 실행
    • 한 번 DB에 접속하면, 이를 유지하여 재접속 없이 SQL 명령을 여러 번 보낼 수 있다
  • 실제 데이터베이스에 접속하는 것은 CGI 프로그램 이다

  • Client -> WebServer -> CGI -> DB
    • Request 가 요론식으로 흘러가고 최우측은 가장 가까운 좌측을 client 로 보는 것
    • 실제로 대규모 시스템에서 이러한 구조를 가져갈 경우 웹서버나 DB서버를 여러대로 증설 가능하다
  • Client-Server 모델은 시스템의 하드웨어 구성을 유연하게 해줌

  • 자신의 PC에 클라이언트와 서버가 모두 있을 경우
    • 네트워크를 경유해서 PC의 서버로 되돌아오는 형태로 접속한다
    • 이를 루프 백 접속이라 부른다

8강 패턴 매칭에 의한 검색

1. LIKE로 패턴 매칭하기

  • 와일드 카드
    • % : 임의의 문자열, 즉 복수개의 문자
    • _ : 임의의 문자, 즉 하나의 문자
    • ex)
      SELECT * 
      FROM sample1
      WHERE text like 'SQL%';
    
    • 만약 검색조건에 ‘%’, ‘_’ 를 포함하고 싶을 경우
      • 이스케이프 처리 (\%)
        • 추가로 홑따옴표 같은 경우에는 두 개를 연달아 씀으로 이스케이프 (‘’)

10강. 복수의 열을 지정해 정렬하기

SELECT *
FROM sample1
ORDER BY order_no, cancel_date;
  • 먼저 order_no 로 정렬 하고, 값이 같은 경우 cancel_date 로 정렬하여 노출한다.
SELECT *
FROM sample1
ORDER BY order_no ASC, cancel_date DESC;
  • 정렬방법을 지정하는 것도 가능

11강. 결과 행 제한하기 - LIMIT

  • 보통 offset과 함께 페이징 할 때 많이 사용됨.
SELECT *
FROM sample1
LIMIT 10 OFFSET 10;
  • 실행결과 11번째부터 20번째데이터 까지 10개를 가져올 것.

12강. 수치 연산

  • 처리순서 : WHERE 구 -> SELECT 구 -> ORDER BY 구
  • 때문에 SELECT 에서 as 로 alias 를 지정한 경우 where 절에서는 사용 불가, orderby 에서는 사용 가능

13강. 문자열 연산

  • +, ||, CONCAT 함수 로 문자열 결합 가능

  • ex) sample35 table. | no | price | quantity | unit | |:—:|:—:|:—:|:—:| | 1 | 100 | 10 | 개 | | 2 | 230 | 24 | 캔 | | 3 | 1980 | 1 | 장 |

SELECT CONCAT(quantity, unit)
FROM sample35
  • result | CONCAT(quantity, unit) | |:—:| | 10개 | | 24캔 | | 1장 |

  • SUBSTRING 함수
    • ex) SUBSTRING(‘20140125001’, 1, 4) -> ‘2014’
  • TRIM 함수
    • 문자열의 앞 뒤 공백 제거 문자열 사이의 공백은 제거되지 않음
    • ex) TRIM(‘ABC ‘) -> ‘ABC’
  • CHARCTER_LENGTH 함수
    • VARCHAR 같은 가변형의 경우 길이가 서로 다르기 때문

14강. 날짜 연산

  • 오라클의 경우 문자열 데이터 -> 날짜형 데이터
    • TO_DATE(‘2014/01/25’, ‘YYYY/MM/DD’)
    • 반대는 TO_CHAR
  • 날짜의 덧셈과 뺄셈
    • SELECT CURRENT_DATE + INTERVAL 1 DAY;
    • SELECT CURRENT_DATE - INTERVAL 1 DAY;
  • 날짜형 간의 뺄셈
    • MySQL : DATEDIFF(‘2014-02-28’, ‘2014-01-01’)

15강. CASE 문으로 데이터 변환하기

  • CASE문 SYNTAX
CASE WHEN 조건식1 THEN 식1
[ WHEN 조건식2 THEN 식2 ... ]
[ ELS 식3 ] 
END
  • sample 37 table | a | |:—:| | 1 | | 2 | | NULL |

  • case 문으로 null 을 0 으로

SELECT a,
    CASE WHEN a IS NULL THEN 0
    ELSE a
    END
    as "a(null=0)"
FROM sample37;
  • result | a | a(null=0) | |:—:|:—:| | 1 | 1 | | 2 | 2 | | NULL | 0 |

  • 사실 이걸 간단하게 하는 COALESCE 함수가 존재함

    • 복수 개의 argumnet 를 지정 가능 하고,
    • 주어진 인수 가운데 NULL 이 아닌 값에 대해서는 가장 먼저 지정된 인수의 값을 반환
    • COALESCE(a, 0) 하면
      • a 가 null 이 아니면 그대로 a 일 것이고,
      • a 가 null 이면 0 이 출력될 것

22강 그룹화

  • 내부 처리 순서
    • WHERE 구 > GROUP BY 구 > HAVING 구 > SELECT 구 > ORDER BY 구

23강 서브쿼리

  • 괄호로 묶어서 지정

  • ex) 테이블에서 a 의 최솟값 row 삭제. (SELECT MIN(a) FROM sample54) 요게 서브쿼리

DELETE FROM sample54 WHERE a = (SELECT MIN(a) FROM sample54);
  • 서브쿼리의 패턴
    • 1) 하나의 값을 반환하는 패턴
      • ex) SELECT MIN(a) FROM sample54;
    • 2) 복수의 행이 반환되지만 열은 하나인 패턴
      • ex) SELECT no FROM sample54;
      no
      1
      2
      4
    • 3) 하나의 행이 반환되지만 열이 복수인 패턴
      • ex) SELECT MIN(a), MAX(no) FROM sample54;
      MIN(a) MAX(no)
      80 4
    • 4) 복수의 행, 복수의 열이 반환되는 패턴
  • SELECT 명령이 하나의 값만 반환하는 것을 스칼라 값을 반환한다 고 한다
    • 이런 1)번 같은 패턴이 서브쿼리로 사용하기 젤쉽다