티스토리 뷰

WEB/기타

[SQL] JOIN

silverline79 2024. 1. 19. 21:47

[ JOIN ] 두 개 이상의 테이블에서 행을 결합

JOIN절은 그들 사이의 관련 열을 기반으로, 두 개 이상의 테이블에서 행을 결합하는 데 사용
INNER JOIN두 테이블에서 일치하는 값을 가진 레코드를 선택 하는 다음 SQL ( 포함 ) 을 만들 수 있습니다 .
SELECT Orders.OrderID, Customers.CustomerName, Orders.OrderDateFROM OrdersINNER JOIN Customers ON Orders.CustomerID=Customers.CustomerID;
(INNER) JOIN: 두 테이블에서 일치하는 값을 가진 레코드를 반환합니다.
LEFT (OUTER) JOIN : 왼쪽 테이블의 모든 레코드를 반환하고 오른쪽 테이블의 일치하는 레코드를 반환합니다.
RIGHT (OUTER) JOIN : 오른쪽 테이블의 모든 레코드를 반환하고 왼쪽 테이블의 일치하는 레코드를 반환합니다.
FULL (OUTER) JOIN : 왼쪽 또는 오른쪽 테이블에 일치하는 항목이 있는 경우 모든 레코드를 반환합니다.

[ INNER JOIN ] INNER JOIN두 테이블에서 일치하는 값이 키워드 선택 기록.

  INNER JOIN 두 테이블에서 일치하는 값이 키워드 선택 기록.
SELECT column_name(s)FROM table1INNER JOIN table2ON table1.column_name = table2.column_name;
고객 정보가 있는 모든 주문을 선택
SELECT Orders.OrderID, Customers.CustomerNameFROM OrdersINNER JOIN Customers ON Orders.CustomerID = Customers.CustomerID;
고객 및 배송업체 정보가 있는 모든 주문을 선택
SELECT Orders.OrderID, Customers.CustomerName, Shippers.ShipperNameFROM ((OrdersINNER JOIN Customers ON Orders.CustomerID = Customers.CustomerID)INNER JOIN Shippers ON Orders.ShipperID = Shippers.ShipperID);

 

[ LEFT JOIN ]

  LEFT JOIN 키워드 반환 왼쪽 테이블 (1)에서 모든 레코드, 오른쪽 테이블 (2)에서 일치하는 레코드. 일치하는 항목이 없는 경우 결과는 오른쪽에서 0개의 레코드입니다.
SELECT column_name(s)FROM table1LEFT JOIN table2ON table1.column_name = table2.column_name;
모든 고객과 고객이 가질 수 있는 모든 주문을 선택
SELECT Customers.CustomerName, Orders.OrderIDFROM CustomersLEFT JOIN Orders ON Customers.CustomerID = Orders.CustomerIDORDER BY Customers.CustomerName;
LEFT JOIN 키워드는 바로 테이블 (주문)에과 일치하는 데이터가 존재하지 않는 경우에도 왼쪽 테이블의 모든 레코드 (고객)을 반환합니다.

[ RIGHT JOIN ]

  RIGHT JOIN키워드 반환 우측 표 (2)에서 모든 기록, 왼쪽 테이블 (1)에서 일치하는 레코드. 일치하는 항목이 없는 경우 결과는 왼쪽부터 0개의 레코드입니다.
SELECT column_name(s)FROM table1RIGHT JOIN table2ON table1.column_name = table2.column_name;
모든 직원과 직원이 내린 모든 주문을 반환
SELECT Orders.OrderID, Employees.LastName, Employees.FirstNameFROM OrdersRIGHT JOIN Employees ON Orders.EmployeeID = Employees.EmployeeIDORDER BY Orders.OrderID;
RIGHT JOIN 키워드 반환 우측 표 (직원)의 모든 기록, 왼쪽 테이블 (주문)에는 일치가없는 경우에도 오른쪽 테이블의 모든 레코드 (직원)을 반환합니다.

 

[ FULL JOIN ]

  FULL OUTER JOIN키워드 반환 왼쪽 (1) 또는 오른쪽 (2) 테이블 레코드에서 일치가 모든 레코드를.
SELECT column_name(s)FROM table1FULL OUTER JOIN table2ON table1.column_name = table2.column_nameWHERE condition;
모든 고객과 모든 주문을 선택
SELECT Customers.CustomerName, Orders.OrderIDFROM CustomersFULL OUTER JOIN Orders ON Customers.CustomerID=Orders.CustomerIDORDER BY Customers.CustomerName;
FULL OUTER JOIN 키워드 수익률 다른 테이블과 일치 여부 두 테이블에서 일치하는 모든 기록. 따라서 "주문"에 일치하지 않는 행이 "고객"에 있거나 "고객"에 일치하지 않는 행이 "주문"에 있는 경우 해당 행도 나열됩니다.

 

[ SELF JOIN ] 자체 조인은 일반 조인이지만 테이블은 자신과 조인

자체 조인은 일반 조인이지만 테이블은 자신과 조인 SELECT column_name(s)FROM table1 T1, table1 T2WHERE condition;
같은 도시에 있는 고객과 일치
SELECT A.CustomerName AS CustomerName1, B.CustomerName AS CustomerName2, A.CityFROM Customers A, Customers BWHERE A.CustomerID <>B.CustomerIDAND A.City = B.CityORDER BY A.City;

[ UNION ]

UNION 연산자는 두 개 이상의 결과 집합을 결합하는 데 사용되는 SELECT .


SELECT안의 모든 명령문 UNION에는 동일한 수의 열이 있어야 합니다.
열에도 유사한 데이터 유형이 있어야 합니다.
모든 SELECT문의 열도 같은 순서여야 합니다.
SELECT column_name(s) FROM table1UNIONSELECT column_name(s) FROM table2;
UNION ALL 구문
UNION조작은 기본적으로 별개의 값을 선택한다. 중복 값을 허용하려면 다음을 사용하십시오 UNION ALL.
SELECT column_name(s) FROM table1UNION ALLSELECT column_name(s) FROM table2;
UNION
"Customers" "Suppliers" 테이블 모두에서 도시(고유한 값만)를 반환
SELECT City FROM CustomersUNIONSELECT City FROM SuppliersORDER BY City;
UNION ALL
"Customers" "Suppliers" 테이블 모두에서 도시(중복 값도 포함)를 반환
SELECT City FROM CustomersUNION ALLSELECT City FROM SuppliersORDER BY City;
UNION With WHERE
"Customers" "Suppliers" 테이블 모두에서 독일 도시(고유한 값만)를 반환
SELECT City, Country FROM CustomersWHERE Country='Germany'UNIONSELECT City, Country FROM SuppliersWHERE Country='Germany'ORDER BY City;
UNION ALL With WHERE
"Customers" "Suppliers" 테이블 모두에서 독일 도시(중복 값도 포함)를 반환
SELECT City, Country FROM CustomersWHERE Country='Germany'UNION ALLSELECT City, Country FROM SuppliersWHERE Country='Germany'ORDER BY City;
Another UNION
모든 고객과 공급업체를 나열
SELECT 'Customer' AS Type, ContactName, City, CountryFROM CustomersUNIONSELECT 'Supplier', ContactName, City, CountryFROM Suppliers;

 

[ GROUP BY ]

GROUP BY같이 요약 행에 같은 값이 문 그룹 행은 "각국의 고객의 수를 찾을 수 있습니다."


GROUP BY문은 하나 이상의 열로 결과 집합을 그룹화하기 위해 집계 함수( COUNT(), MAX(), MIN(), SUM(), AVG()) 와 함께 자주 사용됩니다 .
SELECT column_name(s)FROM table_nameWHERE conditionGROUP BY column_name(s)ORDER BY column_name(s);
각 국가의 고객 수를 나열 SELECT COUNT(CustomerID), CountryFROM CustomersGROUP BY Country;
높은 순으로 정렬된 각 국가의 고객 수를 나열 SELECT COUNT(CustomerID), CountryFROM CustomersGROUP BY CountryORDER BY COUNT(CustomerID) DESC;
각 배송업체에서 보낸 주문 수를 나열 SELECT Shippers.ShipperName, COUNT(Orders.OrderID) AS NumberOfOrders FROM OrdersLEFT JOIN Shippers ON Orders.ShipperID = Shippers.ShipperIDGROUP BY ShipperName;

 

[ HAVING ]

HAVING때문에 절은 SQL에 추가 된 WHERE키워드가 집계 함수와 함께 사용할 수 없습니다. SELECT column_name(s)FROM table_nameWHERE conditionGROUP BY column_name(s)HAVING conditionORDER BY column_name(s);
각 국가의 고객 수를 나열합니다. 고객이 5명 이상인 국가만 포함 SELECT COUNT(CustomerID), CountryFROM CustomersGROUP BY CountryHAVING COUNT(CustomerID) > 5;
각 국가의 고객 수를 높은 순으로 정렬하여 나열합니다(5명 이상의 고객이 있는 국가만 포함). SELECT COUNT(CustomerID), CountryFROM CustomersGROUP BY CountryHAVING COUNT(CustomerID) > 5ORDER BY COUNT(CustomerID) DESC;
10개 이상의 주문을 등록한 직원을 나열 SELECT Employees.LastName, COUNT(Orders.OrderID) AS NumberOfOrdersFROM (OrdersINNER JOIN Employees ON Orders.EmployeeID = Employees.EmployeeID)GROUP BY LastNameHAVING COUNT(Orders.OrderID) > 10;
직원 "Davolio" 또는 "Fuller"25개 이상의 주문을 등록했는지 여부를 나열 SELECT Employees.LastName, COUNT(Orders.OrderID) AS NumberOfOrdersFROM OrdersINNER JOIN Employees ON Orders.EmployeeID = Employees.EmployeeIDWHERE LastName = 'Davolio' OR LastName = 'Fuller'GROUP BY LastNameHAVING COUNT(Orders.OrderID) > 25;

[ EXISTS ]

EXISTS 연산자 서브 쿼리의 모든 레코드의 존재를 테스트하는 데 사용된다.
EXISTS 운영자 TRUE 반환 하위 쿼리가 하나 개 이상의 레코드를 반환합니다.
SELECT column_name(s)FROM table_nameWHERE EXISTS(SELECT column_name FROM table_name WHERE condition);
TRUE를 반환하고 제품 가격이 20 미만인 공급자를 나열 SELECT SupplierNameFROM SuppliersWHERE EXISTS (SELECT ProductName FROM Products WHERE Products.SupplierID = Suppliers.supplierID AND Price < 20);
TRUE를 반환하고 제품 가격이 22인 공급자를 나열 SELECT SupplierNameFROM SuppliersWHERE EXISTS (SELECT ProductName FROM Products WHERE Products.SupplierID = Suppliers.supplierID AND Price = 22);

[ ANY ]

ANY 연산자 :
결과로 부울 값을 반환합니다.
하위 쿼리 값 중 하나라도 조건을 충족하는 경우 TRUE를 반환합니다.
ANY 범위의 값 중 하나에 대해 작업이 참인 경우 조건이 참임을 의미합니다.
SELECT column_name(s)FROM table_nameWHERE column_name operator ANY  (SELECT column_name  FROM table_name  WHERE condition);
주의 ) 표준 비교 연산자이어야 (=, <> =,>,> =, <또는 <=!).
OrderDetails 테이블에서 Quantity10인 레코드를 찾으면 ProductName을 나열합니다(Quantity 열에 일부 값이 10이기 때문에 TRUE가 반환됨). SELECT ProductNameFROM ProductsWHERE ProductID = ANY  (SELECT ProductID  FROM OrderDetails  WHERE Quantity = 10);
OrderDetails 테이블에서 Quantity99보다 큰 레코드를 찾으면 ProductName을 나열합니다(Quantity 열에 99보다 큰 값이 있기 때문에 TRUE가 반환됨). SELECT ProductNameFROM ProductsWHERE ProductID = ANY  (SELECT ProductID  FROM OrderDetails  WHERE Quantity > 99);
OrderDetails 테이블에서 Quantity1000보다 큰 레코드를 찾으면 ProductName을 나열합니다(Quantity 열에 1000보다 큰 값이 없기 때문에 FALSE를 반환함). SELECT ProductNameFROM ProductsWHERE ProductID = ANY  (SELECT ProductID  FROM OrderDetails  WHERE Quantity > 1000);

 

[ ALL ]

ALL 연산자 :
결과로 부울 값을 반환합니다.
모든 하위 쿼리 값이 조건을 충족하면 TRUE를 반환합니다.
SELECT, WHEREHAVING문과 함께 사용됩니다 .
ALL 범위의 모든 값에 대해 작업이 true인 경우에만 조건이 true임을 의미합니다.
SELECT ALL column_name(s)FROM table_nameWHERE condition;
WHERE 또는 HAVING이 있는 ALL 구문 SELECT column_name(s)FROM table_nameWHERE column_name operator ALL  (SELECT column_name  FROM table_name  WHERE condition);
모든 제품 이름을 나열 SELECT ALL ProductNameFROM ProductsWHERE TRUE;
OrderDetails 테이블의 모든 레코드에 Quantity10인 경우 ProductName을 나열합니다. Quantity 열에 다양한 값(10의 값뿐만 아니라)이 있기 때문에 물론 FALSE를 반환 SELECT ProductNameFROM ProductsWHERE ProductID = ALL  (SELECT ProductID  FROM OrderDetails  WHERE Quantity = 10);

 

[ SELECT INTO ]

SELECT INTO새 테이블에 하나 개의 테이블에서 문 데이터를 복사합니다. SELECT *INTO newtable [IN externaldb]FROM oldtableWHERE condition;
일부 열만 새 테이블에 복사 SELECT column1column2column3, ...INTO newtable [IN externaldb]FROM oldtableWHERE condition;
고객의 백업 복사본을 생성 SELECT * INTO CustomersBackup2017FROM Customers;
IN절을 사용하여 테이블을 다른 데이터베이스의 새 테이블로 복사 SELECT * INTO CustomersBackup2017 IN 'Backup.mdb'FROM Customers;
몇 개의 열만 새 테이블에 복사 SELECT CustomerName, ContactName INTO CustomersBackup2017FROM Customers;
독일 고객만 새 테이블에 복사 SELECT * INTO CustomersGermanyFROM CustomersWHERE Country = 'Germany'
둘 이상의 테이블에서 새 테이블로 데이터를 복사 SELECT Customers.CustomerName, Orders.OrderIDINTO CustomersOrderBackup2017FROM CustomersLEFT JOIN Orders ON Customers.CustomerID = Orders.CustomerID;
SELECT INTO 다른 스키마를 사용하여 비어 있는 새 테이블을 만드는 데 사용할 수도 있습니다. WHERE쿼리가 데이터를 반환하지 않도록 하는 절을 추가하기만 하면 됩니다. SELECT * INTO newtableFROM oldtableWHERE 1 = 0;

 

[ INSERT INTO SELECT ]

INSERT INTO SELECT다른 테이블에 문을 복사 한 테이블에서 데이터 삽입을.


INSERT INTO SELECT문은 소스 및 목표 테이블의 경기에서 그 데이터 유형을 필요로한다.


참고: 대상 테이블의 기존 레코드는 영향을 받지 않습니다.대상 테이블의 기존 레코드는 영향을 받지 않습니다.
INSERT INTO table2SELECT * FROM table1WHERE condition;
한 테이블의 일부 열만 다른 테이블로 복사 INSERT INTO table2 (column1column2column3, ...)SELECT column1column2column3, ...FROM table1WHERE condition;
"공급자""고객"으로 복사합니다(데이터로 채워지지 않은 열에는 NULL이 포함됨). INSERT INTO Customers (CustomerName, City, Country)SELECT SupplierName, City, Country FROM Suppliers;
"공급자""고객"으로 복사합니다(모든 열 채우기). INSERT INTO Customers (CustomerName, ContactName, Address, City, PostalCode, Country)SELECT SupplierName, ContactName, Address, City, PostalCode, Country FROM Suppliers;
독일 공급자만 "고객"으로 복사 INSERT INTO Customers (CustomerName, City, Country)SELECT SupplierName, City, Country FROM SuppliersWHERE Country='Germany';

 

[ CASE ]

CASE문은 조건을 통과하고 첫 번째 조건은 (if-then-else 명령문 등)을 충족하는 값을 반환합니다. 따라서 조건이 true이면 읽기를 중지하고 결과를 반환합니다. 조건이 참이 아니면 ELSE절의 값을 반환합니다 .
거기에 더없는 경우 ELSE부분에는 조건에 해당하지 않습니다, 그것은 NULL을 반환합니다.
CASE    WHEN condition1 THEN result1    WHEN condition2 THEN result2    WHEN conditionN THEN resultN    ELSE resultEND;
조건을 통과하고 첫 번째 조건이 충족될 때 값을 반환 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 QuantityTextFROM OrderDetails;
City별로 고객을 주문합니다. 그러나 CityNULL이면 국가별로 주문 SELECT CustomerName, City, CountryFROM CustomersORDER BY(CASE    WHEN City IS NULL THEN Country    ELSE CityEND);

 

'WEB > 기타' 카테고리의 다른 글

[SQL] DB 생성 구문  (0) 2024.01.19
[SQL] INSERT INTO, UPDATE, DELETE  (0) 2024.01.19
[SQL] SELECT  (0) 2024.01.19
중요한 SQL 명령  (0) 2024.01.19
이클립스 yml , jsp 파일 메모장으로 열릴때  (0) 2021.09.26
댓글