设为首页 收藏本站
查看: 920|回复: 0

[经验分享] MySQL(八)子查询和分组查询

[复制链接]

尚未签到

发表于 2017-12-13 15:37:40 | 显示全部楼层 |阅读模式
  一、子查询
  1、子查询(subquery):嵌套在其他查询中的查询。
  例如:select user_id from usertable where mobile_no in (select mobile_no from mobile where mobile_id = '10086');
  这条SQL语句中,括号内为从mobile表汇总检索mobile_id为10086的所有行中的mobile_no列,括号外为从user_table表中检索mobile_id为10086的所有行中的user_id列;
  PS:select语句中,子查询总是从内向外处理(实际上,MySQL执行了2个select操作),where子句中使用子查询,必须保证select语句具有与where子句中相同数目的列;
  子查询一般与in操作符结合使用,但也可用于测试等于(=)、不等于(<>)等。
  格式化SQL:包含子查询的select语句一般相较来说阅读和调试更为不方便,特别是它比较复杂的情况下,因此把子查询分解为多行并且适当缩进,能极大的简化子查询的使用。
  2、使用计算字段使用子查询
  例如:select user_name,user_id,(select count(*))
  from orders where orders_cust_id = usertable_user_id)
  as orders
  from usertable
  order by user_name;
  这条SQL语句对usertable表中每个用户返回3列:user_name,user_id和orders,orders是一个计算字段,由圆括号内的子查询建立,它对检索出的每个用户执行一次,
  子查询中where子句它使用了完全限定表名,它告诉SQL比较orders表和usertable表中的user_id列。
  相关子查询(correlated subquery):涉及外部查询的子查询(任何时候只要列名可能存在多叉性,就必须使用这种语法[表名和列名有一个句点分隔])。
  PS:使用子查询建立查询的最可靠方法是逐渐进行(首先建立最内层的查询,确认后用硬编码数据建立外层查询,由内到外)
  二、组合查询
  MySQL允许执行多个查询(多条select语句),并将结果作为单个查询结果集返回,这些组合查询称为并(union)复合查询(compound query)
  以下两种基本情况,需要使用组合查询:
  在单个查询中从不同表返回类似结构的数据;
  对单个表执行多个查询,按单个查询返回数据;
  1、union
  union可将多条select语句的结果组合成单个结果集,例子如下
  select user_id, mobile_id, mobile_num
  from mobiletables
  where mobile_num = 10086
  union
  select user_id, mobile_id, mobile_num
  from mobuletables
  where user_id in (10000,10010);
  这条SQL语句中,union指示MySQL执行两条select语句,并把输出组合成单个查询结果集。
  union使用规则:
  union必须由两条或以上的select语句组成,语句之间用关键字union分隔;
  union中每个查询必须包含相同的列、表达或聚集函数(各个列不需要以相同的次序列出);
  列数据类型必须兼容:类型不用完全相同,但必须是DBMS可以隐含的转换类型;
  union自动从查询结果集中去除重复的行(这是union的默认行为,如果想返回所有匹配行,可使用union all
  2、union all
  union自动从查询结果集中去除重复的行,如果想返回所有匹配行,可使用union all;例子如下:
  select user_id, mobile_id, mobile_num
  from mobiletables
  where mobile_num = 10086
  union all
  select user_id, mobile_id, mobile_num
  from mobuletables
  where user_id in (10000,10010);
  union和where的区别:
  union几乎可以完成与多个where条件相同的工作。union all为union的一种形式,它完成where子句完成不了的工作(如果需要每个条件匹配行全部出现,则必须使用union all)。
  3、对组合查询结果排序
  select语句的输出用order by子句排序,在用union组合查询时,只能使用一条order by子句,它必须出现在最后一条select语句之后。
  select user_id, mobile_id, mobile_num
  from mobiletables
  where mobile_num = 10086
  union all
  select user_id, mobile_id, mobile_num
  from mobuletables
  where user_id in (10000,10010)
  order by user_id, mobile_num;
  MySQL将用它来排序所有的select语句返回的所有结果。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-423700-1-1.html 上篇帖子: FIREDAC TFDCONNECTION连接MYSQL数据库 下篇帖子: Node + Express + Mysql的CMS小结
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表