Creating Derived Subqueries
This document covers the alias_as functionality of the AST Builder in the GlueSQL project. The alias_as method allows you to create a derived subquery, which is similar to subqueries in SQL. It gives you the ability to use the output of a query as a table to perform further queries.
Basic Usage
To use the alias_as method, simply chain it to the end of a query builder method before executing the query. The derived subquery can then be used for further queries. Here's an example:
let actual = table("Item")
    .select()
    .alias_as("Sub")
    .select()
    .execute(glue)
    .await;
In this example, the alias_as method is used after the select method, creating a derived subquery named "Sub" that can be used in subsequent queries.
Examples
The following examples demonstrate how to use the alias_as method with various query operations. 
Derived Subquery with Filter
let actual = table("Item")
    .select()
    .filter("item_id = 300")
    .alias_as("Sub")
    .select()
    .execute(glue)
    .await;
Derived Subquery with Projection
let actual = table("Item")
    .select()
    .project("item_id")
    .alias_as("Sub")
    .select()
    .execute(glue)
    .await;
Derived Subquery with Join
let actual = table("Item")
    .alias_as("i")
    .select()
    .join_as("Category", "c")
    .on("c.category_id = i.category_id")
    .alias_as("Sub")
    .select()
    .project("item_name")
    .project("category_name")
    .execute(glue)
    .await;
Derived Subquery with Group By and Having
let actual = table("Category")
    .select()
    .project("category_name")
    .alias_as("Sub1")
    .select()
    .group_by("category_name")
    .having("category_name = 'Meat'")
    .alias_as("Sub2")
    .select()
    .execute(glue)
    .await;
Derived Subquery with Order By
let actual = table("Item")
    .select()
    .order_by("price DESC")
    .alias_as("Sub")
    .select()
    .execute(glue)
    .await;
Derived Subquery with Offset and Limit
This example shows how to create a derived subquery combined with both the offset and limit methods to control the range of rows returned:
let actual = table("Item")
    .select()
    .offset(3)
    .limit(1)
    .alias_as("Sub")
    .select()
    .execute(glue)
    .await;