반응형


UNION


https://www.w3schools.com/sql/sql_union.asp


UNION 구문은 둘 이상의 SELECT statements를 결합시킬때 이용한다.


각 UNION이된 SELECT statement는 같은 열의 수를 가진다.

열은 반드시 같은 데이터 타입이다.

각 SELECT statement의 열은 같은 순서를 가진다.


UNION Syntax
SELECT column_name(s) FROM table1
UNION
SELECT column_name(s) FROM table2;
UNION ALL Syntax


UNION은 distinct 값을 가지게 된다. 즉, 중복없이 값을 리턴한다.


SELECT column_name(s) FROM table1
UNION ALL
SELECT column_name(s) FROM table2;


하지만 UNION ALL을 이용하면 중복되게 값을 리턴 할 수 있다.


SELECT City FROM Customers
UNION
SELECT City FROM Suppliers
ORDER BY City;


Customers와 Suppliers의 City를 중복없이 결합하고 City를 오름차순 정렬해준다.


SELECT City FROM Customers
UNION ALL
SELECT City FROM Suppliers
ORDER BY City;


Customers와 Suppliers의 City를 중복으로 결합하고 City를 오름차순 정렬해준다.


이때 중복으로 결합된 것을 확인하기 위해서는 Customers의 테이블 총 레코드수가 91개이고 Suppliers의 테이블 총 레코드수가 29개이니 120개가 맞다.


SELECT City, Country FROM Customers
WHERE Country='UK'
UNION
SELECT City, Country FROM Suppliers
WHERE Country='Germany'
ORDER BY City;


WHERE절을 이용해서도 UNION을 할 수 있다.


Customers의 Country가 UK인 것과 Suppliers의 Country가 Germany인 것을 서로 UNION한다.


SELECT City, Country FROM Customers
WHERE Country='UK'
UNION ALL
SELECT City, Country FROM Suppliers
WHERE Country='Germany'
ORDER BY City;


위의 쿼리문도 사용하여 ALL이 있을때와 없을때를 비교해보자.





GROUP BY


https://www.w3schools.com/sql/sql_groupby.asp


GROUP BY 구문은 계산 함수(COUNT, MAX, MIN, SUM, AVG) 같은 것들을 쓸때 사용되며 하나 이상의 열의 결과를 그룹화한다.


즉 계산함수를 이용하여 나타낸 값을 그룹화하여 어떤 값을 도출하고 싶을 때 이용한다.


http://makand.tistory.com/entry/SQL-GROUP-BY-%EA%B5%AC%EB%AC%B8


SELECT column_name(s)
FROM table_name
WHERE condition
GROUP BY column_name(s)
ORDER BY column_name(s);



SELECT COUNT(CustomerID), Country
FROM Customers
GROUP BY Country;


Customers 테이블에서 CustomerID의 개수를 카운트 한 후 Country로 그룹화 시키면 각 Country마다의 수가 나타나게 된다.



SELECT Shippers.ShipperName, COUNT(Orders.OrderID) AS NumberOfOrders FROM Orders
LEFT JOIN Shippers ON Orders.ShipperID = Shippers.ShipperID
GROUP BY ShipperName;


Orders 테이블에서 Orders.OrderID의 개수를 카운트 한 후 Orders의 테이블에 Shippers 테이블이 LEFT JOIN을 하게 되는데 ShipperID가 같은 것을 기준으로 조인한다.


그리고 마지막으로 ShipperName 기준으로 GROUP BY를 하여 그룹화한다.




HAVING


https://www.w3schools.com/sql/sql_having.asp


HAVING 절은 WHERE 키워드에 계산 함수가 쓰일 수 없기에 추가되었는 절이다.


SELECT column_name(s)
FROM table_name
WHERE condition
GROUP BY column_name(s)
HAVING condition
ORDER BY column_name(s);



SELECT COUNT(CustomerID), Country
FROM Customers
GROUP BY Country
ORDER BY COUNT(CustomerID) DESC;


위 쿼리문을 먼저 해보고


SELECT COUNT(CustomerID), Country
FROM Customers
GROUP BY Country
HAVING COUNT(CustomerID) > 9
ORDER BY COUNT(CustomerID) DESC;


위 쿼리문을 그다음 실행해보고


SELECT COUNT(CustomerID), Country
FROM Customers
GROUP BY Country
WHERE COUNT(CustomerID) > 9
ORDER BY COUNT(CustomerID) DESC;


쿼리문을 실행하여 WHERE대신 왜 HAVING을 써야하는지 파악해보자.


SELECT COUNT(CustomerID), Country
FROM Customers
GROUP BY Country
HAVING COUNT(CustomerID) > 9
ORDER BY COUNT(CustomerID) DESC;


이 쿼리문은 Customers 테이블에서 CustomerID의 개수와 Country 필드를 가져오는데 Country를 기준으로 그룹화한다는 것이다.


이때 COUNT(CustomerID)가 9보다 큰 값을 필터링하고 마지막에 COUNT(CustomerID)를 기준으로 내림차순 정렬한 값을 리턴해준다.



SELECT Employees.LastName, COUNT(Orders.OrderID) AS NumberOfOrders
FROM Orders
INNER JOIN Employees ON Orders.EmployeeID = Employees.EmployeeID
WHERE LastName = 'Davolio' OR LastName = 'Leverling'
GROUP BY LastName
HAVING COUNT(Orders.OrderID) > 29;


Orders 테이블에서 Orders.OrderID 를 카운트하고 INNER JOIN을 하게 되는데 Orders와 Employees의 EmployeeID가 같은 것의 교집합을 조인하게 된다.


이때 나온 값 중 LastName이 Davolio거나 Leverling인 값을 필터링하고 마지막으로 LastName을 기준으로 그룹화한다.

마지막으로 COUNT(Orders.OrderID)가 29보다 큰 값만 리턴해준다.




EXISTS


https://www.w3schools.com/sql/sql_exists.asp


EXISTS 구문은 하위 쿼리의 레코드 존재 여부를 테스트하는데 사용된다.


하위 쿼리가 하나 이상 존재한다면 true를 반환한다.


IN과 EXISTS가 유사한데 차이점은 


EXISTS는 해당 row가 존재하는지만 확인하고 더이상 수행하지 않지만

IN은 실제 존재하는 데이터들의 모든 값까지 확인하기에 EXISTS가 더 좋은 성능을 나타내므로 사용을 권장한다.


SELECT SupplierName
FROM Suppliers
WHERE EXISTS (SELECT ProductName FROM Products WHERE SupplierId = Suppliers.supplierId AND Price < 20);


Products의 SupplierId와 Suppliers의 SupplierId가 같고 Price가 20 미만인 값들이 존재하는 그런 SupplierName를 출력한다. 




ANY / ALL


https://www.w3schools.com/sql/sql_any_all.asp


ANY 구문은 하위 쿼리가 하나라도 만족하면 true를 반환한다.


SELECT column_name(s)
FROM table_name
WHERE column_name operator ANY
(SELECT column_name FROM table_name WHERE condition);


SELECT ProductName
FROM Products
WHERE ProductID = ANY (SELECT ProductID FROM OrderDetails WHERE Quantity = 10);


이 쿼리문에서는 OrderDetails 테이블에 레코드들중 하나라도 quantity = 10을 만족하면 True를 반환하고


그 ProductID가 존재하면 WHERE절을 만족한다.



ALL 구문은 하위 쿼리가 모두 만족해야 true를 반환한다.


SELECT column_name(s)
FROM table_name
WHERE column_name operator ALL
(SELECT column_name FROM table_name WHERE condition);


아래 링크를 참고해서 모든 내용을 이해해보자.


http://carami.tistory.com/18





반응형