SQL Tutorial

Seoina·2020년 1월 15일
0

2020camp

목록 보기
6/12

SQL은 데이터베이스에 접근하고 조작하기 위한 표준 언어이다.

  • SQL Syntax

데이터베이스에서 수행해야하는 대부분의 조작은 SQL문으로 수행된다.
SQL keyword는 대소 문자를 구분하지 않는다.
각 SQL문 끝에 세미콜론을 사용하여야 한다.

  1. SQL SELECT
    SELECT문은 데이터베이스에서 데이터를 선택하는데 사용된다.

테이블에서 사용 가능한 모든 필드를 선택하는 구문 :

    SELECT * FROM table_name;
    

테이블에서 특정 필드만 선택하는 구문 :

	SELECT column1, column2 ... FROM table_name;
    

SQL SELECT DISTINCT (중복 미포함, 다른 고유한 값만 나열) :

	SELECT DISTINCT column FROM table_name;
    
  1. SQL WHERE
    WHERE절은 record를 필터링하는데 사용된다. 지정된 조건을 충족하는 record만 추출하게 한다.

    	SELECT column1, column2, ... FROM table_name WHERE condition;
        
    *Wherew절은 SELECT 뿐만 아니라 UPDATE, DELETE 문에서도 사용된다.
    
    	ex) SELECT * FROM Customers WHERE Country='Mexico';
        

Where 절의 연산자 : = > < >= <= <> BETWEEN LIKE IN

  1. SQL AND, OR 및 NOT 연산자
    AND 및 OR 연산자는 둘 이상의 조건을 기반으로 레코드를 필터링하는데 사용된다.
    - AND로 구분된 모든 조건이 참인 경우 AND 연산자는 레코드를 표시한다.
    - OR 연산자는 OR로 구분된 조건 중 하나라도 TRUE일 경우 레코드를 표시한다.
    - 조건이 참이 아닌 경우 NOT 연산자는 레코드를 표시한다.

    AND:
    SELECT column1 FROM table_name WHERE conditiona1 AND condition2 AND condition3 ...;

    OR:
    SELECT column1 FROM table_name WHERE conditiona1 OR condition2 OR condition3 ...;

    NOT:
    	SELECT column1 FROM table_name WHERE NOT condition;
        
        
  2. SQL ORDER BY
    ORDER BY 키워드는 결과를 오름차순 또는 내림차순으로 정렬하는데 사용한다. 기본적으로는 오름차순으로 정렬되는데, 내림차순으로 정렬을 원할시 DESC 키워드를 사용한다.

    	SELECT * FROM Customers ORDER BY Country DESC;
        
        SELECT * FROM Customers ORDER BY Country, CustomerName;
        
     
  3. SQL INSERT INTO
    INSERT INTO는 테이블에 새 레코드를 삽입하는데 사용한다.

  • 열 이름과 삽입할 값을 모두 지정

    		INSERT INTO table_name(column1, column2, column3,...) VALUES (value1, value2, value3, ...);
      
  • 테이블의 모든 열에 값을 추가할 경우, 열 이름 지정하지 않아도 되지만 값의 순서가 테이블의 열과 동일한 순서여야 한다.

    		INSERT INTO table_name VALUES(value1, value2, value3, ...);
      
      
  1. SQL NULL 값
    NULL 값을 가진 필드는 값이 없는 필드이다. 이런 필드는 선택적으로 값을 추가하지 않고 새 레코드를 삽입하거나 업데이트 할 수 있다.

    	IS NULL:
        	SELECT column_names From table_name WHERE column_name IS NULL;
           
        IS NOT NULL:
        	SELECT column_names FROM table_name WHERE column-name IS NOT NULL;
            
            
            
  2. SQL UPDATE
    UPDATE문은 테이블의 기존 레코드를 수정하는데 사용된다.

  • Syntax:

    		UPDATE table_name SET column1=value1, column2=value2, ... WHERE condition;
      
    • WHERE 절은 업데이트 할 레코드를 지정한다. WHERE 절을 생략하면 테이블의 모든 레코드가 업데이트 된다.
  1. SQL DELETE
    DELETE 문은 테이블에서 기존 레코드를 삭제하는데 사용한다.

    	DELETE FROM table_name WHERE condition;
        
        - 모든 레코드 삭제:
        DELETE FROM table_name
  1. SQL TOP, LIMIT 또는 ROWNUM
  • SQL SELECT TOP
    SELECT TOP은 리턴할 레코드 수를 지정하는데 사용된다.
    수천 개의 레코드가 있는 큰 테이블에서 유용하다.

    	-SQL Server/ MS access:
        SELECT TOP number| percent column_name(s) FROM table_name WHERE condition;
        ex) SELECT TOP 3 * FROM Customers;
        	SELECT TOP 50 PERCENT * FROM Customers;
        
        
        -MYSQL:
        SELECT column_name(s) FROM table_name WHERE condition LIMIT number;
        ex) SELECT * FROM Customers LIMIT 3;
        
        
        -ORACLE:
        SELECT column_name(s) FROM table_name WHERE ROWNUM <= number;
        ex)SELECT * FROM Customers WHERE ROWNUM <= 3;
        
        
  1. SQL MIN() & MAX()
    MIN() 함수는 선택한 열의 가장 작은 값을 반환한다.

    	SELECT MIN(column_name) FROM table_name WHERE condition;
        

MAX() 함수는 선택한 열의 가장 큰 값을 반환한다.

	SELECT MAX(column_name) FROM table_name WHERE condition;
    
    
  1. SQL 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;
    
    
  1. SQL LIKE
    LIKE 연산자는 WHERE 절에서 열에서 지정된 패턴을 검색하는데 사용된다.

    	SELECT column1, column2, ... FROM talbe_name WHERE columnN LIKE pattern;
        
  • % : 0,1 또는 여러 문자를 나타낸다.
    • WHERE CUSTOMERNAME LIKE 'a%' : a로 시작하는 값
    • WHERE CUSTOMERNAME LIKE '%a' : a로 끝나는 값
    • WHERE CUSTOMERNAME LIKE '%a%' : 임의의 위치에 a가 있는 값
  • _ : 단일 문자를 나타낸다.
    • WHERE CUSTOMERNAME LIKE '_r%' : 두 번째 위치에 r을 가지는 값
    • WHERE CUSTOMERNAME LIKE 'a__%' : a로 시작하는 최소 3개의 길이를 가진 값
    • WHERE CUSTOMERNAME LIKE 'a%o' : a로 시작하고 o로 끝나는 값
  1. SQL Wildcards
    wildcard character는 문자열에서 하나 이상의 문자를 대체하는데 사용된다. SQL LIKE 연산자와 함께 사용된다.
    스크린샷 2020-01-15 오후 12.12.57.png

스크린샷 2020-01-15 오후 12.13.10.png

  1. SQL IN
    IN 연산자를 사용하면 WHERE 절에 여러 값을 지정할 수 있다. IN 연산자는 OR 조건의 약자이다.

    	SELECT column_name(s) FROM table_name WHERE column_name IN (value1, value2, ...);
        
        또는
        
        SELECT column_name(s) FROM table_name WHERE column_name IN (SELECT STATEMENT);
        ex) SELECT * FROM Customers WHERE Country IN (SELECT COUNTRY FROM Suppliers);
        
        
        
  2. SQL BETWEEN
    BETWEEN 연산자는 시작 및 종료 값을 포함하여 주어진 범위 내에서 값을 선택한다. 값은 숫자, 텍스트, 또는 날짜일 수 있다.

    	SELECT column_name(s) FROM table_name WHERE column_name BETWEEN value1 AND value2;
        
        
  3. SQL Aliases
    SQL Aliases는 테이블 또는 테이블의 열에 더 읽기 쉽게 임시 이름을 퀀리 기간 동안만 제공하는데 사용된다.

    	SELECT column_name AS alias_name FROM table_name;
        
        SELECT column_name(s) FROM table_name AS alias_name;
        
        
  4. SQL JOIN
    JOIN 절은 둘 사이의 관련 열을 기반으로 둘 이상의 테이블의 행을 결합하는데 사용한다.

스크린샷 2020-01-15 오후 12.28.17.png

	SELECT Orders.OrderID, Customers.CustomerName, Orders.OrderDate FROM Orders INNER JOIN Customers ON Orders.CustomerID=Customers.CustomerID;
    

스크린샷 2020-01-15 오후 12.29.21.png

  • 다른 유형의 SQL JOIN
    - (INNER) JOIN: 두 테이블에서 일치하는 값을 가진 레코드를 리턴한다. SELECT column_name(s) FROM table1 INNER JOIN table2 ON table1.column_name = table2.column_name;
    • LEFT (OUTER) JOIN: 왼쪽 테이블의 모든 레코드와 오른쪽 테이블의 일치하는 레코드를 리턴한다. 일치하는 것이 없으면 결과는 오른쪽에 null이 된다.

      SELECT column_name(s) FROM table1 LEFT JOIN table2 ON table1.column_name = table2.column_name;
        
    • RIGHT (OUTER) JOIN:오른쪽 테이블의 모든 레코드와 왼쪽 테이블의 일치하는 레코드를 리턴한다. 일치하는 것이 없으면 결과는 왼쪽에 null이 된다.

      SELECT column_name(s) FROM table1 RIGHT JOIN table2 ON table1.column_name = table2.column_name;
        
    • FULL (OUTER) JOIN: 왼쪽 또는 오른쪽 테이블에 일치하는 모든 레코드를 리턴한다.

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

스크린샷 2020-01-15 오후 12.33.03.png

  1. SQL Self JOIN
    동일한 테이블을 연결해서 조회하는 방법이다. 원하는 데이터들이 한 테이블에 있을 때 사용한다. 한 테이블을 두 개의 테이블처럼 EQUI JOIN으로 조회할 수 있다.

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

    * T1과 T2는 동일한 테이블의 다른 임의의 이름이다.

  1. SQL UNION
    SQL UNION 연산자는 둘 이상의 SELECT 문의 결과 집합을 결합하는데 사용된다. UNION 내의 각 SELECT 문은 동일한 수와 데이터 형식의 열을 가져야 하고 순서도 물론 동일해야한다. UNION은 중복을 허용하지 않으므로 중복을 허용하려면 UNION ALL을 사용한다.

    	-UNION :
        SELECT column_name(s) FROM table1 UNION SELECT column_name(s) FROM table2;
        
        -UNION ALL:
        SELECT column_name(s) FROM table1 UNION ALL SELECT column_name(s) FROM table2;
        
      
  2. SQL GROUP BY
    GROUP BY문은 같은 값을 가진 행을 요약 행으로 그룹화 한다. 종종 집계 함수 (COUNT, MAX, MIN, SUM, AVG)와 함께 사용되어 결과 집합을 하나 이상의 열로 그룹화한다.
    ex) 각 국가의 고객 수를 나타내려고 하거나 나열할 때.

    	SELECT column_name(s) FROM table_name WHERE condition GROUP BY column_name(s) ORDER BY column_name(s);
        
        
  3. SQL HAVING
    WHERE 키워드를 집계 함수와 함께 사용할 수 없으므로 그에 대처하여 HAVING 을 사용한다.

    	SELECT column_name(s) FRON table_name WHERE condition GROUP BY column_name(s) HAVING condition ORDER BY column_name(s);
        
        ex) 각 국가의 고객을 목록으로 표시 (고객 수가 5명 이상인 국가만)
        SELECT COUNT(CustomerID), Country FROM Customers GROUP BY Country HAVING COUNT(CustomerID) > 5 ORDER BY COUNT(CustomerID) DESC;
        
        
  4. SQL EXISTS
    EXISTS 연산자는 서브 쿼리에 레코드가 있는지 테스트하는데 사용된다. 서브 쿼리가 하나 이상의 레코드를 리턴하면 EXISTS 연산자는 true를 리턴한다.

    	SELECT column_name(s) FROM table_name WHERE EXISTS (SELECT column_name FROM table_name WHERE condition);
  5. SQL ANY & ALL 연산자
    ANY & ALL 연산자는 WHERE 또는 HAVING 절과 함께 사용된다. 하위 쿼리 값이 조건을 만족하는 경우 ANY 연산자는 true를 리턴한다. 모든 하위 쿼리 값이 조건을 만족하면 ALL 연산자가 true를 리턴한다.

    	- ANY:
        SELECT column_name(s) FROM table_name WHERE column_name operator ANY (SELECT column_name FROM table_name WHERE condition);
        
        - ALL:
        SELECT column_name(s) FROM table_name WHERE column_name operator ALL (SELECT column_name FROM table_name WHERE condition);
        
        
  6. SQL SELECT INTO
    SELECT INTO 문은 한 테이블의 데이터를 새 테이블로 복사한다.

    	- 모든 열 복사 :
        SELECT * INTO newtable [IN externaldb] FROM oldtable WHERE condition;
        
        - 일부 열만 복사 :
        SELECT column1, column2, column3, ... INTO newtable [IN externaldb] FROM oldtable WHERE condition;
        
        
  7. SQL INSERT INTO SELECT
    INSERT INTO SELECT 문은 한 테이블에서 데이터를 복사하여 다른 테이블에 삽입한다. INSERT INTO SELECT를 사용하려면 소스 및 대상 테이블의 데이터 유형이 일치해야 한다. 대상 테이블의 기존 레코드는 영향을 받지 않는다.

    	- 모든 열 :
        INSERT INTO table2 SELECT * FROM table1 WHERE condition;
        
        - 일부 열만 복사: 
        INSERT INTO table2 (column1, column2, column3, ...) SELECT column1, column2, column3, ... FROM table1 WHERE condition;
        
        
  8. SQL CASE
    CASE문은 조건을 거치며 첫번째 조건이 충족되면 값을 반환한다. (IF-THEN-ELSE 문과 같다). 따라서 조건이 충족되면 읽기를 중지하고 결과를 리턴하고, 조건이 없으면 ELSE 절의 값을 리턴한다. ELSE 부분이 없고 조건이 참이 아니면 NULL을 리턴한다.

    	CASE
        	WHEN condition1 THEN result1
            WHEN condition2 THEN result2
            WHEN conditionN THEN resultN
            ELSE result
        END;
        
        
  9. SQL NULL
    SQL IFNULL(), ISNULL(), COALESCE(), NVL()

  • ex) Products table
    스크린샷 2020-01-15 오후 2.45.10.png

-> "UnitsOnOrder"열이 선택적이고 NULL 값을 포함 할 수 있다고 가정. UnitsOnOrder 값 중 하나라도 NULL 이면 결과는 NULL.

	- MYSQL : IFNULL() 함수를 사용하면 식이 NULL인 경우 대체 값을 반환할 수 있다.
    SELECT ProductName, UnitPrice * (UnitsInStock + IFNULL(UnitsOnOrder, 0)) FROM Products;
    
    SELECT ProductName, UnitPrice * (UnitsInStock + COALSECE(UnitsOnOrder, 0)) FROM Products;
    
    - SQL 서버: ISNULL() 함수를 사용하면 식이 NULL인 경우 대체 값 리턴.
    SELECT ProductName, UnitPrice * (UnitsInStock + ISNULL(UnitsOnOrder, 0)) FROM Products;
    
    
  1. SQL Server에 대한 SQL 저장 절차
    store procedures는 저장할 수 있는 준비된 SQL 코드이므로 코드를 계속해서 재사용할 수 있다. 따라서 반복해서 쓰는 SQL 쿼리의 겨웅 store procedure로 저장한 다음 호출해서 실행.

    	- Syntax:
        CREATE PROCEDURE procedure_name AS sql_statement GO;
        
        - 실행:
        EXEC procedure_name
        
        
  2. SQL 주석
    한 줄 주석은 --로 시작한다. --와 줄 끝 사이의 텍스트는 무시된다 (실행하지 않음)

여러 줄 주석은 /로 시작하고 /로 끝난다.

0개의 댓글