[MySQL] Bases de l'ajout, de la suppression, de la vérification et de la modification


Les étudiants qui ont besoin de serveurs cloud et d'autres produits cloud pour apprendre Linux peuvent passer à / --> Tencent Cloud <-- / --> Alibaba Cloud <-- / --> Huawei Cloud <-- / site officiel, les serveurs cloud légers sont à faible coût, à 112 yuans/an, et les nouveaux utilisateurs peuvent bénéficier de remises ultra-faibles sur leur première commande.


  Table des matières

1. Créer

1. insérer(insérer)

1.1 Insertion de données sur une seule ligne

1.2 Insertion de données multi-lignes

1.3 Insérer ou remplacer des mises à jour

2.remplacer(remplacer)

2. Récupérer (lire)

1、sélectionner

1.1 Requête de colonne complète

1.2 Spécifier la requête de colonne + utiliser selsct pour calculer les expressions

1.3 Éliminer les doublons dans les résultats de dépistage

2、où

2.1 Opérateurs

2.2 Rechercher les étudiants dont le score en anglais est inférieur à 60 et leurs scores en anglais

2.3 Étudiants dont les scores en chinois sont [80, 90] et leurs scores en chinois

2.4 Étudiants dont les résultats en mathématiques sont de 58 ou 59 ou 98 ou 99 et leurs résultats en mathématiques

2.5 Filtrer les camarades de classe nommés Sun et les camarades de classe nommés Sun (recherche floue)

2.6 Étudiants dont les scores en chinois sont supérieurs à leurs scores en anglais

2.7 Étudiants dont le score total est inférieur à 200 points

2.8 Étudiants dont les scores en chinois sont >80 et dont le nom de famille n'est pas Sun

2.9 Student Sun, sinon le score total doit être > 200 et le score en chinois < score en mathématiques et score en anglais > 80

2.10 Requête NULL

3. ordre asc/desc (ordre croissant/décroissant des résultats)

3.1 Les étudiants et les résultats en mathématiques sont affichés par ordre croissant/décroissant en fonction des résultats en mathématiques.

3.2 Interrogez les scores des élèves dans chaque matière et affichez-les par ordre décroissant de mathématiques, par ordre décroissant d'anglais et par ordre croissant de chinois.

3.3 Interroger les camarades de classe et les scores totaux, de haut en bas

3.4 Interrogez les résultats en mathématiques des élèves nommés Sun ou des élèves nommés Cao. Les résultats seront affichés par ordre décroissant des résultats en mathématiques.

4. limite (écran d'un petit nombre de résultats)

3. Mise à jour

1. Changer le score mathématique de Sun Wukong à 80 points

2. Changez le score en mathématiques de Cao Mengde à 60 points et son score en chinois à 70 points

3. Ajoutez 30 points aux résultats en mathématiques des trois élèves ayant obtenu les scores totaux les plus bas.

4. Mettez à jour les scores chinois de tous les élèves au double de la valeur d'origine

4. Supprimer

1. Supprimer les résultats des tests de Sun Wukong

2. Supprimez les données des étudiants ayant le score total le plus élevé

3. Supprimez toutes les données du tableau

3.1 supprimer de

3.2 Tronquer le tableau (à utiliser avec prudence)

5. Insérez les données filtrées dans la base de données (insertion+sélection)

1. Supprimez les enregistrements en double dans le tableau. Il ne peut y avoir qu'une seule copie des données en double.

6. Fonction d'agrégation

1. COUNT([DISTINCT] expr) renvoie le nombre de données interrogées

2. SUM([DISTINCT] expr) renvoie la somme des données interrogées. Cela n'a aucun sens s'il ne s'agit pas d'un nombre.

3. AVG([DISTINCT] expr) renvoie la valeur moyenne des données interrogées. Cela n'a aucun sens s'il ne s'agit pas d'un nombre.

4. MAX([DISTINCT] expr) renvoie la valeur maximale des données interrogées. Cela n'a aucun sens s'il ne s'agit pas d'un nombre.

5. MIN([DISTINCT] expr) renvoie la valeur minimale des données interrogées. Cela n'a aucun sens s'il ne s'agit pas d'un nombre.

7. Clause Group by : requête de groupe sur la colonne spécifiée

1. Importer le tableau d'informations sur les employés

2. Afficher le salaire moyen et le salaire maximum de chaque département

3. Afficher le salaire moyen et le salaire minimum pour chaque département et chaque poste

4. Afficher les départements avec un salaire moyen inférieur à 2 000 et son salaire moyen

5. « Smith » ne participe pas aux statistiques, qui montrent les types de travail avec un salaire moyen inférieur à 2 000 pour chaque département et chaque poste.

5.1La différence entre avoir et où


CRUD : créer, récupérer, mettre à jour, supprimer

1. Créer

grammaire:

INSERT [INTO] table_name
[(column [, column] ...)]
VALUES (value_list) [, (value_list)] ...
value_list: value, [, value] ...

Créez d’abord une table d’étudiant :

--创建学生表
mysql> create table if not exists students(
    -> id int unsigned primary key auto_increment,
    -> sn int unsigned unique key,
    -> name varchar(20) not null,
    -> qq varchar(32) unique key
    -> );
Query OK, 0 rows affected (0.31 sec)

1. insérer(insérer)

1.1 Insertion de données sur une seule ligne

Insérez une seule ligne d'une colonne spécifiée :

mysql> insert into students (sn,name,qq) values (100,'张三','123456');
Query OK, 1 row affected (0.04 sec)

Insertion d'une seule ligne et d'une colonne complète :

mysql> insert into students values (2,101,'李四','222222');
Query OK, 1 row affected (0.05 sec)

1.2 Insertion de données multi-lignes

mysql> insert into students (sn,name,qq) values (102,'王五','333333'),(103,'赵六',444444);
Query OK, 2 rows affected (0.04 sec)
Records: 2  Duplicates: 0  Warnings: 0

Chaque élément de données inséré est séparé par des virgules pour obtenir l'effet d'insérer plusieurs lignes à la fois.

1.3 Insérer ou remplacer des mises à jour

--打印当前学生表数据
mysql> select* from students;
+----+------+--------+--------+
| id | sn   | name   | qq     |
+----+------+--------+--------+
|  1 |  100 | 张三   | 123456 |
|  2 |  101 | 李四   | 222222 |
|  3 |  102 | 王五   | 333333 |
|  4 |  103 | 赵六   | 444444 |
+----+------+--------+--------+
4 rows in set (0.00 sec)
--重复插入主键为2的值,主键冲突,插入失败
mysql> insert into students values (2,104,'小明','111111');
ERROR 1062 (23000): Duplicate entry '2' for key 'PRIMARY'
--插入变更新,注意作为更新的值可以和插入的值不一样
mysql> insert into students values (2,104,'小明',111111) on duplicate key update sn=104,name='小明',qq='111111';
Query OK, 2 rows affected (0.04 sec)
--打印当前学生表数据,发现id=2的数据被更新
mysql> select* from students;
+----+------+--------+--------+
| id | sn   | name   | qq     |
+----+------+--------+--------+
|  1 |  100 | 张三   | 123456 |
|  2 |  104 | 小明   | 111111 |
|  3 |  102 | 王五   | 333333 |
|  4 |  103 | 赵六   | 444444 |
+----+------+--------+--------+
4 rows in set (0.01 sec)

Pour insérer des données, d'abord les données doivent être légales (les champs pertinents ne sont pas contraints par des clés uniques, des clés primaires, des clés étrangères, etc.). Deuxièmement, si l'identifiant des données insérées existe déjà, sn, name et qq seront mis à jour au lieu de l'échec d'insertion.

2.remplacer(remplacer)

--如果替代的数据在表中无冲突,replace将被当成插入
mysql> replace into students (sn,name,qq) values (105,'小红','555555');
Query OK, 1 row affected (0.46 sec)
--打印当前学生表数据,可以看到表中多了一行小红的信息
mysql> select* from students;
+----+------+--------+--------+
| id | sn   | name   | qq     |
+----+------+--------+--------+
|  1 |  100 | 张三   | 123456 |
|  2 |  104 | 小明   | 111111 |
|  3 |  102 | 王五   | 333333 |
|  4 |  103 | 赵六   | 444444 |
|  5 |  105 | 小红   | 555555 |
+----+------+--------+--------+
5 rows in set (0.00 sec)
--再次replace,唯一键存在冲突,小红1的数据将替换小红的数据
mysql> replace into students (sn,name,qq) values (105,'小红1','555555');
Query OK, 2 rows affected (0.02 sec)
--打印当前学生表数据,发现小红1的id变为6
mysql> select* from students;
+----+------+---------+--------+
| id | sn   | name    | qq     |
+----+------+---------+--------+
|  1 |  100 | 张三    | 123456 |
|  2 |  104 | 小明    | 111111 |
|  3 |  102 | 王五    | 333333 |
|  4 |  103 | 赵六    | 444444 |
|  6 |  105 | 小红1   | 555555 |
+----+------+---------+--------+
5 rows in set (0.00 sec)

S'il n'y a pas de conflit dans la clé primaire ou la clé unique, insérez-la directement ;

En cas de conflit entre la clé primaire ou la clé unique, supprimez-la, puis insérez-la.

Il y a un détail : lorsqu'un remplacement se produit, parce que la clé primaire s'incrémentera automatiquement et que le remplacement sera supprimé puis remplacé, l'identifiant de ligne utilisé pour le remplacement utilisera l'identifiant d'auto-incrémentation suivant. Par exemple, dans l'instruction SQL ci-dessus, l'ID d'origine de Xiaohong est 5. Après avoir été remplacé par Xiaohong1, l'ID devient 6.

2. Récupérer (lire)

grammaire:

SELECT
[DISTINCT] {* | {column [, column] ...}
[FROM table_name]
[WHERE ...]
[ORDER BY column [ASC | DESC], ...]
LIMIT ...

Créez d’abord une feuille de score :

--创建成绩表
mysql> CREATE TABLE exam_result (
    -> id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
    -> name VARCHAR(20) NOT NULL COMMENT '同学姓名',
    -> chinese float DEFAULT 0.0 COMMENT '语文成绩',
    -> math float DEFAULT 0.0 COMMENT '数学成绩',
    -> english float DEFAULT 0.0 COMMENT '英语成绩'
    -> );
Query OK, 0 rows affected (0.14 sec)
--插入测试数据
mysql> INSERT INTO exam_result (name, chinese, math, english) VALUES
    -> ('A', 67, 98, 56),
    -> ('B', 87, 78, 77),
    -> ('C', 88, 98, 90),
    -> ('D', 82, 84, 67),
    -> ('E', 55, 85, 45),
    -> ('F', 70, 73, 78),
    -> ('G', 75, 65, 30);
ds: 7 Duplicates: 0 Warnings: 0Query OK, 7 rows affected (0.03 sec)
Records: 7  Duplicates: 0  Warnings: 0

1、sélectionner

1.1 Requête de colonne complète

mysql> select* from exam_result;
+----+------+---------+------+---------+
| id | name | chinese | math | english |
+----+------+---------+------+---------+
|  1 | A    |      67 |   98 |      56 |
|  2 | B    |      87 |   78 |      77 |
|  3 | C    |      88 |   98 |      90 |
|  4 | D    |      82 |   84 |      67 |
|  5 | E    |      55 |   85 |      45 |
|  6 | F    |      70 |   73 |      78 |
|  7 | G    |      75 |   65 |      30 |
+----+------+---------+------+---------+
7 rows in set (0.00 sec)

Il n'est généralement pas recommandé d'utiliser * pour une requête en colonne complète

1. Plus il y a de colonnes interrogées, plus la quantité de données à transmettre est importante ;

2. Cela peut affecter l'utilisation des index.

1.2 Spécifier la requête de colonne + utiliser selsct pour calculer les expressions

--指定姓名和数学成绩列进行查询
mysql> select name,math from exam_result;
+------+------+
| name | math |
+------+------+
| A    |   98 |
| B    |   78 |
| C    |   98 |
| D    |   84 |
| E    |   85 |
| F    |   73 |
| G    |   65 |
+------+------+
7 rows in set (0.00 sec)
--利用selsct计算平均分
mysql> select name,math,(chinese+math+english)/3 from exam_result;
+------+------+--------------------------+
| name | math | (chinese+math+english)/3 |
+------+------+--------------------------+
| A    |   98 |        73.66666666666667 |
| B    |   78 |        80.66666666666667 |
| C    |   98 |                       92 |
| D    |   84 |        77.66666666666667 |
| E    |   85 |       61.666666666666664 |
| F    |   73 |        73.66666666666667 |
| G    |   65 |       56.666666666666664 |
+------+------+--------------------------+

--觉得计算式太长,可以用as给它重命名为average
mysql> select name,math,(chinese+math+english)/3 as average from exam_result;
+------+------+--------------------+
| name | math | average            |
+------+------+--------------------+
| A    |   98 |  73.66666666666667 |
| B    |   78 |  80.66666666666667 |
| C    |   98 |                 92 |
| D    |   84 |  77.66666666666667 |
| E    |   85 | 61.666666666666664 |
| F    |   73 |  73.66666666666667 |
| G    |   65 | 56.666666666666664 |
+------+------+--------------------+
7 rows in set (0.02 sec)

--当然这个as可以省略
mysql> select name 姓名,math 数学,(chinese+math+english)/3 平均分 from exam_result;
+--------+--------+--------------------+
| 姓名   | 数学    | 平均分             |
+--------+--------+--------------------+
| A      |     98 |  73.66666666666667 |
| B      |     78 |  80.66666666666667 |
| C      |     98 |                 92 |
| D      |     84 |  77.66666666666667 |
| E      |     85 | 61.666666666666664 |
| F      |     73 |  73.66666666666667 |
| G      |     65 | 56.666666666666664 |
+--------+--------+--------------------+
7 rows in set (0.01 sec)

1.3 Éliminer les doublons dans les résultats de dépistage

mysql> select distinct math from exam_result;
+------+
| math |
+------+
|   98 |
|   78 |
|   84 |
|   85 |
|   73 |
|   65 |
+------+
6 rows in set (0.00 sec)

2、où

2.1 Opérateurs

Opérateurs de comparaison :

opérateur

illustrer

>, >=, <, <=

Supérieur à, supérieur ou égal à, inférieur à, inférieur ou égal à

=

Égal à, NULL n'est pas sécurisé , par exemple, le résultat de NULL = NULL est NULL

<=>

Égal à, NULL est sûr, par exemple, le résultat de NULL <=> NULL est TRUE(1)

!=, <>

Différent de (les deux symboles sont NULL dangereux)

ENTRE a0 ET a1

Correspondance de plage, [a0, a1], si a0 <= valeur <= a1, renvoie TRUE(1)

DANS (option, ...)

S'il s'agit de l'une des options, renvoie TRUE(1)

EST NULL

est NULL

EST NON NULLE

Pas NULL

COMME

Correspondance floue. comme un%'. % représente n'importe quel nombre (y compris 0) de n'importe quel caractère ; comme « A_ ». _ représente n'importe quel caractère

Opérateurs logiques:

opérateur

illustrer

ET

Plusieurs conditions doivent toutes être VRAIES(1) et le résultat est VRAI(1)

OU

Si une condition est VRAIE(1), le résultat est VRAI(1)

PAS

La condition est VRAI(1), le résultat est FAUX(0)

2.2 Rechercher les étudiants dont le score en anglais est inférieur à 60 et leurs scores en anglais

mysql> select name,english from exam_result where english<60;
+------+---------+
| name | english |
+------+---------+
| A    |      56 |
| E    |      45 |
| G    |      30 |
+------+---------+
3 rows in set (0.00 sec)

2.3 Étudiants dont les scores en chinois sont [80, 90] et leurs scores en chinois

--  >=和<=
mysql> select name,chinese from exam_result where chinese>=80 and chinese <=90;
+------+---------+
| name | chinese |
+------+---------+
| B    |      87 |
| C    |      88 |
| D    |      82 |
+------+---------+
3 rows in set (0.01 sec)

--between a0 and a1
mysql> select name,chinese from exam_result where chinese between 80 and 90;
+------+---------+
| name | chinese |
+------+---------+
| B    |      87 |
| C    |      88 |
| D    |      82 |
+------+---------+
3 rows in set (0.00 sec)

2.4 Étudiants dont les résultats en mathématiques sont de 58 ou 59 ou 98 ou 99 et leurs résultats en mathématiques

--可以采用多个or
mysql> select name,math from exam_result where math=58 or math=59 or math=98 or math=99;
+------+------+
| name | math |
+------+------+
| A    |   98 |
| C    |   98 |
+------+------+
2 rows in set (0.02 sec)

--可以用in(......)
mysql> select name,math from exam_result where math in(58,59,98,99);
+------+------+
| name | math |
+------+------+
| A    |   98 |
| C    |   98 |
+------+------+
2 rows in set (0.00 sec)

2.5 Filtrer les camarades de classe nommés Sun et les camarades de classe nommés Sun (recherche floue)

--对新表插入数据
INSERT INTO exam_result (name, chinese, math, english) VALUES
('唐三藏', 67, 98, 56),
('孙悟空', 87, 78, 77),
('猪悟能', 88, 98, 90),
('曹孟德', 82, 84, 67),
('刘玄德', 55, 85, 45),
('孙权', 70, 73, 78),
('宋公明', 75, 65, 30);
-- like '孙%'找到所有孙姓同学,%代表后面模糊匹配0-n个字符
mysql> select name from exam_result where name like '孙%';
+-----------+
| name      |
+-----------+
| 孙悟空    |
| 孙权      |
+-----------+
2 rows in set (0.00 sec)

--like '孙_'找到所有孙某同学,_代表模糊匹配1个字符
mysql> select name from exam_result where name like '孙_';
+--------+
| name   |
+--------+
| 孙权   |
+--------+
1 row in set (0.00 sec)

2.6 Étudiants dont les scores en chinois sont supérieurs à leurs scores en anglais

mysql> select name,chinese,english from exam_result where chinese>english;
+-----------+---------+---------+
| name      | chinese | english |
+-----------+---------+---------+
| 唐三藏    |      67 |      56 |
| 孙悟空    |      87 |      77 |
| 曹孟德    |      82 |      67 |
| 刘玄德    |      55 |      45 |
| 宋公明    |      75 |      30 |
+-----------+---------+---------+
5 rows in set (0.00 sec)

2.7 Étudiants dont le score total est inférieur à 200 points

mysql> select name,chinese,math,english,chinese+math+english 总分 from exam_result where chinese+math+english<200;
+-----------+---------+------+---------+--------+
| name      | chinese | math | english | 总分   |
+-----------+---------+------+---------+--------+
| 刘玄德    |      55 |   85 |      45 |    185 |
| 宋公明    |      75 |   65 |      30 |    170 |
+-----------+---------+------+---------+--------+
2 rows in set (0.00 sec)

La séquence d'exécution de ce SQL est illustrée dans la figure ci-dessus. Il n’est donc pas possible d’utiliser directement le score total après où exprimer chinois+mathématiques+anglais. (Allez dans la table exam_result pour trouver les étudiants dont le chinois+mathématiques+anglais est inférieur à 200 et imprimez-le)

2.8 Étudiants dont les scores en chinois sont >80 et dont le nom de famille n'est pas Sun

mysql> select name,chinese from exam_result where chinese>80 and name not like '孙%';
+-----------+---------+
| name      | chinese |
+-----------+---------+
| 猪悟能    |      88 |
| 曹孟德    |      82 |
+-----------+---------+
2 rows in set (0.00 sec)

2.9 Student Sun, sinon le score total doit être > 200 et le score en chinois < score en mathématiques et score en anglais > 80

mysql> select name,chinese,math,english,chinese+math+english 总分 from exam_result where name like '孙_' or (chinese+math+english>200 and chinese<math and english>80);
+-----------+---------+------+---------+--------+
| name      | chinese | math | english | 总分   |
+-----------+---------+------+---------+--------+
| 猪悟能    |      88 |   98 |      90 |    276 |
| 孙权      |      70 |   73 |      78 |    221 |
+-----------+---------+------+---------+--------+
2 rows in set (0.00 sec)

2.10 Requête NULL

--创建一个新表
mysql> create table test(
    -> id int,
    ->  name varchar(20)
    -> );
Query OK, 0 rows affected (0.09 sec)

--插入数据
mysql> insert into test (id,name) values (1,'张三');
Query OK, 1 row affected (0.04 sec)
mysql> insert into test (id,name) values (null,'张三');
Query OK, 1 row affected (0.05 sec)
mysql> insert into test (id,name) values (1,null);
Query OK, 1 row affected (0.05 sec)
mysql> insert into test (id,name) values (null,null);
Query OK, 1 row affected (0.02 sec)
mysql> insert into test (id,name) values (1,'');
Query OK, 1 row affected (0.01 sec)
--打印表结构
mysql> select* from test;
+------+--------+
| id   | name   |
+------+--------+
|    1 | 张三   |
| NULL | 张三   |
|    1 | NULL   |
| NULL | NULL   |
|    1 |        |
+------+--------+
5 rows in set (0.02 sec)

requête nulle :

mysql> select* from test where name is null;
+------+------+
| id   | name |
+------+------+
|    1 | NULL |
| NULL | NULL |
+------+------+
2 rows in set (0.01 sec)

mysql> select* from test where name is not null;
+------+--------+
| id   | name   |
+------+--------+
|    1 | 张三   |
| NULL | 张三   |
|    1 |        |
+------+--------+
3 rows in set (0.01 sec)

Remarque : null est null et une chaîne vide est une chaîne vide, ce qui est différent.

mysql> SELECT NULL = NULL, NULL = 1, NULL = 0;
+-------------+----------+----------+
| NULL = NULL | NULL = 1 | NULL = 0 |
+-------------+----------+----------+
|        NULL |     NULL |     NULL |
+-------------+----------+----------+
1 row in set (0.00 sec)

mysql> SELECT NULL <=> NULL, NULL <=> 1, NULL <=> 0;
+---------------+------------+------------+
| NULL <=> NULL | NULL <=> 1 | NULL <=> 0 |
+---------------+------------+------------+
|             1 |          0 |          0 |
+---------------+------------+------------+
1 row in set (0.01 sec)

La comparaison entre les valeurs nulles ne peut pas utiliser =, vous devez utiliser <=> ou est nulle ou n'est pas nulle

3. ordre asc/desc (ordre croissant/décroissant des résultats)

3.1 Les étudiants et les résultats en mathématiques sont affichés par ordre croissant/décroissant en fonction des résultats en mathématiques.

mysql> select name,math from exam_result order by math asc;
+-----------+------+
| name      | math |
+-----------+------+
| 张三      | NULL |
| 宋公明    |   65 |
| 孙权      |   73 |
| 孙悟空    |   78 |
| 曹孟德    |   84 |
| 刘玄德    |   85 |
| 唐三藏    |   98 |
| 猪悟能    |   98 |
+-----------+------+
8 rows in set (0.00 sec)

mysql> select name,math from exam_result order by math desc;
+-----------+------+
| name      | math |
+-----------+------+
| 唐三藏    |   98 |
| 猪悟能    |   98 |
| 刘玄德    |   85 |
| 曹孟德    |   84 |
| 孙悟空    |   78 |
| 孙权      |   73 |
| 宋公明    |   65 |
| 张三      | NULL |
+-----------+------+
8 rows in set (0.00 sec)

-- ASC est par ordre croissant (du petit au grand)

-- DESC est par ordre décroissant (du grand au petit)

-- La valeur par défaut est ASC

-- NULL est traité comme inférieur à n'importe quelle valeur

3.2 Interrogez les scores des élèves dans chaque matière et affichez-les par ordre décroissant de mathématiques, par ordre décroissant d'anglais et par ordre croissant de chinois.

mysql> select name,math,english,chinese from exam_result order by math desc,english desc,chinese asc;
+-----------+------+---------+---------+
| name      | math | english | chinese |
+-----------+------+---------+---------+
| 猪悟能    |   98 |      90 |      88 |
| 唐三藏    |   98 |      56 |      67 |
| 刘玄德    |   85 |      45 |      55 |
| 曹孟德    |   84 |      67 |      82 |
| 孙悟空    |   78 |      77 |      87 |
| 孙权      |   73 |      78 |      70 |
| 宋公明    |   65 |      30 |      75 |
| 张三      | NULL |    NULL |    NULL |
+-----------+------+---------+---------+
8 rows in set (0.00 sec)

3.3 Interroger les camarades de classe et les scores totaux, de haut en bas

mysql> select name,chinese,math,english,chinese+math+english 总分 from exam_result order by 总分 desc;
+-----------+---------+------+---------+--------+
| name      | chinese | math | english | 总分   |
+-----------+---------+------+---------+--------+
| 猪悟能    |      88 |   98 |      90 |    276 |
| 孙悟空    |      87 |   78 |      77 |    242 |
| 曹孟德    |      82 |   84 |      67 |    233 |
| 唐三藏    |      67 |   98 |      56 |    221 |
| 孙权      |      70 |   73 |      78 |    221 |
| 刘玄德    |      55 |   85 |      45 |    185 |
| 宋公明    |      75 |   65 |      30 |    170 |
| 张三      |    NULL | NULL |    NULL |   NULL |
+-----------+---------+------+---------+--------+
8 rows in set (0.00 sec)

mysql> 

L'instruction Where ci-dessus ne peut pas utiliser d'alias. Mais les alias peuvent être utilisés ici en raison du problème d'ordre.

Première priorité : indiquez clairement le tableau exam_result que vous recherchez

Deuxième priorité : clause Where

Troisième priorité : score total chinois + mathématiques + anglais

Quatrième priorité : trier par description du score total (veuillez disposer des données appropriées avant de trier)

Cinquième priorité : limite (les données ne seront affichées que lorsqu'elles seront prêtes)

3.4 Interrogez les résultats en mathématiques des élèves nommés Sun ou des élèves nommés Cao. Les résultats seront affichés par ordre décroissant des résultats en mathématiques.

mysql> select name,math from exam_result where name like '孙%' or name like '曹%' order by math desc limit 3 offset 0;
+-----------+------+
| name      | math |
+-----------+------+
| 曹孟德    |   84 |
| 孙悟空    |   78 |
| 孙权      |   73 |
+-----------+------+
3 rows in set (0.00 sec)

4. limite (écran d'un petit nombre de résultats)

--从表开始连续读取5行
mysql> select* from exam_result limit 5;
+----+-----------+---------+------+---------+
| id | name      | chinese | math | english |
+----+-----------+---------+------+---------+
|  1 | 唐三藏    |      67 |   98 |      56 |
|  2 | 孙悟空    |      87 |   78 |      77 |
|  3 | 猪悟能    |      88 |   98 |      90 |
|  4 | 曹孟德    |      82 |   84 |      67 |
|  5 | 刘玄德    |      55 |   85 |      45 |
+----+-----------+---------+------+---------+
5 rows in set (0.01 sec)

--limit 1,3;开始位置1是下标,3是步长
mysql> select* from exam_result limit 1,3;
+----+-----------+---------+------+---------+
| id | name      | chinese | math | english |
+----+-----------+---------+------+---------+
|  2 | 孙悟空    |      87 |   78 |      77 |
|  3 | 猪悟能    |      88 |   98 |      90 |
|  4 | 曹孟德    |      82 |   84 |      67 |
+----+-----------+---------+------+---------+
3 rows in set (0.01 sec)

--limit s offset n其中s代表步长,n代表下标
mysql> select* from exam_result limit 3 offset 5;
+----+-----------+---------+------+---------+
| id | name      | chinese | math | english |
+----+-----------+---------+------+---------+
|  6 | 孙权      |      70 |   73 |      78 |
|  7 | 宋公明    |      75 |   65 |      30 |
|  8 | 张三      |    NULL | NULL |    NULL |
+----+-----------+---------+------+---------+
3 rows in set (0.00 sec)

Lors de l'interrogation d'une table inconnue, il est préférable d'ajouter une LIMITE 1 pour éviter que la base de données ne soit bloquée en raison de l'interrogation de l'intégralité des données de la table, car les données de la table sont trop volumineuses.

sélectionnez* dans la limite exam_result 0,3 ;

sélectionnez* dans la limite exam_result 3,3 ;

sélectionnez* dans la limite exam_result 6,3 ;

......

sélectionnez* dans exam_result limite 3 décalage 0 ;

sélectionnez* dans exam_result limite 3 décalage 3 ;

sélectionnez* dans exam_result limite 3 décalage 6 ;

Effectuer un affichage paginé.

3. Mise à jour

grammaire:

UPDATE table_name SET column = expr [, column = expr ...]
[WHERE ...] [ORDER BY ...] [LIMIT ...]

1. Changer le score mathématique de Sun Wukong à 80 points

mysql> update exam_result set math=80 where name ='孙悟空';
Query OK, 1 row affected (0.07 sec)

2. Changez le score en mathématiques de Cao Mengde à 60 points et son score en chinois à 70 points

mysql> update exam_result set math=60,chinese=70 where name ='曹孟德';
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0

3. Ajoutez 30 points aux résultats en mathématiques des trois élèves ayant obtenu les scores totaux les plus bas.

mysql> update exam_result set math=math+30 order by chinese+math+english asc limit 3;
Query OK, 2 rows affected (0.05 sec)
Rows matched: 3  Changed: 2  Warnings: 0

4. Mettez à jour les scores chinois de tous les élèves au double de la valeur d'origine

mysql> update exam_result set chinese=chinese*2;
Query OK, 7 rows affected (0.04 sec)
Rows matched: 8  Changed: 7  Warnings: 0

mysql> select * from exam_result;
+----+-----------+---------+------+---------+
| id | name      | chinese | math | english |
+----+-----------+---------+------+---------+
|  1 | 唐三藏    |     134 |   98 |      56 |
|  2 | 孙悟空    |     174 |   80 |      77 |
|  3 | 猪悟能    |     176 |   98 |      90 |
|  4 | 曹孟德    |     140 |   60 |      67 |
|  5 | 刘玄德    |     110 |  115 |      45 |
|  6 | 孙权      |     140 |   73 |      78 |
|  7 | 宋公明    |     150 |   95 |      30 |
|  8 | 张三      |    NULL | NULL |    NULL |
+----+-----------+---------+------+---------+
8 rows in set (0.00 sec)

Soyez prudent lorsque vous mettez à jour directement la table entière sans clause Where ! Une mauvaise mise à jour est aussi nuisible qu’une suppression.

4. Supprimer

grammaire:

DELETE FROM table_name [WHERE ...] [ORDER BY ...] [LIMIT ...]

1. Supprimer les résultats des tests de Sun Wukong

mysql> delete from exam_result where name='孙悟空';
Query OK, 1 row affected (0.04 sec)

mysql> select * from exam_result;
+----+-----------+---------+------+---------+
| id | name      | chinese | math | english |
+----+-----------+---------+------+---------+
|  1 | 唐三藏    |     134 |   98 |      56 |
|  3 | 猪悟能    |     176 |   98 |      90 |
|  4 | 曹孟德    |     140 |   60 |      67 |
|  5 | 刘玄德    |     110 |  115 |      45 |
|  6 | 孙权      |     140 |   73 |      78 |
|  7 | 宋公明    |     150 |   95 |      30 |
|  8 | 张三      |    NULL | NULL |    NULL |
+----+-----------+---------+------+---------+
7 rows in set (0.00 sec)

2. Supprimez les données des étudiants ayant le score total le plus élevé

mysql> delete from exam_result order by chinese+math+english desc limit 1;
Query OK, 1 row affected (0.02 sec)

3. Supprimez toutes les données du tableau

3.1 supprimer de

--准备测试表
mysql> CREATE TABLE for_delete (
    -> id INT PRIMARY KEY AUTO_INCREMENT,
    -> name VARCHAR(20)
    -> );
Query OK, 0 rows affected (0.15 sec)
--插入测试数据
mysql> INSERT INTO for_delete (name) VALUES ('A'), ('B'), ('C');
Query OK, 3 rows affected (0.04 sec)
Records: 3  Duplicates: 0  Warnings: 0
--查看表结构
mysql> select* from for_delete;
+----+------+
| id | name |
+----+------+
|  1 | A    |
|  2 | B    |
|  3 | C    |
+----+------+
3 rows in set (0.00 sec)
--查看创建表时的SQL,可以发现,下一次自增的id值是4
mysql> show create table for_delete\G;
*************************** 1. row ***************************
       Table: for_delete
Create Table: CREATE TABLE `for_delete` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=gbk
1 row in set (0.00 sec)
--删除表
mysql> delete from for_delete;
Query OK, 3 rows affected (0.04 sec)
--查看创建表的SQL,发现自增值仍为4
mysql> show create table for_delete\G;
*************************** 1. row ***************************
       Table: for_delete
Create Table: CREATE TABLE `for_delete` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=gbk
1 row in set (0.02 sec)

L’utilisation de la désélection de pour effacer le contenu du tableau ne modifiera pas la valeur d’auto-incrémentation.

3.2 Tronquer le tableau (à utiliser avec prudence)

grammaire:

TRUNCATE [TABLE] table_name
--准备测试表
mysql> CREATE TABLE for_truncate (
    -> id INT PRIMARY KEY AUTO_INCREMENT,
    -> name VARCHAR(20)
    -> );
Query OK, 0 rows affected (0.14 sec)
--插入测试数据
mysql> INSERT INTO for_truncate (name) VALUES ('A'), ('B'), ('C');
Query OK, 3 rows affected (0.04 sec)
Records: 3  Duplicates: 0  Warnings: 0
--查看表结构
mysql> select* from for_truncate;
+----+------+
| id | name |
+----+------+
|  1 | A    |
|  2 | B    |
|  3 | C    |
+----+------+
3 rows in set (0.01 sec)
--查看创建表时的SQL,可以发现,下一次自增的id值是4
5mysql> show create table for_truncate\G;
*************************** 1. row ***************************
       Table: for_truncate
Create Table: CREATE TABLE `for_truncate` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=gbk
1 row in set (0.01 sec)
--删除表中数据
mysql> truncate for_truncate;
Query OK, 0 rows affected (0.21 sec)
--查看创建表时的SQL,发现AUTO_INCREMENT字段没了
mysql> show create table for_truncate\G;
*************************** 1. row ***************************
       Table: for_truncate
Create Table: CREATE TABLE `for_truncate` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk
1 row in set (0.01 sec)
--新插入一条数据
mysql>  insert into for_truncate (name) values ('E');
Query OK, 1 row affected (0.04 sec)
--查看表结构,发现id从1开始
mysql> select* from for_truncate;
+----+------+
| id | name |
+----+------+
|  1 | E    |
+----+------+
1 row in set (0.00 sec)
--查看创建表的SQL,出现自增字段,下一次自增值是2
mysql> show create table for_truncate\G;
*************************** 1. row ***************************
       Table: for_truncate
Create Table: CREATE TABLE `for_truncate` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=gbk
1 row in set (0.00 sec)

Utilisez l'opération de troncature avec prudence

1. Il ne peut fonctionner que sur la table entière et ne peut pas fonctionner sur des données partielles comme DELETE ;

2. MySQL n'enregistre pas les enregistrements des opérations de troncature dans le journal (DELETE le fait), il est donc plus rapide que DELETE. Cependant, lorsque TRUNCATE supprime des données, elles ne passent pas par la transaction réelle et ne peuvent donc pas être annulées.

3. Lorsque truncate efface la table, il initialise la valeur d'auto-incrémentation.

5. Insérez les données filtrées dans la base de données (insertion+sélection)

INSERT INTO table_name [(column [, column ...])] SELECT ...

1. Supprimez les enregistrements en double dans le tableau. Il ne peut y avoir qu'une seule copie des données en double.

Créez une copie des données brutes :

--创建表结构
mysql> CREATE TABLE duplicate_table (id int, name varchar(20));
Query OK, 0 rows affected (0.26 sec)
--插入测试数据
mysql> INSERT INTO duplicate_table VALUES
    -> (100, 'aaa'),
    -> (100, 'aaa'),
    -> (200, 'bbb'),
    -> (200, 'bbb'),
    -> (200, 'bbb'),
    -> (300, 'ccc');
Query OK, 6 rows affected (0.03 sec)
Records: 6  Duplicates: 0  Warnings: 0

Idées de déduplication : 1. Créez une table vide avec les mêmes attributs que la table d'origine.

--创建一张属性和duplicate_table一样的表no_duplicate_table(空表)
mysql> create table no_duplicate_table like duplicate_table;
Query OK, 0 rows affected (0.23 sec)
--它是空表
mysql> select* from no_duplicate_table;
Empty set (0.01 sec)
--但是属性和duplicate_table一样
mysql> desc no_duplicate_table;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(11)     | YES  |     | NULL    |       |
| name  | varchar(20) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.02 sec)

2. Utilisez distinct pour filtrer les données dédupliquées dans la table d'origine.

--对原表select出来的结果insert进新表中
mysql> insert into no_duplicate_table select distinct * from duplicate_table;
Query OK, 3 rows affected (0.05 sec)
Records: 3  Duplicates: 0  Warnings: 0
--查看新表数据
mysql> select* from no_duplicate_table;
+------+------+
| id   | name |
+------+------+
|  100 | aaa  |
|  200 | bbb  |
|  300 | ccc  |
+------+------+
3 rows in set (0.01 sec)

3. Remplacez le nom de la table d'origine par autre chose et remplacez les données de la nouvelle table par le nom de la table d'origine (le chat raton laveur est remplacé par le prince).

--改名
mysql> rename table duplicate_table to old_duplicate_table,no_duplicate_table to duplicate_table;
Query OK, 0 rows affected (0.17 sec)
--查看表
mysql> select* from duplicate_table;
+------+------+
| id   | name |
+------+------+
|  100 | aaa  |
|  200 | bbb  |
|  300 | ccc  |
+------+------+
3 rows in set (0.02 sec)

Nous avons préparé la nouvelle table avant de la renommer. En renommant la table, nous pouvons réaliser une opération de déduplication atomique.

Le changement de nom ici est simplement un changement de nom, qui est en fait un changement dans la relation de mappage entre le nom de fichier et l'inode.

6. Fonction d'agrégation

fonction

illustrer

COMPTE([DISTINCT] expr)

Renvoie le nombre de données interrogées

SOMME([DISTINCT] expr)

Renvoie la somme des données interrogées. Cela n'a aucun sens s'il ne s'agit pas d'un nombre.

MOYENNE([DISTINCT] expr)

Renvoie la valeur moyenne des données interrogées. Cela n'a aucun sens s'il ne s'agit pas d'un nombre.

MAX([DISTINCT] expr)

Renvoie la valeur maximale des données interrogées.Cela n'a aucun sens s'il ne s'agit pas d'un nombre.

MIN([DISTINCT] expr)

Renvoie la valeur minimale des données interrogées.Cela n'a aucun sens s'il ne s'agit pas d'un nombre.

1. COUNT([DISTINCT] expr) renvoie le nombre de données interrogées

mysql> select* from old_duplicate_table;;
+------+------+
| id   | name |
+------+------+
|  100 | aaa  |
|  100 | aaa  |
|  200 | bbb  |
|  200 | bbb  |
|  200 | bbb  |
|  300 | ccc  |
+------+------+
6 rows in set (0.01 sec)
--统计去重的名字有几个
mysql> select count(distinct name) 总数 from old_duplicate_table;
+--------+
| 总数   |
+--------+
|      3 |
+--------+
1 row in set (0.00 sec)
--统计共有几行
mysql> select count(*) from old_duplicate_table;
+----------+
| count(*) |
+----------+
|        6 |
+----------+
1 row in set (0.00 sec)
--统计共有几行
mysql> select count(2) from old_duplicate_table;
+----------+
| count(2) |
+----------+
|        6 |
+----------+
1 row in set (0.00 sec)
--统计id小于200的行数
mysql> select count(*) from old_duplicate_table where id<200;
+----------+
| count(*) |
+----------+
|        2 |
+----------+
1 row in set (0.01 sec)

2. SUM([DISTINCT] expr) renvoie la somme des données interrogées. Cela n'a aucun sens s'il ne s'agit pas d'un nombre.

--统计id和
mysql> select sum(id) from old_duplicate_table;
+---------+
| sum(id) |
+---------+
|    1100 |
+---------+
1 row in set (0.00 sec)
--统计id的平均值
mysql> select sum(id)/count(*) from old_duplicate_table;
+------------------+
| sum(id)/count(*) |
+------------------+
|         183.3333 |
+------------------+
1 row in set (0.00 sec)

3. AVG([DISTINCT] expr) renvoie la valeur moyenne des données interrogées. Cela n'a aucun sens s'il ne s'agit pas d'un nombre.

--统计id的平均值
mysql> select avg(id) from old_duplicate_table;
+----------+
| avg(id)  |
+----------+
| 183.3333 |
+----------+
1 row in set (0.00 sec)

4. MAX([DISTINCT] expr) renvoie la valeur maximale des données interrogées. Cela n'a aucun sens s'il ne s'agit pas d'un nombre.

4、MAX([DISTINCT] expr) 返回查询到的数据的 最大值,不是数字没有意义

5. MIN([DISTINCT] expr) renvoie la valeur minimale des données interrogées. Cela n'a aucun sens s'il ne s'agit pas d'un nombre.

--查找最小的id
mysql> select min(id) from old_duplicate_table;
+---------+
| min(id) |
+---------+
|     100 |
+---------+
1 row in set (0.01 sec)
--查找id大于150的最小值
mysql> select min(id) from old_duplicate_table where id>150;
+---------+
| min(id) |
+---------+
|     200 |
+---------+
1 row in set (0.00 sec)

7. Clause Group by : requête de groupe sur la colonne spécifiée

Le but du regroupement est d’agréger des statistiques.

select column1, column2, .. from table group by column;

1. Importer le tableau d'informations sur les employés

--将linux目录下的sql表导入MySQL
mysql> source /home/jly/scott_data.sql;

mysql> use scott;
Database changed

mysql> show tables;
+-----------------+
| Tables_in_scott |
+-----------------+
| dept            |
| emp             |
| salgrade        |
+-----------------+

Créer une table d'informations sur les employés (table de test classique d'Oracle 9i)

Liste des employés du PEM

Tableau du département DEPT

Grille salariale SALGRADE

DROP database IF EXISTS `scott`;
CREATE database IF NOT EXISTS `scott` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

USE `scott`;

DROP TABLE IF EXISTS `dept`;
CREATE TABLE `dept` (
  `deptno` int(2) unsigned zerofill NOT NULL COMMENT '部门编号',
  `dname` varchar(14) DEFAULT NULL COMMENT '部门名称',
  `loc` varchar(13) DEFAULT NULL COMMENT '部门所在地点'
);


DROP TABLE IF EXISTS `emp`;
CREATE TABLE `emp` (
  `empno` int(6) unsigned zerofill NOT NULL COMMENT '雇员编号',
  `ename` varchar(10) DEFAULT NULL COMMENT '雇员姓名',
  `job` varchar(9) DEFAULT NULL COMMENT '雇员职位',
  `mgr` int(4) unsigned zerofill DEFAULT NULL COMMENT '雇员领导编号',
  `hiredate` datetime DEFAULT NULL COMMENT '雇佣时间',
  `sal` decimal(7,2) DEFAULT NULL COMMENT '工资月薪',
  `comm` decimal(7,2) DEFAULT NULL COMMENT '奖金',
  `deptno` int(2) unsigned zerofill DEFAULT NULL COMMENT '部门编号'
);


DROP TABLE IF EXISTS `salgrade`;
CREATE TABLE `salgrade` (
  `grade` int(11) DEFAULT NULL COMMENT '等级',
  `losal` int(11) DEFAULT NULL COMMENT '此等级最低工资',
  `hisal` int(11) DEFAULT NULL COMMENT '此等级最高工资'
);


insert into dept (deptno, dname, loc)
values (10, 'ACCOUNTING', 'NEW YORK');
insert into dept (deptno, dname, loc)
values (20, 'RESEARCH', 'DALLAS');
insert into dept (deptno, dname, loc)
values (30, 'SALES', 'CHICAGO');
insert into dept (deptno, dname, loc)
values (40, 'OPERATIONS', 'BOSTON');

insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7369, 'SMITH', 'CLERK', 7902, '1980-12-17', 800, null, 20);

insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7499, 'ALLEN', 'SALESMAN', 7698, '1981-02-20', 1600, 300, 30);

insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7521, 'WARD', 'SALESMAN', 7698, '1981-02-22', 1250, 500, 30);

insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7566, 'JONES', 'MANAGER', 7839, '1981-04-02', 2975, null, 20);

insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7654, 'MARTIN', 'SALESMAN', 7698, '1981-09-28', 1250, 1400, 30);

insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7698, 'BLAKE', 'MANAGER', 7839, '1981-05-01', 2850, null, 30);

insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7782, 'CLARK', 'MANAGER', 7839, '1981-06-09', 2450, null, 10);

insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7788, 'SCOTT', 'ANALYST', 7566, '1987-04-19', 3000, null, 20);

insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7839, 'KING', 'PRESIDENT', null, '1981-11-17', 5000, null, 10);

insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7844, 'TURNER', 'SALESMAN', 7698,'1981-09-08', 1500, 0, 30);

insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7876, 'ADAMS', 'CLERK', 7788, '1987-05-23', 1100, null, 20);

insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7900, 'JAMES', 'CLERK', 7698, '1981-12-03', 950, null, 30);

insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7902, 'FORD', 'ANALYST', 7566, '1981-12-03', 3000, null, 20);

insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
values (7934, 'MILLER', 'CLERK', 7782, '1982-01-23', 1300, null, 10);

insert into salgrade (grade, losal, hisal) values (1, 700, 1200);
insert into salgrade (grade, losal, hisal) values (2, 1201, 1400);
insert into salgrade (grade, losal, hisal) values (3, 1401, 2000);
insert into salgrade (grade, losal, hisal) values (4, 2001, 3000);
insert into salgrade (grade, losal, hisal) values (5, 3001, 9999);

2. Afficher le salaire moyen et le salaire maximum de chaque département

mysql> select* from emp;
+--------+--------+-----------+------+---------------------+---------+---------+--------+
| empno  | ename  | job       | mgr  | hiredate            | sal     | comm    | deptno |
+--------+--------+-----------+------+---------------------+---------+---------+--------+
| 007369 | SMITH  | CLERK     | 7902 | 1980-12-17 00:00:00 |  800.00 |    NULL |     20 |
| 007499 | ALLEN  | SALESMAN  | 7698 | 1981-02-20 00:00:00 | 1600.00 |  300.00 |     30 |
| 007521 | WARD   | SALESMAN  | 7698 | 1981-02-22 00:00:00 | 1250.00 |  500.00 |     30 |
| 007566 | JONES  | MANAGER   | 7839 | 1981-04-02 00:00:00 | 2975.00 |    NULL |     20 |
| 007654 | MARTIN | SALESMAN  | 7698 | 1981-09-28 00:00:00 | 1250.00 | 1400.00 |     30 |
| 007698 | BLAKE  | MANAGER   | 7839 | 1981-05-01 00:00:00 | 2850.00 |    NULL |     30 |
| 007782 | CLARK  | MANAGER   | 7839 | 1981-06-09 00:00:00 | 2450.00 |    NULL |     10 |
| 007788 | SCOTT  | ANALYST   | 7566 | 1987-04-19 00:00:00 | 3000.00 |    NULL |     20 |
| 007839 | KING   | PRESIDENT | NULL | 1981-11-17 00:00:00 | 5000.00 |    NULL |     10 |
| 007844 | TURNER | SALESMAN  | 7698 | 1981-09-08 00:00:00 | 1500.00 |    0.00 |     30 |
| 007876 | ADAMS  | CLERK     | 7788 | 1987-05-23 00:00:00 | 1100.00 |    NULL |     20 |
| 007900 | JAMES  | CLERK     | 7698 | 1981-12-03 00:00:00 |  950.00 |    NULL |     30 |
| 007902 | FORD   | ANALYST   | 7566 | 1981-12-03 00:00:00 | 3000.00 |    NULL |     20 |
| 007934 | MILLER | CLERK     | 7782 | 1982-01-23 00:00:00 | 1300.00 |    NULL |     10 |
+--------+--------+-----------+------+---------------------+---------+---------+--------+
14 rows in set (0.00 sec)
--按部门对各部门的平均工资和最高工资进行统计
mysql> select deptno,avg(sal),max(sal) from emp group by deptno;
+--------+-------------+----------+
| deptno | avg(sal)    | max(sal) |
+--------+-------------+----------+
|     10 | 2916.666667 |  5000.00 |
|     20 | 2175.000000 |  3000.00 |
|     30 | 1566.666667 |  2850.00 |
+--------+-------------+----------+
3 rows in set (0.01 sec)

3. Afficher le salaire moyen et le salaire minimum pour chaque département et chaque poste

Requête de groupe avec plusieurs conditions de regroupement :

mysql> select deptno,job,avg(sal),max(sal) from emp group by deptno,job;
+--------+-----------+-------------+----------+
| deptno | job       | avg(sal)    | max(sal) |
+--------+-----------+-------------+----------+
|     10 | CLERK     | 1300.000000 |  1300.00 |
|     10 | MANAGER   | 2450.000000 |  2450.00 |
|     10 | PRESIDENT | 5000.000000 |  5000.00 |
|     20 | ANALYST   | 3000.000000 |  3000.00 |
|     20 | CLERK     |  950.000000 |  1100.00 |
|     20 | MANAGER   | 2975.000000 |  2975.00 |
|     30 | CLERK     |  950.000000 |   950.00 |
|     30 | MANAGER   | 2850.000000 |  2850.00 |
|     30 | SALESMAN  | 1400.000000 |  1600.00 |
+--------+-----------+-------------+----------+
9 rows in set (0.00 sec)

Si vous ajoutez un champ de filtre d'éname après le filtre de sélection, une erreur sera signalée :

4. Afficher les départements avec un salaire moyen inférieur à 2 000 et son salaire moyen

1. Tout d'abord, comptez le salaire moyen de chaque département (premier groupe et agrégez le salaire moyen par département)

2. Utilisez ensuite le fait de devoir juger conditionnellement les résultats de l'agrégation.

mysql> select deptno,avg(sal) as 平均工资 from emp group by deptno having 平均工资<2000;
+--------+--------------+
| deptno | 平均工资     |
+--------+--------------+
|     30 |  1566.666667 |
+--------+--------------+

5. « Smith » ne participe pas aux statistiques, qui montrent les types de travail avec un salaire moyen inférieur à 2 000 pour chaque département et chaque poste.

mysql> select deptno,job,avg(sal) 平均工资 from emp where ename!='SMITH' group by deptno,job having 平均工资<2000;
+--------+----------+--------------+
| deptno | job      | 平均工资     |
+--------+----------+--------------+
|     10 | CLERK    |  1300.000000 |
|     20 | CLERK    |  1100.000000 |
|     30 | CLERK    |   950.000000 |
|     30 | SALESMAN |  1400.000000 |
+--------+----------+--------------+
4 rows in set (0.01 sec)

5.1La différence entre avoir et où

1. Avoir et où peuvent être utilisés pour le filtrage conditionnel. L'agrégation de groupes ne peut utiliser que avoir et non où. Cependant, pour le filtrage avec une seule table, avoir et où peuvent être utilisés. Cependant, il n'est pas recommandé d'utiliser avoir dans ce scénario (afin de distinguer, il n'est pas recommandé d'utiliser avoir). Il est recommandé de les mélanger, et de laisser où faire le travail de où)

2. Les objets du contrôle sont différents, comme indiqué ci-dessous :

3. L'ordre de filtrage des conditions est différent, comme indiqué ci-dessous :

Je suppose que tu aimes

Origine blog.csdn.net/gfdxx/article/details/131297229
conseillé
Classement