Underfrågor
Ofta behöver du hämta data baserat på villkor som själva härleds från data i databasen.
Med underfrågor kan du göra detta genom att låta dig använda resultatet av en SELECT -instruktion som en del av en annan. Detta är användbart för uppgifter som att hitta alla kunder som gjort beställningar som överskrider ett visst genomsnitt eller identifiera produkter som tillhandahålls av en viss uppsättning leverantörer.
Underfrågor kan användas i följande kontexter:
Inom SELECT satser i instruktioner (FROM, WHERE, HAVING -sats)
I datamanipuleringsinstruktioner (INSERT, UPDATE, DELETE -instruktion)
Viktiga punkter att betona
En underfråga är alltid en SELECT -instruktion.
Underfrågan omges av parenteser ().
Underfrågans resultat används av den yttre frågan.
Underfrågeexempel
SELECT product_name, price
FROM sales.products
WHERE price > (
SELECT AVG(price)
FROM sales.products
);
Den här frågan hämtar namn och priser på produkter från tabellen sales.products där produktens price är större än genomsnittet price för alla produkter i samma tabell. Den använder en underfråga i WHERE -satsen för att beräkna medelvärdet price genom att AVG(price) välja från tabellen sales.products . Resultatet av den här underfrågan jämförs sedan med price kolumnen i den yttre frågan för att filtrera och visa endast de produkter vars priser överstiger detta beräknade genomsnitt.
SELECT customer_id, customer_name
FROM sales.customers
WHERE customer_id IN (
SELECT DISTINCT customer_id
FROM sales.orders
);
Den här frågan hämtar ID:t och namnen på kunder från tabellen sales.customers som har gjort minst en beställning. Detta uppnås med hjälp av en underfråga i WHERE -satsen. Underfrågan väljer distinkta customer_id värden från sales.orders tabellen, som representerar kunder som har gjort några beställningar. Den yttre frågan använder sedan dessa ID:er för att filtrera och visa kundinformation, vilket säkerställer att endast de kunder som är associerade med beställningar inkluderas i resultatet.
SELECT supplier_id, AVG (price) AS avg_price
FROM (
SELECT supplier_id, price
FROM sales.products
) AS product_prices
GROUP BY supplier_id;
Den här frågan beräknar det genomsnittliga produktpriset för varje leverantör. Den använder en underfråga i FROM-satsen för att välja supplier_id och priset från sales.products table. Den yttre frågan grupperar sedan resultatet supplier_id efter och beräknar medelvärdet price för varje grupp. Den här metoden kan vara till hjälp när du vill utföra aggregering på en filtrerad eller förbearbetad uppsättning data.
UPDATE sales.products
SET price = price * 1.1
WHERE category_id = (
SELECT category_id
FROM sales.products
GROUP BY category_id
ORDER BY AVG(price) DESC LIMIT 1
);
Den här frågan ökar priserna på produkter i kategorin med det högsta genomsnittliga priset med 10%. Modifierar kolumnen UPDATE i tabellen price genom att multiplicera den med 1,1 för rader som matchar villkoret i sales.products-satsen.
Underfrågan i WHERE -satsen bestämmer category_id kategorin med det högsta genomsnittet price genom att gruppera produkterna efter deras category_id, beräkna medelvärdet price för varje grupp och sortera dem i fallande ordning efter medelvärde price. Säkerställer LIMIT 1 att endast det översta resultatet, det vill säga kategorin med det högsta genomsnittet price, väljs och används för att filtrera raderna för uppdateringen.