第二十九章 SQL命令 DISTINCT

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第二十九章 SQL命令 DISTINCT相关的知识,希望对你有一定的参考价值。

参考技术A 指定仅返回不同值的 SELECT 子句。

可选 DISTINCT 子句出现在 SELECT 关键字之后、可选 TOP 子句和第一个 SELECT-ITEM 之前。

DISTINCT 子句应用于 SELECT 语句的结果集。它将每个不同(唯一)值返回的行数限制为一个任意行。如果未指定 DISTINCT 子句,则默认情况下显示满足选择条件的所有行。 ALL 子句与不指定 DEFAULT 子句相同;如果指定 ALL , SELECT 将返回表中满足选择条件的所有行。

DISTINCT 从句有两种形式:

项目字段必须按列名指定。有效值包括以下值:列名( DISTINCT BY(City) ); %ID (返回所有行);指定列名的标量函数( DISTINCT BY(ROUND(Age,-1) ;指定列名的排序函数( DISTINCT BY(%Exact(City) 。不能按列别名指定字段;尝试这样做会生成 SQLCODE-29 错误。不能按列号指定字段;这将被解释为文字,并返回一行。将文字指定为 DISTINCT 子句中的项值将返回 1 行;返回哪行是不确定的。因此,指定 7 、 ‘Chicago’ 、 ‘’ 、 0 或 NULL 都返回 1 行。但是,如果将文字指定为逗号分隔列表中的项值,则该文字将被忽略,并且 DISTINCT 将为指定字段名的每个唯一组合选择一行。

DISTINCT 子句在 TOP 子句之前应用。如果两者都指定,则 SELECT 只返回具有唯一值的行,唯一值是在 TOP 子句中指定的唯一值行数。

如果 DISTINCT 子句中指定的列包含 NULL (不包含值)行,则 DISTINCT 将返回一行作为 DISTINCT (唯一)值的 NULL ,如以下示例所示:

DISTINCT 子句在嵌入式SQL简单查询中没有意义,因为在这种类型的嵌入式SQL中, SELECT 始终只返回一行数据。但是,嵌入式SQL基于游标的查询可以返回多行数据;在基于游标的查询中, DISTINCT 子句只返回唯一值行。

DISTINCT 子句在 ORDER BY 子句之前应用。因此, DISTINCT 和 ORDER BY 的组合将首先选择满足 DISTINCT 子句的任意行,然后根据 ORDER BY 子句对这些行进行排序。

DISTINCT 和 GROUP BY 这两个记录按指定字段(或多个字段)分组,并为该字段的每个唯一值返回一条记录。它们之间的一个重要区别是 DISTINCT 在分组之前计算聚合函数。 GROUP BY 计算分组后的聚合函数。以下示例显示了这种差异:

DISTINCT 子句可以用一个或多个聚合函数字段指定,尽管这很少有意义,因为聚合函数返回单个值。因此,下面的示例返回单行:

注意:如果将聚合函数作为唯一项或选择项的 DISTINCT 子句与 GROUP BY 子句一起使用,则 DISTINCT 子句将被忽略。可以使用子查询实现 DISTINCT 、聚合函数和 GROUP BY 的预期组合。

根据为字段定义的排序规则类型,将字符串值不同地分组在一起。默认情况下,字符串数据类型字段使用 SQLUPPER 排序规则定义,该排序规则不区分大小写。

如果字段/特性排序规则类型为 SQLUPPER ,则分组的字段值将全部以大写字母返回。要按原始字母大小写对值进行分组,或以原始字母大小写显示分组字段的返回值,请使用 %Exact 排序规则函数。以下示例显示了这一点,这些示例假设 Home_City 字段是使用排序规则类型 SQLUPPER 定义的,并且包含值 ‘New York’ 和 ‘New York’ :

可以使用管理门户优化包含 DISTINCT 子句的查询的查询性能。依次选择系统管理、配置、SQL和对象设置、SQL。查看和编辑 GROUP BY 和 DISTINCT 查询必须生成原始值选项。(此优化也适用于 GROUP BY 子句。)。默认值为“否”。

此默认设置按字母值的大写排序规则对字母值进行分组。此优化利用选定字段的索引。因此,只有在一个或多个选定字段存在索引时才有意义。它对存储在索引中的字段值进行排序;字母字符串以全部大写字母返回。您可以设置此系统范围的选项,然后使用 %exact 排序规则函数为特定查询覆盖它以保留字母大小写。

也可以使用 $SYSTEM.SQL.Util.SetOption() 方法快速区分选项在系统范围内设置此选项。要确定当前设置,请调用 $SYSTEM.SQL.CurrentSettings() ,它显示打开的不同优化设置;默认值为 1 。

指定 DISTINCT 关键字会导致基于游标的嵌入式SQL查询不设置 %ROWID 变量。即使 DISTINCT 不限制返回的行数,也不设置 %ROWID 。下面的示例显示了这一点:

查询行为的这种更改仅适用于基于游标的嵌入式 SQL SELECT 查询。动态 SQL SELECT 查询和非游标嵌入式 SQL SELECT 查询从未设置 %ROWID 。

指定 DISTINCT 关键字会导致查询检索所有当前数据,包括当前事务尚未提交的数据。忽略事务的 READ COMMITTED 隔离模式参数(如果设置);在 READ UNCOMMITTED 模式下检索所有数据。

以下查询为每个不同的 Home_State 值返回一行:

以下查询为每个不同的 Home_State 值返回一行,但返回该行的其他字段。无法预测检索到的是哪一行:

以下查询为 Home_State 和 Office_State 值的每个不同组合返回一行。根据数据的不同,它要么返回更多行,要么返回与上一个示例相同的行数:

以下查询使用 DISTINCT BY 为每个不同的名称长度返回一行:

下面的查询使用 DISTINCT BY 为 FavoriteColors %List 值的每个不同的第一个元素返回一行。它列出 FavoriteColors 为空的不同行:

以下查询按排序规则升序返回从 Sample.Person 检索到的前 20 个不同的 Home_State 值。 “top” 行反映 Sample.Person 中所有行的 ORDER BY 子句排序。

以下查询在主查询和 WHERE 子句子查询中都使用 DISTINCT 。它返回 Sample.Person 中的前 20 个不同的 Home_State 值,这些值也在 Sample.Employee 中。如果未提供子查询 DISTINCT ,它将检索 Sample.Person 中与 Sample.Employee 中随机选择的 Home_State 值匹配的 DISTINCT Home_State 值:

以下查询返回前 20 个不同的 FavoriteColore 值。这反映了 Sample.Person 中所有行的 ORDER BY 子句排序。众所周知, FavoriteColors 字段具有 NULL ,因此 FavoriteColors 为 NULL 的不同行出现在排序规则序列的顶部。

还要注意,在前面的示例中,因为 FavoriteColors 是一个列表字段,所以归类序列包括元素长度字节。因此,以三个字母元素(红色)开头的不同列表值列在以四个字母元素(蓝色)开头的列表值之前。

第二十九章 springboot + zipkin + mysql

zipkin的数据存储可以存在4个地方:

  • 内存(仅用于测试,数据不会持久化,zipkin-server关掉,数据就没有了)
    • 这也是之前使用的
  • mysql
    • 可能是最熟悉的方式
  • es
  • Cassandra

 

一、代码(基于 第二十八章 springboot + zipkin(brave定制-AsyncHttpClient)

1、pom.xml

1         <dependency>
2             <groupId>io.zipkin.brave</groupId>
3             <artifactId>brave-mysql</artifactId>
4             <version>3.9.0</version>
5         </dependency>

2、ZipkinConfig添加如下

1     @Bean
2     public MySQLStatementInterceptorManagementBean mySQLStatementInterceptorManagementBean(Brave brave) {
3         return new MySQLStatementInterceptorManagementBean(brave.clientTracer());
4     }

 

二、数据库

1、建库

  • 自己创建库(eg.mytestdb)就好

2、建表

  • 在mytestdb中执行zipkin准备好的脚本mysql.sql来创建三张表以及各个索引。

mysql.sql位置:https://github.com/openzipkin/zipkin/blob/master/zipkin-storage/mysql/src/main/resources/mysql.sql

或者直接将整个zipkin项目克隆下来,再进去看内容。

mysql.sql内容如下:

 1 CREATE TABLE IF NOT EXISTS zipkin_spans (
 2   `trace_id` BIGINT NOT NULL,
 3   `id` BIGINT NOT NULL,
 4   `name` VARCHAR(255) NOT NULL,
 5   `parent_id` BIGINT,
 6   `debug` BIT(1),
 7   `start_ts` BIGINT COMMENT \'Span.timestamp(): epoch micros used for endTs query and to implement TTL\',
 8   `duration` BIGINT COMMENT \'Span.duration(): micros used for minDuration and maxDuration query\'
 9 ) ENGINE=InnoDB ROW_FORMAT=COMPRESSED;
10 
11 ALTER TABLE zipkin_spans ADD UNIQUE KEY(`trace_id`, `id`) COMMENT \'ignore insert on duplicate\';
12 ALTER TABLE zipkin_spans ADD INDEX(`trace_id`, `id`) COMMENT \'for joining with zipkin_annotations\';
13 ALTER TABLE zipkin_spans ADD INDEX(`trace_id`) COMMENT \'for getTracesByIds\';
14 ALTER TABLE zipkin_spans ADD INDEX(`name`) COMMENT \'for getTraces and getSpanNames\';
15 ALTER TABLE zipkin_spans ADD INDEX(`start_ts`) COMMENT \'for getTraces ordering and range\';
16 
17 CREATE TABLE IF NOT EXISTS zipkin_annotations (
18   `trace_id` BIGINT NOT NULL COMMENT \'coincides with zipkin_spans.trace_id\',
19   `span_id` BIGINT NOT NULL COMMENT \'coincides with zipkin_spans.id\',
20   `a_key` VARCHAR(255) NOT NULL COMMENT \'BinaryAnnotation.key or Annotation.value if type == -1\',
21   `a_value` BLOB COMMENT \'BinaryAnnotation.value(), which must be smaller than 64KB\',
22   `a_type` INT NOT NULL COMMENT \'BinaryAnnotation.type() or -1 if Annotation\',
23   `a_timestamp` BIGINT COMMENT \'Used to implement TTL; Annotation.timestamp or zipkin_spans.timestamp\',
24   `endpoint_ipv4` INT COMMENT \'Null when Binary/Annotation.endpoint is null\',
25   `endpoint_ipv6` BINARY(16) COMMENT \'Null when Binary/Annotation.endpoint is null, or no IPv6 address\',
26   `endpoint_port` SMALLINT COMMENT \'Null when Binary/Annotation.endpoint is null\',
27   `endpoint_service_name` VARCHAR(255) COMMENT \'Null when Binary/Annotation.endpoint is null\'
28 ) ENGINE=InnoDB ROW_FORMAT=COMPRESSED;
29 
30 ALTER TABLE zipkin_annotations ADD UNIQUE KEY(`trace_id`, `span_id`, `a_key`, `a_timestamp`) COMMENT \'Ignore insert on duplicate\';
31 ALTER TABLE zipkin_annotations ADD INDEX(`trace_id`, `span_id`) COMMENT \'for joining with zipkin_spans\';
32 ALTER TABLE zipkin_annotations ADD INDEX(`trace_id`) COMMENT \'for getTraces/ByIds\';
33 ALTER TABLE zipkin_annotations ADD INDEX(`endpoint_service_name`) COMMENT \'for getTraces and getServiceNames\';
34 ALTER TABLE zipkin_annotations ADD INDEX(`a_type`) COMMENT \'for getTraces\';
35 ALTER TABLE zipkin_annotations ADD INDEX(`a_key`) COMMENT \'for getTraces\';
36 
37 CREATE TABLE IF NOT EXISTS zipkin_dependencies (
38   `day` DATE NOT NULL,
39   `parent` VARCHAR(255) NOT NULL,
40   `child` VARCHAR(255) NOT NULL,
41   `call_count` BIGINT
42 ) ENGINE=InnoDB ROW_FORMAT=COMPRESSED;
43 
44 ALTER TABLE zipkin_dependencies ADD UNIQUE KEY(`day`, `parent`, `child`);
View Code

执行脚本之后,数据库出现三张表,如下:

 

三、启动命令

  • STORAGE_TYPE=mysql MYSQL_HOST=192.192.192.192 MYSQL_TCP_PORT=3306 MYSQL_DB=mytestdb MYSQL_USER=root MYSQL_PASS=123456 nohup java -jar zipkin-server-1.5.1-exec.jar &
    • STORAGE_TYPE:存储类型,这里是mysql
    • MYSQL_HOST和MYSQL_TCP_PORT:创建connection
    • MYSQL_USER和MYSQL_PASS:用户名和密码

 

四、测试

启动4个service,然后swagger测试,最后查看zipkin和数据库表即可。

 

参考:

 

以上是关于第二十九章 SQL命令 DISTINCT的主要内容,如果未能解决你的问题,请参考以下文章

“全栈2019”Java第二十九章:数组详解(中篇)

第二十九章 springboot + zipkin + mysql

第二十九章 集成

第二十九章:初识线程

WPF学习第二十九章 元素绑定——将元素绑定到一起

第二十五章 springboot + hystrixdashboard