Der vorherige Inhalt hat das grundlegende Hinzufügen, Löschen, Ändern und Abfragen sowie die relevanten Einschränkungen der Tabelle eingeführt. Ab dieser Ausgabe wird der Inhalt komplizierter und komplizierter ist eine komplexe Abfrage-SQL.
2. Abfrageergebnisse werden weiterhin häufig verwendet. Können die abgefragten Daten auch gespeichert werden? Das heißt, fügen Sie die Abfrageergebnisse in eine andere Tabelle ein.
Fall: Erstellen Sie eine Schülertabelle mit Feldern wie ID, Name, Geschlecht, Java und Python. Jetzt müssen Sie Schüler, deren Java-Werte 90 überschreiten, in die Tabelle java_result kopieren.
Bevor wir den obigen Vorgang ausführen, müssen wir eine Schülertabelle erstellen und relevante Daten vorbereiten:
create table student (
id int primary key,
name varchar(20),
sex varchar(1),
java float(5, 2)
);
insert into student value
(1, '张三', '男', 92.1),
(2, '小红', '女', 88.2),
(3, '赵六', '男', 83.4),
(4, '王五', '男', 93.3),
(5, '小美', '女', 96.0);
Nach dem Login kopieren
Nachdem wir die Schülertabelle erstellt haben, müssen wir die Abfrageergebnisse der beiden Felder Name und Java in die Tabelle java_result kopieren, hier Wir Beachten Sie, dass die Anzahl und der Typ der Spalten in der temporären Tabelle, die Abfrageergebnisse erfordern, mit java_result übereinstimmen müssen. Daher erstellen wir als Nächstes die Tabelle java_result:
create table java_result (
name varchar(20),
java float(5, 2)
);
Nach dem Login kopieren
Nachdem wir die Tabelle java_result erstellt haben, müssen wir den Schüler abfragen. Es gibt zwei Felder mit dem Namen java in der Tabelle und Java > 90. Fügen Sie die Abfrageergebnisse, die die oben genannten Bedingungen erfüllen, in die Tabelle java_result ein! :
insert into java_result select name, java from student where java > 90;
-- Query OK, 3 rows affected (0.00 sec)
-- Records: 3 Duplicates: 0 Warnings: 0
Nach dem Login kopieren
select * from java_result;
+--------+-------+
| name | java |
+--------+-------+
| 张三 | 92.10 |
| 王五 | 93.30 |
| 小美 | 96.00 |
+--------+-------+
-- 3 rows in set (0.00 sec)
Nach dem Login kopieren
Auf diese Weise stellen wir fest, dass alle Daten, deren Name und Java-Felder in der Studententabelle > 90 erfüllen, erfolgreich eingefügt wurden!
3. Aggregationsabfrage
Die Abfragen mit Ausdrücken, auf die wir zuvor gestoßen sind, arbeiten alle zwischen Spalten, um zu sehen, welche Spalte diese Bedingung erfüllt.
Die Aggregationsabfrage, die wir jetzt einführen werden, besteht darin, Operationen zwischen Zeilen und Zeilen auszuführen!
3.1 Aggregationsfunktion
Um Aggregatabfragen durchzuführen, müssen Aggregatfunktionen verwendet werden. Die unten vorgestellten Funktionen sind alle eine Reihe von in SQL integrierten Funktionen. Werfen wir zunächst einen kurzen Blick auf sie. Erklärung der Funktion: COUNT([DISTINCT] expr)
abgefragte Daten Die Anzahl der
SUM([DISTINCT] expr)
gibt die Summe der abgefragten Daten zurück, was keine numerische Bedeutung ist.
AVG([DISTINCT] expr)
gibt den Durchschnitt der zurück abgefragte Daten, die nicht sind. Die Zahl ist bedeutungslos Gibt den Mindestwert der abgefragten Daten zurück. Zahlen sind nicht bedeutungslos
select sum(java) from student;
+-----------+
| sum(java) |
+-----------+
| 453.00 |
+-----------+
-- 1 row in set (0.01 sec)
Nach dem Login kopieren
虽然我们表中有 java 字段这列中有 null 值,前面了解到 null 与任何值运算都是 null,但是这里的 sum 函数会避免这种情况发生。
当然在后面也可也带上 where 条件,这里就不做过多演示了。
3.1.3 avg
● 求班级中 java 的平均分
select avg(java) from student;
+-----------+
| avg(java) |
+-----------+
| 90.600000 |
+-----------+
-- 1 row in set (0.00 sec)
Nach dem Login kopieren
当前只是针对某一列进行平均运算,如果有两门课程,求每个学生总分的平均分呢?
select avg(java + python) from student;
Nach dem Login kopieren
这里每次查询结果都只有一列,能否把两个聚合函数一起使用呢?
select sum(java), avg(java) as '平均分' from student;
+-----------+-----------+
| sum(java) | 平均分 |
+-----------+-----------+
| 453.00 | 90.600000 |
+-----------+-----------+
-- 1 row in set (0.00 sec)
Nach dem Login kopieren
这里我们能发现一个细节,使用聚合函数查询,字段也是可以取别名的。
3.1.4 max 和 min
● 求出 java 考试分数的最高分和最低分
select max(java) as '最高分', min(java) as '最低分' from student;
+-----------+-----------+
| 最高分 | 最低分 |
+-----------+-----------+
| 96.00 | 83.40 |
+-----------+-----------+
-- 1 row in set (0.00 sec)
Nach dem Login kopieren
上述就是聚合函数最基础的用法了, 但是在实际中也可能会有更复杂的情况,比如需要按照某某进行分组查询,这就需要搭配 GROUP BY 字句了。
4、GROUP BY 子句
select 中使用 group by 自居可以对指定列进行分组查询,但是需要满足指定分组的字段必须是 "分组依据字段",其他字段若想出现在 select 中,则必须包含在聚合函数中。
这里我们构造出一张薪水表 salary:
create table salary (
id int primary key,
name varchar(20),
role varchar(20),
income int
);
insert into salary value
(1, '麻花疼', '老板', 5000000),
(2, '篮球哥', '程序猿', 3000),
(3, '歪嘴猴', '经理', 20000),
(4, '多嘴鸟', '经理', 25000),
(5, '雷小君', '老板', 3000000),
(6, '阿紫姐', '程序猿', 5000);
Nach dem Login kopieren
像上述的情况,如果要查平均工资,那公平吗???
select avg(income) from salary;
+--------------+
| avg(income) |
+--------------+
| 1342166.6667 |
+--------------+
-- 1 row in set (0.00 sec)
Nach dem Login kopieren
那篮球哥的月薪连平均下来的零头都不到,所以这样去求平均工资是毫无意义的,真正有意义的是啥呢?求老板这个职位的平均工资,以及经理这个职位的平均工资,及程序猿这个职位的平均工资,通俗来说,就是按照 role 这个字段进行分组。每一组求平均工资:
select role, avg(income) from salary group by role;
+-----------+--------------+
| role | avg(income) |
+-----------+--------------+
| 程序猿 | 4000.0000 |
| 经理 | 22500.0000 |
| 老板 | 4000000.0000 |
+-----------+--------------+
-- 3 rows in set (0.00 sec)
Nach dem Login kopieren
此句可以重写为:这是将role列中值相同的行分为一组,然后按组计算平均值,也是针对每个组分别计算。
在 MySQL 中,这里得到的查询结果临时表,如果没有 order by 指定列排序,这里的顺序是不可预期的,当然也可以手动指定排序,比如最终结果按照平均工资降序排序:
select role, avg(income) from salary group by role order by avg(income) desc;
+-----------+--------------+
| role | avg(income) |
+-----------+--------------+
| 老板 | 4000000.0000 |
| 经理 | 22500.0000 |
| 程序猿 | 4000.0000 |
+-----------+--------------+
-- 3 rows in set (0.00 sec)
Nach dem Login kopieren
如果不带聚合函数的普通查询,能否可行呢?这里如果你没有修改任何配置文件,是不可行的,记住千万不能把前面的 order by 与 group by 弄混!
select role, avg(income) from salary where name != '篮球哥' group by role;
+-----------+--------------+
| role | avg(income) |
+-----------+--------------+
| 程序猿 | 5000.0000 |
| 经理 | 22500.0000 |
| 老板 | 4000000.0000 |
+-----------+--------------+
-- 3 rows in set (0.00 sec)
Nach dem Login kopieren
这样求出来的平均值就不包含篮球哥的月薪数据了,这就是先筛选,再分组。
● 还是查询每个岗位的平均工资,但是除去平均月薪在 10w 以上的岗位,不能让篮球哥眼红!
select role, avg(income) from salary group by role having avg(income) < 100000;
+-----------+-------------+
| role | avg(income) |
+-----------+-------------+
| 程序猿 | 4000.0000 |
| 经理 | 22500.0000 |
+-----------+-------------+
-- 2 rows in set (0.00 sec)
这里 having 也能加上逻辑运算符,具体感兴趣的小伙伴可以自行下来尝试一下,好比如你想要拿好 offer,就得技术过关,还能加班!至于第三种分组前后都需要筛选,就是把上述俩例子结合起来,这里就不多赘述了!
Das obige ist der detaillierte Inhalt vonSo verwenden Sie die MySQL-Aggregatabfragemethode. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen 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