데이터베이스/SQL

[SQL 명령어] SELET/WHERE, DISTINCT, ORDER BY, LIMIT, OFFSET/JOIN/ISNULL/expressions/aggregates (DQL)

DS지니 2021. 3. 21. 13:52
728x90
반응형

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

Aggregate Function(집계함수) 더 보기

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'

 

728x90
반응형

'데이터베이스 > 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