目录
一、where条件查询
① 查询年龄大于/等于18岁的学生记录。
② 查询名字以张开头的学生记录。
③ 范围查询
二、order by 排序
① 按照name列升序排序
② 按照name列降序排序
③ 先按 name 降序,再按 age 升序排序
④ 可以使用表达式或函数来进行排序 比如按照 age + height 的结果 进行降序
三、limit 分页
查询结果中获取第1页和每页2行数据,
获取第2页,一页2行的数据
四、聚合函数
1. 使用COUNT函数:
2. 使用SUM函数:
3. 使用AVG函数:
4. 使用MAX函数:
5. 使用MIN函数:
五、分组 group by
前面介绍了Mysql数据库的增删改,查询操作其实是我们在开发中使用最多的操作
一、where条件查询
MySQL中的WHERE语句用于对表中的数据进行筛选和过滤。使用WHERE语句可以根据指定的条件来查询符合条件的数据。
下面是WHERE语句的基本语法:
SELECT column1, column2, ...
FROM table_name
WHERE condition;
其中,condition是WHERE语句的条件,可以使用各种操作符和函数来实现条件的筛选。
以下是常用的WHERE条件查询操作符:
- 等于:
=
- 不等于:
<>
或者!=
- 大于:
>
- 小于:
<
- 大于等于:
>=
- 小于等于:
<=
- BETWEEN:查询范围内的值,如:
BETWEEN value1 AND value2
- LIKE:模糊查询,如:
LIKE 'value%'
- IN:查询指定范围内的值,如:
IN (value1, value2, ...)
- IS NULL:查询值为空的记录,如:
IS NULL
- IS NOT NULL:查询值不为空的记录,如:
IS NOT NULL
示例:
① 查询年龄大于/等于18岁的学生记录。
mysql> select * from stu where age >=18;
+----+--------+------+--------+--------+
| id | name | age | height | gender |
+----+--------+------+--------+--------+
| 1 | 张三 | 18 | 68.00 | 保密 |
| 2 | 张三 | 18 | 68.00 | 保密 |
| 3 | 刘伟 | 23 | 100.00 | 男 |
| 4 | 刘伟 | 23 | 100.00 | 男 |
+----+--------+------+--------+--------+
4 rows in set (0.00 sec)
mysql>
② 查询名字以张开头的学生记录。
mysql> SELECT * FROM stu WHERE name LIKE '张%';
+----+--------+------+--------+--------+
| id | name | age | height | gender |
+----+--------+------+--------+--------+
| 1 | 张三 | 18 | 68.00 | 保密 |
| 2 | 张三 | 18 | 68.00 | 保密 |
| 8 | 张飞 | 0 | 180.00 | NULL |
+----+--------+------+--------+--------+
3 rows in set (0.00 sec)
mysql>
③ 范围查询
mysql> SELECT * FROM stu WHERE age BETWEEN 18 AND 60;
+----+--------+------+--------+--------+
| id | name | age | height | gender |
+----+--------+------+--------+--------+
| 1 | 张三 | 18 | 68.00 | 保密 |
| 2 | 张三 | 18 | 68.00 | 保密 |
| 3 | 刘伟 | 23 | 100.00 | 男 |
| 4 | 刘伟 | 23 | 100.00 | 男 |
+----+--------+------+--------+--------+
4 rows in set (0.00 sec)
mysql>
二、order by 排序
在MySQL中,使用`ORDER BY`子句来对查询结果进行排序。
`ORDER BY`子句需要指定要按哪一个列进行排序,也可以多个列
默认排序是升序排序(从最小值到最大值)
如果需要降序排序,可以使用`DESC`关键字
例如:
① 按照name列升序排序
mysql> select * from stu order by name;
+----+--------+------+--------+--------+
| id | name | age | height | gender |
+----+--------+------+--------+--------+
| 7 | 关羽 | 0 | 185.00 | NULL |
| 3 | 刘伟 | 23 | 100.00 | 男 |
| 4 | 刘伟 | 23 | 100.00 | 男 |
| 6 | 刘备 | 0 | 165.00 | NULL |
| 9 | 孙权 | 0 | 170.00 | NULL |
| 1 | 张三 | 18 | 68.00 | 保密 |
| 2 | 张三 | 18 | 68.00 | 保密 |
| 8 | 张飞 | 0 | 180.00 | NULL |
+----+--------+------+--------+--------+
8 rows in set (0.00 sec)
mysql>
② 按照name列降序排序
mysql> select * from stu order by name DESC;
+----+--------+------+--------+--------+
| id | name | age | height | gender |
+----+--------+------+--------+--------+
| 8 | 张飞 | 0 | 180.00 | NULL |
| 1 | 张三 | 18 | 68.00 | 保密 |
| 2 | 张三 | 18 | 68.00 | 保密 |
| 9 | 孙权 | 0 | 170.00 | NULL |
| 6 | 刘备 | 0 | 165.00 | NULL |
| 3 | 刘伟 | 23 | 100.00 | 男 |
| 4 | 刘伟 | 23 | 100.00 | 男 |
| 7 | 关羽 | 0 | 185.00 | NULL |
+----+--------+------+--------+--------+
8 rows in set (0.00 sec)
mysql>
③ 先按 name 降序,再按 age 升序排序
mysql> select * from stu order by name DESC,age ASC;
+----+--------+------+--------+--------+
| id | name | age | height | gender |
+----+--------+------+--------+--------+
| 8 | 张飞 | 0 | 180.00 | NULL |
| 1 | 张三 | 18 | 68.00 | 保密 |
| 2 | 张三 | 18 | 68.00 | 保密 |
| 9 | 孙权 | 0 | 170.00 | NULL |
| 6 | 刘备 | 0 | 165.00 | NULL |
| 3 | 刘伟 | 23 | 100.00 | 男 |
| 4 | 刘伟 | 23 | 100.00 | 男 |
| 7 | 关羽 | 0 | 185.00 | NULL |
+----+--------+------+--------+--------+
8 rows in set (0.00 sec)
④ 可以使用表达式或函数来进行排序 比如按照 age + height 的结果 进行降序
mysql> select * from stu order by age+height DESC;
+----+--------+------+--------+--------+
| id | name | age | height | gender |
+----+--------+------+--------+--------+
| 7 | 关羽 | 0 | 185.00 | NULL |
| 8 | 张飞 | 0 | 180.00 | NULL |
| 9 | 孙权 | 0 | 170.00 | NULL |
| 6 | 刘备 | 0 | 165.00 | NULL |
| 3 | 刘伟 | 23 | 100.00 | 男 |
| 4 | 刘伟 | 23 | 100.00 | 男 |
| 1 | 张三 | 18 | 68.00 | 保密 |
| 2 | 张三 | 18 | 68.00 | 保密 |
+----+--------+------+--------+--------+
8 rows in set (0.00 sec)
mysql>
注意,如果在查询中使用了`GROUP BY`子句,则需要在`ORDER BY`中指定相同的列。
三、limit 分页
在MySQL中,可以使用LIMIT语句来进行分页。
LIMIT语句用于指定从查询结果集中返回的行数。
例如,
查询结果中获取第1页和每页2行数据,
mysql> select * from stu limit 0,2;
+----+--------+------+--------+--------+
| id | name | age | height | gender |
+----+--------+------+--------+--------+
| 1 | 张三 | 18 | 68.00 | 保密 |
| 2 | 张三 | 18 | 68.00 | 保密 |
+----+--------+------+--------+--------+
2 rows in set (0.00 sec)
mysql>
其中,第一个参数指定了从结果集中的第几行开始返回数据,从0开始计数,即0表示第1行;第二个参数指定了要返回的行数。
获取第2页,一页2行的数据
可以将查询起始行数改为2,
mysql> select * from stu limit 2,2;
+----+--------+------+--------+--------+
| id | name | age | height | gender |
+----+--------+------+--------+--------+
| 3 | 刘伟 | 23 | 100.00 | 男 |
| 4 | 刘伟 | 23 | 100.00 | 男 |
+----+--------+------+--------+--------+
2 rows in set (0.00 sec)
mysql>
依此类推,每次查询时只需要改变LIMIT语句中的起始行数即可实现分页查询。
四、聚合函数
在MySQL中,有五个聚合函数可供使用:
1. COUNT:用于返回某列的行数或非NULL值的数量。
2. SUM:用于返回某列的总和。
3. AVG:用于返回某列的平均值。
4. MAX:用于返回某列的最大值。
5. MIN:用于返回某列的最小值。
以下是每个聚合函数的使用示例:
1. 使用COUNT函数:
返回表中的总行数
mysql> select count(*) from stu;
+----------+
| count(*) |
+----------+
| 20 |
+----------+
1 row in set (0.02 sec)
mysql>
返回 age 列中的行数
mysql> select count(age) from stu;
+------------+
| count(age) |
+------------+
| 20 |
+------------+
1 row in set (0.00 sec)
mysql>
2. 使用SUM函数:
返回 age 列中的总和
mysql> select sum(age) from stu;
+----------+
| sum(age) |
+----------+
| 82 |
+----------+
1 row in set (0.00 sec)
3. 使用AVG函数:
返回 age 列中的平均值
mysql> select avg(age) from stu;
+----------+
| avg(age) |
+----------+
| 4.1000 |
+----------+
1 row in set (0.00 sec)
4. 使用MAX函数:
返回age列中的最大值
mysql> select max(age) from stu;
+----------+
| max(age) |
+----------+
| 23 |
+----------+
1 row in set (0.00 sec)
5. 使用MIN函数:
返回age列中的最小值
mysql> select min(age) from stu;
+----------+
| min(age) |
+----------+
| 0 |
+----------+
1 row in set (0.00 sec)
mysql>
注意,聚合函数一般会和GROUP BY语句一起使用,用于对分组后的数据做聚合计算。
五、分组 group by
MySQL中的GROUP BY子句可用于将结果集按照一个或多个列进行分组,然后对每个分组执行聚合函数计算。
它的语法如下:
SELECT column1, SUM(column2)
FROM table_name
GROUP BY column1;
在这个示例中,我们按照`column1`列分组,并对`column2`列进行求和计算。
mysql> select name,sum(age) from stu group by name;
+--------+----------+
| name | sum(age) |
+--------+----------+
| 张三 | 36 |
| 刘伟 | 46 |
| 刘备 | 0 |
| 关羽 | 0 |
| 张飞 | 0 |
| 孙权 | 0 |
+--------+----------+
6 rows in set (0.00 sec)
mysql>
GROUP BY子句必须放在WHERE子句之后,ORDER BY子句之前。
GROUP BY子句还支持多列分组,可以按照多个列进行分组。