데이터 분석 28

[프로그래머스] SQL 반복문, WITH RECURSIVE

GROUP BY > 입양시각 구하기(2)  ANIMAL_OUTS : 동물 보호소에서 입양 보낸 동물의 정보를 담은 테이블SEX_UPON_OUTCOME : 동물의 아이디, 생물 종, 입양일, 이름, 성별 및 중성화 여부 정보 테이블  0시부터 23시까지, 각 시간대별로 입양이 몇 건이나 발생했는지 조회하는 SQL문을 작성하는 문제였다.그런데 그냥 group by를 해서 결과를 조회하면 0시부터 23시까지 나오지 않고, 입양이 발생한 시간만 조회되는 문제가 있어 0시부터 23시까지의 시간 테이블을 생성해야 하는 것이 관건이었다. 이 때 사용되는 것이 SQL에서 반복문처럼 사용할 수 있는 WITH RECURSIVE 함수/** [Example] 0시부터 24시까지 시간 컬럼 만들기 **/WITH recursiv..

SQL 2024.05.21

[중급 쿼리] INDEX, VIEW, WITH, 함수 생성

INDEX인덱스를 설정하면 쿼리 실행 속도가 빨라진다. > 생산성 향상 클러스터형 인덱스영어 사전과 같은 형태로 데이터를 실제로 재정렬하여 저장PRIMARY KEY 컬럼이 있을 경우, 자동 생성 보조 인덱스데이터를 디스크에 재정렬하지 않고, 보조 인덱스를 설정하여 각 데이터의 위치만 빠르게 조회 인덱스는 키-필드만 갖고 있고, 나머지 세부 테이블 컬럼 정보는 가지고 있지 않음 INDEX 확인방법SHOW INDEX FROM 테이블명; 을 실행했을 때 key_name = PRIMARY KEY라면 클러스터형 인덱스 테이블 변경FOREIGN KEY도 INDEX가 생긴다! (보조 인덱스)테이블에 특정 컬럼에 duplicate 값이 나오지 않도록 제약조건을 추가하기-- ALTER TABLE 테이블이름 ADD [CO..

SQL 2024.05.20

[중급 쿼리] JOIN, Subquery, UNION, INTERSECT, EXCEPT

서브쿼리MySQL에서는 ‘FROM 테이블명’에 서브쿼리를 입력하게 되면 반드시 alias(이름)을 지정해주어야 한다./* rental 테이블에서 고객별 평균 대여 횟수보다 많은 대여를 한고객들의 이름( first_name , last_name )을 찾아주세요. */SELECT first_name, last_nameFROM customerWHERE customer_id IN ( -- JOIN쿼리 SELECT customer_id FROM rental GROUP BY customer_id HAVING COUNT(*) > ( SELECT AVG(rental_count) -- 전체 평균값(각 customer_id별 rental 횟수/customer_id 수) FROM (SELECT..

SQL 2024.05.20

[기본 쿼리] 문자열, 날짜/시간, 숫자 함수

문자열 함수LENGTH(string) : 컬럼 값의 문자열 길이 반환UPPER(string): 컬럼 값을 대문자로 변환CONCAT(string1, string2, …): 두개 이상의 컬럼 값을 하나로 합침SUBSTRING(string, start, length): 컬럼 값에서 부분 문자열 추출 *length가 string 길이보다 길면 아무것도 반환하지 않음LOCATE(찾는 값, string): 찾는 값이 string에 몇번째에 위치해 있는지 확인 *찾는 문자가 없다면 0을 반환RIGHT(string, 숫자), LEFT(string, 숫자): 엑셀의 right, left와 동일한 기능REPLACE(string, 기존 값, 변경할 값) : string 내의 기존 값을 변경할 값으로 변경 날짜/시간 함수NO..

SQL 2024.05.20

[기본 쿼리] 집계함수, Group by/Having, Order by, Like, IsNull, Rank 등

SUM, AVG, MAX, MINSUM(): 컬럼값의 합계AVG(): 컬럼값의 평균MAX(): 컬럼값의 최대값MIN(): 컬럼값의 최소값as(alias) 활용하기 : 위 4가지 함수를 적용한 column명을 다르게 정의하고 싶을 때 사용→ SELECT 함수(컬럼명) FROM 테이블명;SELECT SUM(Population) FROM city; SELECT MAX(Population) FROM city; SELECT MIN(Population) FROM city; SELECT AVG(Population) FROM city; -- as로 컬럼명 새로 지정하기 / as를 생략하고 바로 새로운 컬럼명만 써도 돌아간다. SELECT SUM(Population) as 합계, MAX(Population) as 최대,..

SQL 2024.05.20

[기본 쿼리] 데이터베이스/테이블 CRUD(Create, Read, Update, Delete)

SQL DML(Data Manipulation Language, focusing on CRUD)IT-Data handling functionsCRUD = Create(삽입), Read(읽기), Update(수정), Delete(삭제) Database 안에 Table이 존재Database = Schema 테이블/데이터베이스 생성, 변경, 추가, 삭제테이블 만들기: CREATE TABLE 테이블명(컬럼1 타입1, 컬럼2 타입2, …);테이블 변경하기: ALTER TABLE costomor RENAME customers;컬럼 추가하기: ALTER TABLE customers ADD COLUMN age INT;테이블 컬럼타입’만’ 변경하기: ALTER TABLE 테이블명 MODIFY COLUMN 컬럼 변경하려는..

SQL 2024.05.20

[Leetcode] SELF JOIN 다중조건

1661. Average Time of Process per Machine activity_type: start, endmachine_id별 start~end 소요시간 차의 평균을 구하는 문제였다.그런데 machine_id별로 process가 여러개라서 그냥 machine_id로 groupby를 한 뒤, 차이를 구하기가 쉽지 않았다. [해결 방법1]SELECT a1.machine_id, ROUND(AVG(a2.timestamp - a1.timestamp),3) AS processing_timeFROM activity a1JOIN activity a2 -- SELF JOIN ON a1.machine_id = a2.machine_id AND a1.process_id = a2.process..

SQL 2024.05.19