草庐IT

读SQL进阶教程笔记10_HAVING下

躺柒 2023-04-11 原文

1. 按照现在的SQL标准来说,HAVING子句是可以单独使用的

1.1. 就不能在SELECT子句里引用原来的表里的列了

1.1.1. 使用常量

1.1.2. 使用聚合函数

1.2. WHERE子句用来调查集合元素的性质,而HAVING子句用来调查集合本身的性质

2. 表不是文件,记录也没有顺序,所以SQL不进行排序

3. GROUP BY子句可以用来生成子集

3.1. SQL通过不断生成子集来求得目标集合

3.2. SQL不是面向过程语言,没有循环、条件分支、赋值操作

3.3. SQL通过不断生成子集来求得目标集合

3.4. SQL不像面向过程语言那样通过画流程图来思考问题,而是通过画集合的关系图来思考

4. 示例

4.1. -- 查询缺失编号的最小值

    SELECT MIN(seq + 1) AS gap
      FROM SeqTbl
     WHERE (seq+ 1) NOT IN ( SELECT seq FROM SeqTbl);

5. 求众数

5.1. 在群体中出现次数最多的值

5.2. 示例

5.2.1.

5.2.1.1. --求众数的SQL语句(1):使用谓词

    SELECT income, COUNT(*) AS cnt
      FROM Graduates
     GROUP BY income
    HAVING COUNT(*) >= ALL ( SELECT COUNT(*)
                              FROM Graduates
                              GROUP BY income);
5.2.1.1.1. ALL谓词用于NULL或空集时会出现问题

5.2.1.2. --求众数的SQL语句(2):使用极值函数

    SELECT income, COUNT(*) AS cnt
      FROM Graduates
     GROUP BY income
    HAVING COUNT(*) >=  ( SELECT MAX(cnt)
                            FROM ( SELECT COUNT(*) AS cnt
                                    FROM Graduates
                                  GROUP BY income) TMP ) ;
5.2.1.2.1. 用极值函数来代替

6. 求中位数

6.1. 将集合中的元素按升序排列后恰好位于正中间的元素

6.2. 如果集合的元素个数为偶数,则取中间两个元素的平均值作为中位数

6.3. 示例

6.3.1. --求中位数的SQL语句:在HAVING子句中使用非等值自连接

    SELECT AVG(DISTINCT income)
      FROM (SELECT T1.income
              FROM Graduates T1, Graduates T2
            GROUP BY T1.income
            --S1的条件
      HAVING SUM(CASE WHEN T2.income >= T1.income THEN 1 ELSE 0 END)
                >= COUNT(*) / 2
            --S2的条件
        AND SUM(CASE WHEN T2.income <= T1.income THEN 1 ELSE 0 END)
                >= COUNT(*) / 2 ) TMP;

6.3.1.1. 加上等号并不是为了清晰地分开子集S1和S2,而是为了让这2个子集拥有共同部分

6.3.1.2. 如果去掉等号,将条件改成“>COUNT(*)/2”,那么当元素个数为偶数时,S1和S2就没有共同的元素了,也就无法求出中位数了

6.3.1.3. 如果事先知道集合的元素个数是奇数,那么因为FROM子句里的子查询结果只有一条数据,所以外层的AVG函数可以去掉

7. 查询不包含NULL的集合

7.1. COUNT(*)和COUNT(列名)

7.1.1. 性能上的区别

7.1.2. COUNT(*)可以用于NULL

7.1.3. COUNT(列名)与其他聚合函数一样,要先排除掉NULL的行再进行统计

7.1.4. COUNT(*)查询的是所有行的数目,而COUNT(列名)查询的则不一定是

7.2. 示例1

7.2.1. --在对包含NULL的列使用时,COUNT(*)和COUNT(列名)的查询结果是不同的

    SELECT COUNT(*), COUNT(col_1)
      FROM NullTbl;

7.3. 示例2

7.3.1.

7.3.1.1. --查询“提交日期”列内不包含NULL的学院(1):使用COUNT函数

    SELECT dpt
      FROM Students
     GROUP BY dpt
    HAVING COUNT(*) = COUNT(sbmt_date);

7.3.1.2. --查询“提交日期”列内不包含NULL的学院(2):使用CASE表达式

    SELECT dpt
      FROM Students
     GROUP BY dpt
    HAVING COUNT(*) = SUM(CASE WHEN sbmt_date IS NOT NULL
                              THEN 1
                              ELSE 0 END);
7.3.1.2.1. CASE表达式的作用相当于进行判断的函数,用来判断各个元素(=行)是否属于满足了某种条件的集合
7.3.1.2.1.1. 特征函数(characteristic function)

8. 关系除法运算

8.1. 示例1

8.1.1.


8.1.2. --查询啤酒、纸尿裤和自行车同时在库的店铺:错误的SQL语句

    SELECT DISTINCT shop
      FROM ShopItems
     WHERE item IN (SELECT item FROM Items);

8.1.2.1. --查询啤酒、纸尿裤和自行车同时在库的店铺:正确的SQL语句

    SELECT SI.shop
      FROM ShopItems SI, Items I
     WHERE SI.item = I.item
     GROUP BY SI.shop
    HAVING COUNT(SI.item) = (SELECT COUNT(item) FROM Items);
8.1.2.1.1. HAVING子句的子查询(SELECT COUNT(item) FROM Items)的返回值是常量3

8.1.3. 带余除法”(division with a remainder)

8.2. 示例2

8.2.1. “精确关系除法”(exact relational division)

8.2.2. --精确关系除法运算:使用外连接和COUNT函数

    SELECT SI.shop
      FROM ShopItems SI LEFT OUTER JOIN Items I
        ON SI.item=I.item
     GROUP BY SI.shop
    HAVING COUNT(SI.item) = (SELECT COUNT(item) FROM Items)    --条件1
      AND COUNT(I.item)  = (SELECT COUNT(item) FROM Items);   --条件2

8.3. 在SQL里,交叉连接相当于乘法运算

8.3.1. 关系除法运算是关系代数中知名度最低的运算

有关读SQL进阶教程笔记10_HAVING下的更多相关文章

  1. postman接口测试工具-基础使用教程 - 2

    1.postman介绍Postman一款非常流行的API调试工具。其实,开发人员用的更多。因为测试人员做接口测试会有更多选择,例如Jmeter、soapUI等。不过,对于开发过程中去调试接口,Postman确实足够的简单方便,而且功能强大。2.下载安装官网地址:https://www.postman.com/下载完成后双击安装吧,安装过程极其简单,无需任何操作3.使用教程这里以百度为例,工具使用简单,填写URL地址即可发送请求,在下方查看响应结果和响应状态码常用方法都有支持请求方法:getpostputdeleteGet、Post、Put与Delete的作用get:请求方法一般是用于数据查询,

  2. LC滤波器设计学习笔记(一)滤波电路入门 - 2

    目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称

  3. 在VMware16虚拟机安装Ubuntu详细教程 - 2

    在VMware16.2.4安装Ubuntu一、安装VMware1.打开VMwareWorkstationPro官网,点击即可进入。2.进入后向下滑动找到Workstation16ProforWindows,点击立即下载。3.下载完成,文件大小615MB,如下图:4.鼠标右击,以管理员身份运行。5.点击下一步6.勾选条款,点击下一步7.先勾选,再点击下一步8.去掉勾选,点击下一步9.点击下一步10.点击安装11.点击许可证12.在百度上搜索VM16许可证,复制填入,然后点击输入即可,亲测有效。13.点击完成14.重启系统,点击是15.双击VMwareWorkstationPro图标,进入虚拟机主

  4. hadoop安装之保姆级教程(二)之YARN的配置 - 2

    1.1.1 YARN的介绍 为克服Hadoop1.0中HDFS和MapReduce存在的各种问题⽽提出的,针对Hadoop1.0中的MapReduce在扩展性和多框架⽀持⽅⾯的不⾜,提出了全新的资源管理框架YARN. ApacheYARN(YetanotherResourceNegotiator的缩写)是Hadoop集群的资源管理系统,负责为计算程序提供服务器计算资源,相当于⼀个分布式的操作系统平台,⽽MapReduce等计算程序则相当于运⾏于操作系统之上的应⽤程序。 YARN被引⼊Hadoop2,最初是为了改善MapReduce的实现,但是因为具有⾜够的通⽤性,同样可以⽀持其他的分布式计算模

  5. Hive SQL 五大经典面试题 - 2

    目录第1题连续问题分析:解法:第2题分组问题分析:解法:第3题间隔连续问题分析:解法:第4题打折日期交叉问题分析:解法:第5题同时在线问题分析:解法:第1题连续问题如下数据为蚂蚁森林中用户领取的减少碳排放量iddtlowcarbon10012021-12-1212310022021-12-124510012021-12-134310012021-12-134510012021-12-132310022021-12-144510012021-12-1423010022021-12-154510012021-12-1523.......找出连续3天及以上减少碳排放量在100以上的用户分析:遇到这类

  6. sql - 查询忽略时间戳日期的时间范围 - 2

    我正在尝试查询我的Rails数据库(Postgres)中的购买表,我想查询时间范围。例如,我想知道在所有日期的下午2点到3点之间进行了多少次购买。此表中有一个created_at列,但我不知道如何在不搜索特定日期的情况下完成此操作。我试过:Purchases.where("created_atBETWEEN?and?",Time.now-1.hour,Time.now)但这最终只会搜索今天与那些时间的日期。 最佳答案 您需要使用PostgreSQL'sdate_part/extractfunction从created_at中提取小时

  7. 由于 libgmp.10.dylib 的问题,Ruby 2.2.0 无法运行 - 2

    我刚刚安装了带有RVM的Ruby2.2.0,并尝试使用它得到了这个:$rvmuse2.2.0--defaultUsing/Users/brandon/.rvm/gems/ruby-2.2.0dyld:Librarynotloaded:/usr/local/lib/libgmp.10.dylibReferencedfrom:/Users/brandon/.rvm/rubies/ruby-2.2.0/bin/rubyReason:Incompatiblelibraryversion:rubyrequiresversion13.0.0orlater,butlibgmp.10.dylibpro

  8. ruby - ri 有空文件 – Ubuntu 11.10, Ruby 1.9 - 2

    我正在运行Ubuntu11.10并像这样安装Ruby1.9:$sudoapt-getinstallruby1.9rubygems一切都运行良好,但ri似乎有空文档。ri告诉我文档是空的,我必须安装它们。我执行此操作是因为我读到它会有所帮助:$rdoc--all--ri现在,当我尝试打开任何文档时:$riArrayNothingknownaboutArray我搜索的其他所有内容都是一样的。 最佳答案 这个呢?apt-getinstallri1.8编辑或者试试这个:(非rvm)geminstallrdocrdoc-datardoc-da

  9. ruby-on-rails - gem install rmagick -v 2.13.1 错误 Failed to build gem native extension on Mac OS 10.9.1 - 2

    我已经通过提供MagickWand.h的路径尝试了一切,我安装了命令工具。谁能帮帮我?$geminstallrmagick-v2.13.1Buildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingrmagick:ERROR:Failedtobuildgemnativeextension./Users/ghazanfarali/.rvm/rubies/ruby-1.8.7-p357/bin/rubyextconf.rbcheckingforRubyversion>=1.8.5...yescheckingfor/

  10. sql - 在 Rails Console for PostgreSQL 的表中显示数据 - 2

    我找到了这样的东西:Rails:Howtolistdatabasetables/objectsusingtheRailsconsole?这一行没问题:ActiveRecord::Base.connection.tables并返回所有表但是ActiveRecord::Base.connection.table_structure("users")产生错误:ActiveRecord::Base.connection.table_structure("projects")我认为table_structure不是Postgres方法。如何列出Postgres数据库的Rails控制台中表中的所有

随机推荐