如何写复杂的SQL

这里需要使用到case when语句,这个就是sql中的if else语句:         select                  a.ins_id,                 b.product_id,                 b.product_name,                 c.cust_id,                 c.cust_name,                 c.cust_sex,                 c.cust_age,                 c.family_num,                 -- 男                 -- 这个地方根据数据库字段的不同,处理方式也不同                 -- 如果数据库中cust_sex的数据类型本身就是0和1,那么就不需要转换                 -- 只列出来即可                 (case when c.cust_sex=‘男‘ then 1 else 0 end) as f,                 -- 女                 (case when c.cust_sex=‘女‘ then 1 else 0 end) as as m,                 -- 其他的依次类推                 -- 家庭成员数                 (case when c.family_num=1 then 1 else 0 end) as p_1,                 (case when c.family_num=2 then 1 else 0 end) as P_2,                 (case when c.family_num=3 then 1 else 0 end) as p_3,                 (case when c.family_num>3 then 1 else 0 end) as gt3,                 -- 客户年龄                 (case when c.cust_age<=25 then 1 else 0 end) as lt25,                 (case when c.cust_age>25 and c.cust_age<=35 then 1 else 0 end) as gt25lt35,                 (case when c.cust_age>35 and c.cust_age<=45 then 1 else 0 end) as gt35lt45,                 (case when c.cust_age>45 and c.cust_age<=55 then 1 else 0 end) as gt45lt55,                 (case when c.cust_age>55 then 1 else 0 end) as gt55         from                 insurance a,                 product b,                 customer c         where                  a.product_id=b.product_id                 and a.cust_id=c.cust_id                  最后分组count一下即可:         select                  a.product_id,                 a.product_name,                 count(a.ins_id) as ins_num,                 -- 性别                 count(a.f) as f_num,                 count(a.m) as m_num,                 -- 成员数                 count(a.p_1) as p_1_num,                 count(a.p_2) as p_1_num,                 count(a.p_3) as p_1_num,                 count(a.gt3) as gt3_num,                 -- 年龄                 count(lt25) as lt25_num,                 count(gt25lt35) as gt25lt35_num,                 count(gt35lt45) as gt25lt35_num,                 count(gt45lt55) as gt25lt35_num,                 count(gt55) as gt55_num         from(                 select                          a.ins_id,                         b.product_id,                         b.product_name,                         c.cust_id,                         c.cust_name,                         c.cust_sex,                         c.cust_age,                         c.family_num,                         -- 男                         -- 这个地方根据数据库字段的不同,处理方式也不同                         -- 如果数据库中cust_sex的数据类型本身就是0和1,那么就不需要转换                         -- 只列出来即可                         (case when c.cust_sex=‘男‘ then 1 else 0 end) as f,                         -- 女                         (case when c.cust_sex=‘女‘ then 1 else 0 end) as as m,                         -- 其他的依次类推                         -- 家庭成员数                         (case when c.family_num=1 then 1 else 0 end) as p_1,                         (case when c.family_num=2 then 1 else 0 end) as P_2,                         (case when c.family_num=3 then 1 else 0 end) as p_3,                         (case when c.family_num>3 then 1 else 0 end) as gt3,                         -- 客户年龄                         (case when c.cust_age<=25 then 1 else 0 end) as lt25,                         (case when c.cust_age>25 and c.cust_age<=35 then 1 else 0 end) as gt25lt35,                         (case when c.cust_age>35 and c.cust_age<=45 then 1 else 0 end) as gt35lt45,                         (case when c.cust_age>45 and c.cust_age<=55 then 1 else 0 end) as gt45lt55,                         (case when c.cust_age>55 then 1 else 0 end) as gt55                 from                         insurance a,                         product b,                         customer c                 where                          a.product_id=b.product_id                         and a.cust_id=c.cust_id         ) a         group by b.product_id, b.product_name

到现在未知,我们所要的结果就完全出来了。整个过程是一个化繁为简,再由简单堆砌为复杂的过程。         对于初学者,培养出这样的思维方式似乎还很难,但是只要经过一两个这样的需求的练习,这中思维         方式就很容易形成了,到最后,当你看到一个报表结构的时候,这样的思维过程仅仅是一瞬间的事,         你的脑海里是n张的数据表格,经过相应关联之后,你的脑海里得到是报表结构的前一张结果集的结构,         然后再往前推前一张结果集的结构,直到推到主表,然后再正向推一编,最后推到完整的报表结构,         这个思维过程非常快,很可能再你的脑子只推一两步的时候,你就已经知道怎么写了。

谨以此文送给初学sql的朋友们。

如何写复杂的SQL

时间: 2024-10-13 20:16:02

如何写复杂的SQL的相关文章

用Groovy模板写MyBatis动态SQL

MyBatis动态SQL简介 MyBatis有个强大的功能,动态SQL.有了这个功能,定义在Mapper里的SQL语句,就不必是静止不变的了,而是可以根据传入的参数,动态调整.下面是MyBatis官方文档里的一个if语句的例子: <select id="findActiveBlogWithTitleLike" resultType="Blog"> SELECT * FROM BLOG WHERE state = 'ACTIVE' <if test=

编 写高性能的 SQL 语句注意事项

1. IS NULL 与 IS NOT NULL不能用 null 作索引, 任何包含 null 值的列都将不会被包含在索引中. 即使索引有多列这样的情况下,只要这些列中有一列含有 null,该列就会从索引中排除.也就是说如果某列存在空值,即使对该列建索引也不会提高性能.任何在 where 子句中使用 is null 或 is not null 的语句优化器是不允许使用索引的.2. 联接列对于有联接的列,即使最后的联接值为一个静态值,优化器是不会使用索引的.我们一起来看一个例子,假定有一个职工表(

如何使用SQLAlchemy库写出防SQL注入的Raw SQL

Python阵营有很多操作数据库的开源库(安装pip后,可以借助"pip search mysql"查看可用的库列表),其中被使用最多的无疑是MySQLdb,这个库简单易上手.其偏底层的特性为开发者提供灵活性的同时,也对不少新手写出的DB操作代码提出了考验,因为它只支持raw sql,容易导致sql注入攻击. 鉴于此,很多库提供了ORM接口能力,借助OO思想,数据库中的表被映射为Python的类,类的对象代表数据表中的一行记录,所有的DB操作都通过对象方法调用来实现,这些调用在底层被自

代写存储过程、SQL函数语句

代写存储过程.SQL函数语句Each team is most likely to have the following tables in the existing model. Use the Excel data provided with this phase link: PATIENT (some teams called it EMPLOYEE or CUSTOMER) - If needed, alter your PATIENT table to include the fiel

代写SQL、数据库SQL代写、SQL代写、数据库SQL编程代写

代写SQL.数据库SQL代写.SQL代写.数据库SQL编程代写 我和我的小伙伴均毕业于国内外顶尖高校.就职于一线互联网企业,从事高级开发,熟悉MySQL.Oracle.SQL Server等一系列数据库的设计与开发 现接SQL代写业务(主要面向留学生)当然,我们更多接的是C.C++.Java.Python.Go编程代写? 声明 1.绝不抄袭,不坑学生是我们的底线 2.绝不使用太高级语法 3.无限期免费答疑.无限期修改直到您满意为止 联系方式 微信leechanx 或者直接扫码: 部分成交截图 原

FreeSql (二十七)将已写好的 SQL 语句,与实体类映射进行二次查询

有时候,我们希望将写好的 sql 语句,甚至是存储过程进行查询,虽然效率不高(有时候并不是效率至上). 巧用AsTable var sql = fsql.Select<UserX>() .AsTable((a, b) => "(select * from user where clicks > 10)") .Page(1, 10).ToList(); 本身 AsTable 是用来进行分表分库的,后续我们会接着讲. 友情提醒:当开启了自动同步结构功能,UserX

Sql Server 优化 SQL 查询:如何写出高性能SQL语句

1. 首先要搞明白什么叫执行计划? 执行计划是数据库根据SQL语句和相关表的统计信息作出的一个查询方案,这个方案是由查询优化器自动分析产生的,比如一条SQL语句如果用来从一个 10万条记录的表中查1条记录,那查询优化器会选择“索引查找”方式,如果该表进行了归档,当前只剩下5000条记录了,那查询优化器就会改变方案,采用 “全表扫描”方式. 可见,执行计划并不是固定的,它是“个性化的”.产生一个正确的“执行计划”有两点很重要: (1)    SQL语句是否清晰地告诉查询优化器它想干什么? (2)

数据库面试系列之六:会写基本的sql语句

面试让写的sql语句涉及到order by ,group by, having ,like ,limit  等 order by 排序 asc生序,desc降序 group by 分组,having用于分组筛选 like用于模糊匹配查询 limit控制返回的结果条数,以及从第几条返回 select sid,sum(score) as 总分数 where sid>1004 group by sid having 总分数>60 order by 总分数 desc; select * from st

优化SQL查询:如何写出高性能SQL语句

1.首先要搞明白什么叫执行计划? 执行计划是数据库根据SQL语句和相关表的统计信息作出的一个查询方案,这个方案是由查询优化器自动分析产生的,比如一条SQL语句,如果用来从一个10万条记录的表中查1条记录,那查询优化器会选择“索引查找”方式,如果该表进行了归档,当前只剩下5000条记录了,那查询优化器就会改变方案,采用“全表扫描”方式. 可见,执行计划并不是固定的,它是“个性化的“.产生一个正确的”执行计划“有两点很重要: (1)SQL语句是否清晰地告诉查询优化器它想干什么? (2)查询优化器得到