Comment créer des requêtes de données dans PostgreSQL à l'aide de la commande Select

De Get Docs
Aller à :navigation, rechercher

Qu'est-ce que PostgreSQL ?

PostgreSQL est un système de gestion de base de données open source qui utilise le langage d'interrogation SQL. PostgreSQL, ou simplement "Postgres", est un outil très utile sur un serveur VPS car il peut gérer les besoins de stockage de données des sites Web et d'autres applications.

Dans ce guide, nous examinerons comment interroger une base de données PostgreSQL. Cela nous permettra de demander à Postgres de renvoyer toutes les données qu'il gère et qui correspondent aux critères que nous recherchons.

Ce tutoriel suppose que vous avez installé Postgres sur votre machine. Nous utiliserons Ubuntu 12.04, mais toute distribution Linux moderne devrait fonctionner.

Connectez-vous à PostgreSQL

Nous allons télécharger un exemple de base de données avec laquelle travailler à partir d'Internet.

Tout d'abord, connectez-vous à l'utilisateur Postgres par défaut avec la commande suivante :

sudo su - postgres

Nous allons acquérir le fichier de base de données en tapant :

wget http://pgfoundry.org/frs/download.php/527/world-1.0.tar.gz

Extrayez l'archive gzippée et accédez au répertoire de contenu :

tar xzvf world-1.0.tar.gz
cd dbsamples-0.1/world

Créez une base de données pour importer la structure du fichier dans :

createdb -T template0 worlddb

Enfin, nous utiliserons le fichier .sql comme entrée dans la base de données nouvellement créée :

psql worlddb < world.sql

Nous sommes maintenant prêts à nous connecter à notre environnement nouvellement créé :

psql worlddb

Comment afficher des données dans PostgreSQL

Avant de commencer, essayons d'avoir une idée du type de données que nous venons d'importer. Pour voir la liste des tables, nous pouvons utiliser la commande suivante :

\d+
                         List of relations
 Schema |      Name       | Type  |  Owner   |  Size  | Description 
--------+-----------------+-------+----------+--------+-------------
 public | city            | table | postgres | 264 kB | 
 public | country         | table | postgres | 48 kB  | 
 public | countrylanguage | table | postgres | 56 kB  | 
(3 rows)

Nous avons trois tables ici. Si nous voulons voir les colonnes qui composent la table "ville", nous pouvons émettre cette commande :

\d city
          Table "public.city"
   Column    |     Type     | Modifiers 
-------------+--------------+-----------
 id          | integer      | not null
 name        | text         | not null
 countrycode | character(3) | not null
 district    | text         | not null
 population  | integer      | not null
Indexes:
    "city_pkey" PRIMARY KEY, btree (id)
Referenced by:
    TABLE "country" CONSTRAINT "country_capital_fkey" FOREIGN KEY (capital) REFERENCES city(id)

Nous pouvons voir des informations sur chacune des colonnes, ainsi que la relation de cette table avec d'autres ensembles de données.

Comment interroger des données avec Select dans PostgreSQL

Nous interrogeons (demandons) des informations à Postgres en utilisant des instructions "select". Ces instructions utilisent cette syntaxe générale :

SELECT columns_to_return FROM table_name;

Par exemple, si nous émettons "\d pays", nous pouvons voir que la table "pays" comporte de nombreuses colonnes. Nous pouvons créer une requête qui répertorie le nom du pays et le continent sur lequel il se trouve avec ce qui suit :

SELECT name,continent FROM country;
                     name                     |   continent   
----------------------------------------------+---------------
 Afghanistan                                  | Asia
 Netherlands                                  | Europe
 Netherlands Antilles                         | North America
 Albania                                      | Europe
 Algeria                                      | Africa
 American Samoa                               | Oceania
 Andorra                                      | Europe
 . . .

Pour afficher toutes les colonnes d'une table particulière, nous pouvons utiliser le caractère générique astérisque (*). Cela signifie "correspondre à toutes les possibilités" et, par conséquent, renverra chaque colonne.

SELECT * FROM city;
  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
    6 | Rotterdam                         | NLD         | Zuid-Holland                  |     593321
    7 | Haag                              | NLD         | Zuid-Holland                  |     440900
. . .
Here, we see the "city" table in its entirety.

Trier les résultats des requêtes dans PostgreSQL

Vous pouvez organiser les résultats de votre requête en utilisant la clause « trier par ». Cela vous permet de spécifier un ordre de tri pour les données renvoyées.

La clause "order by" vient après l'instruction select normale. Voici la syntaxe générale :

SELECT columns FROM table ORDER BY column_names [ ASC | DESC ];

Si nous voulions sélectionner le pays et le continent dans le tableau des pays, puis trier par continent, nous pouvons donner ce qui suit :

SELECT name,continent FROM country ORDER BY continent;
                     name                     |   continent   
----------------------------------------------+---------------
 Algeria                                      | Africa
 Western Sahara                               | Africa
 Madagascar                                   | Africa
 Uganda                                       | Africa
 Malawi                                       | Africa
 Mali                                         | Africa
 Morocco                                      | Africa
 Côte d\u0092Ivoire                           | Africa
 . . .

Comme vous pouvez le voir, par défaut, l'instruction de commande organise les données par ordre croissant. Cela signifie qu'il commence au début des organisations en lettres et au nombre le plus bas pour les recherches numériques.

Si nous voulons inverser l'ordre de tri, nous pouvons taper "desc" après la déclaration de colonne "order by":

SELECT name,continent FROM country ORDER BY continent DESC;
                     name                     |   continent   
----------------------------------------------+---------------
 Paraguay                                     | South America
 Bolivia                                      | South America
 Brazil                                       | South America
 Falkland Islands                             | South America
 Argentina                                    | South America
 Venezuela                                    | South America
 Guyana                                       | South America
 Chile                                        | South America
. . .

Nous pouvons également choisir de trier sur plusieurs colonnes. Nous pouvons avoir un champ de tri principal, puis des champs de tri supplémentaires qui sont utilisés si plusieurs enregistrements ont la même valeur dans le champ de tri principal.

Par exemple, nous pouvons trier par continent, puis par pays pour obtenir une liste alphabétique des enregistrements de pays dans chaque continent :

SELECT name,continent FROM country ORDER BY continent,name;
                     name                     |   continent   
----------------------------------------------+---------------
 Angola                                       | Africa
 Burundi                                      | Africa
 Benin                                        | Africa
 Burkina Faso                                 | Africa
 Botswana                                     | Africa
 Central African Republic                     | Africa
 Côte d\u0092Ivoire                           | Africa
 Cameroon                                     | Africa
 Congo, The Democratic Republic of the        | Africa
. . .

Nous avons maintenant un tri alphabétique sur deux colonnes.

Filtrage des résultats de requête dans PostgreSQL

Nous avons appris à sélectionner uniquement certaines informations d'une table en spécifiant les colonnes souhaitées, mais Postgres fournit des mécanismes de filtrage plus fins.

Nous pouvons filtrer les résultats en incluant une clause "où". Une clause where est suivie d'une description des résultats que nous aimerions recevoir.

Par exemple, si nous voulions sélectionner toutes les villes des États-Unis, nous pourrions dire à Postgres de renvoyer le nom des villes où le code de pays à trois chiffres est "USA":

SELECT name FROM city WHERE countrycode = 'USA';
          name           
-------------------------
 New York
 Los Angeles
 Chicago
 Houston
 Philadelphia
 Phoenix
 San Diego
 Dallas
 San Antonio
. . .

Les valeurs de chaîne, comme USA ci-dessus, doivent être placées entre guillemets simples pour être interprétées correctement par Postgres.

La requête précédente utilisait "=" pour comparer si la valeur de la colonne correspond exactement à la valeur donnée à droite de l'expression. Nous pouvons cependant effectuer une recherche plus flexible avec l'opérateur de comparaison "like".

L'opérateur similaire peut utiliser "_" comme caractère générique pour correspondre à un seul caractère et "%" comme caractère générique correspondant à zéro ou plusieurs caractères.

Nous pouvons également combiner les termes de filtrage avec "et" ou "ou". Combinons quelques filtrages pour trouver des villes aux États-Unis dont le nom commence par "N":

SELECT name FROM city WHERE countrycode = 'USA' AND name LIKE 'N%';
        name        
--------------------
 New York
 Nashville-Davidson
 New Orleans
 Newark
 Norfolk
 Newport News
 Naperville
 New Haven
 North Las Vegas
 Norwalk
 New Bedford
 Norman
(12 rows)
We can, of course, sort these results just like with regular, unfiltered select data.
SELECT name FROM city WHERE countrycode = 'USA' AND name LIKE 'N%' ORDER BY name;
        name        
--------------------
 Naperville
 Nashville-Davidson
 Newark
 New Bedford
 New Haven
 New Orleans
 Newport News
 New York
 Norfolk
 Norman
 North Las Vegas
 Norwalk
(12 rows)

Opérations de sélection avancées dans PostgreSQL

Nous allons examiner des requêtes plus complexes. Considérer ce qui suit:

SELECT country.name AS country,city.name AS capital,continent FROM country JOIN city ON country.capital = city.id ORDER BY continent,country;
                country                |              capital              |   continent   
---------------------------------------+-----------------------------------+---------------
 Algeria                               | Alger                             | Africa
 Angola                                | Luanda                            | Africa
 Benin                                 | Porto-Novo                        | Africa
 Botswana                              | Gaborone                          | Africa
 Burkina Faso                          | Ouagadougou                       | Africa
 Burundi                               | Bujumbura                         | Africa
 Cameroon                              | Yaoundé                           | Africa
 Cape Verde                            | Praia                             | Africa
 Central African Republic              | Bangui                            | Africa
 Chad                                  | N´Djaména                         | Africa
. . .

Cette requête comporte plusieurs parties différentes. Commençons par la fin et travaillons à l'envers.

La section "commander par" de la déclaration (ORDER BY continent,pays) doit être familière.

Cette section de la déclaration indique à Postgres de trier d'abord en fonction du continent, puis de trier les entrées avec les valeurs de continent correspondantes par la colonne de pays.

Pour expliquer la partie suivante, la spécification de table, nous allons en apprendre davantage sur les jointures de table.

Sélection de données à partir de plusieurs tables dans PostgreSQL avec jointure

Postgres vous permet de sélectionner des données dans différentes tables liées à l'aide de la clause "join". Les tables sont liées si elles ont chacune une colonne qui peut faire référence aux mêmes données.

Dans notre exemple de base de données, nos tables "pays" et "ville" partagent certaines données. On peut voir que la table "pays" fait référence à la table "ville" en tapant :

\d country
. . .
. . .
Foreign-key constraints:
    "country_capital_fkey" FOREIGN KEY (capital) REFERENCES city(id)
. . .
. . .

Cette déclaration nous indique que la colonne "capital" dans la table "country" est une référence à la colonne "id" dans la table "city". Cela signifie que nous pouvons presque traiter ces deux tables comme une table géante en faisant correspondre les valeurs de ces colonnes.

Dans notre requête, la sélection de table indique "FROM country JOIN city ON country.capital = city.id".

Dans cette déclaration, nous disons à Postgres de renvoyer les informations des deux tables. L'instruction "join" spécifie la jointure par défaut, également appelée "jointure interne".

Une jointure interne renverra les informations présentes dans les deux tables. Par exemple, si nous faisions correspondre des colonnes qui n'étaient pas explicitement liées en tant que clés étrangères, nous pourrions nous retrouver dans une situation où une table avait des valeurs qui ne correspondaient pas à l'autre table. Ceux-ci ne seraient pas retournés à l'aide d'une jointure régulière.

La section après le mot-clé "on" spécifie les colonnes que les tables partagent afin que Postgres sache comment les données sont liées. Cette information est donnée en précisant :

table_name.column_name

Dans notre cas, nous sélectionnons des enregistrements qui ont des valeurs correspondantes dans les deux tables, où la colonne capitale de la table pays doit être comparée à la colonne id de la table ville.

Nommer les critères de sélection pour les jointures de table dans PostgreSQL

Nous sommes maintenant au début de notre instruction de requête. La partie sélectionne les colonnes. Cette partie devrait être assez simple à déchiffrer sur la base de la dernière section.

Nous devons maintenant nommer la table dans laquelle se trouvent les colonnes si nous essayons de sélectionner un nom de colonne présent dans les deux tables.

Par exemple, nous avons sélectionné la colonne "nom" à la fois dans la table des pays et dans la table des villes. Si nous devions omettre le "table_name." partie de la sélection, la correspondance serait ambiguë et Postgres ne saurait pas quelles données renvoyer.

Nous contournons ce problème en étant explicite sur la table à partir de laquelle sélectionner en cas de collisions de noms. Il est parfois utile de nommer les tables indépendamment du fait que les noms soient uniques afin de maintenir la lisibilité.,/p>

Conclusion

Vous devriez maintenant avoir une idée de base sur la façon de formuler des requêtes. Cela vous donne la possibilité de renvoyer des données spécifiques à partir de diverses sources. Ceci est utile pour créer ou utiliser des applications et des pages Web interactives autour de cette technologie.

Par