上次写了查询里的一些简单的查询方法,如果说上次的是初级查询,那这次的就是高级查询了。

  今天主要是聚合函数、分组查询、连接查询、联合查询。在我看来前三个挺简单的,稍微难理解点的也就最后一个,为什么呢?因为在一个查询里面会用到多个查询语句,这样看起来就复杂些,也就难点。

  聚合函数

    在平时,聚合函数使用率最多的也就那么几个,其它的你有兴趣也可以去了解。

    求最大值:max()

    求最小值:min()

    求总和:sum()

    求平均值:avg()

    求行数:count()

  用法:select 聚合函数 from 表名     如:select count(*) from stuInfo ---->求stuInfo表中的总人数,因为一个人是一行数据,总的行数就是总人数,* 号和前面一样代表所有列,当然,* 号也可以改为要求的列名;如 求一个班的男生总人数: select count(*) from stuInfo where sex='男'  ---->这里只需在后面加个where子句就可以了。

  注意:聚合函数后面的括号里写的是要求的列名,聚合函数不能和列名一起使用,如 select max(score), stuId(这是一个列名) from stuInfo  这样的写法就是错误的。

  分组查询

       分组查询需要用到 group by 子句。

    如:   select count(*) as 人数, sex as 性别 from stuInfo group by sex   ----->查询出班上男女人数总数。   查询男女人数分别为多少,我们就可以将数据分为男或女两组,group by 后面写的就是依据什么分组的列名(也就是说根据什么分组我们就写它的列名就可以了)。

    再来一个栗子:

            查询班上每个人及格的科目数量        首先我们要知道,我们需要的数据是分数大于60的,也就是说,分数小于60的数据我们就要将它过滤掉。 过滤后的数据就是及格的,然后再对它进行分组求和就可以了。

            select count(*) as 及格数量, stuid as 学号 from stuInfo

                where socre>60    --过滤数据,注意:where子句只能写在group by子句前面且后面不能跟聚合函数

                 group by stuid     --根据学号对现有数据进行分组,求的是每个人的,所以要以学号来分组

    最后来个难点的栗子:

          上面我们说了where子句不能写在group by 子句后面,那如果我们要先分组后再来求和呢? 比如求班上人及格数量小于3门的人,这里我们就要先用where子句将分数小于60的数据过滤掉,再根据学号对每个人进行分组,分组后我们还要筛选出及格数量小于3门的。既然不能使用where子句,那我们可以使用having子句,专门解决这一问题。

          Sql语句为:select count(*) as 数量, stuId as 学号 from stuInfo

                  where score>60    --过滤不及格的数据

                  group by stuId       --根据学号进行分组

                  having count(*)<3  --筛选出分组后行数小于3的,也就是及格数量小于3的

             having 用于group by 子句后,而且可以跟聚合函数

     where子句用于分组前的筛选,不能跟聚合函数;having子句用于分组后的筛选,可以跟聚合函数。

  连接查询

      我们知道,在数据库中规定一个表只能描述一件事情,那在查询中我们需要查询多个表的内容怎么办呢?这时我们就可以使用连接查询。

    连接查询有:内连接、外连接、交叉连接

    内连接:(inner join) 查询两个表公共部分

        1.等值连接 “=”

        select * from 表名一 inner join 表名二 on 表名一.主键=表名二.外键

      举个栗子,如下面两张表,现在将它们连接起来

      

      通过等值连接后就是这样

    

    不等连接

      概念:在连接条件中使用除等于号之外运算符(>、<、<>、>=、<=、!>和!<)

      看看效果吧

      <>

    

    >

  

  <

  

  这里就举这几个栗子了,剩下的就你自己去试了。

  刚刚已经说了,内连接显示的是两个表的公共部分,即使是空值它也会以NULL代替显示。

  外连接    

      左连接: 返回左表中的所有行,如果左表中行在右表中没有匹配行,则结果中右表中的列返回空值。

          语法上只是大同小异,把inner改为left就可以了

    还是上面两个表:

    

    右连接: 恰与左连接相反,返回右表中的所有行,如果右表中行在左表中没有匹配行,则结果中左表中的列返回空值。

        只需把inner改为right就可以了,这里我就不详细介绍了。

    全连接:返回左表和右表中的所有行。当某行在另一表中没有匹配行,则另一表中的列返回空值

        只需把inner改为full就可以了。

    最后就是联合查询,联合查询就是多个查询语句配合使用,写在一个Sql语句里面。

    如:查询年龄大于21岁的,我们只需加个where子句进行筛选就可以了。

    

   上面的文章也许你看不懂,但你可以加我QQ 1289747698 和我在线讨论哦!Welcome。

Sql Server——查询(二)的更多相关文章

  1. SQL Server查询性能优化——堆表、碎片与索引(二)

    本文是对 SQL Server查询性能优化——堆表.碎片与索引(一)的一些总结.  第一:先对 SQL Server查询性能优化——堆表.碎片与索引(一)中的例一的SET STATISTICS IO之 ...

  2. SQL Server查询性能优化——覆盖索引(二)

    在SQL Server 查询性能优化——覆盖索引(一)中讲了覆盖索引的一些理论. 本文将具体讲一下使用不同索引对查询性能的影响. 下面通过实例,来查看不同的索引结构,如聚集索引.非聚集索引.组合索引等 ...

  3. [转] 利用SET STATISTICS IO和SET STATISTICS TIME 优化SQL Server查询性能

    首先需要说明的是这篇文章的内容并不是如何调节SQL Server查询性能的(有关这方面的内容能写一本书),而是如何在SQL Server查询性能的调节中利用SET STATISTICS IO和SET ...

  4. SQL SERVER 查询性能优化——分析事务与锁(五)

    SQL SERVER 查询性能优化——分析事务与锁(一) SQL SERVER 查询性能优化——分析事务与锁(二) SQL SERVER 查询性能优化——分析事务与锁(三) 上接SQL SERVER ...

  5. SQL Server 查询性能优化 相关文章

    来自: SQL Server 查询性能优化——堆表.碎片与索引(一) SQL Server 查询性能优化——堆表.碎片与索引(二) SQL Server 查询性能优化——覆盖索引(一) SQL Ser ...

  6. 利用SET STATISTICS IO和SET STATISTICS TIME 优化SQL Server查询性能

    首先需要说明的是这篇文章的内容并不是如何调节SQL Server查询性能的(有关这方面的内容能写一本书),而是如何在SQL Server查询性能的调节中利用SET STATISTICS IO和SET ...

  7. SET STATISTICS IO和SET STATISTICS TIME 在SQL Server查询性能优化中的作用

    近段时间以来,一直在探究SQL Server查询性能的问题,当然也漫无目的的查找了很多资料,也从网上的大神们的文章中学到了很多,在这里,向各位大神致敬.正是受大神们无私奉献精神的影响,所以小弟也作为回 ...

  8. 数据库表设计时一对一关系存在的必要性 数据库一对一、一对多、多对多设计 面试逻辑题3.31 sql server 查询某个表被哪些存储过程调用 DataTable根据字段去重 .Net Core Cors中间件解析 分析MySQL中哪些情况下数据库索引会失效

    数据库表设计时一对一关系存在的必要性 2017年07月24日 10:01:07 阅读数:694 在表设计过程中,我无意中觉得一对一关系觉得好没道理,直接放到一张表中不就可以了吗?真是说,网上信息什么都 ...

  9. 如何找出你性能最差的SQL Server查询

    我经常会被反复问到这样的问题:”我有一个性能很差的SQL Server.我如何找出最差性能的查询?“.因此在今天的文章里会给你一些让你很容易找到问题答案的信息向导. 问SQL Server! SQL ...

随机推荐

  1. bat调用kettle的job文件

    @bat set /p param=请输入时间:echo %param%F:cd D:/data-integrationecho 正在执行接口call Kitchen.bat/norep /file ...

  2. Gvim安装nerd_tree插件

    1.先去官网下载nerd_tree插件 http://www.vim.org/scripts/script.php?script_id=1658 2.解压缩将nerd_tree目录下的doc目录和pl ...

  3. Java企业微信开发_09_素材管理之下载微信临时素材到本地服务器

    一.本节要点 1.获取临时素材接口 请求方式:GET(HTTPS) 请求地址:https://qyapi.weixin.qq.com/cgi-bin/media/get?access_token=AC ...

  4. 深入理解 JavaScript 中的 replace 方法(转)

    replace方法是属于String对象的,可用于替换字符串. 简单介绍: StringObject.replace(searchValue,replaceValue) StringObject:字符 ...

  5. mysql 索引B-Tree类型对索引使用的生效和失效情况详解

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt343 当人们谈论索引的时候,如果没有特别指明类型 ,那多半说的是 B-Tre ...

  6. String.equals()方法

    public boolean equals(Object anObject) {     if (this == anObject) {         return true;     }      ...

  7. 构建具有用户身份认证的 React + Flux 应用程序

    原文:Build a React + Flux App with User Authentication 译者:nzbin 译者的话:这是一篇内容详实的 React + Flux 教程,文章主要介绍了 ...

  8. Git简易参考手册

    如果用过mercury(HG),那么理解Git的运作方式就轻松多了.两者是相同的分布式版本管理工具,只是某些功能有着细微的差别 - Git的管理粒度更加细腻,因此操作上也比HG复杂一点.例如,修改文件 ...

  9. 【Beta】 第四次Daily Scrum Meeting

    一.本次会议为第四次meeting会议 二.时间:10:00AM-10:20AM 地点:陆大楼 三.会议站立式照片 四.今日任务安排 成员 昨日任务 今日任务 林晓芳 查询app提醒功能模块和用户登录 ...

  10. 第1周-java作业总结与建议

    1. 本周作业简评与建议 存在的问题: 这周的作业普遍存在一个格式混乱的问题.请认真学习Markdown,我们后面的作业都要使用Markdown.Markdown学习请参考http://group.c ...