Index: trunk/workshop-foss4g/simple_sql.rst
===================================================================
--- trunk/workshop-foss4g/simple_sql.rst	(revision 81)
+++ trunk/workshop-foss4g/simple_sql.rst	(revision 1)
@@ -1,10 +1,8 @@
 .. _simple_sql:
 
-Partie 6 : RequÃªtes SQL simples
-===============================
+Section 6: Simple SQL
+=====================
 
-:term:`SQL`, pour "Structured Query Language", dÃ©finit la maniÃšre d'importer et d'interroger des donnÃ©es dans une base. Vous avez dÃ©jÃ  rÃ©digÃ© du SQL lorsque nous avons crÃ©Ã© notre premiÃšre base de donnÃ©es.
-
-Rappel:
+:term:`SQL`, or "Structured Query Language", is a means of asking questions of, and updating data in, relational databases. You have already seen SQL when we created our first database.  Recall:
 
 .. code-block:: sql
@@ -12,107 +10,105 @@
    SELECT postgis_full_version();
 
-Maintenant que nous avons chargÃ© des donnÃ©es dans notre base, essayons d'utiliser SQL pour les interroger. Par exemple,
+But that was a question about the database.  Now that we've loaded data into our database, let's use SQL to ask questions of the data! For example,
 
-  "Quels sont les noms des quartiers de la ville de New York ?"
-
-Ouvrez une fenÃªtre SQL depuis pgAdmin en cliquant sur le bouton SQL
+  "What are the names of all the neighborhoods in New York City?"
+  
+Open up the SQL query window in pgAdmin by clicking the SQL button
 
 .. image:: ./screenshots/pgadmin_05.png
 
-Puis saisissez la requÃªte suivante dans la fenÃªtre
+then enter the following query in to the query window
 
 .. code-block:: sql
 
   SELECT name FROM nyc_neighborhoods;
+  
+and click the **Execute Query** button (the green triangle).
+  
+.. image:: ./screenshots/pgadmin_08.png  
 
-et cliquez sur le bouton **Execute Query** (le triangle vert).
+The query will run for a few (mili)seconds and return the 129 results.
 
-.. image:: ./screenshots/pgadmin_08.png
+.. image:: ./screenshots/pgadmin_09.png  
 
-La requÃªte s'exÃ©cutera pendant quelques (mili)secondes et retournera 129 rÃ©sultats.
+But what exactly happened here?  To understand, let's begin with the four "verbs" of SQL, 
 
-.. image:: ./screenshots/pgadmin_09.png
+ * ``SELECT``, returns rows in response to a query
+ * ``INSERT``, adds new rows to a table
+ * ``UPDATE``, alters existing rows in a table
+ * ``DELETE``, removes rows from a table
+ 
+We will be working almost exclusively with ``SELECT`` in order to ask questions of tables using spatial functions.
 
-Mais que s'est-il exactement passÃ© ici ? Pour le comprendre, commenÃ§ons par prÃ©senter les quatre types de requÃªtes du SQL :
+SELECT queries
+--------------
 
- * ``SELECT``, retourne des lignes en rÃ©ponse Ã  une requÃªte
- * ``INSERT``, ajoute des lignes dans une table
- * ``UPDATE``, modifie des lignes existantes d'une table
- * ``DELETE``, supprime des lignes d'une table
+A select query is generally of the form:
 
-Nous travaillerons principalement avec des requÃªtes de type ``SELECT`` afin d'interroger les tables en utilisant des fonctions spatiales.
-
-RequÃªte de type SELECT
-----------------------
-
-Une requÃªte de type Select est gÃ©nÃ©ralement de la forme :
-
-  SELECT colonnes FROM donnÃ©es WHERE conditions;
-
+  SELECT some_columns FROM some_data_source WHERE some_condition;
+  
 .. note::
 
-    Pour une description exhaustive des paramÃštres possible d'une requÃªte ``SELECT``, consultez la `documentation de PostgresSQL  <http://www.postgresql.org/docs/8.1/interactive/sql-select.html>`_.
+    For a synopsis of all ``SELECT`` parameters, see the PostgresSQL `documentation  <http://www.postgresql.org/docs/8.1/interactive/sql-select.html>`_.
+    
+The ``some_columns`` are either column names or functions of column values. The ``some_data_source`` is either a single table, or a composite table created by joining two tables on a key or condition. The ``some_condition`` is a filter that restricts the number of rows to be returned.
 
+  "What are the names of all the neighborhoods in Brooklyn?"
 
-Les ``colonnes`` sont soit des noms de colonnes, soit des fonctions utilisant les valeurs des colonnes. Les ``donnÃ©es`` sont soit une table seule, soit plusieurs tables reliÃ©es ensemble en rÃ©alisant une jointure sur une clef ou une autre condition. Les ``conditions`` reprÃ©sentent le filtre qui restreint le nombre de lignes Ã  retourner.
-
-  "Quel sont les noms des quartiers de Brooklyn ?"
-
-Nous retournons Ã  notre table ``nyc_neighborhoods`` avec le filtre en main. La table contient tous les quartiers de New York et nous voulons uniquement ceux de Brooklyn.
+We return to our ``nyc_neighborhoods`` table with a filter in hand.  The table contains all the neighborhoods in New York, but we only want the ones in Brooklyn.
 
 .. code-block:: sql
 
-  SELECT name
-    FROM nyc_neighborhoods
+  SELECT name 
+    FROM nyc_neighborhoods 
     WHERE boroname = 'Brooklyn';
 
-La requÃªte prendra Ã  nouveau quelque (milli)secondes et retournera les 23 Ã©lÃ©ments rÃ©sultants.
+The query will run for even fewer (mili)seconds and return the 23 results.
 
-Parfois, nous aurons besoin d'appliquer des fonctions sur le rÃ©sultat d'une de nos requÃªtes. Par exemple,
+Sometimes we will need to apply a function to the results of our query. For example,
 
-  "Quel est le nombre de lettres dans les noms des quartiers de Brooklyn ?"
-
-Heureusement PostgreSQL fournit une fonction calculant la longueur d'une chaÃ®ne de caractÃšres : :command:`char_length(string)`.
+  "What is the number of letters in the names of all the neighborhoods in Brooklyn?"
+  
+Fortunately, PostgreSQL has a string length function, :command:`char_length(string)`.
 
 .. code-block:: sql
 
-  SELECT char_length(name)
-    FROM nyc_neighborhoods
+  SELECT char_length(name) 
+    FROM nyc_neighborhoods 
     WHERE boroname = 'Brooklyn';
 
-Bien souvent, nous sommes moins interessÃ©s par une ligne particuliÃšre que par un calcul statistique sur l'ensemble rÃ©sultant. Donc, connaÃ®tre la longueur des noms de quartiers est moins intÃ©ressant que de calculer la moyenne de ces longueurs. Les fonctions qui renvoient un rÃ©sultat unique en utilisant un ensemble de valeurs sont appelÃ©es des "fonctions d'aggrÃ©gations".
+Often, we are less interested in the individual rows than in a statistic that applies to all of them. So knowing the lengths of the neighborhood names might be less interesting than knowing the average length of the names. Functions that take in multiple rows and return a single result are called "aggregate" functions.  
 
-PostgreSQL fournit un ensemble de fonctions d'aggrÃ©gations, parmi lesquelles :command:`avg()` pour calculer la moyenne, and :command:`stddev()` pour l'Ã©cart type.
+PostgreSQL has a series of built-in aggregate functions, including the general purpose :command:`avg()` for average values and :command:`stddev()` for standard deviations.
 
-  "Quel est le nombre moyen et l'Ã©cart type du nombre de lettres dans le nom des quartier de Brooklyn ?"
+  "What is the average number of letters and standard deviation of number of letters in the names of all the neighborhoods in Brooklyn?"
+  
+.. code-block:: sql
+
+  SELECT avg(char_length(name)), stddev(char_length(name)) 
+    FROM nyc_neighborhoods 
+    WHERE boroname = 'Brooklyn';
+  
+::
+
+           avg         |       stddev       
+  ---------------------+--------------------
+   11.7391304347826087 | 3.9105613559407395
+
+The aggregate functions in our last example were applied to every row in the result set. What if we want the summaries to be carried out over smaller groups within the overall result set? For that we add a ``GROUP BY`` clause. Aggregate functions often need an added ``GROUP BY`` statement to group the result-set by one or more columns.  
+
+  "What is the average number of letters in the names of all the neighborhoods in New York City, reported by borough?"
 
 .. code-block:: sql
 
-  SELECT avg(char_length(name)), stddev(char_length(name))
-    FROM nyc_neighborhoods
-    WHERE boroname = 'Brooklyn';
-
+  SELECT boroname, avg(char_length(name)), stddev(char_length(name)) 
+    FROM nyc_neighborhoods 
+    GROUP BY boroname;
+ 
+We include the ``boroname`` column in the output result so we can determine which statistic applies to which borough. In an aggregate query, you can only output columns that are either (a) members of the grouping clause or (b) aggregate functions.
+  
 ::
 
-           avg         |       stddev
-  ---------------------+--------------------
-   11.7391304347826087 | 3.9105613559407395
-
-Les fonctions d'agrÃ©gation dans notre dernier exemple sont appliquÃ©es Ã  chaque ligne de l'ensemble des rÃ©sultats. Comment faire si nous voulons rassembler des donnÃ©es ? Pour cela, nous utilisons la clause ``GROUP BY``. Les fonctions d'agrÃ©gation ont souvent besoin d'une clause ``GROUP BY`` pour regrouper les Ã©lÃ©ments en utilisant une ou plusieurs colonnes.
-
-  "Quel est la moyenne du nombre de caractÃšres des noms de quartiers et l'Ã©cart-type du nombre de caractÃšres des noms de quartiers, renvoyÃ© par section de New York ?"
-
-.. code-block:: sql
-
-  SELECT boroname, avg(char_length(name)), stddev(char_length(name))
-    FROM nyc_neighborhoods
-    GROUP BY boroname;
-
-
-Nous ajoutons la colonne ``boroname`` dans le rÃ©sultat afin de pouvoir dÃ©terminer quelle valeur statistique s'applique Ã  quelle section. Dans une requÃªte agrÃ©gÃ©e, vous pouvez seulement retourner les colonnes qui sont (a) membre de la clause de regroupement ou (b) des fonctions d'agrÃ©gation.
-
-::
-
-     boroname    |         avg         |       stddev
+     boroname    |         avg         |       stddev       
   ---------------+---------------------+--------------------
    Brooklyn      | 11.7391304347826087 | 3.9105613559407395
@@ -121,12 +117,13 @@
    Queens        | 11.6666666666666667 | 5.0057438272815975
    Staten Island | 12.2916666666666667 | 5.2043390480959474
+  
+Function List
+-------------
 
-Liste de fonctions
-------------------
+`avg(expression) <http://www.postgresql.org/docs/current/static/functions-aggregate.html#FUNCTIONS-AGGREGATE-TABLE>`_: PostgreSQL aggregate function that returns the average value of a numeric column.
 
-`avg(expression) <http://www.postgresql.org/docs/current/static/functions-aggregate.html#FUNCTIONS-AGGREGATE-TABLE>`_: fonction d'agrÃ©gation de PostgreSQL  qui retourne la valeur moyenne d'une colonne.
+`char_length(string) <http://www.postgresql.org/docs/current/static/functions-string.html>`_: PostgreSQL string function that returns the number of character in a string.
 
-`char_length(string) <http://www.postgresql.org/docs/current/static/functions-string.html>`_: fonction s'appliquant aux chaÃ®nes de caractÃšre de PostgreSQL qui retourne le nombre de lettres dans une chaÃ®ne.
-
-`stddev(expression) <http://www.postgresql.org/docs/current/static/functions-aggregate.html#FUNCTIONS-AGGREGATE-STATISTICS-TABLE>`_: fonction d'aggrÃ©gation de PostgreSQL qui retourne l'Ã©cart type d'un ensemble de valeurs.
-
+`stddev(expression) <http://www.postgresql.org/docs/current/static/functions-aggregate.html#FUNCTIONS-AGGREGATE-STATISTICS-TABLE>`_: PostgreSQL aggregate function that returns the standard deviation of input values.
+  
+  
