MySQL cookbook第8章读书笔记

1,使用count函数生成摘要


函数函数使用很容易,对于MyISAM表来说count(*)语句很快,但是对于BDB或者InnoDB表来说,尽可能要避免使用它,因为该语句要求执行完整的扫描,速度很慢,解决办法是从information_schema数据库中提取table_rows数目

与if语句搭配使用:

创建视图来简化使用摘要(经常使用摘要的时候):

使用视图:

使用min(),max()也是类似的:

类似的还有sum()和avg()函数生成摘要:

2,使用distinct函数消除重复

3,查找数值相关的最大子和最小值

min(),max()这样的聚类函数并不能在where子句中使用,但是我们会有求类似于最大人口的数值,并且对应的城市名字,可以通过最大人口数值存储在用户定义的变量中,然后将数据行与该变量数值相比较来解决该问题:

还有另外一种方法从包含最小或者最大数值的数据行中选取其他数据列的方法:使用连接,将选择的数据放置到另一张表中,然后将该表与原始表接起来匹配该数值的数据行。

4,将摘要划分为子群

为了更准确找出每个发送者从每个主机发送了多少信息,应该使用两个数据列来划分子群。

这里的count是每个发送者(srcuser)从每个主机(srchost)发送的字数。

对mail表中的数据行针对srcuser进行子群划分,然后显示每个子群中发送的最大的消息的大小和最小的消息的大小

经常出现的一种问题:当使用group by来划分子群时,唯一能选择的子句是划分子群的子句和从子群中计算得到的摘要数值。

红色标记为错误,因为子群划分为name,而显示中存在trav_date不是划分子群的子句和从子群中计算得到的摘要数值,显示与最小最大子群数值相关的数据行通常使用引入连接的技术:

5,使用确定的特性选择组群

where 和having的区别在于having操作在已经选定和划分好子群的的数据行集上,能够对聚类子群进行额外的条件约束。

当然也可以使用别名:

使用having和count确定某一个子群内某项纪录唯一:

也可以使用与联合数值中。例如:为了查找仅仅发送了一个信息的信息发送/接收对,可以在mail表中查找仅仅发生一次的联合:

还可以使用表达式结果分组:

6,分类无类别数据

比如在无重复数据中,例如:

不存在重复的数,故不好使用group by来划分子群。

将人口划分为5个百万量级:?????

7,控制摘要显示顺序


以名字划分子群,以行驶的天数来进行排序:

8,查找最小或最大的摘要数值

min(),max()不能作为其他聚类函数的参数。例如:你很容易查找到每个司机的总行驶英里数:

不能够正常工作,

但是可以先对数据行排序,然后使用limit选择第一个数据行:

9,生成包括摘要和列表的报告

使用pthon生成摘要和列表的报告:

+ ?





1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

import
Cookbook

import
sys

import
MySQLdb

name_map={}

conn=Cookbook.connect()

cursor=conn.cursor()

cursor.execute("""

            select name, count(name),sum(miles)

            from driver_log group by name

            """)

for(name,days, miles) in
cursor.fetchall():

    name_map[name]=(days,miles)

# 选择每个司机的行程数并打印报告,显示行程列表中每个司机的摘要汇总项

cursor.execute("""

                select name, trav_date, miles

                from driver_log group by name, trav_date

                """)

cur_name=""

for
(name, trav_date, miles) in
cursor.fetchall():

    if
cur_name !=name:

        print
"Name: %s; days on road: %d; miles drien:%d "\

                    %(name, name_map[name][0],name_map[name][1])

        cur_name=name

    print
"date:%s, trip length:%d "%(trav_date,miles)

    cursor.close()

时间: 2024-10-11 14:02:08

MySQL cookbook第8章读书笔记的相关文章

MySQL cookbook第10章读书笔记

1,使用load data和mysqlimport导入数据 1个ok,2个warning!!! 为什么会有warning,而且数据也没有load进去 2,指定数据文件位置 了解MySQL查找文件位置的规则. 如果load data语句没有local选项,MySQL读取数据文件将按下述规则在服务器所在机器上定位文件的位置: 文件的绝对全路径名(从文件系统的根开始),MySQL直接读取该文件. 给定的是文件的相对路径名,按照路径名的两种不同形式来解释和处理. 3,指定数据文件的结构 有一个数据文件但

MySQL Cookbook第11章读书笔记

1,创建一个序列列兵生成序列值 使用auto_increment 如果显式地把ID设置成一个非NULL的值,有两个结果: a,这个值在表中出现,由于id列是主键,因而不允许重复,故会出现错误 b,这个值没有出现例如,你的表中id序列值为1到8,此时你插入一个新航,并设置为20,那么下一个自动产生的序列就会从21开始,而9-19的值变得不可用. 2,序列生成的行删除的效果 例如在insect表中: 比如要求只能是昆虫,删除millipede,millbug,多余的蚂蚁 删除2会给序列中间带来一个缺

《内核设计与实现》第一章读书笔记

<内核设计与实现>第一章读书笔记 第一章:Linux内核简介 1.1 Unix的历史 Unix强大的特点 A.简洁,几百个系统调用,明确的设计目的 B.文件对待所有东西 C.移植性强(C语言) D.进程创建快,使用fork()系统调用. E.进程间通信元语,进程间通信机制 1.2 linux的简介 Linux系统的基础是内核.C库.工具库和系统的基本工具. 1.3 操作系统和内核简介 内核:管理者,操作系统的核心 通常一个内核由负责响应中断的中断服务程序和网络.进程间通信等系统服务共同组成.

Android深度探索——第九章读书笔记及心得

HAL模块 ——第9章读书笔记及心得 通过本章学习学会了Android中特有的与linux驱动交互的方法,即通过HAL模块.HAL模块本质上就是通过linux共享库(.so)与linux交互驱动,然后利用应用程序再访问linux共享库.每一个HAL共享库指定一个ID,在利用这个ID配合一定的规则找到linux共享库.知道了HAL对于Android的意义.知道了Android HAL的架构. HAL是建立在linux驱动之上的一套不属于linux内核的程序库.它属于linux内核层之上的应用层.H

Android深度探索——第二章读书笔记及心得

Android开发环境搭建 ——第二章读书笔记及心得 通过本章的学习了解了如何对Ubuntu Linux下的Android进行搭建,包括搭建Android应用程序开发环境.Android NDK开发环境和交叉编译环境的搭建.了解了搭建Android环境所需要的各种东西,了解了配置ADT的必要性—以便ADT能够找到Android SDK.知道了底层开发所需要的各种工具.学会了如何在Ubuntu下安装JDK.以及编译交叉编译环境,当初在学习Linux交叉环境编译的时候就不是特别成功,中间出了很多的错

Android深度探索——第四章读书笔记及心得

源代码的下载及编译 ——第四章读书笔记及心得 通过阅读书籍知道了Android源代码和Linux源代码的区别,了解了什么是Android移植.知道了Android移植就是Linux内核移植,而Linux内核移植主要就是Linux的驱动移植.为了开发和测试内核环境需要对环境进行搭建,进而知道了如何搭建环境.知道了如何下载Android/Linux源代码及配置Android源代码下载环境(并且知道Android源代码的下载并非一定要将4MB多的东西全部下载,也可以挑选着自己需要的东西下载,,可以利用

Android深度探索——第三章读书笔记及心得

了解Git ——第三章读书笔记及心得 对于Android的理解是从这学期才开始,所以不可谓说是了解的太少太少.对于Linux虽然经过了一学期的学习.经过一次紧张的实训,但是了解的也不是很多.不过我终究是知道Android和Linux是开源的,这是很多老师都曾经告诉我们的.虽然Git并不是学习Android和Linux开发必须掌握的技术,但是对于想要认真学习好这门技术的我们来说应该要努力掌握好这门技术.就像书上说的学习新技术的方式不是一味的读书,只会纸上谈兵.更应该深入的理解自己感兴趣的源代码,通

Android深度探索——第五章读书笔记及心得

搭建S3C6410开发板的测试环境 ——第五章读书笔记及心得 通过本章的学习学会了如何在开发板上安装Android.开发板是学习和开发嵌入式技术的主要硬件设备,想要顺利的通过linux驱动访问硬件,是不能在PC板上模拟的,需要在卡发板上进行调试和测试.其相对于手机更适合与对程序进行测试,尤其是对底层linux程序进行测试.还了解了S3C6410开发板的基本信息.知道了如何安装串口调试工具以及烧写Android系统.知道了如何配置有线网络. S3C6410是一款低功耗.高性价比的精简指令集计算机处

Android深度探索——第七章读书笔记及心得

控制发光二极管 ——第七章读书笔记及心得 通过本章的学习掌握了一个真正和硬件打交道的linux驱动程序.知道了一个完整的linux驱动只要由内部处理与硬件交互两部分组成.其中的内部处理指linux驱动的装载.卸载.与设备文件相关的动作处理以及业务逻辑.与硬件交互主要是指通过部分函数与硬件中的寄存函数进行数据交互. Linux驱动直接与硬件打交道,但是并不是linux启动直接向硬件中的内存写数据,而是与本机的I/O内存进行交互.每一个连接linux的硬件在I/O内存中都会有映射首地址. 创建LED