SQL은 데이터베이스에 접근하고 조작하기 위한 표준 언어이다.
데이터베이스에서 수행해야하는 대부분의 조작은 SQL문으로 수행된다.
SQL keyword는 대소 문자를 구분하지 않는다.
각 SQL문 끝에 세미콜론을 사용하여야 한다.
테이블에서 사용 가능한 모든 필드를 선택하는 구문 :
SELECT * FROM table_name;
테이블에서 특정 필드만 선택하는 구문 :
SELECT column1, column2 ... FROM table_name;
SQL SELECT DISTINCT (중복 미포함, 다른 고유한 값만 나열) :
SELECT DISTINCT column FROM table_name;
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
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;
SQL ORDER BY
ORDER BY 키워드는 결과를 오름차순 또는 내림차순으로 정렬하는데 사용한다. 기본적으로는 오름차순으로 정렬되는데, 내림차순으로 정렬을 원할시 DESC 키워드를 사용한다.
SELECT * FROM Customers ORDER BY Country DESC;
SELECT * FROM Customers ORDER BY Country, CustomerName;
SQL INSERT INTO
INSERT INTO는 테이블에 새 레코드를 삽입하는데 사용한다.
열 이름과 삽입할 값을 모두 지정
INSERT INTO table_name(column1, column2, column3,...) VALUES (value1, value2, value3, ...);
테이블의 모든 열에 값을 추가할 경우, 열 이름 지정하지 않아도 되지만 값의 순서가 테이블의 열과 동일한 순서여야 한다.
INSERT INTO table_name VALUES(value1, value2, value3, ...);
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;
SQL UPDATE
UPDATE문은 테이블의 기존 레코드를 수정하는데 사용된다.
Syntax:
UPDATE table_name SET column1=value1, column2=value2, ... WHERE condition;
SQL DELETE
DELETE 문은 테이블에서 기존 레코드를 삭제하는데 사용한다.
DELETE FROM table_name WHERE condition;
- 모든 레코드 삭제:
DELETE FROM table_name
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;
SQL MIN() & MAX()
MIN() 함수는 선택한 열의 가장 작은 값을 반환한다.
SELECT MIN(column_name) FROM table_name WHERE condition;
MAX() 함수는 선택한 열의 가장 큰 값을 반환한다.
SELECT MAX(column_name) FROM table_name WHERE condition;
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;
SQL LIKE
LIKE 연산자는 WHERE 절에서 열에서 지정된 패턴을 검색하는데 사용된다.
SELECT column1, column2, ... FROM talbe_name WHERE columnN LIKE pattern;
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);
SQL BETWEEN
BETWEEN 연산자는 시작 및 종료 값을 포함하여 주어진 범위 내에서 값을 선택한다. 값은 숫자, 텍스트, 또는 날짜일 수 있다.
SELECT column_name(s) FROM table_name WHERE column_name BETWEEN value1 AND value2;
SQL Aliases
SQL Aliases는 테이블 또는 테이블의 열에 더 읽기 쉽게 임시 이름을 퀀리 기간 동안만 제공하는데 사용된다.
SELECT column_name AS alias_name FROM table_name;
SELECT column_name(s) FROM table_name AS alias_name;
SQL JOIN
JOIN 절은 둘 사이의 관련 열을 기반으로 둘 이상의 테이블의 행을 결합하는데 사용한다.
SELECT Orders.OrderID, Customers.CustomerName, Orders.OrderDate FROM Orders INNER JOIN Customers ON Orders.CustomerID=Customers.CustomerID;
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;
SQL Self JOIN
동일한 테이블을 연결해서 조회하는 방법이다. 원하는 데이터들이 한 테이블에 있을 때 사용한다. 한 테이블을 두 개의 테이블처럼 EQUI JOIN으로 조회할 수 있다.
SELECT column_name(s) FROM table1 T1, table1 T2 WHERE condition;
* T1과 T2는 동일한 테이블의 다른 임의의 이름이다.
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;
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);
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;
SQL EXISTS
EXISTS 연산자는 서브 쿼리에 레코드가 있는지 테스트하는데 사용된다. 서브 쿼리가 하나 이상의 레코드를 리턴하면 EXISTS 연산자는 true를 리턴한다.
SELECT column_name(s) FROM table_name WHERE EXISTS (SELECT column_name FROM table_name WHERE condition);
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);
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;
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;
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;
SQL NULL
SQL IFNULL(), ISNULL(), COALESCE(), NVL()
-> "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;
SQL Server에 대한 SQL 저장 절차
store procedures는 저장할 수 있는 준비된 SQL 코드이므로 코드를 계속해서 재사용할 수 있다. 따라서 반복해서 쓰는 SQL 쿼리의 겨웅 store procedure로 저장한 다음 호출해서 실행.
- Syntax:
CREATE PROCEDURE procedure_name AS sql_statement GO;
- 실행:
EXEC procedure_name
SQL 주석
한 줄 주석은 --로 시작한다. --와 줄 끝 사이의 텍스트는 무시된다 (실행하지 않음)
여러 줄 주석은 /로 시작하고 /로 끝난다.