zoukankan      html  css  js  c++  java
  • mysql将查询结果交并差

    差集、交集、并集

    1.两个集合的结构要一致,对应的字段数,字段类型
    2.将两个集合用 UNION ALL 关键字合并,这里的结果是有重复的所有集
    3.将上面的所有集 GROUP BY id
    4.最后 HAVING COUNT(id)=1,等于1的意思是只出现了一次,所以这个是差集,如果等于2,那么就是交集

    学生表

    课程表

    成绩表

    老师表

    学过01课程的同学信息

    select st.* from student st 
    left join score sc on st.s_id = sc.s_id
    where sc.c_id='01'
    

    学过02课程的同学信息

    select st.* from student st 
    left join score sc on st.s_id = sc.s_id
    where sc.c_id='02'
    

    差集

    查询只学过编号为"01"或者只学过编号"02"课程的同学的信息

    select a.* from (
    select st.* from student st 
    left join score sc on st.s_id = sc.s_id
    where sc.c_id='01'
    UNION ALL
    select st.* from student st 
    left join score sc on st.s_id = sc.s_id
    where sc.c_id='02') as a GROUP BY a.s_id, a.s_name,a.s_birth,a.s_sex HAVING count(a.s_name)=1
    

    结果如下:

    交集

    查询学过编号为"01"并且也学过编号为"02"的课程的同学的信息

    select a.* from (
    select st.* from student st 
    left join score sc on st.s_id = sc.s_id
    where sc.c_id='01'
    UNION ALL
    select st.* from student st 
    left join score sc on st.s_id = sc.s_id
    where sc.c_id='02') as a GROUP BY a.s_id, a.s_name,a.s_birth,a.s_sex HAVING count(a.s_name)=2
    

    结果如下

    并集 UNION 可以去重

    查询学过编号为"01"或者学过编号为"02"的课程的同学的信息

    select st.* from student st 
    left join score sc on st.s_id = sc.s_id
    where sc.c_id='01'
    UNION 
    select st.* from student st 
    left join score sc on st.s_id = sc.s_id
    where sc.c_id='02'
    

    结果如下:

    写sql报错遇到一个问题

    第一个解决方案 修改配置文件 重启mysql

    sql_mode="ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION" 去掉 ONLY_FULL_GROUP_BY 参数 重启mysql

    第二个解决方案 修改sql group by 后面把所有的字段都加上

    ONLY_FULL_GROUP_BY是MySQL提供的一个sql_mode,通过这个sql_mode来提供SQL语句GROUP BY合法性的检查,在MySQL的sql_mode没有ONLY_FULL_GROUP_BY语义时。一条select语句,MySQL允许target list中输出的表达式是除聚集函数或group by column以外的表达式。ONLY_FULL_GROUP_BY的语义就是确定select target list中的所有列的值都是明确语义,简单的说来,在ONLY_FULL_GROUP_BY模式下,target list中的值要么是来自于聚集函数的结果
    
  • 相关阅读:
    jxl 单元格画斜线
    阿里云 tomcat 配置 注意
    java 的 数据库连接测试类 (SQL server)
    关于使用jackson.jar解析JSON时,大写JSON key值发生报错的问题
    JS配置文件动态加载CSS,js和定义请求路径
    SQL SERVER 2008升级SQL SERVER 2008 R2或者10.00.1600升级10.50.1600
    IDEA 启动运行的tomcat服务器项目,只能使用localhost访问的解决方法:
    舞会
    01序列
    交错01串
  • 原文地址:https://www.cnblogs.com/lvshuizhicheng/p/14548413.html
Copyright © 2011-2022 走看看