Django에서 GROUP BY로 쿼리
대부분의 사용자는 SQL에 익숙하며 GROUP BY
절을 사용하여 SQL 쿼리를 작성하여 그룹으로 데이터를 가져오는 방법을 알고 있습니다. GROUP BY
절을 사용하여 단일 열 또는 다중 열 값을 기반으로 레코드 그룹을 만들고 집계 기능을 수행할 수 있습니다.
이 기사에서는 Bike_id
, Bike_name
, Bike_brand
, Bike_color
, Bike_bought_date
, Is_bike_premium
, Bike_price
등을 포함하는 Bike
데이터베이스에서 작업하고 있다고 가정합니다. .
위의 Bike
데이터베이스에서 GROUP BY
절을 사용하여 다른 작업을 수행하는 방법을 배웁니다. 또한 GROUP BY
절을 사용하여 SQL 쿼리를 먼저 작성하고 Python으로 변환하여 독자가 Django에서 쿼리 작성을 쉽게 이해하고 빠르게 배울 수 있도록 합니다.
Django에서 GROUP BY
쿼리 생성
색상에 따라 자전거의 수를 세고 싶다고 가정합니다. 간단히 말해서 색상에 따라 자전거 그룹을 만들고 싶고 이를 위해 아래에 SQL 쿼리를 작성했습니다.
SELECT
Bike_color,
COUNT(Bike_id) AS Total_bikes
FROM
Bike
GROUP BY
Bike_color
위 SQL 쿼리의 출력으로 2개의 열을 얻습니다. 하나는 Bike_color
이고 다른 하나는 특정 색상의 자전거 수를 나타내는 Total_Bikes
입니다.
이제 위의 SQL 쿼리를 Python 코드로 변환하여 동일한 결과를 얻습니다.
from django.db.models import Count
Bike.objects.values("Bike_color").annotate(Total_bikes=Count("Bike_id"))
출력:
values()
- SQL 쿼리의GROUP BY
절을 대체합니다.values()
메서드의 인수로 사용해야 하는 SQL 쿼리에서GROUP BY
절과 함께 사용하는 모든 열.annotate()
-annotate()
메서드는 집계 함수를 인수로 사용하여 모든 그룹에 적용합니다.
이렇게 하면 색상에 따라 자전거 그룹을 만들고 Python 쿼리를 사용하여 같은 색상의 자전거 수를 셀 수 있습니다.
사용자가 values()
이전에 annotate()
함수를 호출하면 그룹의 행에 집계 함수가 적용되지 않고 전체 레코드에 적용됩니다. 따라서 쿼리를 작성하는 동안 사용하는 메서드의 순서를 확인하십시오.
GROUP BY
쿼리와 함께 다중 집계 사용
여기에서는 색상에 따라 자전거 그룹을 만듭니다. 그런 다음 Count()
집계 기능을 사용하여 모든 색상의 자전거를 세고 Min()
집계 기능을 사용하여 모든 그룹에서 최소 비용으로 자전거를 가져옵니다.
SELECT
Bike_color,
COUNT(Bike_id) AS Total_bikes,
MIN(Bike_price) As cheap_bike
FROM
Bike
GROUP BY
Bike_color
아래에서는 위의 SQL 쿼리를 Python 코드로 변환했습니다.
from django.db.models import Count
from django.db.models import Min
Bike.objects.values("Bike_color").annotate(
Total_bikes=Count("Bike_id"), cheap_bike=Min("Bike_price")
)
출력:
이런 식으로 Python에서 group by
쿼리와 함께 Count()
및 Min()
다중 집계 함수를 사용했습니다.
여러 열이 있는 GROUP BY
레코드
아래 SQL 쿼리에서 Bike_color
및 Is_bike_premium
필드를 GROUP BY
절과 함께 사용했습니다. 쿼리는 색상 및 프리미엄 범주에 있는지 여부에 따라 레코드를 그룹화합니다.
SELECT
Bike_color,
Is_bike_premium,
COUNT(Bike_id) AS Total_bikes,
FROM
Bike
GROUP BY
Bike_color,
Is_bike_premium
위의 SQL 쿼리를 Python 코드로 변환하려면 values()
메서드 내에 여러 필드를 추가해야 합니다.
from django.db.models import Count
Bike.objects.values("Bike_color", "Is_bike_premium").annotate(
Total_bikes=Count("Bike_id")
)
출력:
모든 그룹의 레코드 필터링
이 섹션에서는 색상에 따라 Bike
테이블의 모든 레코드 그룹을 만들고 모든 그룹에서 모든 비프리미엄 자전거를 필터링합니다. 간단히 말해서 색상에 따라 비프리미엄 자전거 그룹을 만들 것입니다.
아래 SQL 쿼리에서 WHERE
절을 사용하여 자전거를 필터링했습니다.
SELECT
Bike_color,
COUNT(Bike_id) AS Total_bikes
FROM
Bike
WHERE
Is_bike_premium = False
GROUP BY
Bike_color
위의 SQL 쿼리를 Python 코드로 변환하기 위해 Python의 filter()
메서드를 사용하고 필터링 조건을 인수로 전달했습니다.
from django.db.models import Count
Bike.objects.values("Bike_color").filter(Is_bike_premium=False).annotate(
Total_bikes=Count("Bike_id")
)
출력:
이 기사에서 Django에서 GROUP BY
쿼리를 생성하는 방법을 배웠습니다. 또한 group by
쿼리의 다양한 사용 사례를 보았습니다.
또한 사용자는 orderBy()
메서드와 함께 group by
쿼리를 사용하여 모든 그룹의 레코드를 정렬할 수 있습니다.