天道酬勤,学无止境

选择表 1 中的所有列和表 2 中的一列,按什么分组?(Select all columns from table 1 and one column from table two which is grouped by?)

问题

我有表1

id1 name1 address1
1    abc  add1
2    abc  add2

和表 2

id2 name2 mother_name
1    abc   iii
2    abc   jjj

我想做类似的事情

select table1.id1,table1.name1,XMLAGG(XMLELEMENT(E,table1.address1||',')).EXTRACT('//text()), table2.name,
       XMLAGG(XMLELEMENT(E,table2.mother_name||',')).EXTRACT('//text())
from table1 inner join table2 on table1.name1=table2.name2
group by table2.name2;

所以基本上输出会像

id1 name1 addr1      name2 xmlagg
1    abc  add1,add2   abc  iii,jjj

还,

如果我也想对 t1 列之一进行分组怎么办?

回答1

我会在子查询中使用listagg()

select t1.*, xmlagg
from table1 t1 join
     (select name2, listagg(mother_name, ',') within group (order by mother_name) as xmlagg
      from table2 t2
      group by name2
     ) t2
     on t1.name1 = t2.name2;

编辑:

上面的查询在 join 之前进行聚合,因此它可以使用t1.* 。 您也可以在加入后进行:

select t1.name, listagg(mother_name, ',') within group (order by mother_name)
from table1 t1 join
     table2 t2
     on t1.name1 = t2.name2
group by t1.name;

这种形式使得在select添加额外的列变得更加困难,但您可以按您喜欢的任何内容进行聚合。

标签

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 从一个表中选择多个列,但按一个分组(Select multiple columns from a table, but group by one)
    问题 表名称为“ OrderDetails”,列如下: OrderDetailID || ProductID || ProductName || OrderQuantity 我试图同时具有OrderQuantity的总和来选择多个列和按产品ID分组。 Select ProductID,ProductName,OrderQuantity Sum(OrderQuantity) from OrderDetails Group By ProductID 但是,当然,此代码会产生错误。 我必须添加其他列名来进行分组,但这不是我想要的,并且由于我的数据包含很多项目,因此结果出乎意料。 样本数据查询: OrderDetails中的ProductID,ProductName,OrderQuantity 结果如下: ProductID ProductName OrderQuantity 1001 abc 5 1002 abc 23 (ProductNames can be same) 2002 xyz 8 3004 ytp 15 4001 aze 19 1001 abc 7 (2nd row of same ProductID) 预期结果: ProductID ProductName OrderQuantity 1001 abc 12 (group by productID while
  • SQL Server查询优化与事务处理
    博文目录一、索引二、视图三、存储过程四、系统存储过程五、触发器六、事务七、锁 一、索引 索引提供指针以指向存储在表中指定列的数据值,然后根据指定的次序排列这些指针,再跟随指针到达包含该值的列。 1、什么是索引 数据库中的索引与书籍中的目录相似。在一本书中,无需阅读整本书,利用目录就可以快速的查找到所需的信息。在数据库中,索引使数据库程序无须对整个表进行扫描,就可以在其中找到所需的数据。书中的目录就是一个词语列表,其中注明了包含各个词的页码。而数据库中的索引是某个表中一列或若干列值的集合,以及物理表示这些值得数据业的逻辑指针清单。 索引是SQL Server编排数据的内部方法,它为SQL Server提供一种方法来编排查询数据的路由。 索引页是数据库中存储索引的数据页。索引页存放检索数据行的关键字页以及该数据行的地址指针。通过使用索引,可以大大提高数据库的检索速度,改善数据库性能。 2、索引分类 1)唯一索引 唯一索引不允许两行具有相同的索引值。如果现有数据中存在重复的键值,则一般情况下大多数数据库不允许创建唯一索引。当新数据使表中的键值重复时,数据库也拒绝接收此数据。创建了唯一约束,将自动创建唯一索引。尽管唯一索引有助于找到信息,但是为了获得最佳性能,建议使用主键约束。 2)主键索引 在数据库关系图中为表定义一个主键将自动创建主键索引,主键索引是唯一索引的特殊类型
  • 数据库详细思维导图,期末考试、复试必备
    数据库 一:数据库绪论数据(Data)数据库(Database,简称DB)数据库管理系统(DBMS)数据冗余度:数据的安全性(Security)数据的完整性(Integrity)并发(Concurrency)控制数据库恢复(Recovery) 数据模型模型数据模型两级模型的抽象数据模型的三要素概念模型 联系的种类1对1联系1对多联系多对多联系 概念模型的表示方法E-R图 基本数据模型层次模型(Hierarchical Model)网状模型(Network Model)关系模型(Relational Model) 数据库系统的体系结构三层模式:外模式、模式、内模式•二层映象功能:外模式/模式映象和模式/内模式映象 二: 关系代数普通的集合运算删除部分关系的运算合并两个关系元组的运算更名操作 关系代数并Union (∪)交Intersect (∩)差Minus (-)投影Projection(π)广义笛卡儿积(×)选择Selection(σ)条件连接(θ)自然连接 三:关系模型四:关系数据库设计理论对数据库操作时,会出现以下问题 函数依赖几点说明候选码的两个性质范式第一范式(1NF)第二范式(2NF)第三范式(3NF)BCNF范式 五:完整性约束六:数据库设计数据库设计的步骤⒈需求分析阶段⒉概念结构设计阶段⒊逻辑结构设计阶段⒋数据库物理设计阶段⒌数据库实施阶段⒍数据库运行和维护阶段
  • MySQL基础知识整理笔记
    最近在B站学习尚硅谷的MySQL基础课程,整理了一下基础部分的笔记方便自己复习,视频连接:https://www.bilibili.com/video/av49181542?from=search&seid=15224111203571455106 文章目录 本单元目标一、为什么要学习数据库数据库的好处 二、数据库相关概念DBMS、DB、SQL 三、数据库存储数据的特点四、初始MySQLMySQL产品的介绍和安装MySQL服务的启动和停止MySQL服务的登录和退出MySQL的常见命令MySQL的语法规范SQL的语言分类SQL的常见命令 五、DQL语言的学习进阶1:基础查询进阶2:条件查询进阶3:排序查询进阶4:常见函数进阶5:分组查询进阶6:多表连接查询进阶7:子查询进阶8:分页查询进阶9:union联合查询查询总结 六、DML语言插入修改删除 七、DDL语句库和表的管理常见类型常见约束 八、TCL语言数据库事务一、含义二、特点(ACID)三、事务的使用步骤 ★事务的分类:使用到的关键字事务的隔离级别: 九、视图视图的创建视图的增删改查视图逻辑的更新视图的删除视图结构的查看 使用十、变量系统变量自定义变量 十一、存储过程和函数@存储过程1.创建存储过程2.调用存储过程3.查看存储过程4.删除存储过程 @函数1.创建函数2.调用函数3.查看函数4.删除函数函数和存储过程的区别 十二
  • SQL 语法
    1. select 查询 select 查询某些属性列(specific columns)的语法 SELECT column(列的名称),another_column,… FROM mytable(表的名称) select查询所有列 SELECT * FROM mytable(表名) 要添加没有的列 “内容” as 自定义列名称 SELECT id,title,'美国'as country FROM movies; 2.条件查询(constraints) 由于现实中,单单一列的数据可能有上万条,之前的SQL语句很可能运行时会崩溃。 所以我们只需要下载我们需要的数据就好了,为了更精确的查询出特定的数据,我们用下面这个SQL语法:SELECT 查询的WHERE 子句,其中,WHERE后加一个限定条件condition条件查询语法 – WHERE 用来筛选数字类型的属性 SELECT column,another_column,… FROM mytable WHERE condition AND/OR another_condition AND/OR 注:condition描述属性列的 关键字 AND 和 OR 可以组装多个条件, 解释: =,!=,<,<=,>,>=一般在比较大小时使用between 一般用来确定的范围in 一般用来枚举 条件查询语法 – LIKE(模糊查询) 和 %
  • 从没有唯一标识的重复记录中获取第一条记录(Get top first record from duplicate records having no unique identity)
    问题 我需要从下面给出的表中的每个重复记录集中获取第一行。 我需要在视图中使用此查询 请不要临时表,因为我已经通过添加标识列和最小函数并分组来完成它。 我需要没有临时表或表变量的解决方案 这只是示例数据。 原始表中有 1000 条记录,我只需要前 1000 条记录的结果,因此不能使用不同的 我正在使用 SQL Server 2005 谢谢。 回答1 答案具体取决于“前 1000 条不同”记录的含义。 如果你的意思是你想返回最多 1000 条不同的记录,不管表中有多少重复,那么写这个: SELECT DISTINCT TOP 1000 id, uname, tel FROM Users ORDER BY <sort_columns> 如果您只想搜索表中的前 1000 行,并且可能返回的不同行远少于 1000 行,那么您可以使用子查询或 CTE 编写它,如下所示: SELECT DISTINCT * FROM ( SELECT TOP 1000 id, uname, tel FROM Users ORDER BY <sort_columns> ) u 如果您不关心返回哪些记录,则ORDER BY当然是可选的。 回答2 查找已订购 1 次或多次的所有产品...(一种重复记录) SELECT DISTINCT * from [order_items] where productid in
  • 数据库系统概论笔记---第三章 关系数据库标准语言SQL
    数据库系统概论笔记—关系数据库标准语言SQL 本文参考的是中国人民大学王珊老师讲的数据库系统概论,整理自老师的PPT,如有问题请多指教。 目录 数据库系统概论笔记—关系数据库标准语言SQL3.1 SQL概述3.1.1 SQL 的产生与发展3.1.2 SQL的特点1.综合统一2.高度非过程化3. 面向集合的操作方式4. 以同一种语法结构提供多种使用方式5.语言简洁,易学易用 3.1.3 SQL的基本概念 3.2 学生-课程数据库3.3 数据定义3.3.1 模式的定义与删除1.定义模式2. 删除模式 3.3.2 基本表的定义、删除与修改1.定义基本表2.数据类型3. 模式与表4. 修改基本表5.删除基本表 3.3.3 索引的建立与删除1. 建立索引2. 修改索引3. 删除索引 3.3.4 数据字典 3.4 数据查询3.4.1 单表查询1.选择表中的若干列2.选择表中的若干元组查询满足条件的元组 3.ORDER BY子句4.聚集函数5.GROUP BY 子句 3.4.2 连接查询1.等值与非等值连接查询2.自身连接3.外连接4.多表连接 3.4.3 嵌套查询1.带有IN谓词的子查询2.带有比较运算符的子查询3.带有ANY(SOME)或ALL谓词的子查询4.带有EXISTS谓词的子查询 3.4.4 集合查询3.4.5基于派生表的查询3.4.6 Select语句的一般形式 3.5 数据更新3
  • 【MySQL】MySQL能使用索引的情况以及创建索引注意事项
    目录 一、全值匹配 二、匹配左边的列 三、匹配列前缀 四、匹配范围值 五、精确匹配某一列并范围匹配另外一列 六、排序 七、分组 八、使用联合索引进行排序和分组的注意事项 九、不可以使用索进行排序或分组的情况 ASC、DESC混用 十、索引失效总结 十一、如何建立索引 11.1 考虑索引选择性 11.2 考虑前缀索引 十二、总结 条件:一个表创建了(b,c,d)联合索引,该索引是一个二级索引 一、全值匹配 select * from t1 where b = 1 and c = 1 and d = 1; 查询优化器会分析这些查询条件并且按照可以使用的索引中列的顺序来决定先使用哪个查询条件。 二、匹配左边的列 select * from t1 where b = 1; select * from t1 where b = 1 and c = 1; 下面这个sql是用不到索引的 select * from t1 where c = 1; 因为B+树先是按照b列的值排序的,在b列的值相同的情况下才使用c列进行排序,也就是说b列的值不同的记录中c的值可能是无序的。而现在你跳过b列直接根据c的值去查找,这是做不到的。不符合最左前缀原则。 三、匹配列前缀 如果只给出后缀或者中间的某个字符串,比如: select * from t1 where b like '%101%'; 这种是用不到索引的
  • Oracle SQL语句性能优化方法大全
    下面列举一些工作中常常会碰到的Oracle的SQL语句优化方法: 1、SQL语句尽量用大写的; 因为oracle总是先解析SQL语句,把小写的字母转换成大写的再执行。 2、选择最有效率的表名顺序(只在基于规则的优化器中有效): ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先处理,在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表。如果有3个以上的表连接查询, 那就需要选择交叉表(intersection table)作为基础表, 交叉表是指那个被其他表所引用的表. 3、WHERE子句中的连接顺序: ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他 WHERE条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾 4、使用表的别名: 当在SQL语句中连接多个表时, 尽量使用表的别名并把别名前缀于每个列上。这样一来, 就可以减少解析的时间并减少那些由列歧义引起的语法错误。 5、SELECT子句中避免使用 ‘ * ‘: ORACLE在解析的过程中, 会将'*' 依次转换成所有的列名, 这个工作是通过查询数据字典完成的, 这意味着将耗费更多的时间 6、使用DECODE函数来减少处理时间:
  • 【SQL进阶】03.执行计划之旅1 - 初探【T-SQL】系列文章全文目录(2017-06-26更新)
    当我们想要去分析SQL语句存在很慢时,需要有一个分析工具帮助我们分析SQL语句中哪些地方存在性能问题,而这个分析工具就是执行计划,看懂执行计划就能知道哪些地方有性能问题,然后结合自己已有的SQL知识分析为什么这些地方有性能问题,进而尝试提出解决方案,并测试自己的方案是否能提高性能,以及方案是否合理。听到大牛们说执行计划,总是很惶恐,是对知识的缺乏的惶恐,所以必须得学习执行计划,以减少对这一块知识的惶恐,下面是对执行计划的第一讲-理解执行计划。本系列【T-SQL】主要是针对T-SQL的总结。SQL基础【T-SQL基础】01.单表查询-几道sql查询题【T-SQL基础】02.联接查询【T-SQL基础】03.子查询【T-SQL基础】04.表表达式-上篇【T-SQL基础】04.表表达式-下篇【T-SQL基础】05.集合运算【T-SQL基础】06.透视、逆透视、分组集【T-SQL基础】07.数据修改【T-SQL基础】08.30分钟全面解析-SQL事务+隔离级别+阻塞+死锁(推荐 +165)【T-SQL基础】09.可编程对象SQL进阶【SQL进阶】01.好用的SQL TVP~~独家赠送[增-删-改-查]的例子【SQL进阶】02.理解SQL查询的底层原理(推荐 +5)【SQL进阶】03.执行计划之旅1 - 初探 (最新)SQL性能调优【SQL性能调优】01.TempDB的使用和性能问题 持续更新
  • SQL 语法速成手册
    本文针对关系型数据库的一般语法。限于篇幅,本文侧重说明用法,不会展开讲解特性、原理。本文内容包括基本概念、增删改查、子查询、连接和组合、函数、排序和分组、数据定义、事务处理、权限管理等等。本文攻击 1.2W 字,可以收藏转发。 一、基本概念 数据库术语 数据库(database):保存有组织的数据的容器(通常是一个文件或一组文件)。 数据表(table) :某种特定类型数据的结构化清单。 模式(schema):关于数据库和表的布局及特性的信息。模式定义了数据在表中如何存储,包含存储什么样的数据,数据如何分解,各部分信息如何命名等信息。数据库和表都有模式。 列(column):表中的一个字段。所有表都是由一个或多个列组成的。 行(row):表中的一个记录。 主键(primary key):一列(或一组列),其值能够唯一标识表中每一行。 SQL 语法 SQL(Structured Query Language),标准 SQL 由 ANSI 标准委员会管理,从而称为 ANSI SQL。各个 DBMS 都有自己的实现,如 PL/SQL、Transact-SQL 等。 SQL 语法结构 SQL 语法结构包括: 子句 - 是语句和查询的组成成分。(在某些情况下,这些都是可选的。) 表达式 - 可以产生任何标量值,或由列和行的数据库表 谓词 - 给需要评估的 SQL 三值逻辑(3VL)(true
  • 2021-03-30
    本单元目标 一、为什么要学习数据库 二、数据库的相关概念 DBMS、DB、SQL 三、数据库存储数据的特点 四、初始MySQL MySQL产品的介绍 MySQL产品的安装 ★ MySQL服务的启动和停止 ★ MySQL服务的登录和退出 ★ MySQL的常见命令和语法规范 五、DQL语言的学习 ★ 基础查询 ★ 条件查询 ★ 排序查询 ★ 常见函数 ★ 分组函数 ★ 分组查询 ★ 连接查询 ★ 子查询 √ 分页查询 ★ union联合查询 √ 六、DML语言的学习 ★ 插入语句 修改语句 删除语句 七、DDL语言的学习 库和表的管理 √ 常见数据类型介绍 √ 常见约束 √ 八、TCL语言的学习 事务和事务处理 九、视图的讲解 √ 十、变量 十一、存储过程和函数 十二、流程控制结构 数据库的好处 1.持久化数据到本地 2.可以实现结构化查询,方便管理 数据库相关概念 1、DB:数据库,保存一组有组织的数据的容器 2、DBMS:数据库管理系统,又称为数据库软件(产品),用于管理DB中的数据 3、SQL:结构化查询语言,用于和DBMS通信的语言 数据库存储数据的特点 1、将数据放到表中,表再放到库中 2、一个数据库中可以有多个表,每个表都有一个的名字,用来标识自己。表名具有唯一性。 3、表具有一些特性,这些特性定义了数据在表中如何存储,类似java中 “类”的设计。 4、表由列组成
  • 哪些数据库是行存储?哪些是列存储?有什么区别?
    大多数数据库系统存储一组数据记录,这些记录由表中的列和行组成。字段是列和行的交集:某种类型的单个值。属于同一列的字段通常具有相同的数据类型。例如,如果我们定义了一个包含用户数据的表,那么所有的用户名都将是相同的类型,并且属于同一列。在逻辑上属于同一数据记录(通常由键标识)的值的集合构成一行。对数据库进行分类的方法之一是按数据在磁盘上的存储方式进行分类:按行或按列进行分类。表可以水平分区(将属于同一行的值存储在一起),也可以垂直分区(将属于同一列的值存储在一起)。图1-2描述了这种区别:a)显示了按列分区的值,b)显示了按行分区的值。▲图1-2:面向列和行的存储中的数据布局面向行的数据库的例子很多:MySQL、PostgreSQL和大多数传统的关系数据库。而两个开源的、面向列数据存储的先驱则是MonetDB和C-Store(C-Store是Vertica的开源前身)。01 面向行的数据布局面向行的数据库按记录或行来存储数据。它的布局非常接近表格的数据表示方法,即其中每一行都具有相同的字段集合。例如,面向行的数据库可以有效地存储用户条目,其中包含姓名、出生日期和电话号码:| ID | Name | Birth Date | Phone Number || 10 | John | 01 Aug 1981 | +1 111 222 333 || 20 | Sam | 14 Sep 1988
  • mysql
    #查询game表中的全部信息 SELECT * FROM game; #查询game表中的全部信息,并且在表名前面加库名,给表取别名为zz SELECT * FROM 王者荣耀.game AS zz; #查询game表中的类型一列的信息 SELECT 类型 FROM game; #查询game表中的类型一列的信息,并且去重 SELECT DISTINCT 类型 FROM game; #查询game表中的类型一列的信息,并且去重,给表名和字段前面分别加库名和表名、取别名。 SELECT DISTINCT aa.类型 AS bb FROM 王者荣耀.game AS aa; #查询game表中类型是法师的全部信息(使用三种方法) SELECT * FROM game WHERE 类型 = '法师'; SELECT * FROM game WHERE 类型 LIKE '法师'; SELECT * FROM game WHERE 类型 in ( '法师'); #查询game表中,类型是法师,并且等级大于30的全部信息 SELECT * FROM game WHERE 类型 = '法师' AND 等级 > 30; #查询game表中,类型是法师,或者等级大于60的全部信息 SELECT * FROM game WHERE 类型 = '法师' OR 等级 > 60; #查询game表中
  • Mysql
    #查询game表中的全部信息 SELECT * FROM game; #查询game表中的全部信息,并且在表名前面加库名,给表取别名为zz SELECT * FROM 王者荣耀.game AS zz; #查询game表中的类型一列的信息 SELECT 类型 FROM game; #查询game表中的类型一列的信息,并且去重 SELECT DISTINCT 类型 FROM game; #查询game表中的类型一列的信息,并且去重,给表名和字段前面分别加库名和表名、取别名。 SELECT DISTINCT aa.类型 AS bb FROM 王者荣耀.game AS aa; #查询game表中类型是法师的全部信息(使用三种方法) SELECT * FROM game WHERE 类型 = '法师'; SELECT * FROM game WHERE 类型 LIKE '法师'; SELECT * FROM game WHERE 类型 in ( '法师'); #查询game表中,类型是法师,并且等级大于30的全部信息 SELECT * FROM game WHERE 类型 = '法师' AND 等级 > 30; #查询game表中,类型是法师,或者等级大于60的全部信息 SELECT * FROM game WHERE 类型 = '法师' OR 等级 > 60; #查询game表中
  • Pandas常用函数速查手册中文版
    对于数据科学家,无论是数据分析还是数据挖掘来说,Pandas是一个非常重要的Python包。它不仅提供了很多方法,使得数据处理非常简单,同时在数据处理速度上也做了很多优化,使得和Python内置方法相比时有了很大的优势。如果你想学习Pandas,建议先看两个网站。(1)官网:Python Data Analysis Library (2)十分钟入门Pandas:10 Minutes to pandas 在第一次学习Pandas的过程中,你会发现你需要记忆很多的函数和方法。所以在这里我们汇总一下Pandas官方文档 中比较常用的函数和方法,以方便大家记忆。同时,我们提供一个PDF版本,方便大家打印。pandas-cheat-sheet.pdf 关键缩写和包导入在这个速查手册中,我们使用如下缩写:df:任意的Pandas DataFrame对象s:任意的Pandas Series对象同时我们需要做如下的引入:import pandas as pd import numpy as np 导入数据pd.read_csv(filename):从CSV文件导入数据pd.read_table(filename):从限定分隔符的文本文件导入数据pd.read_excel(filename):从Excel文件导入数据pd.read_sql(query, connection_object)
  • 【DBAplus】SQL优化:一篇文章说清楚Oracle Hint的正确使用姿势
    一、提示(Hint)概述1为什么引入Hint?Hint是Oracle数据库中很有特色的一个功能,是很多DBA优化中经常采用的一个手段。那为什么Oracle会考虑引入优化器呢?基于代价的优化器是很聪明的,在绝大多数情况下它会选择正确的优化器,减轻DBA的负担。 但有时它也聪明反被聪明误,选择了很差的执行计划,使某个语句的执行变得奇慢无比。此时就需要DBA进行人为的干预,告诉优化器使用指定的存取路径或连接类型生成执行计划,从而使语句高效地运行。Hint就是Oracle提供的一种机制,用来告诉优化器按照告诉它的方式生成执行计划。 2不要过分依赖Hint当遇到SQL执行计划不好的情况,应优先考虑统计信息等问题,而不是直接加Hint了事。如果统计信息无误,应该考虑物理结构是否合理,即没有合适的索引。只有在最后仍然不能SQL按优化的执行计划执行时,才考虑Hint。 毕竟使用Hint,需要应用系统修改代码,Hint只能解决一条SQL的问题,并且由于数据分布的变化或其他原因(如索引更名)等,会导致SQL再次出现性能问题。3Hint的弊端Hint是比较"暴力"的一种解决方式,不是很优雅。需要开发人员手工修改代码。Hint不会去适应新的变化。比如数据结构、数据规模发生了重大变化,但使用Hint的语句是感知变化并产生更优的执行计划。Hint随着数据库版本的变化,可能会有一些差异、甚至废弃的情况。此时
  • 【DBAplus】SQL优化:一篇文章说清楚Oracle Hint的正确使用姿势
    【DBAplus】SQL优化:一篇文章说清楚Oracle Hint的正确使用姿势 原创 2016-09-12 韩锋 作者介绍韩锋,宜信技术研发中心数据库架构师。精通多种关系型数据库,曾任职于当当网、TOM在线等公司,曾任多家公司首席DBA、数据库架构师等职,多年一线数据库架构、设计、开发经验。著有《SQL优化最佳实践》一书。一、提示(Hint)概述1为什么引入Hint?Hint是Oracle数据库中很有特色的一个功能,是很多DBA优化中经常采用的一个手段。那为什么Oracle会考虑引入优化器呢?基于代价的优化器是很聪明的,在绝大多数情况下它会选择正确的优化器,减轻DBA的负担。 但有时它也聪明反被聪明误,选择了很差的执行计划,使某个语句的执行变得奇慢无比。此时就需要DBA进行人为的干预,告诉优化器使用指定的存取路径或连接类型生成执行计划,从而使语句高效地运行。Hint就是Oracle提供的一种机制,用来告诉优化器按照告诉它的方式生成执行计划。 2不要过分依赖Hint当遇到SQL执行计划不好的情况,应优先考虑统计信息等问题,而不是直接加Hint了事。如果统计信息无误,应该考虑物理结构是否合理,即没有合适的索引。只有在最后仍然不能SQL按优化的执行计划执行时,才考虑Hint。 毕竟使用Hint,需要应用系统修改代码,Hint只能解决一条SQL的问题,并且由于数据分布的变化或其他原因
  • 【DBAplus】SQL优化:一篇文章说清楚Oracle Hint的正确使用姿势
    【DBAplus】SQL优化:一篇文章说清楚Oracle Hint的正确使用姿势 原创 2016-09-12 韩锋 作者介绍韩锋,宜信技术研发中心数据库架构师。精通多种关系型数据库,曾任职于当当网、TOM在线等公司,曾任多家公司首席DBA、数据库架构师等职,多年一线数据库架构、设计、开发经验。著有《SQL优化最佳实践》一书。一、提示(Hint)概述1为什么引入Hint?Hint是Oracle数据库中很有特色的一个功能,是很多DBA优化中经常采用的一个手段。那为什么Oracle会考虑引入优化器呢?基于代价的优化器是很聪明的,在绝大多数情况下它会选择正确的优化器,减轻DBA的负担。 但有时它也聪明反被聪明误,选择了很差的执行计划,使某个语句的执行变得奇慢无比。此时就需要DBA进行人为的干预,告诉优化器使用指定的存取路径或连接类型生成执行计划,从而使语句高效地运行。Hint就是Oracle提供的一种机制,用来告诉优化器按照告诉它的方式生成执行计划。 2不要过分依赖Hint当遇到SQL执行计划不好的情况,应优先考虑统计信息等问题,而不是直接加Hint了事。如果统计信息无误,应该考虑物理结构是否合理,即没有合适的索引。只有在最后仍然不能SQL按优化的执行计划执行时,才考虑Hint。 毕竟使用Hint,需要应用系统修改代码,Hint只能解决一条SQL的问题,并且由于数据分布的变化或其他原因
  • 为什么在Postgres中没有“ SELECT foo。*…GROUP BY foo.id”?(Why no “SELECT foo.* … GROUP BY foo.id” in Postgres?)
    问题 我有这样的查询: select foo.*, count(bar.id) from foo inner join bar on foo.id = bar.foo_id group by foo.id 这与SQLite和MySQL一起使用效果很好。 但是Postgres抱怨我没有在group by子句中包括foo的所有列。 为什么是这样? foo.id是唯一的还不够吗? 回答1 以防万一其他人偶然发现了这个问题: 从PostgreSQL 9.1开始,在group by子句中列出主键的列就足够了(因此问题中的示例现在可以使用)。 回答2 某些数据库对此有所放松,无论是好是坏。 查询是不确定的,因此结果同样是不确定的。 如果数据库允许查询,它将从每个组中返回一条记录,并且不在乎哪一条。 其他数据库更具体,需要您从组中指定要使用的值。 他们不会让您编写结果不确定的查询。 您可以选择的没有聚合的唯一值是group by子句中的值: select foo.id, count(bar.id) from foo inner join bar on foo.id = bar.foo_id group by foo.id 您可以使用聚合来获取其他值: select foo.id, min(foo.price), count(bar.id) from foo inner join bar on