概要
BigQuery は、Google が低価格で提供する NoOps のフルマネージド分析データベースです。BigQuery では、インフラストラクチャを所有して管理したりデータベース管理者を置いたりすることなく、テラバイト単位の大規模なデータでクエリを実行できます。また、SQL が採用されており、従量課金制というメリットがあります。このような特長を活かし、有用な情報を得るためのデータ分析に専念できます。
ここでは、ecommerce データセットを使用します。このデータセットには、Google Merchandise Store に関する数百万件の Google アナリティクス レコードが含まれており、BigQuery に読み込まれています。このデータセットのコピーを使用して、フィールドや行からどのような分析情報が得られるのかを確認します。
このラボでは、既存の ecommerce データセットから新しい永続的なレポート テーブルと論理ビューを作成する方法について学びます。
設定と要件
各ラボでは、新しい Google Cloud プロジェクトとリソースセットを一定時間無料で利用できます。
-
Qwiklabs にシークレット ウィンドウでログインします。
-
ラボのアクセス時間(例: 1:15:00)に注意し、時間内に完了できるようにしてください。
一時停止機能はありません。必要な場合はやり直せますが、最初からになります。
-
準備ができたら、[ラボを開始] をクリックします。
-
ラボの認証情報(ユーザー名とパスワード)をメモしておきます。この情報は、Google Cloud Console にログインする際に使用します。
-
[Google Console を開く] をクリックします。
-
[別のアカウントを使用] をクリックし、このラボの認証情報をコピーしてプロンプトに貼り付けます。
他の認証情報を使用すると、エラーが発生したり、料金の請求が発生したりします。
-
利用規約に同意し、再設定用のリソースページをスキップします。
BigQuery コンソールを開く
- Google Cloud コンソールで、ナビゲーション メニュー > [BigQuery] を選択します。
[Cloud Console の BigQuery へようこそ] メッセージ ボックスが開きます。このメッセージ ボックスにはクイックスタート ガイドへのリンクと、UI の更新情報が表示されます。
- [完了] をクリックします。
タスク 1. テーブルを保存するための新しいデータセットを作成する
-
BigQuery で、プロジェクト名の近くにある [アクションを表示] をクリックし、[データセットを作成] をクリックします。
-
[データセット ID] フィールドに「ecommerce」と入力します。その他のオプションはデフォルト値のままにします([データのロケーション]、[デフォルトのテーブルの有効期限])。
-
[データセットを作成] をクリックします。
![選択した [データセットを作成] オプション](https://cdn.qwiklabs.com/%2B5mPf8Wz5j3pfl%2F2A%2FV%2BkLZlyz5hFRFqsLive0xKx%2BY%3D)
タスク 2. CREATE TABLE ステートメントのトラブルシューティング
あなたは、データ アナリスト チームから新しい ecommerce データセットに永続テーブルを作成するためのクエリ ステートメントを受け取りましたが、正常に機能しません。
各クエリが機能しない理由を診断して、問題を解決してください。
BigQuery で SQL を使用してテーブルを作成する際のルール
以下のテーブル作成ルールを読み、正常に機能しないクエリを修正するためのガイドとして活用してください。
- 指定した列リスト、query_statement から推定される列の、いずれかまたは両方が存在する必要がある。
- 列リストと as query_statement 句の両方が存在する場合、BigQuery は、as query_statement 句内の名前を無視し、位置をもとにして列を列リストに一致させる。
- as query_statement 句が存在し、列リストが存在しない場合、BigQuery は、列の名前と型を as query_statement 句から判断する。
- 列リスト、as query_statement 句のいずれかで列名が指定されている必要がある。
- 列名を重複させることはできない。
クエリ 1: 列、列、列
- 以下のクエリを [クエリエディタ] に追加して [実行] をクリックし、エラーを診断したら、その後に続く質問に答えてください。
#standardSQL
# 探索対象の 1 日分の e コマースデータをコピー
CREATE OR REPLACE TABLE ecommerce.all_sessions_raw_20170801
OPTIONS(
description="Raw data from analyst team into our dataset for 08/01/2017"
) AS
SELECT fullVisitorId, * FROM `data-to-insights.ecommerce.all_sessions_raw`
WHERE date = '20170801' #56,989 件のレコード
;
Error: CREATE TABLE has columns with duplicate name fullVisitorId at [8:2]
上のクエリはどのテーブル作成ルールに違反していますか。
クエリ 2: 列の再確認
- 以下のクエリを [クエリエディタ] に追加して [実行] をクリックし、エラーを診断したら、その後に続く質問に答えてください。
#standardSQL
# 探索対象の 1 日分の e コマースデータをコピー
CREATE OR REPLACE TABLE ecommerce.all_sessions_raw_20170801
#スキーマ
(
fullVisitorId STRING OPTIONS(description="Unique visitor ID"),
channelGrouping STRING OPTIONS(description="Channel e.g. Direct, Organic, Referral...")
)
OPTIONS(
description="Raw data from analyst team into our dataset for 08/01/2017"
) AS
SELECT * FROM `data-to-insights.ecommerce.all_sessions_raw`
WHERE date = '20170801' #56,989 件のレコード
;
Error: The number of columns in the column definition list does not match the number of columns produced by the query at [6:1]
上のクエリはどのテーブル作成ルールに違反していますか。
注: 新しいテーブルに対して指定するフィールドのスキーマは、クエリ ステートメントによって返される列の数に対応している必要があります。上の例では、fullVisitorId と channelGrouping の 2 つの列を含むスキーマが指定されていますが、クエリ ステートメントでは、返されるすべての列(*)が指定されています。
クエリ 3: 本当に有効か
- 以下のクエリを [クエリエディタ] に追加して [実行] をクリックし、エラーを診断したら、その後に続く質問に答えてください。
#standardSQL
# 探索対象の 1 日分の e コマースデータをコピー
CREATE OR REPLACE TABLE ecommerce.all_sessions_raw_20170801
#スキーマ
(
fullVisitorId STRING OPTIONS(description="Unique visitor ID"),
channelGrouping STRING OPTIONS(description="Channel e.g. Direct, Organic, Referral...")
)
OPTIONS(
description="Raw data from analyst team into our dataset for 08/01/2017"
) AS
SELECT fullVisitorId, city FROM `data-to-insights.ecommerce.all_sessions_raw`
WHERE date = '20170801' #56,989 件のレコード
;
Valid: This query will process 1.05 GB when run.
ルール 2 を思い出してください。列リストと as query_statement 句の両方が存在する場合、BigQuery は、as query_statement 句内の名前を無視し、位置をもとにして列を列リストに一致させます。
クエリ 4: ゲートキーパー
- 以下のクエリを [クエリエディタ] で実行し、エラーを診断したら、その後に続く質問に答えてください。
#standardSQL
# 探索対象の 1 日分の e コマースデータをコピー
CREATE OR REPLACE TABLE ecommerce.all_sessions_raw_20170801
#スキーマ
(
fullVisitorId STRING NOT NULL OPTIONS(description="Unique visitor ID"),
channelGrouping STRING NOT NULL OPTIONS(description="Channel e.g. Direct, Organic, Referral..."),
totalTransactionRevenue INT64 NOT NULL OPTIONS(description="Revenue * 10^6 for the transaction")
)
OPTIONS(
description="Raw data from analyst team into our dataset for 08/01/2017"
) AS
SELECT fullVisitorId, channelGrouping, totalTransactionRevenue FROM `data-to-insights.ecommerce.all_sessions_raw`
WHERE date = '20170801' #56,989 件のレコード
;
Valid: This query will process 907.52 MB when run.
- エラーを修正してクエリを再実行し、正常に実行されることを確認します。
クエリ 5: 正常に機能
- 以下のクエリを [クエリエディタ] で実行し、エラーを診断したら、その後に続く質問に答えてください。
#standardSQL
# 探索対象の 1 日分の e コマースデータをコピー
CREATE OR REPLACE TABLE ecommerce.all_sessions_raw_20170801
#スキーマ
(
fullVisitorId STRING NOT NULL OPTIONS(description="Unique visitor ID"),
channelGrouping STRING NOT NULL OPTIONS(description="Channel e.g. Direct, Organic, Referral..."),
totalTransactionRevenue INT64 OPTIONS(description="Revenue * 10^6 for the transaction")
)
OPTIONS(
description="Raw data from analyst team into our dataset for 08/01/2017"
) AS
SELECT fullVisitorId, channelGrouping, totalTransactionRevenue FROM `data-to-insights.ecommerce.all_sessions_raw`
WHERE date = '20170801' #56,989 件のレコード
;
-
ecommerce データセットのパネルを参照して、
all_sessions_raw_(1) が存在することを確認します。
完全なテーブル名が表示されないのはなぜですか。
答え: サフィックス 20170801 のテーブルは、日付によって自動的に分割されます。別の日のテーブルを作成すると、all_sessions_raw_(N) の N の値がその日数分だけ増加します。データテーブルを分割するさまざまな方法については、別のラボで取り扱っています。
クエリ 6: 実習
-
目標: クエリエディタで、2017 年 8 月 1 日のトランザクションのうち、収益を伴うものをすべて保存する新しい永続テーブルを作成します。
以下のルールを参考にしてください。
- ecommerce データセットに revenue_transactions_20170801 という名前の新しいテーブルを作成します。このテーブルがすでに存在する場合は置き換えます。
- 元データのソースに data-to-insights.ecommerce.all_sessions_raw テーブルを使用します。
- 収益フィールドを 1,000,000 で割り、INTEGER ではなく FLOAT64 として保存します。
- 収益があったトランザクションのみを最終的なテーブルに含めます(ヒント: WHERE 句を使用します)。
- 20170801 のトランザクションのみを含めます。
- 以下のフィールドを含めます。
- fullVisitorId(必須の文字列フィールドとして)
- visitId(必須の文字列フィールドとして。ヒント: 型変換が必要です)
- channelGrouping(必須の文字列フィールドとして)
- totalTransactionRevenue(FLOAT64 フィールドとして)
- 上の 4 つのフィールドの簡単な説明を追加します(スキーマを参照してください)。
-
fullVisitorId と visitId の値が同じレコードの重複除去を忘れないようにしてください(ヒント: DISTINCT を使用します)。
/*
BigQuery で上記に対する解答を記述し、下記の正解例と比較します
*/
正解例:
#standardSQL
# 探索対象の 1 日分の e コマースデータをコピー
CREATE OR REPLACE TABLE ecommerce.revenue_transactions_20170801
#スキーマ
(
fullVisitorId STRING NOT NULL OPTIONS(description="Unique visitor ID"),
visitId STRING NOT NULL OPTIONS(description="ID of the session, not unique across all users"),
channelGrouping STRING NOT NULL OPTIONS(description="Channel e.g. Direct, Organic, Referral..."),
totalTransactionRevenue FLOAT64 NOT NULL OPTIONS(description="Revenue for the transaction")
)
OPTIONS(
description="Revenue transactions for 08/01/2017"
) AS
SELECT DISTINCT
fullVisitorId,
CAST(visitId AS STRING) AS visitId,
channelGrouping,
totalTransactionRevenue / 1000000 AS totalTransactionRevenue
FROM `data-to-insights.ecommerce.all_sessions_raw`
WHERE date = '20170801'
AND totalTransactionRevenue IS NOT NULL #XX 件のトランザクション
;
-
クエリが正常に実行されたら、ecommerce データセットに revenue_transactions_20170801 という名前の新しいテーブルがあることを確認して、そのテーブルを選択します。
-
スキーマが以下の例のようになっていることを確認します。フィールドのタイプ、モード、説明(任意)に注目します。
![[スキーマ] タブページ](https://cdn.qwiklabs.com/S8WKDlSnA0L54GNqQtaSXUJdbY45%2B7HacxIG8tQchPU%3D)
上流のソースデータの更新に対処する
データが古くならないようにするには
レポート テーブルのデータが古くならないようにするには次の 2 つの方法があります。
- 新しいレコードを挿入するクエリを再実行して永続テーブルを定期的に更新する。これを行うには、BigQuery でクエリをスケジュールするか、Cloud Dataprep または Cloud Dataflow のワークフローを使用します。
- 論理ビューを使用して、ビューが選択されるたびに保存したクエリを再実行する。
以降では、論理ビューの作成方法について学びます。
タスク 3. ビューを作成する
ビューとは保存されたクエリのことで、ビューが呼び出されるたびにそれらのクエリが実行されます。BigQuery のビューは論理ビューであり、実体化されたビューではありません。つまり、ビューの構成要素として保存されるのはクエリのみで、基になるデータは保存されません。
トランザクションを新しい順に 100 件表示する
- 以下のクエリをコピーして貼り付け、BigQuery で実行します。
#standardSQL
SELECT DISTINCT
date,
fullVisitorId,
CAST(visitId AS STRING) AS visitId,
channelGrouping,
totalTransactionRevenue / 1000000 AS totalTransactionRevenue
FROM `data-to-insights.ecommerce.all_sessions_raw`
WHERE totalTransactionRevenue IS NOT NULL
ORDER BY date DESC # 最新のトランザクション
LIMIT 100
;
- 結果を調べます。
2,000 ドルを超えている最も新しいトランザクションはどれですか。
答え:
|
date
|
fullVisitorId
|
visitId
|
channelGrouping
|
totalTransactionRevenue
|
|
20170801
|
9947542428111966715
|
1501608078
|
Referral
|
2934.61
|
この ecommerce 一般公開データセットに新しいレコードが追加された場合、最も新しいトランザクションも更新されることになります。
- 時間を節約し、整理や共同作業をしやすくするために、よく使うレポートクエリをビューとして保存できます。以下に例を示します。
#standardSQL
CREATE OR REPLACE VIEW ecommerce.vw_latest_transactions
AS
SELECT DISTINCT
date,
fullVisitorId,
CAST(visitId AS STRING) AS visitId,
channelGrouping,
totalTransactionRevenue / 1000000 AS totalTransactionRevenue
FROM `data-to-insights.ecommerce.all_sessions_raw`
WHERE totalTransactionRevenue IS NOT NULL
ORDER BY date DESC # 最新のトランザクション
LIMIT 100
;
注: SELECT の対象がテーブルなのかビューなのかが、名前を見ただけではわかりにくいことがよくあります。そのため、ビュー名の先頭に vw_ を付けたり、末尾に _vw や _view を付けたりするのが慣例になっています。
-
OPTIONS を使用してビューに説明とラベルを付けることもできます。以下のクエリをコピーして貼り付け、BigQuery で実行します。
#standardSQL
CREATE OR REPLACE VIEW ecommerce.vw_latest_transactions
OPTIONS(
description="latest 100 ecommerce transactions",
labels=[('report_type','operational')]
)
AS
SELECT DISTINCT
date,
fullVisitorId,
CAST(visitId AS STRING) AS visitId,
channelGrouping,
totalTransactionRevenue / 1000000 AS totalTransactionRevenue
FROM `data-to-insights.ecommerce.all_sessions_raw`
WHERE totalTransactionRevenue IS NOT NULL
ORDER BY date DESC # 最新のトランザクション
LIMIT 100
;
-
ecommerce データセットで、新たに作成された vw_latest_transactions ビューを見つけて選択します。
-
[詳細] タブを選択します。
-
ビューに割り当てた説明とラベルが BigQuery の UI に正しく表示されていることを確認します。
[詳細] ページでは、ビューを定義しているクエリを表示することもできます。自分またはチームが作成したビューのロジックを把握するのに便利です。
- では、以下のクエリを実行して新しいビューを作成してみましょう。
#standardSQL
# 最新の 50 件のトランザクション
CREATE VIEW ecommerce.vw_latest_transactions # CREATE
OPTIONS(
description="latest 50 ecommerce transactions",
labels=[('report_type','operational')]
)
AS
SELECT DISTINCT
date,
fullVisitorId,
CAST(visitId AS STRING) AS visitId,
channelGrouping,
totalTransactionRevenue / 1000000 AS totalTransactionRevenue
FROM `data-to-insights.ecommerce.all_sessions_raw`
WHERE totalTransactionRevenue IS NOT NULL
ORDER BY date DESC # 最新のトランザクション
LIMIT 50
;
Error: Already Exists: Table project-name:ecommerce.vw_latest_transactions
このビューがすでに作成されている場合、おそらくエラーが発生します。なぜでしょうか。
答え: ビュー作成ステートメントが更新され、CREATE OR REPLACE ではなく単に CREATE となっているため、テーブルやビューがすでに存在する場合はそれらを上書きできません。第 3 の選択肢である CREATE VIEW IF NOT EXISTS を使用すると、テーブルやビューが存在しない場合にのみ作成され、存在する場合はエラーなしでスキップされます。
ビューの作成: 実習
シナリオ: あなたは不正防止を担当するチームから、注文金額が 1,000 以上のトランザクションを新しい順に 10 件表示するレポートを作成して、それらを手動で確認できるようにして欲しいと依頼されました。
タスク: 収益が 1,000 以上である 2017 年 1 月 1 日以降のトランザクションを、新しい順に 10 件返す新しいビューを作成します。
以下のルールを参考にしてください。
- ecommerce データセットに「vw_large_transactions」という名前の新しいビューを作成します。このビューがすでに存在する場合は置き換えます。
- そのビューに「large transactions for review」という説明を割り当てます。
- そのビューに「[("org_unit", "loss_prevention")]」というラベルを割り当てます。
- 元データのソースに
data-to-insights.ecommerce.all_sessions_raw テーブルを使用します。
- 収益フィールドを 1,000,000 で割ります。
- 収益が 1,000 以上のトランザクションのみを含めます。
- トランザクションを新しい順に並べて 20170101 以降のトランザクションのみを含めます。
- currencyCode = 'USD' のトランザクションのみを含めます。
- 以下のフィールドを返します。
- date
- fullVisitorId
- visitId
- channelGrouping
- totalTransactionRevenue AS revenue
- currencyCode
- v2ProductName
- レコードの重複除去を忘れないようにしてください(ヒント: DISTINCT を使用します)。
解答
/*
BigQuery で上記に対する解答を記述し、下記の正解例と比較します
*/
正解例:
#standardSQL
CREATE OR REPLACE VIEW ecommerce.vw_large_transactions
OPTIONS(
description="large transactions for review",
labels=[('org_unit','loss_prevention')]
)
AS
SELECT DISTINCT
date,
fullVisitorId,
visitId,
channelGrouping,
totalTransactionRevenue / 1000000 AS revenue,
currencyCode
#v2ProductName
FROM `data-to-insights.ecommerce.all_sessions_raw`
WHERE
(totalTransactionRevenue / 1000000) > 1000
AND currencyCode = 'USD'
ORDER BY date DESC # 最新のトランザクション
LIMIT 10
;
注: フィールド名のエイリアスをフィルタとして使用することはできないため、WHERE 句で除算を繰り返す必要があります。
追加の実習
シナリオ: 作成したクエリは不正防止担当チームに喜ばれ、疑わしい注文を見つけるために日々活用されています。そこで今度は、各注文に含まれる商品のサンプルをクエリの結果に含めるように依頼されました。
- BigQuery の文字列集計関数 STRING_AGG と
v2ProductName フィールドを使用して前のクエリを変更し、各注文に含まれる商品の名前をアルファベット順に 10 件返します。
正解例:
#standardSQL
CREATE OR REPLACE VIEW ecommerce.vw_large_transactions
OPTIONS(
description="large transactions for review",
labels=[('org_unit','loss_prevention')]
)
AS
SELECT DISTINCT
date,
fullVisitorId,
visitId,
channelGrouping,
totalTransactionRevenue / 1000000 AS totalTransactionRevenue,
currencyCode,
STRING_AGG(DISTINCT v2ProductName ORDER BY v2ProductName LIMIT 10) AS products_ordered
FROM `data-to-insights.ecommerce.all_sessions_raw`
WHERE
(totalTransactionRevenue / 1000000) > 1000
AND currencyCode = 'USD'
GROUP BY 1,2,3,4,5,6
ORDER BY date DESC # 最新のトランザクション
LIMIT 10
ここでは 2 つの要素が追加されています。1 つは、各注文の商品を集計するための STRING_AGG() です。もう 1 つは、集計を実行するために必要な、その他のフィールドの GROUP BY です。
ビューで SESSION_USER() を使用してデータアクセスを制限する
シナリオ: データチームのリーダーから、前述のビューによって返されるデータを表示できる組織内の人物を制限できるようにして欲しいと依頼されました。注文情報は特に機密性が高いため、必要なユーザー以外には共有されないようにする必要があります。
タスク: 先に作成したビューを変更して、セッション ドメインが qwiklabs.net のログイン ユーザーにのみ、基になるビューのデータ表示を許可するようにします(注: 特定のユーザー グループのホワイトリストは、アクセスに関する別のラボで作成します。ここでは、セッション ユーザーのドメインに基づいてユーザーを選別します)。
- 自分のセッションのログイン情報を表示するには、SESSION_USER() を使用する以下のクエリを実行します。
#standardSQL
SELECT
SESSION_USER() AS viewer_ldap;
xxxx@qwiklabs.net と表示されます。
- 以下のクエリを変更して、
qwiklabs.net ドメインのユーザーにのみビューの結果の表示を許可するフィルタを追加します。
#standardSQL
SELECT DISTINCT
SESSION_USER() AS viewer_ldap,
REGEXP_EXTRACT(SESSION_USER(), r'@(.+)') AS domain,
date,
fullVisitorId,
visitId,
channelGrouping,
totalTransactionRevenue / 1000000 AS totalTransactionRevenue,
currencyCode,
STRING_AGG(DISTINCT v2ProductName ORDER BY v2ProductName LIMIT 10) AS products_ordered
FROM `data-to-insights.ecommerce.all_sessions_raw`
WHERE
(totalTransactionRevenue / 1000000) > 1000
AND currencyCode = 'USD'
# ここにフィルタを追加
GROUP BY 1,2,3,4,5,6,7,8
ORDER BY date DESC # 最新のトランザクション
LIMIT 10
正解例:
#standardSQL
SELECT DISTINCT
SESSION_USER() AS viewer_ldap,
REGEXP_EXTRACT(SESSION_USER(), r'@(.+)') AS domain,
date,
fullVisitorId,
visitId,
channelGrouping,
totalTransactionRevenue / 1000000 AS totalTransactionRevenue,
currencyCode,
STRING_AGG(DISTINCT v2ProductName ORDER BY v2ProductName LIMIT 10) AS products_ordered
FROM `data-to-insights.ecommerce.all_sessions_raw`
WHERE
(totalTransactionRevenue / 1000000) > 1000
AND currencyCode = 'USD'
AND REGEXP_EXTRACT(SESSION_USER(), r'@(.+)') IN ('qwiklabs.net')
GROUP BY 1,2,3,4,5,6,7,8
ORDER BY date DESC # 最新のトランザクション
LIMIT 10
-
上のクエリを実行して、返されたレコードが表示されることを確認します。
-
REGEXP_EXTRACT(SESSION_USER(), r'@(.+)') IN ('') の IN フィルタからすべてのドメインを削除してクエリをもう一度実行し、返されたレコードが 1 つも表示されないことを確認します。
-
vw_large_transactions ビューを再作成して、上の新しいクエリで置き換えます。さらに、OPTIONS のパラメータに expiration_timestamp を追加して、ビュー全体の有効期限を今から 90 日に設定します。
expiration_timestamp=TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL 90 DAY).
正解例:
#standardSQL
CREATE OR REPLACE VIEW ecommerce.vw_large_transactions
OPTIONS(
description="large transactions for review",
labels=[('org_unit','loss_prevention')],
expiration_timestamp=TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL 90 DAY)
)
AS
#standardSQL
SELECT DISTINCT
SESSION_USER() AS viewer_ldap,
REGEXP_EXTRACT(SESSION_USER(), r'@(.+)') AS domain,
date,
fullVisitorId,
visitId,
channelGrouping,
totalTransactionRevenue / 1000000 AS totalTransactionRevenue,
currencyCode,
STRING_AGG(DISTINCT v2ProductName ORDER BY v2ProductName LIMIT 10) AS products_ordered
FROM `data-to-insights.ecommerce.all_sessions_raw`
WHERE
(totalTransactionRevenue / 1000000) > 1000
AND currencyCode = 'USD'
AND REGEXP_EXTRACT(SESSION_USER(), r'@(.+)') IN ('qwiklabs.net')
GROUP BY 1,2,3,4,5,6,7,8
ORDER BY date DESC # 最新のトランザクション
LIMIT 10;
注: expiration_timestamp オプションは永続テーブルにも適用できます。
- 以下の SELECT ステートメントを使用して、ビューで返されるデータを(現在のドメイン アクセス権で)表示できること、ビューの詳細に有効期限のタイムスタンプが表示されることを確認します。
#standardSQL
SELECT * FROM ecommerce.vw_large_transactions;
お疲れさまでした
ここでは、BigQuery で SQL DDL(データ定義言語)を使用してテーブルとアクセス制御ビューを作成しました。
ラボを終了する
ラボが完了したら、[ラボを終了] をクリックします。ラボで使用したリソースが Google Cloud Skills Boost から削除され、アカウントの情報も消去されます。
ラボの評価を求めるダイアログが表示されたら、星の数を選択してコメントを入力し、[送信] をクリックします。
星の数は、それぞれ次の評価を表します。
- 星 1 つ = 非常に不満
- 星 2 つ = 不満
- 星 3 つ = どちらともいえない
- 星 4 つ = 満足
- 星 5 つ = 非常に満足
フィードバックを送信しない場合は、ダイアログ ボックスを閉じてください。
フィードバックやご提案の送信、修正が必要な箇所をご報告いただく際は、[サポート] タブをご利用ください。
Copyright 2026 Google LLC All rights reserved. Google および Google のロゴは、Google LLC の商標です。その他すべての社名および製品名は、それぞれ該当する企業の商標である可能性があります。