[PYTHON] Résolution d'exercices dans le cours de formation GCI Data Scientist Chapitre 8

Cours de formation GCI Data Scientist

"GCI Data Scientist Training Course" est proposé par l'Université de Tokyo (laboratoire Matsuo) "* Données pratiques Le contenu de la partie exercice est publié au format Jupyter NoteBook (CC-BY-NC-ND) dans le cours de formation scientifique et le cours d'apprentissage en profondeur </ u> * ". Le chapitre 8 est "** Bases de base de données et SQL **", où vous apprendrez à faire fonctionner un système de gestion de base de données relationnelle. Au lieu du bouton "J'aime" pour le matériel pédagogique précieux et merveilleux que vous pouvez apprendre en japonais, je publierai les réponses que vous avez résolues. Veuillez signaler toute erreur.

Je ne savais pas comment exécuter MariaDB sur Jupyter Notebook, j'ai donc installé MySQL sur WSL et entré des commandes sur WSL Terminal.

Chapitre8 Bases de la base de données et SQL

8.1 Vue d'ensemble de ce chapitre

8.1.1 Qu'est-ce qu'une base de données?

8.1.2 RDBMS

8.2 Bases de SQL

8.2.1 Création de bases de données et de tables

** <Pratique 1> ** Ajoutez une cellule (appuyez sur + en haut à gauche) pour afficher la base de données existante. Créez ensuite une nouvelle base de données (telle que TEST2) et choisissez d'utiliser cette base de données.

** <Pratique 2> ** Créez une nouvelle table "meibo2" dans la base de données créée et sélectionnée à l 'exercice 1. Après l'avoir créé, assurez-vous que le tableau est complet.

** <Exercice pratique 3> ** Ajoutons des données à la table nouvellement créée. Après l'ajout, veuillez vous assurer que les données sont incluses.

/*Exercice 1*/
create database TEST2;
use TEST2;

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

/*Exercice 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 Recherche et mise à jour des données, suppression, modification des colonnes du tableau

** [Essayons] ** Cherchons les données en modifiant l'expression conditionnelle ci-dessus de différentes manières. Par exemple, comment recherchez-vous des personnes dont l'identifiant est différent de 1 ou dont le nom se termine par un?

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

** <Pratique 1> ** Sélectionnez la base de données de TEST1 et extrayez l'enregistrement de la personne avec id = 4 dans le tableau meibo ci-dessus.

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

** <Pratique 2> ** Mettez à jour la classe de la personne avec id = 8 à 7 dans le tableau meibo ci-dessus. Si vous pouvez confirmer la mise à jour avec l'instruction select, redéfinissez la classe de la personne avec id = 8 sur 1.

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)

** <Question pratique 3> (* Question obligatoire: utilisée dans les questions suivantes.) ** Ajoutez une nouvelle hauteur de colonne à la même table meibo que ci-dessus. De plus, mettez à jour avec 150 pour les personnes avec un identifiant = 1 à 4, 155 pour les personnes avec un identifiant = 5 à 6 et 160 pour les personnes avec un identifiant = 7 à 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 Agrégation, calcul, tri des données

** <Pratique 1> ** Combien d'âges différents y a-t-il sur la même table meibo que ci-dessus?

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

** <Pratique 2> ** Trouvez les hauteurs des personnes les plus petites et les plus grandes.

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

** <Exercice pratique 3> ** Extraire les enregistrements d'une hauteur de 155 ou plus et d'une classe de 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 Agrégation par groupe

** <Pratique 1> ** Trouvez la hauteur moyenne de chaque classe à la table meibo.

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)

** <Pratique 2> ** En plus de ce qui précède, calculons le nombre de personnes dans chaque classe, la taille de la plus petite personne et la taille de la plus grande personne dans chaque classe.

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)

** <Exercice pratique 3> ** Demandez les mêmes articles que ci-dessus, en vous limitant à ceux de plus de 13 ans.

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 Utilisation de plusieurs tables

** <Pratique 1> ** Créez une nouvelle table appelée cardtb. Cependant, les colonnes doivent être id, point, money (toutes int). De plus, insérez les données suivantes. (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)

** <Pratique 2> ** Utilisez id comme clé pour joindre la table ci-dessus en interne à la table meibo.

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)

** <Exercice pratique 3> ** Utilisez id comme clé pour joindre la table ci-dessus à la table meibo.

/*Le résultat de sortie est le même que celui de l'exercice 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 Énoncé de cas et sous-requête

** <Pratique 1> ** Dans la table meibo, si la hauteur est inférieure à 155, nommez-la "below_155", si elle est exactement 155, nommez-la "equal_155", et si elle est supérieure à 155, nommez-la "over_155" pour afficher la table.

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)

** <Pratique 2> ** Utilisez le concept de table et de sous-requête ci-dessus pour trouver le nombre de personnes à chaque niveau de hauteur.

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)

** <Exercice pratique 3> ** Utilisez le tableau et les idées de sous-requêtes ci-dessus pour trouver l'âge moyen de chaque niveau de hauteur.

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 vues

8.3.1 Vue

** <Pratique 1> ** Prenons l'identifiant et le nom de la table meibo2 et créons la v3 de la vue.

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)

** <Pratique 2> ** Créons une vue v4 qui joint en interne la table meibo et la table des scores pour récupérer l'identifiant et le nom.

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)

** <Exercice pratique 3> ** Ajoutons de nouvelles données au tableau créé ci-dessus. Ce qui se produit?

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 Problème global

** 8.4.1 Problème global 1 ** Utilisez la base de données ci-dessous pour répondre aux questions suivantes. (Veuillez également vous référer aux notes à l'URL suivante.) https://dev.mysql.com/doc/world-setup/en/

/// Omis ///

(1) Sélectionnez le monde de la base de données pour voir quelles tables sont là et quelles colonnes chacune a.

#Je ne sais pas comment accéder au serveur hôte appelé ZDB, alors ...
#Pour WSL, entrez la commande suivante à partir du terminal
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) Afficher 5 lignes pour chaque tableau. Veuillez vérifier légèrement le type de données dont vous disposez.

/* (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) Comptez le nombre d'enregistrements dans la table des villes. Vérifiez également les données en double.

/* (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 Problème global 2 ** Répondez aux questions suivantes en utilisant la même base de données que ci-dessus.

(1) Pour la table pays, calculez le nombre de langues (uniquement celles du tableau, sans duplication) en fonction de chaque CountryCode. Aussi, liez (joignez) le résultat à la table des villes et affichez toutes les colonnes de la ville et le nombre de leurs langues. Cependant, vous n'avez besoin d'afficher le résultat que sur 5 lignes.

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) Pour la table de pays, additionnez les pourcentages avec chaque CountryCode comme axe. Cependant, veuillez n'afficher que ceux dont la valeur totale dépasse 99,9.

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) Pour la table des villes, divisez les initiales du district en quatre modèles, un qui commence par A, un qui commence par B, un qui commence par C et d'autres, et comptez le nombre d'enregistrements pour chacun.

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

Résolution d'exercices dans le cours de formation GCI Data Scientist Chapitre 6
Résolution d'exercices dans le cours de formation GCI Data Scientist Chapitre 8
Cours de formation Data Scientist Chapitre 2 Jour 2
Cours de formation Data Scientist Chapitre 3 Jour 3
Cours de formation Data Scientist Chapitre 4 Jour 1
Cours de formation Data Scientist Chapitre 3 Jour 1 + 2
Résolution d'exercices dans le cours de formation GCI Data Scientist Chapitre 7
Résolution d'exercices dans le cours de formation GCI Data Scientist Chapitre 8
Cours de formation Data Scientist Chapitre 2 Jour 2
Cours de formation Data Scientist Chapitre 3 Jour 3
Cours de formation Data Scientist Chapitre 4 Jour 1
Cours de formation Data Scientist Chapitre 3 Jour 1 + 2