~~NOTOC~~
====== MySQL: Przykłady zapytań na bazie World ======
{{:notatki:pasted:20250513-154333.png}}\\
Schemat bazy danych.
Baza world jest to przykładowa baza jeżeli wybierzemy to będzie instalowana razem ze środowiskiem MySQL community.
Zapytania można wykonać i zaobserwować wyniki za pomocą aplikacji: https://wiki.ostrowski.net.pl/php_mysql/world.php
===== Wyświetlenie 10 największych krajów według populacji =====
SELECT Name, Population
FROM Country
ORDER BY Population DESC
LIMIT 10;
===== Średnia populacja miast w Niemczech =====
SELECT AVG(Population) AS AvgCityPopulation
FROM City
WHERE CountryCode = 'DEU';
===== Lista języków urzędowych (IsOfficial = 'T') w krajach azjatyckich =====
SELECT cl.CountryCode, c.Name AS CountryName, cl.Language
FROM CountryLanguage cl
JOIN Country c ON cl.CountryCode = c.Code
WHERE cl.IsOfficial = 'T' AND c.Continent = 'Asia';
===== Suma populacji krajów z podziałem na kontynenty =====
SELECT Continent, SUM(Population) AS TotalPopulation
FROM Country
GROUP BY Continent
ORDER BY TotalPopulation DESC;
===== Miasta o populacji większej niż 1 milion w Ameryce Południowej =====
SELECT ci.Name AS City, ci.Population, co.Name AS Country
FROM City ci
JOIN Country co ON ci.CountryCode = co.Code
WHERE ci.Population > 1000000 AND co.Continent = 'South America'
ORDER BY ci.Population DESC;
===== Kraj z największą liczbą miast =====
SELECT co.Name, COUNT(ci.ID) AS CityCount
FROM Country co
JOIN City ci ON co.Code = ci.CountryCode
GROUP BY co.Name
ORDER BY CityCount DESC
LIMIT 1;
===== Kraje, gdzie język hiszpański nie jest językiem urzędowym, ale jest używany =====
SELECT c.Name, cl.Language
FROM CountryLanguage cl
JOIN Country c ON cl.CountryCode = c.Code
WHERE cl.Language = 'Spanish' AND cl.IsOfficial = 'F';
===== Kraje z populacją większą niż średnia populacja wszystkich krajów =====
SELECT Name, Population
FROM Country
WHERE Population > (SELECT AVG(Population) FROM Country);
===== Użycie CASE: klasyfikacja krajów według wielkości populacji =====
SELECT Name,
Population,
CASE
WHEN Population > 100000000 THEN 'Very Large'
WHEN Population > 50000000 THEN 'Large'
WHEN Population > 10000000 THEN 'Medium'
ELSE 'Small'
END AS PopulationCategory
FROM Country;
===== CTE (Common Table Expression) – kraje z językiem angielskim, posortowane wg populacji =====
WITH EnglishSpeakingCountries AS (
SELECT CountryCode
FROM CountryLanguage
WHERE Language = 'English' AND IsOfficial = 'T'
)
SELECT c.Name, c.Population
FROM Country c
JOIN EnglishSpeakingCountries esc ON c.Code = esc.CountryCode
ORDER BY c.Population DESC;
===== Kraj z największym średnim zaludnieniem miast =====
(czyli gdzie średnia liczba mieszkańców na miasto jest największa)
SELECT co.Name, AVG(ci.Population) AS AvgCityPopulation
FROM Country co
JOIN City ci ON co.Code = ci.CountryCode
GROUP BY co.Code
HAVING COUNT(ci.ID) > 1
ORDER BY AvgCityPopulation DESC
LIMIT 1;
===== Miasta w krajach, których populacja jest powyżej średniej, i w których oficjalnym językiem jest angielski =====
SELECT ci.Name AS City, co.Name AS Country, ci.Population
FROM City ci
JOIN Country co ON ci.CountryCode = co.Code
WHERE co.Population > (
SELECT AVG(Population) FROM Country
)
AND co.Code IN (
SELECT CountryCode FROM CountryLanguage
WHERE Language = 'English' AND IsOfficial = 'T'
);
===== Lista krajów, które mają mniej miast niż średnia liczba miast na kraj, ale powyżej średniej populacji =====
SELECT co.Name, COUNT(ci.ID) AS CityCount, co.Population
FROM Country co
LEFT JOIN City ci ON co.Code = ci.CountryCode
GROUP BY co.Code
HAVING COUNT(ci.ID) < (
SELECT AVG(CityCount)
FROM (
SELECT CountryCode, COUNT(*) AS CityCount
FROM City
GROUP BY CountryCode
) AS SubCityCounts
)
AND co.Population > (
SELECT AVG(Population) FROM Country
);
===== Wszystkie oficjalne języki krajów, których stolica ma populację powyżej 1 miliona =====
SELECT DISTINCT cl.Language, co.Name AS Country
FROM Country co
JOIN CountryLanguage cl ON co.Code = cl.CountryCode
WHERE cl.IsOfficial = 'T'
AND co.Capital IN (
SELECT ID FROM City WHERE Population > 1000000
);
===== Kraje z największą różnicą między populacją kraju a jego największym miastem =====
SELECT co.Name, co.Population - MAX(ci.Population) AS PopulationDiff
FROM Country co
JOIN City ci ON co.Code = ci.CountryCode
GROUP BY co.Code
ORDER BY PopulationDiff DESC
LIMIT 10;
===== Dla każdego kontynentu: kraj o największej średniej populacji miast =====
SELECT Continent, Name, AvgCityPop
FROM (
SELECT co.Continent, co.Name, AVG(ci.Population) AS AvgCityPop,
RANK() OVER (PARTITION BY co.Continent ORDER BY AVG(ci.Population) DESC) AS rnk
FROM Country co
JOIN City ci ON co.Code = ci.CountryCode
GROUP BY co.Code
) AS ranked
WHERE rnk = 1;
===== Kraje, w których oficjalnie mówi się więcej niż jednym językiem =====
SELECT co.Name, COUNT(*) AS OfficialLanguages
FROM Country co
JOIN CountryLanguage cl ON co.Code = cl.CountryCode
WHERE cl.IsOfficial = 'T'
GROUP BY co.Code
HAVING COUNT(*) > 1;
===== Kraje, w których mówi się językiem, którego nie zna żaden sąsiad z tego samego kontynentu =====
To wymaga analizy języków w kontekście kontynentu i unikalności – trochę "sztuczne", ale ciekawe:
SELECT DISTINCT c1.Name, cl1.Language
FROM Country c1
JOIN CountryLanguage cl1 ON c1.Code = cl1.CountryCode
WHERE cl1.Language NOT IN (
SELECT cl2.Language
FROM Country c2
JOIN CountryLanguage cl2 ON c2.Code = cl2.CountryCode
WHERE c2.Continent = c1.Continent
AND c2.Code != c1.Code
)
AND cl1.IsOfficial = 'T';
===== Średnia populacja miast dla każdego języka urzędowego w krajach, gdzie ten język jest używany =====
SELECT cl.Language, AVG(ci.Population) AS AvgCityPopulation
FROM CountryLanguage cl
JOIN Country co ON cl.CountryCode = co.Code
JOIN City ci ON co.Code = ci.CountryCode
WHERE cl.IsOfficial = 'T'
GROUP BY cl.Language
ORDER BY AvgCityPopulation DESC;
===== Lista krajów, które nie mają żadnych miast w bazie danych =====
SELECT co.Name
FROM Country co
LEFT JOIN City ci ON co.Code = ci.CountryCode
WHERE ci.ID IS NULL;