SQL-Schnallenübung (11)

Inhaltsverzeichnis

1. Baumknoten (608)

Beispiel 1

Lösung 1 (Fall wann)

Lösung 2 (nicht in)

2. Urteilsdreieck (610)

Beispiel 1

Lösung 1 (Fall wann)

Lösung 2 (falls)

Lösung 3 (verschachtelt, wenn)

3. Die größte Zahl, die nur einmal vorkommt (619)

Beispiel 1

Lösung 1 (Zähllimit)

Lösung 2 (maximal)

4. Lustige Filme(620)

Lösung eins

5. Sitzplatz wechseln(626)

Beispiel 1

Lösung 1 (Fall wann)

Lösung 2 (Mod Case-When zählen)

Lösung 3 (Vereinigung)

Lösung 4 (Lag/Lead)

6. Geschlecht ändern(627)

Beispiel 1

Lösung 1 (Fall wann)

Lösung 2 (falls)

7. Kunden, die alle Produkte gekauft haben (1045)

Beispiel 1

Lösung eins (Zählung)

Lösung 2 (verschachtelte Auswahl)


1. Baumknoten (608)

Oberfläche:Tree

+-------------+------+
| Spaltenname | Geben Sie | ein
+-------------+------+
| id | int |
| p_id | int |
+-------------+------+
id ist eine Spalte in dieser Tabelle mit eindeutigen Werten.
Jede Zeile dieser Tabelle enthält Informationen über die ID eines Knotens im Baum und die ID seines übergeordneten Knotens.
Die angegebene Struktur ist immer ein gültiger Baum.

Jeder Knoten im Baum kann einen von drei Typen haben:

  • „Blatt“ : Der Knoten ist ein Blattknoten.
  • „Root“ : Der Knoten ist die Wurzel des Baums.
  • „lnner“ : Der Knoten ist weder ein Blattknoten noch ein Wurzelknoten.

Schreiben Sie eine Lösung, um den Typ jedes Knotens im Baum anzugeben.

Gibt die Ergebnistabelle in  beliebiger Reihenfolge zurück  .

Das resultierende Format ist wie folgt.

Beispiel 1

eingeben:
Baumtabelle:
+----+------+
| id | p_id |
+----+------+
| 1 | null |
| 2 | 1 |
| 3 | 1 |
| 4 | 2 |
| 5 | 2 |
+----+------+
Ausgabe:
+----+-------+
| id | Typ |
+----+-------+
| 1 | Wurzel |
| 2 | Innen |
| 3 | Blatt |
| 4 | Blatt |
| 5 | Blatt |
+----+-------+
erklären:
Knoten 1 ist der Wurzelknoten, da sein übergeordneter Knoten leer ist und er über die untergeordneten Knoten 2 und 3 verfügt.
Knoten 2 ist ein interner Knoten, da er über den übergeordneten Knoten 1 und die untergeordneten Knoten 4 und 5 verfügt.
Die Knoten 3, 4 und 5 sind Blattknoten, da sie einen übergeordneten Knoten und keine untergeordneten Knoten haben.

Lösung 1 (Fall wann)

Zunächst ist der Wurzelknoten leicht zu beurteilen. Verwenden Sie zunächst ein Flag, um zwischen Wurzel und Nicht-Wurzel zu unterscheiden, und bestimmen Sie dann mithilfe von p_id, ob er eine ID enthält, und beurteilen Sie, ob es sich gemäß diesem Standard um einen Blattknoten handelt.

# Write your MySQL query statement below
select id,case 
when flag=0 then 'Root'
when p_id is not null then 'Inner' 
else 'Leaf'
end as type
from  (select id,if((p_id is null),0,1) flag from tree ) a 
left join
(select p_id from tree where p_id is not null group by p_id) b 
on a.id=b.p_id

Lösung 2 (nicht in)

Wenn Sie den Fall verwenden, beurteilen Sie zunächst, ob es sich um einen Wurzelknoten handelt, und unterscheiden Sie dann anhand einer inneren Abfrage, ob es sich um einen Blattknoten handelt. Obwohl diese Methode einfacher ist, ist die Leistung nicht verlustbehafteter und die Gesamtgeschwindigkeit ähnelt der Lösung 1.

SELECT
    id,
    (
        CASE
            WHEN p_id IS NULL THEN 'Root'
            WHEN id NOT IN(
                SELECT
                    p_id
                FROM tree
                WHERE p_id IS NOT NULL
            ) THEN 'Leaf'
            ELSE 'Inner'
        END
    )as type
FROM tree

2. Urteilsdreieck (610)

Oberfläche: Triangle

+-------------+------+
| Spaltenname | Geben Sie | ein
+-------------+------+
| x | int |
| y | int |
| z | int |
+-------------+------+
In SQL sind (x, y, z) die Primärschlüsselspalten der Tabelle.
Jede Zeile der Tabelle enthält die Längen von drei Liniensegmenten.

Meldet für alle drei Liniensegmente, ob sie ein Dreieck bilden.

Gibt die Ergebnistabelle in  beliebiger Reihenfolge  zurück .

Das Abfrageergebnisformat ist wie folgt.

Beispiel 1

eingeben: 
Dreieckstisch:
+----+----+----+
| x | y | z |
+----+----+----+
| 13 | 15 | 30 |
| 10 | 20 | 15 |
+----+----+----+
Ausgabe: 
+----+----+----+----------+
| x | y | z | Dreieck |
+----+----+----+----------+
| 13 | 15 | 30 | Nein |
| 10 | 20 | 15 | Ja |
+----+----+----+----------+

Lösung 1 (Fall wann)

Nutzen Sie die Eigenschaft, dass die Summe zweier Seiten eines Dreiecks größer ist als die dritte Seite.

# Write your MySQL query statement below
select *,
case when (x+y)>z and  (x+z)>y and (y+z)>x then 'Yes'
else 'No'
end as triangle
from triangle

Lösung 2 (falls)

Select *,IF(x+y>z and x+z>y and y+z>x, "Yes", "No") AS triangle
FROM triangle

Lösung 3 (verschachtelt, wenn)

Dies wurde von Youyou auf Likou geschrieben und seine Geschwindigkeit ist die schnellste.

Prinzip: x + y + z > 2 * max(x, y, z) [ x + y + z > z + z, Kombination aus drei Bedingungen ]

select x, y, z, 
if(x + y + z > 2 * if(x > y and x > z, x, if(y > x and y > z, y, z)), 'Yes', 'No') triangle 
from Triangle

3. Die größte Zahl, die nur einmal vorkommt (619)

MyNumbers Oberfläche:

+-------------+------+
| Spaltenname | Geben Sie | ein
+-------------+------+
| ob int |
+-------------+------+
Die Tabelle kann Duplikate enthalten (mit anderen Worten: In SQL hat die Tabelle keinen Primärschlüssel).
Jede Zeile dieser Tabelle enthält eine Ganzzahl.

Eine einzelne Zahl  ist  MyNumbers eine Zahl, die nur einmal in der Tabelle vorkommt.

Finden Sie die größte  einzelne Zahl  .  Gibt zurück  , wenn keine  einzelne Ziffernull vorhanden ist  .

Die Abfrageergebnisse werden im folgenden Beispiel angezeigt.

Beispiel 1

eingeben:
MyNumbers-Tabelle:
+-----+
| num |
+-----+
| 8 |
| 8 |
| 3 |
| 3 |
| 1 |
| 4 |
| 5 |
| 6 |
+-----+
Ausgabe:
+-----+
| num |
+-----+
| 6 |
+-----+
Erläuterung: Die einzelnen Ziffern sind 1, 4, 5 und 6.
6 ist die größte Einzelzahl, Rückgabe 6.

Lösung 1 (Zähllimit)

Wählen Sie zunächst die Zahl aus, die gemäß count() nur einmal vorkommt, und wählen Sie dann durch Sortieren und Paginieren die größte Zahl aus.

# Write your MySQL query statement below
select 
case 
when count(*)=1 then num
when num is null then null
end as 'num' from MyNumbers group by num  order by num desc limit 1

Lösung 2 (maximal)

Da diese Frage null enthält, benötigen wir Nulldaten. Im Folgenden finden Sie einige Zusammenfassungen aus dem Internet. Es wurde festgestellt, dass einige Aggregationsfunktionen mit Null versehen sind. Diese Methode ist schneller

# Write your MySQL query statement below
# 表格为空,加入任何SUM/AVG/MAX/MIN函数,都可以得到null值的结果。
# 可以使用聚合函数进行空值null值的转换,具体的聚合函数包括SUM/AVG/MAX/MIN
# 可以使用select语句进行转换,但空值应直接写在select中而非from中
# limit语句无法出现新的null值
# where和having同样无法出现新的null值

# ifnull函数定位:用于判断第一个表达式是否为 NULL,如果为 NULL 则返回第二个参数的值,如果不为 NULL 则返回第一个参数的值。
#   IFNULL(expression, alt_value)

SELECT
    MAX(num) AS num
FROM
    (SELECT
        num
    FROM
        MyNumbers
    GROUP BY num
    HAVING COUNT(num) = 1) AS t
;

4. Lustige Filme(620)

In einer bestimmten Stadt wurde ein neues Kino eröffnet, und viele Menschen kamen, um den Film anzusehen. Das Kino legt besonderen Wert auf das Benutzererlebnis und verfügt über eine spezielle LED-Anzeigetafel für Filmempfehlungen, auf der Filmkritiken und zugehörige Filmbeschreibungen veröffentlicht werden.

Als Leiter der Informationsabteilung des Kinos müssen Sie eine SQL-Abfrage schreiben, um alle Filme herauszufinden, deren Beschreibung nicht boring  langweilig) ist und  deren ID ungerade ist  , und die Ergebnisse nach Klasse zu ordnen  rating .

Zum Beispiel die folgende Tabelle  cinema:

+---------+-----------+--------------+-----------+
| id | Film | Beschreibung | Bewertung |
+---------+-----------+--------------+-----------+
| 1 | Krieg | tolles 3D | 8,9 |
| 2 | Wissenschaft | Fiktion | 8,5 |
| 3 | irisch | langweilig | 6.2 |
| 4 | Eislied | Fantasie | 8,6 |
| 5 | Hauskarte| Interessant| 9.1 |
+---------+-----------+--------------+-----------+

Für das obige Beispiel wäre die korrekte Ausgabe:

+---------+-----------+--------------+-----------+
| id | Film | Beschreibung | Bewertung |
+---------+-----------+--------------+-----------+
| 5 | Hauskarte| Interessant| 9.1 |
| 1 | Krieg | tolles 3D | 8,9 |
+---------+-----------+--------------+-----------+

Lösung eins

# Write your MySQL query statement below
select * from cinema where description !='boring' and id%2=1 order by rating desc

5. Sitzplatz wechseln(626)

Oberfläche: Seat

+-------------+---------+
| Spaltenname | Geben Sie | ein
+-------------+---------+
| id | int |
| Name | varchar |
+-------------+---------+
id ist die Primärschlüsselspalte (eindeutiger Wert) der Tabelle.
Jede Zeile dieser Tabelle stellt den Namen und die ID eines Schülers dar.
id ist ein sequentielles Inkrement.

Schreiben Sie eine Lösung, um die Sitzplatznummern von jeweils zwei aufeinanderfolgenden Schülern zu vertauschen. Wenn die Anzahl der Schüler ungerade ist, wird die ID des letzten Schülers nicht vertauscht.

Gibt die Ergebnistabelle in  id aufsteigender Reihenfolge zurück  .

Das Abfrageergebnisformat ist wie folgt.

Beispiel 1

eingeben: 
Sitztisch:
+----+---------+
| id | Student |
+----+---------+
| 1 | Abt |
| 2 | Doris |
| 3 | Emerson |
| 4 | Grün |
| 5 | James |
+----+---------+
Ausgabe: 
+----+---------+
| id | Student |
+----+---------+
| 1 | Doris |
| 2 | Abt |
| 3 | Grün |
| 4 | Emerson |
| 5 | James |
+----+---------+
Erläuterung:
 Beachten Sie, dass bei einer ungeraden Studierendenzahl der Sitzplatz des letzten Studierenden nicht geändert werden muss.

Lösung 1 (Fall wann)

Verwenden Sie die linke Verknüpfung, um die drei Tabellen zu verbinden, und beurteilen Sie dann, ob sie leer ist. Dies dient dazu, den Namen zu ändern

select a.id,case when b.student is not null then b.student
when c.student is not null then c.student
else a.student
end as 'student' from seat a left join seat b on a.id=b.id-1 and a.id%2=1 
left join seat c on a.id=c.id+1 and a.id%2=0

Lösung 2 (Mod Case-When zählen)

Verwenden Sie count, um zu unterscheiden, ob die Gesamtsumme einfach oder doppelt ist, und verwenden Sie dann case, um die ID zu beurteilen, was darin besteht, die getarnte ID zu ändern

SELECT
    (CASE
        WHEN MOD(id, 2) != 0 AND counts != id THEN id + 1
        WHEN MOD(id, 2) != 0 AND counts = id THEN id
        ELSE id - 1
    END) AS id,
    student
FROM
    seat,
    (SELECT
        COUNT(*) AS counts
    FROM
        seat) AS seat_counts
ORDER BY id ASC;

Lösung 3 (Vereinigung)

Verwenden Sie Left Join und Union, um zuerst die Namen der Schüler mit ungerader ID und dann die Namen der Schüler mit gerader ID zu ändern. Nach all den Änderungen

Dann führt Union alle IDs zusammen

select a.id as id,ifnull(b.student,a.student) as student from Seat as a
left join (
  select * from Seat
  where mod(id,2) = 0
) as b
on (a.id+1) = b.id
where mod(a.id,2) = 1
union
select c.id as id,d.student as student from Seat as c
left join (
  select * from Seat
  where mod(id,2) = 1
) as d
on (c.id-1) = d.id
where mod(c.id,2) = 0
order by id asc;

Lösung 4 (Lag/Lead)

Lag/Lead(col,n,DEFAULT) wird verwendet, um den Wert der n-ten Zeile vor oder hinter der aktuellen Zeile im Fenster zu zählen

  • Der erste Parameter ist der Spaltenname,
  • Der zweite Parameter ist die nächste/vorherige n-te Zeile (optional, Standard ist 1),
  • Der dritte Parameter ist der Standardwert (wenn die obere n-te Zeile NULL ist, wird der Standardwert verwendet, wenn nicht angegeben, ist er NULL)

Es ist zu beachten, dass „lag“ die Daten vor der aktuellen Zeile und „lead“ die Daten nach der aktuellen Zeile erhält

SELECT 
    id,
    IF(id % 2 = 0, last, next) student
FROM (
    SELECT 
    id,student,
    lag(student,1,student) over(order by id) last,
    lead(student,1,student) over(order by id) next
    FROM seat
) t;

6. Geschlecht ändern(627)

Salary Oberfläche:

+-------------+----------+
| Spaltenname | Geben Sie | ein
+-------------+----------+
| id | int |
| Name | varchar |
| Sex | ENUM |
| Gehalt | int |
+-------------+----------+
id ist der Primärschlüssel dieser Tabelle.
Der Wert der Geschlechtsspalte ist vom Typ ENUM und kann nur aus ('m', 'f') übernommen werden.
Dieses Formular enthält Informationen über Mitarbeiter des Unternehmens.

'f' Bitte schreiben Sie eine SQL-Abfrage, um alle Summen  auszutauschen  'm' (dh alle zu ändern  'f' und  'm' umgekehrt), und zwar mit nur  einer einzigen Aktualisierungsanweisung  und ohne die Erstellung temporärer Zwischentabellen.

Beachten Sie, dass Sie nur eine Update-Anweisung und keine  Select-Anweisung verwenden dürfen  .

Die Abfrageergebnisse werden im folgenden Beispiel angezeigt.

Beispiel 1

eingeben:
Gehaltstabelle:
+----+------+-----+--------+
| id | Name | Sex | Gehalt |
+----+------+-----+--------+
| 1 | A | m | 2500 |
| 2 | B | f | 1500 |
| 3 | C | m | 5500 |
| 4 | D | f | 500 |
+----+------+-----+--------+
Ausgabe:
+----+------+-----+--------+
| id | Name | Sex | Gehalt |
+----+------+-----+--------+
| 1 | A | f | 2500 |
| 2 | B | m | 1500 |
| 3 | C | f | 5500 |
| 4 | D | m | 500 |
+----+------+-----+--------+
erklären:
(1, A) und (3, C) wurden von „m“ in „f“ geändert.
(2, B) und (4, D) wurden von „f“ in „m“ geändert.

Lösung 1 (Fall wann)

# Write your MySQL query statement below
update salary set sex=(
  case when sex='m' then 'f'
  else 'm'
  end
)

Lösung 2 (falls)

# Write your MySQL query statement below
update salary set sex=(if(sex='m','f','m'))

Lösung 3 (ersetzen)

am schnellsten

# replace(‘总字符串’,要下场的字符,要上场的字符)
update salary set sex = replace("fm", sex, "")

7. Kunden, die alle Produkte gekauft haben (1045)

Customer Oberfläche:

+-------------+---------+
| Spaltenname | Geben Sie | ein
+-------------+---------+
| customer_id | int |
| Produktschlüssel | int |
+-------------+---------+
Die Tabelle enthält möglicherweise doppelte Zeilen.
customer_id ist nicht NULL.
product_key ist der Fremdschlüssel (Referenzspalte) der Produkttabelle.

Product Oberfläche:

+-------------+---------+
| Spaltenname | Geben Sie | ein
+-------------+---------+
| Produktschlüssel | int |
+-------------+---------+
product_key ist der Primärschlüssel (Spalte mit eindeutigen Werten) dieser Tabelle.

 Schreiben Sie eine Lösung, die die IDs der Kunden Customer in der Tabelle  meldet  , die alle Produkte in der Tabelle gekauft haben.Product

Für die zurückgegebene Ergebnistabelle  ist keine Reihenfolge erforderlich  .

Das zurückgegebene Ergebnisformat ist wie folgt.

Beispiel 1

eingeben:
Kundentisch:
+-------------+-------------+
| customer_id | Produktschlüssel |
+-------------+-------------+
| 1 | 5 |
| 2 | 6 |
| 3 | 5 |
| 3 | 6 |
| 1 | 6 |
+-------------+-------------+
Produkttabelle:
+-------------+
| Produktschlüssel |
+-------------+
| 5 |
| 6 |
+-------------+
Ausgabe:
+-------------+
| customer_id |
+-------------+
| 1 |
| 3 |
+-------------+
Erläuterung: 
Die IDs der Kunden, die alle Produkte (5 und 6) gekauft haben, sind 1 und 3.

Lösung eins (Zählung)

Gemessen an der Menge

# Write your MySQL query statement below
select customer_id from customer group by customer_id 
having count(distinct product_key)=(select count(*) from product)

Lösung 2 (verschachtelte Auswahl)

Wählen Sie Kunden-ID und Produktschlüssel aus 

FROM Customer GROUP BY customer_id, product_key

Dieser Abschnitt wird zum Deduplizieren und anschließenden Gruppieren der Zählung von hier aus und schließlich zum Vergleichen entsprechend der Anzahl der Produkte verwendet

# Write your MySQL query statement below
SELECT customer_id 
FROM (SELECT customer_id, COUNT(*) AS 'number' 
FROM (SELECT customer_id, product_key 
FROM Customer GROUP BY customer_id, product_key) a
GROUP BY customer_id) b 
WHERE number = (SELECT COUNT(DISTINCT product_key) FROM Product);

おすすめ

転載: blog.csdn.net/weixin_53011574/article/details/132357766