SQL Aggregate 함수 = SUM, COUNT, AVG... AVG, COUNT는 null은 세지 않음
COUNT
--------------------------------------------------------------------------
SELECT COUNT(*) FROM Products
>>> 프로덕트의 행들, 데이터 레코드의 개수 세기, null 값 포함
SELECT COUNT(Price) FROM Products AS COUNT(Price)
>>> 특정 컬럼의 행 갯수
SELECT COUNT(DISTINCT Price) FROM Products AS COUNT(Price)
>>> 중복값은 제외하고 셀 때 + null 값 미포함
SUM, AVG(null 계산에서 제외처리됨 )
--------------------------------------------------------------------------
SELECT SUM(Price) FROM Products
SELECT AVG(Price) FROM Products
평균 구할 때, null 값을 0으로 처리해주고 싶을 때
--------------------------------------------------------------------------
SELECT SUM(Price)/COUNT(*) FROM Products
>>> 전체 로우 수로 나누기
최대값, 최소값
--------------------------------------------------------------------------
SELECT MAX(Price) FROM Products
SELECT MIN(Price) FROM Products
SELECT COUNT(Price), MAX(Price), MIN(Price) FROM Products
--------------------------------------------------------------------------
공급자 기준, 평균가격
--------------------------------------------------------------------------
SELECT SupplierID, AVG(Price) FROM Products
GROUP BY SupplierID
+ 기준 1개 추가
--------------------------------------------------------------------------
SELECT SupplierID, CategoryID, AVG(Price) AS AVG_Price FROM Products
GROUP BY SupplierID, CategoryID
더 나은 코드 스타일 + 코드 가독성
--------------------------------------------------------------------------
SELECT SupplierID
, CategoryID
, AVG(Price) AS AVG_Price
FROM Products
GROUP BY SupplierID, CategoryID
오름차순 기준 정렬, Sorting
--------------------------------------------------------------------------
SELECT SupplierID
, CategoryID
, AVG(Price) AS AVG_Price
FROM Products
GROUP BY SupplierID, CategoryID
ORDER BY AVG(Price)
내림차순 기준 정렬
--------------------------------------------------------------------------
SELECT SupplierID
, CategoryID
, AVG(Price) AS AVG_Price
FROM Products
GROUP BY SupplierID, CategoryID
ORDER BY AVG(Price) DESC
집계 함수가 SELECT 문에 들어가도 상관없음
--------------------------------------------------------------------------
SELECT SupplierID
, CategoryID
, AVG(Price) AS AVG_Price
FROM Products
WHERE 은 GROUP BY 이전에
HAVING 은 이후에
--------------------------------------------------------------------------
100불 이상 평균 가격 내림차순 정렬
SELECT SupplierID
, CategoryID
, AVG(Price) AS AVG_Price
FROM Products
GROUP BY SupplierID, CategoryID
HAVING AVG_Price >= 100
ORDER BY AVG(Price) DESC
Alias 활용
--------------------------------------------------------------------------
SELECT SupplierID
, CategoryID
, AVG(Price) AS avg_price
FROM Products
GROUP BY SupplierID, CategoryID
HAVING avg_price >= 100
소수점 처리
--------------------------------------------------------------------------
CEIL() >>> 올림
FLOOR() >>> 내림
ROUND() >>> 반올림
CASE
--------------------------------------------------------------------------
SELECT CASE
WHEN categoryid = 1 THEN '음료'
WHEN categoryid = 2 THEN '조미료'
ELSE '기타'
END AS 'category name', *
FROM Products
AND 조건 1개 추가
--------------------------------------------------------------------------
SELECT CASE
WHEN categoryid = 1 AND supplierID = 2 THEN '음료'
WHEN categoryid = 2 THEN '조미료'
ELSE '기타'
END AS 'category name', *
FROM Products
CASE + GROUP BY
--------------------------------------------------------------------------
SELECT CASE
WHEN categoryid = 1 AND supplierID = 2 THEN '음료'
WHEN categoryid = 2 THEN '소스'
ELSE '기타'
END AS 'NEW_CATEGORY', *
FROM Products
GROUP BY NEW_CATEGORY
--------------------------------------------------------------------------
SELECT
CASE
WHEN categoryid = 1 AND supplierID = 2 THEN '음료'
WHEN categoryid = 2 THEN '소스'
ELSE '기타'
END AS 'NEW_CATEGORY', AVG(Price) >>> 반올림 포함하는
FROM Products
GROUP BY NEW_CATEGORY
WHEN절의 순서 중요,
정삼각형 데이터 분리된 후 다음 케이스 분리하는 방식
--------------------------------------------------------------------------
SELECT
CASE
WHEN A=B AND B=C THEN 'Equilateral'
WHEN A+B<=C OR A+C<=B OR B+C<=A THEN 'Not A Triangle'
WHEN A=B OR A=C OR B=C THEN 'Isosceles'
ELSE 'Scalene'
END
FROM TRIANGLES
행렬 역변환, 데이터 피벗팅
--------------------------------------------------------------------------
SELECT
CASE
WHEN CategoryID = 1 THEN price
ELSE NULL
END AS Category1_price, *
FROM Products
SELECT
CASE
WHEN CategoryID = 1 THEN price
ELSE NULL
END AS Category1_price,
CASE
WHEN CategoryID = 2 THEN price
ELSE NULL
END AS Category2_price,
CASE
WHEN CategoryID = 3 THEN price
ELSE NULL
END AS Category3_price
FROM Products
>>> CASE문에 다른 함수 추가할 때, CASE부터 END까지 괄호 씌워야
SELECT
AVG(CASE
WHEN CategoryID = 1 THEN price
ELSE NULL
END) AS Category1_price,
AVG(CASE
WHEN CategoryID = 2 THEN price
ELSE NULL
END) AS Category2_price
FROM Products
Category1_price Category2_price
37.979166666666664 23.0625
차이 확인하기
SELECT CategoryID, AVG(Price)
FROM Products
GROUP BY CategoryID
CategoryID AVG(Price)
1 39.2
2 40.3
-------------------------------------------------------------------------
INNER 조인 - 교집합
--------------------------------------------------------------------------
SELECT *
FROM Users
INNER JOIN Orders ON Users.ID = Orders.userID
JOIN Orders >>> 붙일 테이블
ON Users.ID = Orders.userID
>>> Users의 ID컬럼과 Orders의 userID 컬럼이 같을때,
이것을 기준으로 해서 조인, 조인이 되는 기준 컬럼
SELECT * FROM Orders
INNER JOIN Customers ON Orders.CustomerID = Customers.CustomerID
SELECT * FROM Orders
INNER JOIN Customers ON Orders.CustomerID = Customers.CustomerID
INNER JOIN Shippers ON Orders.ShippersID = Shippers.ShippersID
이너 중첩
--------------------------------------------------------------------------
SELECT * FROM Orders
INNER JOIN Customers ON Orders.CustomerID = Customers.CustomerID
INNER JOIN Shippers ON Orders.ShipperID = Shippers.ShipperID
LEFT JOIN - Null 값이 포함될 수 있음.
--------------------------------------------------------------------------
SELECT *
FROM Users >>> 왼쪽에 두고 싶은 테이블
LEFT JOIN Orders ON Users.Id = Orders.UserId >>> User.Id 기준으로
>>> 오른쪽에 두고 싶은 테이블
LEFT JOIN - 한번도 주문하지 않은 고객들
--------------------------------------------------------------------------
SELECT * FROM Customers
LEFT JOIN Orders ON Customers.CustomerID = Orders.CustomerID
WHERE OrderID is null
전체 글
- 기존 학습 자료 2023.06.25
- 기초 함수 세부 활용 2023.06.25
- Leetcode 185 - Department Top Three Salaries 2023.06.25
- Leetcode 184 - Department Highest Salary 2023.06.25
- Leetcode 181 - Consecutive Numbers 2023.06.25
- 사용자 함수 2023.06.25
- 정규표현식 2023.06.25
- 해커랭크 - Type of Triangle (CASE) 2023.06.25
- 해커랭크 - Symmetric Pairs (UNION) 2023.06.25
- 해커랭크 - INNER JOIN, LEFT JOIN 2023.06.25
- 해커랭크 - 올림/내림/반올림, 절대값/제곱/제곱근 2023.06.25
- 해커랭크 - 집계함수 2023.06.25
- 해커랭크 - The Report (SELECT + CASE) 2023.06.25
- 해커랭크 - Challenges 2023.06.25
- 해커랭크 - Top earners 2023.06.25
- 서브쿼리 기초 2023.06.24
- Leetcode 184 - Department Highest Salary 2023.06.24
- Leetcode 180 - Consecutive Numbers 2023.06.24
- Leetcode 1179 - Reformat Department Table 2023.06.24
- Leetcode 183 - Customers Who Never Order 2023.06.24
- Leetcode 181 - Employees Earning More Than Their Managers 2023.06.24
- Leetcode 197 - Rising Temperature 2023.06.24
- Leetcode 595 - Big Countries 2023.06.24
- Leetcode 620 - Not Boring Movies 2023.06.24
- Leetcode 182 - Duplicate Emails 2023.06.24
기존 학습 자료
기초 함수 세부 활용
시간 더하기, 빼기
--------------------------------------------------------------------------
DATE_ADD
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)
SELECT DATE_ADD(NOW(), INTERVAL -1 YEAR)
DATE_SUB
SELECT DATE_SUB(NOW(), INTERVAL 1 SECOND)
UNION(중복 제거된 값), UNION ALL
--------------------------------------------------------------------------
*** 위 테이블에서 아래 테이블결과를 뺄때 >>> EXCEPT(ORACLE DB용) or MINUS(ORACLE DB용)
*** 교집합(INTERSECT, Mysql 지원X )
FULL OUTER JOIN을 Mysql로 구현하고 싶을 때는, LEFT, RIGHT 조인을 모두 활용
문자열 다루기 -> % / IN / NOT IN / BETWEEN A AND B / NOT BETWEEN A AND B
--------------------------------------------------------------------------
A로 시작하는 문자열 -> A %
B로 끝나는 문자열 -> % B
C가 들어있는 문자열 -> % C %
문자열 앞 뒤 글자 색출 활용
LEFT('문자열 or 컬럼명', 왼쪽으로부터 컬럼명 인덱스 ) -> ex) LEFT('giraffi',1) -> 'g'
RIGHT('문자열 or 컬럼명', 오른쪽으롭터 컬럼명 인덱스 ) -> ex) RIGHT('giraffi',1) -> 'I'
WHERE LEFT(CITY,1) NOT IN ('a','e','i','o','u') -> 도시이름 문자열 첫 문자가 모음이 아닌 것
OR RIGHT(CITY,1) NOT IN ('a','e','i','o','u') -> 도시이름 문자열 마지막 문자가 모음이 아닌 것
% 활용
WHERE ~~~ LIKE 'A%' -> 따옴표 반드시
_ 은 한칸으로 취
_ _ %A -> 3번째 문자가 A인 문자열
_ _ A _ _ -> 총 5글자, 그 중 3번째 문자가 A인 문자열
IN 활용 -> OR이 여러개 일때 활용, 여러번 적기 귀찮으니
SELECT * FROM lake
WHERE destination=10 OR destination=20 OR destination=30
두개 다 같은 구문
SELECT * FROM lake
WHERE destination IN(10,20,30)
***** NOT IN 도 응용해서 활용 가능
BETWEEN ~ AND 활용 예시
SELECT * FROM lake
WHERE destination BETWEEN 10 AND 30
***** NOT BETWEEN 도 응용해서 활용 가능
대/소문자 변환함수
--------------------------------------------------------------------------
UPPER
LOWER
INITCAP('문자열') - 첫 글자만 대문자 변환
제어함수
--------------------------------------------------------------------------
1) SUBSTR - 문자열 자르기
SUBSTR('문자열',시작위치,길이) -> 오라클 기준 숫자시작은 1
ex) SUBSTR('HELLO_KITTY',3,6) -> LLO_KI
123456
2) INSTR - 내가 찾고자하는 문자열이 전체 문자열에서 몇번째 위치에 있는지 위치를 알려줌
INSTR('문자열','비교하고자 하는 값',시작위치, 몇 번째 비교값인지)
ex) INSTR('HELLO_KITTY',T,1,2) -> 두번째 T가 시작 위치로부터 몇 번째에 위치해 있는지?
12345678910
=> 10
*** 시작위치가 1이 아닐경우, 시작위치 전의 문자는 비교하지 않음, 번호는 시작위치가 1일때와 동일
INSTR('HELLO_KIOTTY','K',1,1) => 7
INSTR('HELLO_KIOTTY','K',5,1) => 7
INSTR('HELLO_KIOTTY','O',6,2) => 0 >>> 6 번째부터 검색하기 때문에 2번쨰 O가 없다고 생각
INSTR('HELLO_KIOTTY','O',6,1) => 9
3) CONCAT - 문자열 병합
CONCAT('안녕','하세요')
보통 CONCAT 보다는 || 를 많이 활용
'안녕'||'하세요' -> '안녕하세요'
4) REPLACE - 특정문자를 다른문자로 변환
REPLACE('문자열','찾을문자','변환문자')
ex) REPLACE('HELLO_KITTY','H','C') => 'CELLO_KITTY'
문자열 채우기 함수
--------------------------------------------------------------------------
1) LPAD - 지정한 길이만큼 왼쪽부터 특정문자로 채우기
LPAD('문자열',총 문자길이,'채움문자')
ex) LPAD('admin',10,'*') => *****admin
2) RPAD - 지정한 길이만큼 오른쪽부터 특정문자로 채우기
ex) RPAD('admin',10,'*') => admin*****
제거함수(두번째 argument 생략가능, 생략시 단순 공백제거 기능)
--------------------------------------------------------------------------
1) LTRIM - 문자열의 왼쪽 공백을 제거하거나, 문자열 왼쪽의 반복적인 문자를 제거
LTRIM('문자열','반복되는 문자')
ex) LTRIM('AAABBB','A') => 'BBB'
ex) LTRIM(' AAABBB') => 'AAABBB'
ex) LTRIM('ABABBBBC','AB') => 'BBBC' -> 왼쪽 반복문자열만 제거
ex) LTRIM('AB ABBBBC','AB') => ' ABBBBC' -> 왼쪽 반복문자열만 제거
12 12
ex) LTRIM('ABCAB DCCCBB','ABC')
=> ABC가 하나의 세트로 되어있는 구성을 제거하는 것이 아님
=> 반복되는 문자 여러개를 입력한 경우, 왼쪽에 개별 문자가 있는지 하나씩 체크해서 없앰
=> 왼쪽에서부터 'A','B','C' 가 있는지 각각을 검사해서 제거
'ABCAB' 까지 삭제
=> ' DCCCBB'
1 >> 위치
2) RTRIM - 문자열의 오른쪽 공백을 제거하거나, 문자열 오른쪽의 반복적인 문자를 제거
"
"
3) TRIM - 문자열의 양쪽 공백을 제거하거나, 문자열 양쪽에서 지정된 문자를 제거
TRIM('문자열')
TRIM('제거할 문자' FROM '문자열')
TRIM(' HELLO_KITTY ') => 'HELLO_KITTY'
TRIM('H' from 'HHELLO_KITTYH') => 'ELLO_KITTY'
TRIM('A' from 'AACDEFA') => 'CDEF'
TRIM(옵션, '제거할 문자' FROM '문자열')의 형태로도 사용가능
** 옵션을 쓰지 않으면 both로 인식
- 옵션: leading, trailing, both
1) leading - 문자열 앞 반복 문자 제거
ex) TRIM(LEADING 'A' FROM 'AAACDEAAA') = > 'CDEAAA'
2) trailing - 문자열 뒤 반복 문자 제거
ex) TRIM(TRAILING 'A' FROM 'AAACDEAAA') = > 'AAACDE'
3) both - 문자열 앞/뒤 반복 문자 제거 = 안써도 됨, 생략하면 both 로 인식
ex) TRIM(BOTH 'A' FROM 'AAACDEAAA') = > 'CDE'
Leetcode 185 - Department Top Three Salaries
https://leetcode.com/problems/department-top-three-salaries/
-- RANK(), DENSE_RANK()
SELECT t.department
, t.employee
, t.salary
FROM(
SELECT department.name AS dapartment
, employee.name AS employee
, employee.salary
, DENSE_RANK() OVER (PARTITION BY departmentid ORDER BY salary DESC) AS dr
FROM Employee
INNER JOIN dapartment ON employee.departmentId = dapartment.id
) t
WHERE t.dr <=3
'기존학습자료 > leetcode, hackerrank' 카테고리의 다른 글
Leetcode 184 - Department Highest Salary (0) | 2023.06.25 |
---|---|
Leetcode 181 - Consecutive Numbers (0) | 2023.06.25 |
해커랭크 - Type of Triangle (CASE) (0) | 2023.06.25 |
해커랭크 - Symmetric Pairs (UNION) (0) | 2023.06.25 |
해커랭크 - INNER JOIN, LEFT JOIN (0) | 2023.06.25 |
Leetcode 184 - Department Highest Salary
https://leetcode.com/problems/department-highest-salary/
*** SELECT에서 연산한 결과물은 WHERE 절에서 사용할 수 없음
SELECT department.name AS Department
, sub.name AS Employee
, sub.max_salary AS Salary
FROM(
SELECT id
, name
, salary
, departmentid
, MAX(salary) OVER (PARTITION BY departmentId) AS max_salary
FROM employee
-- WHERE salary = max_salary >>> SELECT에서 연산한 결과물은 WHERE 절에서 사용할 수 없음
) as sub
INNER JOIN Department ON sub.departmentid = department.id
WHERE sub.salary = sub.max_salary
'기존학습자료 > leetcode, hackerrank' 카테고리의 다른 글
Leetcode 185 - Department Top Three Salaries (0) | 2023.06.25 |
---|---|
Leetcode 181 - Consecutive Numbers (0) | 2023.06.25 |
해커랭크 - Type of Triangle (CASE) (0) | 2023.06.25 |
해커랭크 - Symmetric Pairs (UNION) (0) | 2023.06.25 |
해커랭크 - INNER JOIN, LEFT JOIN (0) | 2023.06.25 |
Leetcode 181 - Consecutive Numbers
https://leetcode.com/problems/consecutive-numbers/
-- Use Window function
-- *LEAD, *LAG
SELECT DISTINCT l.NUM AS ConsecutiveNums
SELECT NUM
, LEAD(NUM,1) OVER (ORDER BY id) AS next
, LEAD(NUM,2) OVER (ORDER BY id ) AS afternext
FROM logs
)l
WHERE l.Num=next AND l.next=l.afternext
'기존학습자료 > leetcode, hackerrank' 카테고리의 다른 글
Leetcode 185 - Department Top Three Salaries (0) | 2023.06.25 |
---|---|
Leetcode 184 - Department Highest Salary (0) | 2023.06.25 |
해커랭크 - Type of Triangle (CASE) (0) | 2023.06.25 |
해커랭크 - Symmetric Pairs (UNION) (0) | 2023.06.25 |
해커랭크 - INNER JOIN, LEFT JOIN (0) | 2023.06.25 |
사용자 함수
Leetcode 177 - Nth Highest Salary
https://leetcode.com/problems/nth-highest-salary/description/
CASE 문
CREATE FUNCTION getNthHighestSalary (N INT)
RETURNS INT
BEGIN
RETURN (
SELECT
CASE WHEN COUNT(sub.Salary) < N THEN NULL
ELSE MIN(sub.Salary) -- 가장 작은 값
END
FROM(
SELECT DISTINCT Salary
FROM Employee
ORDER BY Salary DESC
LIMIT N
) sub
);
END
IF 문 >>> 건이 순차적으로 실행되어야 하는 상황에는 CASE가 적합 (구간을 특정 기준으로 나눠야 할 때)
CREATE FUNCTION getNthHighestSalary (N INT)
RETURNS INT
BEGIN
RETURN (
SELECT
IF(COUNT(sub.Salary) <N, NULL, MIN(sub.Salary))
FROM(
SELECT DISTINCT Salary
FROM Employee
ORDER BY Salary DESC
LIMIT N
) sub
);
END
LIMIT 심화
- return 구문에 서브쿼리를 활용하지 않는다면, 쿼리의 결과가 나오지 않을 시 자동으로 NULL 값 반환
CREATE FUNCTION getNthHighestSalary (N INT)
RETURNS INT
BEGIN
DECLARE A INT;
SET A = N -1; -- equal SET N = N-1; >>> LIMIT N-1,1
RETURN (
SELECT DISTINCT Salary
FROM Employee
ORDER BY Salary DESC
# LIMIT A, 1 >>> 맨 앞에서 A개를 날리고 그 다음 1개를 가져와
LIMIT 1 OFFSET A. >>> 맨 앞에서 A개를 날리고 그 다음 1개를 가져와
);
END
'기존학습자료 > 기초 스킬' 카테고리의 다른 글
고유값 만들기 (0) | 2023.07.02 |
---|---|
기초 함수 세부 활용 (0) | 2023.06.25 |
정규표현식 (0) | 2023.06.25 |
정규표현식
regxone.com/lesson/introdution_abcs. >>> 연습사이트
regxr.com
Weather Observation Station 6
https://www.hackerrank.com/challenges/weather-observation-station-6/problem?h_r=internal-search
기존 풀이
SELECT DISTINCT city
FROM station
WHERE city LIKE 'a%'
OR city LIKE 'e%'
OR city LIKE 'i%'
OR city LIKE 'o%'
OR city LIKE 'u%'
--------------------------------------------------------------------------------
정규표현식 활용
SELECT DISTINCT city
FROM station
WHERE city REGEXP '^[aeiou].*' >>> regular expression
a,e,i,o,u 로 시작해야 하고, 그 뒤는 어떤 문자열이 와도 상관이 없음.
[aeiou] >>> a,e,i,o,u 중 어떤 문자중에 하나라도 들어가면
^문자열 시작위치 >>> 맨 앞
.* 임의의 문자열. = %
. >>> 어떤 문자열도 상관 없음
* >>> .이 몇번 반복될 것 인지?
-----------------------------------------------------------------
Weather Observation Station 7
https://www.hackerrank.com/challenges/weather-observation-station-7/problem?h_r=internal-search
SELECT DISTINCT city
FROM station
WHERE city REGEXP '.*[aeiouAEIOU]$'. >>> ~로 끝나야 할떄 괄호 끝 $표시 >>> [~]$
Weather Observation Station 8
https://www.hackerrank.com/challenges/weather-observation-station-8/problem?h_r=internal-search
SELECT DISTINCT city
FROM station
WHERE city REGEXP '^[aeiouAEIOU].*[aeiouAEIOU]$' >>> 모음으로 시작하고 모음으로 끝나는 경우
Weather Observation Station 9
https://www.hackerrank.com/challenges/weather-observation-station-9/problem?h_r=internal-search
SELECT DISTINCT city
FROM station
WHERE city NOT REGEXP '^[aeiouAEIOU].*'. >>> 모음으로 시작하지 않아야 할 때. NOT 추가
'기존학습자료 > 기초 스킬' 카테고리의 다른 글
고유값 만들기 (0) | 2023.07.02 |
---|---|
기초 함수 세부 활용 (0) | 2023.06.25 |
사용자 함수 (0) | 2023.06.25 |
해커랭크 - Type of Triangle (CASE)
https://www.hackerrank.com/challenges/what-type-of-triangle/problem
SELECT
CASE
WHEN A=B AND B=C THEN 'Equilateral'
WHEN A+B<=C OR A+C<=B OR B+C<=A THEN 'Not A Triangle'
WHEN A=B OR A=C OR B=C THEN 'Isosceles'
ELSE 'Scalene'
END
FROM TRIANGLES
'기존학습자료 > leetcode, hackerrank' 카테고리의 다른 글
Leetcode 184 - Department Highest Salary (0) | 2023.06.25 |
---|---|
Leetcode 181 - Consecutive Numbers (0) | 2023.06.25 |
해커랭크 - Symmetric Pairs (UNION) (0) | 2023.06.25 |
해커랭크 - INNER JOIN, LEFT JOIN (0) | 2023.06.25 |
해커랭크 - 올림/내림/반올림, 절대값/제곱/제곱근 (0) | 2023.06.25 |
해커랭크 - Symmetric Pairs (UNION)
Symmetric Pairs - Medium
https://www.hackerrank.com/challenges/symmetric-pairs/problem
SELECT X, YG
FROM Functions
WHERE X=Y
GROUP BY X,Y
HAVING COUNT(*)>=2
UNION
SELECT s1.X, s1.Y
FROM functions AS s1
INNER JOIN functions AS s2 ON s1.X = s2.Y AND s1.Y = s2.X
WHERE s1.X < s1.Y
ORDER BY X
'기존학습자료 > leetcode, hackerrank' 카테고리의 다른 글
Leetcode 181 - Consecutive Numbers (0) | 2023.06.25 |
---|---|
해커랭크 - Type of Triangle (CASE) (0) | 2023.06.25 |
해커랭크 - INNER JOIN, LEFT JOIN (0) | 2023.06.25 |
해커랭크 - 올림/내림/반올림, 절대값/제곱/제곱근 (0) | 2023.06.25 |
해커랭크 - 집계함수 (0) | 2023.06.25 |
해커랭크 - INNER JOIN, LEFT JOIN
African Cities
https://www.hackerrank.com/challenges/african-cities/problem
SELECT city.name FROM city
INNER JOIN COUNTRY ON CITY.CountryCode = COUNTRY.CODE
WHERE continent = 'Africa'
Population Census
https://www.hackerrank.com/challenges/asian-population/problem
SELECT SUM(city.population) FROM city
INNER JOIN country ON city.CountryCode = Country.Code
WHERE CONTINENT = 'Asia'
New Companies - Medium
https://www.hackerrank.com/challenges/the-company/problem
SELECT C.company_code
,C.founder
,COUNT(DISTINCT LM.lead_Manager_code)
,COUNT(DISTINCT SM.senior_Manager_code)
,COUNT(DISTINCT M.manager_code)
,COUNT(DISTINCT E.employee_code)
FROM Company C
LEFT JOIN Lead_Manager LM ON C.company_code = LM.company_code
LEFT JOIN Senior_Manager SM ON LM.lead_manager_code = SM.lead_manager_code
LEFT JOIN Manager M ON SM.senior_manager_code = M.senior_manager_code
LEFT JOIN Employee E ON M.manager_code = E.manager_code
GROUP BY C.company_code, C.founder
ORDER BY C.Company_code
Top Competitors - Medium
https://www.hackerrank.com/challenges/full-score/problem
SELECT H.hacker_id
,H.name
FROM Submissions S
INNER JOIN Challenges C ON C.Challenge_id = S.Challenge_id
INNER JOIN Difficulty D ON C.Difficulty_level = D.Difficulty_level
INNER JOIN Hackers H ON S.hacker_id = H.hacker_id
WHERE S.score = D.score
GROUP BY H.hacker_id, H.name
HAVING COUNT(DISTINCT S.submission_id)>1
ORDER BY COUNT(DISTINCT S.submission_id) DESC, H.hacker_id
Placements - Medium
https://www.hackerrank.com/challenges/placements/problem
SELECT NAME
FROM Friends F
INNER JOIN Students S ON S.ID=F.ID
INNER JOIN Packages P1 ON F.ID = P1.ID
INNER JOIN Packages P2 ON F.Friend_ID = P2.ID
WHERE P2.salary > P1.salary
ORDER BY P2.salary
'기존학습자료 > leetcode, hackerrank' 카테고리의 다른 글
해커랭크 - Type of Triangle (CASE) (0) | 2023.06.25 |
---|---|
해커랭크 - Symmetric Pairs (UNION) (0) | 2023.06.25 |
해커랭크 - 올림/내림/반올림, 절대값/제곱/제곱근 (0) | 2023.06.25 |
해커랭크 - 집계함수 (0) | 2023.06.25 |
해커랭크 - The Report (SELECT + CASE) (0) | 2023.06.25 |
해커랭크 - 올림/내림/반올림, 절대값/제곱/제곱근
* CEIL - 소수점 첫째 자리에서 올림
* FLOOR - 소수점 첫째 자리에서 내림
* ROUND - 숫자를 각 자리에서 반올림
* TRUNCATE(숫자, 버릴 자릿수) - 숫자를 버릴 자릿수 아래로 버림
* ABS - 절대값
* POWER - 제곱
* SQRT - 양수 x 에 대한 제곱근을 반환
Average Population
https://www.hackerrank.com/challenges/average-population/problem
SELECT Floor(AVG(population))
FROM CITY
Weather Observation Station 2
https://www.hackerrank.com/challenges/weather-observation-station-2/submissions/database/293205884
SELECT ROUND(SUM(LAT_N),2) AS lat
,ROUND(SUM(LONG_W),2) AS lon
FROM STATION
Weather Observation Station 18 - Medium
https://www.hackerrank.com/challenges/weather-observation-station-18/problem
SELECT ROUND(ABS(MIN(LAT_N)-MAX(LAT_N)) + ABS(MIN(LONG_W)-MAX(LONG_W)),4)
FROM STATION
Weather Observation Station 19 - Medium
https://www.hackerrank.com/challenges/weather-observation-station-19/problem
SELECT TRUNCATE(SQRT( POWER(MAX(LAT_N)-MIN(LAT_N),2) + POWER(MAX(LONG_W)-MIN(LONG_W),2) ),4)
FROM STATION
Average Population of Each Continent
https://www.hackerrank.com/challenges/average-population-of-each-continent/problem
SELECT COUNTRY.CONTINENT, FLOOR(AVG(city.population)) FROM CITY
INNER JOIN COUNTRY ON COUNTRY.Code = CITY.CountryCode
GROUP BY COUNTRY.CONTINENT
'기존학습자료 > leetcode, hackerrank' 카테고리의 다른 글
해커랭크 - Symmetric Pairs (UNION) (0) | 2023.06.25 |
---|---|
해커랭크 - INNER JOIN, LEFT JOIN (0) | 2023.06.25 |
해커랭크 - 집계함수 (0) | 2023.06.25 |
해커랭크 - The Report (SELECT + CASE) (0) | 2023.06.25 |
해커랭크 - Challenges (0) | 2023.06.25 |
해커랭크 - 집계함수
Revising Aggregations - Averages
https://www.hackerrank.com/challenges/revising-aggregations-the-average-function/problem
SELECT AVG(population)
FROM CITY
WHERE District = "California"
Revising Aggregations - The Sum Function
https://www.hackerrank.com/challenges/revising-aggregations-sum/problem
SELECT SUM(population)
FROM CITY
WHERE District = "California"
Revising Aggregations - The Count Function
https://www.hackerrank.com/challenges/revising-aggregations-the-count-function/problem
SELECT COUNT(COUNTRYCODE)
FROM CITY
WHERE POPULATION > 100000
Weather Observation Station 4
https://www.hackerrank.com/challenges/weather-observation-station-4/problem
SELECT COUNT(CITY) - COUNT(DISTINCT CITY)
FROM STATION
Top Earners
https://www.hackerrank.com/challenges/earnings-of-employees/problem
SELECT salary * months AS earnings , COUNT(*)
FROM Employee
GROUP BY earnings
ORDER BY earnings DESC
LIMIT 1
Japan Population
https://www.hackerrank.com/challenges/japan-population/problem
SELECT SUM(POPULATION)
FROM CITY
WHERE COUNTRYCODE='JPN'
Weather Observation Station 13
https://www.hackerrank.com/challenges/weather-observation-station-13/problem
SELECT TRUNCATE(SUM(LAT_N),4)
FROM STATION
WHERE LAT_N>=38.7880 AND LAT_N<=137.2345
Weather Observation Station 3
https://www.hackerrank.com/challenges/weather-observation-station-3/problem
SELECT CITY
FROM STATION
WHERE ID%2=0
GROUP BY CITY
'기존학습자료 > leetcode, hackerrank' 카테고리의 다른 글
해커랭크 - INNER JOIN, LEFT JOIN (0) | 2023.06.25 |
---|---|
해커랭크 - 올림/내림/반올림, 절대값/제곱/제곱근 (0) | 2023.06.25 |
해커랭크 - The Report (SELECT + CASE) (0) | 2023.06.25 |
해커랭크 - Challenges (0) | 2023.06.25 |
해커랭크 - Top earners (0) | 2023.06.25 |
해커랭크 - The Report (SELECT + CASE)
https://www.hackerrank.com/challenges/the-report/problem?h_r=internal-search
- SELECT 구문에서 CASE 활용해서 구분점 만들기
- 정렬기준 여러개
- INNER 조인 조건에 BETWEEN 사용할 수 있음.hacker_id
SELECT CASE WHEN g.grade <8 THEN NULL ELSE s.name END AS name
, g.grade
, s.marks
FROM students AS s
INNER JOIN grades AS g ON s.marks BETWEEN g.min_mark AND g.max_mark
ORDER BY g.grade DESC, name ASC, s.marks
'기존학습자료 > leetcode, hackerrank' 카테고리의 다른 글
해커랭크 - 올림/내림/반올림, 절대값/제곱/제곱근 (0) | 2023.06.25 |
---|---|
해커랭크 - 집계함수 (0) | 2023.06.25 |
해커랭크 - Challenges (0) | 2023.06.25 |
해커랭크 - Top earners (0) | 2023.06.25 |
서브쿼리 기초 (0) | 2023.06.24 |
해커랭크 - Challenges
https://www.hackerrank.com/challenges/challenges/submissions/database/331359810
SELECT h.hacker_id
, h.name
, count(*) Challenges_created
FROM Challenges c
INNER JOIN Hackers h ON h.hacker_id = c.hacker_id
GROUP BY h.hacker_id, h.name
HAVING Challenges_created = (SELECT MAX(Challenges_created) --Challeges_created MAX 값이 50인 것
FROM(
SELECT hacker_id
, count(*) Challenges_created
FROM Challenges
GROUP BY hacker_id
) sub)
OR Challenges_created IN (SELECT Challenges_created --만들어진 챌린지수의 묶음이 각각 몇개인지 ex) 몇명의 사람들이 12개의 챌린지를 만들었는지?
FROM(
SELECT hacker_id
, COUNT(*) AS Challenges_created --해커 한명 당 몇개의 챌린지를 만들었는지?
FROM Challenges
GROUP BY hacker_id
)sub
GROUP BY Challenges_created
HAVING COUNT(*)=1 --12개를 만든 사람이 딱 한명일 때만 목록에 보존
)
ORDER BY challenges_created DESC, hacker_id
-----------------------------------------------------------------
-----------------------------------------------------------------
Challenges - WITH 문 활용 - Medium
https://www.hackerrank.com/challenges/challenges/submissions/database/331359810
-----------------------------------------------------------------
WITH counter AS (
SELECT hackers.hacker_id
, hackers.name
, count(*) AS Challenges_created
FROM Challenges
INNER JOIN Hackers ON Challenges.hacker_id = Hackers.hacker_id
GROUP BY hackers.hacker_id, hackers.name
)
SELECT counter.hacker_id
, counter.name
, counter.Challenges_created
FROM counter
WHERE Challenges_created = (SELECT MAX(Challenges_created) FROM counter)
OR Challenges_created IN (SELECT Challenges_created -- if count(*) is in HAVING, then exclude "count(*)" in SELECT clause
FROM counter
GROUP BY Challenges_created
HAVING count(*)=1 )
ORDER BY counter.Challenges_created DESC, counter.hacker_id
'기존학습자료 > leetcode, hackerrank' 카테고리의 다른 글
해커랭크 - 집계함수 (0) | 2023.06.25 |
---|---|
해커랭크 - The Report (SELECT + CASE) (0) | 2023.06.25 |
해커랭크 - Top earners (0) | 2023.06.25 |
서브쿼리 기초 (0) | 2023.06.24 |
Leetcode 180 - Consecutive Numbers (0) | 2023.06.24 |
해커랭크 - Top earners
Top earners - 서브쿼리
https://www.hackerrank.com/challenges/earnings-of-employees/problem
SELECT months*salary as earnings
, count(*)
FROM employee
WHERE months*salary = (SELECT MAX(months*salary) FROM employee)
GROUP BY earnings
-- Having >>> GROUP BY 결과물을 다시 한 번 필터링 해줄 때
SELECT months*salary AS earnings
, count(*)
FROM employee
GROUP BY earnings
HAVING earnings = (SELECT MAX(months*salary) FROM employee) -- 전체 임직원 중에서 최대 값을 가진 사람만
-- FROM >>> FROM 절을 테이블로 활용
SELECT *
FROM (
SELECT months*salary AS earnings
, count(*)
FROM employee
GROUP BY earnings
) sub
ORDER BY earnings DESC
limit 1;
'기존학습자료 > leetcode, hackerrank' 카테고리의 다른 글
해커랭크 - The Report (SELECT + CASE) (0) | 2023.06.25 |
---|---|
해커랭크 - Challenges (0) | 2023.06.25 |
서브쿼리 기초 (0) | 2023.06.24 |
Leetcode 180 - Consecutive Numbers (0) | 2023.06.24 |
Leetcode 1179 - Reformat Department Table (0) | 2023.06.24 |
서브쿼리 기초

'기존학습자료 > leetcode, hackerrank' 카테고리의 다른 글
해커랭크 - Challenges (0) | 2023.06.25 |
---|---|
해커랭크 - Top earners (0) | 2023.06.25 |
Leetcode 180 - Consecutive Numbers (0) | 2023.06.24 |
Leetcode 1179 - Reformat Department Table (0) | 2023.06.24 |
Leetcode 183 - Customers Who Never Order (0) | 2023.06.24 |
Leetcode 184 - Department Highest Salary
*** 다시 풀어볼 것
184. Department Highest Salary
https://leetcode.com/problems/Department-Highest-Salary/
# 각각의 부서에서 누가 가장 고소득자인지
# sel 부서, 직원, 급여
# 순서 상관 x
SELECT
d.name AS Department
, e.name AS Employee
, e.salary AS Salary
FROM employee as e
INNER JOIN (
SELECT departmentID, MAX(salary) AS max_salary
FROM Employee
GROUP BY departmentID
) AS dh ON e.departmentID = dh.departmentID
AND e.salary = dh.max_salary
INNER JOIN department AS d ON d.id = e.departmentId
'기존학습자료 > 다시풀기' 카테고리의 다른 글
Leetcode 196 - Delete Duplicate Emails (2) (0) | 2023.06.24 |
---|
Leetcode 180 - Consecutive Numbers
Consecutive Numbers
https://leetcode.com/problems/consecutive-numbers/
# 최소 3번이상 연속적으로 나타나는 숫자 찾기
# 순서는 상관없음
SELECT DISTINCT l.num AS ConsecutiveNums -- 중복제거
FROM logs AS l
INNER JOIN logs AS l_next ON l.id + 1 = l_next.id
INNER JOIN logs AS l_next2 ON l.id + 2 = l_next2.id
# three times consecutively
WHERE l.num = l_next.num AND l_next.num = l_next2.num
'기존학습자료 > leetcode, hackerrank' 카테고리의 다른 글
해커랭크 - Top earners (0) | 2023.06.25 |
---|---|
서브쿼리 기초 (0) | 2023.06.24 |
Leetcode 1179 - Reformat Department Table (0) | 2023.06.24 |
Leetcode 183 - Customers Who Never Order (0) | 2023.06.24 |
Leetcode 181 - Employees Earning More Than Their Managers (0) | 2023.06.24 |
Leetcode 1179 - Reformat Department Table
Reformat Department Table
https://leetcode.com/problems/reformat-department-table/
SELECT id,
SUM(CASE WHEN month='Jan' THEN revenue ELSE NULL END) AS JAN_Revenue,
SUM(CASE WHEN month='Feb' THEN revenue ELSE NULL END) AS Feb_Revenue,
SUM(CASE WHEN month='Mar' THEN revenue ELSE NULL END) AS Mar_Revenue,
SUM(CASE WHEN month='Apr' THEN revenue ELSE NULL END) AS Apr_Revenue,
SUM(CASE WHEN month='May' THEN revenue ELSE NULL END) AS May_Revenue,
SUM(CASE WHEN month='Jun' THEN revenue ELSE NULL END) AS Jun_Revenue,
SUM(CASE WHEN month='Jul' THEN revenue ELSE NULL END) AS Jul_Revenue,
SUM(CASE WHEN month='Aug' THEN revenue ELSE NULL END) AS Aug_Revenue,
SUM(CASE WHEN month='Sep' THEN revenue ELSE NULL END) AS Sep_Revenue,
SUM(CASE WHEN month='Oct' THEN revenue ELSE NULL END) AS Oct_Revenue,
SUM(CASE WHEN month='Nov' THEN revenue ELSE NULL END) AS Nov_Revenue,
SUM(CASE WHEN month='Dec' THEN revenue ELSE NULL END) AS Dec_Revenue
FROM Department
GROUP BY id
'기존학습자료 > leetcode, hackerrank' 카테고리의 다른 글
서브쿼리 기초 (0) | 2023.06.24 |
---|---|
Leetcode 180 - Consecutive Numbers (0) | 2023.06.24 |
Leetcode 183 - Customers Who Never Order (0) | 2023.06.24 |
Leetcode 181 - Employees Earning More Than Their Managers (0) | 2023.06.24 |
Leetcode 197 - Rising Temperature (0) | 2023.06.24 |
Leetcode 183 - Customers Who Never Order
Customers Who Never Order
https://leetcode.com/problems/Customers-Who-Never-Order/
SELECT name AS Customers FROM Customers AS c
LEFT JOIN Orders AS o ON o.customerId = c.id
WHERE o.id is null
'기존학습자료 > leetcode, hackerrank' 카테고리의 다른 글
Leetcode 180 - Consecutive Numbers (0) | 2023.06.24 |
---|---|
Leetcode 1179 - Reformat Department Table (0) | 2023.06.24 |
Leetcode 181 - Employees Earning More Than Their Managers (0) | 2023.06.24 |
Leetcode 197 - Rising Temperature (0) | 2023.06.24 |
Leetcode 595 - Big Countries (0) | 2023.06.24 |
Leetcode 181 - Employees Earning More Than Their Managers
Employees Earning More Than Their Managers
https://leetcode.com/problems/Employees-Earning-More-Than-Their-Managers/
SELECT employee.name AS Employee
FROM employee
INNER JOIN employee as Mannager ON employee.managerID = Mannager.id
WHERE employee.salary > Mannager.salary
'기존학습자료 > leetcode, hackerrank' 카테고리의 다른 글
Leetcode 1179 - Reformat Department Table (0) | 2023.06.24 |
---|---|
Leetcode 183 - Customers Who Never Order (0) | 2023.06.24 |
Leetcode 197 - Rising Temperature (0) | 2023.06.24 |
Leetcode 595 - Big Countries (0) | 2023.06.24 |
Leetcode 620 - Not Boring Movies (0) | 2023.06.24 |
Leetcode 197 - Rising Temperature
Rising Temperature
https://leetcode.com/problems/Rising-Temperature/
SELECT today.id
FROM weather AS today
INNER JOIN weather AS yesterday ON DATE_ADD(yesterday.recordDate, INTERVAL 1 DAY) = today.recordDate
WHERE today.temperature > yesterday.temperature
# # {"headers": ["id", "recordDate", "temperature", "id", "recordDate", "temperature"],
# # "values":
# # [[2, "2015-01-02", 25, 1, "2015-01-01", 10],
# # [4, "2015-01-04", 30, 3, "2015-01-03", 20]]}
# {"headers": ["id", "recordDate", "temperature", "id", "recordDate", "temperature"], "values":
# [[2, "2015-01-02", 25, 1, "2015-01-01", 10],
# [3, "2015-01-03", 20, 2, "2015-01-02", 25],
# [4, "2015-01-04", 30, 3, "2015-01-03", 20]]}
# # SELECT today.id AS today_id
# # ,today.recordDate AS today_RecordDate
# # ,today.Temperature AS today_Temperature
# # ,yesterday.id AS yesterday_id
# # ,yesterday.recordDate AS yesterday_RecordDate
# # ,yesterday.Temperature AS yesterdayy_Temperature
# yesterday에 1을 더했을때 매칭되는 today 값
'기존학습자료 > leetcode, hackerrank' 카테고리의 다른 글
Leetcode 183 - Customers Who Never Order (0) | 2023.06.24 |
---|---|
Leetcode 181 - Employees Earning More Than Their Managers (0) | 2023.06.24 |
Leetcode 595 - Big Countries (0) | 2023.06.24 |
Leetcode 620 - Not Boring Movies (0) | 2023.06.24 |
Leetcode 182 - Duplicate Emails (0) | 2023.06.24 |
Leetcode 595 - Big Countries
Big Countries
https://leetcode.com/problems/Big-Countries/
SELECT name, population, area
FROM WORLD
WHERE area >=3000000 OR population >=25000000
'기존학습자료 > leetcode, hackerrank' 카테고리의 다른 글
Leetcode 181 - Employees Earning More Than Their Managers (0) | 2023.06.24 |
---|---|
Leetcode 197 - Rising Temperature (0) | 2023.06.24 |
Leetcode 620 - Not Boring Movies (0) | 2023.06.24 |
Leetcode 182 - Duplicate Emails (0) | 2023.06.24 |
Leetcode 175 - Combine Two Tables (0) | 2023.06.24 |
Leetcode 620 - Not Boring Movies
Not Boring Movies
https://leetcode.com/problems/Not-Boring-Movies/
SELECT id, movie, description, rating
FROM Cinema
WHERE MOD(id,2)= 1 AND description != 'boring'
ORDER BY rating DESC
'기존학습자료 > leetcode, hackerrank' 카테고리의 다른 글
Leetcode 197 - Rising Temperature (0) | 2023.06.24 |
---|---|
Leetcode 595 - Big Countries (0) | 2023.06.24 |
Leetcode 182 - Duplicate Emails (0) | 2023.06.24 |
Leetcode 175 - Combine Two Tables (0) | 2023.06.24 |
Leetcode 196 - Delete Duplicate Emails (1) (0) | 2023.06.24 |
Leetcode 182 - Duplicate Emails
Duplicate Emails
https://leetcode.com/problems/Duplicate-Emails/
SELECT email
FROM Person
GROUP BY Person.email
HAVING COUNT(email) > 1
'기존학습자료 > leetcode, hackerrank' 카테고리의 다른 글
Leetcode 197 - Rising Temperature (0) | 2023.06.24 |
---|---|
Leetcode 595 - Big Countries (0) | 2023.06.24 |
Leetcode 620 - Not Boring Movies (0) | 2023.06.24 |
Leetcode 175 - Combine Two Tables (0) | 2023.06.24 |
Leetcode 196 - Delete Duplicate Emails (1) (0) | 2023.06.24 |