--------+
| AVG(age) | ClassID |
+----------+---------+
| ?63.5000 | ? ?NULL |
| ?36.0000 | ? ? ? 2 |
| ?46.0000 | ? ? ? 5 |
+----------+---------+
3 rows in set (0.00 sec)
?
MariaDB [hellodb]>
?
HAVING拿到手的都是一组一组的数据,所以也要求下平均值。然后不匹配的组,就刷掉。到了SELECT那里,它求一下平均值是为了显示。这是两个不同的部分。
?
如果想找age小于AVG(age)之类的结果,这里是查不出来的。在子查询部分。
?
例10:显示最少有3个同学的班级和该班级的人数。
?
MariaDB [hellodb]> SELECT ClassID,Count(Name) FROM students GROUP BY ClassID HAVING Count(Name) >= 3;
+---------+-------------+
| ClassID | Count(Name) |
+---------+-------------+
| ? ? ? 1 | ? ? ? ? ? 4 |
| ? ? ? 2 | ? ? ? ? ? 3 |
| ? ? ? 3 | ? ? ? ? ? 4 |
| ? ? ? 4 | ? ? ? ? ? 4 |
| ? ? ? 6 | ? ? ? ? ? 4 |
| ? ? ? 7 | ? ? ? ? ? 3 |
+---------+-------------+
6 rows in set (0.00 sec)
?
MariaDB [hellodb]>
?
这个表小,这样显示还可以,但是如果有上千上万个的条目,一下子显示出来就有点夸张了,占网络带宽不说,一下子出来这么多,也看不完啊。
?
6、限制显示条目的数量。
LIMIT
?
只显示3行。在最后加上limit 3就可以了。
?
MariaDB [hellodb]> SELECT * FROM students LIMIT 3;
+-------+-------------+-----+--------+---------+-----------+
| StuID | Name ? ? ? ?| Age | Gender | ClassID | TeacherID |
+-------+-------------+-----+--------+---------+-----------+
| ? ? 1 | Shi Zhongyu | ?22 | M ? ? ?| ? ? ? 2 | ? ? ? ? 3 |
| ? ? 2 | Shi Potian ?| ?22 | M ? ? ?| ? ? ? 1 | ? ? ? ? 7 |
| ? ? 3 | Xie Yanke ? | ?53 | M ? ? ?| ? ? ? 2 | ? ? ? ?16 |
+-------+-------------+-----+--------+---------+-----------+
3 rows in set (0.00 sec)
?
这是从头开始,显示3行。如果想从中间开始。下面这个是从第5行开始,显示3行。
?
MariaDB [hellodb]> SELECT * FROM students LIMIT 5,3;
+-------+-----------+-----+--------+---------+-----------+
| StuID | Name ? ? ?| Age | Gender | ClassID | TeacherID |
+-------+-----------+-----+--------+---------+-----------+
| ? ? 6 | Shi Qing ?| ?46 | M ? ? ?| ? ? ? 5 | ? ? ?NULL |
| ? ? 7 | Xi Ren ? ?| ?19 | F ? ? ?| ? ? ? 3 | ? ? ?NULL |
| ? ? 8 | Lin Daiyu | ?17 | F ? ? ?| ? ? ? 7 | ? ? ?NULL |
+-------+-----------+-----+--------+---------+-----------+
3 rows in set (0.00 sec)
?
7、杂项。
?
DISTINCT ?: ?指定的结果相同的只显示一次。在SELECT 语句后面。
?
SQL_CACHE : ?缓存此条语句至查询缓存中。
?
SQL_NO_CACHE: ?说明不缓存此条语句。
?
简单的例子说明下第一个吧。如果显示都有哪些年龄的同学,除了用分组外。还可以用DISTINCT。只不过只能显示一个字段。
?
age字段重复的就不显示,并且排序。 不排序也没有关系。
?
MariaDB [hellodb]> SELECT DISTINCT age ?FROM students ORDER BY age;
+-----+
| age |
+-----+
| ?17 |
| ?18 |
| ?19 |
| ?20 |
| ?21 |
| ?22 |
| ?23 |
| ?25 |
| ?26 |
| ?27 |
| ?32 |
| ?33 |
| ?46 |
| ?53 |
| 100 |
+-----+
15 rows in set (0.00 sec)
?
到这里单表查询就完了。我们来看看这么多语句它的执行流程。
SELECT语句的执行流程:
FROM --> WHERE ?--> GROUP BY --> HAVING ?--> ORDER BY --> SELECT --> LIMIT
?
首先是FROM获取表数据,然后WHERE筛选,再然后GROUP BY来分组,再然后HAVING给组再来一下过滤,再然后就是ORDER BY给剩下的组或是整张表的行排序,再然后才是SELECT把最终整理好的数据计算或者直接显示出来,当然到达客户端还要经过LIMIT限制。
?
二、多表查询。
?
我们知道关系型
数据库就是为了降低冗余,所以都是把内容记录到多张表中,我们在查询的时候要把多张表连起来才能查到所有数据。
?
说明一下,因为表的内容都贴出来的话就太多了,所以这里就只举例子了,具体的表内容,朋友们自己
下载看吧。
?
MariaDB [hellodb]> SHOW TABLES;
+-------------------+
| Tables_in_hellodb |
+-------------------+
| classes ? ? ? ? ? |
| coc ? ? ? ? ? ? ? |
| courses ? ? ? ? ? |
| scores ? ? ? ? ? ?|
| students ? ? ? ? ?|
| teachers ? ? ? ? ?|
| toc ? ? ? ? ? ? ? |
+-------------------+
7 rows in set (0.00 sec)
?
1、联结查询
?
联结查询: 先将几张表join起来, 然后再根据join以后所产生的表,来进行查询。
?
有:
?
交叉联结、自然联结、外联结、自联结。
?
交叉联结:
?
就是各个表的各字段的值相乘的关系。各种连结,各种交叉。这里也只是提一下。
直接FROM表就是了。
1