データベースLeetCodeデイリープラクティス(2)

コンテンツ

序文

トピック1:注文したことがない顧客

トピック2:重複するメールを削除する

トピック3:気温の上昇

トピック4:2番目に高い給与

この章の質問の要約


 

序文

  • 前回の記事は素晴らしいです

データベースの日常業務LeetCode (1) _Xiaojie312のブログ

トピック1:注文したことがない顧客

183.注文したことがないお客様

透かし、type_d3F5LXplbmhlaQ、shadow_50、text_Q1NETiBA5bCP5p2wMzEy、size_20、color_FFFFFF、t_70、g_se、x_16

 透かし、type_d3F5LXplbmhlaQ、shadow_50、text_Q1NETiBA5bCP5p2wMzEy、size_12、color_FFFFFF、t_70、g_se、x_16

  • トピックの要件:問い合わせる必要があるのは、注文したことがない顧客です
  • アイデアの開始:直接フィルタリングし、サブクエリを使用して、ordersテーブルの情報を介してcustomersテーブルのordersのcustomerid列にIDが表示されないレコードをフィルタリングします。  
  • コア、関係を取得します。添付の​​テーブルOdersのcustomeridは、メインテーブルcustomersのid列に対応します。

透かし、type_d3F5LXplbmhlaQ、shadow_50、text_Q1NETiBA5bCP5p2wMzEy、size_20、color_FFFFFF、t_70、g_se、x_16

# 解决方式1: 子查询方式

select 
    name as 'Customers'
from 
    customers 
where 
    id not in (select distinct customerid from orders);

# 解决方式2 : 外连接的方式
# 取出customers表的全部 和 orders表进行左外连接
# 连接条件利用 c.id = o.customerid. 不存在连接关系的记录o.id = null


select 
    c.name as 'Customers'
from 
    customers as c left join orders as o
    on c.id = o.customerid
where 
    o.id is null;
  • 外部接続がわからない場合は、最後のブラシの質問で詳細な説明を見ることができます。

データベースの日常業務LeetCode (1) _Xiaojie312のブログ

トピック2:重複するメールを削除する

196.重複するメールを削除する

透かし、type_d3F5LXplbmhlaQ、shadow_50、text_Q1NETiBA5bCP5p2wMzEy、size_20、color_FFFFFF、t_70、g_se、x_16

  •  タイトル要件:重複するすべての電子メールレコードを削除します。つまり、電子メールに従って削除し、一意の電子メールを小さいIDで保持します。したがって、削除された重複レコードのIDは次のようになります。 
  • アイデア:自己接続方式を使用して、自分のテーブルを自分自身に接続し、比較します。p2.id> p1.id && p2.email = p1.emailの場合、このレコードを削除します  (コアは接続選択だけでなく、削除など他の操作にも使用できます)                        ---  同じテーブルでのデータ比較操作が必要な場合は、自己接続操作を活用してください。
  • 削除は条件付き削除であることに注意してください。次のwhere条件に従って、指定されたテーブルの条件付きで指定されたレコードを削除します。LeetCodeコメント領域に、p1とp2はデカルト積ではないという質問があることがわかります。削除後、p1これは一時的なテーブルの問題です。ここでp1は個人テーブルのオントロジーです。p1テーブルで繰り返される電子メールを継続的に除外し、id earthレコードを削除するために、デカルト積を使用して接続関係を実現します。 
# p1 和 p2 都是 person 表
delete 
    p1
from 
    person as p1, person as p2
where p1.id > p2.id && p1.email = p2.email;

トピック3:気温の上昇

197.気温の上昇

透かし、type_d3F5LXplbmhlaQ、shadow_50、text_Q1NETiBA5bCP5p2wMzEy、size_20、color_FFFFFF、t_70、g_se、x_16

  •  質問の要件:前日よりも気温が高いすべての日付IDを検索します
  • トピックは非常に単純で、自己結合を使用することは明らかです。この表のデータを比較する場合、重要なのは日付の違いをどのように表現するか、今日と昨日の日付の関係をどのように表現するかです。

透かし、type_d3F5LXplbmhlaQ、shadow_50、text_Q1NETiBA5bCP5p2wMzEy、size_20、color_FFFFFF、t_70、g_se、x_16

 上記のdatediff関数を改善するためにSQLを使用できます

select 
    w1.id
from 
    weather w1 inner join weather w2
    on datediff(w1.recorddate, w2.recorddate) = 1
where
    w1.temperature > w2.temperature;

トピック4:2番目に高い給与

透かし、type_d3F5LXplbmhlaQ、shadow_50、text_Q1NETiBA5bCP5p2wMzEy、size_20、color_FFFFFF、t_70、g_se、x_16

  •  質問の要件:非常に単純です。表で2番目に高い給与を返すように依頼してください
  • アイデア:この種の給与。最初の反応は、descの降順で並べ替えを実行し、再並べ替えを削除してから、Limitページングクエリを使用して、2番目のレコードが2番目に高い給与であるかどうかをクエリすることです。記録。
  • ただし、タイトルには、2番目に高い給与がない場合は、nullクエリを元に戻すという要件があります。
  • Nullの処理には、isfull関数を使用します

透かし、type_d3F5LXplbmhlaQ、shadow_50、text_Q1NETiBA5bCP5p2wMzEy、size_20、color_FFFFFF、t_70、g_se、x_16

select ifnull(
    (select distinct 
        salary
    from 
        employee
    order by salary desc
    limit 1, 1
    ), null
) as 'SecondHighestSalary';

# 如果子查询select 结果不为Null则正常输出结果
# 否则输出null

この章の質問の要約

  • 経験の要約:一般に、同じテーブルの相互比較を通じてタイトルの要件を達成する必要がある場合は、通常、サブ接続を使用してクエリまたは処理を行うことができます。テーブルの自己結合は、テーブル自体がそれ自体に接続されていることを意味します。
  • 2つのテーブルの接続は、条件付き修飾のないデカルト積です。修飾は通常、論理外部キーによって制限されます。外部キーは添付のテーブルに存在し、外部キーは通常、メインテーブルの主キーです。
  • トピックを実行するときは、主キー列を把握する必要があります。   主キーはレコードを一意に識別し、レコードのみが存在し、nullではありません。多くの複雑なクエリ操作では、通常、需要列を直接クエリするのではなく、主キーを使用します。条件付き修飾クエリ操作のキー列
  • さまざまな内部結合と外部結合は、クエリの選択だけでなく、更新の削除にも適用できます。 
  • 最大および最小のレコードを見つけるには、最大および最小のレコードをキーワードの順序+個別+制限で開始する必要があります  

 

おすすめ

転載: blog.csdn.net/weixin_53695360/article/details/124020795