原标题:oracle的wm_concat()和mysql的group_concat()合并同列变成一行的用法以及和concat()合并不同列的区别 前言 标题几乎已经说的很清楚了,在oracle中,concat...()函数和 “ || ” 这个的作用是一样的,是将不同列拼接在一起;那么wm_concat()是将同属于一个组的(group by)同一个字段拼接在一起变成一行。...mysql是一样的,只不过mysql用的是group_concat()这个函数,用法是一样的,这里就不过多介绍了。...wm_concat()这个个函数的介绍,我觉得都介绍的不是很完美,他们都是简单的说 这个是合并列的函数,但是我总结的概括为:把同组的同列字段合并变为一行(会自动以逗号分隔)。...问题:现在要将同一个同学的所有课程成绩以一行展示,sql怎么写呢?
有时候,一行数据中前面的数据值都是0,从某列开始就是大于0的数值,我们需要知道首先出现大于0的数值所在的单元格。...例如下图1所示,每行数据中非零值出现的位置不同,我们想知道非零值出现的单元格对应的列标题,即第3行中的数据值。 ?...图2 在公式中, MATCH(TRUE,B4:M40,0) 通过B4:M4与0值比较,得到一个TRUE/FALSE值的数组,其中第一个出现的TRUE值就是对应的非零值,MATCH函数返回其相对应的位置...MATCH函数的查找结果再加上1,是因为我们查找的单元格区域不是从列A开始,而是从列B开始的。...ADDRESS函数中的第一个参数值3代表标题行第3行,将3和MATCH函数返回的结果传递给ADDRESS函数返回非零值对应的标题行所在的单元格地址。
,在接下来的几天里逐一发布,分别是“聚集索引体系结构”,“非聚集索引体系结构”,“堆体系结构”,“具有包含列的索引”,“表组织和索引组织”。...注意:上图中的数据页是聚集索引或者堆数据行,而不是非聚集索引的数据页,在非聚集索引中不存在数据页,非聚集索引中的叶子层和根节点与中间节点有点不同,它的指针是指向数据行,且如果非聚集索引如果是包含列索引,...,选择组合字段做索引,组合字段的第一个字段选择很重要,第一个字段一定要经常被使用的字段,例如AB字段作为组合字段,当WHERE用A字段作为检索条件的时候,查询会使用索引查找;当你使用B作为WHERE的检索条件的时候...大量非重复值,如姓氏和名字的组合(前提是聚集索引被用于其他列)。...有关详细信息,请参阅具有包含列的索引。 如果表有聚集索引,则该聚集索引中定义的列将自动追加到表上每个非聚集索引的末端。这可以生成覆盖查询,而不用在非聚集索引定义中指定聚集索引列。
聚集索引的表中记录的物理顺序与索引的排列顺序一致 优点是查询速度快,因为一旦具有第一个索引值的记录被找到,具有连续索引值的记录也一定物理的紧跟其后。...在插入新记录时数据文件为了维持 B+Tree 的特性而频繁的分裂调整,十分低效。 建议使用聚集索引的场合为: A.某列包含了小数目的不同值。 B.排序和范围查找。...看上去聚簇索引的效率明显要低于非聚簇索引, 因为每次使用辅助索引检索都要经过两次 B+树查找, 这不是多此一举吗? 聚簇索引的优势在哪?...也就是说行的位置会随着数据库里数据的修改而发生变化, 使用聚簇索引就可以保证不管这个主键 B+树的节点如何变化, 辅助索引树都不受影响。...建议使用非聚集索引的场合为: a.此列包含了大数目的不同值; b.频繁更新的列 5.组合索引(联合索引) 基于多个字段而创建的索引就称为组合索引。
案例1-可重排、组合 2种组合 有顺序的有序对,用尖括号括起来 无顺序的无序对,使用花括号括起来 需求 ?...1; -- 过滤 笔记:根据具有相同值的字段分组,然后只显示大小大于1的组 基于多个字段 有时候会基于多个字段查找重复行 SELECT col1, COUNT(col1), col2...HAVING -- 只有当列的组合重复时,才认为是重复行,用and进行关联 (COUNT(col1) > 1) AND (COUNT(col2) > 1) AND...SQL实现 查找是同一家人,但是住址不同的记录 自连接和非等值连接的结合 select distinct A1.name, A1.address from Address A1, Address A2...where A1.family_id = A2.family_id -- 同一家人 and A1.address A2.address; -- 住址不同 查找价格相等但是名称不同的商品的记录
,在B+树中的叶子节点中,其实他记录的是完整的行记录。...,再次根据主键索引的B+树,进行二分查找,找到对应的主键所在的叶子节点,然后再取出所有的数据,这种操作叫做回表查询,需要进行检索两次: 非主键索引----> 从非主键索引的data域中获取主键ID--...配图可能不太让人满意,因为col1都是不同的,也就是说在col1就已经能确定结果了。...2.两个单列查询返回行较多,同时查返回行较少,联合索引更高效。...由C1+C2所构成的索引和由C1+C2+C3所构成的索引不仅具有相同的查询范围,而且具有相同的执行结果。
第三范式3NF 首先要满足第二范式,另外非主键列必须直接依赖于主键,不能存在传递依赖。即不能存在:非主键列 A 依赖于非主键列 B,非主键列 B 依赖于主键的情况。...2NF和3NF的区别? 2NF依据是非主键列是否完全依赖于主键,还是依赖于主键的一部分。 3NF依据是非主键列是直接依赖于主键,还是直接依赖于非主键。 事务隔离级别有哪些?...对于每一行数据,存储引擎会对索引列进行哈希计算得到哈希码,并且哈希算法要尽量保证不同的列值计算出的哈希码值是不同的,将哈希码的值作为哈希表的key值,将指向数据行的指针作为哈希表的value值。...聚集索引叶子节点的存储是逻辑上连续的,使用双向链表连接,叶子节点按照主键的顺序排序,因此对于主键的排序查找和范围查找速度比较快。 聚集索引的叶子节点就是整张表的行记录。...导致索引失效的情况: 对于组合索引,不是使用组合索引最左边的字段,则不会使用索引 以%开头的like查询如%abc,无法使用索引;非%开头的like查询如abc%,相当于范围查询,会使用索引 查询条件中列类型是字符串
主键索引 即主索引,根据主键建立索引,不允许重复,不允许空值; 主键:数据库表中一列或列组合(字段)的值,可唯一标识表中的每一行。...' ADD FULLTEXT INDEX ft_index('col'); 组合索引 用多个列组合构建的索引,这多个列中的值不允许有空值。...多列值组成一个索引,专门用于组合搜索,其效率大于索引合并。...不支持部分索引列的匹配查找,因为哈希索引始终使用索引列的全部内容来计算哈希值。例如在数据列 (A, B) 上建立哈希索引,如果查询只有数据列 A,则无法使用该索引。 无法避免表扫描。...聚簇索引和非聚簇索引的区别也就是根据其对应的主键索引和辅助索引的不同特点而实现的。 聚簇索引 说回聚簇索引。先丢个定义。
引擎的自动增长列必须是索引,如果是组合索引也必须是组合索引的第一列。...InnoDB:支持事务和行级锁,是innodb的最大特色。行锁大幅度提高了多用户并发操作的新能。但是InnoDB的行锁,只是在WHERE的主键是有效的,非主键的WHERE都会锁全表的。...B+Tree相对于B-Tree有几点不同: 非叶子节点只存储键值信息。 所有叶子节点之间都有一个链指针。 数据记录都存放在叶子节点中。...因此可以对B+Tree进行两种查找运算:一种是对于主键的范围查找和分页查找,另一种是从根节点开始,进行随机查找。...(10)Extra:该列包含MySQL解决查询的详细信息。 Distinct:MySQL发现第1个匹配行后,停止为当前的行组合搜索更多的行。
非聚集索引(NONCLUSTERED):非聚集索引就相当于使用字典的部首查找,非聚集索引是逻辑上的连续,物理存储并不连续。 ...唯一索引不允许两行具有相同的索引键值。 视图的聚集索引必须唯一。如果要建唯一索引的列有重复值,必须先删除重复值。 CLUSTERED:表示指定创建的索引为聚集索引。...创建索引时,键值的逻辑顺序决定表中对应行的物理顺序。 聚集索引的底层(或称叶级别)包含该表的实际数据行。 NONCLUSTERED:表示指定创建的索引为非聚集索引。创建一个指定表的逻辑排序的索引。...table:表示指定创建索引的表的名称。 view:表示指定创建索引的视图的名称。 column:索引所基于的一列或多列。 指定两个或多个列名,可为指定列的组合值创建组合索引。...而对经常用于查询的字段应该创建索引,但要避免添加不必要的字段。 在条件表达式中经常用到的、不同值较多的列上建立索引,在不同值少的列上不要建立索引。
从上至下优化看过一篇文章,印象深刻,里面将数据库查询优化分为四个大的方向使用钞能力——给DB服务器加物理配置,内存啊,CPU啊,硬盘啊,全上顶配替换存储系统——根据实际的业务情况选择不同的存储数据库,比如用...索引定义中包含聚集索引列。 每个表只能有一个聚集索引,因为数据行本身只能按一个顺序存储。只有当表包含聚集索引时,表中的数据行才按排序顺序存储。 如果表具有聚集索引,则该表称为聚集表。...也可以理解为一个个由Key-Value组成的元素分布在一棵B+树上,Key对应的就是索引,Value对应的就是具体的数据行。非聚集索引非聚集索引具有独立于数据行的结构。...非聚集索引包含非聚集索引键值,并且每个键值项都有指向包含该键值的数据行的指针从非聚集索引中的索引行指向数据行的指针称为行定位器。 行定位器的结构取决于数据页是存储在堆中还是聚集表中。...之前我们讲过在非聚集索引的叶子节点上存放了对应聚集索引的指针,查询在命中非聚集索引的以后要查询非索引列时会根据这个指针去聚集索引上查找相关列,这个动作就是回表;如果我们的非聚集索引上INCLUDE了要查询的列
通过创建设计良好的索引以支持查询,可以显著提高数据库查询和应用程序的性能。索引可以减少为返回查询结果集而必须读取的数据量。索引还可以强制表中的行具有唯一性,从而确保表数据的数据完整性。...按照存储结构的不同,可以将索引分为两类:聚集索引和非聚集索引,聚集索引和非聚集索引的区别是在物理数据的存储方式上。 1.聚集索引: 聚集索引根据数据行的键值在表或视图中排序和存储这些数据行。...聚集索引就相当于使用字典的拼音查找,因为聚集索引存储记录是物理上连续存在的,即拼音 a 过了后面肯定是 b 一样。 2.非聚集索引: 具有独立于数据行的结构。...非聚集索引包含非聚集索引键值,并且每个键值项都有指向包含该键值的数据行的指针。 非聚集索引就相当于使用字典的部首查找,非聚集索引是逻辑上的连续,物理存储并不连续。...它要求数据表中指定列的数据具有正确的数据类型、格式和有效的数据范围。 2.实体完整性:是指所有的记录都应该有一个惟一的标识,以确保数据表中数据的惟一性。
【强制】业务上具有唯一特性的字段,即使是多个字段的组合,也必须建成唯一索引。...order by 最后的字段是组合索引的一部分,并且放在索引组合顺序的最后,避免出现file_sort的情况,影响查询性能。 正例:where a=? and b=?...说明:MySQL并不是跳过offset行,而是取offset+N行,然后返回放弃前offset行,返回 N行,那当offset特别大的时候,效率就非常的低下,要么控制返回的总页数,要么对超过特定阈值的页数进行...,a列的几乎接近于唯一值,那么只需要单建idx_a索引即可。 说明:存在非等号和等号混合判断条件时,在建索引时,请把等号条件的列前置。如:where a>? and b=?...那么即使a的区分度更高,也必须把b放在索引的最前列。 【推荐】防止因字段类型不同造成的隐式转换,导致索引失效。 【参考】创建索引时避免有如下极端误解: 1) 宁滥勿缺。
优化和索引 提升SELECT 的最好方式是使用索引。索引条目作为表数据行的指针,使得查询能够很快的定位到所要查找的数据。所有的MySQL数据类型都可以创建索引。...如果不使用索引,MySQL则需要从第一个数据行开始查找整个数据表,直到找到要查找的数据行,表越大,查找成本越高。如果查找条件的列存在索引,那么MySQL就可以快速定位需要查找的数据位置。...外键优化 如果表有很多的列,查询也有很多的组合,那么有必要将使用率较低的列划分到关联的不同表中,并使用主表主键进行关联。...MySQL可以使用多列索引进行查询,基于索引多列匹配,或者只匹配索引包含的第一列,前两列… 前n列。合理的排序,组合索引列,使之满足大多数的查询需求。...多列索引可以看作为排序数组,数组的每一行包含相关索引列的值组合。 Note 区别于多列索引,可以使用一种基于其它列hash值的列,如果这个hash列,足够短,具备合理的选择性。
平衡树是一颗查找树,并且所有叶子节点位于同一层,如下: image2022-1-5_16-37-10.png B+ Tree是基于B Tree和叶子节点的顺序访问指针进行实现,它具有B Tree的平衡性...非叶子节点按照主键顺序存放,叶子节点存放主键以及对应的行记录。所以对 INNODB 表进行全表顺序扫描会非常快。 非聚集索引:也叫 Secondary Index。...因为无法把数据行存放在两个不同的地方,所以一个表只能有一个聚簇索引。辅助索引的叶子节点的 data 域记录着主键的值,因此在使用辅助索引进行查找时,需要先查找到主键值,然后再到主索引中进行查找。...InnoDB 存储引擎有一个特殊的功能叫“自适应哈希索引”,当某个索引值被使用的非常频繁时,会在 B+Tree 索引之上再创建一个哈希索引,这样就让 B+Tree 索引具有哈希索引的一些优点,比如快速的哈希查找...空间数据索引会从所有维度来索引数据,可以有效地使用任意维度来进行组合查。 常见的索引 1、独立的列 索引列不能是表达式的一部分,也不能是函数的参数,否则无法使用索引。
索引的类别 普通索引:仅加速查询 唯一索引:加速查询 + 列值唯一(可以有null) 主键索引:加速查询 + 列值唯一(不可以有null)+ 表中只有一个 组合索引:多列值组成一个索引,专门用于组合搜索...,其效率大于索引合并 全文索引:对文本的内容进行分词,进行搜索 索引合并:使用多个单列索引组合搜索 覆盖索引:select的数据列只用从索引中就能够取得,不必读取数据行,换句话说查询列要被所建的索引覆盖...同样,对于有些列不应该创建索引。一般来说,不应该创建索引的的这些列具有下列特点: 第一:对于那些在查询中很少使用或者参考的列不应该创建索引。...根据数据库的功能,可以在数据库设计器中创建三种索引:唯一索引、主键索引和聚集索引。 唯一索引 唯一索引是不允许其中任何两行具有相同索引值的索引。...例如,如果在employee表中职员的姓(lname)上创建了唯一索引,则任何两个员工都不能同姓。 主键索引 数据库表经常有一列或列组合,其值唯一标识表中的每一行。该列称为表的主键。
返回某范围内的数据 应 不应 小数目的不同值 应 不应 大数目的不同值 不应 应 频繁更新的列 不应 应 频繁修改索引列 不应 应 一个或极少不同值 不应 不应 建立索引的原则: 1) 定义主键的数据列一定要建立索引...; SQL Server引擎从对应的行查找SalesDate和SalesPersonID列的值。 ...---- 例:表record有620000行,试看在不同的索引下,下面几个 SQL的运行情况: ---- 1.在date上建有一非个群集索引 select count(*) from record where...,在非群集索引下,数据在物理上随机存放在数据页上,在范围查找时,必须执行一次表扫描才能找到这一范围内的全部行。...二、不充份的连接条件: 例:表card有7896行,在card_no上有一个非聚集索引,表account有191122行,在account_no上有一个非聚集索引,试看在不同的表连接条件下,两个SQL的执行情况
非聚集索引和聚集索引的区别在于, 通过聚集索引可以查到需要查找的数据, 而通过非聚集索引可以查到记录对应的主键值 , 再使用主键的值通过聚集索引查找到需要的数据。...辅助索引的存在不影响数据在聚集索引中的组织,因此每张表上可以有多个辅助索引,通过辅助索引来查找数据时,会先遍历辅助索引并通过叶级别的指针获取指向主键索引的主键,然后再通过主键索引来找到一个完整的行记录,...组合索引是普通索引,索引列由两个及以上的列值组合而成。...不同的是,组合索引的键值不是1,而是大于等于2,来看下两个整型列(a,b)组成的组合索引: ?...数据按照逻辑顺序进行排放,叶子结点上a值的顺序是有序的,而b的顺序1,2,1,4,1,2是无序的,所以仅按照b列查询的话,是不可以使用到组合索引的,即mysql组合索引“最左原则”,只有包含最左边的列的查询才可以使用组合索引
由于这些列的取值很少,例如性别列,在查询的结果中,结果集的数据行占了表中数据行的很大比例,即需要在表中搜索的数据行的比例很大。增加索引,并不能明显加快检索速度。 在查询中很少的列不应该创建索引。...如果是组合索引,则列值的组合必须唯一,创建方法和普通索引类似。...在聚簇索引下,因为表中数据存储的物理顺序与索引的逻辑顺序一致,所以在包含范围检查(between、、>=)或使用group by或order by的查询时,一旦找到具有范围中第一个键值的行,...具有后续索引值的行保证物理上毗连在一起而不必进一步搜索,避免了大范围扫描,可以大大提高查询速度。...(2)当创建组合索引时,不能只适用组合索引的部分列进行查询。因为hash索引是把多个列数据合并后再计算Hash值,所以对单独列数据计算Hash值是没有意义的。
领取专属 10元无门槛券
手把手带您无忧上云