전성빈의 사리사욕

[SQL] SQL 문법 정리 본문

백엔드 로드맵따라가기/RDBMS

[SQL] SQL 문법 정리

Been2 2020. 12. 17. 02:51
728x90
  • 술어 정리
  • SELECT : 데이터베이스에서 데이터를 추출합니다.
  • WHERE
  • AND, OR, NOT
  • ORDER BY
  • INSERT INTO
  • NULL VALUES
  • UPDATE
  • DELETE 
  • TOP, LIMIT, ROWNUM
  • MIN(), MAX()
  • COUNT(), AVG(), SUM()
  • Like
  • Wildcards
  • In, Between
  • Aliases
  • Joins
  • Union
  • Group By
  • Having
  • Any, All
  • Select Into
  • Insert Into Select
  • Case
  • Stored Procedures
  • Comments
  • Operators

 


SQL을 공부하다보면 많이 보이는 3가지 술어(terminology)들이 있습니다.

 

Keyword, Clause, Statement입니다.

 

이 세가지가 어떻게 다른지 먼저 살펴보고나서 SQL을 다루도록 하겠습니다.

 

1. Keyword

SQL에 미리 정의되어 기능이 고정된 단어입니다. 우리가 바꿀 수 없고 변수명등으로 사용할 수 없습니다.

ex : SELECT, FROM, DELETE, CREATE 등..

 

2. Clause

명령문의 Sub-set입니다. 하나의 완벽한 명령문이 아닌 작은 구문을 말합니다.

ex : SELECT emp_id, emp_name ..

 

3. Statement

하나의 완벽한 명령문입니다. Statement부터 실행이 가능합니다.

ex : SELECT * FROM employee;

     CREATE DATABASE helloworld;


 

 

SELECT Statement

 

SELECT 명령어는 데이터베이스에서 데이터를 선택할 때 사용합니다.

 

Syntax :

//특정 컬럼을 선택할 때
SELECT column1, column2, ...
FROM table_name;

//모든 컬럼을 선택할 때
SELECT * FROM table_name;

 

example :

// Customers 테이블에서 name 컬럼을 추출해라
SELECT name FROM Customers;

// Customers 테이블에서 모든 컬럼을 추출해라
SELECT * FROM Customers;

// Customers 테이블에서 Country 컬럼을 "중복 없이" 추출해라
SELECT DISTINCT Country FROM Customers

// Customers 테이블에서 Country 컬럼의 값은 총 몇종류인지 추출해라
SELECT COUNT(DISTINCT Country) FROM Customers;

 

WHERE Clause

 

WHERE 구문은 조건을 부여해 특정 값에 접근할 수 있도록 해줍니다.

 

Syntax :

SELECT column1, column2, ...
FROM table_name
WHERE condition;

 

Example :

// Customers 테이블에서 City가 "Berlin"인 모든 record를 추출해라
SELECT * FROM Cunstomers WHERE Country = "Berlin";

// Costomers 테이블에서 City가 "Berlin"이 아닌 모든 record를 추출해라
SELECT * FROM Customers WHERE NOT City = "Berlin";

 

Operators : 

Operator Description
= Equal
> Greater than
< Less than
>= Greater than or equal
<= Less than or equal
<> Not equal. Note: In some versions of SQL this operator may be written as !=
BETWEEN Between a certain range
LIKE Search for a pattern
IN To specify multiple possible values for a column

 

 

AND, OR, NOT Operators

 

AND, OR, NOT 연산자는 WHERE문의 condition과 결합하여 사용할 수 있습니다.

 

WHERE문을 통해 더욱 상세한 값을 얻기위해 사용됩니다.

 

AND Syntax :

//여타 다른 프로그래밍 언어에서의 AND와 같이 작동합니다. 모든 condition이 만족하여야 합니다.
SELECT column1, column2, ...
FROM table_name
WHERE condition1 AND condition2 AND condition3 ... ;

 

OR Syntax :

//condition중 하나라도 만족하면 됩니다.
SELECT column1, column2, ...
FROM table_name
WHERE condition1 OR condition2 OR condition3 ... ;

 

NOT Syntax :

SELECT column1, column2, ...
FROM table_name
WHERE NOT condition;

 

Example :

// AND : Customers 테이블에서 country가 Germany이고 city가 Berlin인 record를 추출하라
SELECT * FROM Custormers 
WHERE country = 'Germany' AND city = 'Berlin';

// OR : Customers 테이블에서 city가 Berlin이거나 Newyork인 record를 추출하라
SELECT * FROM Customers
WHERE city = 'Berlin' OR city = 'Newyork';

// NOT : Customers 테이블에서 city가 Berlin이 아닌 record를 추출하라
SELECT * FROM Customers
WHERE NOT city = 'Berlin';

// 결합, AND와 OR : Customers 테이블에서 country는 USA이고 city는 LA이거나 NY인 record를 추출하라
SELECT * FROM Customers
WHERE country = 'USA' AND (city = 'LA' OR city ='NY');

 

 

ORDER BY Keyword

 

ORDER BY 키워드는 특정 쿼리의 결과를 오름차순(ascending)이나 내림차순(decsending)으로 정렬하기 위한 키워드 입니다.

해당 키워드를 사용하면 Default는 오름차순이지만 DESC 키워드를 사용하면 내림차순으로 정렬됩니다.

 

Syntax :

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

 

Example:

// Customers 테이블에서 Country컬럼을 기준으로 오름차순으로 정렬한 레코드를 추출하라
SELECT * FROM Customers
ORDER BY Country;

// Customers 테이블에서 City를 알파벳의 내림차순으로 정렬한 레코드를 추출하라
SELECT * FORM Customers
ORDER BY City DESC;

// Customers 테이블에서 Country, City 순으로 알파벳의 오름차순으로 정렬한 레코드를 추출하라
SELECT * FROM Customers
ORDER BY Country, City;

// Customers 테이브레서 Country는 오름차순으로, City는 내림차순으로 정렬한 레코드를 추출하라
SELECT * FROM Custromers
ORDER BY Country ASC, City DESC;

 

 

INSERT INTO Statement

 

INSERT INTO 명령문은 테이블에 새로운 record를 저장할 때 사용합니다.

사용하는 방법은 2가지 방식이 있는데, 모든 컬럼에 값을 넣을지 특정 컬럼에만 값을 넣을지로 결정 됩니다.

 

Syntax :

//모든 컬럼에 값을 넣는다.
INSERT INTO table_name (value1, value2, ...);

//특정 컬럼에만 값을 넣는다.
INSERT INTO table_name (column1, column2, ...)
VALUES (value1, value2, ...);

 

Example :

 

Student

학번 학부 이름
001 컴퓨터공학과 홍길동
002 컴퓨터공학과 이순신
//모든 컬럼에 값을 저장할 때
INSERT INTO Student (003, '전자공학과', '이도');

//특정 컬럼에 값을 저장할 때
INSERT INTO Student (학번, 이름)
VALUES (004, '이충녕');

 

 

NULL VALUES

 

INSERT INTO 명령문에서 특정 컬럼에만 값을 삽입하는 경우가 있었습니다. 그렇다면 값이 삽입 되지 않은 컬럼은 어떻게 되는 것일까요?

 

바로 NULL 값을 갖게 됩니다. 다른 프로그래밍 언어의 NULL과 같은 의미로 어떠한 값도, 공간도 할당 받지 않습니다.

 

널값은 릴레이션의 제약조건에 따라 널값을 넣을 수 있게 만든 릴레이션에서 사용됩니다.

MySQL에서는 default로 Null이 사용 가능하며 NOT NULL 키워드를 통해 특정 컬럼에 널값을 금지 시킵니다.

 

우리는 특정 컬럼의 값이 존재하는지, 존재하지 않는지(NULL VALUES인지) 확인하는것을 알아보도록 합시다.

 

널값은 어떠한 값이 아니고 값이 없다는 뜻이기 때문에 <, >, =, <> 과 같은 비교 연산자들을 사용할 수 없습니다.

따라서 특정 키워드를 통해 비교하여야 합니다. 

1. IS NULL Keyword : 특정 컬럼의 값이 Null이라면 True가 됩니다.
2. IS NOT NULL Keyword : 특정 컬럼의 값이 Null이라면 False가 됩니다.

//Customers 테이블에서 PostalCode 컬럼이 비어있는 record를 추출하라
SELECT * FROM Customers
WHERE PostalCode IS NULL;

//Customers 테이블에서 PostalCode 컬럼에 값이 존재하는 record를 추출하라
SELECT * FROM Customers
WHERE PostalCode IS NOT NULL;

 

 

UPDATE Statement

 

테이블에 존재하는 값을 변경하고 싶을 때는 어떡해야 할까요?

UPDATE 명령문을 사용하면 바꿔줄 수 있습니다. 

 

UPDATE 명령문은 특정 컬럼에 해당하는 값을 변경해줍니다.

 

Syntax :

UPDATE table_name
SET column1 = value1, column2 = value2, column3 = value3
WHERE condition;

 

Example :

//Student테이블에서 이름이 홍길동인 학생의 학부를 경제학과로 변경하라
UPDATE Student
SET 학부 = '경제학과'
WHERE 이름 = '홍길동';

//다중 record에 대해서도 변경이 가능합니다.
//Student테이블에서 컴퓨터공학과인 학생들의 학부를 컴퓨터 전자시스템 공학과로 변경하라
UPDATE Student
SET 학부 = '컴퓨터 전자시스템 공학과'
WHERE 학부 = '컴퓨터공학과';

 

CAUTION : Don't omit WHERE Clause

만약 UPDATE 명령문을 사용할 때 WHERE구문을 생략하면 모든 record에 대하여 값이 변경 됩니다.

따라서 주의해줘야 합니다.

UPDATE Student
SET 학과 = '경제학과';
학번 학부 이름
001 경제학과 홍길동
002 경제학과 이순신
003 경제학과 이도

 

 

DELETE Statement

 

DELETE 명령문은 테이블에 존재하는 record를 지울 때 사용됩니다.

UPDATE 명령문과 같이 WHERE 구문으로 조건을 주지 않으면 모든 record를 타깃으로 하니 꼭 WHERE구문을 사용해주어야 합니다.

 

Syntax : 

DELETE FROM table_name WHERE condition;

 

Example :

// Student 테이블에서 이름이 홍길동인 record를 삭제하라
DELETE FROM Student WHERE 이름 = '홍길동';

   

CAUTION : Don't omit WHERE Clause

만약 DELETE 명령문을 사용할 때 WHERE구문을 생략하면 모든 record에 대하여 값이 삭제 됩니다.

따라서 주의해줘야 합니다.

DELETE FROM Student;

//필드만 남아버린 쓸쓸한 테이블의 모습입니다.

Student

학번 학부 이름

 

 

TOP, LIMIT, ROWNUM Clause

 

TOP 구문은 SELECT와 같이 사용하며, 리턴하는 레코드의 개수를 정합니다.

record를 수천개 이상 갖는 큰 테이블은 데이터를 추출도 사이즈가 거대한니 성능에 영향을 미칩니다. 따라서 TOP 구문을 사용해 추출하는 레코드의 수를 조절합니다.

 

또한, 모든 DBMS에서 SELECT TOP 구문을 사용할 수 있는것은 아닙니다. MySQL에서는 LIMIT를 Oracle에서는 ROWNUM을 지원합니다.

 

저는 MySQL을 사용하므로 예제는 MySQL 문법으로 사용하겠습니다.

 

Syntax:

 

SQL Server / MS Access Syntax

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

 

MySQL

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

 

 

Example :

// Customers 테이블에서 3개의 record를 추출하라
SELECT * FROM Customers LIMIT 3;

// Customers 테이블에서 Country가 USA인 record를 10개 추출하라
SELECT * FROM Customers
WHERE Country = 'USA'
LIMIT 10;

 

MIN(), MAX() Functions

 

MIN() 함수는 선택한 column에서 가장 작은 값을 return 합니다. MAX() 함수는 반대로 가장 큰 값을 return 합니다.

 

Syntax:

//MIN()
SELECT MIN(column_name)
FROM table_name;

//MAX()
SELECT MAX(column_name)
FROM table_name;

 

Example :

//Product 테이블에서 가장 싼 물품의 가격을 추출하라
SELECT MIN(Price)
FROM Product;

//Product 테이블에서 가장 비싼 가격을 추출하라
SELECT MAX(Price)
FROM Product;

 

 

COUNT(), AVG(), SUM() Functions

 

Count 함수는 컬럼의 개수를 반환해줍니다.

Avg 함수는 number 자료형을 가진 컬럼의 평균을 반환해줍니다.

Sum 함수는 number 자료형을 가진 컬럼의 총합을 반환해줍니다.

 

Syntax :

//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;

 

Example :

// Products 테이블에서 ProductID의 개수를 추출하라
SELECT COUNT(ProductID)
FROM Products;

// Products 테이블에서 평균가격을 추출하라
SELECT AVG(Price)
FROM Products;

// OrderDetails 테이블에서 상품 코드가 AAA인 상품이 총 몇개 주문되었는지 추출하라
SELECT SUM(Quantity)
FROM OrderDetails
WHERE ProductID = 'AAA';

 

 

LIKE Operator

 

우리가 특정 단어가 포함되어있거나, 특정 단어로 시작하는등 어떤 패턴을 이용하여 값을 찾고자 하면 보다 자세한 Where 구문이 필요한데 Like operator를 이용하여 regex와 비슷한 방법으로 찾을 수 있습니다.

 

Like 연산자는 WHERE구문 안에서 사용됩니다.

 

LIKE 연산자에서 자주사용하는 연산자들이 2가지 있습니다.

  % - 없거나, 하나거나 여러개인 char 문자형을 의미합니다.

  _  - underscore는 단 하나의 문자형을 의미합니다.

 

Syntax : 

SELECT column1, column2, ...
FROM table_name
WHERE condition LIKE pattern;

wildcard Example :

// 'a%' : a로 시작하는 모든 값을 의미합니다.
// '%a' : a로 끝나는 모든 값을 의미합니다.
// '%or%' : or를 포함한 모든 값을 의미합니다.
// '_r%' : 두번째 인덱스에 r이 존재하는 모든 값을 의미합니다.
// 'a%e' a로 시작해서 e로 끝나는 모든 값을 의미합니다.

Example:

//Customers 테이블에서 CustomerName이 a로 시작하는 모든 레코드를 추출하라
SELECT * FROM Customers
WHERE CustomerName LIKE 'a%';

//Products 테이블에서 ProductName이 e로 끝나는 모든 레코드를 추출하라
SELECT * FROM Products
WHERE ProductName LIKE '%e';

 

 

Wildcard Characters

 

Wildcard 문자형은 문자열안에서 하나, 혹은 여러개의 char를 대신하는데 사용합니다. 주로 LIKE 연산자와 같이 사용하는데 LIKE연산자는 WHERE구문 안에서 특정 패턴을 찾기 위해 사용됩니다.

 

와일드카드 캐릭터들은 RDBMS마다 다릅니다. 우리가 볼 것은 SQL Server에서의 와일드카드입니다.

또한 와일드 카드들은 서로 붙여서 사용할 수 있습니다.

 

Symbol Description Example
% Represents zero or more characters bl% finds bl, black, blue, and blob
_ Represents a single character h_t finds hot, hat, and hit
[] Represents any single character within the brackets h[oa]t finds hot and hat, but not hit
^ Represents any character not in the brackets h[^oa]t finds hit, but not hot and hat
- Represents a range of characters c[a-b]t finds cat and cbt

 

Example : 

// Customers 테이블에서 City가 a로 시작하는 모든 레코드를 추출하라
SELECT * FROM Customers
WHERE City LIKE 'a%';

// Customers 테이블에서 City가 b나 c중 하나로 시작하는 모든 레코드를 추출하라
SELECT * FROM Customers
WHERE City LIKE '[bc]%';

// Customers 테이블에서 City의 두번째 글자가 o인 모든 레코드를 추출하라
SELECT * FROM Customers
WHERE City LIKE '_o%';

// Customers 테이블에서 City가 d나 e로 시작하지 않는 모든 레코드를 추출하라
SELECT * FROM Customers
WHERE City LIKE '[^de]%';
Or:
SELECT * FROM Customers
WHERE City NOT LIKE '[de]%'

// Customers 테이블에서 City가 f~z로 끝나지 않는 모든 레코드를 추출하라
SELECT * FROM Customers
WHERE City LIKE '%[^f-z]';

 

IN Operator

 

IN 연산자는 WHERE 구문에서 여러개의 값을 사용할 수 있게 해줍니다.

또한, IN연산자는 여러개의 OR를 빠르게 사용할 수 있게 해줍니다.

 

Syntax : 

SELECT column_name(s)
FROM table_name
WHERE condition IN (value1,value2, ...);

or:

SELECT column_name(s)
FROM table_name
WHERE condtion IN (SELECT STATEMENT);

 

Example:

// Customers 테이블에서 Country가 Germany,France,UK중 하나인 모든 record를 추출하라
SELECT * FROM Customers
WHERE Country IN ('Germany','France','UK');

// Germany, France, UK에 살지 않는 모든 Customers들을 추출하라
SELECT * FROM Customers
WHERE Country NOT IN ('Germany','France','UK');

// Suppliers와 같은 나라에 사는 모든 고객들을 추출하라
SELECT * FROM Customers
WHERE Country IN (SELECT Country FROM Suppliers)

 

 

BETWEEN Operator

 

BETWEEN 연산자는 특정 두 값 사이에 있는 값을 특정지을 때 사용합니다. number, text, dates 값을 계산 할 수 있으며 시작과 끝을 넣어줘 바운더리를 정해줍니다.

 

Syntax :

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

 

Example :

// products 테이블에서 가격이 10에서 20 사이인 모든 상품에 대한 정보를 추출하라
SELECT * FROM Products
WHERE Price BETWEEN 10 AND 20;

// 가격이 10에서 20사이가 아닌 상품들을 추출하라
SELECT * FROM Product
WHERE Price NOT BETWEEN 10 AND 20;

// 가격이 10~20 이고 CategoryID가 1,2,3이 아닌 모든 상품을 추출하라
SELECT * FROM Products
WHERE Price BETWEEN 10 AND 20
AND CategoryID NOT IN (1,2,3);

// ProductName이 Carnarvon Tigers와 Mozzarella di Giovanni사이에 모든 상품을 알파벳순으로 정렬하며 추출하라
SELECT * FROM Products 
WHERE ProductName 'Carnarvon Tigers' AND 'Mozzarella di Giovanni'
ORDER BY ProductName;

// ProductName이 Carnarvon Tigers와 Chef Anton's Cajun Seasoning 사이에 모든 상품을 알파벳 역순으로 정렬하며 추출하라
SELECT * FROM Products
WHERE ProductName BETWEEN 'Carnarvon Tigers' AND "Chef Anton's Cajun Seasoning"
ORDER BY ProductName DESC;

//ProductName이 Carnarvon Tigers와 Mozzarella di Giovanni 사이에 속하지 않는 모든 상품을 추출하라
SELECT * FROM Products
WHERE ProductName NOT BETWEEN 'Carnarvon Tigers' AND 'Mozzarella di Giovanni';

//OrderDate가 01-July-1996 ~ 31-July-1996 사이인 모든 주문정보를 추출하라
SELECT * FROM Orders
WHERE OrderDate BETWEEN '1996/07/01' AND '1996/07/31';

 

 

Aliases

 

Aliases는 table이나 테이블에 존재하는 column에 임시로 쓸 별칭을 줄 때 사용합니다.

aliases는 해당 쿼리 동안에만 작동하며 다른 쿼리에는 적용 되지 않습니다.

 

Syntax:

// Alias Column
SELECT column_name AS alias_name
FROM table_name;

// Alias Table
SELECT column_name(s)
FROM Table_name AS alias_name;

 

Example :

---단일, 다중 컬럼에 대한 별칭 작성---
// Customers테이블에서 CustomerID은 ID로, CustomerName은 Customer로 추출하라
SELECT CustomerID AS ID, CustomerName AS Customer
FROM Customers;

// Customers테이블에서 CustomerName은 Customer로, ContactName은 Contact Person으로 추출하라
SELECT CustomerName AS Customer, ContactName AS [Contact Person]
FROM Customers;

SELECT CustomerName AS Customer, ContactName AS "Contact Person"
FROM Customers;

// Customers테이블에서 CustomerName과 (Address, PostalCode, City, Country)를 Address로 추출하라
SELECT CustomerName, Address+', '+PostalCode+', '+City+', '+Country AS Address
FROM Customers;

SELECT CustomerName, CONCAT(Address,', ',Postal,', ',City,', ',Country) AS Address
FROM Customers;
(ver. mysql)

---테이블에 대한 별칭 작성---
// 특정 Customer의 모든 주문에 대한 OrderID, OrderDate, CustomerName을 가져옵니다.
// CustomerID = 4이며, Customers테이블은 c로, Orders 테이블은 o로 추출합니다.
SELECT o.OrderID, o.OrderDate, c.CustomerName
FROM Customers AS c, Orders AS o
WHERE c.CustomerID = 4 AND c.CustomerID = o.CustomerID;

//위 쿼리를 Aliases없이 사용하면 아래와 같습니다.
SELECT Orders.OrderID, Orders.OrderDate, Customers.CustomerName
FROM Customers, Orders
WHERE Customers.CustomerID = 4, Customers.CustomerID = Orders.OrderID;

 

Aliases, 별칭은 다음과 같은 상황에서 사용하기 좋습니다.

  • 두 개 이상의 테이블을 합쳐서 추출해야 할 때
  • 함수가 사용될 때
  • 컬럼의 이름이 굉장히 길거나 읽기 힘들 때
  • 두 개 이상의 컬럼들을 함께 결합시켜야 할 때

 

 

JOIN

 

JOIN절 은 2개 이상의 테이블에서 각 테이블간 관계를 통해 서로를 결합할 때 사용됩니다.

 

Syntax : 

SELECT Table1.col1, Table1.col2, Table2.col1, ...
FROM Table1
JOIN Table2 On Table1.col1 = Table2.col1;

 

테이블간 결합을 위해 꼭 join절이 필요한것은 아닙니다.

join절을 사용하여 하는 결합은 Explicit join이라 하며 join절 없이 하는 결합은 Implicit join이라 합니다.

//Explicit Join
SELECT Order.OrderID, Order.OrderDate, Customers.CustomerName
FROM Order
JOIN Customers on Order.CustomerName = Customers.CustomerName;

//Implicit Join
SELECT Order.OrderID, Order.OrderDate, Customers.CustomerName
FROM Order, Customer
WHERE Order.CustomerName = Customers.CustomerName;

 

또, 결합에 기준이 되는 공통된 요소에 따라 여러가지로 나뉩니다.

크게 INNER JOIN, OUTER JOIN, SELF JOIN, CROSS JOIN등이 있으며 OUTER조인에는 요소가 속한 테이블에 따라 LEFT, RIGHT, FULL 조인이 있습니다.

 

 

 

출처 : www.w3schools.com/sql/sql_top.asp

728x90