hibernate的查询条件lt_SQL基础----(四)复杂的子查询(select within select)

(一) 关键知识点

1.1 消化阶梯

b9992d664e937cbf5c59e50ce4bf07c4.png
任何知识点,均可遵循此消化路径

1.2 功能点

1.2.1 视图

  • 案例

3b408393e6aa8ae23bd4f1d5ff0d1107.png

b1d057c35121bf9a0fe9fa10aba6ca16.png

8cd14ce0e04a92131c61b61691791f6a.png
选中视图,右键刷新,将会呈现新创建的视图

96752059b4cb6078828122e555479969.png
选中具体视图,右键弹出功能菜单,选择对应功能项
  • 注意事项

(1) 视图中存放的是sql语句,非表的实际数据,节省存储空间,动态更新较便捷;

(2) from子句中,视图名代替表名,运行时动态创建出一张临时表;

(3) 频繁/复杂的sql语句,保存成视图,可反复使用,节省存储空间;

(4) 避免:级联多级视图(降低效率),视图中插入数据(报错);

1.2.2 子查询

1.2.2.1 概况

  • 常规子查询(临时表)

ec1f6a9ebf00c73bd7e928dc615ebaf9.png
临时表“按性别汇总”,动态创建,动态删除,语句运行后自动消失;
  • 特殊子查询 (in,any,some,all)

567025d586753bc0304f506615a7e988.png

2a507ea95037d97bfea2dd23323fe4bf.png
any,任意一个,与some等价

512ceb2a36b95bc876f40b76e391a28f.png
all,全部
  • 注意事项

(1) 确保逻辑运算的优先级,可以使用括号;

(2) 尽量避免子查询的层层嵌套,拖累效率;

(3) 子查询,可以嵌入select/from/where子句(目标对象:常量,字段,字段的运算);

(4) 注意子查询的功效,条件判断的值域一般不需要内外表字段的关联,组内判断需要关联子查询;

(5) 必须提前过滤异常值,直接用in,all,any比较会导致整体结果异常;

特殊处理:Null,>0则过滤掉异常值;字母顺序,name<=all(name)表示升序第一个字符,

(6)分组子句,在没有汇总函数时,未起作用,虽然不报语法错误;

(7)子查询的逻辑核心,是拆分问题,逐步回答(select within select);

1.2.2.2 标量子查询 (完成数值间比较)

  • 案例

f0c40fdcce277083b678244d29ce0db0.png
单值,进行简单查询

6b01814205c39b52981add4b0cd0e6c5.png
结合关键字(in,any,some,all),进行复杂查询
  • 注意事项

(1) 有且仅能返回一行一列的结果,即单个值

1.2.2.2 关联子查询 (多表字段关联,单表数值比较)

  • 案例

8193f80a70053dbf28e81fe50b15a860.png

b79f3282ca1982faa4396910c2cf2a2c.png
内外表关联,借助where子句实现;s2 仅在子查询里有效;
  • 注意事项

(1) 对单表中数据进行比较时,使用单表关联自身的关联子查询 ;

(2) 注意表的有效范围,正确访问;

(3) 注意表的关联条件,大因素相同,才成立的过滤条件;

(4) 关联子查询,一定注意是否需要包含与自身相比,注意过滤,或者条件中的等于号;

1.3 功能函数

  • 汇总函数

e99985be37cd86892fc01bc3c9321d53.png
  • 字符串函数

26145867077a1824d7372515680c704e.png
  • 日期函数

b7bfa779954659139289e4588c63bafa.png
  • 算术函数

a7f200b87bb8efac54f5df3439ab6a47.png
round中-n,表示完成取整后的整数,最后一位抹掉零头

(二)SQL ZOO实操

934bcfeab913474732bb222d8bec23fd.png

61f8d932ce8d83a18b0ad371ca2f6331.png

f8551b3833563b979882ff636956935d.png

67be656b55695ef8400ed3c1b87160e5.png
between通过修改边界,或者用大于,小于拼接

3834d42f89666a9ec086b0745caa2f06.png
注意,相乘,不会修改原始小数点的位置;必须放大倍数,取整才行;3%不等价于3.00% round(population/(select population from world where name = &amp;amp;amp;#39;Germany&amp;amp;amp;#39;),2)*100 等价于3.00%

1ba0df09e3af109723c12d7925556adb.png

de147f396e39efc712b2df91812b439c.png
使用关联子查询时,需要严格注意关联条件的选择

89597ac1ad177f38c555173e0b2fcd1a.png
方法一:字符name = all()与关联,结合的使用

e118a7a22eaaf6fa96e7f549ec942d9b.png
方法二:采用关联,排序和limit 1

2b74284724f50ec760605d18f370615b.png
方法三:普通排序,手动比对结果一致,但是与系统正确结果相比未匹配成功

18de85e21dad697caaf0010ba156cda6.png
未有汇总需求,group by分组子句不建议使用

6448a05ae8fe7415ea0df01b5a32e756.png
利用w1.name&amp;amp;lt;&amp;amp;gt;w2.name 不跟自身相比,all返回多行值,可以把3倍放到子查询中,或者左侧
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值