前面我们学习了数据库的创建,选择,删除语句,表达的创建,修改,和删除语句。以及一些简单的查询和插入记录的语句。但这些都只是空架子。真正数据库的操作在于如何查询数据,所以我们这里开始学习数据库的各种查找操作。
准备工作:
首先我们要查询数据,首先就要要求表中有数据,我们把之前创建的student_info和student_score插入数据。
mysql> select * from student_info;
+-----------+------+------+-----------+---------------------+-------+-----------------+
| number | name | sex | id_number | department | major | enrollment_time |
+-----------+------+------+-----------+---------------------+-------+-----------------+
| 220101101 | 一花 | 女 | 123456789 | school of computing | jike | 2022-09-01 |
| 220101102 | 二乃 | 女 | 123456788 | school of computing | jike | 2022-09-01 |
| 220101103 | 三玖 | 女 | 123456787 | school of computing | jike | 2022-09-01 |
| 220101104 | 四叶 | 女 | 123456786 | school of computing | jike | 2022-09-01 |
| 220101105 | 五月 | 女 | 123456785 | school of computing | jike | 2022-09-01 |
+-----------+------+------+-----------+---------------------+-------+-----------------+
5 rows in set (0.01 sec)
mysql> select * from student_score;
+-----------+--------------------+-------+
| number | subject | score |
+-----------+--------------------+-------+
| 220101101 | 计算机是怎样运行的 | 78 |
| 220101102 | 计算机是怎样运行的 | 79 |
| 220101103 | 计算机是怎样运行的 | 78 |
| 220101104 | 计算机是怎样运行的 | 77 |
| 220101105 | 计算机是怎样运行的 | 77 |
+-----------+--------------------+-------+
5 rows in set (0.00 sec)
查询单个列:
语法:select 列名 from 表名;
这个语句其实分为两部分:
select子句和from子句
mysql> select name from student_info;
+------+
| name |
+------+
| 一花 |
| 二乃 |
| 三玖 |
| 四叶 |
| 五月 |
+------+
5 rows in set (0.00 sec)
可以看到查询结果把那一列都展示了出来,我们可以把查询结果称为结果集。
列的别名:我们也可以为结果集中的列重新定义一个别名,这里的别名只是在本次查询到的结果集中展示。并不会改变真实表中的列名。在下次查询中,也可以对列取别的别名。
方式1:select 列名 as 别名 from 表名
方式2:select 列名 别名 from 表名
也就是说这个as可有可无
查询多个列:
语法:select 列名1, 列名2, 列名3, ......列名n from 表名;
select后面跟随的叫查询列表。我们查询的列名可以随意调换顺序,结果集将按照摆放顺序呈现。
同样我们在select 列名 的时候可以给列名取别名。
查询所有列:如果需要查询所有列,就直接用(*)来表示要查询的东西(之前就介绍过)这里就不说了。
查询结果去重:
去单列的重复结果:我们在查询一列的记录的时候,可能会出现同一种记录,有多条的情况。如果需要去掉重复的我们可以这样做:
select distinct 列名 from 表名;
mysql> select distinct subject from student_score;
+--------------------+
| subject |
+--------------------+
| 计算机是怎样运行的 |
+--------------------+
1 row in set (0.00 sec)
去除多列的重复结果:同样和查询多个列一样,不过是在众列名前加了个distinct。像这样:
select distinct 列名1, 列名2, ......列名n from表名;
mysql> select distinct subject, score 成绩 from student_score;
+--------------------+------+
| subject | 成绩 |
+--------------------+------+
| 计算机是怎样运行的 | 78 |
| 计算机是怎样运行的 | 79 |
| 计算机是怎样运行的 | 77 |
+--------------------+------+
3 rows in set (0.00 sec)
限制结果集记录条数:有时候结果集的条数特别多,我们只需要显示一部分的时候,我们就可以用这个语句:limit 限制条数
同样在查询语句的基础上进行添加修改就行:select 列名 from 表名 limit 限制数。
这里的限制数所呈现的条数是从原本的结果集的第一条开始计数,直到限制数的条数。
如果不想从第一条开始展示,想从第二条呢。那这个limit语句又要加上一个偏移量的参数;
limit 偏移量, 限制条数。
也就是这个样:select 列名 from 表名 limit 偏移量, 限制条数;
mysql> select score from student_score limit 3;
+-------+
| score |
+-------+
| 78 |
| 79 |
| 78 |
+-------+
3 rows in set (0.00 sec)
mysql> select score from student_score limit 1, 3;
+-------+
| score |
+-------+
| 79 |
| 78 |
| 77 |
+-------+
3 rows in set (0.00 sec)
对查询结果排序:
按照单个列的值进行排序:
用于指定结果集记录的排序规则的order by子句的语法如下:
order by 列名 【asc/desc】;
其中asc和desc指的是排序方向。asc是指按照指定列的值进行由小到大的排序,也就是升序。desc就是降序的意思。如果列名后都不填写,就自动默认是asc。
因此order by 列名 asc和oder by 列名是等价的。
写法也就是在查询语句上进行添加:select * from 表名 order by score;
mysql> select * from student_score order by score;
+-----------+--------------------+-------+
| number | subject | score |
+-----------+--------------------+-------+
| 220101104 | 计算机是怎样运行的 | 77 |
| 220101105 | 计算机是怎样运行的 | 77 |
| 220101101 | 计算机是怎样运行的 | 78 |
| 220101103 | 计算机是怎样运行的 | 78 |
| 220101102 | 计算机是怎样运行的 | 79 |
+-----------+--------------------+-------+
5 rows in set (0.00 sec)
按照多个列的值进行排序:order by 列1【asc/desc】, 列2【asc/desc】......
也就是这样select 列名 from 表名 order by 列名1【asc/desc】, 列名2【asc/desc】;
//字符也可以比较大小,先比第一个,第一个大的就大,相同再比第二个,以此类推。
我们其实可以把多种的语句进行结合,比如limit语句和order by语句结合,就可以轻松的得到最大值或者说什么特殊值。
mysql> select * from student_score order by score desc limit 1;
+-----------+--------------------+-------+
| number | subject | score |
+-----------+--------------------+-------+
| 220101102 | 计算机是怎样运行的 | 79 |
+-----------+--------------------+-------+
1 row in set (0.00 sec)