精华内容
下载资源
问答
  • 平时会经常用到自关联的树形结构来存储树形结构的数据,数据之间的层次联系代表着树形结构中的父子关系,并通常用中两个列间的联系来描述,如下中ID 和 PARENT_ID,ID为家族成员编号,PARENT_ID为父母编号,...

    平时会经常用到自关联的树形结构表来存储树形结构的数据,数据之间的层次联系代表着树形结构中的父子关系,并通常用表中两个列间的联系来描述,如下表中ID 和 PARENT_ID,ID为家族成员编号,PARENT_ID为父母编号,从而可以形成一个树形结构的家族关系。

     

    一、基本用法

    基本语句:select ··· from ··· connect by prior ··· start with ··· order siblings by ···

    如家族树的表查询语句为:

    select * from family_tree connect by prior  id = parent_id  start with  appellation = '爷爷' order siblings by  age  desc

    查询结果如下:(从‘爷爷’开始往子孙后代遍历查询,并且兄弟节点间按年龄由大到小排序)

     

    二、connect by & where  剪枝和去点

    connect by 表明每行数据将是按层次顺序检索,并规定了按照什么规则将数据进行关联。

    不仅如此connect by 还可以限制查询的分支,通过限制条件进行剪枝:还是之前的查询,但这次要求不查询 '小姑' 及其子女

    select * from family_tree connect by prior  id = parent_id  and appellation <> '小姑' start with  appellation = '爷爷' order siblings by  age  desc

    查询结果如下:还是之前的查询,但这次要求不查询 '小姑' 及其子女

     

    若只想不查询 '小姑' 但其子女还是需要查询的,则需要使用 where 进行限制,也就是只去除单个或多个节点:

    select * from family_tree where appellation <> '小姑' connect by prior  id = parent_id  start with  appellation = '爷爷' order siblings by  age  desc

    查询结果如下:'小姑' 节点被去掉了,而其子女节点仍然还在。

     

     

    where 子句不能在 connect by 子句的后面,否则会报错。

     

    三、关于prior

    prior需要和connect by 一起使用,且必须放置在 链接关系的两列中某一列的前面,用来标记哪一列是 '子标识'。从而决定了检索的顺序。

    若prior放在 '子标识' 的前面则检索顺序是按照由上自下(由根到叶)的顺序检索。(这时SQL语句标识到了正确的 '子标识')

    若prior放在 '父标识' 的前面则检索顺序是按照自下而上(由叶到根)的顺序检索。(这时SQL语句标识到了错误的 '子标识',并将 '父标识' 错认为了 '子标识' 所以检索方向正好相反了)

    如,下面的语句,将prior 放在 parent_id(父标识) 前,则检索方向就是子孙向爷爷检索。

    select * from family_tree connect by id = prior parent_id  start with  appellation = '表弟' order siblings by  age  desc

    查询结果如下:

     

    四、start with 定义查找起始节点

    start with 子句规定了从哪个或哪些节点开始检索树。若start with 子句被省略了,则所有的节点都是起始节点。

    如,下面的语句就只查询以 '大伯' 和 '小姑' 为起始节点的分支。

    select * from family_tree connect by prior id = parent_id  start with  appellation = '大伯' or appellation = '小姑' order siblings by  age  desc

    查询结果如下:

     

    五、order siblings by 同层级的兄弟节点间的排序

    order siblings by 顾名思义是同层级的兄弟节点间的排序,上面的语句中有都用到了这样的排序。

    select * from family_tree connect by prior  id = parent_id  start with  appellation = '爷爷' order siblings by age asc

    查询结果:

    同样的,order by 子句也是可以应用的,但是所有节点一起排序,这样会打乱树形结构

    select * from family_tree connect by prior  id = parent_id  start with  appellation = '爷爷' order by age asc

     

    六、伪列 level

    level 需要和connect by 子句一起使用表示节点在树结构中的层级,根节点为 1,根节点的子节点为 2,依次类推。这里的根节点是 start with 限制的起始节点。

    如下语句:

    select level, T.* from family_tree connect by prior  id = parent_id  start with  appellation = '爷爷' order by age desc

    查询结果如下,包括了 level字段

     

    七、子句执行顺序:from --> start with --> connect by --> where --> select --> order by

    PS:

    1、where 是在 connect by 后执行的(虽然写法是需要写在前面),所以 where 才有只去节点不剪分支(在树形关系结构都查询出来后,才通过 where 进行限制筛选)。

    2、order by 是最后才执行,所以使用order by 不用 order siblings by 会打乱已有的树形结构检索,只按 order by 子句排序。

     

    8、前序遍历

    树形查询子句是递归处理过程,树的根节点向叶节点递归查询时,遍历顺序是按照树的前序遍历进行的。

    转载于:https://www.cnblogs.com/Aoobruce/p/8779716.html

    展开全文
  • 创建视图操作步骤:查询→新建→编辑SQL语句→运行→视图→刷新。展开视图菜单栏即可看到新建的视图。2.视图语句结构:create view 视图名称(<视图列名1>,<视图列名2>,...)as <sele...

    一.视图

    1.视图是什么

    视图中存放的是SQL语句。视图运行时从表中查找数据,保存到一张临时表中,当客户端与数据库的连接断开以后,临时表会自动消失。

    2.如何创建视图

    1.创建视图操作步骤:查询→新建→编辑SQL语句→运行→视图→刷新。展开视图菜单栏即可看到新建的视图。

    2.视图语句结构:

    create view 视图名称(<视图列名1>,<视图列名2>,...)as <select查询语句>,此处select语句的排列顺序与视图中的排列顺序一一对应,列的名称可以不同。

    3.视图的优点和限制

    1.视图的优点

    • 视图无需保存数据,节省了存储设备的空间。
    • 视图会随着原表的变化而更新,可将频繁使用的select语句保存成视图,能很好的提高使用效率,减少工作量的同时还能提高系统性能。

    2.视图的限制

    • 多重视图会降低SQL的性能,应避免在视图的基础上创建视图。
    • 不能往视图中插入数据,否则会报错。
    • 定义视图时不能使用order by子句。
    • 通过多表或group by对原表聚合得到的视图是不能进行自动更新。

    二.子查询

    常用的子查询有三种,分别是普通子查询,标量子查询和关联子查询。三种子查询相关内容如下。

    1.普通子查询

    • 子查询是什么

    子查询是一次性的SQL语句。子查询在 select语句执行完毕后就会消失。子查询返回的结果可以是多行或者单一的值。

    • 子查询的使用

    1.放在from子句中,示例如下

    8d91ad93428457ba326e5a6515f2602a.png

    2.放在where子句里,与in、all、any等构成复杂查询,示例如下

    521b2698e512c6fa9bd46802082c2176.png

    da9f1dd65486bfd5ff2d41bc31e7ec39.png

    756d57e843f9febf44191980809595b6.png
    • 子查询运行顺序

    子查询作为内层查询会先执行,然后再执行外层的select语句。

    • 子查询注意事项

    1.根据使用目的选择,如果频繁使用某个SQL语句,则保存为视图,如果偶尔使用,则选择子查询

    2.如果2个数字进行比较,如a>3*all(b),在SQL中不能这样书写,因为3*all(b)得到的不是一个数字,而是一个集合。正确的书写方式应为a÷3>all(b)。

    3.避免使用多层嵌套子查询。如果使用多层嵌套子查询,这样不易于明白SQL语句,同时会降低SQL性能,对后期维护也会带来不必要的麻烦。

    4.子查询中'as'关键字与查询名称都可省略。如:select (<列名1>,<列名2>,...) from(子查询)as 查询名称 中的as和查询名称可以省略。

    2.标量子查询

    • 什么是标量子查询

    标量子查询是子查询的一种,但标量子查询只能返回1行1列的结果,即返回的是一个值。它可以与比较运算符一起使用,与in、or、between一起实现复杂查询。

    • 标量子查询如何使用

    通常能够使用常数或者列名的地方,无论是select子句、group by子句、having子句,还是order by子句,几乎所有的地方都可以使用标量子查询。

    1b0d9bbf913c5a1220fa3db35cdef20f.png

    39bd946987ef4ed6869934dc4d19a016.png

    469338a9acbac1c5c77e7b20e2ab1ab6.png
    • 标量子查询注意事项

    标量子查询不能返回多行结果,如果返回多行结果即不是标量子查询

    3.关联子查询

    • 什么是关联子查询

    关联子查询也是子查询的一种,它与group by子句一样,也可以对表中的集合数据进行切分,它在细分的组内进行比较时使用。

    • 关联子查询的使用方法,示例如下

    59dfc1064a4895f2ae6e0c1c323af825.png

    上图中,s1与s2为关联子查询的关联条件。

    • 关联子查询注意事项

    1.关联子查询的关联条件一定要写在子查询中,否则将发生错误无法正确执行。

    2.关联子查询内部设定的关联名称,只能在该子查询内部使用,因为内部可以看到外部的信息,而外部是看不到内部的关联名称的。

    三.SQLZOO练习

    f566308949935c89e9640b6fc565c0ca.png

    3dce344bfa3d17c07a0c9724ad74515a.png

    20c61377d14175eff5a3b4d6ba48f230.png

    1dd7308d13f75911db78812a7d66521d.png

    ffb217a39fdcb36bc147f80561da656c.png

    3a8a7c20d7b97b3943eb016165c90954.png

    09bf6164a64c586c4abc7e5883b0e547.png

    dec9a130b2c1cf801baffc5afe9ce042.png

    d82b90835ecc1a5e5358c778bcf44812.png

    1c12cfe7c153e8dbd828208559795fb2.png
    展开全文
  • 数据库多表查询关联查询SQL语句

    千次阅读 2019-09-11 20:15:09
    意思就是向左关联某个表记录,以左边的那个表的记录为基准,通过关联条件,将关联表的相关符合要求的记录一起找出来,找出来的记录条数就是左边表的记录数 具体用法如下: SELECT column_name(s) FROM table_name1...

    LEFT JOIN  ON 关键字会从左表那里返回所有的行,即使在右表中没有匹配的行。意思就是向左关联某个表记录,以左边的那个表的记录为基准,通过关联条件,将关联表的相关符合要求的记录一起找出来,找出来的记录条数就是左边表的记录数

    具体用法如下:

    SELECT  column_name(s)  FROM table_name1 LEFT JOIN table_name2 ON table_name1.name = table_name2.name

    SELECT  column_name(s)  FROM table_name1 LEFT JOIN table_name2 ON table_name1.name = table_name2.name

    也可以三级联动查询 :如下数据表

    查询语句:

    select 
    
    u.user_id, u.user_name,u.user_sex,c.college_name,s.subject_name, s.achievement
    
    from user u
                     LEFT JOIN  subject s ON   s.user_number=u. user_id
    
                     LEFT JOIN  college c ON c.subject_number=s.subject_id;
    


    参考博客:https://blog.csdn.net/djr2ss666666/article/details/79808235

    展开全文
  • 找到慢查询SQL 找到优化目标。一个项目中有很多SQL,不要一上来就逐一优化,应该找出需要优化的SQL。客户端需要花费很长时间等待查询结果的慢查询是最需要优化的。开发人员可以通过调用链直接追踪到SQL,数据库管理...
    ad0b553dc4b2b20bc3566179a25abdde.png

    找到慢查询SQL

    找到优化目标。一个项目中有很多SQL,不要一上来就逐一优化,应该找出需要优化的SQL。客户端需要花费很长时间等待查询结果的慢查询是最需要优化的。开发人员可以通过调用链直接追踪到SQL,数据库管理员可以通过日志拿到慢查询,像DM、MySQL等数据库一般都有慢查询记录日志,可以从中找到慢查询语句,一般数据库都自带有分析慢查询日志的工具。

    分析SQL

    找到慢查询SQL后也不应急于查看执行计划,创建索引等,而是先分析SQL语句的结构,找出SQL语句存在的问题。SQL语句是否关联了很多表,是否有一些耗时的聚合查询,是否有关联子查询以及表关联顺序等都会影响SQL查询效率。

    查看表结构及表数据量

    看完SQL语句,查看SQL语句中的表结构及表中的数据量是很有必要的。表结构中字段及数据类型分析,索引结构等都影响SQL查询效率。因此表结构中的字段数据类型是否可以修改为更高效率的数据类型,是否可以添加适量冗余字段而减少表连接查询,索引建立是否合理等都是值得考虑的。

    优化SQL

    • 优化SQL语句本身

    减少查询输出的字段,不需要的不输出,指定输出列代替 “*” ;减少关联查询关联的表;关联子查询转换为left-join等join查询;case 、字段格式化操作省去,在应用中处理。等等

    • 优化表结构

    使用适量的冗余字段;改变一些字段的数据类型(可用int的绝不用string);

    • 优化索引

    数据量较少的表不宜建立索引。

    ​ 创建索引的字段中的值应比较离散,可以使用索引选择性来计算。

    ​ 几个字段都要建立索引时可以创建联合(复合)索引代替建立多个独立索引。

    ​ 联合索引中字段排序要慎重考虑,等值条件在前,非等值条件在后;离散性越大的越靠前;离散型相同,让常用字段在前。

    ​ 索引并不是越多越好,建立的索引要考虑适用尽可能多的业务场景。决不能为每个业务都建立一个特有的索引。

    ​ 字符串字段创建索引时应截取前面一部分创建索引,而不是全字段创建索引。

    • 分析SQL及优化

    开发人员或数据库管理员很清楚数据情况,他们​可以通过SQL执行计划来查看SQL执行过程、耗时的操作和索引使用情况等;在如DM等数据中可以使用explain 查看SQL执行计划,及各部分操作耗时情况。如果数据库没有按照最我们认为最优的计划执行,可用 HINT 提示符指定数据库执行时使用那个索引,以及表链接方式等,也可以开启并行查询。

    展开全文
  • mysql数据库person_organization中,主键是organization_id,另有一列parent_organization_id指向父机构的数据记录;通过以下sql可以取出指定organization_id所在的树状结构枝干上所有的organization_id: <...
  • 查询表A,如果A所对应的B中,MDATE在A的STARTDATE 和 ENDDATE 之间,则A的该记录不显示。 最后查询结果为:  ID CONTENT STARTDATE ENDDATE 1 测试内容1 2014/6/1 2014/6/15 3 测试内容3 2014/...
  • 通过本文学习+练习,即可学会SQL复杂查询目录视图子查询标量子查询关联查询各种函数综合练习1.视图1.1什么是视图1.2如何创建视图输入SQL语句,创建视图得到创建的视图1.3创建视图的注意事项避免在视图的基础上再...
  • 修改表关联查询sql

    2019-07-24 17:25:10
    https://dev.mysql.com/doc/refman/8.0/en/update.html UPDATE student s INNER JOIN teacher t ON s.manager_id = t.id SET s.manager_name = t.`name` where s.id=1
  • 现在有一个教师(教师号 教师名) 课程号(教师号 课程号 课程名) 教室(教师号 课程号 教室号 教室名) 想显示所有教室的教师名和课程名。...就是想问这种关联查询语句 排除中一些矛盾的存在哈 谢谢
  • 在企业系统中经常会使用到给用户分配权限的情况,往往在用户信息表和...那么,查询用户权限的多表查询sql语句长什么样呢? select * from pe_role_user ru inner join pe_role_module rm on ru.role_id=rm.`role_id...
  • SQL技巧:查询某个表关联的所有存储过程关键字:#SQL技巧#背景在开发过程中,可能需要更改某一个的数据结构,或者更新数据。但你又不太清楚会造成什么影响,迟迟不敢下手进行调整。笔者[快乐IT]最近在做ERP K3与OA...
  • 一、关联union 是将两个合并为一,会除种union all 是将两张和二为一,不会除重二、的联结联结方式:cross join、inner join、left join、right join、full join区别在于,如需要左边的信息全显示就是...
  • 关键词导读:SQL 连续上涨 有序计算用SQL如何查询连续上涨N次的记录?这个问题用SQL来做很难!SQL的理论基础是无序集合,早期SQL也...举个例子:查询连续n天上涨的股票,现有数据库stock数据如下:codestockdate...
  • SELECT l.limitId, l.limitName, l.limitURL, m.ModelName,o.OperateName FROM limits l LEFT JOIN model m ON m.ModelId=l.limitModelId LEFT JOIN operate o ON o.OperateId=l.... 用户...
  • sql关联表查询只关联某个字段最新的一条记录 这里用的是ROW_NUMBER() OVER()函数 select b.date,b.notice_no,a.* from tableA a, (select t.*,row_number() over(partition by notice_no(表字段) order by date ...
  • SQL关联表查询 LEFT ON INNER ON RIGHT ON
  • product:id,name attribute:productId,attributeKey,value 怎么查询同时满足key="key1",value="value1";key="key2",value="value2"的商品id?
  • 工作中我们经常用到多个left join去关联其他表查询结果,但是随着数据量的增加,一个表的数据达到百万级别后,这种普通的left join查询将非常的耗时。举个例子:现在porder表有 1000W数据,其他关联的表数据都很少,...
  • 自身关联查询sql语句

    千次阅读 2016-09-10 19:21:13
    有一个表示这样的,如下图,id和parent_id是关联的 现在要查出每个cat_name的父类id,即parent_id对应的名称。那么我写的sql语句如下,把id,cat_name,parent_id,以及对应的父类名称显示出来。 select ...
  • sql 关联表查询 LEFT ON INNER ON RIGHT ON

    千次阅读 2016-07-28 13:49:09
    LEFT ON INNER ON RIGHT ON 关联表查询
  • ORACLE 多表关联查询SQL 语法结构梳理

    千次阅读 2013-11-09 15:25:05
    ORACLE 多链接查询SQL语法有两种,一种是标准SQL多联查语句结构(left join | right join ...),一种是ORACLE自身多联查语句结构(使用"+") 1、标准SQL多链接查询(以oracle自带emp,dept为例): --标准...
  • 真实的数据操作中,通常要获取的信息横跨多个表格,这个时候就要用到SQL表查询,建立表格和表格的关联关系。一、表的加法即两张表加在一起。使用union 关键字,将两个表格查询的结果相加,在相加时会将重复的数据...
  • SQL里,常常需要对多个表关联起来进行查询,下面把我写的一个简单的多表关联的例子给大家看看,方法很简单,只要你学会原理就行: select o.id id,o.oid oid,o.number number,o.seOrder seOrder,o.endprice ...
  • MyBatis中关联关系查询sql写法 一,一对多关系查询(以country与minister关系为例) 1,通过多连接查询方式实现  XML Code  1 2 3 4 5 6 7 8 9 10 11 12 ="Country...
  • 这里涉及三个,AA,BB,CC,将AA的数据更新到CC中,将AA中LABEL_ID分别截取字段与BB中的label_id对应查询到LABEL_NAME作为CC的一个字段插入,这里分成四段查询 insert into CC select T.apmac,T1.LABEL_NAME,...
  • SQLServer表关联查询

    千次阅读 2019-06-27 09:31:09
    SQL语句中,关于连接,若按照的数量来划分,可以划分为单连接、两连接和两以上连接,在本篇文章中,主要讲解两连接,其他多连接原理一样。 关于连接有很多种类,本文主要讲解交叉连接,内连接,...
  • 工作中我们经常用到多个left join去关联其他表查询结果,但是随着数据量的增加,一个表的数据达到百万级别后,这种普通的left join查询将非常的耗时。举个例子:现在porder表有 1000W数据,其他关联的表数据都很少,...
  • 今天我们动手练习下,两个或多结合查询SQL语句是怎样优化的。 还是我们先创建两个和准备一些数据 create table teacher( tid int(4) primary key, cid int(4) not null ); insert teacher values(1,2);...
  • 各位大神,一个sql问题请教下 有两张,分别如下: 充值t_recharge字段: userId、recharge_money、recharge_count 消费t_consume字段: userId、consume_money、consume_count 现在的情况是用户...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,442
精华内容 2,576
关键字:

关联表查询sql