Query and Mutation
// get all
const { data, error } = await supabase
  .from('countries')
  .select()
// filters
const { data, error } = await supabase
  .from('cities')
  .select('name, country_id') // select before eq
  .eq('name', 'The Shire')    // eq comes after select
  .neq('name', 'The Basquat') // not equals to
// insert/create
const { error } = await supabase
  .from('countries')
  .insert({ id: 1, name: 'Denmark' })
  
// update
const { error } = await supabase
  .from('countries')
  .update({ name: 'Australia' })
  .eq('id', 1)
// upsert
const { data, error } = await supabase
  .from('countries')
  .upsert({ id: 1, name: 'Albania' })
  .select()
// delete
const response = await supabase
  .from('countries')
  .delete()
  .eq('id', 1)
Query Typing
// complex queries
import { QueryResult, QueryData, QueryError } from '@supabase/supabase-js'
const countriesWithCitiesQuery = supabase
  .from("countries")
  .select(`
    id,
    name,
    cities (
      id,
      name
    )
  `);
type CountriesWithCities = QueryData<typeof countriesWithCitiesQuery>;
const { data, error } = await countriesWithCitiesQuery;
if (error) throw error;
const countriesWithCities: CountriesWithCities = data;