Query 입문

골머리·2021년 11월 8일
0

MySQL

목록 보기
5/16

기본적인 쿼리를 이해해보자.
각 쿼리에 대한 상세내용은 차츰 공부하면서 링크해둘꺼다.

Query 절

절 이름목적
select쿼리 결과에 포함할 열을 결정한다.
from데이터를 검색할 테이블과, 테이블을 조인하는 방법을 식별한다.
where불필요한 데이터를 걸러낸다.
group by공통 열 값을 기준으로 행을 그룹화한다.
having불필요한 그룹을 걸러낸다.
order by1개 이상의 열을 기준으로 최종 결과의 행을 정렬한다.
  • 행 = row = record
  • 열 = column = field

Select

보통 맨 첫줄에 위치하지만, 사실상 DB 서버가 판단하는 마지막 절이다.
몇개의 쿼리문을 해석해보자.

SELECT *
FROM language;

→ [language] 테이블의 모든 열을 가져와.

SELECT 
	language_id, name, last_update
FROM language;

→ [language] 테이블에서, 아이디, 이름, 최종수정일 3개의 열을 가져와.

중복 제거하기

중복된 데이터 행을 제외한 결과값을 순서대로 보고 싶다면 SELECT DISTINCT 를 사용하면 된다.

SELECT DISTINCT
	컬럼이름
FROM 테이블이름
ORDER BY 컬럼이름;	/*기본 오름차순*/

From

from절은 쿼리에 사용되는 테이블을 명시할 뿐만 아니라, 테이블을 서로 연결하는 수단도 함께 정의한다.
The from clause defines the tables used by a query, along with the means of linking the tables together.

Table은 4가지 유형이 있다.

  • 영구테이블 : create table 로 생성된 것
  • 파생테이블 : 서브쿼리에서 생성되어 메모리에 보관된 것
  • 임시테이블 : create temporary table + insert into
    메모리에 저장된 휘발성 데이터 → 특정 시점에 사라짐 (트랜잭션이 끝날 때, DB세션이 닫힐 때 등)
  • 가상테이블 : create view 로 생성된 것

서브쿼리에 대해 알아보자.

select 문에서 from 절 내에 ( )로 또다른 파생테이블을 생성하는 역할을 한다.

그러니까 from 절 내의 ( ) 부터 읽는 식이다.

테이블 연결

from 절에 2개 이상의 테이블이 있으면, 그 테이블을 연결하는데 필요한 조건도 포함해야 한다.

예시

SELECT 
	customer.first_name
    , customer.last_name
    , time(rental.rental_date) rental_time
FROM customer
    INNER JOIN rental
    ON customer.customer_id = rental.customer_id
WHERE date(rental.rental_date) = '2005-06-14';

→ customer 테이블에서 rental 테이블을 customer_id(PK/FK)를 기준으로 합치고
customer 테이블에서 first_name,
customer 테이블에서 last_name,
rental 테이블에서 rental_date의 시간 부분만 rental_time 이라는 열 이름으로 만들어서 가져와.

이렇게 해석할 수 있겠다.
여기서 customer_id는 customer 테이블에서는 Primary Key고, rental 테이블에서는 Foriegn Key가 된다.

테이블.컬럼 이렇게 이해하면 짹금 쉽다. 🙄

더 자세한 내용은 다중 테이블 쿼리(JOIN)에서 기록한다.

테이블 별칭 정의

테이블에 별칭을 지정하여 좀 더 간결하게 쿼리를 쓸 수 있다.
위의 예시를 그대로 써보자면,

SELECT 
    c.first_name
    , c.last_name
    , time(r.rental_date) r_time
FROM customer AS c 			/*여기서 customer 테이블의 명칭을 c 로 지정*/
    INNER JOIN rental AS r		/*여기서 rental 테이블의 명칭을 r 로 지정*/
    ON c.customer_id = r.customer_id
WHERE date(rental.rental_date) = '2005-06-14';

AS는 꼭 안써도 된다.


Where

where 절은 결과셋에 출력되기를 원하지 않는 행을 필터링하는 매커니즘이다.

and , or , not 과 같은 연산자로 조건을 구분할 수 있다.

예를 들어 내가 DVD 대여점 사장인데, 손님이 G등급에 1주일 이상 대여할 수 있는 영화를 추천해달라고 했다 치자.

SELECT title
FROM film
WHERE 
	rating = 'G' 
    AND rental_duration >= 7 ;

이렇게 검색할 수 있을거다.

  • and : 모든 조건이 true
  • or : 조건 중 하나만 true

where 절에 andor 연산자 모두 사용해야 할 경우는 ( ) 를 사용하여 조건을 그룹화한다.

SELECT title
FROM film
WHERE 
	(rating = 'G' AND rental_duration >= 7)
    OR  (rating = 'PG-13' AND rental_duration < 4) ;

Group by , having

group by절은 특정 컬럼(열)을 그룹짓고 싶을 때 사용한다.

종류지역가격
사과서울1000
사과경기900

예를 들어 이런 테이블이 있다고 가정했을 때, group by에 사과를 넣으면
사과 1900 이런식으로 하나의 데이터로 묶어서 보여준다.

group by를 사용해서 행 그룹을 생성하려면 where절에서 데이터를 필터링할 수 있는 having을 사용한다.


Order by

보통 쿼리의 결과값은 특정 순서대로 나열되지 않는다.
이때 오름차순, 내림차순 등 내가 원하는 기준으로 정렬할 때 order by절을 사용한다.

ORDER BY table.a, table.b ; 

이 경우 "테이블"의 A를 기준으로 1차 정렬되고, B를 기준으로 2차 정렬된다.

내림차순, 오름차순

  • 오름차순(default) : asc
  • 내림차순 : desc

순서

  • n번째 열을 기준으로 오름차순/내림차순 할 수 있다.
  • 예를 들어, ORDER BY 3 desc; 라 하면 3번째 열로 내림차순 정렬을 하라는 뜻이다.
profile
PO로 성장하기 위해 노력 중 👩🏾‍💻

0개의 댓글