How to Insert Data in BigQuery

Last updated August 23, 2026 · By the SaturnSQL team

INSERT INTO ... VALUES suits a few rows; bulk analytics loads normally use a load job or CREATE TABLE AS SELECT. Streaming inserts add rows in near real time instead.

INSERT INTO analytics.events (event_id, event_time, user_id, event_type)
VALUES ('e1', CURRENT_TIMESTAMP(), 101, 'page_view'),
       ('e2', CURRENT_TIMESTAMP(), 102, 'signup');

Bulk loads and CTAS

For anything beyond a few rows, INSERT ... VALUES is the wrong tool: BigQuery is built around batch load jobs (bq load, or loading from Cloud Storage) and CREATE TABLE AS SELECT. Batch load jobs are free, you pay only for the storage, and CTAS is billed like any other query, both are far cheaper and faster than row-by-row inserts.

CREATE OR REPLACE TABLE analytics.events_backfill AS
SELECT * FROM raw.events_staging
WHERE event_date >= '2026-01-01';

Streaming inserts

The tabledata.insertAll API (or the Storage Write API) streams rows in as they happen, making them queryable within seconds. Streaming is billed by the volume of data streamed rather than as a free load job, so use it for real-time pipelines, not routine batch ETL.

Run this in SaturnSQL

SaturnSQL is a browser-based SQL editor for teams: shared query library, schema-aware autocomplete, and scheduled exports to Google Sheets and Slack.

Try it free

Do more with BigQuery

Switching SQL clients?

Side-by-side roundups with prices checked against each vendor.

Related BigQuery guides