数据查询语言(DQL),主要用来查询记录(数据),在实际应用过程中也会有多种查询使用方法:
- 1)查询获取服务配置信息
- 2)查询获取服务数据信息(单表查询)
- 3)查询获取服务数据信息(多表查询)
- 4)查询获取服务数据信息(嵌套查询)
参考官网链接:
- https://dev.mysql.com/doc/refman/8.4/en/indexes.html:获取mysql数据库命令索引/变量索引
- https://dev.mysql.com/doc/refman/8.4/en/glossary.html:获取mysql数据库名词解释
一、查询获取服务配置信息¶
在利用select语句获取查询数据库服务的配置信息,可以理解为select命令单独使用;
查询命令语法格式:
# 查询获取信息命令语法
mysql> select @@配置参数信息;
mysql> show variables like '检索的配置信息';
实际操作命令演示:获取函数输出信息
#查询当前所在数据库信息
mysql> select database();
#查询数据库服务端口配置信息
mysql> select @@port;
+--------+
| @@port |
+--------+
| 3306 |
+--------+
1 row in set (0.00 sec)
#查询数据库服务套接字文件信息
mysql> select @@socket;
+---------------------+
| @@socket |
+---------------------+
| /tmp/mysql3306.sock |
+---------------------+
1 row in set (0.00 sec)
#查询数据库服务比较长的配置参数信息
mysql> select @@innodb_flush_log_at_trx_commit;
+----------------------------------+
| @@innodb_flush_log_at_trx_commit |
+----------------------------------+
| 1 |
+----------------------------------+
1 row in set (0.00 sec)
# 查询获取参数配置信息(模糊查找),查看数据库服务所有配置参数信息
mysql> show variables;
#查看数据库服务配置信息模糊查找(查找po开头的信息)
mysql> show variables like 'po%';
#查看数据库服务配置信息模糊查找(查找po结尾的信息)
mysql> show variables like '%po';
#查看数据库服务配置信息模糊查找(查找含有po的信息)
mysql> show variables like '%po%';
数据库服务在线调整配置参数方法:
# 会话级别修改:数据库配置参数在线调整,表示在线临时调整配置参数,并且只是当前会话生效(session是默认方式,不是所有配置都可以调整)
mysql > set sql_log_bin=0;
# 全局级别修改:表示在线临时调整配置参数,并且将会影响所有连接(global是全局方式,可以进行所有配置调整),
mysql > set global innodb_flush_log_at_trx_commit=0;
# 全局级别和会话级别二者的区别
## 全局级别修改:对所有管理数据库的用户都生效,并且数据库连接断开后,重新连接功能配置不会失效
## 会话级别修改:只对当前用户生效,并且数据库连接断开后,重新连接功能配置会失效
## 特别注意:无论是全局级别修改还是会话级别修改,mysql重启后都会失效
说明:数据库服务配置参数在线调整参数,只是临时生效,数据库服务重启后配置会失效,想要永久生效需要修改配置文件信息
实际操作命令演示:获取函数输出信息
# 查询获取函数输出信息, 查询数据库服务函数输出信息,获取服务版本信息
mysql> select version();
+-----------+
| version() |
+-----------+
| 8.0.26 |
+-----------+
1 row in set (0.00 sec)
#查询数据库服务函数输出信息,获取当前日期时间
mysql> select now();
+---------------------+
| now() |
+---------------------+
| 2024-01-22 19:09:24 |
+---------------------+
1 row in set (0.00 sec)
#查询数据库服务函数输出信息,获取拼接函数信息
mysql> select concat(123);
+-------------+
| concat(123) |
+-------------+
| 123 |
+-------------+
1 row in set (0.00 sec)
#拼接函数应用演示
mysql> select concat(user,"@","'",host,"'") from mysql.user;
+-------------------------------+
| concat(user,"@","'",host,"'") |
+-------------------------------+
| mysql.infoschema@'localhost' |
| mysql.session@'localhost' |
| mysql.sys@'localhost' |
| root@'localhost' |
+-------------------------------+
4 rows in set (0.00 sec)
二、查询获取服务数据信息(单表查询)¶
在利用select语句获取查询数据库服务的数据信息,可以理解为select命令与from where 等其它子句结合使用;
查询命令语法格式:
# 数据表数据查询命令语法, 属于表内容信息查询操作,可以获取表中数据行信息(子句信息需要按顺序书写)
mysql> select <字段1,字段2,...> from <表名> [WHERE 条件] group by <字段1,字段2,...> having 条件 order by 字段 limit 限制信息;
上传加载测试环境:
官方数据库测试样例文件下载:https://dev.mysql.com/doc/index-other.html

环境准备
# 将world.sql数据库文件上传到数据库服务器中,根据存储路径进行加载恢复数据库数据
[root@master ~]# unzip world.zip
# 导入sql语句方式一:进入数据库中执行source语句
mysql> source /root/world.sql
# 导入sql语句方式二:数据库外使用<符号进行导入
[root@master ~]# mysql < /root/world.sql
# 查看数据库信息和数据表信息
mysql> show databases like 'world';
# 数据库中表信息
mysql> show tables from world;
# 数据库中表结构信息
mysql> desc world.city;
# 查询数据库表的前几行记录信息
mysql> select * from world.city limit 5;

实际操作命令演示:select+from 结合使用情况
#进入world数据库中,查询数据库中city表所有内容信息(企业应用不要对大表查看所有数据)
mysql> use world;
mysql> select id,name,countrycode,district,population from city;
# 查询city表中的部分字段信息,显示查看城市名称和人口数量
mysql> select name,population from city;
2.1 基础查询方式¶
实际操作命令演示:select+from+where 结合使用情况
方式一:定义等值条件信息进行数据查询
# 查询中国的所有城市信息,中国代码信息 ”CHN”
mysql> SELECT * FROM city WHERE countrycode='CHN';
# 查询中国的所有城市信息,只关注城市名称和人口数量列信息
mysql> SELECT NAME,population FROM city WHERE countrycode='CHN';
方式二:定义区间条件信息进行数据查询
可使用区间条件表示方法:
| 序号 | 符号 | 解释说明 |
|---|---|---|
| 01 | < | 表示小于指定数值的信息作为条件 |
| 02 | > | 表示大于指定数值的信息作为条件 |
| 03 | <= | 表示小于等于指定数值的信息作为条件 |
| 04 | >= | 表示大于等于指定数值的信息作为条件 |
| 05 | != / <> | 表示不等于指定数值的信息作为条件 |
# 查询大于700万人的所有城市信息
mysql> SELECT * FROM city WHERE population>7000000;
# 查询小于等于1000人的所有城市信息
mysql> SELECT * FROM city WHERE population<=1000;
方式三:定义逻辑条件信息进行数据查询
可以使用逻辑判断符号,进行条件设定查找相应数据信息:
| 序号 | 逻辑判断符号 | 解释说明 |
|---|---|---|
| 01 | and(并且)/ && | 表示多个条件均都满足才能被查找出来 |
| 02 | or(或者)/ || | 表示多个条件之一满足就能被查找出来 |
| 03 | not (取反) / ! | 表示查找除过滤查找的信息以外的内容 |
# 查询在中国境内且大于520万人口的城市信息
mysql> SELECT * FROM city WHERE countrycode='CHN' AND population>5200000;
# 查询中国和美国的所有城市
mysql> SELECT * FROM city WHERE countrycode='chn' OR countrycode='USA';
# 查询人口数在100w到200w之间的城市信息
mysql> SELECT * FROM city WHERE population>=1000000 AND population<=2000000;
方式四:定义模糊条件信息进行数据查询(like )
# 查询国家代号是CH开头的城市信息
mysql> SELECT * FROM city WHERE countrycode LIKE 'CH%';
# 查询国家代号含US内容的城市信息,在模糊查询时,%符号在前面进行检索数据时,是不会走索引信息进行检索的,查询性能较慢
mysql> SELECT * FROM city WHERE countrycode LIKE '%US%';
方式五:特殊查询条件组合进行数据查询(配合in, not in, between and )
# 查询中国和美国的所有城市,in的查询条件方式表示包含意思,实际应用更广泛
mysql> SELECT * FROM city WHERE countrycode in ('CHN','USA');
# 查询世界上的所有城市信息,但排除中国和美国的城市不查询(not in的查询条件方式表示排除意思,实际应用比较少见,因为not in不能走索引扫描,查询检索性能较慢)
mysql> SELECT * FROM city WHERE countrycode not in ('CHN','USA');
# 查询人口数量在50w-100w之间的城市信息(between and的查询条件方式是包含边界取值信息的,即包含50w人口的城市,也包含100w人口的城市)
mysql> SELECT * FROM city WHERE population between 500000 and 10000000;
方式六:查询数据信息取消重复信息(distinct)
#查询国家名字为USA的国家
mysql> select CountryCode from city where CountryCode='USA';
#查询国家名字为USA的国家,去重。列字段信息必须完全相同,内容才可以实现去重
mysql> select Distinct CountryCode from city where CountryCode='USA';
方式七:查询数据信息为空的内容(is null)
# 查询国家编码字段为空的信息
mysql> select * from city where CountryCode is null;
2.2 进阶查询方式¶
实际操作命令演示:select+from+where+group by+聚合函数(统计函数) 结合使用情况
在利用select语句查询数据信息,结合group by子句可以实现分组查询,并且还必须配合聚合函数对分组查询的数据做相应处理;
数据库服务中常用的聚合函数(统计函数):
| 序号 | 函数信息 | 解释说明 |
|---|---|---|
| 01 | count() | 此函数表示对数量信息进行统计 |
| 02 | sum() | 此函数表示对数值信息进行求和 |
| 03 | avg() | 此函数表示对数值信息进行求平均值 |
| 04 | min() | 此函数表示对数值信息进行取最小值 |
| 05 | max() | 此函数表示对数值信息进行取最大值 |
| 06 | group_concat() | 此函数表示输出信息无法匹配分组和聚合函数时,进行拼接整合显示 |
| 07 | distinct | 此指令表示作用是对表中的单个字段或多个字段去重操作 |
利用group by进行分组查询的执行逻辑分析:
- 根据查询语句信息,取出表中关注的列字段信息;
- 根据查询分组信息,将特定列字段信息进行排序,从而将分组的一致信息整合在一起(形成结果集);
- 根据分组合并信息,结合使用的聚合函数,进行数值信息运算或统计(生成最终结果);
- 根据分组聚合要求,分组信息输出时必须和分组信息一一对应,但特殊列无法一一对应输出时,可使用group_concat()拼接输出

实际操作命令演示:获取分组数据信息进行聚合函数处理实践:
# 查询统计每个国家的人口总数(根据国家信息分组聚合,在将分组后所有城市的人口数量进行sum求和运算,实现国家信息对应人口总数的1对1关系)
mysql > select countrycode,sum(population) from world.city group by countrycode;
# 查询统计每个省份的城市个数,这里展示的是查看中国每个省份的城市个数
mysql > select district,count(name) from city where countrycode='chn' group by district;
# 查询统计每个省份的城市个数,以及城市名称信息(经常面试题考到), 由于数据库sql_mode配置了only_full_group_by,由于输出的name信息不能和district信息实现1对1关系,因此报错,这里需要注意:如果取消配置only_full_group_by后,再重新执行查询,虽然不报错,但是查询结果因不满足一对一只会展示第一个内容
mysql> select district,count(name),name from city where countrycode='chn' group by district;
ERROR 1055 (42000): Expression #3 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'world.city.Name' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
#针对上面查询结果因不满足一对一只会展示第一个内容,可以利用group_concat()就可以实现没有出现在分组和聚合函数中的字段,采取拼接整合方式显示,满足分组1对1关系
mysql> select district,count(name),group_concat(name) from city where countrycode='chn' group by district;
实际操作命令演示:select+from+where+group by+聚合函数+having
在利用select语句查询数据信息,结合分组和聚合函数处理之后,可以将输出的信息再进行过滤处理(having);
实际操作命令演示:对分组聚合后数据进行过滤处理
# 查询统计每个国家的人口总数,只显示人口数量超过1个亿的信息
mysql > select countrycode,sum(population) from world.city group by countrycode having sum(population)>100000000;
实际操作命令演示:select+from+where+group by+聚合函数+having+order by
在利用select语句查询数据信息,结合分组和聚合函数处理之后,并且再次经过筛选的数据,按照一定数值规律排序显示信息
having和where的区别:
- where:
- 根据表中的列信息进行过滤
- 过滤的内容或条件是根据列名进行过滤
- having:
- 根据分组后的数据进行过滤
- 过滤的内容是可以根据函数(聚合函数)信息进行过滤
实际操作命令演示:
# 查询统计每个国家的人口总数,只显示人口数量超过5千万的信息,并且按照国家人口总数排序显示, 实现了人口数量从小到大排序(升序/正序)
mysql > select countrycode,sum(population) from world.city group by countrycode having sum(population)>50000000 order by sum(population);
#查询统计每个国家的人口总数,只显示人口数量超过5千万的信息,并且按照国家人口总数排序显示, 实现了人口数量从大到小排序(降序/逆序)
mysql > select countrycode,sum(population) from world.city group by countrycode having sum(population)>50000000 order by sum(population) desc;
实际操作命令演示:select+from+where+group by+聚合函数+having+order by+limit
在利用select语句查询数据信息,结合分组和聚合函数处理之后经过筛选的数据,按照一定数值规律排序显示信息,并限制输出内容行数
实际操作命令演示:
# 查询统计每个国家的人口总数,只显示人口数量超过5千万的信息,并且按照国家人口总数从大到小排序,只显示前三名
## 方式一:使用limit 3只显示前3名
mysql > select countrycode,sum(population) from world.city group by countrycode having sum(population)>50000000 order by sum(population) desc limit 3;
## 方式二:使用limit 0,3只显示前3名,其中0代表是从第几行(不包含本行)开始截取内容,3代表是截取3行内容
mysql > select countrycode,sum(population) from world.city group by countrycode having sum(population)>50000000 order by sum(population) desc limit 0,3;
## 方式三:使用limit 3 offset 0只显示前3名,其中0代表是从第0行(不包含本行)开始截取内容,3代表是截取3行内容
mysql > select countrycode,sum(population) from world.city group by countrycode having sum(population)>50000000 order by sum(population) desc limit 3 offset 0;
# 查询统计每个国家的人口总数,只显示人口数量超过5千万的信息,并且按照国家人口总数从大到小排序,只显示三~五名
## 方式一:从第2行开始,截取3行内容,其中2代表是从第2行(不包含本行)开始截取内容,3代表是截取3行内容
mysql > select countrycode,sum(population) from world.city group by countrycode having sum(population)>50000000 order by sum(population) desc limit 2,3;
## 方式二:跳过前2名,显示后面的三名数据信息,其中2代表是从第2行(不包含本行)开始截取内容,3代表是截取3行内容
mysql > select countrycode,sum(population) from world.city group by countrycode having sum(population)>50000000 order by sum(population) desc limit 3 offset 2;