SQL Tutorial을 보고 정리하였습니다.
Database는 보통 한 개 이상의 table들을 포함하는데, 각 table은 이름으로 구별된다. 그리고 Table에는 data를 갖는 records(rows)를 포함한다.
위의 'Customer' 테이블은 5개의 records(이때 각각 customer를 의미)와 7개의 columns(CustomerID, CustomerName, ContactName, Address, City, PostalCode, Country)을 가진다.
▶ 잠깐
SQL 키워드는 case에 상관없다.(그러나 보통 대문자로 많이 쓰는듯) :select
는SELECT
와 같음
각 SQL statements의 끝에;
이 필요하다
SELECT column1, column2, ... FROM table_name;
SELECT * FROM table_name;
SELECT column1, column2, ... FROM table_name ORDER BY column1, column2, ... ASC|DESC;
ORDER BY
Keyword는 default로 오름차순으로 records를 정렬, 내림차순으로 정렬하고 싶으면 DESC
keyword를 사용한다. 예시1)
SELECT * FROM Customers
ORDER BY Country;
Country 열을 기준으로 정렬(A,B,C..)된 것을 볼 수 있다.
예시2) DESC Example
SELECT * FROM Customers
ORDER BY Country DESC;
Country 열을 기준으로 내림차순으로 정렬(Z,X,Y..)된 것을 볼 수 있다.
예시3) Several Columns Example
SELECT * FROM Customers
ORDER BY Country, CustomerName;
Country 열을 보고 정렬하되, 만약 몇몇 row의 Country가 같다면 CustomerName을 기준으로 정렬해라.
예시4) Several Columns Example 2
SELECT * FROM Customers
ORDER BY Country ASC, CustomerName DESC;
Country는 오름차순으로 정렬하고, CustomerName은 내림차순으로 정렬해라
SELECT COUNT(column_name) FROM table_name WHERE condition;
COUNT
Function은 명시된 기준에 맞는 행의 수를 return한다.예시)
SELECT COUNT(ProductID)
FROM Products;
SELECT column_name(s) FROM table_name WHERE condition GROUP BY column_name(s) ORDER BY column_name(s);
GROUP BY
statement는 "각 country의 customers의 수를 찾아라"와 같은 동일한 값을 가진 행을 summary 행으로 그룹화한다.예시 1)
SELECT COUNT(CustomerID), Country
FROM Customers
GROUP BY Country;
즉, 각 country에 있는 customers의 수를 보여준다.
예시 2)
SELECT COUNT(CustomerID), Country
FROM Customers
GROUP BY Country
ORDER BY COUNT(CustomerID) DESC;
각 country의 customers의 수를 내림차순으로 정렬하고 보여준다.
예시 3) GROUP BY With JOIN
각각 Orders Table, Shippers Table이다.
SELECT Shippers.ShipperName, COUNT(Orders.OrderID) AS NumberOfOrders FROM Orders
LEFT JOIN Shippers ON Orders.ShipperID = Shippers.ShipperID
GROUP BY ShipperName;
SELECT column1, column2, ... FROM table_name WHERE condition;
WHERE
clause(절)은 records를 필터링하기 위해 사용된다. 즉 specified한 조건을 충족시키는 records를 추출하기 위해 사용된다.SELECT
statements 뿐만 아니라 UPDATE
, DELETE
에도 사용된다.예시 1) WHERE Cluase Example
SELECT * FROM Customers
WHERE Country='Mexico';
즉, "Customers" table에서 country가 "Mexico"인 customers만 선택한다.
예시2) Text Fields vs. Numeric Fields
SELECT * FROM Customers
WHERE CustomersID=1;
'
가 필요하다 (대부분의 database system들은 "
도 허용한다.) 그러나 numeric fields는 quotes로 감싸면 안 된다. Operators in The WHERE Clause
SELECT * FROM Products
WHERE Price = 18;
SELECT * FROM Products
WHERE Price > 30;
SELECT * FROM Products
WHERE Price < 30;
SELECT * FROM Products
WHERE Price >= 30;
SELECT * FROM Products
WHERE Price <= 30;
!=
로 쓰기도 한다.)SELECT * FROM Products
WHERE Price <> 18;
SELECT * FROM Products
WHERE Price BETWEEN 50 AND 60;
SELECT * FROM Customers
WHERE City LIKE 's%';
's%'는 City의 값 중 's'로 시작하는 값들을 모두 찾으라는 뜻이다!
SELECT * FROM Customers
WHERE City IN ('Paris','London');
WHERE
clause는 AND, OR, NOT operators와 함께 조합될 수 있다.AND
SELECT column1, column2, ... FROM table_name WHERE condition1 AND condition2 AND condition3 ...;
OR
SELECT column1, column2, ... FROM table_name WHERE condition1 OR condition2 OR condition3 ...;
NOT
SELECT column1, column2, ... FROM table_name WHERE NOT condition;
AND
operator는 AND로 분리된 모든 조건들이 TRUE인 record들을 보여주고 OR
operator는 OR로 분리된 조건들 중 하나 이상이 TRUE인 record들을 보여준다. NOT
operator는 조건들이 NOT TRUE인 record들을 보여준다. 예시 1) Combining AND, OR and NOT
SELECT * FROM Customers
WHERE Country='Germany' AND (City='Berlin' OR City='München');
Country가 'Germany'인 애들 중에서 City가 'Berlin'이나 'München'인 customers의 모든 fields를 선택한다.
예시 2) Combining AND, OR and NOT
SELECT * FROM Customers
WHERE NOT Country='Germany' AND NOT Country='USA';
Country가 'Germany'와 'USA'가 아닌 customer들의 모든 field를 선택한다.
CASE WHEN condition1 THEN result1 WHEN condition2 THEN result2 WHEN conditionN THEN resultN ELSE result END;
CASE
expression은 조건들을 통과하고 첫 번째 조건이 충족될 때 값을 return한다.(마치 if-then-else와 같음) 따라서 만약 조건이 true면 읽기를 멈추고 결과를 return한다. 만약 어떤 조건도 true가 아니라면, ELSE
에 있는 값을 return한다. 위의 table은 "OrderDetails"이다.
예시 1) SQL CASE Examples
SELECT OrderID, Quantity,
CASE
WHEN Quantity > 30 THEN 'The quantity is greater than 30'
WHEN Quantity = 30 THEN 'The quantity is 30'
ELSE 'The quantity is under 30'
END AS QuantityText
FROM OrderDetails;
위의 SQL은 OrderId, Quantity, QuantityText(새롭게 추가) column을 가져오는데 이때 QuantityText는 records의 Quantity의 조건에 따라 값이 달라진다. (AS는 Aliases이다.)
예시 2) SQL CASE Examples
SELECT CustomerName, City, Country
FROM Customers
ORDER BY
(CASE
WHEN City IS NULL THEN Country
ELSE City
END);
즉, 오름차순 정렬을 하는데 City가 null이면 County를 기준으로 null이 아니라면 city를 기준으로 정렬하라는 의미이다.
SELECT column1, column2, ... FROM table_name WHERE columnN LIKE pattern;
Like
operator는 WHERE
clause에서 caolumn에 있는 특정 패턴을 찾기 위해 사용된다.%
는 0개에서 하나 이상의 문자들을 나타낸다._
는 하나의 문자를 나타낸다. LIKE operator
WHERE CustomerName LIKE 'a%'
SELECT * FROM Customers
WHERE CustomerName LIKE 'a%';
WHERE CustomerName LIKE '%a'
SELECT * FROM Customers
WHERE CustomerName LIKE '%a';
WHERE CustomerName LIKE '%or%'
SELECT * FROM Customers
WHERE CustomerName LIKE '%or%';
WHERE CustomerName LIKE '_r%'
SELECT * FROM Customers
WHERE CustomerName LIKE '_r%';
WHERE CustomerName LIKE 'a_%'
WHERE CustomerName LIKE 'a__%'
SELECT * FROM Customers
WHERE CustomerName LIKE 'a__%';
WHERE CustomerName LIKE 'a%o'
SELECT * FROM Customers
WHERE ContactName LIKE 'a%o';
WHERE CustomerName NOT LIKE 'a%'
SELECT * FROM Customers
WHERE CustomerName NOT LIKE 'a%';
서브 쿼리는 SQL 서브쿼리 예제라는 글에서 너무너무 잘 정리되어 있기 때문에 넘어가겠음.
JOIN
clause는 2개 이상의 테이블 사이의 관련이 있는 column을 기준으로 행을 결합하는데 사용된다. 예시) Inner Join
여기 "Orders" table과 "Customers" table이 있다. "Orders" table의 "CustomerId" 열은 "Customers" table의 "CustomerID"와 연관되어 있다. 즉, 두 테이블 사이의 관계는 "CustomerID" 열에 있다.
따라서 우리는 두 테이블에 있는 값을 매칭한 records를 선택할 수 있다.
SELECT Orders.OrderID, Customers.CustomerName, Orders.OrderDate
FROM Orders
INNER JOIN Customers ON Orders.CustomerID=Customers.CustomerID;
잠깐! Inner Join에서 FROM이 Orders가 아니라면?
INNER JOIN 키워드는 두 테이블에서 열의 값이 일치하는 모든 행을 선택한다. 단, "Orders" table에 "Customers" table과 일치하지 않는 records가 있는 경우 해당 Order records는 표시되지 않는다. 따라서 공통 records만 선택하므로 FROM Customers, INNER JOIN Orders로 두어도 결과는 일치한다. ( *위의 SQL문과 해당 SQL문의 결과는 동일)
예시2) JOIN Three Tables
SELECT Orders.Order.ID, Customers.CustomerName, Shippers.ShipperName
FROM ((Orders
INNER JOIN Customers ON Orders.CustomerID = Customers.CustomerID)
INNER JOIN Shippers ON Orders.ShipperID = Shippers.ShipperID);
(INNER) JOIN
: Returns records that have matching values in both tablesLEFT (OUTER) JOIN
: Returns all records from the left table, and the matched records from the right tableRIGHT (OUTER) JOIN
: Returns all records from the right table, and the matched records from the left tableFULL (OUTER) JOIN
: Returns all records when there is a match in either left or right tableSELECT column_name(s) FROM table1 LEFT JOIN table2 ON table1.column_name = table2.column_name;```
왼쪽 테이블(table1)에서 모든 records를 return하고 오른쪽 테이블(table2)에서 일치하는 records를 반환한다. 일치하는 항목이 없을 경우 오른쪽에서 0개(null)의 records가 표시된다.
예시)
SELECT Customers.CustomerName, Orders.OrderID
FROM Customers
LEFT JOIN Orders ON Customers.CustomerID = Orders.CustomerID
ORDER BY Customers.CustomerName;
즉 Customers(91개)의 모든 records를 return하고 Orders(196개)에서 해당 일치하는 값(여기서는 CustomerID)이 있는 경우 해당 records를 함께 return!(없는 경우 null) 이때, 한 CustomerID에 대해서 Order가 여러개 있을 수 있으니 총 213개의 records가 return 되었다.
SELECT column_name(s) FROM table1 RIGHT JOIN table2 ON table1.column_name = table2.column_name;```
오른쪽 테이블(table2)에서 모든 records를 return하고 왼쪽 테이블(table1)에서 일치하는 records를 반환한다. 일치하는 항목이 없을 경우 왼쪽에서 0개(null)의 records가 표시된다.
예시)
"Orders" table과 "Employee" table이다.
SELECT Orders.OrderID, Employees.LastName, Employees.FirstName
FROM Orders
RIGHT JOIN Employees ON Orders.EmployeeID = Employees.EmployeeID
ORDER BY Orders.OrderID;
모든 Employee records를 return 하고 Orders에서 일치하는 경우 records를 return한다!!
SELECT column_name(s) FROM table1 FULL OUTER JOIN table2 ON table1.column_name = table2.column_name WHERE condition;```
예시)
SELECT Customers.CustomerName, Orders.OrderID
FROM Customers
FULL OUTER JOIN Orders ON Customers.CustomerID=Orders.CustomerID
ORDER BY Customers.CustomerName;
각 table이 일치하는지 여부에 관계없이 두 테이블에서 일치하는 모든 레코드를 반환한다.
Sum
SELECT SUM(column_name) FROM table_name WHERE condition;
Min
SELECT MIN(column_name) FROM table_name WHERE condition;
Max
SELECT MAX(column_name) FROM table_name WHERE condition;
AVG
SELECT AVG(column_name) FROM table_name WHERE condition;
Sum()
은 numeric column의 총합을 return한다. Min()
은 선택된 column의 값 중 가장 작은 값을 return한다.Max()
는 선택된 column의 값 중 가장 큰 값을 return한다.AVG()
는 numeric column의 평균 값을 return한다.
위의 table은 각각 Products, OrderDetails table이다.
예시1) SUM() Example
SELECT SUM(Quantity)
FROM OrderDetails;
예시2) Min() Example
SELECT MIN(Price) AS SamllestPrice
FROM Products;
예시3) Max() Example
SELECT MAX(Price) AS LargestPrice
FROM Products;
예시4) AVG() Example
SELECT AVG(Price)
FROM Products;