How to Insert Data in BigQuery

Last updated July 26, 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

Related BigQuery guides