5つの一般的なSQLのインタビューの質問

 

 

すべてのデータ中心の研究では、SQLの深い理解を持って、これは仕事の中で最も興味深い部分ではないが、成功への鍵です。実際には、FROM SELECTに加えて、GROUP BY ORDER BY、SQLと、より多くの方法。より多くのあなたが機能を知って、簡単にそれが目的のクエリの内容や操作です。

 

著者は、次の二つのことを学び、この記事で通信することを望みます:

 

いくつかの基本的な機能を研究し、教えるために1以外のSQL関数)

2)いくつかのSQL練習インタビューの質問を探ります

 

*のみLeetcodeから、この記事で問題

 

 

 

質問1:2番目に高い給与

 

Employeeテーブルから2番目に高い給料を得るために使用されるSQLクエリを記述します。例えば、下記の従業員テーブルは、クエリが第二の高給与として200を返すべきです。何も2番目に高い給与がない場合、クエリはNULLを返す必要があります。

+----+--------+| Id | Salary |+----+--------+| 1   | 100     || 2   | 200     || 3   | 300     |+----+--------+

 

1)ソリューションA 使用IFNULL OFFSET

 

  • IFNULL(表現、ALT):nullの場合、IFNULL()それ以外の場合は期待値を返し、指定された値を返します何も2番目に高い給与が存在しない場合、我々はそれがnullを返します使用します。

  • OFFSET:オフセット句と共に使用は、最初のn行指定ORDERBYを無視しますあなたは第二列(二番目に高い給料)を取得したいので、これは、便利です

SELECTIFNULL((SELECT DISTINCT SalaryFROM EmployeeORDER BY Salary DESCLIMIT 1 OFFSET 1), null) as SecondHighestSalaryFROM EmployeeLIMIT 1

 

2)解決策B 使用して、MAX ()

 

このクエリは、選択されたMAXの給与2番目に高い給与を選択することに等しい最大給与、に等しくないを表します。

SELECT MAX(salary) AS SecondHighestSalaryFROM EmployeeWHERE salary != (SELECT MAX(salary) FROM Employee)

 

 

質問2:重複した電子メール

 

ライティングSQLは、テーブルの人という名前のすべての重複した電子メールを検索するために照会します。

+----+---------+| Id | Email    |+----+---------+| 1  | [email protected]  || 2  | [email protected]  || 3  | [email protected]  |+----+---------+

 

1)ソリューションA サブクエリCOUNT ()

 

まず、回各メールの頻度の数が表示され、サブクエリを作成します。そして、カウントが1以上であるサブクエリを濾過しました。

​​​​​​​

SELECT EmailFROM (SELECT Email, count(Email) AS countFROM PersonGROUP BY Email) as email_countWHERE count > 1

 

2)解決策B:HAVING

 

  • 句を持つことが本質的には、次の文と凝集は(GROUP BY)は、組み合わせて使用​​することができますWHERE。

SELECT EmailFROM PersonGROUP BY EmailHAVING count(Email) > 1

 

質問3:温度上昇

 

下記の天気テーブルを考えると、IDのすべての日付(昨日の)日に比べて、より高い温度の前に見つけるために、SQLクエリを記述します。

+---------+------------------+------------------+| Id(INT) | RecordDate(DATE) | Temperature(INT) |+---------+------------------+------------------+|         1 | 2015-01-01         | 10                   ||         2 | 2015-01-02         | 25                   ||         3 | 2015-01-03         | 20                   ||         4 | 2015-01-04         | 30                   |+---------+------------------+------------------+

 

ソリューション:DATEDIFF()

 

  • DATEDIFFは、今日のために、我々は温度と温度昨日が比較されたことを確認します、2つの日付の差です。

 

簡単に言えば、クエリは、指定した日付の温度を選択することで昨日のIDの温度よりも高くなっています。

SELECT DISTINCT a.IdFROM Weather a, Weather bWHERE a.Temperature > b.TemperatureAND DATEDIFF(a.Recorddate, b.Recorddate) = 1

 

質問4:部門の最高給与

 

従業員以下の表は、すべての従業員が含まれています。各従業員は、ID、給料を持っている部門IDの欄があります。

+----+-------+--------+--------------+| Id | Name   | Salary | DepartmentId |+----+-------+--------+--------------+| 1   | Joe   | 70000  | 1               || 2   | Jim   | 90000  | 1               || 3   | Henry | 80000  | 2               || 4   | Sam   | 60000  | 2               || 5   | Max   | 90000  | 1               |+----+-------+--------+--------------+

 

次の表は、会社のすべての分野での部門が含まれています。

+----+----------+| Id | Name      |+----+----------+| 1   | IT        || 2   | Sales    |+----+----------+

 

書き込みSQLクエリは、各部門の従業員の最高給与を見つけることができます。上記の二つの表は、お使いのSQLクエリは、(行の順序は重要ではありません)次の行を返す必要があります。

​​​​​​​

+------------+----------+--------+| Department | Employee | Salary |+------------+----------+--------+| IT            | Max       | 90000  || IT            | Jim       |90000   || Sales        | Henry     | 80000  |+------------+----------+--------+

 

ソリューションのIN

 

  • IN句を使用すると、WHERE句で複数のOR句を使用することができます。たとえば、WHERE国=「カナダ」または国=「USA」とWHEREの国で(「カナダ」、「USA」)と同じ。

 

  • この場合、我々は、各部門(すなわちDepartmentIdの)のためにのみ最大給与を表示するには、部門表をフィルタリングします。DepartmentIdのは、濾過し、給与課のテーブルを特徴その後、我々は、2つのテーブルを結合することができます。

SELECTDepartment.name AS 'Department',Employee.name AS 'Employee',SalaryFROM EmployeeINNER JOIN Department ON Employee.DepartmentId = Department.IdWHERE (DepartmentId , Salary)IN( SELECTDepartmentId, MAX(Salary)FROMEmployeeGROUP BY DepartmentId)

 

 

質問5:スワップ席

 

メアリーは彼女が座席表、上記店舗生徒の名前と対応するシートIDを持っている、高校の先生です。列IDが離散的な増分で、メアリーは学生に隣接スワップ席に望んでいました。

 

あなたはメアリーの出力にSQLクエリを書くことができますか?

+---------+---------+|    id     | student |+---------+---------+|    1      | Abbot   ||    2      | Doris   ||    3      | Emerson ||    4      | Green   ||    5      | Jeames  |+---------+---------+

 

サンプル入力、出力の場合:

+---------+---------+|    id     | student |+---------+---------+|    1      | Doris   ||    2      | Abbot   ||    3      | Green   ||    4      | Emerson ||    5      | Jeames  |+---------+---------+

 

注:学生の数が奇数の場合、最後のシートを変更する必要はありません。

 

ソリューションCASE

  • THEN文がコーディングIF文とみなすことができるCASE。

  • 行数が奇数の場合ステートメントは、奇数の行数かどうかを最初にチェックは、同じID番号ことを確認してください。

  • 各IDの文がインクリメントされる第二の(例えば、1,3,5が2,4,6となります)

  • 各IDをデクリメント同様に、第3のステートメント(2,4,6が1,3,5となります)

SELECTCASEWHEN((SELECT MAX(id) FROM seat)%2 = 1) AND id = (SELECT MAX(id) FROM seat) THENidWHEN id%2 = 1 THEN id + 1ELSE id - 1END AS id, studentFROM seatORDER BY id

 

これらは、任意の質問や他のコメントがある場合は、コメントしてください、すべてのソリューションです!

 

 

 
公開された363元の記事 ウォン称賛74 ビュー190 000 +

おすすめ

転載: blog.csdn.net/sinat_26811377/article/details/104612057