高度なデータ サイエンス SQL 面接で知っておくべき質問トップ 10 の答え方


著者による画像

SQL (Structured Query Language) は、データベースの管理と操作に使用される標準的なプログラミング言語です。 データベースに保存されているデータを効果的に取得して分析できるため、データの専門家にとって不可欠なスキルです。 その結果、SQL は、データ アナリスト、データ エンジニア、およびデータベース管理者と同様に、データを操作するポジションの技術面接でよく取り上げられるトピックです。

n 番目に高い給与/支払いまたは 3 番目に高い給与/支払いを検索する SQL クエリ

n 番目に高い給与を見つけるには、サブクエリと DENSE_RANK() 関数を使用して各給与の密なランクを計算し、結果をフィルタリングして、ランキングが n に等しい行のみを含めることができます。

SELECT 
  * 
FROM 
  (
    SELECT 
      name, 
      salary, 
      DENSE_RANK() OVER (
        ORDER BY 
          salary DESC
      ) as salary_rank 
    FROM 
      employees
  ) subquery 
WHERE 
  salary_rank = n;

次のように、LIMIT 句と OFFSET 句を使用して、n 番目に高い給与を見つけることもできます。

SELECT 
  name, 
  salary 
FROM 
  employees 
ORDER BY 
  salary DESC 
LIMIT 
  1 OFFSET (n - 1);

たとえば、3 番目に高い給与を検索するには、次のクエリを使用します。

SELECT 
  name, 
  salary 
FROM 
  employees 
ORDER BY 
  salary DESC 
LIMIT 
  1 OFFSET 2;

パフォーマンスのために SQL クエリをどのように最適化しますか?

SQL クエリを最適化してパフォーマンスを向上させる方法はいくつかあります。

索引付け

列または列のグループにインデックスを作成すると、それらの列をフィルター処理するクエリの速度が大幅に向上します。

パーティショニング

大きなテーブルを小さな断片に分割すると、データのサブセットにのみアクセスする必要があるクエリのパフォーマンスを向上させることができます。

標準化

正規化とは、データベース内のデータを整理して、各データが 1 か所だけに保存​​されるようにすることで、冗長性を減らし、データの完全性を完全にすることです。

適切なデータ型の使用

各列に正しいデータ型を使用すると、それらの列でフィルター処理または並べ替えを行うクエリのパフォーマンスを向上させることができます。

適切な JOIN タイプの使用

正しい JOIN タイプ (INNER JOIN、OUTER JOIN、CROSS JOIN など) を使用すると、複数のテーブルを結合するクエリのパフォーマンスを向上させることができます。

適切な集約関数の使用

適切な集計関数 (SUM、AVG、MIN、MAX など) を使用すると、大量のデータ セットに対して計算を実行するクエリのパフォーマンスを向上させることができます。 COUNT に似た一部の集計関数は、他の関数よりも効果的であるため、クエリに適切な関数を選択することが重要です。

SQL で LAG 関数と LEAD 関数をどのように使用しますか? それらの使用例を教えてください。

LAG() 関数と LEAD() 関数は SQL のウィンドウ関数で、行の値を前または次の行の値とそれぞれ比較できます。 累計を計算したり、テーブルの値を前または後の行の値と比較したりするのに役立ちます。

お茶 LAG() 関数 返される列と戻る行数の 2 つの引数を取ります。 例えば

SELECT 
  name, 
  salary, 
  LAG(salary, 1) OVER (
    ORDER BY 
      salary DESC
  ) as prev_salary 
FROM 
  employees;

お茶 LEAD() 関数 同様に機能しますが、後方ではなく前方に進みます。 例えば

SELECT 
  name, 
  salary, 
  LEAD(salary, 1) OVER (
    ORDER BY 
      salary DESC
  ) as next_salary 
FROM 
  employees

SQL の ETL と ELT の概念を説明する

ETL (Extract, Transform, Load) は、SQL で 1 つ以上のソースからデータを抽出し、そのデータを分析やその他の用途に適した形式に変換してから、データをターゲット システム (データ サーバーなど) にロードするために使用されるプロセスです。ウェアハウスまたはデータレイク。

ELT (抽出、ロード、変換) は ETL に似ていますが、変換フェーズは、データがターゲット システムにロードされる前ではなく、ロードされた後に実行されます。 これにより、ターゲット システムが変換を実行できるようになり、ETL ツールで変換を実行するよりも効率的でスケーラブルになります。 ELT は、強力なデータ処理エンジン (Apache Spark や Apache Flink など) を使用して変換フェーズを実行する最新のデータ インフラストラクチャでよく使用されます。

SQL の WHERE 句と HAVING 句の違いを説明できますか

WHERE 句と HAVING 句はどちらも、SELECT ステートメントから行をフィルター処理するために使用されます。 2 つの主な違いは、WHERE 句を使用してグループ化操作の前に行をフィルター処理するのに対し、HAVING 句を使用してグループ化操作の後に行をフィルター処理することです。

SELECT 
  department, 
  SUM(salary) 
FROM 
  employees 
GROUP BY 
  department 
HAVING 
  SUM(salary) > 100000;

この例では、HAVING 句を使用して、その部門の従業員の給与の合計が 100000 未満である部門を除外します。これは、group by 操作の後に行われるため、各部門を表す行にのみ影響します。

SELECT 
  * 
FROM 
  employees 
WHERE 
  salary > 50000;

この例では、WHERE 句を使用して、給与が 50000 未満の従業員をフィルターで除外します。これは、group by 操作の前に実行されるため、employees テーブルのすべての行に影響します。

SQL での TRUNCATE、DROP、および DELETE 操作の違いを説明する

トランケート

TRUNCATE 操作はテーブルからすべての行を削除しますが、テーブルの構造には影響しません。 元に戻すログややり直しログを生成せず、削除トリガーを起動しないため、DELETE よりも高速です。

TRUNCATE ステートメントの使用例を次に示します。

TRUNCATE TABLE employees;

このステートメントは、employees テーブルからすべての行を削除しますが、列名やデータ型を含むテーブル構造は変更されません。

ドロップ

DROP 操作は、データベースからテーブルを削除し、テーブル内のすべてのデータを削除します。 また、テーブルに関連付けられているインデックス、トリガー、および制約も削除されます。

DROP ステートメントの使用例を次に示します。

このステートメントは、データベースから employees テーブルを削除し、テーブル内のすべてのデータを完全に削除します。 テーブル構造も削除されます。

消去

DELETE 操作は、テーブルから 1 つ以上の行を削除します。 WHERE 句を指定して、削除する行を選択できます。 また、元に戻すログとやり直しログを生成し、キャンセル トリガーを起動します。

DELETE ステートメントの使用例を次に示します。

DELETE FROM 
  employees 
WHERE 
  salary & lt;
50000;

このステートメントは、従業員テーブルから給与が 50000 未満のすべての行を削除します。テーブル構造は変更されず、取り消しログを使用して削除された行を復元できます。

結合とサブクエリはどちらが効率的ですか?

複数のテーブルのデータを結合する場合は、通常、サブクエリよりも JOIN を使用する方が効率的です。 これは、JOIN を使用すると、結合されたテーブルのインデックスを使用することで、データベースがより効率的にクエリを実行できるようになるためです。

たとえば、同じ結果を返す次の 2 つのクエリについて考えてみます。

SELECT 
  * 
FROM 
  orders o 
WHERE 
  o.customer_id IN (
    SELECT 
      customer_id 
    FROM 
      customers 
    WHERE 
      country = 'US'
  );
SELECT 
  * 
FROM 
  orders o 
WHERE 
  o.customer_id IN (
    SELECT 
      customer_id 
    FROM 
      customers 
    WHERE 
      country = 'US'
  );

最初のクエリは、JOIN を使用して orders テーブルと customers テーブルを結合し、WHERE 句を使用して結果をフィルター処理します。 2 番目のクエリは、サブクエリを使用して顧客テーブルから関連する顧客 ID を選択し、IN 演算子を使用してそれらの ID に基づいて注文テーブルをフィルター処理します。

SQLでウィンドウ関数をどのように使用しますか?

SQL では、ウィンドウ関数は、ウィンドウ仕様によって定義された一連の行、または「ウィンドウ」で動作する関数です。 ウィンドウ関数は、複数の行にわたって計算を実行するために使用され、SELECT、UPDATE、DELETE ステートメント、および SELECT ステートメントの WHERE 句と HAVING 句で使用できます。

SELECT ステートメントでウィンドウ関数を使用する例を次に示します。

SELECT 
  name, 
  salary, 
  AVG(salary) OVER (PARTITION BY department_id) as avg_salary_by_department 
FROM 
  employees

このステートメントは、name、salary、および avg_salary_by_department の 3 つの列を含む結果セットを返します。 avg_salary_by_department 列は、各部門の平均給与を計算する AVG ウィンドウ関数を使用して計算されます。 PARTITION BY 句は、ウィンドウが department_id によってパーティション化されることを指定します。つまり、平均給与は部門ごとに個別に計算されます。

正規化について説明する

正規化とは、冗長性と依存性を減らす方法でデータベースを編成するプロセスです。 これは、テーブルを分解してデータの冗長性を排除し、データの整合性を向上させるための体系的なアプローチです。 データベースの正規化に使用できる正規形がいくつかあります。 最も一般的な正規形は次のとおりです。

第 1 正規形 (1NF)

  • テーブル内の各セルには、値のリストではなく、単一の値が含まれています
  • テーブルの各列には一意の名前があります
  • 表には列の繰り返しグループが含まれていません

第 2 正規形 (2NF)

  • 第一正規形です
  • 部分的な依存関係はありません (つまり、非プライム属性は複合主キーの一部に依存しています)。

第 3 正規形 (3NF)

  • 第二正規形です
  • 推移的な依存関係はありません (つまり、非プライム属性は別の非プライム属性に依存しています)。

ボイス-コッド標準形 (BCNF)

  • 第三正規形です
  • すべての決定要因 (別の属性の値を決定する属性) は候補キー (主キーとして使用できる列または列のセット) です。

SQLで排他ロックと更新ロックを説明する

排他ロックは、他のトランザクションがロックされた行を読み書きできないようにするロックです。 このタイプのロックは通常、トランザクションがテーブル内のデータを変更する必要があり、他のトランザクションが同時にテーブルにアクセスできないようにする場合に使用されます。

更新ロックは、他のトランザクションがロックされた行を読み取ることを許可するロックですが、ロックされた行を更新または書き込みすることはできません。 このタイプのロックは通常、トランザクションがテーブル内のデータを読み取る必要があるが、現在のトランザクションが終了するまでデータが他のトランザクションによって変更されないようにしたい場合に使用されます。

ソニア・ジャミル 現在、パキスタン最大の電気通信会社の 1 つでデータベース アナリストとして雇用されています。 彼女はフルタイムの仕事に加えて、フリーランサーとしても働いています。 彼女のバックグラウンドには、データベース管理の専門知識と、オンプレミスとクラウドベースの両方の SQL Server 環境での経験が含まれます。 彼女は最新の SQL Server テクノロジに精通しており、データ管理とデータ分析に強い関心を持っています。

Leave a Comment

Your email address will not be published. Required fields are marked *