SQL(UNION,GROUP BY,조건연산자,SELECT INTO,SELECT NULL)

w3schools.com 의 ‘SQL’과정을 참고하였습니다.


SQL UNION

  • 두개이상의 SELECT문에서 결과를 가져와서 합치는 것
  • 같은 컬럼 수를 가지고 있어야 한다.
  • 데이터 타입이 같아야 한다.
  • 같은 순서를 가지고 있어야 한다.
-- 기본 UNION
-- 두개의 SELECT문에 중복된 값의 경우, 하나만 가져온다. 기본적으로 DISTINCT 된 값
SELECT column_name(s) FROM table1
UNION
SELECT column_name(s) FROM table2;

-- 중복된 것을 포함
SELECT column_name(s) FROM table1
UNION ALL
SELECT column_name(s) FROM table2;

-- 예제
SELECT 'Customer' As Type, ContactName, City, Country
FROM Customers
UNION
SELECT 'Supplier', ContactName, City, Country
FROM Suppliers;

SQL GROUP BY / HAVING

  • 집계 함수 (COUNT,ALL,MAX,MIN 등)을 사용 할 수 있다.
  • GROUP을 지정할 때, WHERE절과 같이 조건을 지정하기 위해 HAVING을 사용
  • SELECT에는 GROUP BY에 사용된 속성만 올 수 있다.
SELECT column_name(s)
FROM table_name
WHERE condition
GROUP BY column_name(s) HAVING condition
ORDER BY column_name(s);

-- 예제
-- CustomerID 가 5를 초과하는 데이터를 Country로 그룹화 하고
-- 그 데이터들의  CustomerID 갯수와, Country를 출력
SELECT COUNT(CustomerID), Country
FROM Customers
GROUP BY Country
HAVING COUNT(CustomerID) > 5;

-- 순서 1.FROM 2. JOIN - WHERE 3. SELECT 부속 질의문 4. GROUP BY 5. SELECT
-- JOIN한 테이블에서 ' Davolio', 'Fuller'라는 이름을 가진 사람들 중에 OrderID가 25 초과인사람들
SELECT Employees.LastName, COUNT(Orders.OrderID) AS NumberOfOrders
FROM Orders
INNER JOIN Employees ON Orders.EmployeeID = Employees.EmployeeID
WHERE LastName = 'Davolio' OR LastName = 'Fuller'
GROUP BY LastName
HAVING COUNT(Orders.OrderID) > 25;

SQL EXISTS

  • 서브쿼리 조건이 ROW에 존재 할 경우, 실행이 된다.
SELECT column_name(s)
FROM table_name
WHERE EXISTS
(SELECT column_name FROM table_name WHERE condition);

IN 과 EXISTS 의 차이는?

  • EXISTS는 해당 ROW가 있는지 확인만 한다
  • SELECT절을 평가하지 않으므로, 일반적으로 IN에 비해 성능이 좋다.
  • IN은 실재 존재하는 데이터의 모든 값까지 확인한다
  • IN의 경우, NULL 데이터에 대해 FALSE를 리턴하기 때문에, NULL 처리를 하지 않을 경우 오류가 생길 수도 있다.

IN과 EXISTS의 차이


SQL ANY , ALL

  • ANYALL 연산자는 WHEREHAVING절에 사용된다.
  • ANY : 조건이 하나라도 있을 경우, true
  • ALL : 모든 조건이 있어야만, true
-- 예제
-- 수량이 99개 초과인  Product ID가 하나라도 있으면,
-- 그것의  ProductName출력
SELECT  ProductName
FROM  Products
WHERE ProductID = ANY (SELECT ProductID FROM OrderDetails WHERE Quantity > 99);

SQL SELECT INTO

  • 테이블에 있는 데이터를 새로운 테이블에 복사할 때 사용 ```sql – 테이블 전체 row를 복사 할때, IN은 새로운 데이터베이스에 저장 SELECT * INTO newtable [IN externaldb] FROM oldtable WHERE condition;

– 기존 테이블의 스키마는 사용하되, 컬럼은 비어있는 새로운 테이블을 만들 때 사용. SELECT * INTO newtable FROM oldtable WHERE 1 = 0;


## SQL INSERT INTO SELECT
- 데이터를 복하사고, 복사한 데이터를 지정한 테이블에 삽입할 때 사용
  - `INSERT INTO SELECT`는 데이터 타입과 붙여넣기 할 테이블이 필요하다
  -  기본의 테이블은 영향을 받지 않는다.

```sql
-- 예제
-- Supplier테이블에서  SupplierName,City, country 속성을 복사하여
-- Customers테이블에 CustomerName, City, Country 속성으로 삽입
INSERT INTO Customers (CustomerName, City, Country)
SELECT SupplierName, City, Country FROM Suppliers;

-- 예제
INSERT INTO Customer (CustomerName, City, Country)
SELECT SupplierName, City, Country From Suppliers
WHERE Country = 'Germany';

SQL SELECT NULL

  • IFNULL(), ISNULL(), COALESCE(), NVL()
  • SQL 언어들마다 조금씩 다름 자세히보기

comments


--  짧은 주석

/* 긴 주석
안녕하세요 sql 공부중입니다. */