집합연산 UNION / UNION ALL

중복된 값을 제거하는 것이 UNION의 default

만약에 중복되는 값이 없는 테이블 연산이면 UNION ALL을 사용하는 것이 좋다

 

주의할 점 : A UNION B 를 수행할 때 A에는 ORDER BY 사용 못함

 

로그인 아이디 연락처 주소
A 010-1111-1111 광진구 자양동
B 010-2222-2222 송파구 석촌동
로그인 아이디 연락처 주소
C 010-3333-3333 분당구 판교동
B 010-2222-2222 송파구 석촌동

 

UNION  결과 => 중복 제거

로그인 아이디 연락처 주소
A 010-1111-1111 광진구 자양동
B 010-2222-2222 송파구 석촌동
C 010-3333-3333 분당구 판교동

 

UNION ALL 결과 => 중복 허용

로그인 아이디 연락처 주소
A 010-1111-1111 광진구 자양동
B 010-2222-2222 송파구 석촌동
C 010-3333-3333 분당구 판교동
B 010-2222-2222 송파구 석촌동

 

JOIN 연산 사용 예시

-- product 테이블에서 Price가 5이하 또는 200 이상인 상품들만 출력하세요

SELECT *
FROM Products
WHERE price <= 5

UNION

SELECT *
FROM Products
WHERE price >= 200

 

 

FULL OUTER JOIN (MySQL에선 지원 안되지만 LEFT와 RIGHT를 사용해서 구현)

 

고객정보는 있지만 주문 정보는 없을 때

주문 정보는 있지만 고객 정보는 없을 때 를 모두 조회하고 싶다면 LEFT 조인과 RIGHT 조인을 UNION 해준다

SELECT *
FROM Customers
	LEFT JOIN Orders ON Customers.CustomerID = Orders.CustomerID
    
UNION
  
SELECT *
FROM Customers
	RIGHT JOIN Orders ON Customers.CustomerID = Orders.CustomerID

 

 


 

HACKER RANK

 

정답 확인은 더보기 클릭

 

1. Symmetric Pairs - https://www.hackerrank.com/challenges/symmetric-pairs/problem?h_r=internal-search

더보기
/*
20 20 (2번 나와야함 모두)
UNION
20 21
22 23
*/

-- 20 20 케이스 도출
SELECT x, y
FROM Functions
WHERE x = y
GROUP BY x, y
HAVING count(*) = 2

UNION

SELECT a.x
		, a.y
FROM Functions AS a
		INNER JOIN Functions AS b ON a.x = b.y AND a.y = b.x
WHERE a.x < a.y
ORDER BY x

 


 

< 기초 SQL 시리즈 >

 

2020/07/14 - [Database/SQL] - [백문이불여일타] 데이터 분석을 위한 기초 SQL - 1부

2020/07/14 - [Database/SQL] - [백문이불여일타] 데이터 분석을 위한 기초 SQL - 2부

2020/07/14 - [Database/SQL] - [백문이불여일타] 데이터 분석을 위한 기초 SQL - 3부 完

 

< 중급 SQL 시리즈 >

 

2020/07/15 - [Database/SQL] - [백문이불여일타] 데이터 분석을 위한 중급 SQL - 1부

2020/07/15 - [Database/SQL] - [백문이불여일타] 데이터 분석을 위한 중급 SQL - 2부

2020/07/16 - [Database/SQL] - [백문이불여일타] 데이터 분석을 위한 중급 SQL - 3부

2020/07/16 - [Database/SQL] - [백문이불여일타] 데이터 분석을 위한 중급 SQL - 4부 完

 

 

이 포스팅은 해당 강좌를 수강하며 작성하였습니다.

https://www.inflearn.com/course/%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%B6%84%EC%84%9D-%EC%A4%91%EA%B8%89-SQL

 

[백문이불여일타] 데이터 분석을 위한 중급 SQL - 인프런

SQL 중급 이론을 배우고, 실습 문제를 함께 풀어봅니다. 초급 중급이상 데이터베이스 데이터베이스 데이터 분석 SQL 데이터 분석 온라인 강의 업무에 SQL을 바로 적용할 수 있고 SQL 코딩 테스트도 �

www.inflearn.com

 

JOIN

 

참고 사이트는 더보기 클릭

 

INNER JOIN

카티션 곱의 결과로 조인할 때 사용했던 칼럼이 중복 조회됨

즉, users.id = orders.userid 로 조인을 했다면 결과 값이 users 테이블의 id와 orders 테이블의 userid 두 개가 조회된다.

(Customers와 Orders 테이블을 예시로 들면 무조건 한 번 이상의 주문이 있어야 조회가 된다)

 

/*
Old version

SELECT *
FROM Users, Orders
WHERE Users.Id = Orders.userId
*/

SELECT *
FROM Users
	INNER JOIN Orders ON Users.Id = Orders.userId

-- 결과 값은 똑같지만 INNER JOIN 키워드 사용 권장

 


 

OUTER JOIN (LEFT, RIGHT)

 

< 테이블 예시 Users, Orders >

Id 로그인 아이디  주소
1 A 광진구 자양동
2 B 송파구 석촌동
3 C 분당구 판교동
userId 구매 상품 가격 결제수단
1 샴푸 5000 국민카드
2 식빵 7000 신한카드

 

 

LEFT JOIN

- 한 번도 주문을 하지 않은 회원도 출력하고 싶을 경우에 사용

SELECT * 
FROM Users
	LEFT JOIN Orders ON Users.Id = Orders.userId
Id 로그인 아이디 주소 userId 구매 상품 가격 결제수단
1 A 광진구 자양동 1 샴푸 5000 국민카드
2 B 송파구 석촌동 2 식빵 7000 신한카드
3 C 분당구 판교동 NULL NULL NULL NULL

< left 조인 결과 테이블 >

 

한 번도 주문을 안한 회원을 조회하고 싶을 때

SELECT *
FROM Customers
	LEFT JOIN Orders ON Customers.CustomerID = Orders.CustomerID
WHERE OrderID IS NULL

 

 

RIGHT JOIN

 

대부분 LEFT 조인으로 해결함 (잘 쓰지 않음)

 

 


 

HACKER RANK / LEETCODE

 

해답은 더보기란을 클릭

 

1. Africa Cities - https://www.hackerrank.com/challenges/african-cities/problem?h_r=internal-search

더보기
SELECT City.Name
FROM City
	INNER JOIN Country ON City.Countrycode = Country.code
WHERE Continent = 'Africa'

 

2. Asian Population - https://www.hackerrank.com/challenges/asian-population/problem?h_r=internal-search

더보기
SELECT SUM(city.Population)
FROM Country
	INNER JOIN City ON Country.code = City.countrycode
WHERE Country.continent = 'Asia'

 

3. Average Population of Each Continent - https://www.hackerrank.com/challenges/average-population-of-each-continent/problem?h_r=internal-search

더보기
SELECT country.continent
	, FLOOR(AVG(city.population))
FROM Country
	INNER JOIN City ON Country.Code = City.Countrycode
GROUP BY country.continent

 

 

(LEETCODE) 183. Customers Who Never Order - https://leetcode.com/problems/customers-who-never-order/

더보기
 SELECT Customers.name AS "Customers"
 FROM Customers
 	LEFT JOIN Orders ON Customers.id = Orders.CustomerID
WHERE Orders.CustomerID IS NULL

 

 


 

SELF JOIN

 

주의할 점 : AS 즉, 별칭을 무조건 사용해서 같은 테이블을 구분해주어야 함.

자신의 테이블과 JOIN (상사를 찾을 때 씀) 

 

해답은 더보기를 클릭 (LEETCODE)

 

1. https://leetcode.com/problems/employees-earning-more-than-their-managers/

더보기
SELECT Employee.Name "Employee" 
        -- , Employee.Salary "employee_salary"
        -- , Manager.Name "manager_name"
        -- , Manager.Salary "manager_salary"
FROM Employee
    INNER JOIN Employee Manager ON Employee.managerid = Manager.id
WHERE Employee.Salary > Manager.Salary
    

 

2. https://leetcode.com/problems/rising-temperature/

더보기

DATE 계산 방법을 이용해서 RecordDate로 JOIN을 진행  

SELECT today.id
FROM Weather AS today
	INNER JOIN Weather AS yesterday 
    	ON today.recorddate = DATE_ADD(yesterday.recorddate, INTERVAL 1 DAY)
WHERE today.Temperature > yesterday.Temperature

 

+) MySQL 시간 더하기, 빼기

 

DATE_ADD(기준 날짜, INTERVAL)

  • SELECT DATE_ADD(NOW(), INTERVAL 1 SECOND)
  • SELECT DATE_ADD(NOW(), INTERVAL 1 MINUTE)
  • SELECT DATE_ADD(NOW(), INTERVAL 1 HOUR)
  • SELECT DATE_ADD(NOW(), INTERVAL 1 DAY)
  • SELECT DATE_ADD(NOW(), INTERVAL 1 MONTH)
  • SELECT DATE_ADD(NOW(), INTERVAL -1 YEAR)

 

DATE_SUB(기준 날짜, INTERVAL)

  • SELECT DATE_SUB(NOW(), INTERVAL 1 SECOND)

 

 

 


 

< 기초 SQL 시리즈 >

 

2020/07/14 - [Database/SQL] - [백문이불여일타] 데이터 분석을 위한 기초 SQL - 1부

2020/07/14 - [Database/SQL] - [백문이불여일타] 데이터 분석을 위한 기초 SQL - 2부

2020/07/14 - [Database/SQL] - [백문이불여일타] 데이터 분석을 위한 기초 SQL - 3부 完

 

< 중급 SQL 시리즈 >

 

2020/07/15 - [Database/SQL] - [백문이불여일타] 데이터 분석을 위한 중급 SQL - 1부

2020/07/15 - [Database/SQL] - [백문이불여일타] 데이터 분석을 위한 중급 SQL - 2부

2020/07/16 - [Database/SQL] - [백문이불여일타] 데이터 분석을 위한 중급 SQL - 3부

2020/07/16 - [Database/SQL] - [백문이불여일타] 데이터 분석을 위한 중급 SQL - 4부 完

 

 

이 포스팅은 해당 강좌를 수강하며 작성하였습니다.

https://www.inflearn.com/course/%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%B6%84%EC%84%9D-%EC%A4%91%EA%B8%89-SQL

 

[백문이불여일타] 데이터 분석을 위한 중급 SQL - 인프런

SQL 중급 이론을 배우고, 실습 문제를 함께 풀어봅니다. 초급 중급이상 데이터베이스 데이터베이스 데이터 분석 SQL 데이터 분석 온라인 강의 업무에 SQL을 바로 적용할 수 있고 SQL 코딩 테스트도 �

www.inflearn.com

 

데이터 순서 정렬하기

 

ORDER BY

 

ORDER BY의 사용 순서는 SELECT -> FROM -> WHERE -> ORDER BY으로 제일 마지막에 위치

 

mysql은 기본적으로 오름차순

SELECT *
FROM customers
ORDER BY customerid

 

ORDER BY 정렬 결과 스크린샷

 

customerid 내림차순(큰 것 부터)

SELECT *
FROM customers
ORDER BY customerid DESC

 

내림차순 결과 스크린샷

 


 

정렬하기 응용

 

가격이 20$ 이상이고, 가격이 높은 순으로 물건을 조회해라 (10개)

SELECT *
FROM products
WHERE price >= 20
ORDER BY price DESC
LIMIT 10

결과 스크린샷

 


 

+) MySQL 소수점 처리

 

CEIL() - 올림

SELECT CEIL(5.5) => 6

 

FLOOR() - 내림

SELECT FLOOR(5.5) => 5

 

ROUND() - 반올림

ROUND(5.556901, 4) => 5.5569

 

 

+) MySQL 문자열 자르기

 

LEFT(컬럼명, 문자열 길이)

SELECT LEFT("20140323", 4) => 2014

 

RIGHT(컬럼명, 문자열 길이)

SELECT RIGHT("20140323", 4) => 0323

 

SUBSTRING(컬럼명, 시작 위치, 길이) = SUBSTR()

SUBSTR("20140323", 1, 4) => 2014

SUBSTR("20140323", 5) => 0323


 

HACKER RANK

 

 

1. Employee Names

SELECT name
FROM employee
ORDER BY name

 

결과 스크린샷

 

 

 

2. Employee Salaries

SELECT name
FROM employee
WHERE salary >= 2000 AND months < 10
ORDER BY employee_id

 

 

 

3. Higher Than 75 Marks

SELECT name
FROM students
WHERE marks > 75
ORDER BY SUBSTR(name, -3), id

 

결과 스크린샷

 

 

4. Weather Observation Station 15 

SELECT ROUND(long_w, 4)
FROM station
WHERE lat_n < 137.2345
ORDER BY lat_n DESC
LIMIT 1

 

결과화면

 


< 기초 SQL 시리즈 >

 

2020/07/14 - [Database/SQL] - [백문이불여일타] 데이터 분석을 위한 기초 SQL - 1부

2020/07/14 - [Database/SQL] - [백문이불여일타] 데이터 분석을 위한 기초 SQL - 2부

2020/07/14 - [Database/SQL] - [백문이불여일타] 데이터 분석을 위한 기초 SQL - 3부 完

 

 

 

이 포스팅은 해당 강좌를 수강하며 작성하였습니다.

https://www.inflearn.com/course/%EB%B0%B1%EB%AC%B8%EC%9D%B4%EB%B6%88%EC%97%AC%EC%9D%BC%ED%83%80-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%B6%84%EC%84%9D-%EA%B8%B0%EC%B4%88-SQL

 

[백문이불여일타] 데이터 분석을 위한 기초 SQL - 인프런

SQL 기초 이론을 배우고, 해커랭크 문제 10개를 함께 풀어봅니다. 입문 데이터베이스 데이터베이스 데이터 분석 SQL 데이터 분석 온라인 강의 생초보도 따라할 수 있는 SQL 기초강의 듣고 코딩 테스

www.inflearn.com

 

+ Recent posts