[PYTHON] Lösen von Übungen im GCI Data Scientist-Schulungskurs Kapitel 8

GCI Data Scientist-Schulungskurs

"GCI Data Scientist Training Course" wird von der Universität Tokio (Matsuo Laboratory) angeboten "* Praktische Daten Der Inhalt des Übungsteils wird im Jupyter NoteBook-Format (CC-BY-NC-ND) im Scientist Training Course und im Deep Learning Course </ u> * "veröffentlicht. Kapitel 8 ist "** Datenbank- und SQL-Grundlagen **", in dem Sie lernen, wie Sie ein relationales Datenbankverwaltungssystem bedienen. Anstelle der Schaltfläche "Gefällt mir" für die wertvollen und wunderbaren Unterrichtsmaterialien, die Sie auf Japanisch lernen können, werde ich die Antworten veröffentlichen, die Sie gelöst haben. Bitte weisen Sie auf Fehler hin.

Ich wusste nicht, wie man MariaDB auf Jupyter Notebook ausführt, also habe ich MySQL auf WSL installiert und Befehle auf dem WSL-Terminal eingegeben.

Kapitel 8 Datenbank- und SQL-Grundlagen

8.1 Übersicht über dieses Kapitel

8.1.1 Was ist eine Datenbank?

8.1.2 RDBMS

8.2 SQL-Grundlagen

8.2.1 Datenbanken und Tabellen erstellen

** <Übung 1> ** Fügen Sie eine Zelle hinzu (drücken Sie + oben links), um die vorhandene Datenbank anzuzeigen. Erstellen Sie dann eine neue Datenbank (z. B. TEST2) und wählen Sie die Verwendung dieser Datenbank.

** <Übung 2> ** Erstellen Sie eine neue Tabelle "meibo2" in der Datenbank, die in Übung 1 erstellt und ausgewählt wurde. Stellen Sie nach dem Erstellen sicher, dass die Tabelle vollständig ist.

** <Übung 3> ** Fügen wir der neu erstellten Tabelle Daten hinzu. Stellen Sie nach dem Hinzufügen sicher, dass die Daten enthalten sind.

/*Übung 1*/
create database TEST2;
use TEST2;

/*Übung 2*/
create table meibo2
  (id int primary key, name varchar(20))
  engine = MyISAM
  default charset = utf8;
show tables;

/*Übung 3*/
insert into meibo2 (id, name) values (1, "Yamada");
select * from meibo2;
+-----------------+
| Tables_in_TEST2 |
+-----------------+
| meibo2          |
+-----------------+
1 row in set (0.00 sec)

+----+--------+
| id | name   |
+----+--------+
|  1 | Yamada |
+----+--------+
1 row in set (0.00 sec)

8.2.2 Daten suchen und aktualisieren, Tabellenspalten löschen, ändern

** [Lass es uns versuchen] ** Lassen Sie uns die Daten durchsuchen, indem Sie den obigen bedingten Ausdruck auf verschiedene Arten ändern. Wie suchen Sie beispielsweise nach Personen, deren ID nicht 1 ist oder deren Name mit a endet?

select * from meibo where name like '%a';
+----+--------+
| id | name   |
+----+--------+
|  1 | Yamada |
|  2 | Tanaka |
+----+--------+
2 rows in set (0.00 sec)

** <Übung 1> ** Wählen Sie die Datenbank von TEST1 aus und extrahieren Sie den Personendatensatz mit der ID = 4 in der obigen Tabelle meibo.

select * from meibo where id=4;
+----+------+-------+------+
| id | name | class | age  |
+----+------+-------+------+
|  4 | Kato |     2 |   15 |
+----+------+-------+------+
1 row in set (0.00 sec)

** <Übung 2> ** Aktualisieren Sie die Klasse der Person mit der ID = 8 bis 7 in der obigen Meibo-Tabelle. Wenn Sie die Aktualisierung mit der select-Anweisung bestätigen können, setzen Sie die Klasse der Person mit id = 8 auf 1 zurück.

select * from meibo where id=8;
update meibo set class=7 where id=8;
select * from meibo where id=8;
update meibo set class=1 where id=8;
select * from meibo where id=8;
+----+------+-------+------+
| id | name | class | age  |
+----+------+-------+------+
|  8 | Sato |     1 |   14 |
+----+------+-------+------+
1 row in set (0.00 sec)
​
+----+------+-------+------+
| id | name | class | age  |
+----+------+-------+------+
|  8 | Sato |     7 |   14 |
+----+------+-------+------+
1 row in set (0.00 sec)
​
+----+------+-------+------+
| id | name | class | age  |
+----+------+-------+------+
|  8 | Sato |     1 |   14 |
+----+------+-------+------+
1 row in set (0.00 sec)

** <Übungsfrage 3> (* Erforderliche Frage: Wird in nachfolgenden Fragen verwendet.) ** Fügen Sie dem gleichen Tabellen-Meibo wie oben eine neue Spaltenhöhe hinzu. Aktualisieren Sie außerdem mit 150 für Personen mit ID = 1 bis 4, 155 für Personen mit ID = 5 bis 6 und 160 für Personen mit ID = 7 bis 8.

alter table meibo add height int;
update meibo set height=150 where id=1;
update meibo set height=150 where id=2;
update meibo set height=150 where id=3;
update meibo set height=150 where id=4;
update meibo set height=155 where id=5;
update meibo set height=155 where id=6;
update meibo set height=160 where id=7;
update meibo set height=160 where id=8;
select * from meibo;
+----+----------+-------+------+--------+
| id | name     | class | age  | height |
+----+----------+-------+------+--------+
|  1 | Yamada   |     1 |   14 |    150 |
|  2 | Tanaka   |     2 |   13 |    150 |
|  3 | Suzuki   |     1 |   13 |    150 |
|  4 | Kato     |     2 |   15 |    150 |
|  5 | Ito      |     3 |   12 |    155 |
|  6 | Takeuchi |     2 |   16 |    155 |
|  7 | Kimura   |     3 |   11 |    160 |
|  8 | Sato     |     1 |   14 |    160 |
+----+----------+-------+------+--------+
8 rows in set (0.00 sec)

8.2.3 Datenaggregation, Berechnung, Sortierung

** <Übung 1> ** Wie viele verschiedene Altersstufen befinden sich auf demselben Meibo-Tisch wie oben?

select count(distinct age) as ageCnt from meibo;
+--------+
| ageCnt |
+--------+
|      6 |
+--------+
1 row in set (0.00 sec)

** <Übung 2> ** Finden Sie die Höhen der kürzesten und größten Menschen.

select min(height) as minHeight, max(height) as maxHeight from meibo;
+-----------+-----------+
| minHeight | maxHeight |
+-----------+-----------+
|       150 |       160 |
+-----------+-----------+
1 row in set (0.00 sec)

** <Übung 3> ** Extrahieren Sie Datensätze mit einer Höhe von 155 oder mehr und einer Klasse von 3.

select * from meibo where height>=155 and class=3;
+----+--------+-------+------+--------+
| id | name   | class | age  | height |
+----+--------+-------+------+--------+
|  5 | Ito    |     3 |   12 |    155 |
|  7 | Kimura |     3 |   11 |    160 |
+----+--------+-------+------+--------+
2 rows in set (0.00 sec)

8.2.4 Aggregation nach Gruppen

** <Übung 1> ** Finden Sie die durchschnittliche Größe für jede Klasse am Meibo-Tisch.

select class, avg(height) as avgHeight from meibo group by class;
| class | avgHeight |
+-------+-----------+
|     1 |  153.3333 |
|     2 |  151.6667 |
|     3 |  157.5000 |
+-------+-----------+
3 rows in set (0.00 sec)

** <Übung 2> ** Berechnen wir zusätzlich die Anzahl der Personen in jeder Klasse, die Größe der kleinsten Person und die Größe der größten Person in jeder Klasse.

select class, avg(height) as avgHeight, min(height) as minHeight, max(height) as maxHeight from meibo group by class;
+-------+-----------+-----------+-----------+
| class | avgHeight | minHeight | maxHeight |
+-------+-----------+-----------+-----------+
|     1 |  153.3333 |       150 |       160 |
|     2 |  151.6667 |       150 |       155 |
|     3 |  157.5000 |       155 |       160 |
+-------+-----------+-----------+-----------+
3 rows in set (0.00 sec)

** <Übung 3> ** Fragen Sie nach den gleichen Artikeln wie oben und beschränken Sie sich auf die über 13-Jährigen.

select class, avg(height) as avgHeight, min(height) as minHeight, max(height) as maxHeight from meibo where age>13 group by class;
+-------+-----------+-----------+-----------+
| class | avgHeight | minHeight | maxHeight |
+-------+-----------+-----------+-----------+
|     1 |  155.0000 |       150 |       160 |
|     2 |  152.5000 |       150 |       155 |
+-------+-----------+-----------+-----------+
2 rows in set (0.00 sec)

8.2.5 Verwendung mehrerer Tabellen

** <Übung 1> ** Erstellen Sie eine neue Tabelle mit dem Namen cardtb. Die Spalten sollten jedoch id, point, money (all int) sein. Fügen Sie außerdem die folgenden Daten ein. (id,point,money) = (1,100,1000),(2,NULL,60),(3,50,500),(4,30,600),(5,10,10),(6,NULL,40),(7,100,1000),(8,2000,100)

create table cardtb
  (id int primary key, point int, money int)
  engine = MyISAM
  default charset = utf8;

insert into cardtb (id,point,money)
  values (1,100,1000),(2,NULL,60),(3,50,500),(4,30,600),(5,10,10),(6,NULL,40),(7,100,1000),(8,2000,100);
    
select * from cardtb;
+----+-------+-------+
| id | point | money |
+----+-------+-------+
|  1 |   100 |  1000 |
|  2 |  NULL |    60 |
|  3 |    50 |   500 |
|  4 |    30 |   600 |
|  5 |    10 |    10 |
|  6 |  NULL |    40 |
|  7 |   100 |  1000 |
|  8 |  2000 |   100 |
+----+-------+-------+
8 rows in set (0.00 sec)

** <Übung 2> ** Verwenden Sie id als Schlüssel, um die obige Tabelle intern mit der Meibo-Tabelle zu verbinden.

select * from meibo as a join cardtb as b on a.id=b.id;
+----+----------+-------+------+--------+----+-------+-------+
| id | name     | class | age  | height | id | point | money |
+----+----------+-------+------+--------+----+-------+-------+
|  1 | Yamada   |     1 |   14 |    150 |  1 |   100 |  1000 |
|  2 | Tanaka   |     2 |   13 |    150 |  2 |  NULL |    60 |
|  3 | Suzuki   |     1 |   13 |    150 |  3 |    50 |   500 |
|  4 | Kato     |     2 |   15 |    150 |  4 |    30 |   600 |
|  5 | Ito      |     3 |   12 |    155 |  5 |    10 |    10 |
|  6 | Takeuchi |     2 |   16 |    155 |  6 |  NULL |    40 |
|  7 | Kimura   |     3 |   11 |    160 |  7 |   100 |  1000 |
|  8 | Sato     |     1 |   14 |    160 |  8 |  2000 |   100 |
+----+----------+-------+------+--------+----+-------+-------+
8 rows in set (0.00 sec)

** <Übung 3> ** Verwenden Sie id als Schlüssel, um die obige Tabelle mit der Meibo-Tabelle zu verbinden.

/*Das Ausgabeergebnis ist das gleiche wie in Übung 2*/
select * from meibo as a left join cardtb as b on a.id=b.id;
/* select * from meibo as a right join cardtb as b on a.id=b.id; */
+----+----------+-------+------+--------+------+-------+-------+
| id | name     | class | age  | height | id   | point | money |
+----+----------+-------+------+--------+------+-------+-------+
|  1 | Yamada   |     1 |   14 |    150 |    1 |   100 |  1000 |
|  2 | Tanaka   |     2 |   13 |    150 |    2 |  NULL |    60 |
|  3 | Suzuki   |     1 |   13 |    150 |    3 |    50 |   500 |
|  4 | Kato     |     2 |   15 |    150 |    4 |    30 |   600 |
|  5 | Ito      |     3 |   12 |    155 |    5 |    10 |    10 |
|  6 | Takeuchi |     2 |   16 |    155 |    6 |  NULL |    40 |
|  7 | Kimura   |     3 |   11 |    160 |    7 |   100 |  1000 |
|  8 | Sato     |     1 |   14 |    160 |    8 |  2000 |   100 |
+----+----------+-------+------+--------+------+-------+-------+
8 rows in set (0.00 sec)

8.2.6 case-Anweisung und Unterabfrage

** <Übung 1> ** Wenn die Höhe in der Meibo-Tabelle kleiner als 155 ist, nennen Sie sie "unter_155", wenn sie genau 155 ist, nennen Sie sie "gleich_155", und wenn sie größer als 155 ist, nennen Sie sie "über_155", um die Tabelle anzuzeigen.

select *
  ,case
    when height<155 then "below_155"
    when height=155 then "equal_155"
    when height>155 then "over_155"
    else "others"
  end as heightLevel
from meibo;
+----+----------+-------+------+--------+-------------+
| id | name     | class | age  | height | heightLevel |
+----+----------+-------+------+--------+-------------+
|  1 | Yamada   |     1 |   14 |    150 | below_155   |
|  2 | Tanaka   |     2 |   13 |    150 | below_155   |
|  3 | Suzuki   |     1 |   13 |    150 | below_155   |
|  4 | Kato     |     2 |   15 |    150 | below_155   |
|  5 | Ito      |     3 |   12 |    155 | equal_155   |
|  6 | Takeuchi |     2 |   16 |    155 | equal_155   |
|  7 | Kimura   |     3 |   11 |    160 | over_155    |
|  8 | Sato     |     1 |   14 |    160 | over_155    |
+----+----------+-------+------+--------+-------------+
8 rows in set (0.00 sec)

** <Übung 2> ** Verwenden Sie das obige Tabellen- und Unterabfragekonzept, um die Anzahl der Personen auf jeder Höhenebene zu ermitteln.

select a.heightLevel, count(*) from
  (select *
    ,case
      when height<155 then "below_155"
      when height=155 then "equal_155"
      when height>155 then "over_155"
      else "others"
    end as heightLevel
  from meibo) a group by a.heightLevel;
+-------------+----------+
| heightLevel | count(*) |
+-------------+----------+
| below_155   |        4 |
| equal_155   |        2 |
| over_155    |        2 |
+-------------+----------+
3 rows in set (0.00 sec)

** <Übung 3> ** Verwenden Sie die obigen Ideen für Tabellen und Unterabfragen, um das Durchschnittsalter für jede Höhenstufe zu ermitteln.

select a.heightLevel, avg(age) from
  (select *
    ,case
      when height<155 then "below_155"
      when height=155 then "equal_155"
      when height>155 then "over_155"
      else "others"
    end as heightLevel
  from meibo) a group by a.heightLevel;
+-------------+----------+
| heightLevel | avg(age) |
+-------------+----------+
| below_155   |  13.7500 |
| equal_155   |  14.0000 |
| over_155    |  12.5000 |
+-------------+----------+
3 rows in set (0.01 sec)

8.3 Ansichten

8.3.1 Ansicht

** <Übung 1> ** Nehmen wir die ID und den Namen aus der Tabelle meibo2 und erstellen Sie v3 der Ansicht.

create view v3 as select id, name from meibo2;
select * from v3;
+----+----------+
| id | name     |
+----+----------+
|  1 | Yamada   |
|  9 | Nagata   |
| 10 | Sugino   |
| 11 | Takayama |
| 12 | John     |
+----+----------+
5 rows in set (0.00 sec)

** <Übung 2> ** Erstellen wir eine Ansicht v4, die die Meibo-Tabelle und die Score-Tabelle intern verbindet, um die ID und den Namen abzurufen.

create table TEST3 as select c.* from
  (select a.* from meibo a join score b on a.id=b.id) c;
create view v4 as select id, name from TEST3;
select * from v4;
+----+----------+
| id | name     |
+----+----------+
|  1 | Yamada   |
|  2 | Tanaka   |
|  3 | Suzuki   |
|  5 | Ito      |
|  6 | Takeuchi |
|  8 | Sato     |
+----+----------+
6 rows in set (0.00 sec)

** <Übung 3> ** Fügen wir der oben erstellten Tabelle neue Daten hinzu. Was geschieht?

insert into TEST3 (id) values (11);
insert into TEST3 (id, name) values (12, "NANASHI");
select * from TEST3;
select * from v4;
+----+----------+-------+------+--------+
| id | name     | class | age  | height |
+----+----------+-------+------+--------+
|  1 | Yamada   |     1 |   14 |    150 |
|  2 | Tanaka   |     2 |   13 |    150 |
|  3 | Suzuki   |     1 |   13 |    150 |
|  5 | Ito      |     3 |   12 |    155 |
|  6 | Takeuchi |     2 |   16 |    155 |
|  8 | Sato     |     1 |   14 |    160 |
| 11 | NULL     |  NULL | NULL |   NULL |
| 12 | NANASHI  |  NULL | NULL |   NULL |
+----+----------+-------+------+--------+
8 rows in set (0.00 sec)

+----+----------+
| id | name     |
+----+----------+
|  1 | Yamada   |
|  2 | Tanaka   |
|  3 | Suzuki   |
|  5 | Ito      |
|  6 | Takeuchi |
|  8 | Sato     |
| 11 | NULL     |
| 12 | NANASHI  |
+----+----------+
8 rows in set (0.00 sec)

8.4 Umfassendes Problem

** 8.4.1 Umfassendes Problem 1 ** Verwenden Sie die folgende Datenbank, um die folgenden Fragen zu beantworten. (Bitte beachten Sie auch die Hinweise unter der folgenden URL.) https://dev.mysql.com/doc/world-setup/en/

/// weggelassen ///

(1) Wählen Sie die Datenbankwelt aus, um zu sehen, welche Tabellen vorhanden sind und welche Spalten jeweils vorhanden sind.

#Ich weiß nicht, wie ich auf den Host-Server namens ZDB zugreifen soll, also ...
#Geben Sie für WSL den folgenden Befehl vom Terminal aus ein
cd ~
wget http://downloads.mysql.com/docs/world.sql.gz
gzip -d world.sql.gz
mysql -h"localhost" -u root -p < world.sql
/* (1) */
use world;
show tables;
show columns from city;
show columns from country;
show columns from countrylanguage;
+-----------------+
| Tables_in_world |
+-----------------+
| city            |
| country         |
| countrylanguage |
+-----------------+
3 rows in set (0.01 sec)

+-------------+----------+------+-----+---------+----------------+
| Field       | Type     | Null | Key | Default | Extra          |
+-------------+----------+------+-----+---------+----------------+
| ID          | int(11)  | NO   | PRI | NULL    | auto_increment |
| Name        | char(35) | NO   |     |         |                |
| CountryCode | char(3)  | NO   | MUL |         |                |
| District    | char(20) | NO   |     |         |                |
| Population  | int(11)  | NO   |     | 0       |                |
+-------------+----------+------+-----+---------+----------------+
5 rows in set (0.00 sec)

+----------------+---------------------------------------------------------------------------------------+------+-----+---------+-------+
| Field          | Type                                                                                  | Null | Key | Default | Extra |
+----------------+---------------------------------------------------------------------------------------+------+-----+---------+-------+
| Code           | char(3)                                                                               | NO   | PRI |         |       |
| Name           | char(52)                                                                              | NO   |     |         |       |
| Continent      | enum('Asia','Europe','North America','Africa','Oceania','Antarctica','South America') | NO   |     | Asia    |       |
| Region         | char(26)                                                                              | NO   |     |         |       |
| SurfaceArea    | decimal(10,2)                                                                         | NO   |     | 0.00    |       |
| IndepYear      | smallint(6)                                                                           | YES  |     | NULL    |       |
| Population     | int(11)                                                                               | NO   |     | 0       |       |
| LifeExpectancy | decimal(3,1)                                                                          | YES  |     | NULL    |       |
| GNP            | decimal(10,2)                                                                         | YES  |     | NULL    |       |
| GNPOld         | decimal(10,2)                                                                         | YES  |     | NULL    |       |
| LocalName      | char(45)                                                                              | NO   |     |         |       |
| GovernmentForm | char(45)                                                                              | NO   |     |         |       |
| HeadOfState    | char(60)                                                                              | YES  |     | NULL    |       |
| Capital        | int(11)                                                                               | YES  |     | NULL    |       |
| Code2          | char(2)                                                                               | NO   |     |         |       |
+----------------+---------------------------------------------------------------------------------------+------+-----+---------+-------+
15 rows in set (0.00 sec)

+-------------+---------------+------+-----+---------+-------+
| Field       | Type          | Null | Key | Default | Extra |
+-------------+---------------+------+-----+---------+-------+
| CountryCode | char(3)       | NO   | PRI |         |       |
| Language    | char(30)      | NO   | PRI |         |       |
| IsOfficial  | enum('T','F') | NO   |     | F       |       |
| Percentage  | decimal(4,1)  | NO   |     | 0.0     |       |
+-------------+---------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

(2) Zeigen Sie 5 Zeilen für jede Tabelle an. Bitte überprüfen Sie leicht, welche Art von Daten Sie haben.

/* (2) */
select * from city limit 5;
select * from country limit 5;
select * from countrylanguage limit 5;
+----+----------------+-------------+---------------+------------+
| ID | Name           | CountryCode | District      | Population |
+----+----------------+-------------+---------------+------------+
|  1 | Kabul          | AFG         | Kabol         |    1780000 |
|  2 | Qandahar       | AFG         | Qandahar      |     237500 |
|  3 | Herat          | AFG         | Herat         |     186800 |
|  4 | Mazar-e-Sharif | AFG         | Balkh         |     127800 |
|  5 | Amsterdam      | NLD         | Noord-Holland |     731200 |
+----+----------------+-------------+---------------+------------+
5 rows in set (0.00 sec)

+------+-------------+---------------+---------------------------+-------------+-----------+------------+----------------+---------+---------+-----------------------+----------------------------------------------+--------------------------+---------+-------+
| Code | Name        | Continent     | Region                    | SurfaceArea | IndepYear | Population | LifeExpectancy | GNP     | GNPOld  | LocalName             | GovernmentForm                               | HeadOfState              | Capital | Code2 |
+------+-------------+---------------+---------------------------+-------------+-----------+------------+----------------+---------+---------+-----------------------+----------------------------------------------+--------------------------+---------+-------+
| ABW  | Aruba       | North America | Caribbean                 |      193.00 |      NULL |     103000 |           78.4 |  828.00 |  793.00 | Aruba                 | Nonmetropolitan Territory of The Netherlands | Beatrix                  |     129 | AW    |
| AFG  | Afghanistan | Asia          | Southern and Central Asia |   652090.00 |      1919 |   22720000 |           45.9 | 5976.00 |    NULL | Afganistan/Afqanestan | Islamic Emirate                              | Mohammad Omar            |       1 | AF    |
| AGO  | Angola      | Africa        | Central Africa            |  1246700.00 |      1975 |   12878000 |           38.3 | 6648.00 | 7984.00 | Angola                | Republic                                     | José Eduardo dos Santos  |      56 | AO    |
| AIA  | Anguilla    | North America | Caribbean                 |       96.00 |      NULL |       8000 |           76.1 |   63.20 |    NULL | Anguilla              | Dependent Territory of the UK                | Elisabeth II             |      62 | AI    |
| ALB  | Albania     | Europe        | Southern Europe           |    28748.00 |      1912 |    3401200 |           71.6 | 3205.00 | 2500.00 | Shqipëria             | Republic                                     | Rexhep Mejdani           |      34 | AL    |
+------+-------------+---------------+---------------------------+-------------+-----------+------------+----------------+---------+---------+-----------------------+----------------------------------------------+--------------------------+---------+-------+
5 rows in set (0.00 sec)

+-------------+------------+------------+------------+
| CountryCode | Language   | IsOfficial | Percentage |
+-------------+------------+------------+------------+
| ABW         | Dutch      | T          |        5.3 |
| ABW         | English    | F          |        9.5 |
| ABW         | Papiamento | F          |       76.7 |
| ABW         | Spanish    | F          |        7.4 |
| AFG         | Balochi    | F          |        0.9 |
+-------------+------------+------------+------------+
5 rows in set (0.00 sec)

(3) Zählen Sie die Anzahl der Datensätze in der Stadttabelle. Überprüfen Sie auch, ob doppelte Daten vorhanden sind.

/* (3) */
select count(*) from city;
select count(distinct id) from city;
select count(distinct name, countrycode, district) from city;
+----------+
| count(*) |
+----------+
|     4079 |
+----------+
1 row in set (0.00 sec)

+---------------------+
| count( distinct id) |
+---------------------+
|                4079 |
+---------------------+
1 row in set (0.00 sec)

+---------------------------------------------+
| count(distinct name, countrycode, district) |
+---------------------------------------------+
|                                        4078 |
+---------------------------------------------+
1 row in set (0.02 sec)

** 8.4.2 Umfassendes Problem 2 ** Beantworten Sie die folgenden Fragen mit derselben Datenbank wie oben.

(1) Berechnen Sie für die Landessprachtabelle die Anzahl der Sprachen (nur die in der Tabelle, ohne Duplizierung) basierend auf jedem Ländercode. Verknüpfen (verbinden) Sie das Ergebnis auch mit der Stadttabelle und zeigen Sie alle Spalten der Stadt und die Anzahl ihrer Sprachen an. Sie müssen das Ergebnis jedoch nur in 5 Zeilen anzeigen.

create view v1 as select CountryCode, count(distinct Language) from countrylanguage group by CountryCode;

select * from 
  city a 
  join 
  v1 b 
  on a.CountryCode = b.CountryCode
  limit 5;
+-----+----------------+-------------+----------+------------+-------------+--------------------------+
| ID  | Name           | CountryCode | District | Population | CountryCode | count(distinct Language) |
+-----+----------------+-------------+----------+------------+-------------+--------------------------+
| 129 | Oranjestad     | ABW         | –        |      29034 | ABW         |                        4 |
|   1 | Kabul          | AFG         | Kabol    |    1780000 | AFG         |                        5 |
|   2 | Qandahar       | AFG         | Qandahar |     237500 | AFG         |                        5 |
|   3 | Herat          | AFG         | Herat    |     186800 | AFG         |                        5 |
|   4 | Mazar-e-Sharif | AFG         | Balkh    |     127800 | AFG         |                        5 |
+-----+----------------+-------------+----------+------------+-------------+--------------------------+
5 rows in set (0.00 sec)

(2) Addieren Sie für die Ländersprachentabelle den Prozentsatz mit jedem CountryCode als Achse. Bitte zeigen Sie jedoch nur diejenigen an, deren Gesamtwert 99,9 überschreitet.

create view v2 as select CountryCode, sum(Percentage) from countrylanguage group by CountryCode;
select CountryCode, `sum(Percentage)` from v2 where `sum(Percentage)` > 99.9;
+-------------+-----------------+
| CountryCode | sum(Percentage) |
+-------------+-----------------+
| BHS         |           100.0 |
| BMU         |           100.0 |
| BTN         |           100.0 |
| CHL         |           100.0 |
| CPV         |           100.0 |
| CRI         |           100.0 |
| CUB         |           100.0 |
| DMA         |           100.0 |
| DOM         |           100.0 |
| DZA         |           100.0 |
| ECU         |           100.0 |
| ESH         |           100.0 |
| FRO         |           100.0 |
| GRD         |           100.0 |
| GRL         |           100.0 |
| GUY         |           100.0 |
| HTI         |           100.0 |
| IRL         |           100.0 |
| JPN         |           100.0 |
| KNA         |           100.0 |
| KOR         |           100.0 |
| LCA         |           100.0 |
| LSO         |           100.0 |
| MDV         |           100.0 |
| NLD         |           101.0 |
| POL         |           100.0 |
| PRK         |           100.0 |
| PSE         |           100.0 |
| RWA         |           100.0 |
| SLV         |           100.0 |
| SMR         |           100.0 |
| TUV         |           100.0 |
| WSM         |           100.1 |
+-------------+-----------------+
33 rows in set (0.00 sec)

(3) Teilen Sie für die Stadttabelle die Initialen des Distrikts in vier Muster ein: diejenigen, die mit A beginnen, diejenigen, die mit B beginnen, diejenigen, die mit C beginnen, und andere, und zählen Sie die Anzahl der Datensätze für jeden.

select a.Initial, count(a.Initial) from
  (select * 
    ,case
      when left(Name, 1) = "A" then "Initial A" 
      when left(Name, 1) = "B" then "Initial B" 
      when left(Name, 1) = "C" then "Initial C"
    else "others"
  end as "Initial"
  from city) a group by Initial;
+-----------+------------------+
| Initial   | count(a.Initial) |
+-----------+------------------+
| Initial A |              260 |
| Initial B |              317 |
| Initial C |              281 |
| others    |             3221 |
+-----------+------------------+
4 rows in set (0.02 sec)

Recommended Posts

Lösen von Übungen im GCI Data Scientist Training Course Kapitel 6
Lösen von Übungen im GCI Data Scientist-Schulungskurs Kapitel 8
Data Scientist Training Course Kapitel 2 Tag 2
Data Scientist Training Course Kapitel 3 Tag 3
Data Scientist Training Course Kapitel 4 Tag 1
Data Scientist Training Course Kapitel 3 Tag 1 + 2
Lösen von Übungen im GCI Data Scientist Training Course Kapitel 7
Lösen von Übungen im GCI Data Scientist-Schulungskurs Kapitel 8
Data Scientist Training Course Kapitel 2 Tag 2
Data Scientist Training Course Kapitel 3 Tag 3
Data Scientist Training Course Kapitel 4 Tag 1
Data Scientist Training Course Kapitel 3 Tag 1 + 2