通过SELECT语句可以根据数据表中的一个或多个列组合检索数据。
检索一列
SELECT 列名 FROM 表名;
例如根据host
列检索sys
数据库中的host_summary
数据表的数据,输出结果:
mysql> SELECT host FROM host_summary;
+-----------+
| host |
+-----------+
| localhost |
+-----------+
1 row in set (0.01 sec)
检索多列
SELECT 列名1,列名2,列名3 FROM 表名;
例如根据列host
、statements
和file_ios
检索sys
数据库中的host_summary
数据表的数据,输出结果:
mysql> SELECT host,statements,file_ios FROM host_summary;
+-----------+------------+----------+
| host | statements | file_ios |
+-----------+------------+----------+
| localhost | 440 | 144 |
+-----------+------------+----------+
1 row in set (0.01 sec)
检索所有列
SELECT * FROM 表名;
例如检索sys
数据库中的host_summary
数据表的所有数据,输出结果:
mysql> SELECT * FROM host_summary;
+-----------+------------+-------------------+-----------------------+-------------+----------+-----------------+---------------------+-------------------+--------------+----------------+------------------------+
| host | statements | statement_latency | statement_avg_latency | table_scans | file_ios | file_io_latency | current_connections | total_connections | unique_users | current_memory | total_memory_allocated |
+-----------+------------+-------------------+-----------------------+-------------+----------+-----------------+---------------------+-------------------+--------------+----------------+------------------------+
| localhost | 442 | 625.42 ms | 1.41 ms | 14 | 144 | 45.74 ms | 2 | 14 | 2 | 1.31 MiB | 80.84 MiB |
+-----------+------------+-------------------+-----------------------+-------------+----------+-----------------+---------------------+-------------------+--------------+----------------+------------------------+
1 row in set (0.01 sec)
检索唯一值
检索的列中数据存在重复值时,只需要获取唯一值,可以使用如下命令:
SELECT DISTINCT 列名 FROM 表名;
例如通过SELECT set_time FROM sys_config
命令检索sys
数据库中的sys_config
表数据时,结果如下:
mysql> SELECT set_time FROM sys_config;
+---------------------+
| set_time |
+---------------------+
| 2021-04-23 23:56:03 |
| 2021-04-23 23:56:03 |
| 2021-04-23 23:56:03 |
| 2021-04-23 23:56:03 |
| 2021-04-23 23:56:03 |
| 2021-04-23 23:56:03 |
+---------------------+
6 rows in set (0.00 sec)
使用SELECT DISTINCT set_time FROM sys_config
命令检索sys
数据库中的sys_config
表数据时,结果如下:
mysql> SELECT DISTINCT set_time FROM sys_config;
+---------------------+
| set_time |
+---------------------+
| 2021-04-23 23:56:03 |
+---------------------+
1 row in set (0.00 sec)
当按多列检索数据时,
DISTINCT
会对所有列生效,不支持只对单一列输出唯一值。
限制输出结果
使用SELECT
语句的执行结果会返回所有结果,当只需要前几项结果时,可以使用如下命令:
SELECT 列名 FROM 表名 LIMIT 整数;
例如检索sys
数据库中的sys_config
表的variable
列的前三条数据,结果如下:
mysql> SELECT variable FROM sys_config LIMIT 3;
+-------------------------------+
| variable |
+-------------------------------+
| diagnostics.allow_i_s_tables |
| diagnostics.include_raw |
| ps_thread_trx_info.max_length |
+-------------------------------+
3 rows in set (0.00 sec)
也可以在LIMIT
后输入两个整数,用逗号分割,表示从某一行开始,向后检索几行。
SELECT 列名 FROM 表名 LIMIT 整数1,整数2;
例如检索sys
数据库中的sys_config
表的variable
列的数据,从第2行数据开始,向后检索3行,结果如下:
LIMIT 1,3
中的1
并不是第一行数据,行从0开始计数,因此1
表示第二行,3
表示向后检索3行。
mysql> SELECT variable FROM sys_config LIMIT 1,3;
+--------------------------------------+
| variable |
+--------------------------------------+
| diagnostics.include_raw |
| ps_thread_trx_info.max_length |
| statement_performance_analyzer.limit |
+--------------------------------------+
3 rows in set (0.00 sec)
完全限定表名
一张表在当前数据库中的表名是唯一的,不能重复。但在不同的数据库中,可能会有同名的表,因此,可以在使用SELECT
时,完全限定表所处的数据库。同理,列在一张表中唯一,但在不同表中也可能重名,也可以限定列所处的表。
SELECT 表名.列名 FROM 数据库名.表名;
例如根据host
列检索sys
数据库中的host_summary
数据表的数据,输出结果如下,与检索一列中样例输出结果相同:
mysql> SELECT host_summary.host FROM sys.host_summary;
+-----------+
| host |
+-----------+
| localhost |
+-----------+
1 row in set (0.01 sec)
检索结果排序
如果不指定检索结果的顺序,则输出的结果一般会以它在底层表中出现的顺序显示,但是如果数据被更新、删除等操作后,MySQL会重用回收存储空间,因此会影响默认查询结果的顺序,如果不明确规定排序顺序,则不应假定检索出的数据的顺序有意义。
SELECT 列名 FROM 表名 ORDER BY 列名;
例如检索sys
数据库中的sys_config
表的variable
列的数据,使用variable
的字母顺序排序,结果如下:
- 默认查询结果按字母顺序排序。
- 不一定使用检索的列来排序,也可以使用其他列作为排序的依据。
mysql> SELECT variable FROM sys_config ORDER BY variable;
+--------------------------------------+
| variable |
+--------------------------------------+
| diagnostics.allow_i_s_tables |
| diagnostics.include_raw |
| ps_thread_trx_info.max_length |
| statement_performance_analyzer.limit |
| statement_performance_analyzer.view |
| statement_truncate_len |
+--------------------------------------+
6 rows in set (0.00 sec)
检索结果不仅可以按一列进行排序,还可以按多列进行排序。
SELECT 列名 FROM 表名 ORDER BY 列名1,列名2;
例如检索sys
数据库中的sys_config
表的variable
列的数据,优先使用variable
的字母顺序排序,当字母顺序相同时,使用set_time
的顺序进行排序,结果如下:
mysql> SELECT variable FROM sys_config ORDER BY variable,set_time;
+--------------------------------------+
| variable |
+--------------------------------------+
| diagnostics.allow_i_s_tables |
| diagnostics.include_raw |
| ps_thread_trx_info.max_length |
| statement_performance_analyzer.limit |
| statement_performance_analyzer.view |
| statement_truncate_len |
+--------------------------------------+
6 rows in set (0.00 sec)
多列名排序时,先按
列名1
排序,当根据列名1
的排序相同时,再按列名2
排序,以此类推。
检索结果不仅支持升序排序,也可以降序排序,需要在ORDER BY
后使用DESC
关键字。
SELECT 列名 FROM 表名 ORDER BY 列名 DESC;
例如检索sys
数据库中的sys_config
表的variable
列的数据,使用variable
的字母顺序降序排序,结果如下:
mysql> SELECT variable FROM sys_config ORDER BY variable DESC;
+--------------------------------------+
| variable |
+--------------------------------------+
| statement_truncate_len |
| statement_performance_analyzer.view |
| statement_performance_analyzer.limit |
| ps_thread_trx_info.max_length |
| diagnostics.include_raw |
| diagnostics.allow_i_s_tables |
+--------------------------------------+
6 rows in set (0.00 sec)
DESC
关键字只应用到直接位于其前面的列名。