teneur
Sujet 1 : Clients qui ne commandent jamais
Sujet 2 : Supprimer les e-mails en double
Sujet 3 : Hausse des températures
Sujet 4 : Deuxième salaire le plus élevé
Résumé des questions de ce chapitre
avant-propos
- L'article précédent est magnifique
Pratique quotidienne de la base de données LeetCode (1) _Le blog de Xiaojie 312
Sujet 1 : Clients qui ne commandent jamais
183. Clients qui ne commandent jamais
- Exigences du sujet : ce que nous devons interroger, ce sont les clients qui n'ont jamais passé de commande
- Idée de départ : filtrez directement, utilisez une sous-requête pour filtrer les enregistrements dont l'identifiant n'apparaît pas dans la colonne customerid des commandes de la table des clients via les informations de la table des commandes ;
- Saisissez le noyau, la relation : le customerid dans la table jointe Oders correspond à la colonne id de la table principale customers
# 解决方式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;
- Si vous ne comprenez pas la connexion externe, vous pouvez voir l'explication détaillée dans ma dernière question sur le pinceau.
Pratique quotidienne de la base de données LeetCode (1) _Le blog de Xiaojie 312
Sujet 2 : Supprimer les e-mails en double
196. Supprimer les e-mails en double
- Exigences relatives au titre : supprimez tous les enregistrements d'e-mail en double, c'est-à-dire supprimez-les en fonction de l'e-mail, conservez l'e-mail unique avec un petit identifiant, de sorte que l'identifiant des enregistrements en double supprimés soit le suivant
- Idée : Vous pouvez utiliser la méthode d'auto-connexion pour connecter votre propre table avec vous-même, puis comparer, si p2.id > p1.id && p2.email = p1.email, nous supprimerons cet enregistrement. (Le noyau réside dans le connexion Il peut être utilisé non seulement pour la sélection, mais également pour d'autres opérations telles que la suppression) --- Si vous avez besoin d'opérations de comparaison de données sur la même table, veuillez faire bon usage des opérations d'auto-connexion
- Notez que la suppression est une suppression conditionnelle.Selon la condition where suivante, supprimez l'enregistrement spécifié conditionnellement dans notre table spécifiée.Je vois qu'il y aura une telle question dans la zone de commentaire LeetCode, indiquant que p1 et p2 ne sont pas des produits cartésiens. Après la suppression, p1 C'est un problème de table temporaire. Ici, p1 est l'ontologie de la table des personnes. Nous utilisons simplement le produit cartésien pour réaliser la relation de connexion, afin de filtrer en continu les e-mails répétés dans la table p1 et de supprimer l'enregistrement id Earth.
# p1 和 p2 都是 person 表
delete
p1
from
person as p1, person as p2
where p1.id > p2.id && p1.email = p2.email;
Sujet 3 : Hausse des températures
- Exigences de la question : trouver tous les identifiants de date avec une température plus élevée que la veille
- Le sujet est très simple, et il est évident d'utiliser l'auto-jointure, car la comparaison des données de ce tableau, la clé est de savoir comment faire la différence entre les dates, comment exprimer la relation de date entre aujourd'hui et hier ?
Nous pouvons utiliser sql pour améliorer la fonction datediff ci-dessus
select
w1.id
from
weather w1 inner join weather w2
on datediff(w1.recorddate, w2.recorddate) = 1
where
w1.temperature > w2.temperature;
Sujet 4 : Deuxième salaire le plus élevé
- Exigences de la question : très simple, demandez à renvoyer le deuxième salaire le plus élevé du tableau
- Idée : Ce type de salaire, notre première réaction doit être d'effectuer un tri pour trier par ordre décroissant de desc, de supprimer le re-tri, puis d'utiliser la requête Limite de pagination pour demander si le deuxième enregistrement est le deuxième salaire le plus élevé. record.
- Mais il y a toujours une exigence dans le titre selon laquelle s'il n'y a pas de deuxième salaire le plus élevé, remettre la requête nulle
- Pour la manipulation de Null je prends la fonction isfull
select ifnull(
(select distinct
salary
from
employee
order by salary desc
limit 1, 1
), null
) as 'SecondHighestSalary';
# 如果子查询select 结果不为Null则正常输出结果
# 否则输出null
Résumé des questions de ce chapitre
- Résumé de l'expérience : généralement, si vous devez atteindre les exigences du titre grâce à la comparaison mutuelle de la même table, vous pouvez généralement utiliser une sous-connexion pour interroger ou traiter. L'auto-jointure de la table signifie que la table elle-même est connectée à elle-même.
- La connexion de deux tables est un produit cartésien sans aucune qualification conditionnelle. La qualification est généralement limitée par une clé étrangère logique. La clé étrangère existe dans la table attachée, et la clé étrangère est généralement la clé primaire dans la table principale.
- Lors de l'élaboration d'un sujet, nous devons saisir la colonne de clé primaire. La clé primaire identifie de manière unique l'enregistrement, et elle existe uniquement et n'est pas nulle. Dans de nombreuses opérations de requête complexes, nous n'interrogeons généralement pas directement la colonne de demande, mais utilisons la clé primaire colonne de clé pour l'opération de requête de qualification conditionnelle
- Diverses jointures internes et jointures externes ne s'appliquent pas seulement aux requêtes de sélection, mais également à la suppression de la mise à jour.
- Pour trouver les enregistrements les plus grands et les plus petits, les enregistrements les plus grands et les plus petits doivent commencer par le mot-clé order by + distinct + limit