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

来源:互联网 发布:arta软件 用法 编辑:程序博客网 时间:2024/06/02 12:01

MySQL权威指南读书笔记

第一章,MySQL和SQL入门(一,对数据库的理解)这一章共78页,我看了两周。很少有技术类书籍一开篇就讨论SELECT语句的,这是此书给我的第一个印象,本章把这个语句讲解得十分详细。我觉得第一章主要是讨论两个问题:1,通过两个样板数据库讲解对数据库理论的理解;2,基本命令的使用。比较高深的东西好像不多。一,对数据库的理解为什么要使用数据库呢,我们都看过许多说法,不外于其提供了强大的数据处理能力,如果仅仅是简单的数据列表,电子表格就完全胜任了。在数据的世界里,MySQL被划分为关系数据库管理系统的范畴内,我们可以把这个短语划分为以下几个部分:数据库:存放信息的的资料库,其构造既简单又遵守一定的规律数据库内的数据都存放在数据表(table)里数据表是由数据行(row)和数据列(colume)构成的一个数据行就是数据表内的一条记录(record)一个记录一般包含多个信息,数据表中的每一个数据列都对应着一个信息关系:把存放在某个数据表内的信息和存放在另一个数据表内的信息通过某种方式关联起来,而这种关联就是通过查找两个数据表有无共同的元素来实现的。先看一个简单的例子:你的站点上有大量的广告,每当客户浏览你的网页时,一旦点击你的广告,你就需要做记录来计算自己得到了多少广告费。从数据库的角度来说,你应该建立三个数据表。1,各个广告的来源company表-------------------------------------------------Company   Company_num        Address        phoneSONY       13          马家沟        0451-21CANON        14          新阳路        0451-222,各个广告的数据ad表----------------------------------------Company_num        Ad_num        Hit_fee12                48          00113                49          00314                50          0043,每个广告的点击率hit表------------------------Ad_num        Date48          3.1249          3.1448          3.1250          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 823 吕奉先 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        10event表date        Type9.3        Q9/6        Q9/9        Q9/16        T9/23        T10/1        T看起来好多了,虽然数据表的数据多了一个,但对数据库来说完全不是问题,我们可以继续考虑我们的成绩表:如果一天内有两场考试怎么办?我们需要在同一天内记录两组分数!既然如此,可以为每一次考试或者测验分配一个独一无二的编号,用这个编号来关联两个表,这样就避开了日期重复的问题了。score表                                     Name        Event_id        Score李寻欢        1        14荆无命        1        17吕奉先        1        15王怜花        1        14李寻欢        2        10荆无命        2        10吕奉先        2        10王怜花        2        10event表Event_id        date        Type1        9.3        Q2        9/6        Q3        9/9        Q4        9/16        T5        9/23        T6        10/1        T这样就完成了数据表的规划吗?好像还不行,考虑一下,如果有重名的学生如何处理呢?看来,用学号来解决这个问题就行了。1,student表Name        Sex        Student_id李寻欢        F        1荆无命        F        2吕奉先        F        3王怜花        F        42,score表Student_id        Event_id        Score1        1        142        1        173        1        154        1        141        2        102        2        103        2        104        2        103,event表Event_id        Date9.3        Q9/6        Q9/9        Q9/16        T9/23        T10/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种情况,我将在下次贴出,并对本章作个总结。