: 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 조인은 하나의 테이블에 여러 별명을 붙여서 마치 서로 다른 테이블인 것처럼 조인한다.
- 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를 사용해 열 이름을 새로 지정한다.
표현식 외에도 일반 열과 테이블도 출력에서 더 쉽게 참조하고 더 복잡한 쿼리를 단순화하기 위해 별칭을 가질 수 있다.
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)
- WHEREvsGROUP BYvsGROUP 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'