面接のための SQL の基本および中級の質問
本題に入りましょう。
面接の質問に備え、SQL クエリを練習するために、Awesome SQL Interview GitHub リポジトリを作成しました。 SQL クエリを、基本 (L0)、中級 (L1)、および上級 (L2) の 3 つのセクションに分割しました。これが基本セクションの解決策です。
これは練習用の L1 (中間) SQL クエリです。より良い練習のために、最初に L0 を参照してください。
注: これらの例は MySQL でテストされています。 MS-SQL や Oracle などの他のデータベースでは構文が異なる場合があります。
L1: 中間 SQL
- JOIN、GROUP BY、HAVING、および複雑な WHERE 条件を使用した、複数のテーブルの操作を伴うクエリ。
- サブクエリ、集計関数、case ステートメントの概要。
質問:
- 「米国」と「フランス」の顧客の顧客名と都市を取得するクエリを作成します。
- 「サンフランシスコ」オフィスで働くすべての従業員のemployeeNumber、lastName、officeCodeを取得するにはどうすればよいですか?
- 注文テーブルと顧客テーブルを使用して、各顧客の注文の合計数を見つけるクエリを作成します。
- 10 回以上注文された製品の productName、quantityInStock、buyPrice を取得するにはどうすればよいですか?
- customerNumber が 103 の顧客が行った注文の orderNumber、status、customerName を取得するクエリを作成します。
- orderdetails テーブル内の各注文の合計売上額 (quantityOrdered * PriceEach) を見つけるクエリを作成します。
- orderdetail テーブル内の各 orderNumber の平均数量Ordered を見つけるにはどうすればよいですか?
- orderdetails テーブルで合計収益 (quantityOrdered * PriceEach) が最も高い productLine をリストするクエリを作成します。
- employee テーブルと office テーブルを結合して、employeeNumber、firstName、lastName、および従業員が勤務するオフィス名を表示するクエリを作成します。
- 注文したことがない顧客をどのように見つけますか?
- customerName と各顧客 (まだ注文していない顧客も含む) による注文の合計数を取得するクエリを作成します。
- 注文された製品の数量が 50 を超えるすべての注文について、productName とquantityOrdered を検索するクエリを作成します。
- 注文した顧客に営業担当者として割り当てられた従業員の従業員番号、名、注文番号を取得します。
- buyPrice に基づいて製品テーブル内の製品の平均価格を計算するクエリを作成します。
- 製品テーブルで最も高価な製品のトップ 3 を取得するにはどうすればよいですか?
- ステータスが「発送済み」であるすべての注文の customerName、orderNumber、orderDate を取得するクエリを作成します。
- 各製品ラインの販売製品の総数を表示するにはどうすればよいですか?
- employeeNumber = 1143 の従業員の直属の従業員を検索するクエリを作成します。
- 注文テーブル内の注文の合計数をステータスごとにグループ化して計算するクエリを作成します。
- 従業員をマネージャーの名前とともにリストします。
間違ったことについても言及します。何をすべきかを知ることは重要ですが、何をしてはいけないのか、どこで間違いを犯すのかを知ることも非常に重要です。もう一度本題に戻りましょう...
必要な場所に説明を含む解決策
-
「米国」と「フランス」の顧客の顧客名と都市を取得するクエリ。
- または ->条件が多い場合、クエリは各条件を 1 つずつチェックするため、少し遅くなります。
- IN ->特に長いリストの場合、データベース エンジンによって内部的にわずかに最適化されます。
- 2 ~ 3 つの条件ではどちらも問題ありません。読みやすさとスケーラビリティの点では、特に大きな値のリストを処理する場合は IN の方が優れています。
- IS は、文字列比較ではなく、IS NULL や IS NOT NULL などの条件をチェックするために使用されます。
「サンフランシスコ」オフィスで働くすべての従業員のemployeeNumber、lastName、officeCodeを取得します。
-
注文テーブルと顧客テーブルを使用して、各顧客の注文の合計数を見つけるクエリを実行します。
- クエリで集計関数を使用する場合は、常に GROUP BY 句に非集計列を含めてください。
- これにより、SQL が行をグループ化する方法を認識し、追加の列を選択する際の曖昧さを回避できるようになります。
- この例では、COUNT(*) と一緒に選択しているため、customerNumber と customerName は両方とも GROUP BY 句に含まれている必要があります。
?黄金律:
SELECT リストのすべての列は次のいずれかを行う必要があります:
GROUP BY 句内にある、または
COUNT()、SUM() などの集計関数を使用します。 -
10 回以上注文された製品の productName、quantityInStock、buyPrice を取得しますか?
- このクエリは中小規模のデータベースでは効率的ですが、大規模なサイズの場合はインデックスを使用し、HAVING 句のみに依存するのではなく WHERE 句を使用してスキャンされるデータを減らすことができます
-
customerNumber が 103 の顧客が発注した注文の orderNumber、status、customerName を取得します。
説明:
- 使用されるテーブル:
- orders: orderNumber と status が含まれます。
- customers: customerName が含まれます。
- 内部結合:
- customerNumber 列 (共通キー) を使用して、orders テーブルと customer テーブルを結合します。
- WHERE 句:
- customerNumber = 103 のレコードのみを含むようにデータをフィルターします。
- 選択された列:
- o.orderNumber: 注文番号。
- o.status: 注文ステータス。
- c.customerName: 注文を行った顧客の名前。
- 使用されるテーブル:
orderdetails テーブルで各注文の合計売上額 (quantityOrdered * PriceEach) を見つけます。
-
orderdetails テーブル内の各 orderNumber の平均数量Ordered を見つけます。
- 説明:
- 注文番号:
- orderNumber で行をグループ化します。
- AVG(注文数量):
- 同じ orderNumber に属するすべての行の平均数量Ordered を計算します。
- グループ化:
- 注文番号ごとに平均が個別に計算されるようにします。
-
orderdetails テーブル内の総収益 (quantityOrdered * PriceEach) が最も高い productLine をリストするクエリ。
- 説明:
- 製品ライン:
- 製品を「オートバイ」や「飛行機」などのさまざまなラインに分類します。
- SUM(od.quantityOrdered * od.priceEach):
- 各製品ラインの総収益を計算します。
- 内部結合:
- productCode で製品テーブルと orderdetail テーブルを結合し、製品ラインを注文詳細に関連付けます。
- p.productLine ごとにグループ化:
- 各製品ラインごとに結果をグループ化します。
- 合計収益 DESC で注文:
- グループ化された結果を収益の降順に並べ替えるので、最も高い収益が最初に表示されます。
- 制限 1:
- 収益が最も高い productLine のみに結果を制限します。
-
従業員テーブルとオフィステーブルを結合することにより、従業員番号、名、姓、および従業員が勤務するオフィス名を表示するクエリ。
- CONCAT(列, 'セパレータ', 列, 'セパレータ', 列)
- CONCAT_WS('セパレータ', 列)
-
注文したことがない顧客を検索
説明:
- LEFT JOIN: 注文テーブルに一致する行があるかどうかに関係なく、顧客テーブルからすべての顧客を取得します。
- o.orderNumber IS NULL: 対応する注文がない顧客を識別します (つまり、注文テーブルに一致するものがないため、orderNumber は NULL です)。
-
列:
- customerNumber: 顧客の一意の識別子。
- customerName: 顧客の名前。
customerName と各顧客 (まだ注文していない顧客も含む) による注文の合計数を取得するクエリ。
注文された製品の数量が 50 を超えるすべての注文について、productName と数量Ordered を検索します。
-
注文した顧客に営業担当者として割り当てられた従業員の従業員番号、名、注文番号を取得します。
説明:
-
従業員から:
- 従業員の詳細、特に従業員番号と名が必要なため、従業員テーブル (エイリアスは e) から始めます。
-
顧客を結合します。 c ON e.employeeNumber = c.salesRepEmployeeNumber:
- 従業員からのemployeeNumberと顧客からのsalesRepEmployeeNumberでcustomersテーブル(cというエイリアス)に結合します。これにより、従業員 (営業担当者) と顧客との関係が構築されます。これで、各顧客にどの従業員が割り当てられているかを識別できるようになりました。
-
JOIN 命令 o ON c.customerNumber = o.customerNumber:
- さらに、customerNumber を使用して、orders テーブル (o というエイリアス) を customer テーブルと結合します。これにより、各顧客が行った注文がわかります。
-
SELECT e.employeeNumber、e.firstName、o.orderNumber:
- 最後に、従業員テーブル (営業担当者) から従業員番号と名を選択し、注文を行った各顧客の注文テーブルから注文番号を選択します。
-
従業員から:
buyPrice に基づいて製品テーブル内の製品の平均価格を計算するクエリ。
製品テーブルで最も高価な製品のトップ 3 を取得しますか?
ステータスが「発送済み」であるすべての注文の customerName、orderNumber、orderDate を再取得します。
各 productLine の販売製品の総数を表示します
employeeNumber = 1143 の従業員の直属の従業員を検索します。
ステータスごとにグループ化された、注文テーブル内の注文の合計数を計算するクエリ。
従業員をマネージャーの名前とともにリストします。
やあ、私の名前は Jaimin Baria AKA Cloud Boy です...、楽しんで何か役立つことを学んだ場合は、この投稿に「いいね!」をして、コメントを追加し、私の Awesome SQL Interview GitHub リポジトリにアクセスしてください。
始めることを忘れないでください?.
コーディングを楽しんでください ??
その他の投稿
- SQL の実践:
- パート 1
- L0: 基本的な SQL
- L1: 中間 SQL
- L2: 高度な SQL - 近日公開予定
- パート 1
- システム設計
- データベースへの ACID トランザクションの実装
- システム設計における ACID トランザクション
⁉️ 読者から提案された修正
以上が面接のための SQL の基本および中級の質問の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











MySQLは、オープンソースのリレーショナルデータベース管理システムです。 1)データベースとテーブルの作成:createdatabaseおよびcreateTableコマンドを使用します。 2)基本操作:挿入、更新、削除、選択。 3)高度な操作:参加、サブクエリ、トランザクション処理。 4)デバッグスキル:構文、データ型、およびアクセス許可を確認します。 5)最適化の提案:インデックスを使用し、選択*を避け、トランザクションを使用します。

WebアプリケーションにおけるMySQLの主な役割は、データを保存および管理することです。 1.MYSQLは、ユーザー情報、製品カタログ、トランザクションレコード、その他のデータを効率的に処理します。 2。SQLクエリを介して、開発者はデータベースから情報を抽出して動的なコンテンツを生成できます。 3.MYSQLは、クライアントサーバーモデルに基づいて機能し、許容可能なクエリ速度を確保します。

INNODBは、レドログと非論的なものを使用して、データの一貫性と信頼性を確保しています。 1.レドログは、クラッシュの回復とトランザクションの持続性を確保するために、データページの変更を記録します。 2.Undologsは、元のデータ値を記録し、トランザクションロールバックとMVCCをサポートします。

MySQLはオープンソースのリレーショナルデータベース管理システムであり、主にデータを迅速かつ確実に保存および取得するために使用されます。その実用的な原則には、クライアントリクエスト、クエリ解像度、クエリの実行、返品結果が含まれます。使用法の例には、テーブルの作成、データの挿入とクエリ、および参加操作などの高度な機能が含まれます。一般的なエラーには、SQL構文、データ型、およびアクセス許可、および最適化の提案には、インデックスの使用、最適化されたクエリ、およびテーブルの分割が含まれます。

データベースとプログラミングにおけるMySQLの位置は非常に重要です。これは、さまざまなアプリケーションシナリオで広く使用されているオープンソースのリレーショナルデータベース管理システムです。 1)MySQLは、効率的なデータストレージ、組織、および検索機能を提供し、Web、モバイル、およびエンタープライズレベルのシステムをサポートします。 2)クライアントサーバーアーキテクチャを使用し、複数のストレージエンジンとインデックスの最適化をサポートします。 3)基本的な使用には、テーブルの作成とデータの挿入が含まれ、高度な使用法にはマルチテーブル結合と複雑なクエリが含まれます。 4)SQL構文エラーやパフォーマンスの問題などのよくある質問は、説明コマンドとスロークエリログを介してデバッグできます。 5)パフォーマンス最適化方法には、インデックスの合理的な使用、最適化されたクエリ、およびキャッシュの使用が含まれます。ベストプラクティスには、トランザクションと準備された星の使用が含まれます

MySQLは、そのパフォーマンス、信頼性、使いやすさ、コミュニティサポートに選択されています。 1.MYSQLは、複数のデータ型と高度なクエリ操作をサポートし、効率的なデータストレージおよび検索機能を提供します。 2.クライアントサーバーアーキテクチャと複数のストレージエンジンを採用して、トランザクションとクエリの最適化をサポートします。 3.使いやすく、さまざまなオペレーティングシステムとプログラミング言語をサポートしています。 4.強力なコミュニティサポートを提供し、豊富なリソースとソリューションを提供します。

他のプログラミング言語と比較して、MySQLは主にデータの保存と管理に使用されますが、Python、Java、Cなどの他の言語は論理処理とアプリケーション開発に使用されます。 MySQLは、データ管理のニーズに適した高性能、スケーラビリティ、およびクロスプラットフォームサポートで知られていますが、他の言語は、データ分析、エンタープライズアプリケーション、システムプログラミングなどのそれぞれの分野で利点があります。

MySQLインデックスのカーディナリティは、クエリパフォーマンスに大きな影響を及ぼします。1。高いカーディナリティインデックスは、データ範囲をより効果的に狭め、クエリ効率を向上させることができます。 2。低カーディナリティインデックスは、完全なテーブルスキャンにつながり、クエリのパフォーマンスを削減する可能性があります。 3。ジョイントインデックスでは、クエリを最適化するために、高いカーディナリティシーケンスを前に配置する必要があります。
