BigQuery SQL Queries: Basics & Advanced Techniques

Home Bigquery BigQuery SQL Queries: Basics & Advanced Techniques
BigQuery SQL Queries

Welcome to our comprehensive guide on mastering SQL queries in Google BigQuery. In this tutorial, we’ll start with the basics and take you through advanced techniques. You’ll learn how to craft SELECT statements, filter, sort, aggregate data, and dive into the world of joins and subqueries for complex data analysis. Let’s begin!


1. Basic SELECT Statements for Retrieving Data:

We’ll begin by understanding the foundational SELECT statement. Learn how to extract specific columns and rows from your tables, control column ordering, and present the data in a readable format. This is the cornerstone of data retrieval in SQL. For instance, to retrieve customer names and their corresponding email addresses from a ‘Customers’ table, you’d use:

SELECT customer_name, email
FROM Customers;

2. Filtering, Sorting, and Aggregating Data:

Explore the power of WHERE clauses to filter data based on conditions. Discover ORDER BY for sorting and GROUP BY for aggregating data. These techniques help you extract meaningful insights from your datasets, such as identifying trends and summarizing information. For instance, to narrow down your results based on specific conditions, the WHERE clause comes into play. Imagine you want to find customers who made purchases above $500:


SELECT customer_name
FROM Customers
WHERE purchase_amount > 500;

Sorting Data: Ascending or descending order? Use the ORDER BY clause to sort your results. For instance, to list the highest purchase amounts:

SELECT customer_name, purchase_amount
FROM Customers
ORDER BY purchase_amount DESC;

Limiting Results: The LIMIT clause lets you control the number of results displayed. To show the top 10 highest spenders:

SELECT customer_name, purchase_amount
FROM Customers
ORDER BY purchase_amount DESC

Combining Conditions: Use logical operators like AND and OR to refine your queries. To find customers who spent over $500 and are from New York:

SELECT customer_name, purchase_amount
FROM Customers
WHERE purchase_amount > 500 AND city = 'New York';

3. Joins and Subqueries in BigQuery:

Take your querying skills to the next level by mastering joins and subqueries. Understand INNER, LEFT, RIGHT, and FULL JOINs to combine data from multiple tables. Learn how subqueries enable you to embed one query within another, providing dynamic results and enabling complex analysis.

Joining Forces: Bringing Data Together

When your data is spread across multiple tables, harnessing the full story often requires combining them. This is where joins come into play. Joins enable you to merge information from different tables based on common columns, offering a holistic view of your data.

  • Inner Join: Consider two tables – ‘Orders’ and ‘Customers.’ An inner join can help you link orders to their respective customers using a shared ‘customer_id’:

SELECT Orders.order_id, Customers.customer_name
FROM Orders
INNER JOIN Customers ON Orders.customer_id = Customers.customer_id;

  • Left Join: Maybe you want all orders, regardless of whether they’re linked to customers. A left join can achieve this, ensuring you don’t miss any data:

SELECT Orders.order_id, Customers.customer_name
FROM Orders
LEFT JOIN Customers ON Orders.customer_id = Customers.customer_id;

  • Cross Join: When you’re exploring all possible combinations between two tables, a cross join can be handy:

SELECT Products.product_name, Suppliers.supplier_name
FROM Products
CROSS JOIN Suppliers;

Subqueries: Queries Within Queries

Subqueries, or nested queries, add an extra layer of flexibility to your analysis. They allow you to use the results of one query as input for another, facilitating complex operations.

  • Scalar Subquery: Let’s say you want to find orders with values higher than the average order value. You can use a scalar subquery within the WHERE clause:

SELECT order_id, order_value
FROM Orders
WHERE order_value > (SELECT AVG(order_value) FROM Orders);

  • Correlated Subquery: Correlated subqueries are used when the inner query relies on values from the outer query. This example finds customers who have made more orders than the average for their city:

SELECT customer_name
FROM Customers c
WHERE (SELECT COUNT(*) FROM Orders o WHERE o.customer_id = c.customer_id) >
(SELECT AVG(order_count) FROM (SELECT city, COUNT(*) as order_count FROM Orders GROUP BY city));

  • Subquery in FROM Clause: You can even use subqueries in the FROM clause to create virtual tables for further analysis. For instance, finding customers who have made a repeat purchase:

SELECT customer_id, COUNT(*) as repeat_purchase_count
FROM (SELECT customer_id, COUNT(*) as order_count FROM Orders GROUP BY customer_id) subq
WHERE order_count > 1;

4. Advanced Techniques for Complex Analysis:

Delve into more advanced SQL techniques like using window functions for calculations across rows, working with Common Table Expressions (CTEs) for improved query structure, and understanding complex data transformations.

Let’s learn how to leverage window functions, optimize queries, and harness the power of geospatial analysis, all backed by real-world examples.

  • Empowering Insights with Window Functions

Window functions are a game-changer when it comes to performing complex calculations that involve multiple rows in a dataset. They enable you to create aggregated results while maintaining detailed information. Let’s delve into their power with an example:

Imagine you have an e-commerce dataset and you want to calculate the 7-day rolling average order value for each day. With a window function, you can achieve this seamlessly:

SELECT order_date, order_value,
AVG(order_value) OVER (ORDER BY order_date ROWS BETWEEN 6 PRECEDING AND CURRENT ROW) as rolling_avg
FROM Orders;

  • Optimization: Efficiency Meets Performance

Optimizing your queries is a must, especially when dealing with large datasets. Utilize techniques to minimize costs and enhance performance. Consider a scenario where you want to analyze recent customer activity:

SELECT customer_id, COUNT(*) as order_count
FROM Orders
GROUP BY customer_id;

Here, by filtering data for the last 3 months, you reduce the amount of data processed, leading to faster query execution.

  • GeoSpatial Analysis: Mapping Insights

Geospatial analysis enables you to unravel location-based insights, visualizing data on maps and uncovering patterns. Let’s say you’re analyzing ride-sharing data and want to find the most popular pickup locations:

SELECT ST_GEOGPOINT(pickup_longitude, pickup_latitude) as pickup_location,
COUNT(*) as pickup_count
FROM Rides
GROUP BY pickup_location
ORDER BY pickup_count DESC

By converting longitude and latitude into a geospatial point, you can identify hotspots for pickups.


Congratulations! You’ve embarked on a journey to becoming a BigQuery SQL querying expert. By mastering basic SELECT statements, filtering, sorting, aggregating, and advanced techniques like joins and subqueries, you’re equipped to derive meaningful insights from your datasets. Keep honing your skills and exploring the myriad possibilities that SQL offers for data analysis. Stay tuned for more tutorials that delve further into the world of BigQuery’s capabilities and optimizations.