コンテンツ
序文
- 前回の記事は素晴らしいです
データベースの日常業務LeetCode (1) _Xiaojie312のブログ
トピック1:注文したことがない顧客
- トピックの要件:問い合わせる必要があるのは、注文したことがない顧客です
- アイデアの開始:直接フィルタリングし、サブクエリを使用して、ordersテーブルの情報を介してcustomersテーブルのordersのcustomerid列にIDが表示されないレコードをフィルタリングします。
- コア、関係を取得します。添付のテーブルOdersのcustomeridは、メインテーブルcustomersのid列に対応します。
# 解决方式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:重複するメールを削除する
- タイトル要件:重複するすべての電子メールレコードを削除します。つまり、電子メールに従って削除し、一意の電子メールを小さい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:気温の上昇
- 質問の要件:前日よりも気温が高いすべての日付IDを検索します
- トピックは非常に単純で、自己結合を使用することは明らかです。この表のデータを比較する場合、重要なのは日付の違いをどのように表現するか、今日と昨日の日付の関係をどのように表現するかです。
上記の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番目に高い給与
- 質問の要件:非常に単純です。表で2番目に高い給与を返すように依頼してください
- アイデア:この種の給与。最初の反応は、descの降順で並べ替えを実行し、再並べ替えを削除してから、Limitページングクエリを使用して、2番目のレコードが2番目に高い給与であるかどうかをクエリすることです。記録。
- ただし、タイトルには、2番目に高い給与がない場合は、nullクエリを元に戻すという要件があります。
- Nullの処理には、isfull関数を使用します
select ifnull(
(select distinct
salary
from
employee
order by salary desc
limit 1, 1
), null
) as 'SecondHighestSalary';
# 如果子查询select 结果不为Null则正常输出结果
# 否则输出null
この章の質問の要約
- 経験の要約:一般に、同じテーブルの相互比較を通じてタイトルの要件を達成する必要がある場合は、通常、サブ接続を使用してクエリまたは処理を行うことができます。テーブルの自己結合は、テーブル自体がそれ自体に接続されていることを意味します。
- 2つのテーブルの接続は、条件付き修飾のないデカルト積です。修飾は通常、論理外部キーによって制限されます。外部キーは添付のテーブルに存在し、外部キーは通常、メインテーブルの主キーです。
- トピックを実行するときは、主キー列を把握する必要があります。 主キーはレコードを一意に識別し、レコードのみが存在し、nullではありません。多くの複雑なクエリ操作では、通常、需要列を直接クエリするのではなく、主キーを使用します。条件付き修飾クエリ操作のキー列
- さまざまな内部結合と外部結合は、クエリの選択だけでなく、更新の削除にも適用できます。
- 最大および最小のレコードを見つけるには、最大および最小のレコードをキーワードの順序+個別+制限で開始する必要があります