1 注意

select cout(*) from 表名; 查询的就是绝对的行数,哪怕某一列所有字段全部为NULL,也计算在内。而select cout(列名) form 表名;查询的是该列不为null的所有行的行数。

用count(*)和count(1)那个更好?

对于myisam引擎的表,没有区别,这种引擎内部有一个计数器在维护着行数,对Innodb的表,用count(*)直接读行数,效率很低,因为Innodb的表真的要去数一遍。

2

mysql> select sum(shop_price) from
-> goods
-> where cat_id = 3;
mysql> select sum(goods_number) from goods
-> where cat_id = 4;

计算每个栏目下的库存量之和

配合group语句使用

mysql> select cat_id, sum(goods_number) from goods
-> group by cat_id;

典型错误

mysql> select goos_id,sum(goods_number) from goods;
ERROR 1140 (42000): In aggregated query without GROUP BY, expression #1 of SELECT list contains nonaggregated column 'test_db.goods.goos_id'; this is incompatible with sql_mode=only_full_group_by

运算不对应,没办法取出goos_id(MySQL 8.0.13 这条语句不会执行)。

3

按照cat_id分组,计算每个栏目下的商品的平均价格

mysql> select cat_id,avg(shop_price) from goods
-> group by cat_id;

这里cat_id已经按组分类,所有语义上没有问题。

严格讲,以group by a, b,c为列,则select的列,只能在a,b,c中选择。

4

查询本店价格比市场价省的钱,并且要求省钱200元以上取出来

mysql> select goos_id,goods_name,(shop_price-market_price) as discount from goods
-> where
-> (shop_price - market_price) > 200;

mysql> select goos_id,goods_name,(shop_price-market_price) as discount from goods
-> having discount;

这是典型错误

mysql> select goos_id,goods_name,(shop_price-market_price) as discount from goods
-> where
-> discount > 200;
ERROR 1054 (42S22): Unknown column 'discount' in 'where clause'

这种写法也可以(P20)

mysql> select goos_id,goods_name,(shop_price-market_price) as discount from goods
-> where 1
-> having discount > 200;

5

查询每个商品所积压的货款

mysql> select goos_id,goods_number * shop_price from goods;

6

查询每个商品的积压货款之和

mysql> select sum(goods_number * shop_price) from goods;

7

查询每个栏目下,积压的货款(需要用到分组)

mysql> select cat_id,sum(shop_price * goods_number) from goods
-> group by cat_id;

8

查询积压货款超过2W元的栏目,以及该栏目积压的货款

mysql> select cat_id,sum(goods_number * shop_price) as k from goods
-> group by cat_id
-> having k > 20000;

对结果集操作,就需要用到having

错误做法

mysql> select cat_id, sum(goods_number * shop_price) from goods
-> where
-> (goods_number * shop_price) >20000
-> group by cat_id;

9

查询本店价比市场价省的钱,且筛选出省钱200以上的商品,用where和having分别来实现

mysql> select goos_id,goods_name,(shop_price - market_price) as discount from goods
-> having
-> discount > 200;

mysql> select goos_id,goods_name,shop_price - market_price from goods
-> where
-> (shop_price - market_price) > 200;

10

where-having-group综合练习

创建一张表

mysql> create table result
-> (
-> name varchar(10),
-> subject varchar(10),
-> score tinyint unsigned
-> )engine myisam charset utf8;

插入数据

mysql> insert into result
-> values
-> ('张三','数学',90),
-> ('张三','语文',50),
-> ('张三','地理',40),
-> ('李四','语文',55),
-> ('李四','政治',45),
-> ('王五','政治',30);
Query OK, 6 rows affected (0.40 sec)

要求:查询出2门及2门以上不及格者的平均成绩

如张三 (90+50+40)/3 = 60

李四 (55+45) / 2 = 50;

注意count(1)或者count(0)查找出来的都是当前表的列数

1 第一步就是查找所有人的平均分

mysql> select name,avg(score) from result
-> group by name;

2 再想办法计算出每个人的挂科的情况

mysql> select name,subject,score,score < 60 as ungrade from result;

3

如上,挂科数就是ungrade的和

mysql> select name,avg(score),sum(score < 60 ) as ungread
-> from result
-> group by name;

4 已经出现结果集,再对结果集进行一次操作

mysql> select name,avg(score),sum(score < 60 ) as ungread
-> from result
-> group by name
-> having ungread >= 2;

这一个思路是逆向思维,先查出所有人的平均,再筛选,如果正常的考虑,我们会这样做,先找出谁的挂科数>2,找到这些人,再求这些人的平均分。

MySQL学习(六)的更多相关文章

  1. MySQL学习(六)——自定义连接池

    1.连接池概念 用池来管理Connection,这样可以重复使用Connection.有了池,我们就不用自己来创建Connection,而是通过池来获取Connection对象.当使用完Connect ...

  2. MySql学习(六) —— 数据库优化理论(二) —— 查询优化技术

    逻辑查询优化包括的技术 1)子查询优化  2)视图重写  3)等价谓词重写  4)条件简化  5)外连接消除  6)嵌套连接消除  7)连接消除  8)语义优化 9)非SPJ优化 一.子查询优化 1. ...

  3. mysql存储引擎(mysql学习六)

    存储引擎 现在只有InnoDB支持外键 上接着学习笔记五 class表中有外键,所以不能修改存储引擎 表类型   默认的服务器表类型,通过my.ini可以配置    Default-storage-e ...

  4. 我的MYSQL学习心得(六) 函数

    我的MYSQL学习心得(六) 函数 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类 ...

  5. 我的MYSQL学习心得(十六) 优化

    我的MYSQL学习心得(十六) 优化 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据 ...

  6. 我的MYSQL学习心得(六)

    原文:我的MYSQL学习心得(六) 我的MYSQL学习心得(六) 我的MYSQL学习心得(一) 我的MYSQL学习心得(二) 我的MYSQL学习心得(三) 我的MYSQL学习心得(四) 我的MYSQL ...

  7. 我的MYSQL学习心得(一) 简单语法

    我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类型 我的MYSQL学习心得(五) 运 ...

  8. 我的MYSQL学习心得(二) 数据类型宽度

    我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类型 我的MYSQL学习心得(五) 运 ...

  9. 我的MYSQL学习心得(三) 查看字段长度

    我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(四) 数据类型 我的MYSQL学习心得(五) 运 ...

随机推荐

  1. redmine3.2 的部署

    安装libyaml [root@ ~]#wget http://pyyaml.org/download/libyaml/yaml-0.1.4.tar.gz -O /dist/dist/yaml-0.1 ...

  2. maven执行单元测试失败后,继续生成Jacoco&Sonar报告

    为保证生成单元测试覆盖 sonarqube或者jacoco与maven集成时,如果pom文件配置了sonarqube或者Jacoco的相关配置, 那么在pom文件所在目录执行mvn clean ins ...

  3. Docker 微服务教程(搭建真正的网站)

    Docker 是一个容器工具,提供虚拟环境.很多人认为,它改变了我们对软件的认识. 站在 Docker 的角度,软件就是容器的组合:业务逻辑容器.数据库容器.储存容器.队列容器......Docker ...

  4. Iris Classification on Tensorflow

    Iris Classification on Tensorflow Neural Network formula derivation \[ \begin{align} a & = x \cd ...

  5. SSL及其加密通信过程

    SSL及其加密通信过程 什么是SSL SSL英文全称Secure Socket Layer,安全套接层,是一种为网络通信提供安全以及数据完整性的安全协议,它在传输层对网络进行加密.它主要是分为两层: ...

  6. 【Python31--pickle函数】

    一.含义 1.pickle的实质是什么 答:利用一些算法把数据对象转换成“二进制文件”,存储在硬盘上,当然也可以放在数据库或者是另外一台计算机上 2.存放:picking,读取:unpicking 3 ...

  7. centos7之安装wordpress

    wordpress安装教程如下: mysql安装可以参考我的博客园Centos构建Java环境:https://www.cnblogs.com/youcong/p/9118753.html 1.安装a ...

  8. log4j2使用介绍

    工作中,用到了log4j2,以前只接触过log4j,也没有太过深入,这次就稍微系统的学习了以下log4j2. 一.引入pom.xml 使用maven作为项目的构建环境,pom.xml使用slf4j,s ...

  9. ImageView控件有关问题

    了解了一下ImageView控件,这个控件本身及其属性倒没有什么特别之处.只是在看<第一行代码>时,郭大神写到创建drawable-xhdpi文件有些问题,首先先说drawable和mip ...

  10. ODAC(V9.5.15) 学习笔记(八)TOraScript

    名称 类型 说明 DataSet 如果脚本中返回了数据结果,则通过该数据集进行获取 Delimiter string 脚本语句之间的分隔符 EndLine Integer 脚本中最后一行的行号 End ...