Mastering Advanced Queries (Joins, GroupBy, Having) and raw Queries with GORM in Go.

Mastering Advanced Queries (Joins, GroupBy, Having) and raw Queries with GORM in Go.

Advancing beyond basic querying techniques is crucial for handling complex data retrieval and analysis within Go applications. GORM, the Object Relational Mapping library for Go, offers powerful functionalities like Joins, GroupBy, Having, and Raw queries to facilitate intricate database operations. Let's delve into an extensive exploration of these advanced querying techniques using GORM, empowering you to efficiently fetch, aggregate, and manipulate data within your Go applications.


Before diving into advanced queries with GORM, ensure you've met the following prerequisites:

  • GORM library installed in your Go environment.

  • A configured database connection using GORM, as detailed in previous guides.

Step 1: Defining Your Model

Define the model structures for the tables involved in advanced querying operations. Consider a Product and Order model:

package models

import ""

type Product struct {
    Name     string
    Price    float64
    Category string
    // Add other fields as needed

type Order struct {
    ProductID  uint
    Quantity   int
    // Add other fields as needed

The Product and Order structs represent tables in the database, where Order has a foreign key ProductID referring to Product.

Step 2: Performing Joins

Simple Join

GORM facilitates joining tables using the Joins method:

var products []models.Product
var orders []models.Order

// Joining products and orders on product IDs
db.Joins("JOIN orders ON = orders.product_id").Find(&products, &orders)

This performs a simple inner join between the products and orders tables based on the ProductID field.

Multiple Joins

For multiple joins involving more tables, extend the Joins method:

// Joining products, orders, and customers
db.Joins("JOIN orders ON = orders.product_id").
    Joins("JOIN customers ON orders.customer_id =").
    Find(&products, &orders, &customers)

This query performs joins across products, orders, and customers tables based on their respective foreign key relationships.

Step 3: Grouping and Aggregating with GroupBy and Having

Grouping Records

GORM's Group method facilitates grouping query results:

var results []struct {
    Category string
    Count    int

// Grouping products by category and counting the number of products in each category
db.Model(&models.Product{}).Select("category, count(*) as count").Group("category").Scan(&results)

This group records by the Category field in the Product table and counts the number of products in each category.

Filtering Grouped Records with Having

GORM's Having method filters grouped records:

var results []struct {
    Category string
    Count    int

// Grouping products by category and filtering categories with more than 10 products
db.Model(&models.Product{}).Select("category, count(*) as count").Group("category").Having("count > ?", 10).Scan(&results)

This query filters the grouped records to retrieve categories with more than 10 products.

Step 4: Executing Raw Queries

GORM allows executing raw SQL queries for scenarios requiring complex or specific database operations:

var results []models.Product

// Executing raw SQL query to fetch products with prices greater than 100
db.Raw("SELECT * FROM products WHERE price > ?", 100).Scan(&results)

This executes a raw SQL query to fetch products from the products table where the Price field is greater than 100.


Congratulations! You've mastered advanced querying techniques—Joins, GroupBy, Having, and Raw queries—with GORM in Go. By following these steps, you've learned how to perform complex joins between tables, group records, aggregate data, filter grouped records, and execute raw SQL queries for specific database operations.

Understanding and applying these advanced querying functionalities empower you to efficiently handle complex data retrieval, aggregation, and manipulation within your Go applications. As you explore GORM further, you'll discover more intricate querying capabilities and leverage them to handle diverse and challenging database interactions seamlessly.

I hope this helps, you!!

More such articles:

Did you find this article valuable?

Support techwasti by becoming a sponsor. Any amount is appreciated!