SQL tutorial

SQL


SQL (Structured Query Language) : 데이터베이스에 접근하고 조작하기 위한 표준 언어

  • SQL이 하는 일
    • 데이터베이스에 대해서 쿼리를 실행할 수 있다.
    • 데이터베이스에서 정보를 검색할 수 있다.
    • 데이터베이스에 레코드를 삽입할 수 있다.
    • 데이터베이스의 레코드를 갱신할 수 있다.
    • 데이터베이스에서 레코드를 삭제할 수 있다.
    • 새 데이터베이스를 만들 수 있다.
    • 데이터베이스에서 새로운 테이블을 생성할 수 있다.
    • 데이터베이스에 저장 프로시져를 만들 수 있다.
    • 데이터베이스에 뷰를 생성할 수 있다.
    • 테이블, 프로시져, 뷰에 권한을 설정할 수 있다.
  • 데이터베이스에서 가져온 정보를 표시하는 웹사이트를 구축하기 위해 필요한 것
    • RDBMS 데이터베이스 프로그램 (MS Acess, SQL Server, MYSQL 등)
    • 서버사이드 스크립트 언어 (PHP, ASP 등)
    • HTML / CSS (페이지를 장식하기 위해)

RDBMS


RDBMS( Relational Database Management System, 관계형 데이터베이스 관리 시스템) 는 MS SQL Server, IBM DB2, Oracle, MySQL, and Microsoft Access 등 모든 현대 데이터베이스 시스템의 기본이다.

RDBMS의 데이터는 테이블이라고 불리는 데이터베이스 객체에 저장된다. 테이블은 관련된 데이터의 모음이며 열과 행으로 구성된다. 모든 테이블은 필드라고 불리는 작은 엔트리로 나뉜다.

  • 필드 : 테이블의 열이다. 테이블의 모든 레코드에 대해 특정한 정보를 유지하기 위해 디자인되었다. 테이블의 특정 필드와 관련된 모든 정보를 포함하는 테이블의 수직적인 엔트리이다.

  • 레코드 : 테이블의 행이다. 표에 개별적으로 존재하는 엔트리이다. 테이블의 수평적인 엔트리이다.

데이터베이스 테이블


데이터베이스는 대체로 하나 또는 하나 이상의 테이블을 가지고 있다. 각각의 테이블은 이름으로 식별된다. 테이블은 데이터를 가진 레코드로 구성된다.

SQL Statements


데이터베이스에서의 대부분의 작업은 SQL문으로 실행된다.

  • SQL 키워드는 대소문자를 구분하지 않는다.
  • 일부 데이터베이스 시스템은 모든 SQL 구문의 끝에 세미콜론(;)을 요구한다. 세미콜론은 서버에 동일한 호출로 하나 이상의 SQL 구문을 실행할 수 있는 데이터베이스 시스템에서 각각 SQL 구문을 구별하는 표준적인 방법이다.
  • SQL 구문
    • SELECT : 데이터베이스에서 데이터를 추출한다.
    • UPDATE : 데이터베이스에서 데이터를 수정한다
    • DELETE : 데이터베이스에서 데이터를 삭제한다.
    • INSERT INTO : 데이터베이스에 새로운 데이터를 삽입한다.
    • CREATE DATABASE : 새 데이터베이스를 만든다.
    • ALTER DATABASE : 데이터베이스를 수정한다.
    • CREATE TABLE : 새로운 테이블을 만든다.
    • ALTER TABLE : 테이블을 수정한다.
    • DROP TABLE : 테이블을 삭제한다.
    • CREATE INDEX : 인덱스(검색 키)를 만든다.
    • DROP INDEX : 인덱스를 삭제한다.

Select


select 구문은 데이터베이스에서 데이터를 추출할 때 사용한다. 반환된 데이터는 result-set이라고 불리는 결과 테이블에 저장된다.

문법

SELECT coulmn1, column2 FROM table_name;

coulmn1, column2 : 테이블 중 정보를 추출하고 싶은 필드의 이름

--모두 검색
SELECT * FROM table_name;

SELECT DISTINCT


SELECT DISTINCT 구문은 다른 값들만 반환하는데 사용된다. (중복되는 데이터가 있으면 1건만 조회)

SELECT DISTINCT coulmn1, column2
FROM table_name;

WHERE


WHERE 절은 레코드를 필터링하는데 사용된다. 특정 조건을 충족하는 레코드만 추출하는데 사용.
SQL 구문에서 텍스트 값에는 작은 따옴표를 필요하지만 숫자 필드에서는 따옴표를 사용하면 안 된다.

SELECT column1, column2
FROM table_name
WHERE condition;
  • WHERE 절에서 사용하는 연산자들
    • 같다 : =
    • 크다 : >
    • 작다 : <
    • 크거나 같다 : >=
    • 작거나 같다 : >=
    • 같지 않다. : <>, !=
    • 일정 범위 사이 : BETWEEN
    • 패턴 검색. 부분적으로 일치하는 경우 검색할 때 사용. : LIKE
    • 열에 대해 가능한 여러 개의 값 (OR조건) : IN

AND, OR and NOT


이 연산자들은 WHERE 절과 함께 쓰일 수 있다.
AND와 OR 연산자는 둘 이상의 조건에 따라 필터링할 때 쓰인다.

  • AND : AND로 분리된 모든 조건들이 참일 경우 레코드 표시
SELECT column1, column2
FROM table_name
WHERE condition1 AND condition2;
  • OR : OR로 분리된 조건 중 하나라도 참일 경우 레코드 표시
    SELECT column1, column2
    FROM table_name
    WHERE condition1 OR condition2;
  • NOT : 조건이 참이 아닐 경우 레코드 표시
    SELECT column1, column2
    FROM table_name
    WHERE NOT condition;

ORDER BY


ORDER BY 구문은 결과 세트를 오름차순 또는 내림차순으로 정렬하는데 사용된다. 기본적으로 레코드를 오름차순으로 정렬하고, 내림차순으로 정렬하고 싶을 때는 DESC 키워드를 사용해야 한다.

SELECT column1, column2
FROM table_name
ORDER BY column1, column2 ASC|DESC;

INSERT INTO


INSERT INTO 구문은 테이블에 새로운 레코드를 삽입하는데 사용된다.

  • 방법 1 : 삽입할 열과 값의 이름을 모두 지정한다.

    INSERT INTO table_name (column1 , column2)
    VALUES (value1, value2);
  • 방법 2 : 값만 지정한다. (모든 열에 대해 값을 추가하는 경우). 값의 순서가 테이블의 열과 동일한 순서로 되어있어야 한다.

    INSERT INTO table_name
    VALUES (value1, value2);

NULL Values


NULL 값이란 값을 가지고 있지 않음을 뜻한다. 표의 필드가 선택사항인 경우, 이 필드에 값을 추가하지 않고 새 레코드를 삽입하거나 수정하면 필드가 NULL값으로 저장된다.

SELECT column_names
FROM table_name
WHERE column_name IS (NOT) NULL;

UPDATE


  • UPDATE 구문이란 테이블에 있는 레코드를 수정하는데 사용된다.
    UPDATE table_name
    SET column1 = value1 , column2 = value2
    WHERE condition;

DELETE


  • DELETE 구문이란 테이블에 있는 레코드를 삭제하는데 사용된다.
    DELETE FROM table_name WHERE condition;

SELECT TOP


SELECT TOP절은 데이터베이스에서 데이터를 선택하는데 사용된다. 수천 개의 레코드가 있는 큰 테이블에서 유용하다.

  • SQL Server / MS Acess Syntax

    SELECT TOP number|percent column_name(s)
    FROM table_name
    WHERE condition;
  • MYSQL Syntax

    SELECT column_name(s)
    FROM table_name
    WHERE condition
    LIMIT number;
  • Oracle Syntax

    SELECT column_name(s)
    FROM table_name
    WHERE ROWNUM <= number;

Min and Max


  • MIN() : 선택한 열의 가장 작은 값을 반환한다.
    SELECT MIN(column_name)
    FROM table_name
    WHERE condition;
  • MAX() : 선택한 열의 가장 큰 값을 반환한다.
    SELECT MAX(column_name)
    FROM table_name
    WHERE condition;

COUNT(), AVG() AND SUM()


  • COUNT() : 특정 기준과 일치하는 행의 수 반환
    SELECT COUNT(column_name)
    FROM table_name
    WHERE condition;
  • AVG() : 숫자 열의 평균값 반환
    SELECT AVG(column_name)
    FROM table_name
    WHERE condition;
  • SUM() : 숫자 열의 합계 반환
    SELECT SUM(column_name)
    FROM table_name
    WHERE condition;

LIKE


Like 연산자는 열에서 지정된 패턴을 검색하기 위해 WHERE절에서 사용된다.

  • % : 0,1 또는 여러 문자
  • _ : 한 개의 문자
    SELECT column1, column2
    FROM table_name
    WHERE column LIKE pattern;

Wildcards


와일드카드는 문자열에서 하나 이상의 문자를 대체하는데 사용한다. WHERE절에서 LIKE 연산자와 함께 사용된다.

  • MS Acess

    • 0개 이상의 문자를 나타냄 : * ex) b1* : bl, black 등
    • 하나의 문자를 나타냄 : ? ex) h?t : hat, hot 등
    • 괄호 안의 단일 문자를 나타냄 : [] ex) h[oa]t : hot or hat
    • 괄호 안에 없는 문자를 나타냄 : ! ex) h[!oa]t : het 등
    • 문자 범위를 나타냄 : - ex) h[a-b]t : hat and hbt
    • 하나의 숫자를 나타냄 : # ex) 2#5 : 215, 225 등
  • SQL Server

    • 0개 이상의 문자를 나타냄 : % ex) b1% : bl, black 등
    • 하나의 문자를 나타냄 : _ ex) h_t : hat, hot 등
    • 괄호 안의 단일 문자를 나타냄 : [] ex) h[oa]t : hot or hat
    • 괄호 안에 없는 문자를 나타냄 : ^ ex) h[^oa]t : het 등
    • 문자 범위를 나타냄 : - ex) h[a-b]t : hat and hbt

IN


IN 연산자는 where절에서 여러 값을 지정할 수 있게 한다. 다중 OR 조건의 약어.

SELECT column_name(s)
FROM table_name
WHERE column_name IN (value1, value2);
또는
WHERE column_name IN (SELECT STATEMENT);

BETWEEN


BETWEEN 연산자는 주어진 범위 내에서 값을 선택한다. 값은 숫자, 텍스트 또는 날짜일 수 있다. 시작값과 끝값을 포함한다.

SELECT column_name(s)
FROM table_name
WHERE column_name BETWEEN value1, value2;

Aliases


aliases(별칭)는 테이블 또는 테이블의 열을 임시적인 이름으로 지정하는데 사용된다. 칼럼의 이름을 읽기 쉽게 만들기 위해 종종 사용된다. 별칭은 쿼리 기간 동안애만 존재.

SELECT column_name AS alias_name
FROM table_name;
  • 테이블
SELECT column_name(s)
FROM table_name AS alias_name;

Joins


JOIN 절은 두 개 이상의 테이블의 행을 이들 사이의 관련된 열에 기반해 결합하는데 사용된다.

INNER JOIN


INNER JOIN 키워드는 두 표에 일치하는 값을 가진 레코드를 선택.

SELECT column_name(s)
FROM table1
INNER JOIN table2
ON table1.column_name = table2.column_name;

LEFT JOIN


LEFT JOIN 키워드는 왼쪽 테이블에서 모든 레코드를 반환하고, 오른쪽 테이블에서 일치하는 레코드를 반환한다. 일치하는 항목이 없을 시 오른쪽에서 NULL이 된다.

SELECT column_name(s)
FROM table1
LEFT JOIN table2
ON table1.column_name = table2.column_name;

RIGHT JOIN


RIGHT JOIN 키워드는 오른쪽 테이블에서 모든 레코드를 반환하고, 왼쪽 테이블에서 일치하는 레코드를 반환한다. 일치하는 항목이 없을 시 왼쪽에서 NULL이 된다.

SELECT column_name(s)
FROM table1
RIGHT JOIN table2
ON table1.column_name = table2.column_name;

FULL JOIN


FULL JOIN 키워드는 왼쪽 또는 오른쪽 테이블 레코드가 일치할 때 모든 레코드를 반환한다. (=FULL OUTER JOIN)

SELECT column_name(s)
FROM table1
FULL OUTER JOIN JOIN table2
ON table1.column_name = table2.column_name
WHERE condition;

SELF JOIN


SELF JOIN은 자신의 테이블과 연결해서 조회하는 것을 말한다.

SELECT column_name(s)
FROM table1 T1, table1 T2
WHERE condition;

UNION


UNION 연산자는 둘 이상의 SELECT 문들의 결과 집합을 결합하는데 사용한다. UNION 내의 각 SELECT문에는 동일한 수의 열이 있어야 한다. 열은 반드시 유사한 데이터 타입이어야 한다. 또한 각 SELECT문의 열은 동일한 순서로 되어있어야 한다.

SELECT column_name(s) FROM table1
UNION (ALL)
SELECT column_name(s) FROM table2;

GROUP BY


GROUP BY 구문은 동일한 값을 가진 행을 요약 행으로 그룹화한다. 하나 이상의 열로 결과 집합을 그룹화하기 위해 종종 집계 함수와 함께 사용된다.

SELECT column_name(s)
FROM table_name
WHERE condition
GROUP BY column_name(s)
ORDER BY column_name(s);

HAVING


WHERE 키워드를 집계 함수와 함께 사용할 수 없어 HAVING절이 SQL에 추가되었다.

SELECT column_name(s)
FROM table_name
WHERE condition
GROUP BY column_name(s)
HAVING condition
ORDER BY column_name(s);

EXISTS


EXISTS 연산자는 하위 쿼리에 기록의 존재를 시험하기 위해 사용한다. 하위 쿼리가 하나 이상의 레코드를 반환하는 경우 TRUE를 반환한다.

SELECT column_name(s)
FROM table_name
WHERE EXISTS
(SELECT column_name FROM table_name WHERE condition;