数据查询语言(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

Day004-数据库服务查询命令应用-图1

环境准备

# 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;

Day004-数据库服务查询命令应用-图2

实际操作命令演示: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()拼接输出

Day004-数据库服务查询命令应用-图3

实际操作命令演示:获取分组数据信息进行聚合函数处理实践:

# 查询统计每个国家的人口总数(根据国家信息分组聚合,在将分组后所有城市的人口数量进行sum求和运算,实现国家信息对应人口总数的11关系)
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()就可以实现没有出现在分组和聚合函数中的字段,采取拼接整合方式显示,满足分组11关系
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;