Data scientist/SQL

SQL_함수

맨사설 2021. 8. 6. 20:51
728x90

 

 SQL_특징

 

  • #을 통해 주석 처리한 Python과 달리 SQL에서는 --를 통해 주석처리를 한다.
  • 여러 줄로 긴 주석은 /*로 시작해서 끝날 때 *과 /를 (붙여서 써) 주면 됩니다. (Python과 동일)
  • SQL 구문은 대소문자 구분이 없음
  • 단순 계산을 위한 의미 없는 dummy 테이블을 생산할 때 dual 사용

 

 

SQL_다양한 연산자

 

-- 산술 연산자
SELECT  10, 10+3, 10-3, -10, 10*3, 10/3
FROM dual;

SELECT 10*10-10; # FROM daul; 문 생략 가능

-- 문자 관련 함수
SELECT  	CONCAT('교보','생명'), 
		SUBSTR('데이터분석', 1, 3),
            	TRIM('   올여름의 할 일은 모르는 사람의 그늘을 읽는 일     ');

-- CONCAT( ) : 문자 접합
-- SUBSTR( ) : 부분 추출(~부터 ~개)    
-- TRIM( )   : 양쪽 공백 제거

-- 날짜 변환 함수
SELECT  '2018-11-01', 
		CAST('2018-11-01' AS DATE),
		STR_TO_DATE('2018-11-01', '%Y-%m-%d'),
        	STR_TO_DATE('11/01/2018', '%m/%d/%y');	

SELECT sysdate(); # 컴퓨터의 기준 날짜를 확인            

-- EXTRACT( ) : 특정한 날짜 요소를 추출, 비교적 복잡한 구성        
SELECT EXTRACT(YEAR FROM sysdate());
SELECT EXTRACT(MONTH FROM sysdate());
SELECT EXTRACT(DAY FROM sysdate());

 

CONCAT, SUBSTR, TRIM의 예
동일한 결과값을 나타낸다.

 

 

 SQL_Select

 

--키워드 SELECT와 FROM의 사용법

SELECT 	Name, Population --select 기본 문
	FROM 	world.city;
    
SELECT 	* -- "*"을 활용한 모든 변수 선택 
	FROM 	sakila.rental;
    
SELECT 	* -- Limit를 활용한 변수 갯수 선택
	FROM 	sakila.rental
    LIMIT 10;
    
-- 키워드, 식별자는 대소문자 구분이 없음
SELECT 	first_name, last_name 	FROM sakila.customer;
Select  FIRST_NAME, LAST_NAME 	From SAKILA.CUSTOMER;
select  First_NAME, LAST_name 	from SAKILA.customer;
-- 값은 대소문자 구분

-- AS를 활용한 변수이름 지정
SELECT  first_name AS name, 
	last_name Givenname
FROM  	sakila.customer;
-- DB변수이름 AS 새변수이름 : AS는 생략 가능

-- DISTINCT를 활용한 중복값 제거
SELECT 	DISTINCT Continent
FROM  	world.country;

SELECT 	DISTINCT Name, Continent
FROM  	world.country;
-- 변수 각각의 중복값 제거 목록이 아니라 변수 조합의 중복값 제거 목록 생성

SELECT COUNT(*), COUNT(1), COUNT(amount), COUNT(staff_id)
FROM sakila.payment;
-- COUNT( )안에는 뭘 집어 넣든 개수만 셈

 

변수 이름이 각각 바뀐 것을 확인할 수 있다.
동일한 값을 나타낸다.

 

 

 SQL_Where

 

-- 키워드 WHERE과 조건문의 활용
SELECT 	*
	FROM	world.city
	WHERE	Population >=9000000 LIMIT 5; -- limit를 두어 원하는 개수만큼 표시 가능

-- creditLimit이 50000 미만인 고객 목록 확인
SELECT *
 	FROM sales.customers
    	WHERE creditLimit < 50000;

-- 전체 회원 중 creditLimit이 50000 미만인 고객수의 비율 확인
SELECT sum(IF(creditLimit < 50000, 1, 0))/count(*)
    FROM sales.customers;
    
-- 키워드 LIKE의 활용
SELECT  *  
	FROM world.city
	WHERE Name LIKE '_eo%';

-- _ : 한 글자
-- % : 0~n 글자, "무언가 있을 수도 있고 없을 수도 있다"

-- IS NULL과 IS NOT NULL을 활용한 결측값 선택/제외
 SELECT	*
    FROM sakila.rental
    WHERE return_date IS NOT NULL; # 결측값 제외
    
-- IFNULL( )을 활용한 결측값 대체
SELECT	*, IFNULL(return_date, '9999-12-31 00:00:00')
	FROM sakila.rental
	WHERE return_date IS NULL;
    
-- tip. AND와 OR을 함께 쓰면 AND 먼저 실행

 

_eo로 시작하는 모든 단어 탐색 
null값인 return_data는 새로운 값으로 대체할 수 있다.

 

 

 SQL_Group by

 

-- 대륙별 각종 통계 내용을 나타내는 함수
SELECT	  Continent, 
      COUNT(Population) AS CNT_POP, 
      SUM(Population) SUM_POP, 
      AVG(Population) AVG_POP, 
      MAX(Population) MAX_POP, 
      MIN(Population) MIN_POP
      FROM	  world.country
      GROUP BY  Continent;
    
SELECT 	  
    CAST(rental_date AS DATE) date_ymd, staff_id, count(1)
    FROM  sakila.rental
    GROUP BY  CAST(rental_date AS DATE), staff_id;
-- 그룹변수를 2개 이상 지정 가능 : 그룹 변수의 조합에 대한 요약

-- 새로운 변수이름으로도 group by함수 실행 가능
SELECT 	  CAST(rental_date AS DATE) date_ymd, count(1)
    FROM	  sakila.rental
    GROUP BY  date_ymd;
-- SELECT 절에서만 새로운 변수이름 지정

-- WHERE와 GROUP BY를 활용한 그룹별 요약
--Q1. sales.employees 테이블에서 jobTitle이 'Sales'로 시작하는 관측치로 officeCode별 직원수 계산
select 
  officeCode, count(1)
  from sales.employees
  where jobTitle like 'Sales%'
  group by officeCode;
  
--Q2. sales.payments 테이블에서 2004년 1월 1일 이후 결제건으로 연도/월, customerNumber별 결제 건수 및 amount의 합계 계산
SELECT 
    date_format(paymentDate, '%Y%m') YM
    , customerNumber
    , count(1) CNT
    , SUM(AMOUNT) AMT
FROM sales.payments
WHERE paymentDate >= '2004-01-01'
GROUP BY date_format(paymentDate, '%Y%m'),customerNumber;

 

결과물 1
Q1. 결과물 

 

Q2. 결과물

728x90

'Data scientist > SQL' 카테고리의 다른 글

SQL_함수(2)  (0) 2021.08.09
SQL_Practice_기온 데이터 분석  (0) 2021.08.08
SQL_TABLE  (0) 2021.08.05
SQL_기본  (0) 2021.08.04
SQL_데이터베이스  (0) 2021.08.04