{"id":36671,"date":"2019-10-31T22:13:01","date_gmt":"2019-10-31T19:13:01","guid":{"rendered":"https:\/\/prohoster.info\/blog\/sql-zanimatelnye-zadachki\/"},"modified":"2019-10-31T22:13:01","modified_gmt":"2019-10-31T19:13:01","slug":"sql-zanimatelnye-zadachki","status":"publish","type":"post","link":"https:\/\/prohoster.info\/fr\/blog\/news\/sql-zanimatelnye-zadachki","title":{"rendered":"SQL. Des exercices int\u00e9ressants","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Bonjour, Habr !<\/p>\n<p>Cela fait plus de 3 ans que j'enseigne SQL dans diff\u00e9rents centres de formation, et l'une de mes observations est que les \u00e9tudiants ma\u00eetrisent et comprennent mieux SQL lorsqu'on leur pose des probl\u00e8mes \u00e0 r\u00e9soudre plut\u00f4t que de simplement leur expliquer les possibilit\u00e9s et les bases th\u00e9oriques.<\/p>\n<p>Dans cet article, je vais partager avec vous ma liste de t\u00e2ches que je donne aux \u00e9tudiants comme devoirs et sur lesquelles nous r\u00e9alisons divers types de brainstormings, ce qui conduit \u00e0 une compr\u00e9hension approfondie et claire de SQL.<\/p>\n<p><img decoding=\"async\" alt=\"SQL. Des exercices int\u00e9ressants\" src=\"\/wp-content\/uploads\/2019\/07\/283f472e0c382c0621ffc14e2ac06881.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSQL (\u02c8\u025bs\u02c8kju\u02c8\u025bl ; en anglais, structured query language \u2014 \u00ab langage de requ\u00eate structur\u00e9 \u00bb) est un langage de programmation d\u00e9claratif utilis\u00e9 pour cr\u00e9er, modifier et g\u00e9rer des donn\u00e9es dans une base de donn\u00e9es relationnelle, contr\u00f4l\u00e9e par le syst\u00e8me de gestion de bases de donn\u00e9es appropri\u00e9. <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/SQL\">En savoir plus\u2026 <\/a><\/noindex><\/p>\n<p>On peut lire sur SQL dans divers <noindex><a rel=\"nofollow\" href=\"https:\/\/www.google.com\/search?q=SQL\">sources<\/a><\/noindex>.<br \/>\nCet article n\u2019a pas pour but de vous apprendre SQL depuis le d\u00e9but.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nAlors, c'est parti.<\/p>\n<p>Utilisons la <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/oracle\/db-sample-schemas\/tree\/master\/human_resources\">sch\u00e9ma RH<\/a><\/noindex> dans Oracle avec ses tables (<noindex><a rel=\"nofollow\" href=\"https:\/\/docs.oracle.com\/en\/database\/oracle\/oracle-database\/12.2\/comsc\/HR-sample-schema-table-descriptions.html\">En savoir plus<\/a><\/noindex>):<\/p>\n<p><img decoding=\"async\" alt=\"SQL. Des exercices int\u00e9ressants\" src=\"\/wp-content\/uploads\/2019\/07\/b518c0bedd0d7bbeaedbcc4bd95079cd.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nJe pr\u00e9cise que nous allons examiner uniquement les t\u00e2ches sur SELECT. Il n\u2019y a pas de t\u00e2ches sur DML et DDL.<\/p>\n<h2>Objectifs<\/h2>\n<p>\n<b>Restriction et tri des donn\u00e9es<\/b><\/p>\n<p>Table Employees. Obtenir la liste de toutes les informations sur les employ\u00e9s <br \/>\n<b class=\"spoiler_title\">Solution<\/b><\/p>\n<pre><code class=\"sql\">SELECT * FROM employees\n<\/code><\/pre>\n<p>Table Employees. Obtenir la liste de tous les employ\u00e9s dont le pr\u00e9nom est 'David'<br \/>\n<b class=\"spoiler_title\">Solution<\/b><\/p>\n<pre><code class=\"sql\">SELECT *\n  FROM employees\n WHERE first_name = 'David';\n<\/code><\/pre>\n<p>Table Employees. Obtenir la liste de tous les employ\u00e9s dont le job_id est 'IT_PROG'<br \/>\n<b class=\"spoiler_title\">Solution<\/b><\/p>\n<pre><code class=\"sql\">SELECT *\n  FROM employees\n WHERE job_id = 'IT_PROG'\n<\/code><\/pre>\n<p>Table Employees. Obtenir la liste de tous les employ\u00e9s du 50\u00e8me d\u00e9partement (department_id) avec un salaire (salary) sup\u00e9rieur \u00e0 4000<br \/>\n<b class=\"spoiler_title\">Solution<\/b><\/p>\n<pre><code class=\"sql\">SELECT *\n  FROM employees\n WHERE department_id = 50 AND salary &gt; 4000;\n<\/code><\/pre>\n<p>Table Employees. Obtenir la liste de tous les employ\u00e9s des d\u00e9partements 20 et 30 (department_id)<br \/>\n<b class=\"spoiler_title\">Solution<\/b><\/p>\n<pre><code class=\"sql\">SELECT *\n  FROM employees\n WHERE department_id = 20 OR department_id = 30;\n<\/code><\/pre>\n<p>Table Employees. Obtenir la liste de tous les employ\u00e9s dont la derni\u00e8re lettre du pr\u00e9nom est 'a'<br \/>\n<b class=\"spoiler_title\">Solution<\/b><\/p>\n<pre><code class=\"sql\">SELECT *\n  FROM employees\n WHERE first_name LIKE '%a';\n<\/code><\/pre>\n<p>Table Employees. Obtenir la liste de tous les employ\u00e9s des d\u00e9partements 50 et 80 (department_id) qui ont un bonus (valeur dans la colonne commission_pct non vide)<br \/>\n<b class=\"spoiler_title\">Solution<\/b><\/p>\n<pre><code class=\"sql\">SELECT *\n  FROM employees\n WHERE     (department_id = 50 OR department_id = 80)\n       AND commission_pct IS NOT NULL;\n<\/code><\/pre>\n<p>Table Employees. Obtenir la liste de tous les employ\u00e9s dont le pr\u00e9nom contient au moins 2 lettres 'n'<br \/>\n<b class=\"spoiler_title\">Solution<\/b><\/p>\n<pre><code class=\"sql\">SELECT *\n  FROM employees\n WHERE first_name LIKE '%n%n%';\n<\/code><\/pre>\n<p>Table Employees. Obtenir la liste de tous les employ\u00e9s dont la longueur du pr\u00e9nom est sup\u00e9rieure \u00e0 4 lettres<br \/>\n<b class=\"spoiler_title\">Solution<\/b><\/p>\n<pre><code class=\"sql\">SELECT *\n  FROM employees\n WHERE first_name LIKE '%_____%';\n<\/code><\/pre>\n<p>Table Employees. Obtenir la liste de tous les employ\u00e9s dont le salaire est compris entre 8000 et 9000 (inclus)<br \/>\n<b class=\"spoiler_title\">Solution<\/b><\/p>\n<pre><code class=\"sql\">S\u00c9LECTIONNER *\n  DE employ\u00e9s\n O\u00d9 salaire ENTRE 8000 ET 9000;\n<\/code><\/pre>\n<p>Table Employees. Obtenir la liste de tous les employ\u00e9s dont le pr\u00e9nom contient le symbole '%'<br \/>\n<b class=\"spoiler_title\">Solution<\/b><\/p>\n<pre><code class=\"sql\">S\u00c9LECTIONNER *\n  DE employ\u00e9s\n O\u00d9 first_name LIKE '%%%' ESCAPE '';\n<\/code><\/pre>\n<p>Table Employees. Obtenir la liste de tous les ID des managers<br \/>\n<b class=\"spoiler_title\">Solution<\/b><\/p>\n<pre><code class=\"sql\">S\u00c9LECTIONNER DISTINCT manager_id\n  DE employ\u00e9s\n O\u00d9 manager_id EST NON NULL;\n<\/code><\/pre>\n<p>Table Employees. Obtenir la liste des employ\u00e9s avec leurs postes au format : Donald(sh_clerk)<br \/>\n<b class=\"spoiler_title\">Solution<\/b><\/p>\n<pre><code class=\"sql\">S\u00c9LECTIONNER first_name || '(' || LOWER (job_id) || ')' employ\u00e9 DE employ\u00e9s;\n<\/code><\/pre>\n<p>\n<b>Utilisation des fonctions \u00e0 une seule ligne pour personnaliser la sortie<\/b><\/p>\n<p>Table Employees. Obtenir la liste de tous les employ\u00e9s dont la longueur du nom est sup\u00e9rieure \u00e0 10 lettres<br \/>\n<b class=\"spoiler_title\">Solution<\/b><\/p>\n<pre><code class=\"sql\">S\u00c9LECTIONNER *\n  DE employ\u00e9s\n O\u00d9 LENGTH (first_name) &gt; 10;\n<\/code><\/pre>\n<p>Table Employees. Obtenir la liste de tous les employ\u00e9s dont le pr\u00e9nom contient la lettre 'b' (sans tenir compte de la casse)<br \/>\n<b class=\"spoiler_title\">Solution<\/b><\/p>\n<pre><code class=\"sql\">S\u00c9LECTIONNER *\n  DE employ\u00e9s\n O\u00d9 INSTR (LOWER (first_name), 'b') &gt; 0;\n<\/code><\/pre>\n<p>Table Employees. Obtenir la liste de tous les employ\u00e9s dont le pr\u00e9nom contient au moins 2 lettres 'a'<br \/>\n<b class=\"spoiler_title\">Solution<\/b><\/p>\n<pre><code class=\"sql\">S\u00c9LECTIONNER *\n  DE employ\u00e9s\n O\u00d9 INSTR (LOWER (first_name),'a',1,2) &gt; 0;\n<\/code><\/pre>\n<p>Table Employees. Obtenir la liste de tous les employ\u00e9s dont le salaire est un multiple de 1000<br \/>\n<b class=\"spoiler_title\">Solution<\/b><\/p>\n<pre><code class=\"sql\">S\u00c9LECTIONNER *\n  DE employ\u00e9s\n O\u00d9 MOD (salaire, 1000) = 0;\n<\/code><\/pre>\n<p>Table Employees. Obtenir le premier num\u00e9ro de t\u00e9l\u00e9phone \u00e0 3 chiffres de l'employ\u00e9 si son num\u00e9ro est au format XXX.XXX.XXXX<br \/>\n<b class=\"spoiler_title\">Solution<\/b><\/p>\n<pre><code class=\"sql\">S\u00c9LECTIONNER phone_number, SUBSTR (phone_number, 1, 3) nouveau_num\u00e9ro_de_t\u00e9l\u00e9phone\n  DE employ\u00e9s\n O\u00d9 phone_number LIKE '___.___.____';\n<\/code><\/pre>\n<p>Table Departments. Obtenir le premier mot du nom du d\u00e9partement pour ceux dont le nom contient plus d'un mot<br \/>\n<b class=\"spoiler_title\">Solution<\/b><\/p>\n<pre><code class=\"sql\">S\u00c9LECTIONNER department_name,\n       SUBSTR (department_name, 1, INSTR (department_name, ' ')-1)\n           premier_mot\n  DE d\u00e9partements\n O\u00d9 INSTR (department_name, ' ') &gt; 0;\n<\/code><\/pre>\n<p>Table Employees. Obtenir les pr\u00e9noms des employ\u00e9s sans la premi\u00e8re et la derni\u00e8re lettre du pr\u00e9nom<br \/>\n<b class=\"spoiler_title\">Solution<\/b><\/p>\n<pre><code class=\"sql\">S\u00c9LECTIONNER first_name, SUBSTR (first_name, 2, LENGTH (first_name) - 2) nouveau_nom\n  DE employ\u00e9s;\n<\/code><\/pre>\n<p>Table Employees. Obtenir la liste de tous les employ\u00e9s dont la derni\u00e8re lettre du pr\u00e9nom est 'm' et dont le pr\u00e9nom a plus de 5 lettres<br \/>\n<b class=\"spoiler_title\">Solution<\/b><\/p>\n<pre><code class=\"sql\">S\u00c9LECTIONNER *\n  DE employ\u00e9s\n O\u00d9 SUBSTR (first_name, -1) = 'm' ET LENGTH(first_name) &gt; 5;\n<\/code><\/pre>\n<p>Table Dual. Obtenir la date du prochain vendredi<br \/>\n<b class=\"spoiler_title\">Solution<\/b><\/p>\n<pre><code class=\"sql\">S\u00c9LECTIONNER NEXT_DAY (SYSDATE, 'VENDREDI') prochain_vendredi DE DUAL;\n<\/code><\/pre>\n<p>Table Employees. Obtenir la liste de tous les employ\u00e9s qui travaillent dans l'entreprise depuis plus de 17 ans<br \/>\n<b class=\"spoiler_title\">Solution<\/b><\/p>\n<pre><code class=\"sql\">S\u00c9LECTIONNER *\n  DE employ\u00e9s\n O\u00d9 MONTHS_BETWEEN (SYSDATE, hire_date) \/ 12 &gt; 17;\n<\/code><\/pre>\n<p>Table Employees. Obtenir la liste de tous les employ\u00e9s dont le dernier chiffre du num\u00e9ro de t\u00e9l\u00e9phone est impair et se compose de 3 chiffres s\u00e9par\u00e9s par un point<br \/>\n<b class=\"spoiler_title\">Solution<\/b><\/p>\n<pre><code class=\"sql\">S\u00c9LECTIONNER *\n  DE employ\u00e9s\n O\u00d9 MOD (SUBSTR (phone_number, -1), 2) != 0\n       ET INSTR (phone_number,'.',1,3) = 0;\n<\/code><\/pre>\n<p>Table Employees. Obtenir la liste de tous les employ\u00e9s dont la valeur job_id apr\u00e8s le caract\u00e8re '_' contient au moins 3 caract\u00e8res, mais cette valeur apr\u00e8s '_' ne doit pas \u00eatre 'CLERK'<br \/>\n<b class=\"spoiler_title\">Solution<\/b><\/p>\n<pre><code class=\"sql\">SELECT *\n  FROM employees\n WHERE     LENGTH (SUBSTR (job_id, INSTR (job_id, '_') + 1)) &gt; 3\n       AND SUBSTR (job_id, INSTR (job_id, '_') + 1) != 'CLERK';\n<\/code><\/pre>\n<p>Table Employees. Obtenir la liste de tous les employ\u00e9s en rempla\u00e7ant dans le champ PHONE_NUMBER tous '.' par '-'<br \/>\n<b class=\"spoiler_title\">Solution<\/b><\/p>\n<pre><code class=\"sql\">SELECT phone_number, REPLACE (phone_number, '.', '-') new_phone_number\n  FROM employees;\n<\/code><\/pre>\n<p>\n<b>Utilisation des fonctions de conversion et des expressions conditionnelles<\/b><\/p>\n<p>Table Employees. Obtenez la liste de tous les employ\u00e9s qui ont commenc\u00e9 \u00e0 travailler le premier jour d'un mois (quel qu'il soit)<br \/>\n<b class=\"spoiler_title\">Solution<\/b><\/p>\n<pre><code class=\"sql\">SELECT *\n  FROM employees\n WHERE TO_CHAR (hire_date, 'DD') = '01';\n<\/code><\/pre>\n<p>Table Employees. Obtenez la liste de tous les employ\u00e9s qui ont commenc\u00e9 \u00e0 travailler en 2008<br \/>\n<b class=\"spoiler_title\">Solution<\/b><\/p>\n<pre><code class=\"sql\">SELECT *\n  FROM employees\n WHERE TO_CHAR (hire_date, 'YYYY') = '2008';\n<\/code><\/pre>\n<p>Table DUAL. Afficher la date de demain au format : Tomorrow is Second day of January<br \/>\n<b class=\"spoiler_title\">Solution<\/b><\/p>\n<pre><code class=\"sql\">SELECT TO_CHAR (SYSDATE, 'fm\"\"Tomorrow is \"\"Ddspth \"\"day of\"\" Month')     info\n  FROM DUAL;\n<\/code><\/pre>\n<p>Table Employees. Obtenez la liste de tous les employ\u00e9s et la date de leur embauche au format : 21st of June, 2007<br \/>\n<b class=\"spoiler_title\">Solution<\/b><\/p>\n<pre><code class=\"sql\">SELECT first_name, TO_CHAR (hire_date, 'fmddth \"\"of\"\" Month, YYYY') hire_date\n  FROM employees;\n<\/code><\/pre>\n<p>Table Employees. Obtenez la liste des employ\u00e9s avec des augmentations de salaire de 20 %. Montrez le salaire avec un signe dollar<br \/>\n<b class=\"spoiler_title\">Solution<\/b><\/p>\n<pre><code class=\"sql\">SELECT first_name, TO_CHAR (salary + salary * 0.20, 'fm$999,999.00') new_salary\n  FROM employees;\n<\/code><\/pre>\n<p>Table Employees. Obtenez la liste de tous les employ\u00e9s qui ont commenc\u00e9 \u00e0 travailler en f\u00e9vrier 2007.<br \/>\n<b class=\"spoiler_title\">Solution<\/b><\/p>\n<pre><code class=\"sql\">SELECT *\n  FROM employees\n WHERE hire_date BETWEEN TO_DATE ('01.02.2007', 'DD.MM.YYYY')\n                     AND LAST_DAY (TO_DATE ('01.02.2007', 'DD.MM.YYYY'));\n\nSELECT *\n  FROM employees\n WHERE to_char(hire_date,'MM.YYYY') = '02.2007'; \n<\/code><\/pre>\n<p>Table DUAL. Afficher la date actuelle, + seconde, + minute, + heure, + jour, + mois, + ann\u00e9e<br \/>\n<b class=\"spoiler_title\">Solution<\/b><\/p>\n<pre><code class=\"sql\">SELECT SYSDATE                          now,\n       SYSDATE + 1 \/ (24 * 60 * 60)     plus_second,\n       SYSDATE + 1 \/ (24 * 60)          plus_minute,\n       SYSDATE + 1 \/ 24                 plus_hour,\n       SYSDATE + 1                      plus_day,\n       ADD_MONTHS (SYSDATE, 1)          plus_month,\n       ADD_MONTHS (SYSDATE, 12)         plus_year\n  FROM DUAL;\n<\/code><\/pre>\n<p>Table Employees. Obtenez la liste de tous les employ\u00e9s avec des salaires complets (salary + commission_pct(%)) au format : $24,000.00<br \/>\n<b class=\"spoiler_title\">Solution<\/b><\/p>\n<pre><code class=\"sql\">SELECT first_name, salary, TO_CHAR (salary + salary * NVL (commission_pct, 0), 'fm$99,999.00') full_salary\n  FROM employees;\n<\/code><\/pre>\n<p>Table Employees. Obtenez la liste de tous les employ\u00e9s et des informations sur la pr\u00e9sence de primes de salaire (Oui\/Non)<br \/>\n<b class=\"spoiler_title\">Solution<\/b><\/p>\n<pre><code class=\"sql\">SELECT first_name, commission_pct, NVL2 (commission_pct, 'Yes', 'No') has_bonus\n  FROM employees;\n<\/code><\/pre>\n<p>Table Employees. Obtenez le niveau de salaire de chaque employ\u00e9 : Moins de 5000 est consid\u00e9r\u00e9 comme un niveau bas, 5000 ou plus et moins de 10000 est consid\u00e9r\u00e9 comme un niveau normal, 10000 ou plus est consid\u00e9r\u00e9 comme un niveau \u00e9lev\u00e9<br \/>\n<b class=\"spoiler_title\">Solution<\/b><\/p>\n<pre><code class=\"sql\">SELECT first_name,\n       salary,\n       CASE\n           WHEN salary = 5000 AND salary &lt; 10000 THEN &#039;Normal&#039;\n           ELSE &#039;High&#039;\n       END salary_level\n  FROM employees;\n<\/code><\/pre>\n<p>Table Countries. Pour chaque pays, montrez la r\u00e9gion dans laquelle il se trouve : 1-Europe, 2-Am\u00e9rique, 3-Asie, 4-Afrique (sans Join)<br \/>\n<b class=\"spoiler_title\">Solution<\/b><\/p>\n<pre><code class=\"sql\">S\u00c9LECTIONNER country_name pays,\n       DECODE (region_id,\n               1, 'Europe',\n               2, 'Am\u00e9rique',\n               3, 'Asie',\n               4, 'Afrique',\n               'Inconnu')\n           region\n  DE countries;\n\nS\u00c9LECTIONNER country_name\n           pays,\n       CASE region_id\n           QUAND 1 ALORS 'Europe'\n           QUAND 2 ALORS 'Am\u00e9rique'\n           QUAND 3 ALORS 'Asie'\n           QUAND 4 ALORS 'Afrique'\n           SINON 'Inconnu'\n       FIN\n           region\n  DE countries;\n<\/code><\/pre>\n<p>\n<b>Rapport de donn\u00e9es agr\u00e9g\u00e9es \u00e0 l'aide des fonctions de groupe<\/b><\/p>\n<p>Table Employ\u00e9s. Obtenir un rapport par department_id avec le salaire minimum et maximum, la date d'embauche la plus ancienne et la plus r\u00e9cente, et le nombre d'employ\u00e9s. Trier par nombre d'employ\u00e9s (ordre d\u00e9croissant)<br \/>\n<b class=\"spoiler_title\">Solution<\/b><\/p>\n<pre><code class=\"sql\">  S\u00c9LECTIONNER department_id,\n         MIN (salary) min_salary,\n         MAX (salary) max_salary,\n         MIN (hire_date) min_hire_date,\n         MAX (hire_date) max_hire_Date,\n         COUNT (*) count\n    DE employees\nGROUP BY department_id\nORDER BY count(*) DESC;\n<\/code><\/pre>\n<p>Table Employ\u00e9s. Combien d'employ\u00e9s ont un pr\u00e9nom commen\u00e7ant par la m\u00eame lettre ? Trier par quantit\u00e9. Afficher seulement ceux o\u00f9 le nombre est sup\u00e9rieur \u00e0 1<br \/>\n<b class=\"spoiler_title\">Solution<\/b><\/p>\n<pre><code class=\"sql\">S\u00c9LECTIONNER SUBSTR (first_name, 1, 1) first_char, COUNT (*)\n    DE employees\nGROUP BY SUBSTR (first_name, 1, 1)\n  HAVING COUNT (*) &gt; 1\nORDER BY 2 DESC;\n<\/code><\/pre>\n<p>Table Employ\u00e9s. Combien d'employ\u00e9s travaillent dans le m\u00eame d\u00e9partement et ont le m\u00eame salaire ?<br \/>\n<b class=\"spoiler_title\">Solution<\/b><\/p>\n<pre><code class=\"sql\">S\u00c9LECTIONNER department_id, salary, COUNT (*)\n    DE employees\nGROUP BY department_id, salary\n  HAVING COUNT (*) &gt; 1;\n<\/code><\/pre>\n<p>Table Employ\u00e9s. Obtenir un rapport du nombre d'employ\u00e9s embauch\u00e9s chaque jour de la semaine. Trier par quantit\u00e9<br \/>\n<b class=\"spoiler_title\">Solution<\/b><\/p>\n<pre><code class=\"sql\">S\u00c9LECTIONNER TO_CHAR (hire_Date, 'Day') jour, COUNT (*)\n    DE employees\nGROUP BY TO_CHAR (hire_Date, 'Day')\nORDER BY 2 DESC;\n<\/code><\/pre>\n<p>Table Employ\u00e9s. Obtenir un rapport du nombre d'employ\u00e9s embauch\u00e9s par ann\u00e9e. Trier par quantit\u00e9<br \/>\n<b class=\"spoiler_title\">Solution<\/b><\/p>\n<pre><code class=\"sql\">S\u00c9LECTIONNER TO_CHAR (hire_date, 'YYYY') ann\u00e9e, COUNT (*)\n    DE employees\nGROUP BY TO_CHAR (hire_date, 'YYYY');\n<\/code><\/pre>\n<p>Table Employ\u00e9s. Obtenir le nombre de d\u00e9partements o\u00f9 il y a des employ\u00e9s<br \/>\n<b class=\"spoiler_title\">Solution<\/b><\/p>\n<pre><code class=\"sql\">S\u00c9LECTIONNER COUNT (COUNT (*))     department_count\n    DE employees\n   WHERE department_id IS NOT NULL\nGROUP BY department_id;\n<\/code><\/pre>\n<p>Table Employ\u00e9s. Obtenir la liste des department_id o\u00f9 plus de 30 employ\u00e9s travaillent<br \/>\n<b class=\"spoiler_title\">Solution<\/b><\/p>\n<pre><code class=\"sql\">  S\u00c9LECTIONNER department_id\n    DE employees\nGROUP BY department_id\n  HAVING COUNT (*) &gt; 30;\n<\/code><\/pre>\n<p>Table Employ\u00e9s. Obtenir la liste des department_id et le salaire moyen arrondi des employ\u00e9s dans chaque d\u00e9partement. <br \/>\n<b class=\"spoiler_title\">Solution<\/b><\/p>\n<pre><code class=\"sql\">  S\u00c9LECTIONNER department_id, ROUND (AVG (salary)) avg_salary\n    DE employees\nGROUP BY department_id;\n<\/code><\/pre>\n<p>Table Pays. Obtenir la liste des region_id o\u00f9 la somme de tous les caract\u00e8res de country_name d\u00e9passe 60<br \/>\n<b class=\"spoiler_title\">Solution<\/b><\/p>\n<pre><code class=\"sql\">  S\u00c9LECTIONNER region_id\n    DE countries\nGROUP BY region_id\n  HAVING SUM (LENGTH (country_name)) &gt; 60;\n<\/code><\/pre>\n<p>Table Employ\u00e9s. Obtenir la liste des department_id o\u00f9 des employ\u00e9s ayant plusieurs (&gt;1) job_id travaillent<br \/>\n<b class=\"spoiler_title\">Solution<\/b><\/p>\n<pre><code class=\"sql\">  S\u00c9LECTIONNER department_id\n    DE employees\nGROUP BY department_id\n  HAVING COUNT (DISTINCT job_id) &gt; 1;\n<\/code><\/pre>\n<p>Table des Employ\u00e9s. Obtenir la liste des manager_id ayant plus de 5 subordonn\u00e9s et dont la somme des salaires de tous les subordonn\u00e9s d\u00e9passe 50000<br \/>\n<b class=\"spoiler_title\">Solution<\/b><\/p>\n<pre><code class=\"sql\">  SELECT manager_id\n    FROM employees\nGROUP BY manager_id\n  HAVING COUNT (*) &gt; 5 AND SUM (salary) &gt; 50000;\n<\/code><\/pre>\n<p>Table des Employ\u00e9s. Obtenir la liste des manager_id dont le salaire moyen de tous les subordonn\u00e9s est compris entre 6000 et 9000 et qui ne re\u00e7oivent pas de primes (commission_pct vide)<br \/>\n<b class=\"spoiler_title\">Solution<\/b><\/p>\n<pre><code class=\"sql\">  SELECT manager_id, AVG (salary) avg_salary\n    FROM employees\n   WHERE commission_pct IS NULL\nGROUP BY manager_id\n  HAVING AVG (salary) BETWEEN 6000 AND 9000;\n<\/code><\/pre>\n<p>Table Employees. Obtenir le salaire maximum de tous les employ\u00e9s dont le job_id se termine par 'CLERK'<br \/>\n<b class=\"spoiler_title\">Solution<\/b><\/p>\n<pre><code class=\"sql\">SELECT MAX (salary) max_salary\n  FROM employees\n WHERE job_id LIKE '%CLERK';\n\nSELECT MAX (salary) max_salary\n  FROM employees\n WHERE SUBSTR (job_id, -5) = 'CLERK';\n<\/code><\/pre>\n<p>Table des Employ\u00e9s. Obtenir le salaire maximum parmi toutes les moyennes de salaires par d\u00e9partement<br \/>\n<b class=\"spoiler_title\">Solution<\/b><\/p>\n<pre><code class=\"sql\">  SELECT MAX (AVG (salary))\n    FROM employees\nGROUP BY department_id;\n<\/code><\/pre>\n<p>Table des Employ\u00e9s. Obtenir le nombre d'employ\u00e9s ayant le m\u00eame nombre de lettres dans leur pr\u00e9nom. Ne montrer que ceux dont la longueur du pr\u00e9nom est sup\u00e9rieure \u00e0 5 et le nombre d'employ\u00e9s avec ce pr\u00e9nom est sup\u00e9rieur \u00e0 20. Trier par longueur de pr\u00e9nom<br \/>\n<b class=\"spoiler_title\">Solution<\/b><\/p>\n<pre><code class=\"sql\">  SELECT LENGTH (first_name), COUNT (*)\n    FROM employees\nGROUP BY LENGTH (first_name)\n  HAVING LENGTH (first_name) &gt; 5 AND COUNT (*) &gt; 20\nORDER BY LENGTH (first_name);\n\n  SELECT LENGTH (first_name), COUNT (*)\n    FROM employees\n   WHERE LENGTH (first_name) &gt; 5\nGROUP BY LENGTH (first_name)\n  HAVING COUNT (*) &gt; 20\nORDER BY LENGTH (first_name);\n<\/code><\/pre>\n<p>\n<b>Affichage des donn\u00e9es provenant de plusieurs tables \u00e0 l'aide de jointures<\/b><\/p>\n<p>Table des Employ\u00e9s, D\u00e9partements, Lieux, Pays, R\u00e9gions. Obtenir la liste des r\u00e9gions et le nombre d'employ\u00e9s dans chaque r\u00e9gion<br \/>\n<b class=\"spoiler_title\">Solution<\/b><\/p>\n<pre><code class=\"sql\">  SELECT region_name, COUNT (*)\n    FROM employees e\n         JOIN departments d ON (e.department_id = d.department_id)\n         JOIN locations l ON (d.location_id = l.location_id)\n         JOIN countries c ON (l.country_id = c.country_id)\n         JOIN regions r ON (c.region_id = r.region_id)\nGROUP BY region_name;\n<\/code><\/pre>\n<p>Table des Employ\u00e9s, D\u00e9partements, Lieux, Pays, R\u00e9gions. Obtenir des informations d\u00e9taill\u00e9es sur chaque employ\u00e9 :<br \/>\nPr\u00e9nom, Nom de famille, D\u00e9partement, Poste, Rue, Pays, R\u00e9gion<br \/>\n<b class=\"spoiler_title\">Solution<\/b><\/p>\n<pre><code class=\"sql\">SELECT First_name,\n       Last_name,\n       Department_name,\n       Job_id,\n       street_address,\n       Country_name,\n       Region_name\n  FROM employees  e\n       JOIN departments d ON (e.department_id = d.department_id)\n       JOIN locations l ON (d.location_id = l.location_id)\n       JOIN countries c ON (l.country_id = c.country_id)\n       JOIN regions r ON (c.region_id = r.region_id);\n<\/code><\/pre>\n<p>Table des Employ\u00e9s. Montrer tous les managers ayant plus de 6 employ\u00e9s sous leur responsabilit\u00e9<br \/>\n<b class=\"spoiler_title\">Solution<\/b><\/p>\n<pre><code class=\"sql\">  SELECT man.first_name, COUNT (*)\n    FROM employees emp JOIN employees man ON (emp.manager_id = man.employee_id)\nGROUP BY man.first_name\n  HAVING COUNT (*) &gt; 6;\n<\/code><\/pre>\n<p>Table des Employ\u00e9s. Montrer tous les employ\u00e9s qui n'ont de subordonn\u00e9s<br \/>\n<b class=\"spoiler_title\">Solution<\/b><\/p>\n<pre><code class=\"sql\">SELECT emp.first_name\n  FROM employees emp\n       LEFT JOIN employees man ON (emp.manager_id = man.employee_id)\n WHERE man.FIRST_NAME IS NULL;\n\nSELECT first_name\n  FROM employees\n WHERE manager_id IS NULL;\n<\/code><\/pre>\n<p>Table des employ\u00e9s, historique des emplois. La table des employ\u00e9s contient tous les employ\u00e9s. La table historique des emplois contient les employ\u00e9s qui ont quitt\u00e9 l'entreprise. Obtenir un rapport sur tous les employ\u00e9s et leur statut dans l'entreprise (Travaillant ou quitt\u00e9 avec date de d\u00e9part)<br \/>\nExemple :<br \/>\nfirst_name | status<br \/>\nJennifer | A quitt\u00e9 l'entreprise le 31 d\u00e9cembre 2006<br \/>\nClara | Actuellement en poste<br \/>\n<b class=\"spoiler_title\">Solution<\/b><\/p>\n<pre><code class=\"sql\">SELECT first_name,\n       NVL2 (\n           end_date,\n           TO_CHAR (end_date, 'fm\"\"A quitt\u00e9 l'entreprise le\"\" DD \"\"de\"\" Month, YYYY'),\n           'Actuellement en poste')\n           status\n  FROM employees e LEFT JOIN job_history j ON (e.employee_id = j.employee_id);\n<\/code><\/pre>\n<p>Table des employ\u00e9s, d\u00e9partements, emplacements, pays, r\u00e9gions. Obtenir la liste des employ\u00e9s vivant en Europe (region_name)<br \/>\n<b class=\"spoiler_title\">Solution<\/b><\/p>\n<pre><code class=\"sql\"> SELECT first_name\n  FROM employees\n       JOIN departments USING (department_id)\n       JOIN locations USING (location_id)\n       JOIN countries USING (country_id)\n       JOIN regions USING (region_id)\n WHERE region_name = 'Europe';\n\nSELECT first_name\n  FROM employees e\n       JOIN departments d ON (e.department_id = d.department_id)\n       JOIN locations l ON (d.location_id = l.location_id)\n       JOIN countries c ON (l.country_id = c.country_id)\n       JOIN regions r ON (c.region_id = r.region_id)\n WHERE region_name = 'Europe';\n<\/code><\/pre>\n<p>Table des employ\u00e9s, d\u00e9partements. Montrer tous les d\u00e9partements o\u00f9 plus de 30 employ\u00e9s travaillent<br \/>\n<b class=\"spoiler_title\">Solution<\/b><\/p>\n<pre><code class=\"sql\">SELECT department_name, COUNT (*)\n    FROM employees e JOIN departments d ON (e.department_id = d.department_id)\nGROUP BY department_name\n  HAVING COUNT (*) &gt; 30;\n<\/code><\/pre>\n<p>Table des employ\u00e9s, d\u00e9partements. Montrer tous les employ\u00e9s qui ne font partie d'aucun d\u00e9partement<br \/>\n<b class=\"spoiler_title\">Solution<\/b><\/p>\n<pre><code class=\"sql\">SELECT first_name\n  FROM employees e\n       LEFT JOIN departments d ON (e.department_id = d.department_id)\n WHERE d.department_name IS NULL;\n\nSELECT first_name\n  FROM employees\n WHERE department_id IS NULL;\n<\/code><\/pre>\n<p>Table des employ\u00e9s, d\u00e9partements. Montrer tous les d\u00e9partements o\u00f9 il n'y a aucun employ\u00e9<br \/>\n<b class=\"spoiler_title\">Solution<\/b><\/p>\n<pre><code class=\"sql\">SELECT department_name\n  FROM employees e\n       RIGHT JOIN departments d ON (e.department_id = d.department_id)\n WHERE first_name IS NULL;\n<\/code><\/pre>\n<p>Table des employ\u00e9s. Montrer tous les employ\u00e9s qui n'ont personne sous leur responsabilit\u00e9<br \/>\n<b class=\"spoiler_title\">Solution<\/b><\/p>\n<pre><code class=\"sql\">SELECT man.first_name\n  FROM employees emp\n       RIGHT JOIN employees man ON (emp.manager_id = man.employee_id)\n WHERE emp.FIRST_NAME IS NULL;\n<\/code><\/pre>\n<p>Table des employ\u00e9s, emplois, d\u00e9partements. Montrer les employ\u00e9s au format : First_name, Job_title, Department_name.<br \/>\nExemple :<br \/>\nFirst_name | Job_title | Department_name<br \/>\nDonald | Exp\u00e9dition | Employ\u00e9 en exp\u00e9dition<br \/>\n<b class=\"spoiler_title\">Solution<\/b><\/p>\n<pre><code class=\"sql\">SELECT first_name, job_title, department_name\n  FROM employees e\n       JOIN jobs j ON (e.job_id = j.job_id)\n       JOIN departments d ON (d.department_id = e.department_id);\n<\/code><\/pre>\n<p>Table des employ\u00e9s. Obtenir la liste des employ\u00e9s dont les managers ont \u00e9t\u00e9 embauch\u00e9s en 2005, mais qui eux-m\u00eames ont \u00e9t\u00e9 embauch\u00e9s avant 2005<br \/>\n<b class=\"spoiler_title\">Solution<\/b><\/p>\n<pre><code class=\"sql\">SELECT emp.*\n  FROM employees emp JOIN employees man ON (emp.manager_id = man.employee_id)\n WHERE TO_CHAR (man.hire_date, 'YYYY') = '2005'\n       AND emp.hire_date &lt; TO_DATE (&#039;01012005&#039;, &#039;DDMMYYYY&#039;);\n<\/code><\/pre>\n<p>Table des employ\u00e9s. Obtenez la liste des employ\u00e9s dont les managers ont \u00e9t\u00e9 embauch\u00e9s en janvier d'une ann\u00e9e donn\u00e9e et dont la longueur du job_title est sup\u00e9rieure \u00e0 15 caract\u00e8res.<br \/>\n<b class=\"spoiler_title\">Solution<\/b><\/p>\n<pre><code class=\"sql\">SELECT emp.*\n  FROM employees emp\n       JOIN employees man ON (emp.manager_id = man.employee_id)\n       JOIN jobs j ON (emp.job_id = j.job_id)\n WHERE TO_CHAR(man.hire_date, 'MM') = '01' AND LENGTH(j.job_title) &gt; 15;\n<\/code><\/pre>\n<p>\n<b>Utilisation de sous-requ\u00eates pour r\u00e9soudre des requ\u00eates<\/b><\/p>\n<p>Table des employ\u00e9s. Obtenez la liste des employ\u00e9s avec le pr\u00e9nom le plus long.<br \/>\n<b class=\"spoiler_title\">Solution<\/b><\/p>\n<pre><code class=\"sql\">SELECT *\n  FROM employees\n WHERE LENGTH(first_name) =\n       (SELECT MAX(LENGTH(first_name)) FROM employees);\n<\/code><\/pre>\n<p>Table des employ\u00e9s. Obtenez la liste des employ\u00e9s dont le salaire est sup\u00e9rieur \u00e0 la moyenne de tous les employ\u00e9s.<br \/>\n<b class=\"spoiler_title\">Solution<\/b><\/p>\n<pre><code class=\"sql\">SELECT *\n  FROM employees\n WHERE salary &gt; (SELECT AVG(salary) FROM employees);\n<\/code><\/pre>\n<p>Tables Employees, Departments, Locations. Obtenez la ville o\u00f9 les employ\u00e9s gagnent le moins en total.<br \/>\n<b class=\"spoiler_title\">Solution<\/b><\/p>\n<pre><code class=\"sql\">SELECT city\n    FROM employees e\n         JOIN departments d ON (e.department_id = d.department_id)\n         JOIN locations l ON (d.location_id = l.location_id)\nGROUP BY city\n  HAVING SUM(salary) =\n         (SELECT MIN(SUM(salary))\n              FROM employees e\n                   JOIN departments d ON (e.department_id = d.department_id)\n                   JOIN locations l ON (d.location_id = l.location_id)\n          GROUP BY city);\n<\/code><\/pre>\n<p>Table des employ\u00e9s. Obtenez la liste des employ\u00e9s dont le manager a un salaire sup\u00e9rieur \u00e0 15000.<br \/>\n<b class=\"spoiler_title\">Solution<\/b><\/p>\n<pre><code class=\"sql\">SELECT *\n  FROM employees\n WHERE manager_id IN (SELECT employee_id\n                        FROM employees\n                       WHERE salary &gt; 15000)\n<\/code><\/pre>\n<p>Table des employ\u00e9s, d\u00e9partements. Montrer tous les d\u00e9partements o\u00f9 il n'y a aucun employ\u00e9<br \/>\n<b class=\"spoiler_title\">Solution<\/b><\/p>\n<pre><code class=\"sql\">SELECT *\n  FROM departments\n WHERE department_id NOT IN (SELECT department_id\n                               FROM employees\n                              WHERE department_id IS NOT NULL);\n<\/code><\/pre>\n<p>Table des employ\u00e9s. Montrez tous les employ\u00e9s qui ne sont pas des managers<br \/>\n<b class=\"spoiler_title\">Solution<\/b><\/p>\n<pre><code class=\"sql\">SELECT *\n  FROM employees\n WHERE employee_id NOT IN (SELECT manager_id\n                             FROM employees\n                            WHERE manager_id IS NOT NULL)\n<\/code><\/pre>\n<p>Table des Employ\u00e9s. Montrer tous les managers ayant plus de 6 employ\u00e9s sous leur responsabilit\u00e9<br \/>\n<b class=\"spoiler_title\">Solution<\/b><\/p>\n<pre><code class=\"sql\">SELECT *\n  FROM employees e\n WHERE (SELECT COUNT(*)\n          FROM employees\n         WHERE manager_id = e.employee_id) &gt; 6;\n<\/code><\/pre>\n<p>Table des employ\u00e9s, d\u00e9partements. Montrez les employ\u00e9s qui travaillent dans le d\u00e9partement IT<br \/>\n<b class=\"spoiler_title\">Solution<\/b><\/p>\n<pre><code class=\"sql\">SELECT *\n  FROM employees\n WHERE department_id = (SELECT department_id\n                          FROM departments\n                         WHERE department_name = 'IT');\n<\/code><\/pre>\n<p>Table des employ\u00e9s, emplois, d\u00e9partements. Montrer les employ\u00e9s au format : First_name, Job_title, Department_name.<br \/>\nExemple :<br \/>\nFirst_name | Job_title | Department_name<br \/>\nDonald | Exp\u00e9dition | Employ\u00e9 en exp\u00e9dition<br \/>\n<b class=\"spoiler_title\">Solution<\/b><\/p>\n<pre><code class=\"sql\">SELECT first_name,\n       (SELECT job_title\n          FROM jobs\n         WHERE job_id = e.job_id) job_title,\n       (SELECT department_name\n          FROM departments\n         WHERE department_id = e.department_id) department_name\n  FROM employees e;\n<\/code><\/pre>\n<p>Table des employ\u00e9s. Obtenir la liste des employ\u00e9s dont les managers ont \u00e9t\u00e9 embauch\u00e9s en 2005, mais qui eux-m\u00eames ont \u00e9t\u00e9 embauch\u00e9s avant 2005<br \/>\n<b class=\"spoiler_title\">Solution<\/b><\/p>\n<pre><code class=\"sql\">SELECT *\n  FROM employees\n WHERE manager_id IN (SELECT employee_id\n                            FROM employees\n                           WHERE TO_CHAR(hire_date, 'YYYY') = '2005')\n       AND hire_date &lt; TO_DATE(&#039;01012005&#039;, &#039;DDMMYYYY&#039;);\n<\/code><\/pre>\n<p>Table des employ\u00e9s. Obtenez la liste des employ\u00e9s dont les managers ont \u00e9t\u00e9 embauch\u00e9s en janvier d'une ann\u00e9e donn\u00e9e et dont la longueur du job_title est sup\u00e9rieure \u00e0 15 caract\u00e8res.<br \/>\n<b class=\"spoiler_title\">Solution<\/b><\/p>\n<pre><code class=\"sql\">SELECT *\n  FROM employees e\n WHERE manager_id IN (SELECT employee_id\n                            FROM employees\n                           WHERE TO_CHAR(hire_date, 'MM') = '01')\n       AND (SELECT LENGTH(job_title)\n              FROM jobs\n             WHERE job_id = e.job_id) &gt; 15;\n<\/code><\/pre>\n<p>\n<b>C'est tout pour l'instant.<\/b><\/p>\n<p>J'esp\u00e8re que les t\u00e2ches \u00e9taient int\u00e9ressantes et captivantes. <br \/>\nJ'ajouterai ce que je peux \u00e0 cette liste de t\u00e2ches.<br \/>\nJe suis \u00e9galement ouvert \u00e0 tous commentaires et suggestions.<\/p>\n<p>P.S. : Si quelqu'un a une id\u00e9e de t\u00e2che int\u00e9ressante sur SELECT, \u00e9crivez dans les commentaires, je l'ajouterai \u00e0 la liste.<\/p>\n<p>Merci.<br \/>\n<br \/>Source : <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/461567\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0417\u0434\u0440\u0430\u0432\u0441\u0442\u0432\u0443\u0439, \u0425\u0430\u0431\u0440! \u0412\u043e\u0442 \u0443\u0436\u0435 \u0431\u043e\u043b\u0435\u0435 3-\u0445 \u043b\u0435\u0442 \u044f \u043f\u0440\u0435\u043f\u043e\u0434\u0430\u044e SQL \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u0442\u0440\u0435\u043d\u0438\u043d\u0433 \u0446\u0435\u043d\u0442\u0440\u0430\u0445, \u0438 \u043e\u0434\u043d\u0438\u043c \u0438\u0437 \u043c\u043e\u0438\u0445 \u043d\u0430\u0431\u043b\u044e\u0434\u0435\u043d\u0438\u0439 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u043e, \u0447\u0442\u043e \u0441\u0442\u0443\u0434\u0435\u043d\u0442\u044b \u043e\u0441\u0432\u0430\u0438\u0432\u0430\u044e\u0442 \u0438 \u043f\u043e\u043d\u0438\u043c\u0430\u044e\u0442 SQL \u043b\u0443\u0447\u0448\u0435, \u0435\u0441\u043b\u0438 \u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043f\u0435\u0440\u0435\u0434 \u043d\u0438\u043c\u0438 \u0437\u0430\u0434\u0430\u0447\u0443, \u0430 \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044f\u0445 \u0438 \u0442\u0435\u043e\u0440\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043e\u0441\u043d\u043e\u0432\u0430\u0445. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u043f\u043e\u0434\u0435\u043b\u044e\u0441\u044c \u0441 \u0432\u0430\u043c\u0438 \u0441\u0432\u043e\u0438\u043c \u0441\u043f\u0438\u0441\u043a\u043e\u043c \u0437\u0430\u0434\u0430\u0447, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u044f \u0434\u0430\u044e [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":27465,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[702],"tags":[],"class_list":["post-36671","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-news"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.2 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0417\u0434\u0440\u0430\u0432\u0441\u0442\u0432\u0443\u0439, \u0425\u0430\u0431\u0440! \u0412\u043e\u0442 \u0443\u0436\u0435 \u0431\u043e\u043b\u0435\u0435 3-\u0445 \u043b\u0435\u0442 \u044f \u043f\u0440\u0435\u043f\u043e\u0434\u0430\u044e SQL \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u0442\u0440\u0435\u043d\u0438\u043d\u0433 \u0446\u0435\u043d\u0442\u0440\u0430\u0445, \u0438 \u043e\u0434\u043d\u0438\u043c \u0438\u0437 \u043c\u043e\u0438\u0445 \u043d\u0430\u0431\u043b\u044e\u0434\u0435\u043d\u0438\u0439 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u043e, \u0447\u0442\u043e \u0441\u0442\u0443\u0434\u0435\u043d\u0442\u044b \u043e\u0441\u0432\u0430\u0438\u0432\u0430\u044e\u0442 \u0438 \u043f\u043e\u043d\u0438\u043c\u0430\u044e\u0442 SQL \u043b\u0443\u0447\u0448\u0435, \u0435\u0441\u043b\u0438 \u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043f\u0435\u0440\u0435\u0434 \u043d\u0438\u043c\u0438 \u0437\u0430\u0434\u0430\u0447\u0443, \u0430 \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/fr\/blog\/news\/sql-zanimatelnye-zadachki\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"fr_FR\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47SQL. \u0417\u0430\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0437\u0430\u0434\u0430\u0447\u043a\u0438 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0417\u0434\u0440\u0430\u0432\u0441\u0442\u0432\u0443\u0439, \u0425\u0430\u0431\u0440! \u0412\u043e\u0442 \u0443\u0436\u0435 \u0431\u043e\u043b\u0435\u0435 3-\u0445 \u043b\u0435\u0442 \u044f \u043f\u0440\u0435\u043f\u043e\u0434\u0430\u044e SQL \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u0442\u0440\u0435\u043d\u0438\u043d\u0433 \u0446\u0435\u043d\u0442\u0440\u0430\u0445, \u0438 \u043e\u0434\u043d\u0438\u043c \u0438\u0437 \u043c\u043e\u0438\u0445 \u043d\u0430\u0431\u043b\u044e\u0434\u0435\u043d\u0438\u0439 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u043e, \u0447\u0442\u043e \u0441\u0442\u0443\u0434\u0435\u043d\u0442\u044b \u043e\u0441\u0432\u0430\u0438\u0432\u0430\u044e\u0442 \u0438 \u043f\u043e\u043d\u0438\u043c\u0430\u044e\u0442 SQL \u043b\u0443\u0447\u0448\u0435, \u0435\u0441\u043b\u0438 \u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043f\u0435\u0440\u0435\u0434 \u043d\u0438\u043c\u0438 \u0437\u0430\u0434\u0430\u0447\u0443, \u0430 \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/fr\/blog\/news\/sql-zanimatelnye-zadachki\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T19:13:01+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T19:13:01+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47SQL. D\u00e9fis int\u00e9ressants | ProHoster","description":"Bonjour, Habr ! Cela fait plus de 3 ans que j'enseigne SQL dans diff\u00e9rents centres de formation, et l'une de mes observations est que les \u00e9tudiants ma\u00eetrisent et comprennent mieux SQL lorsqu'on leur propose un d\u00e9fi, plut\u00f4t que de se contenter de l'apprentissage passif.","canonical_url":"https:\/\/prohoster.info\/fr\/blog\/news\/sql-zanimatelnye-zadachki","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"fr_FR","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47SQL. \u0417\u0430\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0437\u0430\u0434\u0430\u0447\u043a\u0438 | ProHoster","og:description":"\u0417\u0434\u0440\u0430\u0432\u0441\u0442\u0432\u0443\u0439, \u0425\u0430\u0431\u0440! \u0412\u043e\u0442 \u0443\u0436\u0435 \u0431\u043e\u043b\u0435\u0435 3-\u0445 \u043b\u0435\u0442 \u044f \u043f\u0440\u0435\u043f\u043e\u0434\u0430\u044e SQL \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u0442\u0440\u0435\u043d\u0438\u043d\u0433 \u0446\u0435\u043d\u0442\u0440\u0430\u0445, \u0438 \u043e\u0434\u043d\u0438\u043c \u0438\u0437 \u043c\u043e\u0438\u0445 \u043d\u0430\u0431\u043b\u044e\u0434\u0435\u043d\u0438\u0439 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u043e, \u0447\u0442\u043e \u0441\u0442\u0443\u0434\u0435\u043d\u0442\u044b \u043e\u0441\u0432\u0430\u0438\u0432\u0430\u044e\u0442 \u0438 \u043f\u043e\u043d\u0438\u043c\u0430\u044e\u0442 SQL \u043b\u0443\u0447\u0448\u0435, \u0435\u0441\u043b\u0438 \u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043f\u0435\u0440\u0435\u0434 \u043d\u0438\u043c\u0438 \u0437\u0430\u0434\u0430\u0447\u0443, \u0430 \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e.","og:url":"https:\/\/prohoster.info\/fr\/blog\/news\/sql-zanimatelnye-zadachki","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T19:13:01+00:00","article:modified_time":"2019-10-31T19:13:01+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"36671","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-22 04:21:19","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 01:40:23","updated":"2026-01-22 04:21:19","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts\/36671","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/comments?post=36671"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts\/36671\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media\/27465"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media?parent=36671"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/categories?post=36671"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/tags?post=36671"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}