すべてのデータ中心の研究では、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を無視します。あなたは第二列(二番目に高い給料)を取得したいので、これは、便利です
SELECT
IFNULL(
(SELECT DISTINCT Salary
FROM Employee
ORDER BY Salary DESC
LIMIT 1 OFFSET 1
), null) as SecondHighestSalary
FROM Employee
LIMIT 1
2)解決策B :使用して、MAX ()
このクエリは、選択されたMAXの給与2番目に高い給与を選択することに等しい最大給与、に等しくないを表します。
SELECT MAX(salary) AS SecondHighestSalary
FROM Employee
WHERE salary != (SELECT MAX(salary) FROM Employee)
質問2:重複した電子メール
ライティングSQLは、テーブルの人という名前のすべての重複した電子メールを検索するために照会します。
+----+---------+
| Id | Email |
+----+---------+
| 1 | [email protected] |
| 2 | [email protected] |
| 3 | [email protected] |
+----+---------+
1)ソリューションA :サブクエリCOUNT ()
まず、回各メールの頻度の数が表示され、サブクエリを作成します。そして、カウントが1以上であるサブクエリを濾過しました。
SELECT Email
FROM (
SELECT Email, count(Email) AS count
FROM Person
GROUP BY Email
) as email_count
WHERE count > 1
2)解決策B:HAVING 節
-
句を持つことが本質的には、次の文と凝集は(GROUP BY)は、組み合わせて使用することができますWHERE。
SELECT Email
FROM Person
GROUP BY Email
HAVING 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.Id
FROM Weather a, Weather b
WHERE a.Temperature > b.Temperature
AND 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つのテーブルを結合することができます。
SELECT
Department.name AS 'Department',
Employee.name AS 'Employee',
Salary
FROM Employee
INNER JOIN Department ON Employee.DepartmentId = Department.Id
WHERE (DepartmentId , Salary)
IN
( SELECT
DepartmentId, MAX(Salary)
FROM
Employee
GROUP 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となります)
SELECT
CASE
WHEN((SELECT MAX(id) FROM seat)%2 = 1) AND id = (SELECT MAX(id) FROM seat) THENid
WHEN id%2 = 1 THEN id + 1
ELSE id - 1
END AS id, student
FROM seat
ORDER BY id
これらは、任意の質問や他のコメントがある場合は、コメントしてください、すべてのソリューションです!