热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

MySQL权威指南读书笔记(一)_MySQL

MySQL权威指南读书笔记(一)
MySQL权威指南读书笔记

用Mysql N年了,这是当年写的,某些网站上转载过。。

第一章,MySQL和SQL入门(一,对数据库的理解)

这一章共78页,我看了两周。

很少有技术类书籍一开篇就讨论SELECT语句的,这是此书给我的第一个印象,本章把这个语句讲解得十分详细。我觉得第一章主要是讨论两个问题:1,通过两个样板数据库讲解对数据库理论的理解;2,基本命令的使用。比较高深的东西好像不多。

一,对数据库的理解

为什么要使用数据库呢,我们都看过许多说法,不外于其提供了强大的数据处理能力,如果仅仅是简单的数据列表,电子表格就完全胜任了。在数据的世界里,MySQL被划分为关系数据库管理系统的范畴内,我们可以把这个短语划分为以下几个部分:
数据库:存放信息的的资料库,其构造既简单又遵守一定的规律
数据库内的数据都存放在数据表(table)里
数据表是由数据行(row)和数据列(colume)构成的
一个数据行就是数据表内的一条记录(record)
一个记录一般包含多个信息,数据表中的每一个数据列都对应着一个信息
关系:把存放在某个数据表内的信息和存放在另一个数据表内的信息通过某种方式关联起来,而这种关联就是通过查找两个数据表有无共同的元素来实现的。

先看一个简单的例子:

你的站点上有大量的广告,每当客户浏览你的网页时,一旦点击你的广告,你就需要做记录来计算自己得到了多少广告费。从数据库的角度来说,你应该建立三个数据表。

1,各个广告的来源company表
-------------------------------------------------
Company Company_num Address phone
SONY 13 马家沟 0451-21
CANON 14 新阳路 0451-22

2,各个广告的数据ad表
----------------------------------------
Company_num Ad_num Hit_fee
12 48 001
13 49 003
14 50 004

3,每个广告的点击率hit表
------------------------
Ad_num Date
48 3.12
49 3.14
48 3.12
50 3.14

看看我们能通过这三个数据表查询到什么信息?

1,你为多少家公司做广告?
查一查company表有多少行就知道了
2,你一共有多少个广告?
查一查ad表有多少行就知道了
3,在3.12这一天,你一共显示了多少个广告?
查一查hit表里面Date数据列的值是3.12的数据行共有多少?
4,在3.14这一天,CANON的广告被点击了几次?
首先在company表中找到CANON公司的公司代码(14),根据这个代码在ad数据表中找到CANON公司的广告代码(50实际上可能是很多个),然后分别在hit表中找到3.12日这个代码的点击率。

看到这里我们就能明白,为什么要费力气地把数据“分散”到多个表里面,而不是放到一个大表格中,数据库的非凡能力就表现在这里,把分散在多个数据表中的数据用一种相互匹配的方式迅速地搜集到一起得出结果,这就是数据库式的思维方式。我们必须慢慢习惯,然后自觉运用。是不是很简单?

如何让读者更好地理解这种“关系”的概念,书中给了两个样板数据库,听我慢慢道来:
1,你现在是美国历史研究会的秘书,这个协会是由一些对美国历史感兴趣的人自发地组织起来的,由于各人的爱好,他们将定期地交纳一定的会费来维持其会员资格,交上来的会费主要用于支付研究会的各种开支,如印刷会员刊物等。这个研究会目前建有一个小型的互联网站点,但这个站点还没有得到充分的开发利用,如果你的主要工作是用字处理来打印会员名录的话,数据库就没有必要的,但是许多的工作要求很复杂的操作:如,你希望能够根据不同的情况把会员名录输出为其它格式的资料;根据特定的条件来查询会员;能够根据某种限制得到统计数字,等等,如果把研究会的会员资料放到网站上,那么对会员自己来说,以在线方式修改自己的资料,查询其他人的资料就会容易得多。甚至会员们可以互相发布消息,写电子邮件,等等。
2,你是一名教师,在每学期中,你负责考试和测验,记录各种分数,期末时,你要对学生们的成绩进行总评。并把学生们的总评成绩和出勤情况上报给校方,如果不使用数据库,你就必须每学期都手工完成这些工作。

如果用传统方法,手工来统计考试积分表,你的表格可能就会是这样:

学生
-----------------------------------------------
ID 姓名 分数
Q Q T Q Q T
9/3 9/6 9/9 9/16 9/23 10/1 …
1 李寻欢 14 10 90 15 26 80
2 荆无命 17 10 90 12 28 82
3 吕奉先 15 10 92 15 26 80
4 王怜花 14 10 90 15 26 80
… …

毫无疑问,从关系的角度来说,这样的表格是无法直接放到数据库里面的。我们必须对其进行分解。当然,分数表(score表 )是最先必须建立的。最简单的模型可能是这样:

Name Date Score
李寻欢 9.3 14
荆无命 9.3 17
吕奉先 9.3 15
王怜花 9.3 14
李寻欢 9.6 10
荆无命 9.6 10
吕奉先 9.6 10
王怜花 9.6 10
我们很快就能发现这个表的问题:它丢失了一些数据,我们不能知道当天进行的是考试还是测验。看来需要加入一个数据列:
Name Date Score Type
李寻欢 9.3 14 Q
荆无命 9.3 17 Q
吕奉先 9.3 15 Q
王怜花 9.3 14 Q
李寻欢 9.6 10 T
荆无命 9.6 10 T
吕奉先 9.6 10 T
王怜花 9.6 10 T
我们又发现了一个问题,那就是本表的多余数据太多了,同一天里面的Type数据列的值是相同的,这种数据冗余是完全没有必要的。把表拆分一下如何:
score表
Name Date Score
李寻欢 9.3 14
荆无命 9.3 17
吕奉先 9.3 15
王怜花 9.3 14
李寻欢 9.6 10

荆无命 9.6 10
吕奉先 9.6 10
王怜花 9.6 10
event表
date Type
9.3 Q
9/6 Q
9/9 Q
9/16 T
9/23 T
10/1 T
看起来好多了,虽然数据表的数据多了一个,但对数据库来说完全不是问题,我们可以继续考虑我们的成绩表:如果一天内有两场考试怎么办?我们需要在同一天内记录两组分数!既然如此,可以为每一次考试或者测验分配一个独一无二的编号,用这个编号来关联两个表,这样就避开了日期重复的问题了。
score表
Name Event_id Score
李寻欢 1 14
荆无命 1 17
吕奉先 1 15
王怜花 1 14
李寻欢 2 10

荆无命 2 10
吕奉先 2 10
王怜花 2 10
event表
Event_id date Type
1 9.3 Q
2 9/6 Q
3 9/9 Q
4 9/16 T
5 9/23 T
6 10/1 T
这样就完成了数据表的规划吗?好像还不行,考虑一下,如果有重名的学生如何处理呢?看来,用学号来解决这个问题就行了。
1,student表
Name Sex Student_id
李寻欢 F 1
荆无命 F 2
吕奉先 F 3
王怜花 F 4
2,score表
Student_id Event_id Score
1 1 14
2 1 17
3 1 15
4 1 14
1 2 10
2 2 10
3 2 10
4 2 10
3,event表
Event_id Date
9.3 Q
9/6 Q
9/9 Q
9/16 T
9/23 T
10/1 T

终于完成了考试积分表的规划!我们学到了什么呢?数据库应该是什么样子,它应该包含哪些数据表,各个数据表应该有什么内容以及数据应该如何表示?我们看到的许多理论性很强的教材,就在讲述“数据库的分析与设计”,“实体关系图”,“规范化过程”,“第三范式”等等很枯燥的概念。至少在本章中作者没有提到这些东西,而是用一种比较自然,直观的途径让我们了解了一些数据库的基本知识,我觉得这一点很值得推崇。

数据库上
1最常见的操作是对现有数据进行检索;
2比较常见的操作是插入新数据;
3比较不常见的操作是创建数据表;
4最不常见的操作是创建数据库。
我们学习的步骤是从4到1,
①先看看如何建立我们的样板数据库,一个命令就行了
CREATE DATABASE sampdb;
②建立各个数据表
1建立“美国历史研究会”里面的总统表
CREATE TABLE president
(
last_name VARCHAR(15) NOT NULL,
first_name VARCHAR(15) NOT NULL,
suffix VARCHAR(5) NULL,
city VARCHAR(20) NOT NULL,
state VARCHAR(2) NOT NULL,
birth DATE NOT NULL,
death DATE NULL
);
2建立“美国历史研究会”里面的会员表
CREATE TABLE member
(
member_id INT UNSIGNED NOT NULL AUTO_INCREMENT,
PRIMARY KEY (member_id),
last_name VARCHAR(20) NOT NULL,
first_name VARCHAR(20) NOT NULL,
suffix VARCHAR(5) NULL,
expiration DATE NULL DEFAULT '0000-00-00',
email VARCHAR(100) NULL,
street VARCHAR(50) NULL,
city VARCHAR(50) NULL,
state VARCHAR(2) NULL,
zip VARCHAR(10) NULL,
phone VARCHAR(20) NULL,
interests VARCHAR(255) NULL
);
3,建立记分系统中的student表
CREATE TABLE student
(
name VARCHAR(20) NOT NULL,
sex ENUM('F','M') NOT NULL,
student_id INT UNSIGNED NOT NULL AUTO_INCREMENT,
PRIMARY KEY (student_id)
);
4,建立记分系统中的score表
CREATE TABLE score
(
student_id INT UNSIGNED NOT NULL,
event_id INT UNSIGNED NOT NULL,
PRIMARY KEY (event_id, student_id),
score INT NOT NULL
);
5,建立记分系统中的event表
CREATE TABLE event
(
date DATE NOT NULL,
type ENUM('T','Q') NOT NULL,
event_id INT UNSIGNED NOT NULL AUTO_INCREMENT,
PRIMARY KEY (event_id)
);
③插入新数据,操作命令可以有多种格式,我们用最简单的student表举个例子
INSERT INTO student VALUES ('Megan','F',1);
INSERT INTO student VALUES ('Joseph','M',2);
INSERT INTO student VALUES ('Kyle','M',3);
INSERT INTO student VALUES ('Katie','F',4);
INSERT INTO student VALUES ('Abby','F',5);

需要详细介绍的是数据的检索,本章中,作者列举了10种情况,我将在下次贴出,并对本章作个总结。

To be continued…

时间仓促,水平有限,请大家指教,谢谢!

推荐阅读
  • 推荐一个ASP的内容管理框架(ASP Nuke)的优势和适用场景
    本文推荐了一个ASP的内容管理框架ASP Nuke,并介绍了其主要功能和特点。ASP Nuke支持文章新闻管理、投票、论坛等主要内容,并可以自定义模块。最新版本为0.8,虽然目前仍处于Alpha状态,但作者表示会继续更新完善。文章还分析了使用ASP的原因,包括ASP相对较小、易于部署和较简单等优势,适用于建立门户、网站的组织和小公司等场景。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文介绍了如何在MySQL中将零值替换为先前的非零值的方法,包括使用内联查询和更新查询。同时还提供了选择正确值的方法。 ... [详细]
  • 在数据分析工作中,我们通常会遇到这样的问题,一个业务部门由若干业务组构成,需要筛选出每个业务组里业绩前N名的业务员。这其实是一个分组排序的 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • Oracle Database 10g许可授予信息及高级功能详解
    本文介绍了Oracle Database 10g许可授予信息及其中的高级功能,包括数据库优化数据包、SQL访问指导、SQL优化指导、SQL优化集和重组对象。同时提供了详细说明,指导用户在Oracle Database 10g中如何使用这些功能。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文详细介绍了MysqlDump和mysqldump进行全库备份的相关知识,包括备份命令的使用方法、my.cnf配置文件的设置、binlog日志的位置指定、增量恢复的方式以及适用于innodb引擎和myisam引擎的备份方法。对于需要进行数据库备份的用户来说,本文提供了一些有价值的参考内容。 ... [详细]
  • 本文由编程笔记小编整理,介绍了PHP中的MySQL函数库及其常用函数,包括mysql_connect、mysql_error、mysql_select_db、mysql_query、mysql_affected_row、mysql_close等。希望对读者有一定的参考价值。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 本文介绍了如何使用Power Design(PD)和SQL Server进行数据库反向工程的方法。通过创建数据源、选择要反向工程的数据表,PD可以生成物理模型,进而生成所需的概念模型。该方法适用于SQL Server数据库,对于其他数据库是否适用尚不确定。详细步骤和操作说明可参考本文内容。 ... [详细]
  • 本文介绍了adg架构设置在企业数据治理中的应用。随着信息技术的发展,企业IT系统的快速发展使得数据成为企业业务增长的新动力,但同时也带来了数据冗余、数据难发现、效率低下、资源消耗等问题。本文讨论了企业面临的几类尖锐问题,并提出了解决方案,包括确保库表结构与系统测试版本一致、避免数据冗余、快速定位问题等。此外,本文还探讨了adg架构在大版本升级、上云服务和微服务治理方面的应用。通过本文的介绍,读者可以了解到adg架构设置的重要性及其在企业数据治理中的应用。 ... [详细]
  • 本文介绍了使用postman进行接口测试的方法,以测试用户管理模块为例。首先需要下载并安装postman,然后创建基本的请求并填写用户名密码进行登录测试。接下来可以进行用户查询和新增的测试。在新增时,可以进行异常测试,包括用户名超长和输入特殊字符的情况。通过测试发现后台没有对参数长度和特殊字符进行检查和过滤。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
author-avatar
手机用户2502870105
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有