#?对history表的value字段去重
select?distinct?history.value?from?zabbix.hosts,zabbix.items,zabbix.history?where?hosts.name="zbxproxy03"?and?items.name="Context?switches?per?second"?and?items.itemid=history.itemid;
#?对history表的clock和value字段去重
select?distinct?history.clock,history.value?from?zabbix.hosts,zabbix.items,zabbix.history?where?hosts.name="zbxproxy03"?and?items.name="Context?switches?per?second"?and?items.itemid=history.itemid;
#?查询去重之后的记录的条数
select?count(distinct?history.clock,history.value)?from?zabbix.hosts,zabbix.items,zabbix.history?where?hosts.name="zbxproxy03"?and?items.name="Context?switches?per?second"?and?items.itemid=history.itemid;
#?下面为?zabbix?库中的?hosts?表指定别名?h
select?h.name,h.host?from?zabbix.hosts?as?h?where?status=0;
#?给h.name字段指定别名“主机名”,inter.ip字段指定别名“ip地址”
mysql>?select?h.name?as?"主机名",inter.ip?as?"ip地址"?from?zabbix.hosts?as?h,zabbix.interface?as?inter?where?h.name="zbxproxy03"?and?h.hostid=inter.hostid;
+------------+----------------+
|?主机名?????|?ip地址?????????|
+------------+----------------+
|?zbxproxy03?|?192.168.11.157?|
+------------+----------------+
1?row?in?set?(0.00?sec)
LIMIT 初始位置,记录数
第1页 limit 0,10 # 按分页显示,每页显示10条记录,从0开始,当前是第1页(第2页的计算方式是,10+0=10,所以,要显示第2页,就要从10开始了)
第2页 limit 10,10 # 按分页显示,每页显示10条记录,从10开始,当前是第2页(第3页的计算方式是,10+10=20,所以,要显示第3页,就要从20开始了)
第3页 limit 20,10 # 按分页显示,每页显示10条记录,从20开始,当前是第3页
第4页 limit 30,10 # 按分页显示,每页显示10条记录,从30开始,当前是第4页
第5页 limit 40,10 # 按分页显示,每页显示10条记录,从40开始,当前是第5页
...依此类推...
select?FROM_UNIXTIME(his.clock),his.value?from?history?as?his?limit?3,5;
LIMIT 记录数
mysql> select hostid,name from zabbix.hosts where status=0 limit 3;
+--------+------------+
| hostid | name |
+--------+------------+
| 10084 | zbxser01 |
| 10331 | {#HV.NAME} |
| 10332 | {#VM.NAME} |
+--------+------------+
3 rows in set (0.00 sec)
LIMIT 记录数 OFFSET 初始位置
mysql>?select?name?from?zabbix.hosts?limit?5?offset?100;
+---------------------------------------------------------------+
|?name??????????????????????????????????????????????????????????|
+---------------------------------------------------------------+
|?Template?Module?Windows?physical?disks?by?Zabbix?agent?active?|
|?Template?Module?Windows?services?by?Zabbix?agent??????????????|
|?Template?Module?Windows?services?by?Zabbix?agent?active???????|
|?Template?Module?Zabbix?agent??????????????????????????????????|
|?Template?Module?Zabbix?agent?active???????????????????????????|
+---------------------------------------------------------------+
5?rows?in?set?(0.00?sec)
ORDER?BY?<字段名>?[ASC|DESC]
mysql>?select?FROM_UNIXTIME(his.clock),his.value?from?history?as?his?order?by?his.clock?desc?limit?0,10;
+--------------------------+---------------------+
|?FROM_UNIXTIME(his.clock)?|?value???????????????|
+--------------------------+---------------------+
|?2022-03-23?11:39:58??????|?0.03327262491210712?|
|?2022-03-23?11:39:57??????|??0.2994525692658531?|
|?2022-03-23?11:39:57??????|?????6.7543337663136?|
|?2022-03-23?11:39:56??????|???6.937363366354516?|
|?2022-03-23?11:39:56??????|??1.0364532470703125?|
|?2022-03-23?11:39:56??????|???2.312458609154667?|
|?2022-03-23?11:39:56??????|?0.24791898308140758?|
|?2022-03-23?11:39:55??????|??2.2958371233088815?|
|?2022-03-23?11:39:55??????|??0.3120714025473114?|
|?2022-03-23?11:39:55??????|???????????????????0?|
+--------------------------+---------------------+
10?rows?in?set?(0.15?sec)
mysql>?
mysql>?select?FROM_UNIXTIME(his.clock),his.value?from?history?as?his?order?by?his.clock,his.value?desc?limit?0,10;
+--------------------------+-------------------+
|?FROM_UNIXTIME(his.clock)?|?value?????????????|
+--------------------------+-------------------+
|?2022-03-16?21:46:16??????|?????????96.085049?|
|?2022-03-16?21:46:16??????|?3.914951000000002?|
|?2022-03-16?21:46:16??????|??????????2.126223?|
|?2022-03-16?21:46:16??????|??????????0.978738?|
|?2022-03-16?21:46:16??????|??????????0.759366?|
|?2022-03-16?21:46:16??????|??????????????0.18?|
|?2022-03-16?21:46:16??????|??????????????0.09?|
|?2022-03-16?21:46:16??????|??????????????0.07?|
|?2022-03-16?21:46:16??????|??????????0.050624?|
|?2022-03-16?21:46:16??????|?????????????????0?|
+--------------------------+-------------------+
10?rows?in?set?(0.17?sec)
注意:在对多个字段进行排序时,排序的第一个字段必须有相同的值,才会对第二个字段进行排序。如果第一个字段数据中所有的值都是唯一的,MySQL 将不再对第二个字段进行排序。
select?FROM_UNIXTIME(his.clock),his.value?from?history?as?his?order?by?his.clock?desc,his.value?asc?limit?0,100;
#?按clock字段从最新到最旧的时间进行排序,并显示前10行记录
mysql>?select?from_unixtime(his.clock),?his.value?from?zabbix.history?as?his?order?by?his.clock?desc?limit?10;
+--------------------------+---------------------+
|?from_unixtime(his.clock)?|?value???????????????|
+--------------------------+---------------------+
|?2022-03-23?15:28:28??????|?0.08122102270804427?|
|?2022-03-23?15:28:28??????|?0.31311299809630666?|
|?2022-03-23?15:28:27??????|?????????????????100?|
|?2022-03-23?15:28:27??????|???????????????????0?|
|?2022-03-23?15:28:27??????|??0.7355883252732085?|
|?2022-03-23?15:28:26??????|???????????????????0?|
|?2022-03-23?15:28:26??????|???????????????????0?|
|?2022-03-23?15:28:26??????|???????????15.969782?|
|?2022-03-23?15:28:25??????|????????????0.007042?|
|?2022-03-23?15:28:24??????|????????????9.618901?|
+--------------------------+---------------------+
10?rows?in?set?(0.16?sec)
在 WHERE 关键词后可以有多个查询条件,这样能够使查询结果更加精确。多个查询条件时用逻辑运算符 AND(&&)、OR(||)或 XOR 隔开。
#?在?events?表中查询?eventid?大于?400,并且?objectid?大于等于?16274?的事件信息,SQL?语句和运行结果如下。
mysql>?select?eventid,objectid,name?from?zabbix.events?where?eventid>400?and?objectid>=16274;?
+---------+----------+------------------------------------------------------------------+
|?eventid?|?objectid?|?name?????????????????????????????????????????????????????????????|
+---------+----------+------------------------------------------------------------------+
|?????429?|????17775?|?More?than?100?items?having?missing?data?for?more?than?10?minutes?|
+---------+----------+------------------------------------------------------------------+
1?row?in?set?(0.00?sec)
#?在?events?表中查询?eventid?大于?400,并且?objectid?大于等于?15000?的事件信息,SQL?语句和运行结果如下。
mysql>?select?eventid,objectid,name?from?zabbix.events?where?eventid>400?and?objectid>=15000;
+---------+----------+------------------------------------------------------------------+
|?eventid?|?objectid?|?name?????????????????????????????????????????????????????????????|
+---------+----------+------------------------------------------------------------------+
|?????429?|????17775?|?More?than?100?items?having?missing?data?for?more?than?10?minutes?|
+---------+----------+------------------------------------------------------------------+
1?row?in?set?(0.00?sec)
OR、AND 和 XOR 可以一起使用,但是在使用时要注意运算符的优先级
在 MySQL 中,LIKE 关键字主要用于搜索匹配字段中的指定内容。其语法格式如下:
[NOT] LIKE '字符串'
其中:
在 where like 的条件查询中,SQL 提供了四种匹配方式。
查询内容包含通配符时,由于通配符的缘故,导致我们查询特殊字符 “%”、“”、“[” 的语句无法正常实现,而把特殊字符用 “[ ]” 括起便可正常查询。
通配符是一种特殊语句,主要用来模糊查询。当不知道真正字符或者懒得输入完整名称时,可以使用通配符来代替一个或多个真正的字符。
%”是 MySQL 中最常用的通配符,它能代表任何长度的字符串,字符串的长度可以为 0。例如,a%b表示以字母 a 开头,以字母 b 结尾的任意长度的字符串。该字符串可以代表 ab、acb、accb、accrb 等字符串。有些情况下若是中文,请使用两个百分号(%%)表示。
案例:从hosts表中的name字段查找所有以“T”开头的记录
mysql> select name from zabbix.hosts where name like 'T%';
+-----------------------------------------------------------------------------+
| name |
+-----------------------------------------------------------------------------+
| Template APP Apache Kafka by JMX |
| Template App Apache Tomcat JMX |
| Template App Apache by HTTP |
| Template App Apache by Zabbix agent |
| Template App Ceph by Zabbix Agent2 |
注意:匹配的字符串必须加单引号或双引号。
案例:从hosts表中的name字段查找所有不以“T”开头的记录
mysql> select name from zabbix.hosts where name not like 'T%';
+--------------+
| name |
+--------------+
| mysql-db02 |
| mysql-master |
| zbxproxy01 |
| zbxproxy02 |
| zbxproxy03 |
| zbxproxy04 |
| zbxser01 |
| zbxser02 |
案例:从hosts表中的name字段查找包含有CPU的记录
mysql> select name from zabbix.hosts where name like '%CPU%';
+----------------------------------------------------+
| name |
+----------------------------------------------------+
| Template Module Cisco OLD-CISCO-CPU-MIB SNMP |
| Template Module HOST-RESOURCES-MIB CPU SNMP |
| Template Module Linux CPU SNMP |
| Template Module Linux CPU by Zabbix agent |
| Template Module Linux CPU by Zabbix agent active |
| Template Module Windows CPU by Zabbix agent |
| Template Module Windows CPU by Zabbix agent active |
+----------------------------------------------------+
7 rows in set (0.00 sec)
“_”只能代表单个字符,字符的长度不能为 0。例如,a_b可以代表 acb、adb、aub 等字符串。 案例:在 hosts 表中,查找所有以数字“01”结尾,且“01”前面只有 6 个字符的名称,SQL 语句和运行结果如下。
mysql> select name,status from zabbix.hosts where status=0 and name like '______01';
+----------+--------+
| name | status |
+----------+--------+
| zbxser01 | 0 |
+----------+--------+
1 row in set (0.00 sec)
默认情况下,LIKE 关键字匹配字符的时候是不区分大小写的。如果需要区分大小写,可以加入 BINARY 关键字。
#?匹配t开头的行记录,并区分大小写
mysql>?select?name,status?from?zabbix.hosts?where?name?like?binary?'t%';
Empty?set,?1?warning?(0.00?sec)
注意:mysql8貌似已经废除了该特性,mysql5是可以的
下面是使用通配符的一些注意事项:
下面是一些使用通配符要记住的技巧。
总之,通配符是一种极其重要和有用的搜索工具,以后我们会经常用到它。
MySQL 提供了 BETWEEN AND 关键字,用来判断字段的数值是否在指定范围内。 BETWEEN AND 需要两个参数,即范围的起始值和终止值。如果字段值在指定的范围内,则这些记录被返回。如果不在指定范围内,则不会被返回。 使用 BETWEEN AND 的基本语法格式如下:
[NOT] BETWEEN 取值1 AND 取值2
案例:查询2022年3月23号上午10点到11点这个时间段的历史数据
#?确定起始时间和结束时间的时间戳
mysql>?select?itemid,from_unixtime(clock),clock,value,ns?from?zabbix.history?where?from_unixtime(clock)?like?'2022-03-23?10:00:02%';
+--------+----------------------+------------+-------+-----------+
|?itemid?|?from_unixtime(clock)?|?clock??????|?value?|?ns????????|
+--------+----------------------+------------+-------+-----------+
|??29162?|?2022-03-23?10:00:02??|?1648000802?|?????0?|?277202868?|?#?起始时间
+--------+----------------------+------------+-------+-----------+
1?row?in?set?(0.70?sec)
mysql>?
mysql>?select?itemid,from_unixtime(clock),clock,value,ns?from?zabbix.history?where?from_unixtime(clock)?like?'2022-03-23?11:00:01%';
+--------+----------------------+------------+-----------+----------+
|?itemid?|?from_unixtime(clock)?|?clock??????|?value?????|?ns???????|
+--------+----------------------+------------+-----------+----------+
|??33064?|?2022-03-23?11:00:01??|?1648004401?|?87.926269?|?39923084?|?#?结束时间
+--------+----------------------+------------+-----------+----------+
1?row?in?set?(0.76?sec)
mysql>?
#?通过BETWEEN?AND?关键字来做范围查询,语句如下
mysql>?select?itemid,from_unixtime(clock),clock,value,ns?from?zabbix.history?where?clock?BETWEEN?1648000802?AND?1648004401;
MySQL 提供了 IS NULL 关键字,用来判断字段的值是否为空值(NULL)。空值不同于 0,也不同于空字符串。如果字段的值是空值,则满足查询条件,该记录将被查询出来。如果字段的值不是空值,则不满足查询条件。使用 IS NULL 的基本语法格式如下:
IS [NOT] NULL
案例:使用 IS NULL 关键字来查询 users 表中 url 字段是 NULL 的记录。
select?*?from?zabbix.users?where?url?not?null;
案例:使用 IS NULL 关键字来查询 users 表中 url 字段是 不为NULL 的记录。
select?*?from?zabbix.users?where?url?is?not?null;
注意:IS NULL 是一个整体,不能将 IS 换成“=”。如果将 IS 换成“=”将不能查询出任何结果,数据库系统会出现“Empty set(0.00 sec)”这样的提示。同理,IS NOT NULL 中的 IS NOT 不能换成“!=”或“<>”。
案例:查询每台主机有多少台
#?查询每台主机名称有多少台
mysql>?select?name?"主机名",count(*)?"数量"??from?zabbix.hosts?where?status=0?and?name?not?like?'%{%'?group?by?name;?
+--------------+--------+
|?主机名???????|?数量???|
+--------------+--------+
|?zbxser01?????|??????1?|
|?mysql-master?|??????1?|
|?mysql-db02???|??????1?|
|?zbxser02?????|??????1?|
|?zbxproxy01???|??????1?|
|?zbxproxy02???|??????1?|
|?zbxproxy04???|??????1?|
|?zbxproxy03???|??????1?|
+--------------+--------+
8?rows?in?set?(0.00?sec)
GROUP BY 关键字可以和 GROUP_CONCAT() 函数一起使用。GROUP_CONCAT() 函数会把每个分组的字段值都显示出来。
案例:根据 hosts 表中的 STATUS 字段进行分组查询,使用 GROUP_CONCAT() 函数将每个分组的 NAME 字段的值都显示出来,需要知道每个状态都对应哪些名称的时候,就很有用了
SELECT?STATUS,GROUP_CONCAT(NAME)?FROM?zabbix.hosts?WHERE?STATUS!=5?GROUP?BY?STATUS;
由结果可以看到,查询结果分为两组,status 字段值为“0”的是一组,值为“3”的是一组,且每组的主机名或者模板名称都显示出来了。
在数据统计时,GROUP BY 关键字经常和聚合函数一起使用。 聚合函数包括 COUNT(),SUM(),AVG(),MAX() 和 MIN()。其中,COUNT() 用来统计记录的条数;SUM() 用来计算字段值的总和;AVG() 用来计算字段值的平均值;MAX() 用来查询字段的最大值;MIN() 用来查询字段的最小值。
案例:根据 hosts 表的 name 字段进行分组查询,使用 COUNT() 函数计算每一组的记录数
mysql>?select?name,count(name)?from?zabbix.hosts?where?status=0?and?name?not?like?'%{%'?group?by?name;
+--------------+-------------+
|?name?????????|?count(name)?|
+--------------+-------------+
|?zbxser01?????|???????????1?|
|?mysql-master?|???????????1?|
|?mysql-db02???|???????????1?|
|?zbxser02?????|???????????1?|
|?zbxproxy01???|???????????1?|
|?zbxproxy02???|???????????1?|
|?zbxproxy04???|???????????1?|
|?zbxproxy03???|???????????1?|
+--------------+-------------+
WITH ROLLUP 关键字用来在所有记录的最后加上一条记录,这条记录是上面所有记录的总和,即统计记录数量。
案例:根据 hosts 表中的 name 字段进行分组查询,并使用 WITH ROLLUP 显示记录的总和
mysql>?select?name,count(name)?from?zabbix.hosts?where?status=0?and?name?not?like?'%{%'?group?by?name?with?rollup;?
+--------------+-------------+
|?name?????????|?count(name)?|
+--------------+-------------+
|?mysql-db02???|???????????1?|
|?mysql-master?|???????????1?|
|?zbxproxy01???|???????????1?|
|?zbxproxy02???|???????????1?|
|?zbxproxy03???|???????????1?|
|?zbxproxy04???|???????????1?|
|?zbxser01?????|???????????1?|
|?zbxser02?????|???????????1?|
|?NULL?????????|???????????8?|?#?这里就是通过with?rollup关键字计算出来的总和
在 MySQL 中,可以使用 HAVING 关键字对分组后的数据进行过滤。 HAVING 关键字和 WHERE 关键字都可以用来过滤数据,且 HAVING 支持 WHERE 关键字中所有的操作符和语法。 但是 WHERE 和 HAVING 关键字也存在以下几点差异:
案例:了解 WHERE 和 HAVING 关键字的相同点和不同点,分别使用 HAVING 和 WHERE 关键字查询出 hosts 表中的name、host、status。SQL 语句和运行结果如下。
#?SELECT?关键字后已经查询出了?status?字段,所以?HAVING可用
mysql>?select?name,host,status?from?zabbix.hosts?having?status=0;
+--------------+--------------+--------+
|?name?????????|?host?????????|?status?|
+--------------+--------------+--------+
|?zbxser01?????|?zbxser01?????|??????0?|
|?{#HV.NAME}???|?{#HV.UUID}???|??????0?|
|?{#VM.NAME}???|?{#VM.UUID}???|??????0?|
|?mysql-master?|?mysql-master?|??????0?|
|?mysql-db02???|?mysql-db02???|??????0?|
|?zbxser02?????|?zbxser02?????|??????0?|
|?zbxproxy01???|?zbxproxy01???|??????0?|
|?zbxproxy02???|?zbxproxy02???|??????0?|
|?zbxproxy04???|?zbxproxy04???|??????0?|
|?zbxproxy03???|?zbxproxy03???|??????0?|
+--------------+--------------+--------+
10?rows?in?set?(0.00?sec)
#?SELECT?关键字后没有?status?字段,所以?HAVING报错了
mysql>?select?name,host?from?zabbix.hosts?having?status=0;????????
ERROR?1054?(42S22):?Unknown?column?'status'?in?'having?clause'
mysql>?
#?SELECT?关键字后没有?status?字段,where是OK的
mysql>?select?name,host?from?zabbix.hosts?where?status=0;??????
+--------------+--------------+
|?name?????????|?host?????????|
+--------------+--------------+
|?zbxser01?????|?zbxser01?????|
|?{#HV.NAME}???|?{#HV.UUID}???|
|?{#VM.NAME}???|?{#VM.UUID}???|
|?mysql-master?|?mysql-master?|
|?mysql-db02???|?mysql-db02???|
|?zbxser02?????|?zbxser02?????|
|?zbxproxy01???|?zbxproxy01???|
|?zbxproxy02???|?zbxproxy02???|
|?zbxproxy04???|?zbxproxy04???|
|?zbxproxy03???|?zbxproxy03???|
+--------------+--------------+
10?rows?in?set?(0.00?sec)
mysql>?
因为在 SELECT 关键字后已经查询出了 status 字段,所以 HAVING 和 WHERE 都可以使用。但是如果 SELECT 关键字后没有查询出 status 字段,这时的having就会报错,where是OK的。 由结果可以看出,如果 SELECT 关键字后没有查询出 HAVING 查询条件中使用的 status 字段,MySQL 会提示错误信息:“having子句”中的列“status”未知”。
案例:使用 HAVING 和 WHERE 关键字分别查询status等于0的结果
#?根据hosts表中的status字段进行分组,并通过group_concat将每个分组字段name的内容显示出来,查询全量,不过滤
mysql>?select?status,group_concat(name)?from?zabbix.hosts?group?by?status\G;????????
***************************?1.?row?***************************
????????????status:?0
group_concat(name):?zbxser01,{#HV.NAME},{#VM.NAME},mysql-master,mysql-db02,zbxser02,zbxproxy01,zbxproxy02,zbxproxy04,zbxproxy03
***************************?2.?row?***************************
????????????status:?3
group_concat(name):?Template?OS?Linux?by?Zabbix?agent,Template?App?Zabbix?Server,Template?App?Zabbix?Proxy,Template?Module?Zabbix?agent,Template?OS?OpenBSD,Template?OS?FreeBSD,Template?OS?AIX,Template?OS?HP-UX,Template?OS?Solaris,Template?OS?Mac?OS?X,Template?OS?Windows?by?Zabbix?agent,Template?App?FTP?Service,Template?App?HTTP?Service,Template?App?HTTPS?Service,Template?App?IMAP?Service,Template?App?LDAP?Service,Template?App?NNTP?Service,Template?App?NTP?Service,Template?App?POP?Service,Template?App?SMTP?Service,Template?App?SSH?Service,Template?App?Telnet?Service,Template?App?Generic?Java?JMX,Template?DB?MySQL,Template?Server?Intel?SR1530?IPMI,Template?Server?Intel?SR1630?IPMI,Template?VM?VMware,Template?VM?VMware?Guest,Template?VM?VMware?Hypervisor,Template?Module?EtherLike-MIB?SNMP,Template?Module?HOST-RESOURCES-MIB?SNMP,Template?Module?ICMP?Ping,Template?Module?Interfaces?Simple?SNMP,Template?Module?Interfaces?SNMP,Template?Module?Interfaces?Windows?SNMP,Template?Module?Generic?SNMP,Template?Net?Alcatel?Timetra?TiMOS?SNMP,T
***************************?3.?row?***************************
????????????status:?5
group_concat(name):?,,,
3?rows?in?set,?1?warning?(0.00?sec)
ERROR:?
No?query?specified
mysql>?
#?根据hosts表中的status字段进行分组,并通过group_concat将每个分组字段name的内容显示出来,通过having关键字过滤为0的结果
mysql>?select?status,group_concat(name)?from?zabbix.hosts?group?by?status?having?status=0;
+--------+-------------------------------------------------------------------------------------------------------------+
|?status?|?group_concat(name)??????????????????????????????????????????????????????????????????????????????????????????|
+--------+-------------------------------------------------------------------------------------------------------------+
|??????0?|?zbxser01,{#HV.NAME},{#VM.NAME},mysql-master,mysql-db02,zbxser02,zbxproxy01,zbxproxy02,zbxproxy04,zbxproxy03?|
+--------+-------------------------------------------------------------------------------------------------------------+
1?row?in?set,?1?warning?(0.01?sec)
#?根据hosts表中的status字段进行分组,并通过group_concat将每个分组字段name的内容显示出来,通过where关键字过滤为0的结果
mysql>?select?status,group_concat(name)?from?zabbix.hosts?where?status=0?group?by?status;
+--------+-------------------------------------------------------------------------------------------------------------+
|?status?|?group_concat(name)??????????????????????????????????????????????????????????????????????????????????????????|
+--------+-------------------------------------------------------------------------------------------------------------+
|??????0?|?zbxser01,{#HV.NAME},{#VM.NAME},mysql-master,mysql-db02,zbxser02,zbxproxy01,zbxproxy02,zbxproxy04,zbxproxy03?|
+--------+-------------------------------------------------------------------------------------------------------------+
1?row?in?set?(0.00?sec)
本文转载于彩虹运维技术栈社区:
https://mp.weixin.qq.com/s/mLerKP2f--8jQjpHuM3ZkQ
本文系转载,前往查看
如有侵权,请联系?cloudcommunity@tencent.com 删除。
本文系转载,前往查看
如有侵权,请联系?cloudcommunity@tencent.com 删除。