SQL 데이터베이스에서 필요한 형태의 데이터를 추출 또는 가공하기 위해 사용하는 언어
- SELECT : 칼럼, 계산 값
- FROM : 테이블 명
- WHERE : 조건
- GROUP
- BY : 그룹화
- HAVING : 그룹화에 사용되는 조건
데이터베이스 상자에서 필요한 정보를 꺼내오는 명령어
SELECT `호출하려는 칼럼`
FROM DB명.테이블 명;
+ 집계함수 ( count, sum, avg,,, )을 같이 사용 한다.
SELECT count, sum, avg,,, (`호출하려는 칼럼`)
FROM DB명.테이블 명;
-- EX
SELECT
SUM (AMOUNT),
COUNT (CHECKNUMBER)
FROM CLASSICMODELS.PAYMENTS;
+ 모든 결과 조회 ( * )
SELECT *
FROM DB명.테이블 명;
+ 칼럼 명 변경 ( AS )
SELECT 칼럼 명 AS 변경 칼럼 명
FROM DB명.테이블 명;
+중복 제거 ( DISTINCT )
SELECT DISTINCT 칼럼 명
FROM DB명.테이블 명;
특정 테이블에 있는 정보를 호출하려면 쿼리에 테이블 명을 지정해야 하는데, 테이블 명은 FROM 절 뒤에 기재해 준다.
SELECT 계산식 또는 칼럼 명
FROM DB명.테이블명;
테이블에서 특정 조건을 만족하는 행(row)들만 선택할 수 있다.
SELECT `호출하려는 칼럼`
FROM 테이블명
WHERE 조건;
+ 특정 칼럼의 값이 시작점 ~ 끝점인 데이터 출력 ( BETWEEN )
SELECT *
FROM DB명.테이블명
WHERE 칼럼 BETWEEN 시작점 AND 끝점;
+ 대소 관계 표현 ( =, >, >=, <, <=, <> )
= 동일하다
> 초과
>= 이상
< 미만
<= 이하
<> 같지 않다
+ 특정 컬럼의 값이 지정된 여러 값 중 하나와 일치하는지를 확인할 때 사용, WHERE절에서 자주 사용한다. (IN)
SELECT 칼럼명
FROM 테이블명
WHERE 칼럼명 IN ( 값1, 값2 );
+ 특정 컬럼의 값이 지정된 여러 값 중 하나와 일치하는지를 확인할 때 사용, WHERE절에서 자주 사용한다. (NOT IN)
SELECT 칼럼명
FROM 테이블명
WHERE 칼럼명 NOT IN ( 값1, 값2 );
+ 비어 있는 값 (NULL)
SELECT 칼럼명
FROM 테이블명
WHERE 칼럼명 IS NULL;
+ 특정 텍스트 추출 ( LIKE '%ST%' )
SELECT 칼럼명
FROM 테이블명
WHERE 칼럼명 LIKE '%ST%';
데이터를 그룹별로 묶어 집계할 때 사용하는 기능이다. 주로 집계 함수(Aggregate Functions)와 함께 사용된다 .
SELECT 칼러명
FROM 테이블명
GROUP BY 칼럼명;
SELECT 칼럼명, 집계함수(score) AS 변경칼럼명
FROM 테이블명
GROUP BY 칼럼명
HAVING 집계함수(score) >= 80;
SELECT department, name, COUNT(*)
FROM employees
GROUP BY 1(department라는 뜻), 2(name라는 뜻);
+ 집계함수 ( AVG(평균), COUNT(개수 구하기), SUM(합계) )
여러 가지 테이블로 나뉜 정보를 조합하기 위해 사용하는 결합 함수
+ LEFT JOIN (LEFT OUTER JOIN)
"왼쪽 테이블"의 모든 행을 포함하며, "오른쪽 테이블"과 일치하는 행이 없는 경우에도 왼쪽 테이블의 모든 행을 반환한다. 일치하지 않는 오른쪽 테이블의 열은 NULL 값이 채워져 반환된다.
SELECT 테이블1의 칼럼1, 테이블1의 칼럼2, ...
FROM 테이블1
LEFT JOIN 테이블2 ON 테이블1.칼럼A = 테이블2.칼럼B;
+ INNER JOIN
두 테이블 간의 공통된 행만 반환한다. 일치하는 데이터만 결과로 반환되기 때문에, 두 테이블 모두에서 해당 조건에 맞는 데이터가 존재해야 한다. 테이블에서 공통된 데이터를 찾고자 할 때 사용한다.
SELECT 칼럼1, 칼럼2, ...
FROM 테이블1
INNER JOIN 테이블2 ON 테이블1.열A = 테이블2.열B;
SELECT 테이블1.테이블1의 칼럼1, 테이블1의 칼럼2, 테이블2의 칼럼1
FROM 테이블1
INNER JOIN 테이블2 ON 테이블1.테이블1의 칼럼1 = 테이블2의 칼럼1;
+ FULL JOIN
쪽 테이블과 오른쪽 테이블 모두에서 일치하는 행뿐만 아니라, 일치하지 않는 행도 모두 포함하여 반환 한다.
하나에만 존재하는 행은 NULL 값으로 채워져 반환된다.
SELECT 테이블1칼럼1, 테이블1칼럼2, ...
FROM 테이블1
FULL OUTER JOIN 테이블2 ON 테이블1.열A = 테이블2.열B;
조건에 따른 값을 다르게 출력하고 싶은 경우 사용된다.
SELECT 칼럼1,
CASE
WHEN 조건1 THEN 값1
WHEN 조건2 THEN 값2
...
ELSE 값N -- (조건이 모두 아닐때 나올 값)
END AS 새로운_칼럼
FROM 테이블명;
SELECT student_id, name, score, age,
CASE
WHEN score >= 90 AND age >= 18 THEN 'Excellent and Adult'
WHEN score >= 90 AND age < 18 THEN 'Excellent and Minor'
WHEN score < 90 AND score >= 80 THEN 'Good'
ELSE 'Needs Improvement'
END AS remarks
FROM students;
+ RANK
특정 기준에 따라 행의 순위를 매기지만, 동일한 순위가 여러 개 존재할 경우 다음 순위를 건너뛴다. 예를 들어, 두 행이 동일한 순위 1을 차지하면 다음 순위는 2가 아니라 3이 된다.
SELECT student_id, name, score,
RANK() OVER (ORDER BY score DESC) AS rank
FROM scores;
student_id name score rank
1 철수 90 1
3 민수 90 1
2 영희 85 3
4 지혜 80 4
+ DENSE_RANK
동일한 순위가 여러 개 존재해도 다음 순위를 건너뛰지 않는다. 즉, 동일한 순위를 가진 행이 있더라도 다음 순위는 연속적으로 부여된다.
SELECT student_id, name, score,
DENSE_RANK() OVER (ORDER BY score DESC) AS dense_rank
FROM scores;
student_id name score dense_rank
1 철수 90 1
3 민수 90 1
2 영희 85 2
4 지혜 80 3
+ ROW_NUMBER
동일한 값이 있어도 고유한 순번이 매겨진다. 순위나 밀집된 순위와 달리, 각 행에 고유한 번호가 부여된다.
SELECT student_id, name, score,
ROW_NUMBER() OVER (ORDER BY score DESC) AS row_number
FROM scores;
student_id name score row_number
1 철수 90 1
3 민수 90 2
2 영희 85 3
4 지혜 80 4
다른 쿼리의 내부에 포함된 쿼리를 말한다. 서브쿼리는 메인 쿼리(main query)의 일부로 사용되어 복잡한 쿼리를 더 간결하고 논리적으로 작성할 수 있게 해준다. 서브쿼리는 보통 소괄호 ()로 감싸여 사용되며, SELECT, INSERT, UPDATE, DELETE 문 등 다양한 SQL 문장에서 사용될 수 있다.
+ 스칼라 서브쿼리(Scalar Subquery): 단일 값을 반환하는 서브쿼리
SELECT name, salary
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees WHERE department_id = 10);
이 쿼리의 서브쿼리는 employees 테이블에서 department_id가 10인 부서의 평균 급여를 계산한다.
메인 쿼리는 그 평균 급여보다 높은 급여를 받는 직원을 찾게 된다.
+ 다중 행 서브쿼리(Multi-row Subquery): 여러 행을 반환하는 서브쿼리
+ 다중 열 서브쿼리(Multi-column Subquery): 여러 열을 반환하는 서브쿼리
SELECT name
FROM employees
WHERE department_id IN (SELECT department_id FROM departments WHERE department_name = 'IT');
이 쿼리의 서브쿼리는 departments 테이블에서 department_name이 'IT'인 부서의 department_id를 찾게 된다.
메인 쿼리는 그 부서에 속한 직원들의 이름을 반환한다.
+ 상관 서브쿼리(Correlated Subquery): 메인 쿼리의 각 행에 대해 서브쿼리가 한 번씩 실행되는 서브쿼리
SELECT name, salary
FROM employees e1
WHERE salary = (SELECT MAX(salary) FROM employees e2 WHERE e1.department_id = e2.department_id);
이 쿼리의 서브쿼리는 메인 쿼리의 각 행에 대해 한 번씩 실행되며, 같은 부서에서 가장 높은 급여를 찾게 돤다.
메인 쿼리는 그 급여를 받는 직원들의 이름과 급여를 반환한다.
프로그래밍이 아직 익숙하지 않지만 익숟해지는 그날까지 화이팅!
Python 으로 통계 학습하기 - 데이터 작업 (0) | 2024.07.13 |
---|---|
MY SQL - SQL 실전 문제 ( 1 ) (0) | 2024.07.12 |
MY SQL - 데이터베이스와 SQL ( 1 ) (1) | 2024.07.11 |
2024.07.09 / SQL, Pandas - 기초 문법 비교 / (1) (0) | 2024.07.09 |
2024.07.08 / Pandas - 기본 문법, 시각화 / 문제 분석 (6) (1) | 2024.07.08 |