SQLBolt 참고
목차
1. SELECT/FROM
2. WHERE
3. DISTINCT
4. ORDER BY
5. LIMIT/OFFSET
6. JOIN (INNER, OUTER, SELF, CROSS, Nature)
7. WHERE IS NULL / IS NOT NULL
8. Queries with expressions (수식)
9. Queries with aggregates (COUNT, MIN, MAX, AVG, SUM)
10. Grouped aggregate functions (GROUP BY, HAVING)
1. SELECT/FROM
: select for specific columns of data from a table
SELECT 열이름1,열이름2 FROM 테이블이름;
ex) SELECT * FROM MOVIES (영화테이블에서 전체 열 선택)
2. WHERE
: To filter certain results from being returned, we need to use a WHERE clause in the query.
SELECT * FROM movies
WHERE 조건1 AND/OR 조건2;
ex) SELECT * FROM MOVIES 영화테이블 전체 열 선택
WHERE Year BETWEEN 2000 and 2010 AND Titles LIKE "%Toy%"
2000~2010년 개봉과 Toy 글자가 들어가는 영화(행) 선택
3. DISTINCT
선택한 열의 중복제거
SELECT DISTINCT 열1,열2 FROM 테이블이름
WHERE condition(s);
4. ORDER BY
정렬 (DESC: 내림차순)
SELECT 열1,열2 FROM mytable
WHERE condition(s)
ORDER BY column ASC(Defalt)/DESC;
5. LIMIT/OFFSET
제한된 행이있는 쿼리 선택
LIMIT:반환 할 행 수를 줄임
OFFSET(선택): 시작할 행 숫자 지정(입력한 숫자 다음 행부터 출력)
SELECT column, another_column, …
FROM mytableWHERE condition(s)
ORDER BY column ASC/DESCLIMIT num_limit
OFFSET num_offset;
ex)
SELECT Title FROM Movies
ORDER BY Title
LIMIT 5 OFFSET 5 영화제목 알파벳 순서 6번째부터 5개
6. JOIN
1) INNER JOIN
On 양쪽 테이블의 id가 일치하는 부분 Join
SELECT column, another_table_column, …
FROM mytable
INNER JOIN another_table
ON mytable.id = another_table.id
데이터를 얼마나 분석할 것인지에 따라 때론 Inner Join으로 충분하지 않을 수 있다. 결과 테이블에는 두 테이블 모두에 속하는 데이터만 포함되기 때문이다.
두 테이블에 비대칭 데이터(다른 값의 데이터)가 있을 경우 필요한 데이터가 결과에서 제외되지 않도록 left JOIN, Right JOIN 또는 FULL JOIN을 사용해야 한다.
2) OUTER JOIN(LEFT/RIGHT/FULL)
SELECT column, another_column, …
FROM mytable
INNER/LEFT/RIGHT/FULL JOIN another_table
ON mytable.id = another_table.matching_id
A와 B 데이터가 있을 경우 LEFT JOIN은 모든 A의 ROW를 포함하고, RIGHT JOIN은 모든 B의 ROW를 포함한다. FULL JOIN은 A와 B의 모든 열을 포함한다.
JOIN을 사용할 때 결과 및 제약 조건에서 NULL을 처리하는 추가 논리를 작성해야 할 수 있다.
3) CROSS JOIN
A 테이블의 첫 행이 B 테이블의 모든 행과 조인되고, 그 후 A테이블의 의 모든 행이 반복된다.
모든 경우의 수 즉, A 테이블 row 개수 X B 테이블 row 개수 이다.
이러한 CROSS JOIN을 카티션 곱(Cartesian Product, 곱집합) 라고도 한다.
CROSS JOIN은 여러가지로 표현할 수 있는데, 아래 3가지 모두 같은 결과를 출력한다.
SELECT * FROM A테이블 CROSS JOIN B테이블;
SELECT * FROM A테이블 JOIN B테이블;
SELECT * FROM A테이블, B테이블;
4) SELF JOIN
같은 테이블 사이의 조인을 말한다. 기본적인 SELF JOIN은 자기 자신과의 CROSS JOIN을 의미하고, 보통 자기 자신과의 조합은 제거한다. 따라서 FROM 절에 동일 테이블이 두 번 이상 나타난다.
SELECT * FROM A테이블 AS a (CROSS) JOIN A테이블 AS b WHERE a.컬럼 != b.컬럼;
SELECT * FROM A테이블 AS a, A테이블 AS b WHERE a.컬럼 != b.컬럼;
SELECT 별명1.컬럼명, 별명2.컬럼명
FROM 테이블1 AS 별명1, 테이블2 AS 별명2
WEHRE 별명1.컬럼명2 = 별명2.컬럼명1;
- 동일 테이블 사이의 조인을 수행하면 테이블과 컬럼 이름이 모두 동일하기 때문에 식별을 위해 반드시 테이블 별칭(Alias)을 사용해야 한다. 그리고 컬럼에도 모두 테이블 별칭을 사용해서 어느 테이블의 컬럼인지 식별해줘야 한다.
- SELF 조인은 하나의 테이블에 여러 별명을 붙여서 마치 서로 다른 테이블인 것처럼 조인한다.
*셀프조인을 사용하는 경우 <참고 블로그 링크>
1) 위계성 데이터(Hierarchical Data)를 다룰 때
- ex.회사 직원 데이터
2) 순차성 데이터(Sequential Data) 다룰 때
- ex.요리레시피 데이터
3) 1개의 테이블 안에 관계성이 명시되어야 할 데이터가 여러 개 존재할 때
- ex.비행기 항로나 기차의 여정과 같이 1개의 장소가 출발지가 되기도 하면서 도착지도 되는, 즉 하나의 데이터 값이 다른 데이터 사이에서 여러 관계성을 지닐 때
5) NATURE JOIN
등가 조인하는 방법 중 하나이다.
동일한 타입과 이름을 가진 컬럼을 조인 조건으로 이용하는 조인을 간단히 표현하는 방법이다.
SELECT 컬럼, 컬럼, … FROM 테이블1
NATURAL JOIN 테이블2
[NATURAL JOIN 테이블3] …
WHERE 검색 조건;
- 반드시 두 테이블 간의 동일한 이름, 타입을 가진 컬럼이 필요하다.
- 조인에 이용되는 컬럼은 명시하지 않아도 자동으로 조인에 사용된다.
- 동일한 이름을 갖는 컬럼이 있지만 데이터 타입이 다르면 에러가 발생한다.
- 조인하는 테이블 간의 동일 컬럼이 SELECT 절에 기술되도 테이블 이름을 생략해야 한다.
7. WHERE IS NULL / IS NOT NULL
SELECT column, another_column, …
FROM mytable
WHERE column IS/IS NOT NULL
AND/OR another_condition
AND/OR …;
SQL database NULL
데이터베이스에서의 NULL의 대안은 0이나 -와 같은 적절한 기본값을 사용하는 것이지만, 이것은 자료를 왜곡할 수도 있다. 때론 NULL을 피할 수 없는 경우(비대칭 자료)도 있다. 이럴땐 WHERE IS/IS NOT NULL로 컬럼을 확인해볼 수 있다.
8. Queries with expressions (수식)
영화 평점 % 구하고 나열하기.
SELECT title, Rating*10 AS RATEFROM movies
INNER JOIN boxoffice
ON ID=MOVIE_ID
high-level metrics
표현식을 사용해 쿼리의 열 값에 대해 더 복잡한 작성 가능. 이러한 식은 쿼리가 실행될 때 값을 변환하기 위해 기본 산술과 함께 수학 및 문자열 함수를 사용할 수 있다.
식을 사용하면 시간을 절약하고 결과 데이터의 추가 사후 처리를 줄일 수 있지만 쿼리를 읽기 어렵게 만들 수도 있으므로 SELECT식을 사용할 때 AS를 사용해 열 이름을 새로 지정한다.
표현식 외에도 일반 열과 테이블도 출력에서 더 쉽게 참조하고 더 복잡한 쿼리를 단순화하기 위해 별칭을 가질 수 있다.
9. Queries with aggregates
SELECT AGG_FUNC(column_or_expression) AS aggregate_description, …
FROM mytable
WHERE constraint_expression;
10. Grouped aggregate functions
1) GROUP BY
모든 행을 집계(aggregate)하는 것 외에도 해당 그룹 내의 개별 데이터 그룹에 집계 함수를 적용 할 수 있습니다 (예 : 코미디 대 액션 영화의 박스 오피스 판매).
GROUP BY는 지정된 열에 동일한 값을 가진 행을 그룹화하여 작동합니다.
SELECT AGG_FUNC(column_or_expression) AS aggregate_description, …
FROM mytable
WHERE constraint_expression
GROUP BY column;
ex) SELECT role,AVG(Years_employed)
FROM employees
GROUP BY role
-> For each role, find the average number of years employed by employees in that role
2) HAVING
SELECT group_by_column, AGG_FUNC(column_expression) AS ``aggregate_result_alias, …
FROM mytable
WHERE condition
GROUP BY column
HAVING group_condition;
: to filter grouped rows from the result set.
The HAVING clause constraints are written the same way as the WHERE clause constraints and are applied to the grouped rows.
🎁 WHERE (Not a group) = GROUP & HAVING (group)
- WHERE vs GROUP BY vs GROUP BY & HAVING
SELECT role,COUNT(*) FROM employees WHERE Role='Artist' SELECT role,COUNT(*) FROM employees Group by Role SELECT Role,Sum(Years_employed) FROM employees GROUP BY Role HAVING ROLE ='Engineer'
'데이터베이스 > SQL' 카테고리의 다른 글
[SQL 명령어] INSERT, UPDATE, DELETE (DML) (0) | 2021.03.21 |
---|---|
[SQL 명령어] CREATE, DROP, ALTER (DDL) (0) | 2021.03.21 |
데이터 스키마 (0) | 2021.03.21 |
SQL 명령어 종류 (0) | 2021.03.21 |
SQL 정의, 필요성 (0) | 2021.03.21 |