Skip to content
On this page

简单查询

查询单个列

sql
SELECT 列名 FROM 表名;

查询学生学号列数据

sql
mysql> select number from student_info;
+----------+
| number   |
+----------+
| 20180104 |
| 20180102 |
| 20180101 |
| 20180103 |
| 20180105 |
| 20180106 |
+----------+
6 rows in set (0.00 sec)

可以看到查询结构中就把所有记录的 number 列都展示了出来,我们有时候也把这个结果称之为结果集

列的别名

可以为结果集的列定义别名

sql
SELECT 列名 [AS] 列的别名 FROM 表名;

其中 [] 代表可有可无,可以直接省略 [AS]

sql
mysql> select number 学号  from student_info;
+----------+
| 学号     |
+----------+
| 20180104 |
| 20180102 |
| 20180101 |
| 20180103 |
| 20180105 |
| 20180106 |
+----------+
6 rows in set (0.00 sec)

别名只在本次查询中起作用,下次查询仍然可以起别的名称

查询多列

直接跟多个列名,用 , 隔开

sql
SELECT 列名1, 列名2, ... 列名n FROM 表名;
sql
mysql> select number,name,sex from student_info;
+----------+-----------+------+
| number   | name      | sex  |
+----------+-----------+------+
| 20180101 | 杜子腾    | 男   |
| 20180102 | 杜琦燕    | 女   |
| 20180103 | 范统      | 男   |
| 20180104 | 史珍香    | 女   |
| 20180105 | 范剑      | 男   |
| 20180106 | 朱逸群    | 男   |
+----------+-----------+------+
6 rows in set (0.00 sec)

查询所有列

sql
SELECT * FROM 表名;

除非你确实需要表中的每个列,否则一般最好别使用星号 * 来查询所有列,虽然看起来方便,但是查询不需要的列通常会降低性能。

查询结果去重

有时候查询时出现重复的数据

sql
mysql> select subject from student_score;
+-----------------------------+
| subject                     |
+-----------------------------+
| 母猪的产后护理              |
| 论萨达姆的战争准备          |
| 母猪的产后护理              |
| 论萨达姆的战争准备          |
| 母猪的产后护理              |
| 论萨达姆的战争准备          |
| 母猪的产后护理              |
| 论萨达姆的战争准备          |
+-----------------------------+
8 rows in set (0.00 sec)

如果我们想去掉重复的数据

sql
SELECT DISTINCT 列名 FROM 表名;
sql
mysql> select distinct  subject from student_score;
+-----------------------------+
| subject                     |
+-----------------------------+
| 母猪的产后护理              |
| 论萨达姆的战争准备          |
+-----------------------------+
2 rows in set (0.00 sec)

看结果集只剩下不重复的数据。我们可以去除多列重复

sql
SELECT DISTINCT 列名1, 列名2, ... 列名n  FROM 表名;
sql
mysql> select distinct department, major from student_info;
+-----------------+--------------------------+
| department      | major                    |
+-----------------+--------------------------+
| 计算机学院      | 计算机科学与工程         |
| 计算机学院      | 软件工程                 |
| 航天学院        | 飞行器设计               |
| 航天学院        | 电子信息                 |
+-----------------+--------------------------+
4 rows in set (0.00 sec)

mysql>

限制查询结果条数

sql
LIMIT 开始行, 限制条数;
  • 开始行:指的是我们想从第几行数据开始查询,
  • 限制条数:是结果集中最多包含多少条记录。
sql
mysql> select number,name,id_number,major from student_info limit 0, 3;
+----------+-----------+--------------------+--------------------------+
| number   | name      | id_number          | major                    |
+----------+-----------+--------------------+--------------------------+
| 20180101 | 杜子腾    | 158177199901044792 | 计算机科学与工程         |
| 20180102 | 杜琦燕    | 151008199801178529 | 计算机科学与工程         |
| 20180103 | 范统      | 17156319980116959X | 软件工程                 |
+----------+-----------+--------------------+--------------------------+
3 rows in set (0.00 sec)

mysql>

如果指定的开始行大于结果中的行数,那查询结果就什么都没有

sql
mysql> select number,name,id_number,major from student_info limit 6, 3;
Empty set (0.00 sec)

mysql>

如果查询的结果条数不超过限制条数,那就可以全部显式出来

sql
mysql> select number,name,id_number,major from student_info limit 4, 3;
+----------+-----------+--------------------+-----------------+
| number   | name      | id_number          | major           |
+----------+-----------+--------------------+-----------------+
| 20180105 | 范剑      | 181048199308156368 | 飞行器设计      |
| 20180106 | 朱逸群    | 197995199501078445 | 电子信息        |
+----------+-----------+--------------------+-----------------+
2 rows in set (0.00 sec)

mysql>

也可以不指定开始行,直接默认第 0 条数据开始,只指定限制条数

sql
mysql> select number,name,id_number,major from student_info limit 3;
+----------+-----------+--------------------+--------------------------+
| number   | name      | id_number          | major                    |
+----------+-----------+--------------------+--------------------------+
| 20180101 | 杜子腾    | 158177199901044792 | 计算机科学与工程         |
| 20180102 | 杜琦燕    | 151008199801178529 | 计算机科学与工程         |
| 20180103 | 范统      | 17156319980116959X | 软件工程                 |
+----------+-----------+--------------------+--------------------------+
3 rows in set (0.00 sec)

mysql>

对查询结果排序

sql
ORDER BY 列名 ASC|DESC

ASC 和 DESC 指的是排序方向。

  • ASC:是指按照指定列的值进行由小到大进行排序,也叫做升序
  • DESC:是指按照指定列的值进行由大到小进行排序,也叫做降序
sql
mysql> select * from student_score order by score asc;
+----------+-----------------------------+-------+
| number   | subject                     | score |
+----------+-----------------------------+-------+
| 20180104 | 论萨达姆的战争准备          |    46 |
| 20180104 | 母猪的产后护理              |    55 |
| 20180103 | 母猪的产后护理              |    59 |
| 20180103 | 论萨达姆的战争准备          |    61 |
| 20180101 | 母猪的产后护理              |    78 |
| 20180101 | 论萨达姆的战争准备          |    88 |
| 20180102 | 论萨达姆的战争准备          |    98 |
| 20180102 | 母猪的产后护理              |   100 |
+----------+-----------------------------+-------+
8 rows in set (0.00 sec)

mysql>

可以看到输出的记录就是按照成绩由小到大进行排序的。如果省略了 ORDER BY 语句中的排序方向,则默认按照从小到大的顺序进行排序,也就是说 ORDER BY 列名ORDER BY 列名 ASC 的语义是一样的

sql
mysql> select * from student_score order by score;
+----------+-----------------------------+-------+
| number   | subject                     | score |
+----------+-----------------------------+-------+
| 20180104 | 论萨达姆的战争准备          |    46 |
| 20180104 | 母猪的产后护理              |    55 |
| 20180103 | 母猪的产后护理              |    59 |
| 20180103 | 论萨达姆的战争准备          |    61 |
| 20180101 | 母猪的产后护理              |    78 |
| 20180101 | 论萨达姆的战争准备          |    88 |
| 20180102 | 论萨达姆的战争准备          |    98 |
| 20180102 | 母猪的产后护理              |   100 |
+----------+-----------------------------+-------+
8 rows in set (0.00 sec)

mysql>

上面时按照单个列来排序,那按照多个列来排是怎么样的呢?

sql
ORDER BY 列1 ASC|DESC, 列2 ASC|DESC ...

比如我们想让对 student_score 的查询结果先按照 subject 排序,再按照 score 值从大到小的顺序进行排列

sql
mysql> select * from student_score order by subject, score desc;
+----------+-----------------------------+-------+
| number   | subject                     | score |
+----------+-----------------------------+-------+
| 20180102 | 母猪的产后护理              |   100 |
| 20180101 | 母猪的产后护理              |    78 |
| 20180103 | 母猪的产后护理              |    59 |
| 20180104 | 母猪的产后护理              |    55 |
| 20180102 | 论萨达姆的战争准备          |    98 |
| 20180101 | 论萨达姆的战争准备          |    88 |
| 20180103 | 论萨达姆的战争准备          |    61 |
| 20180104 | 论萨达姆的战争准备          |    46 |
+----------+-----------------------------+-------+
8 rows in set (0.00 sec)

mysql>

排序和限制查询

我们还可以让 ORDER BY 语句和 LIMIT 语句结合使用,不过 ORDER BY 语句必须放在 LIMIT 语句前边

sql
mysql> select * from student_score order by score desc  limit 2, 3;
+----------+-----------------------------+-------+
| number   | subject                     | score |
+----------+-----------------------------+-------+
| 20180101 | 论萨达姆的战争准备          |    88 |
| 20180101 | 母猪的产后护理              |    78 |
| 20180103 | 论萨达姆的战争准备          |    61 |
+----------+-----------------------------+-------+
3 rows in set (0.00 sec)

mysql>