国产成人毛片毛片久久网_国产午夜激无码av毛片不_国产乱对白精彩在线播放_av资源站中文字幕_亚洲男人的天堂网站_国产成 人 综合 亚洲网_中国国产激情一区_少妇一级淫片免费放_亚洲一本大道av久在线播放_免费观看美女裸体网站

行業(yè)動態(tài)

防御吧作為15年知名老牌域名服務商,CNNIC和CANN雙認證域名注冊商,已經(jīng)
持續(xù)為500多萬個域名提供服務,包括智能DNS/自由轉(zhuǎn)移/隱私保護等服務!
數(shù)據(jù)科學家常見的5個SQL面試問題
2020-02-28 14:42:29 【
在任何以數(shù)據(jù)為中心的工作中,對SQL有深刻的理解都是成功的關鍵,盡管這不是工作中最有趣的部分。事實上,除了SELECT FROM WHERE GROUP BY ORDER BY之外,還有更多的SQL方法。你知道的功能越多,操作和查詢所需的內(nèi)容就越容易。
作者希望在本文中學習和交流以下兩件事:
1)學習和教一些基本功能以外的SQL函數(shù);
2)探討一些SQL面試練習問題。
* 本文中的問題僅來自Leetcode

問題1:第二高的薪水


編寫一個SQL查詢用于從Employee表中獲取第二高的薪水。例如,給定下面的Employee表,查詢應返回200作為第二高的薪水。如果沒有第二高的薪水,則查詢應返回null。







+----+--------+| Id | Salary |+----+--------+|1| 100     || 2   |200||3| 300     |+----+--------+
1)解決方案A使用IFNULLOFFSET
  • IFNULL(表達,alt):如果為null,則ifnull()返回指定的值,否則返回期望的值。 如果沒有第二高的薪水,我們會使用它返回null。
  • OFFSET:offset與ORDERBY子句一起使用可忽略指定的前n行。這會很有用,因為你希望獲得第二行(第二高的薪水)






| Id | Salary |+----+--------+|1| 100     || 2   |200||3| 300     |+----+--------+
2)解決方案B使用MAX()
此查詢表示選擇的MAX薪水不等于最高薪水,這等于選擇第二高的薪水。









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


問題2:重復的電子郵件


編寫SQL查詢以在名為Person的表中查找所有重復的電子郵件。







+----+---------+| Id | Email    |+----+---------+| 1  | a@b.com  || 2  | c@d.com  || 3  | a@b.com  |+----+---------+
1)解決方案A子查詢中的COUNT()
首先,創(chuàng)建一個子查詢來顯示每封電子郵件的頻率次數(shù)。然后子查詢在計數(shù)大于1的地方被過濾。







SELECT EmailFROM (SELECT Email, count(Email) AS countFROM PersonGROUP BY Email) as email_countWHERE count > 1
2)解決方案B:HAVING子句
  • HAVING是一個子句,從本質(zhì)上講,你可以將WHERE語句與聚合(GROUP BY)結(jié)合使用。




SELECT EmailFROM PersonGROUP BY EmailHAVING count(Email) > 1

問題3:溫度上升


下面給定一個天氣表,編寫一個SQL查詢來查找與其之前(昨天)日期相比溫度更高的所有日期的ID。








+---------+------------------+------------------+| 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是計算兩個日期之間的差,用于確保我們將今天的溫度與昨天的溫度進行比較。

簡單來說,查詢是選擇給定日期的溫度高于昨天的溫度的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 country ='Canada'或country ='USA'與WHERE country IN('Canada','USA')相同。

  • 在這種情況下,我們希望過濾部門表來僅顯示每個部門的最高薪水(即DepartmentId)。然后,我們可以將兩個表連接在一起,其中DepartmentId和Salary在已過濾的Department表中。















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是連續(xù)的增量,瑪麗想為相鄰的學生互換座位。
你可以編寫SQL查詢來輸出瑪麗的結(jié)果嗎?









+---------+---------+|    id     | student |+---------+---------+|    1      | Abbot   ||    2      | Doris   ||    3      | Emerson ||    4      | Green   ||    5      | Jeames  |+---------+---------+
對于樣本輸入,輸出為:









+---------+---------+|    id     | student |+---------+---------+|    1      | Doris   ||    2      | Abbot   ||    3      | Green   ||    4      | Emerson ||    5      | Jeames  |+---------+---------+
注意:如果學生人數(shù)為奇數(shù),則無需更改最后一個座位。
解決方案:CASE WHEN
  • 可以將CASE WHEN THEN語句視為編碼中的IF語句。
  • 第一條WHEN語句檢查行數(shù)是否為奇數(shù),如果行數(shù)為奇數(shù),請確保ID號不變。
  • 第二個WHEN語句為每個id加1(例如,1,3,5變?yōu)?,4,6)
  • 同樣,第三個WHEN語句將每個id減1(2,4,6變?yōu)?,3,5)








SELECTCASEWHEN((SELECT MAX(id) FROM seat)%2 = 1) AND id = (SELECT MAX(id) FROM seat) THEN idWHEN id%2 = 1 THEN id + 1ELSE id - 1END AS id, studentFROM seatORDERBYid
以上就是所有的解決方法,如果有不清楚的地方或其他意見,歡迎評論告訴我們!


】【打印關閉】 【返回頂部
分享到QQ空間
分享到: 
上一篇隱藏Windows文件擴展名存在安全風.. 下一篇Apache Dubbo反序列化漏洞(CVE-2..

立足首都,輻射全球,防御吧專注云防御及云計算服務15年!

聯(lián)系我們

服務熱線:13051179500 18910191973
企業(yè)QQ:1245940436
技術支持:010-56159998
E-Mail:xihedata.com
Copyright ? 2003-2016 fangyuba. 防御吧(完美解決防御與加速) 版權(quán)所有 增值許可:京B2-20140042號
售前咨詢
公司總機:18910191973
24小時電話:010-56159998
投訴電話:18910191973
值班售后/技術支持
售后服務/財務
備案專員
緊急電話:18610088800