[SQL] SQL Syntax

뚜비·2023년 2월 14일
0

SQL 코딩테스트

목록 보기
1/10

SQL Tutorial을 보고 정리하였습니다.


Database는 보통 한 개 이상의 table들을 포함하는데, 각 table은 이름으로 구별된다. 그리고 Table에는 data를 갖는 records(rows)를 포함한다.

위의 'Customer' 테이블은 5개의 records(이때 각각 customer를 의미)와 7개의 columns(CustomerID, CustomerName, ContactName, Address, City, PostalCode, Country)을 가진다.

잠깐
SQL 키워드는 case에 상관없다.(그러나 보통 대문자로 많이 쓰는듯) : selectSELECT와 같음
각 SQL statements의 끝에 ;이 필요하다


1. SELECT

SELECT column1, column2, ...
FROM table_name;
  • 선택하다
  • column1, column2, ...은 table로부터 선택하고 싶은 데이터의 field names이다.
SELECT * FROM table_name;
  • 만일 table에 있는 가능한 모든 fields를 선택하고 싶다면 *를 이용한다.


2. ORDER BY

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은 내림차순으로 정렬해라



3. COUNT / GROUP BY

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 행으로 그룹화한다.
  • 이때 result set을 하나 이상의 열로 그룹화 하기 위해 aggregate functions(COUNT(), MAX(), MIN(), SUM(), AVG())과 함께 사용한다.

예시 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;


4. Where /And /Or

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;

  • SQL은 text values 주위에 '가 필요하다 (대부분의 database system들은 " 도 허용한다.) 그러나 numeric fields는 quotes로 감싸면 안 된다.

Operators in The WHERE Clause

  • = : Equal
SELECT * FROM Products
WHERE Price = 18;
  • > : Greater than
SELECT * FROM Products
WHERE Price > 30;
  • < : Less than
SELECT * FROM Products
WHERE Price < 30;
  • >= : Greater than or Equal
SELECT * FROM Products
WHERE Price >= 30;
  • <= : Less than or Equal
SELECT * FROM Products
WHERE Price <= 30;
  • <> : Not Equal (SQL의 어떤 version은 !=로 쓰기도 한다.)
SELECT * FROM Products
WHERE Price <> 18;
  • BETWEEN : Between a certain range
SELECT * FROM Products
WHERE Price BETWEEN 50 AND 60;

  • LIKE : Search for a pattern
SELECT * FROM Customers
WHERE City LIKE 's%';

's%'는 City의 값 중 's'로 시작하는 값들을 모두 찾으라는 뜻이다!


  • IN : To specify multiple possible values for a column, 즉 한 column에 대해 다중의 가능한 값을 명시할 때 사용
SELECT * FROM Customers
WHERE City IN ('Paris','London');


4-1. AND / OR / NOT

  • 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를 선택한다.



5. Case when / else

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한다.
  • ELSE part도 없고 true인 조건이 없다면 NULL을 반환한다.

위의 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를 기준으로 정렬하라는 의미이다.



6. Like /Not like

SELECT column1, column2, ...
FROM table_name
WHERE columnN LIKE pattern;
  • Like operatorWHERE clause에서 caolumn에 있는 특정 패턴을 찾기 위해 사용된다.
  • %는 0개에서 하나 이상의 문자들을 나타낸다.
    _는 하나의 문자를 나타낸다.

LIKE operator

  • WHERE CustomerName LIKE 'a%'
    : "a"로 시작하는 어느 값을 찾아라
SELECT * FROM Customers
WHERE CustomerName LIKE 'a%';
  • WHERE CustomerName LIKE '%a'
    : "a"로 끝나는 어느 값을 찾아라
SELECT * FROM Customers
WHERE CustomerName LIKE '%a';
  • WHERE CustomerName LIKE '%or%'
    : 어느 위치에 "or"이 포함된 어느 값을 찾아라
SELECT * FROM Customers
WHERE CustomerName LIKE '%or%';

  • WHERE CustomerName LIKE '_r%'
    : 두 번째 위치에 "r"을 갖는 어느 값을 찾아라
SELECT * FROM Customers
WHERE CustomerName LIKE '_r%';

  • WHERE CustomerName LIKE 'a_%'
    : "a"로 시작하고 적어도 2개의 문자를 갖는 값을 찾아라
  • WHERE CustomerName LIKE 'a__%'
    : "a"로 시작하고 적어도 3개의 문자를 갖는 값을 찾아라
SELECT * FROM Customers
WHERE CustomerName LIKE 'a__%';

  • WHERE CustomerName LIKE 'a%o'
    : "a"로 시작하고 "o"로 끝나는 값을 찾아라
SELECT * FROM Customers
WHERE ContactName LIKE 'a%o';

  • WHERE CustomerName NOT LIKE 'a%'
    : "a"로 시작하지 않는 값을 찾아라
SELECT * FROM Customers
WHERE CustomerName NOT LIKE 'a%';


7. 서브쿼리

서브 쿼리는 SQL 서브쿼리 예제라는 글에서 너무너무 잘 정리되어 있기 때문에 넘어가겠음.



8. Join

  • 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);



9. Outer join

  • (INNER) JOIN : Returns records that have matching values in both tables
  • LEFT (OUTER) JOIN : Returns all records from the left table, and the matched records from the right table
  • RIGHT (OUTER) JOIN : Returns all records from the right table, and the matched records from the left table
  • FULL (OUTER) JOIN : Returns all records when there is a match in either left or right table

  • LEFT JOIN
    SELECT 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 되었다.


  • RIGHT JOIN
    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한다!!


  • FULL (OUTER) JOIN
    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이 일치하는지 여부에 관계없이 두 테이블에서 일치하는 모든 레코드를 반환한다.



10. Sum/Min/Max/AVG

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;

profile
SW Engineer 꿈나무 / 자의식이 있는 컴퓨터

0개의 댓글