Maison > base de données > tutoriel mysql > le corps du texte

En savoir plus sur les requêtes logiques dans MySQL

青灯夜游
Libérer: 2021-09-17 19:35:52
avant
2188 Les gens l'ont consulté

La requête est l'opération la plus fréquente dans MySQL, et c'est également la base de la construction du traitement des requêtes DELETE et UPDATE qui peut être divisé en requêtes logiques et requêtes physiques. Aujourd'hui, nous allons vous présenter la requête logique en détail. J'espère qu'elle vous sera utile !

En savoir plus sur les requêtes logiques dans MySQL

Dans MySQL, la requête est la base de la construction de DELETE et UPDATE, car lorsque vous souhaitez les supprimer ou les mettre à jour, vous devez d'abord trouver ces enregistrements, donc SELECT est particulièrement important pour le traitement des requêtes, il peut être divisé. into Ce sont des requêtes logiques et des requêtes physiques. La requête logique indique quel type de résultats doit être produit lors de l'exécution de l'instruction SELECT, et la requête physique indique comment MySQL obtient ce résultat. [Recommandations associées : Tutoriel vidéo mysql]

Ce chapitre parlera des requêtes logiques.

Dans une instruction SQL, l'instruction FROM est traitée en premier et l'instruction LIMIT est exécutée en dernier Si toutes les instructions sont utilisées, telles que GROUP BY et ORDER BY, elle peut être grossièrement divisée en 10 étapes, comme indiqué ci-dessous, chacune. L’opération générera une table virtuelle.

(7) select (8)distinct<select_list>

(1) from <left table>
(3) <join_type> join <right_table>
(2)    on<条件>
(4) where <条件>
(5) group by<字段list>
(6) having<条件>
(9) order by<字段>
(10) limit
Copier après la connexion

Analysons-le à travers un exemple pratique, créons d'abord deux tables, utilisateurs et commandes.

mysql> create table user (userId int(11),userName varchar(255),city varchar(255), primary key (userId));
Query OK, 0 rows affected, 1 warning (0.05 sec)


mysql> create table orders(orderId int(11) ,userId int(11) ,primary key (orderId));
Query OK, 0 rows affected, 2 warnings (0.05 sec)
Copier après la connexion

Insérer des données.

insert user values(1,"张三","内蒙");
insert user values(2,"李四","内蒙");
insert user values(3,"王五","北京");
insert user values(4,"迪迦","西藏");
insert user values(5,"金甲战士","内蒙");

insert orders values(10001,1);
insert orders values(10002,1);
insert orders values(10003,4);
insert orders values(10004,1);
insert orders values(10005,1);
insert orders values(10006,4);
insert orders values(10007,2);
Copier après la connexion

D'accord, interrogeons maintenant les utilisateurs de Mongolie intérieure dont la quantité commandée est inférieure à 3. Le SQL est le suivant.

mysql> select userName,count(orders.orderId) as total from user 
left join orders on user.userId = orders.userId 
where city="内蒙" 
group by user.userId 
having count(orders.orderId)<3 
order by total desc;
+--------------+-------+
| userName     | total |
+--------------+-------+
| 李四         |     1 |
| 金甲战士     |     0 |
+--------------+-------+
2 rows in set (0.00 sec)
Copier après la connexion

Il y a des données et du SQL. Analysons le processus spécifique.

1. Produit cartésien

La première chose à faire est d'effectuer un produit cartésien sur les deux tables avant et après l'instruction FROM Alors, qu'est-ce qu'un produit cartésien ? Par exemple, en supposant que l'ensemble A={a, b} et l'ensemble B={0, 1, 2}, le produit cartésien des deux ensembles est {(a, 0), (a, 1), ( a , 2), (b, 0), (b, 1), (b, 2)}.

Ainsi, correspondant aux données ci-dessus, une table virtuelle VT1 sera finalement générée, qui contiendra 35 lignes de données. Les données spécifiques sont les suivantes.

Mongolie intérieure Mongolie intérieure 1000511 Zhang TroisMongolie intérieure1000611Zhang SanMongolie intérieure1000541Zhang San Mongolie intérieure 100072 ..................5Guerrier Armure Dorée Mongolie intérieure100011Guerrier à l'armure dorée1

2. ON过滤器

下一步,通过ON后面的添加过滤掉不需要的数据,在上述SQL中,条件是user.userId = orders.userId ,所以通过上面生成的虚拟表VT1,除去不相关的数据,生成新的虚拟表VT2,最终的结果如下。

+--------+--------------+--------+---------+--------+
| userId | userName     | city   | orderId | userId |
+--------+--------------+--------+---------+--------+
|      1 | 张三         | 内蒙   |   10005 |      1 |
|      1 | 张三         | 内蒙   |   10004 |      1 |
|      1 | 张三         | 内蒙   |   10002 |      1 |
|      1 | 张三         | 内蒙   |   10001 |      1 |
|      2 | 李四         | 内蒙   |   10007 |      2 |
|      3 | 王五         | 北京   |    NULL |   NULL |
|      4 | 迪迦         | 西藏   |   10006 |      4 |
|      4 | 迪迦         | 西藏   |   10003 |      4 |
|      5 | 金甲战士     | 内蒙   |    NULL |   NULL |
+--------+--------------+--------+---------+--------+
Copier après la connexion
Copier après la connexion

3.添加外部行

这一步只有在连接类型为OUTER JOIN才发生。

LEFT OUTER JOIN把左表记为保留表,RIGHT OUTER JOIN把右表作为保留表,FULL OUTER JOIN表示都作为保留表,添加外部行的工作就是在上一步的基础上添加保留表中被过滤条件过滤掉的数据,非保留表的数据被赋值NULL。

最终生成下面的结果,记为虚拟表VT3。

+--------+--------------+--------+---------+--------+
| userId | userName     | city   | orderId | userId |
+--------+--------------+--------+---------+--------+
|      1 | 张三         | 内蒙   |   10005 |      1 |
|      1 | 张三         | 内蒙   |   10004 |      1 |
|      1 | 张三         | 内蒙   |   10002 |      1 |
|      1 | 张三         | 内蒙   |   10001 |      1 |
|      2 | 李四         | 内蒙   |   10007 |      2 |
|      3 | 王五         | 北京   |    NULL |   NULL |
|      4 | 迪迦         | 西藏   |   10006 |      4 |
|      4 | 迪迦         | 西藏   |   10003 |      4 |
|      5 | 金甲战士     | 内蒙   |    NULL |   NULL |
+--------+--------------+--------+---------+--------+
Copier après la connexion
Copier après la connexion

4. WHERE过滤器

这一步很简单,条件为city="内蒙" ,即只保留下city为内蒙的列,并生成新的虚拟表VT4。最终结果如下。

+--------+--------------+--------+---------+--------+
| userId | userName     | city   | orderId | userId |
+--------+--------------+--------+---------+--------+
|      1 | 张三         | 内蒙   |   10005 |      1 |
|      1 | 张三         | 内蒙   |   10004 |      1 |
|      1 | 张三         | 内蒙   |   10002 |      1 |
|      1 | 张三         | 内蒙   |   10001 |      1 |
|      2 | 李四         | 内蒙   |   10007 |      2 |
|      5 | 金甲战士     | 内蒙   |    NULL |   NULL |
+--------+--------------+--------+---------+--------+
Copier après la connexion

5. GROUP BY 分组

这步将上一个步骤进行分组,并生成新的虚拟表VT5,结果如下。

+--------+--------------+--------+
| userId | userName     | city   |
+--------+--------------+--------+
|      1 | 张三         | 内蒙   |
|      2 | 李四         | 内蒙   |
|      5 | 金甲战士     | 内蒙   |
+--------+--------------+--------+
Copier après la connexion

6.HAVING筛选

分完组,我们就可以筛选了,选出count(orders.orderId)<3 的数据即可,最终结果如下。

| userId | userName     | city   | count(orders.orderId) |
+--------+--------------+--------+-----------------------+
|      2 | 李四         | 内蒙   |                     1 |
|      5 | 金甲战士     | 内蒙   |                     0 |
+--------+--------------+--------+-----------------------+
Copier après la connexion

7.处理SELECT列表

虽然SELECT是查询中最先被指定的部分,但是直到这里才真正进行处理,在这一步,将SELECT中指定的列从上一步产生的虚拟表中选出。

8.应用DISTINCT

如果查询语句中存在DISTINCT子句,则会创建一张内存临时表,这张内存临时表的表结构和上一步产生的虚拟表一样,不同的是对进行DISTINCT操作的列增加了一个唯一索引,以此来去除重复数据。

另外对使用了GROUP BY语句的查询,再使用DISTINCT是多余的,因为已经进行了分组,不会移除任何行。

9.排序和LIMIT

最后就是排序,返回新的虚拟表。结果如下。

+--------------+-------+
| userName     | total |
+--------------+-------+
| 李四         |     1 |
| 金甲战士     |     0 |
+--------------+-------+
Copier après la connexion

但是在本例子中没有使用到LIMIT,如果使用到了,那么则从选出指定位置开始的指定行数,

原文地址:https://juejin.cn/post/7000739902937628679

作者:i听风逝夜

更多编程相关知识,请访问:编程视频!!

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:juejin.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!
userIduserNamecityorderIduserId
1Zhang SanMongolie intérieure100 0 11
1Zhang San

5

Mongolie intérieure
10002