MySQL学习(六)
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学习(六)的更多相关文章
- MySQL学习(六)——自定义连接池
1.连接池概念 用池来管理Connection,这样可以重复使用Connection.有了池,我们就不用自己来创建Connection,而是通过池来获取Connection对象.当使用完Connect ...
- MySql学习(六) —— 数据库优化理论(二) —— 查询优化技术
逻辑查询优化包括的技术 1)子查询优化 2)视图重写 3)等价谓词重写 4)条件简化 5)外连接消除 6)嵌套连接消除 7)连接消除 8)语义优化 9)非SPJ优化 一.子查询优化 1. ...
- mysql存储引擎(mysql学习六)
存储引擎 现在只有InnoDB支持外键 上接着学习笔记五 class表中有外键,所以不能修改存储引擎 表类型 默认的服务器表类型,通过my.ini可以配置 Default-storage-e ...
- 我的MYSQL学习心得(六) 函数
我的MYSQL学习心得(六) 函数 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类 ...
- 我的MYSQL学习心得(十六) 优化
我的MYSQL学习心得(十六) 优化 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据 ...
- 我的MYSQL学习心得(六)
原文:我的MYSQL学习心得(六) 我的MYSQL学习心得(六) 我的MYSQL学习心得(一) 我的MYSQL学习心得(二) 我的MYSQL学习心得(三) 我的MYSQL学习心得(四) 我的MYSQL ...
- 我的MYSQL学习心得(一) 简单语法
我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类型 我的MYSQL学习心得(五) 运 ...
- 我的MYSQL学习心得(二) 数据类型宽度
我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类型 我的MYSQL学习心得(五) 运 ...
- 我的MYSQL学习心得(三) 查看字段长度
我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(四) 数据类型 我的MYSQL学习心得(五) 运 ...
随机推荐
- mysql判断两个时间段是否有交集
//判断两个时间段是否有交集 private function checkTimeCross($start_time,$end_time){ $sql ) AND ((start_time > ...
- ORA-38301:can not perform DDL/DML Over Object in Recycle Bin 11.2.0.4
我们最近有两台测试服务器在oci direct load期间出现下列异常: 从表象上看,是我们在对表执行ddl操作,确实内部也是用了truncate table XXX,可是这个XXX并不是回收站里面 ...
- jQuery知识总结(转)
原文:http://fwhyy.com/2013/04/jquery-knowledge-summary/ 这篇文章在于筛选器的简单例子,让人一看就懂代码的作用 20170223 前言 jQuery一 ...
- Android 4.4 根据uri获取路径的方法
当我们选择图片以后,返回的是Uri,此时我们要把路径存储到数据库,必须将其转换成String类型. URI: //content://com.android.providers.media.docu ...
- javascript 点击按钮实现隐藏显示切换效果
原文链接:http://www.jb51.net/article/79083.htm <html> <head> <meta charset="gb2312&q ...
- iOS App架构相关
一) 我们可以定义一个好的架构应该具备的特点: 任务均衡分摊给具有清晰角色的实体 可测试性通常都来自与上一条(对于一个合适的架构是非常容易) 易用性和低成本维护 二) 传统的MVC模式.:三个实体间相 ...
- 使用Selenium+Java+Juint实现移动web端自动化的代码实现
浏览器: Chrome 首先通过developer模式查看Chrome浏览器支持哪些手机,如图: 在代码中使用ChromeOptions对象的addArguments方法来设置参数,如下代码所示: p ...
- Selenium 15: How to Run Parallel Tests Using Selenium Grid and JUnit
In this post, I will give two techniques and describe how to run your selenium tests in parallel by ...
- dart基础语法
.关于 runApp() 上面的实例代码中使用了 runApp() 方法,runApp 方法接收的指定参数类型为 Widget,即: runApp(Widget).在 Flutter 的组件树(wid ...
- ubuntu upgrade
升级命令 虽然 apt-get 经常被人诟病,但实际上它还是个挺好用的软件包管理器.在 Ubuntu 14.04 以后的系统中,apt-get 相关的升级更新命令有四个: apt-get update ...