Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Podstawowe zapytania MySQL

Zapytania możesz wypróbować pod adresemhttp://sqlfiddle.com/#!9/839d2/1

Zapytanie 1

Lista wszystkich planet, które mają kapitanów. Pokazuje id_planet, planet_name, całkowitą liczbę kapitanów na każdej z tych planet, a także liczbę bitew (jeśli istnieją), które się tam rozegrały.

SELECT DISTINCT aa.id_planet, aa.planet_name, _aa.captains_count, _bb.battles_count
FROM planet AS aa
INNER JOIN soldier AS bb
ON aa.id_planet = bb.planet_id
INNER JOIN (
    SELECT planet_id, COUNT(*) AS captains_count
    FROM soldier
    WHERE rank = 'captain'
    GROUP BY planet_id
) AS _aa
ON aa.id_planet = _aa.planet_id
LEFT JOIN (
    SELECT id_planet_battle, COUNT(*) AS battles_count
    FROM battle
    GROUP BY id_planet_battle
) AS _bb
ON aa.id_planet = _bb.id_planet_battle
WHERE bb.rank = 'captain';

Możesz uzyskać te same wyniki, używając tego:

SELECT DISTINCT aa.id_planet, aa.planet_name,
(
    SELECT COUNT(*)
    FROM soldier AS _aa
    WHERE _aa.rank = 'captain' AND aa.id_planet = _aa.planet_id
    GROUP BY _aa.planet_id
) AS captains_count,
(
    SELECT COUNT(*)
    FROM battle AS _bb
    WHERE aa.id_planet = _bb.id_planet_battle
    GROUP BY _bb.id_planet_battle 
) AS battles_count
FROM planet AS aa
INNER JOIN soldier AS bb
ON aa.id_planet = bb.planet_id
WHERE bb.rank = 'captain';

Zapytanie 3

SELECT aa.name, aa.rank, bb.planet_name AS planet_from, (
    SELECT COUNT(*) 
    FROM soldier AS _aa 
    WHERE _aa.planet_id = aa.planet_id
) AS number_of_soldiers, 
(
    SELECT COUNT(*)
    FROM battle AS _bb
    WHERE _bb.id_planet_battle = aa.planet_id
) AS number_of_battles
FROM soldier AS aa
INNER JOIN planet AS bb
ON aa.planet_id = bb.id_planet;

Tutaj nie używałem złączeń do obliczania liczby_żołnierzy i_liczby_bitew, tak jak to zrobiłem w zapytaniu 1.1, ponieważ byłoby to skorelowane podzapytanie i jako takie nie mogłoby mieć dostępu do zapytań zewnętrznych (https://dev.mysql.com/doc/refman/5.5/en/from-klauzula -podzapytania.html ).

Błędne zapytanie:

SELECT DISTINCT aa.id_planet, aa.planet_name, _aa.captains_count, _bb.battles_count
FROM planet AS aa
INNER JOIN soldier AS bb
ON aa.id_planet = bb.planet_id
INNER JOIN (
    SELECT COUNT(*) AS captains_count
    FROM soldier AS _aa
    WHERE _aa.rank = 'captain' AND aa.id_planet = _aa.planet_id
    GROUP BY _aa.planet_id
) AS _aa
ON aa.id_planet = _aa.planet_id
LEFT JOIN (
    SELECT COUNT(*) AS battles_count
    FROM battle AS _bb
    WHERE aa.id_planet = _bb.id_planet_battle
    GROUP BY _bb.id_planet_battle 
) AS _bb
ON aa.id_planet = _bb.id_planet_battle
WHERE bb.rank = 'captain';

Zatem powyższe zapytanie jest błędne i powoduje błąd:Nieznana kolumna „aa.id_planet” w klauzuli „where”.

Jeśli chodzi o drugie pytanie, o które prosiłeś, mam nadzieję, że ktoś inny może spróbować.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MYSQL:Użytkownik — konfiguracja tabeli szczegółów profilu — najlepsze praktyki

  2. Jak wyeksportować dane z SQL Server 2005 do MySQL

  3. UPDATE z ORDER BY i LIMIT nie działa w MYSQL

  4. Nie można połączyć się z serwerem MySQL na „127.0.0.1” (10061) (2003)

  5. MySQL ORDER BY Pole daty, które nie ma formatu daty