home User Guide Getting Started Help Center Documentation Community Training Certification
Looker keyboard_arrow_down
language keyboard_arrow_down
Looker documentation will be moving to cloud.google.com in mid-2022!
All the information you rely on will be migrated and all docs.looker.com URLs will be redirected to the appropriate page.
LookML terms and concepts

The Substitution operator ($), Scoping and naming, SQL dialect, and SQL block sections have moved to a new Incorporating SQL and referring to LookML objects documentation page.


This page defines terms and concepts that appear repeatedly in LookML development. The following diagram shows the relationships among elements that are contained within other elements. All terms shown here are defined in the following sections.

Looks and user-defined dashboards are not part of this diagram, as users create them without using any LookML. However, their queries rely on the underlying LookML elements that are shown in the preceding diagram.

LookML project

A project is a collection of LookML files that describe how your database tables are related to each other and how Looker should interpret those tables. Each LookML project resides in its own Git repository for version control.

Here are the common file types in a LookML project:

See the LookML project files documentation page for information about other types of files you can have in your LookML project.

Once you connect Looker to your database, you can specify the database connection to use for your Looker project:

In Looker, you can access your projects under the Develop menu:

As of Looker 21.12, if your admin has enabled the Enhanced Navigation Labs feature, you can access your projects by selecting the Develop option in the new enhanced left navigation panel.

Where do LookML projects and files come from?

The most common way to create LookML files is to generate a LookML project from your database. You can also create a blank project and manually create its LookML files, or you can create a project by cloning an existing Git repository.

When you generate a new project from your database, Looker creates a baseline set of files that you can use as a template for building out the project:

From here, you can customize the project by removing unwanted views and Explores and by adding custom dimensions and measures.

Major LookML structures

As shown in the preceding diagram, a project typically contains one or more model files that contain parameters defining a model and its Explores and joins. In addition, projects typically contain one or more view files, each containing parameters defining that view and its fields (including dimensions and measures) and sets of fields. The project can also contain a project manifest file containing parameters to use view files from other projects or configure localization defaults. This section describes those major structures.


A model is a customized portal into the database, designed to provide intuitive data exploration for specific business users. Multiple models can exist for the same database connection in a single LookML project. Each model can expose different data to different users. For example, sales agents need different data than company executives, and so you would probably develop two models to offer views of the database appropriate for each user.

In Looker, queries are grouped by the model to which they belong. Your users see models listed under the Explore menu:

As of Looker 21.12, if your admin has enabled the Enhanced Navigation Labs feature, you can access Explores and view a list of Explores by selecting the Explore option in the new enhanced left navigation panel.

A model file specifies the database to connect to and defines a collection of Explores for that connection. By convention each file declares exactly one model and, in new LookML, model filenames end in .model.lkml. The name of the model file determines the name that displays in Looker.

The general form of a model declaration in LookML is shown next. See the Model parameters documentation page for details.

connection: connection_name persist_for: timeframe case_sensitive: yes | no include: "filename_pattern" # for example: *.view.lkml # More include declarations   explore: explore_name { view_name: view_name join: view_name { # join parameters } # More join declarations } # More explore declarations


A view declaration defines a list of fields (dimensions or measures) and their linkage to an underlying table or derived table. In LookML a view typically references an underlying database table, but it can also represent a derived table.

A view may join to other views. The relationship between views is typically defined as part of an Explore declaration in a model file.

In Looker, view names appear at the beginning of dimension and measure names in the data table. This naming convention makes it clear which view the field belongs to:

A view is stored in a .view.lkml file. The general form of a view declaration is shown next. See the View parameters documentation page for complete usage details.

view: view_name { dimension: field_name { # dimension_parameters } # more dimension declarations measure: field_name { # measure_parameters } # more measure declarations set: first_set { fields: [field_one, field_two] } }

When you use a measure of type: count in an Explore, the visualization labels the resulting values with the view name rather than the word “Count.” To avoid confusion, we recommend pluralizing your view name, selecting Show Full Field Name under Series in the visualization settings, or using a view_label with a pluralized version of your view name.


An Explore is a view that users can query. You can think of the Explore as a starting point for a query, or in SQL terms, as the FROM in a SQL statement. Not all views are Explores, because not all views describe an entity of interest. For example, a States view corresponding to a lookup table for state names doesn’t warrant an Explore, because business users never need to query it directly. On the other hand, business users probably want a way to query an Orders view, and so defining an Explore for Orders makes sense.

An explore declaration specifies the join relationships to other views. Continuing with the previous examples, the Orders view might join the States view, identifying the state in which a sale occurred. See Joins for more detail.

In Looker, your users can see Explores listed in the Explore menu:

By convention, Explores are declared in the model file. The following example demonstrates the declaration for an orders Explore for an e-commerce database. The views orders and customers are defined elsewhere, in their respective view files.

# ——————————————— # file: ecommercestore.model.lookml # ——————————————— connection: order_database include: "filename_pattern" # include all the views explore: orders { join: customers { sql_on: ${orders.customer_id} = ${customers.id} ;; } }

For details on join declarations, see Joins. See the Join parameters documentation page for complete usage details.

Dimension and measure fields

Views contain fields, mostly dimensions and measures, which are the fundamental building blocks for Looker queries.

In Looker, a dimension is a groupable field and can be used to filter query results. It can be:

For example, dimensions for a Products view might include product name, product model, product color, product price, product created date, and product end-of-life date.

A measure is a field that uses a SQL aggregate function, such as COUNT, SUM, AVG, MIN, or MAX. Any field computed based on the values of other measure values is also a measure. Measures can be used to filter grouped values. For example, measures for a Sales view might include total items sold (a count), total sale price (a sum), and average sale price (an average).

The behavior and expected values for a field depend on its declared type, such as string, number, or time. For measures, types include aggregate functions, such as sum and percent_of_previous. For details, refer to dimension types and measure types.

In Looker, fields are listed on the Explore page in the field picker on the left-hand side of the page.

By convention, fields are declared as part of the view they belong to, stored in a view file. The following example shows several dimension and measure declarations. Notice the use of the substitution operator ($) to reference fields without using a fully scoped SQL column name.

Here are some example declarations of dimensions and measures:

view: orders { dimension: id { primary_key: yes type: number sql: ${TABLE}.id ;; } dimension: customer_id { sql: ${TABLE}.customer_id ;; } dimension: amount { type: number value_format: "0.00" sql: ${TABLE}.amount ;; } dimension_group: created { type: time timeframes: [date, week] sql: ${TABLE}.created_at ;; } measure: count { type: count # creates sql COUNT(orders.id) sql: ${id} ;; } measure: total_amount { type: sum # creates sql SUM(orders.amount) sql: ${amount} ;; } }

You can also define a dimension_group, which creates multiple time-related dimensions at once, and filter fields, which have a variety of advanced use cases such as templated filters.

See the Field parameters documentation page for complete details on declaring fields and the various settings that can be applied to them.


As part of an explore declaration, each join declaration specifies a view that can be joined into the explore. When a user creates a query that includes fields from multiple views, Looker automatically generates SQL join logic to bring in all fields correctly.

Here is an example join in an explore declaration:

# ——————————————— # file: ecommercestore.model.lookml # ——————————————— connection: order_database include: "filename_pattern" # include all the views explore: orders { join: customers { sql_on: ${orders.customer_id} = ${customers.id} ;; } }

For more details, check out Working with joins in LookML.

Project manifest files

Your project may contain a project manifest file, which is used for project-level settings such as those for specifying other projects to import into the current project, defining LookML constants, specifying model localization settings, and adding extensions and custom visualizations to your project.

Each project can have only one manifest file. The file must be named manifest.lkml and be located at the root level of your Git repo. When you’re using folders in the IDE, be sure that the manifest.lkml file is kept at the root level of your project’s directory structure.

You can use a project manifest file either for project import or for localization, but not for both functions.

To import LookML files from a different project, use the project manifest file to specify a name for your current project and the location of any external projects, which could be stored locally or remotely. For example:

# This project project_name: "my_project" # The project to import local_dependency: { project: "my_other_project" } remote_dependency: ga_360_block { url: "https://github.com/llooker/google_ga360" ref: "4be130a28f3776c2bf67a9acc637e65c11231bcc" }

After defining the external projects in the project manifest file, you can use the include parameter in your model file to add files from those external project to your current project. For example:

include: "//my_other_project/imported_view.view" include: "//ga_360_block/*.view"

For more information, see the Importing files from other projects documentation page.

To add localization to your model, use the project manifest file to specify default localization settings. For example:

localization_settings: { default_locale: en localization_level: permissive }

Specifying default localization settings is one step in localizing your model. For more information, see the Localizing your LookML model documentation page.


In Looker, a set is a list that defines a group of fields that are used together. Typically sets are used to specify which fields to display after a user drills down into data. Drill sets are specified on a field-by-field basis, so you get complete control over what data is displayed when a user clicks a value in a table or dashboard. Sets can also be used as a security feature to define groups of fields visible to specific users.

The following example shows a set declaration in a view order_items, defining fields that list relevant details about a purchased item. Note that the set references fields from other views by specifying scope.

set: order_items_stats_set { fields: [ id, # scope defaults to order_items view orders.created_date, # scope is "orders" view orders.id, users.name, users.history, # show all products this user has purchased products.item_name, products.brand, products.category, total_sale_price ] }

See the set parameter documentation page for complete usage details for sets.

Drill down

In Looker, you can drill down on any fields that are set up that way when writing LookML. Drilling works in both query results tables and dashboards. Drilling starts a new query that is restricted by the value you clicked on.

Drill behavior is different for dimensions and measures:

The fields to show for the new drill query can be defined by a set, or can be defined by the drill_fields parameter (for fields) or the drill_fields parameter (for views).

Derived tables

A derived table is a query whose results are used as if it were an actual table in the database. Derived tables are created by using the derived_table parameter in a view declaration. Looker accesses derived tables as though they were physical tables with their own set of columns. A derived table is exposed as its own view using the derived_table parameter, and defines dimensions and measures in the same manner as conventional views. The view for a derived table can be queried and joined into other views, just like any other view.

Derived tables can also be defined as persistent derived tables (PDTs), which are derived tables that are written into a scratch schema on your database and automatically regenerated on the schedule that you specify with a persistence strategy.

See the Derived tables in Looker documentation page for more information.

Database connection

Another important element of a LookML project is the database connection that Looker will use to run queries on your database. A Looker admin uses the Connections page to configure database connections, and LookML developers use the connection parameter in a model file to specify which connection to use for the model. If you generate a LookML project from your database, Looker will automatically populate the connection parameter in the model file.