Abfrage ist die häufigste Operation in MySQL und bildet auch die Grundlage für die Erstellung von DELETE- und UPDATE-Abfragen. Die Verarbeitung von Abfragen kann in logische Abfragen und physische Abfragen unterteilt werden. Heute stellen wir Ihnen die logische Abfrage im Detail vor. Ich hoffe, sie wird Ihnen hilfreich sein!
In MySQL ist die Abfrage die Grundlage für die Erstellung von DELETE und UPDATE, da Sie diese Datensätze zuerst finden müssen, wenn Sie sie löschen oder aktualisieren möchten. Daher ist SELECT für die Abfrageverarbeitung besonders wichtig in Es handelt sich um logische Abfragen und physische Abfragen. Die logische Abfrage gibt an, welche Ergebnisse beim Ausführen der SELECT-Anweisung erzeugt werden sollen, und die physische Abfrage gibt an, wie MySQL dieses Ergebnis erhält. [Verwandte Empfehlungen: MySQL-Video-Tutorial]
In diesem Kapitel geht es um logische Abfragen.
In einer SQL-Anweisung wird die FROM-Anweisung zuerst verarbeitet und die LIMIT-Anweisung zuletzt ausgeführt. Wenn alle Anweisungen wie GROUP BY und ORDER BY verwendet werden, kann sie grob in jeweils 10 Schritte unterteilt werden, wie unten gezeigt Der Vorgang generiert eine virtuelle Tabelle.
(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
Lassen Sie es uns anhand eines praktischen Beispiels analysieren. Erstellen Sie zunächst zwei Tabellen, Benutzer und Bestellungen.
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)
Daten einfügen.
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);
Okay, jetzt fragen wir die Benutzer aus der Inneren Mongolei ab, deren Bestellmenge weniger als 3 beträgt. Die SQL lautet wie folgt.
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)
Es gibt Daten und SQL. Lassen Sie uns den spezifischen Prozess analysieren.
1. Kartesisches Produkt
Das erste, was Sie tun müssen, ist, ein kartesisches Produkt auf den beiden Tabellen vor und nach der FROM-Anweisung durchzuführen. Unter der Annahme, dass die Menge A={a, b} und die Menge B={0, 1, 2} ist, ist das kartesische Produkt der beiden Mengen {(a, 0), (a, 1), ( a , 2), (b, 0), (b, 1), (b, 2)}.
Entsprechend den oben genannten Daten wird schließlich eine virtuelle Tabelle VT1 generiert, die 35 Datenzeilen enthält. Die spezifischen Daten lauten wie folgt.
userId | userName | city | orderId | userId |
---|---|---|---|---|
1 | Zhang San | Inner. Mongolia | 10 00 1 | 1 |
1 | Zhang San | Innere MongoleiInnere Mongolei | 10005 | 1 |
1 | 1 | Zhang San | Innere Mongolei | 10007... Innere Mongolei |
1 | 5 | Golden Armor Warrior | Innere Mongolei | |
1 | 2. ON过滤器 下一步,通过ON后面的添加过滤掉不需要的数据,在上述SQL中,条件是 +--------+--------------+--------+---------+--------+ | 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 | +--------+--------------+--------+---------+--------+ Nach dem Login kopieren Nach dem Login kopieren 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 | +--------+--------------+--------+---------+--------+ Nach dem Login kopieren Nach dem Login kopieren 4. WHERE过滤器 这一步很简单,条件为 +--------+--------------+--------+---------+--------+ | userId | userName | city | orderId | userId | +--------+--------------+--------+---------+--------+ | 1 | 张三 | 内蒙 | 10005 | 1 | | 1 | 张三 | 内蒙 | 10004 | 1 | | 1 | 张三 | 内蒙 | 10002 | 1 | | 1 | 张三 | 内蒙 | 10001 | 1 | | 2 | 李四 | 内蒙 | 10007 | 2 | | 5 | 金甲战士 | 内蒙 | NULL | NULL | +--------+--------------+--------+---------+--------+ Nach dem Login kopieren 5. GROUP BY 分组 这步将上一个步骤进行分组,并生成新的虚拟表VT5,结果如下。 +--------+--------------+--------+ | userId | userName | city | +--------+--------------+--------+ | 1 | 张三 | 内蒙 | | 2 | 李四 | 内蒙 | | 5 | 金甲战士 | 内蒙 | +--------+--------------+--------+ Nach dem Login kopieren 6.HAVING筛选 分完组,我们就可以筛选了,选出 | userId | userName | city | count(orders.orderId) | +--------+--------------+--------+-----------------------+ | 2 | 李四 | 内蒙 | 1 | | 5 | 金甲战士 | 内蒙 | 0 | +--------+--------------+--------+-----------------------+ Nach dem Login kopieren 7.处理SELECT列表 虽然SELECT是查询中最先被指定的部分,但是直到这里才真正进行处理,在这一步,将SELECT中指定的列从上一步产生的虚拟表中选出。 8.应用DISTINCT 如果查询语句中存在DISTINCT子句,则会创建一张内存临时表,这张内存临时表的表结构和上一步产生的虚拟表一样,不同的是对进行DISTINCT操作的列增加了一个唯一索引,以此来去除重复数据。 另外对使用了GROUP BY语句的查询,再使用DISTINCT是多余的,因为已经进行了分组,不会移除任何行。 9.排序和LIMIT 最后就是排序,返回新的虚拟表。结果如下。 +--------------+-------+ | userName | total | +--------------+-------+ | 李四 | 1 | | 金甲战士 | 0 | +--------------+-------+ Nach dem Login kopieren 但是在本例子中没有使用到LIMIT,如果使用到了,那么则从选出指定位置开始的指定行数,
更多编程相关知识,请访问:编程视频!! Das obige ist der detaillierte Inhalt vonErfahren Sie mehr über logische Abfragen in MySQL. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!
Verwandte Etiketten:
Quelle:juejin.cn
Vorheriger Artikel:Ausführliche Erklärung der chronischen Krankheiten von MySql
Nächster Artikel:Eine ausführliche Erklärung von MySql-Tabellen, Datenbanken, Shards und Partitionen
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Aktuelle Ausgaben
Wie gruppiere und zähle ich in MySQL?
Ich versuche, eine Abfrage zu schreiben, die die Gesamtzahl der nicht gelöschten Nachricht...
Aus 2024-04-06 18:30:17
0
1
353
verwandte Themen
Mehr>
Beliebte Empfehlungen
Beliebte Tutorials
Mehr>
|