SnowPro Core認定資格チートシート

# 概要
SnowPro Core認定資格に合格するためのチートシート

https://learn.snowflake.com/en/certifications/snowpro-core-jpn%20/

試験概要
- バージョン：COF-C02
- 試験方式：テストセンター
- 問題数：100問
- 時間：115分
- 合格点：750点/1000点

試験分野
- 1.0 Snowflake AI Data Cloud の機能とアーキテクチャ（25%）
- 2.0 アカウント アクセスとセキュリティ（20%）
- 3.0 パフォーマンスの概念（15%）
- 4.0 データのロードとアンロード（10%）
- 5.0 データ変換（20%）
- 6.0 データ保護とデータシェアリング（10%）

# 学習教材
公式ドキュメント

https://docs.snowflake.com/ja/user-guide-getting-started

udemy

https://www.udemy.com/course/ultimate-snowpro-core-certification-course-exam/?couponCode=ST11MT91624A

https://www.udemy.com/course/snowflake-snowpro-core-certification-exam-practice-sets/?couponCode=ST11MT91624A

その他参考記事

https://blog.truestar.co.jp/snowflake/20231006/56553/

# 1.0 Snowflake AI Data Cloud の機能とアーキテクチャ（25%）
## 1.1 Snowflakeデータクラウドの主要機能の概要を説明する
:::note info
ポイント
・3つのレイヤーの特徴
・各クラウドの特徴
・エディションの違い
:::

https://docs.snowflake.com/ja/user-guide-intro

3つのレイヤー
- データベースストレージ：列指向方式のデータを保存
- クエリ処理：仮想ウェアハウスを使用してクエリを処理
- クラウドサービス：アクティビティを調整する
    - 認証
    - インフラ管理
    - メタデータ管理
    - クエリ最適化
    - アクセス制御

サポート対象のクラウドプラットフォーム
- AWS
- GCP
- Azure

サポートされているリージョン
- 北米および南米リージョン
- ヨーロッパおよび中東リージョン
- アジア太平洋リージョン

エディションの概要
- Standard Edition：標準機能への完全かつ無制限のアクセスを提供する入門レベルの製品
- Enterprise Edition：スタンダードのすべての機能＋αを提供
- Business Critical Edition：エンタープライズのすべての機能＋セキュリティと障害復旧機能を強化
- Virtual Private Snowflake（VPS）：最高レベルのセキュリティを提供．他アカウントから分離されておりデフォルトではデータ共有できない

## 1.2 主要なSnowflakeのツールとユーザーインターフェースの概要を説明する
:::note info
ポイント
・Snowflakeへの接続方法の違い
:::
https://docs.snowflake.com/ja/guides-overview-connecting

https://docs.snowflake.com/ja/developer

Snowflakeへの接続方法
- Snowsight：SQLまたはPythonを使用してSnowflakeデータを操作するための統一されたエクスペリエンスを提供
- SnowSQL：Snowflakeに接続してSQLクエリを実行するコマンドラインクライアント
- Snowflakeコネクタ：サードパーティアプリケーションとデータベースシステムの統合を提供
- Snowflakeドライバー：Go，C#，Pythonなどの言語を使用してSnowflakeで操作を実行するアプリケーションを作成できる
- Snowpark：java，Python，Scalaの3つの言語のSnowparkライブラリを使用したデータ操作を提供
- SnowCD： Snowflakeへのネットワーク接続の評価とトラブルシューティングに役立つ一連の接続チェックを実行する

## 1.3 Snowflakeのカタログとオブジェクトの概要を説明する。
:::note info
ポイント
・各オブジェクトの概要
:::
https://docs.snowflake.com/ja/guides-overview-db

- **データベース（Database）**
    複数のスキーマやテーブル，ビューなどを含む，データを整理するための論理的コンテナ．
    ```sql
    -- データベースの作成
    CREATE DATABASE my_database;
    
    -- データベースの削除
    DROP DATABASE my_database;
    
    -- 使用するデータベースを指定
    USE DATABASE my_database;
    
    ```
- **ステージ（Stage）**
    Snowflakeにデータをロードするための中間ストレージエリア．内部ステージと外部ステージ（S3やGCSなど）がある．
    ```sql
    -- 内部ステージの作成
    CREATE STAGE my_stage;
    
    -- データをステージにコピー
    PUT file:///path/to/file.csv @my_stage;
    
    -- ステージからデータをテーブルにロード
    COPY INTO my_table FROM @my_stage;
    
    ```
- **スキーマ（Scheme）**
    スキーマはデータベース内のオブジェクトをグループ化するための論理的な構造．パーマネントスキーマや一時的なスキーマなどがある．
    ```sql
    -- スキーマの作成
    CREATE SCHEMA my_schema;
    
    -- スキーマの削除
    DROP SCHEMA my_schema;
    
    ```
- **テーブル（Table）**
    Snowflakeのテーブルには，パーマネントテーブル，トランジエントテーブル，一時的テーブルがある
    ```sql
    -- パーマネントテーブルの作成
    CREATE TABLE my_table (id INT, name STRING);
    
    -- 一時的テーブルの作成
    CREATE TEMPORARY TABLE temp_table (id INT, name STRING);
    
    -- テーブルの削除
    DROP TABLE my_table;
    
    ```
- **ビュー（View）**
    Snowflakeのビューには，通常のビュー，マテリアライズドビュー，セキュアビューがある．
    ```sql
    -- 通常のビューの作成
    CREATE VIEW my_view AS SELECT * FROM my_table;
    
    -- セキュアビューの作成
    CREATE SECURE VIEW secure_view AS SELECT * FROM my_table WHERE sensitive_column IS NULL;
    
    -- マテリアライズドビューの作成
    CREATE MATERIALIZED VIEW mat_view AS SELECT * FROM my_table;
    
    ```
- **データ型（Data Types）**
    テーブルのカラムに使われるデータの種類．INTEGER，STRING，BOOLEAN，DATEなど
    ```sql
    -- テーブルの作成時にデータ型を指定
    CREATE TABLE my_table (
      id INTEGER, 
      name STRING, 
      is_active BOOLEAN, 
      created_at DATE
    );
    
    ```
- **ユーザー定義関数（UDF: User Defined Function）**
    カスタムロジックを含む関数を定義してSnowflake内で再利用できるようにする．JavaScriptやSQLで作成可能．
    ```sql
    -- SQL UDFの作成
    CREATE FUNCTION my_udf(x INT)
    RETURNS INT
    LANGUAGE SQL
    AS 'x * 2';
    
    -- UDFの使用
    SELECT my_udf(5); -- 10
    
    ```
- **ユーザー定義テーブル関数（UDTF: User Defined Table Function）**
    複数の結果を返すテーブル形式のユーザー定義関数．複数行を返すことが可能．
    ```sql
    -- SQL UDTFの作成
    CREATE FUNCTION my_udtf()
    RETURNS TABLE (id INT, name STRING)
    LANGUAGE SQL
    AS 'SELECT * FROM my_table';
    
    -- UDTFの使用
    SELECT * FROM TABLE(my_udtf());
    
    ```
- **ストリーム（Stream）**
    テーブルの変更履歴を追跡するオブジェクト．データ変更のキャプチャ（CDC）に使用される．
    ```sql
    -- ストリームの作成
    CREATE STREAM my_stream ON TABLE my_table;
    
    -- ストリームの内容を確認
    SELECT * FROM my_stream;
    
    ```
- **タスク（Task）**
    定期的に実行されるクエリやストアドプロシージャを定義するためのスケジュール管理オブジェクト．
    ```sql
    -- タスクの作成
    CREATE TASK my_task
    WAREHOUSE = my_warehouse
    SCHEDULE = 'USING CRON 0 * * * *'
    AS
    INSERT INTO my_table (id, name) VALUES (1, 'John');
    
    -- タスクの開始
    ALTER TASK my_task RESUME;
    
    ```
- **パイプ（Pipe）**
    Snowpipeを使用してデータファイルを自動的にステージからテーブルにロードするオブジェクト．
    ```sql
    -- パイプの作成
    CREATE PIPE my_pipe AS
    COPY INTO my_table
    FROM @my_stage
    FILE_FORMAT = (TYPE = 'CSV');
    
    -- パイプのステータスを確認
    SHOW PIPES;
    
    ```
- **共有（Share）**
    データベースやスキーマ，テーブルを他のSnowflakeアカウントと安全に共有するための機能．
    ```sql
    -- データ共有の作成
    CREATE SHARE my_share;
    
    -- テーブルを共有に追加
    GRANT SELECT ON my_table TO SHARE my_share;
    
    ```
- **シーケンス（Sequence）**
    自動的に増加する整数を生成するためのオブジェクト．主にIDやカウンタに使用．
    ```sql
    -- シーケンスの作成
    CREATE SEQUENCE my_sequence START = 1 INCREMENT = 1;
    
    -- シーケンスの次の値を取得
    SELECT my_sequence.NEXTVAL;
    
    ```

## 1.4 Snowflakeのストレージ概念の概要を説明する。
:::note info
ポイント
・マイクロパーティション
・データクラスタリング
・データストレージのモニタリング
:::

https://docs.snowflake.com/ja/user-guide/tables-micro-partitions
- **マイクロパーティション**
    データを効率的に管理・圧縮して保存する小さなストレージ単位．
  - 自動でパーティションに分割される
  - サイズは圧縮前で50~500MB
  - 列指向で保存される**
- **データクラスタリング**
    テーブル内のデータを特定の列（クラスタキー）に基づいて物理的に整理しクエリのパフォーマンスを向上させる手法．
- **データストレージのモニタリング**
    ストレージの使用量やコストをモニタリングするための機能が提供されている．`INFORMATION_SCHEMA`や`ACCOUNT_USAGE`のビューを使ってテーブルごとのストレージ使用量，タイムトラベルやFail-safeによるストレージ消費などを確認できる．
    

# 2.0 アカウント アクセスとセキュリティ（20%）
## 2.1 セキュリティ原則の概要を説明する
:::note info
ポイント
● ネットワークセキュリティとポリシー
● 多要素認証(MFA)
● フェデレーション認証
● キーペア認証
● シングルサインオン(SSO)
:::
https://docs.snowflake.com/ja/guides-overview-secure

- **ネットワークセキュリティとポリシー**: IPアドレスの制御でアクセスを制限
    ```sql
    -- 新しいネットワークポリシーを作成して特定のIPアドレスのみ許可
    CREATE NETWORK POLICY my_policy
      ALLOWED_IP_LIST = ('192.168.1.0/24', '203.0.113.0/24')
      BLOCKED_IP_LIST = ('0.0.0.0/0');
    
    -- ユーザーにネットワークポリシーを適用
    ALTER USER my_user SET NETWORK_POLICY = my_policy;
    
    ```
- **多要素認証 (MFA)**: パスワードに加えて二次認証を設定
- **フェデレーション認証**: 組織のIdPを使用してSSOでアクセス管理
- **キーペア認証**: 公開鍵と秘密鍵を使ったセキュアな認証方法
- **シングルサインオン** (SSO): 一度のログインで複数のサービスにアクセス


## 2.2 Snowflakeで使用されるエンティティとロールを定義する。
:::note info
ポイント
・アクセス制御のフレームワーク
・アクセス制御権限
・権限の付与方法と取り消し方法の概要について
・ロールの階層と権限の継承について
:::
https://docs.snowflake.com/ja/user-guide/security-access-control-overview

**アクセス制御フレームワーク**
アクセス制御に対するSnowflakeのアプローチは，任意アクセス制御（DAC）とロールベースのアクセス制御（RBAC）を組み合わせている．
- 任意アクセス制御（DAC）
    各オブジェクトには所有者があり、所有者はそのオブジェクトへのアクセス権を付与できる．
- ロールベースのアクセス制御（RBAC）
    アクセス権限がロールに割り当てられ，ロールはユーザーに割り当てられる

**アクセス制御の構成要素**
- ユーザー
    Snowflakeにアクセスするエンドユーザー
- ロール
    権限を保持するオブジェクトでユーザーに割り当てられる．ロールは他のロールを所有し階層構造を形成する．
- 権限
    データベースオブジェクトに対する操作権限（例: SELECT, INSERT, UPDATE, DELETE など）．
- オブジェクト
    テーブル、ビュー、スキーマ、データベース、ステージなどのリソース．

**アクセス制御権限の種類**
- SELECT: テーブルやビューからデータを読み取る
- INSERT: テーブルにデータを挿入する
- UPDATE: テーブルのデータを更新する
- DELETE: テーブルからデータを削除する
- USAGE: スキーマやデータベースを利用する
- OWNERSHIP: オブジェクトを完全に管理するための最高権限．オブジェクトの削除や他の権限の付与/取り消しが可能． 

**権限の付与方法と取り消し方法の概要について**
ロールに権限を付与または取り消しすることにより、オブジェクトに対するアクセスを管理します
```sql
-- テーブルへのSELECT権限をロールに付与
GRANT SELECT ON TABLE my_table TO ROLE my_role;

-- スキーマの全テーブルへのINSERT権限をロールに付与
GRANT INSERT ON ALL TABLES IN SCHEMA my_schema TO ROLE my_role;

-- データベースのUSAGE権限をロールに付与
GRANT USAGE ON DATABASE my_database TO ROLE my_role;

```

```sql
-- テーブルからSELECT権限をロールから取り消し
REVOKE SELECT ON TABLE my_table FROM ROLE my_role;

-- スキーマの全テーブルからINSERT権限をロールから取り消し
REVOKE INSERT ON ALL TABLES IN SCHEMA my_schema FROM ROLE my_role;

-- データベースからUSAGE権限をロールから取り消し
REVOKE USAGE ON DATABASE my_database FROM ROLE my_role;

```

**ロールの階層と権限の継承について**
ロールは階層的に構造化されており上位のロールは下位のロールの権限を継承する．
```sql
-- 新しいロールの作成
CREATE ROLE analyst_role;
CREATE ROLE senior_analyst_role;

-- analyst_roleをsenior_analyst_roleに割り当てる
GRANT ROLE analyst_role TO ROLE senior_analyst_role;

-- senior_analyst_roleをユーザーに割り当てる
GRANT ROLE senior_analyst_role TO USER john_doe;

-- ロール階層確認
SHOW GRANTS TO ROLE senior_analyst_role;

```

## 2.3 Snowflakeのデータガバナンス機能の概要を説明する。
:::note info
ポイント
● アカウント
● 組織
● セキュアビュー
● セキュアファンクション
● 情報スキーマ
● アクセス履歴
○ 読み取り/書き込み操作の追跡
● 行/列レベルのセキュリティの概要
● オブジェクトタグ
:::
https://docs.snowflake.com/ja/guides-overview-govern

- **アカウント**: Snowflake全体のリソースを管理する単位
- **組織**: 複数のアカウントを一括管理するための構造
- **セキュアビュー**: データ定義を隠してデータを保護するビュー
    ```sql
    -- セキュアビューの作成
    CREATE SECURE VIEW secure_sales_view AS
    SELECT * FROM sales WHERE region = 'APAC';
    
    -- セキュアビューの表示
    SHOW VIEWS IN SCHEMA my_schema;
    
    ```
- **セキュアファンクション**: ファンクションのロジックを隠すためのセキュアな関数
```sql
-- セキュアファンクションの作成
CREATE SECURE FUNCTION my_secure_function(x INT)
RETURNS INT
AS 'x * 2';

-- セキュアファンクションの表示
SHOW FUNCTIONS LIKE 'my_secure_function';

```
- **情報スキーマ**: メタデータやシステム情報の照会に使用されるスキーマ
```sql
-- テーブルのメタデータ情報の取得
SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'my_schema';

```
- **アクセス履歴**: 読み取り/書き込み操作の追跡に使用
```sql
SELECT * FROM SNOWFLAKE.ACCOUNT_USAGE.ACCESS_HISTORY;
```
- **行/列レベルのセキュリティ**: 特定のデータへのアクセス制御
- **オブジェクトタグ**: データオブジェクトにタグを付けて分類・管理する機能

# 3.0 パフォーマンスの概念（15%）
## 3.1 クエリプロファイルの使い方を説明する。
:::note info
ポイント
● 計画について説明する
● データのスピル
● データキャッシュの使用
● マイクロパーティションプルーニング
● クエリ履歴
:::
https://docs.snowflake.com/ja/guides-overview-performance
- クエリプランの表示
    ```sql
    -- クエリの実行計画を表示する
    EXPLAIN SELECT * FROM my_table WHERE id = 100;

    ```
- データのスピル
    クエリの実行中にウェアハウスのメモリが不足してローカルディスクストレージにデータを退避させる動作のこと．snowpark最適化WHに変更することで解決する．
    ```sql
    ALTER WAREHOUSE SUSPEND;
    ALTER WAREHOUSE my_analytics_wh SET WAREHOUSE_TYPE='snowpark-optimized';
    ```
- データのキャッシュ
    同じWHで同一のクエリが実行されるとデータキャッシュを使用して高速化する．

- クエリ履歴は過去7日以内のアクティビティを返す
```sql
select *
from table(information_schema.query_history())
order by start_time;
```

https://docs.snowflake.com/ja/sql-reference/functions/query_history

## 3.2 仮想ウェアハウスの構成を説明する。
:::note info
ポイント
● ウェアハウスのタイプ
● マルチクラスターウェアハウス
　○ スケーリングポリシー
　○ スケーリングモード
● ウェアハウスのサイジング
● ウェアハウスの設定とアクセス
:::
https://docs.snowflake.com/ja/user-guide/warehouses

仮想ウェアハウスの概要: Snowflakeの計算リソース
- XS~6XLまでの10サイズある
- サイズが1つ上がるごとにクレジットの消費量が2倍になる
- 最小起動時間は60秒
```sql
-- 小規模ウェアハウスの作成
CREATE WAREHOUSE my_warehouse
WITH WAREHOUSE_SIZE = 'SMALL'
AUTO_SUSPEND = 300
AUTO_RESUME = TRUE;

```

マルチクラスターウェアハウス: 、複数のクラスターを自動で起動・停止することで，処理能力を動的にスケーリングできるウェアハウス．
- スケーリングポリシー
    マルチクラスターウェアハウスがクラスターをどのようにスケールするかを定義する
    - Standard（デフォルト）
        クラスターが必要に応じてすぐに追加されるためパフォーマンスを優先する
    - Economy
        クラスターを段階的に追加または削除するためリソースの消費を抑えたい場合に使用する
        ```sql
        ALTER WAREHOUSE mywh SET SCALING_POLICY = 'ECONOMY';
        ```

## 3.3 仮想ウェアハウスのパフォーマンスツールの概要を説明する。
:::note info
ポイント
● ウェアハウス負荷のモニタリング
● スケールアップとスケールアウトの比較
● リソースモニター
● クエリアクセラレーションサービス
:::
https://docs.snowflake.com/ja/user-guide/warehouses

- スケールアップ
    ウェアハウスのサイズを大きくすることでクエリの処理能力を向上させる
    ```sql
    -- ウェアハウスのサイズをアップグレード
    ALTER WAREHOUSE my_warehouse SET WAREHOUSE_SIZE = 'XLARGE';
    ```
- スケールアウト
    マルチクラスターウェアハウスでクラスター数を増加させ同時実行クエリを分散処理することで全体のスループットを向上させる
    ```sql
    -- マルチクラスターウェアハウスの最大クラスター数を増加
    ALTER WAREHOUSE my_multi_cluster_warehouse SET MAX_CLUSTER_COUNT = 5;
    ```
- リソースモニター
    クレジット消費を監視し上限に達した際の通知や自動停止機能を提供する
    ```sql
    -- リソースモニターの作成
    CREATE RESOURCE MONITOR my_resource_monitor
    WITH CREDIT_QUOTA = 100
    TRIGGERS ON 90 PERCENT DO SUSPEND
    ON 100 PERCENT DO NOTIFY;
    -- ウェアハウスにリソースモニターを割り当て
    ALTER WAREHOUSE my_warehouse SET RESOURCE_MONITOR = my_resource_monitor;
    
    ```    
- クエリアクセラレーションサービス
    高負荷なクエリの実行速度を改善するために動的に追加リソースを割り当てる機能
    ```sql
    CREATE WAREHOUSE my_wh WITH
      ENABLE_QUERY_ACCELERATION = true;
    ```

## 3.4 クエリパフォーマンスを最適化する。
:::note info
ポイント
● マテリアライズドビューの使い方について説明する
● 特定のSELECTコマンドの使い方
● クラスタリング
● 検索最適化サービス
● 保存済みのクエリ結果
● キャッシュのタイプごとの影響を理解する
○ メタデータキャッシュ
○ 結果キャッシュ
○ ウェアハウスキャッシュ
:::
https://docs.snowflake.com/ja/user-guide/performance-query-storage

- マテリアライズドビュー
    クエリ結果を物理的に保存することでクエリのパフォーマンスが向上する．エンタープライズエディション以上で使用可能
- クラスタリング
    クラスタリングキーとして列を指定することで，マイクロパーティションの格納場所を最適化される．
- 検索最適化サービス
    大きなテーブルをスキャンして記録の小さなサブセットを返す ポイントルックアップクエリ のパフォーマンスを向上させることができ
- キャッシュ
    - メタデータキャッシュ：テーブルの構造情報（スキーマやインデックスなど）をキャッシュするもの
    - 結果キャッシュ：過去のクエリ結果を保存し，同一クエリが再実行された際にその結果を返すも．
    - ウェアハウスキャッシュ：ウェアハウスがデータを読み込む際に使用するキャッシュ．同様のクエリが実行された際に読み込み速度が向上する．


# 4.0 データのロードとアンロード（10%）
4.1 データのロード時に考慮すべき概念とベストプラクティスを定義する。

:::note info
ポイント
● ステージとステージタイプ
● ファイルサイズと形式
● フォルダ構造
● アドホック/バルクロード
● Snowpipe
:::
https://docs.snowflake.com/ja/guides-overview-loading-data

ステージタイプ
- 外部ステージ
    S3, GCS, Azureのクラウドストレージと接続してデータをロードする．Snowflakeアカウントがホストされているクラウドとは別のクラウドサービスでも良い．
    ``` sql 
    -- S3バケットを指す外部ステージの作成
    CREATE OR REPLACE STAGE my_external_stage
    URL = 's3://mybucket/path/'
    CREDENTIALS = (AWS_KEY_ID='my_key' AWS_SECRET_KEY='my_secret');
    
    
    -- LIST or lsコマンドでステージへアクセスする
    LIST/ls @my_external_stage
    ```
- 内部ステージ：snowflakeアカウント内部で管理するステージ
    - ユーザーステージ：各ユーザーに自動的に割り当てられるステージ
    ```sql
    LIST/ls @~;
    ```
    - テーブルステージ：各テーブルに自動的に割り当てられるステージ
    ```sql
    LIST/ls @%MY_TABLE;
    ```
    - 名前付きステージ：スキーマ内にCREATE STAGEコマンドでオブジェクトとして作成する
    ```sql
    LIST/ls @MY_STAGE;
    ```

ロードできるファイルフォーマット
- 区切りファイル（CSV, TSVなど）
- JSON
- Avro
- ORC
- Parquet
- XML

- バルクロード
    ステージ内のデータをテーブルに一括ロードする
    ```sql
    -- 外部ステージから複数ファイルをバルクロード
    COPY INTO my_table
    FROM @my_external_stage
    FILE_FORMAT = (FORMAT_NAME = 'my_csv_format')
    PATTERN = '.*\.csv'; -- CSVファイルすべてを対象
    ```
- Snowpipe
    ステージにデータが追加されると自動的にSnowflake内のテーブルにデータを取り込む仕組み.
    WHを使用しない．
    メタデータの保存期間は14日
    ```sql
    -- Snowpipeを作成して、S3から自動でデータをロード
    CREATE OR REPLACE PIPE my_pipe
    AUTO_INGEST = TRUE
    AS
    COPY INTO my_table
    FROM @my_external_stage
    FILE_FORMAT = (FORMAT_NAME = 'my_csv_format');
    ```


4.2 データのロードに使うさまざまなコマンドと使うべきタイミングの概
要を説明する。

:::note info
● CREATE STAGE
● CREATE FILE FORMAT
● CREATE PIPE
● CREATE EXTERNAL TABLE
● COPY INTO
● INSERT/INSERT OVERWRITE
● PUT
● VALIDATE
:::
https://docs.snowflake.com/ja/sql-reference/commands-data-loading

- CREATE STAGE：新しい名前付きの 内部 または 外部 ステージを作成
    ```sql
    CREATE STAGE my_int_stage
      COPY_OPTIONS = (ON_ERROR='skip_file');
    ```

- CREATE FILE FORMAT：ステージングされたデータのセットを記述する名前付きファイル形式
    ```sql
    CREATE OR REPLACE FILE FORMAT my_csv_format
      TYPE = CSV
      FIELD_DELIMITER = '|'
      SKIP_HEADER = 1
      NULL_IF = ('NULL', 'null')
      EMPTY_FIELD_AS_NULL = true
      COMPRESSION = gzip;
    ```

- CREATE PIPE：snowpipeが使用するCOPY INTOステートメントを定義する
    ```sql
    create pipe mypipe_s3
      auto_ingest = true
      aws_sns_topic = 'arn:aws:sns:us-west-2:001234567890:s3_mybucket'
      as
      copy into snowpipe_db.public.mytable
      from @snowpipe_db.public.mystage
      file_format = (type = 'JSON');
    ```

- CREATE EXTERNAL TABLE：現在の指定されたスキーマに新しい外部テーブルを作成する
    ```sql
    CREATE EXTERNAL TABLE et1(
     date_part date AS TO_DATE(SPLIT_PART(metadata$filename, '/', 3)
       || '/' || SPLIT_PART(metadata$filename, '/', 4)
       || '/' || SPLIT_PART(metadata$filename, '/', 5), 'YYYY/MM/DD'),
     timestamp bigint AS (value:timestamp::bigint),
     col2 varchar AS (value:col2::varchar))
     PARTITION BY (date_part)
     LOCATION=@s1/logs/
     AUTO_REFRESH = true
     FILE_FORMAT = (TYPE = PARQUET)
     AWS_SNS_TOPIC = 'arn:aws:sns:us-west-2:001234567890:s3_mybucket';
    ```

- COPY INTO：ステージングされたファイルから既存のテーブルにデータをロード
    ```sql
    COPY INTO mytable
      FROM s3://mybucket/data/files
      STORAGE_INTEGRATION = myint
      ENCRYPTION=(MASTER_KEY = 'eSx...')
      FILE_FORMAT = (FORMAT_NAME = my_csv_format);
    ```

- INSERT/INSERT OVERWRITE：テーブルに1つ以上の行を挿入して、テーブルを更新
    ```sql
    -- OVERWRITE オプションを使用すると古い行はなくなる
    INSERT OVERWRITE INTO sf_employees
      SELECT * FROM employees
      WHERE city = 'San Francisco';
    ```

- PUT：ローカルファイルシステムからSnowflakeステージにデータファイルをアップロードします
    ```sql
    PUT file:///tmp/data/mydata.csv @my_int_stage;
    ```

- VALIDATE：COPY INTOコマンドの過去の実行でロードされたファイルを検証しエラーを返す
    ```sql
    SELECT * FROM TABLE(VALIDATE(t1, JOB_ID => '_last'));
    ```

4.3 データのアンロード時に考慮すべき概念とベストプラクティスを定義する。

:::note info
● ファイルサイズと形式
○ 圧縮方法の概要
● 空の文字列とNULL値
● 単一ファイルへのアンロード
● リレーショナルテーブルのアンロード
:::
https://docs.snowflake.com/ja/user-guide/data-unload-considerations

4.4 データのアンロードに使うさまざまなコマンドと使うべきタイミングの概要
を説明する。

:::note info
● GET
● LIST
● COPY INTO
● CREATE STAGE
● CREATE FILE FORMAT
:::
https://docs.snowflake.com/ja/sql-reference/commands-data-loading

- GET：内部ステージからクライアントマシン上のローカルディレクトリまたはフォルダーにデータファイルをダウンロード
    ```sql
    GET @%mytable file:///tmp/data/;
    ```

- COPY INTO：テーブル（またはクエリ）からステージ上ののファイルにデータをアンロードします
    ```sql
    COPY INTO 's3://mybucket/unload/'
      FROM mytable
      STORAGE_INTEGRATION = myint
      FILE_FORMAT = (FORMAT_NAME = my_csv_format);
    ```

    
# 5.0 データ変換（20%）
## 5.1 標準データの操作方法を説明する
:::note info
● 推定関数
● サンプリング
○ SAMPLEコマンド
○ TABLESAMPLEコマンド
○ サンプリング方法
■ 抽出率ベース
■ 固定サイズ
● 対応している関数の種類
○ システム関数
○ テーブル関数
○ 外部関数
○ ユーザー定義関数(UDF)
● ストアドプロシージャ
● ストリーム
● タスク
:::
https://docs.snowflake.com/ja/sql-reference/functions/approx_count_distinct

https://docs.snowflake.com/ja/sql-reference/constructs/sample

https://docs.snowflake.com/ja/sql-reference/intro-summary-operators-functions

- 推定関数
    非常に大規模なデータセットに対し精度は落ちるが計算を高速化するために使用される
    ```sql
    -- 大規模データセットで一意の値の推定数を計算する
    SELECT APPROX_COUNT_DISTINCT(customer_id) FROM sales_data;
    ```
- サンプリング
    テーブル内のデータをランダムに抽出する
    ```sql
    -- テーブルからランダムに10%のデータを抽出
    SELECT * FROM my_table SAMPLE (10);
    ```
- システム関数
    システムでアクションを実行したり情報を返す関数
    ```sql
    -- クエリをキャンセルする
    SELECT SYSTEM$CANCEL_QUERY('d5493e36-5e38-48c9-a47c-c476f2111ce5');

    -- パイプのステータスを確認する
    SELECT SYSTEM$PIPE_STATUS('mydb.myschema.mypipe');
    ```
- テーブル関数
    テーブル全体を返す関数．データの操作や変換に使用される
    ```sql
    -- 指定したユーザーの最新のログインイベントを1000個まで取得する
    select *
    from table(information_schema.login_history_by_user(USER_NAME => 'USER1', result_limit => 1000))
    order by event_timestamp;
    ```
- 外部関数
    Snowflake外で保存および実行されるユーザー定義関数

## 5.2 半構造化データの操作方法を説明する
:::note info
● 対応しているデータ形式、データ型、サイズ
● VARIANT列
● ネストされた構造のフラット化
○ FLATTENコマンド
○ LATERAL FLATTENコマンド
● 半構造化データ関数
○ ARRAY/OBJECTの作成と操作
○ 値の抽出
○ 型述語
:::
https://docs.snowflake.com/ja/user-guide/querying-semistructured

対応しているデータ形式
- JSON
- Avro
- ORC
- Parquet
- XML

データ型
- VARIANT: JSON形式のような多様なデータ型を格納可能な柔軟な型．最大サイズは16 MB
- ARRAY: 順序付きのリストを保持
- OBJECT: キーと値のペアを保持するハッシュマップ

ネストされた構造のフラット化
- FLATTEN：ネストされた値を個別の列に展開する
    ```sql
    CREATE TABLE pets (v variant);
    
    INSERT INTO pets SELECT PARSE_JSON ('{"species":"dog", "name":"Fido", "is_dog":"true"} ');
    INSERT INTO pets SELECT PARSE_JSON ('{"species":"cat", "name":"Bubby", "is_dog":"false"}');
    INSERT INTO pets SELECT PARSE_JSON ('{"species":"cat", "name":"dog terror", "is_dog":"false"}');
    
    SELECT a.v, b.key, b.value FROM pets a,LATERAL FLATTEN(input => a.v) b
    WHERE b.value LIKE '%dog%';
    
    +-------------------------+---------+--------------+
    | V                       | KEY     | VALUE        |
    |-------------------------+---------+--------------|
    | {                       | species | "dog"        |
    |   "is_dog": "true",     |         |              |
    |   "name": "Fido",       |         |              |
    |   "species": "dog"      |         |              |
    | }                       |         |              |
    | {                       | name    | "dog terror" |
    |   "is_dog": "false",    |         |              |
    |   "name": "dog terror", |         |              |
    |   "species": "cat"      |         |              |
    | }                       |         |              |
    +-------------------------+---------+--------------+
    ```
- LATERAL 修飾子はデータをオブジェクトの外部の情報と結合する
    ```sql
    SELECT
      value:name::string as "Customer Name",
      value:address::string as "Address"
      FROM
        car_sales
      , LATERAL FLATTEN(INPUT => SRC:customer);
    ```


半構造化データ関数
- 値の抽出
    - ドット表記
        ```sql
        SELECT src:salesperson.name
        FROM car_sales
        ORDER BY 1;
        ```
    - 括弧表記
        ```sql
        SELECT src['salesperson']['name']
        FROM car_sales
        ORDER BY 1;
        ```
    - GET関数
        ```sql
        SELECT GET(SRC, 'empployee')
        FROM EMPLOYEE;
        ```
- 値のキャスト
    ```sql
    SELECT src:vehicle[0].price::NUMBER * 0.10 AS tax
        FROM car_sales
        ORDER BY tax;
    ```

## 5.3 非構造化データの操作方法を説明する
:::note info
● ディレクトリテーブルの定義と使用
● SQLファイル関数
○ ファイルへのアクセスに使用できるURLの種類
● データ分析用ユーザー定義関数(UDF)の目的の概要
:::
https://docs.snowflake.com/ja/user-guide/unstructured-intro

- ディレクトリテーブル
    Snowflakeの外部ステージに格納されたファイルのメタデータを保存しSQLクエリで参照できる機能
    ```sql
    - ディレクトリテーブルを含むmystageという名前の内部ステージを作成
    CREATE STAGE mystage
      DIRECTORY = (ENABLE = TRUE)
      FILE_FORMAT = myformat;
    ```
- SQL関数
    ディレクトリテーブル内のデータファイルにアクセスする関数
    ```sql
    -- 外部ステージのURLを取得
    SELECT GET_STAGE_LOCATION(@images_stage);
    ```
- ファイルアクセスに使用できるURL
    - スコープURL：ステージに権限を付与せずにステージングされたファイルへの一時的なアクセスを許可
    - ファイルURL：ステージに対する十分な権限を持つロールがファイルにアクセスできる
    - 事前署名付きURL：ウェブブラウザーを介してファイルにアクセスするために使用される単純なHTTPSURL
    

# 6.0 データ保護とデータシェアリング（10%）
## 6.1 Snowflakeによる継続的なデータ保護の概要を説明する
:::note info
ポイント
● Time Travel
● Fail-safe
● データ暗号化
● クローニング
● レプリケーション
:::
https://docs.snowflake.com/ja/user-guide/data-cdp

- Time Travel
    過去のデータを一定期間復元する機能で、誤操作によるデータの損失を防ぐ
    ```sql
    -- 過去の特定時点におけるテーブルのスナップショットを取得
    SELECT * FROM my_table AT (TIMESTAMP => '2023-09-01 10:00:00');
    
    -- 特定のクエリIDが実行された直後の状態にテーブルを戻す
    SELECT * FROM my_table BEFORE (STATEMENT => '12345-67890-ABCDE');
    ```
- Fail-safe
    Time Travel終了後も7日間のリカバリ期間を提供しデータの安全性を確保する．
    Snowflakeサポートチームを通じてリカバリが行われる
- データ暗号化
    Snowflakeで保存および転送されるデータのセキュリティを強化する
- クローニング
    データオブジェクトを瞬時に複製する効率的な方法でストレージの最適化が可能
    ```sql
    -- テーブルのクローニング
    CREATE TABLE my_table_clone CLONE my_table;
    
    -- データベースのクローニング
    CREATE DATABASE my_database_clone CLONE my_database;
    
    -- スキーマのクローニング
    CREATE SCHEMA my_schema_clone CLONE my_schema;
    ```
- レプリケーション
    複数のリージョンやクラウド間でデータを複製し災害復旧やグローバルアクセスをサポートする


テーブルの種類
| テーブルの種類 | 持続性  | Time Travel 保持期間（日数） | Fail-safe 期間（日数） |
|---------------|--------|-----------------------------|-----------------------|
| 仮テーブル（`TEMPORARY`)| セッションの残り　| 0or1(default) | 0 |
| 一時テーブル (`TRANSIEN`)| 明示的に削除されるまで | 0or1(default) | 0 |
| 永続テーブル| 明示的に削除されるまで | standard:0or1(default) / enterprise:0~90 | 7 |


## 6.2 Snowflakeデータシェアリング機能の概要を説明する
:::note info
ポイント
● アカウントタイプ
● Snowflake Marketplace
● Data Exchange
● アクセス制御オプション
○ 共有を作成、管理するためのDDLコマンド
○ 共有の操作に必要な権限
● Secure Data Sharing(Direct Share、リスティングなど)
:::
- Snowflake Marketplace
    データを取引でき外部のデータを容易に活用できる
- Data Exchangeは
    ビジネスパートナー間でのデータ共有をサポートする
- Secure Data Sharing
    他のSnowflakeアカウントとデータを安全にリアルタイムで共有でる

# その他試験で覚えておくことリスト
数値について