第1章 mysql入门与初步.docx
《第1章 mysql入门与初步.docx》由会员分享,可在线阅读,更多相关《第1章 mysql入门与初步.docx(32页珍藏版)》请在冰点文库上搜索。
第1章mysql入门与初步
第一章MySQL入门与初步
1.1MySQL简介
1.1.1MySQL是什么?
MySQL是一个真正的多用户、多线程SQL数据库服务器。
MySQL是一个客户机/服务器结构的实现,它由一个服务器守护程序mysqld和很多不同的客户程序和库组成。
SQL(结构化查询语言)是世界上最流行的和标准化的数据库语言,它使得存储、更新和存取信息更容易。
MySQL主要目标是快速、健壮和易用。
MySQL并不是一个开放源代码的产品,因为在某些条件下使用它需要许可证。
除非通过出售MySQL或出售需要它的服务来挣钱,否则,大体上说MySQL一般是免费的。
1.1.2我需要MySQL吗?
如果您正在寻找一种免费的或不昂贵的数据库管理系统,可以有几个选择,如,MySQL、mSQL、Postgres(免费但不支持来自商业供应商引擎的系统)等。
与其他数据库系统进行比较之下,MySQL具有许多吸引人之处:
1、速度。
MySQL运行速度很快。
2、容易使用。
MySQL是一个高性能且相对简单的数据库系统,与一些更大系统的设置和管理相比,其复杂程度较低。
3、价格。
MySQL对多数个人用户来说是免费的。
4、支持查询语言。
MySQL可以利用SQL,也可以利用支持ODBC(开放式数据库连接)的应用程序。
5、性能。
多个客户机可同时使用多个数据库。
可利用界面来交互式地访问MySQL。
这些界面为:
命令行客户机程序、Web浏览器或XWindowSystem客户机程序。
此外,还有由各种语言编写的界面。
因此,可以选择使用已编好的客户机程序或编写自己的客户机应用程序。
6、连接性和安全性。
MySQL是完全网络化的,其数据库可在因特网上的任何地方访问,因此,可以和任何地方的任何人共享数据库。
而且MySQL还能进行访问控制,可以控制哪些人不能看到您的数据。
7、可移植性。
MySQL可运行在各种版本的UNIX以及非UNIX的系统上。
MySQL可运行在从家用PC到高级的服务器上。
1.1.3我需要付钱吗?
对于一般的内部使用,MySQL通常是免费的。
除非通过出售MySQL或出售需要它的服务来挣钱,否则,大体上说MySQL一般是免费的。
商业程序中包含客户代码不需要许可证,MySQL的客户端存取部分不属公共领域,mysql命令行客户程序包含在GNU通用许可证下的readline库的代码。
1.1.4如何得到MySQL?
用于ODBC驱动程序MyODBC、JDBC驱动程序mm.mysql、用PHP写成的客户程序phpMyAdmin、以及其它各种第三方客户机。
ActivePerl
PerlDBIhttp:
//www.symbolstone.org/technology/perl/DBI
PHP
Apachehttp:
//www.apache.org
1.1.5总结
●MySQL是一个关系数据库系统,支持SQL查询语言。
●MySQL可以是免费的。
●MySQL系统的速度非常快,同样它的性能也是十分优良的。
●MySQL是一个管理简捷的数据库,它没有庞大而臃肿的可视化管理工具。
1.2关系数据库管理系统
数据库是一个服务于一个核心目标的数据的有组织的集合。
数据库中的数据是有组织的,从某种意义上说,数据库中存储的数据采用一种不变的方式被存储、格式化、存取以及显示。
因为数据库不含有无关的或冗余的数据,它可以适用于一个核心目标。
一本电话簿就是一个很好的数据库例子,它包含有关的数据(名字),让人们能够查找电话号码;它不包含无关的数据,如某人的电话机的颜色;它只贮存那些与它的目标相关的信息。
1.2.1关系数据库系统
RDBMS,即关系数据库管理系统,
为了进一步了解一个RDBMS是由什么构成的,你必须先了解关系模型。
下列情况出现在一个关系模型中:
●数据的基础项是关系。
●在这些表上的操作只产生关系(关系型闭合)。
什么是关系?
这是一个描述两个集合的元素如何相互联系或如何一一对应的数学概念。
因此,关系模型是建立在数学基础上的。
然而,对你来说,关系只是一个带有一些特殊属性的表,一个关系模型把数据组织到表中,而且仅在表中。
客户、数据库设计者、数据库系统管理员和用户都以同样的方式—即从表中—查看数据。
那么,表就是关系模型的近义词。
一个关系型表有一组命名的属性(attribute)或列,以及一组元组(tuple)或行。
有时列被称为域,行被称为记录,列和行的交集通常被叫做单元。
列标示位置,有作用域或数据类型,例如字符或整数。
行自己就是数据。
一个关系表必须符合某些特定条件,才能成为关系模型的一部分:
1、贮存在单元中的数据必须是原子的。
每个单元只能存贮一条数据,这也叫信息原则(InformationPrinciple)。
尽管在过去的数年中按某些违反这一条的方式已经建立了许多系统,但违反这一条将不能运用良好的设计原则。
当一个单元包含多于一条的信息时,这叫做信息编码(informationcoding)。
在这样的情况下,是否采用违背理论的方案是一个设计的选择问题,尽管在多数情况下,结果证明这对数据的完整性是一不利的。
2、贮存在列下的数据必须具有相同数据类型。
3、每行是唯一的(没有完全相同的行)。
4、列没有顺序。
5、行没有顺序。
6、列有一个唯一性的名称。
除了表和它们的属性,关系模型有它自己特殊的操作。
不需要深入研究关系型数学,只需说明这些操作可能包括列的子集、行的子集、表的连接以及其他数学集合操作(如联合)等就足够了。
真正要知道的事情是这些操作把表当作输入,而将产生的表作为输出。
SQL是当前RDBMS的ANSI标准语言,它包含这些关系型操作。
允许数据操作或数据处理的主要语句是SELECT、INSERT、UPDATE和DELETE。
因此,这些数据处理操作中任何一个都是一个事务。
允许数据定义或结构化处理的基本语句是CREATE、ALTER和DROP。
关系模型要求的最后一件事是两个基础的完整性原则。
它们是实体完整性原则(entityintegrityrule)和引用完整性原则(referentialintegrityrule)。
首先,让我们看看两个定义:
1、主键(primarykey)是能唯一标识行的一列或一组列的集合。
有时,多个列或多组列可以被当作主键。
2、由多个列构成的主键被称为连接键(concatenatedkey)、组合键(compoundkey),或者更常称为复合键(compositekey)。
数据库设计者决定哪些列的组合能够最准确和有效地反映业务情形,这并不意味着其他数据未被存贮,只是那一组列被选作主键而已。
剩余有可能被选为主键的列被叫做候选键(candidatekey)或替代键(alternatekey)。
一个外键(foreignkey)是一个表中的一列或一组列,它们在其他表中作为主键而存在。
一个表中的外键被认为是对另外一个表中主键的引用。
实体完整性原则简洁地表明主键不能全部或部分地空缺或为空,引用完整性原则简洁地表明一个外键必须为空或者与它所引用的主键当前存在的值相一致。
一个RDBMS就是一个建立在前面这些关系模型基础上的,一般能满足所提到的全部要求的DBMS。
但是,在70年代末到80年代初,RDBMS开始销售的时候,SQL超越了本质为非关系型的系统,受到普遍欢迎,并被称作关系型。
1.2.2数据库系统的发展
1969年美国的IBM公司开发了第一个数据库系统IMS。
这是一个层次数据库系统,在数据库系统发展史上有着重要的地位。
同年,美国的数据系统语言委员会(CODASYL)下属的数据库任务组提出了著名的DBTG报告,并在1970年提出了该报告的修订版。
这份报告定义了数据库操纵语言、模式定义语言和子模式定义语言的概念。
数据库操纵语言用于编写操纵概念视图的应用程序,模式定义语言用来编写概念视图和内部视图相结合的模式程序。
在七十年代,开发了许多遵循DBTG报告的网状数据库系统,如:
IDMS,IDS,DMSIIOO等。
七十年代初,E.F.Codd提出了关系数据模型的概念,提出了关系代数和关系演算。
在整个七十年代,关系数据库从理论到实践都取得了辉煌成果。
在理论上,确立了完整的关系理论、数据依赖理论以及关系数据库的设计理论等等;在实践上,开发了许多著名的关系数据库系统,如:
systemR,INGRES,ORACLE等。
1986年美国国家标准协会(ANSI)通过了关系数据库查询语言SQL的文本标准。
进入八十年代以后,随着计算机硬件技术的提,使得计算机应用不断深入,产生了许多新的应用领域,如:
计算机辅助设计、计算机辅助教学、计算机辅助制造、计算机辅助工程、计算机集成制造、办公自动化、地理信息处理、智能信息处理等等。
这些新的应用领域对数据库系统提出了新要求。
由于没能设计出一个统一的数据模型来表示这些新型数据及其相互联系,所以出现了百家争鸣的局面,产生了演绎数据库(逻辑数据库,知识库)、面向对象数据库、工程数据库、时态数据库、地理数据库、模糊数据库、积极数据库、…等新型数据库的研究。
到八十年代后期和九十年代初期,出现了面向对象数据库系统,如:
GemStone,VBASE,ORION,Iris等。
到目前为止,真正的新一代数据库系统还没有出现。
1.2.3与数据库系统通讯
结构化查询语言(StructuredQueryLanguage,SQL)是当今主要的查询语言,它主要用于管理主流类型的DBMS—关系型DBMS(RDBMS)。
所有与数据库相关的通信往来都将通过DBMS完成,为了做这件事,你可以使用SQL或其他类似的东西。
数据库系统管理员(DBA)使用查询语言来建立并维护数据库,用户使用查询语言来访问数据库并查看或更改数据。
1.2.4MySQL的体系结构
因为MySQL采用的是客户机/服务器体系结构,所以你在使用MySQL时存取数据时,必须至少使用两个或者说两类程序:
1、一个位于存放您的数据的主机上的程序——数据库服务器。
数据库服务器监听从网络上传过来的客户机的请求并根据这些请求访问数据库的内容,以便向客户机提供它们所要求的信息。
2、连接到数据库服务器的程序——客户机,这些程序是用户和服务器交互的工具,告诉服务器需要什么信息的查询。
MySQL分发包包括服务器和几个客户机程序。
可根据要你要达到的目的来选择使用客户机。
最常用的客户机程序为mysql,这是一个交互式的客户机程序,它能发布查询并看到结果。
其他的客户机程序有:
mysqldump和mysqlimport,分别导出表的内容到某个文件或将文件的内容导入某个表;mysqladmin用来查看服务器的状态并完成管理任务,如告诉服务器关闭、重起服务器、刷新缓存等。
如果具有现有的客户程序不满足你的需要,那么MySQL还提供了一个客户机编程库,可以编写自己的程序。
客户机编程库可直接从C程序中调用,如果希望使用C语言以外的其他语言,还有几种其他的接口可用。
MySQL的客户机/服务器体系结构具有如下优点:
1、服务器提供并发控制,使两个用户不能同时修改相同的记录。
所有客户机的请求都通过服务器处理,服务器分类辨别谁准备做什么,何时做。
如果多个客户机希望同时访问相同的表,它们不必互相裁决和协商,只要发送自己的请求给服务器并让它仔细确定完成这些请求的顺序即可。
2、不必在数据库所在的机器上注册。
MySQL可以非常出色的在因特网上工作,因此您可以在任何位置运行一个客户机程序,只要此客户机程序可以连接到网络上的服务器。
当然不是任何人都可以通过网络访问你的MySQL服务器。
MySQL含有一个灵活而又有成效的安全系统,只允许那些有权限访问数据的人访问。
而且可以保证用户只能够做允许他们做的事。
1.2.5总结
本节简单介绍了一下关系数据库系统的基础知识,真正要详尽描述数据库系统的理论,完全可以写成几本书。
读完本节之后,笔者希望读者能够了解什么是关系模型、SQL语言以及MySQL的系统结构,这不仅对继续阅读本书有利,也可以在读者获取相关知识时,起到一个启发的作用。
1.3MySQL使用的SQL语言
MySQL使用结构化查询语言(StructuredQueryLanguage,SQL)与服务器通讯。
MySQL系统使用的SQL语言基本上符合SQL92的标准,但是其对SQL92标准既有扩展,又有未实现的地方。
1.3.1表、列和数据类型
表是数据在一个MySQL数据库中的存储机制,如表1-1所示,它包含一组固定的列。
表中的列描述该表所跟踪的实体的属性,每个列都有一个名字及各自的特性。
列由两部分组成:
数据类型(datatype)和长度(length)。
对于使用NUMERIC数据类型的列,可以指定列的小数位及精度特性,精度决定数值的有效位数,小数位表示数值的小数点位置。
说明为NUMERIC(9,2)的列表示该列总共有9位数,其中2位数在小数点右边。
缺省的数值精度为10位数。
表1-1一个数据表techers
Id
Name
Tel
Sex
1
Tom
M
2
Marry
F
3
Mike
M
4
Jerry
M
…
…
…
…
注意,在上表中你可能会有每行记录是按顺序记录的印象,假设你想取出表中的前十个记录。
使用传统的编程语言,你可以做一个循环,取出前十个记录后结束循环。
但使用标准的SQL查询,这是不可能实现的。
因为在关系数据模型中,记录就是行是没有顺序的,也就是说,在一个表中不存在前十个记录这种概念。
1.3.2函数
函数(function)是存储在数据库中的代码块。
其差别在于函数可以把值返回调用程序。
你可以建立自己的函数,并在SQL语句中调用它们,就像执行Oracle提供的函数一样。
例如,MySQL提供一个SUBSTRING函数来执行字符串上的“取子串”操作,如果创建一个叫做MYSUB的函数来执行一个自定义的取子串操作,就可以在一个SQL命令中调用它:
SELECTMYSUB("Thisisatest",6,2)
1.3.3SQL的语句
SQL是一种典型的非过程化程序设计语言,这种语言的特点是:
只指定哪些数据被操纵,至于对这些数据要执行哪些操作,以及这些操作是如何执行的,则未被指定。
非过程化程序设计语言的优点在于它的简单易学,因此已经成为关系数据库访问和操纵数据的标准语言。
与之相对应的是过程化程序设计语言,我们平常熟悉的各种高级程序设计语言都属于这一范畴。
这种语言的特点是:
一条语句的执行是与其前后的语句和控制结构(如条件语句、循环语句等)相关的。
与SQL相比,这些语言显得比较复杂,但优点是使用灵活,数据操纵能力非常强大。
这种语言被设计为不允许你按照某种特定的顺序来取出记录,因为这样做会降低SQLSever取记录的效率。
使用SQL,你只能按查询条件来读取记录。
当考虑如何从表中取出记录时,自然会想到按记录的位置读取它们。
例如,也许你会尝试通过一个循环,逐个记录地扫描,来选出特定的记录。
在使用SQL时,你必须训练自己,不要有这种思路。
假如你想选出所有的名字是“Tom”的记录,如果使用传统的编程语言,你也许会构造一个循环,逐个查看表中的记录,看名字域是否是“Tom”。
这种选择记录的方法是可行的,但是效率不高。
使用SQL,你只要说,“选择所有名字域等于Tom的记录”,SQL就会为你选出所有符合条件的记录。
SQL会确定实现查询的最佳方法。
例如,我们从表1-1中取出id为1的数据:
SELECT*FROMteachersWHEREid=1
相同的功能用普通的高级语言,也许需要一个复杂的循环。
1.3.4总结
在这一节中,简单介绍了SQL查询语言的基本知识,对于列数据类型、SQL的各种语句,将在以后的章节中介绍,这是一个很长的过程。
1.4MySQL数据处理
MySQL支持大量的列类型,它可以被分为3类:
数字类型、日期和时间类型以及字符串(字符)类型。
本节首先给出可用类型的一个概述,并且总结每个列类型的存储需求,然后提供每个类中的类型性质的更详细的描述。
概述有意简化,更详细的说明应该考虑到有关特定列类型的附加信息,例如你能为其指定值的允许格式。
1.4.1MySQL的数据
MySQL有几种数据类型,你应该了解它们是怎么使用的:
1.4.1.1、字符串值
字符串是类似”Ilikemysql.”和’MySQLispowerful.’等这样的值,它们既可以用双引号括起来,也可以是用单引号。
在字符串中不仅可以使用普通的字符,也可使用几个转义序列,它们用来表示特殊的字符,见表1-2。
每个转义序列以一个反斜杠(“\”)开始,指出后面的字符使用转义字符来解释,而不是普通字符。
注意NUL字节与NULL值不同;NUL为一个零值字节,而NULL代表没有值。
表1-2字符串转移序列表
序列
涵义
\0
一个ASCII0(NUL)字符
\n
一个新行符
\r
一个回车符(Windows中使用\r\n作为新行标志)
\t
一个定位符
\b
一个退格符
\’
一个单引号(“'”)符
\”
一个双引号(“"”)符
\\
一个反斜线(“\”)符
\%
一个“%”符。
它用于在正文中搜索“%”的文字实例,否则这里“%”将解释为一个通配符
\_
一个“_”符。
它用于在正文中搜索“_”的文字实例,否则这里“_”将解释为一个通配符
现在需要注意的是,如何在串中使用引号,你可以有多种办法:
●如果串是用相同的引号括起来的,那么在串中需要引号的地方重复写该引号即可。
●如果串是用另外的引号括起来的,则不需要双写相应引号,直接在串中使用,该引号不被特殊对待。
●使用反斜杠,用转移序列的方式表示;这种方法不去管用来将串括起的是单引号还是双引号。
例如,下面语句的结果是:
mysql>SELECT'hello','"hello"','""hello""','hel''lo','\'hello';
+-------+---------+-----------+--------+--------+
|hello|"hello"|""hello""|hel'lo|'hello|
+-------+---------+-----------+--------+--------+
1.4.1.2数字值
MySQL中的数字是类似于100或3.这样的值。
MySQL支持说明为整数(无小数部分)或浮点数(有小数部分)的值:
●整数由数字序列组成。
浮点数由一个阿拉伯数字序列、一个小数点和另一个阿拉伯数字序列组成。
两个阿拉伯数字序列可以分别为空,但不能同时为空。
●MySQL支持科学表示法。
科学表示法由整数或浮点数后跟“e”或“E”、一个符号(“+”或“-”,必须具有)和一个整数指数来表示。
●数值前可放一个负号“-”以表示负值。
例如,下面都是合法的数值:
整数值:
12210-32
浮点数:
294.42-32032.6809e+10148.
下面的值是错误的:
1.34E12
1.4.1.3十六进制值
MySQL支持十六进制值。
以十六进制形式表示的整数由“0x”后跟一个或多个十六进制数字(”0”到“9”及“a”到“f”)组成。
例如,0x0a为十进制的10,而0xffff为十进制的65535。
十六进制数字不区分大小写,但其前缀“0x”不能为“0X”。
即0x0a和0x0A都是合法的,但0X0a和0X0A不是合法的。
在数字上下文,它们表现类似于一个整数(64位精度)。
在字符串上下文,它们表现类似于一个二进制字符串,这里每一对十六进制数字被变换为一个字符。
例如:
mysql>select0xc+0,0xc;
其结果为:
+--------------+------------+
|0xc+0|0xc|
+--------------+------------+
||Paul|
+--------------+------------+
1.4.1.4日期和时间值
日期和时间值是一些类似于“1999-06-17”或“12:
30:
43”这样的值。
MySQL还支持日期/时间的组合,如“1999-06-1712:
30:
43”。
需要要特别注意的是,MySQL是按年-月-日的顺序表示日期的。
这可能与你学过的高级语言不同。
1.4.1.4NULL值
NULL值可适用于各种列类型,它通常用来表示“没有值”、“无数据”等意义,并且不同于例如数字类型的0为或字符串类型的空字符串。
1.4.2列类型概述
数据库中的每个表都是由一个或多个列构成的。
可以用CREATETABLE语句创建一个表,创建表时要为每列指定一个类型。
列的类型与数据类型相对应,但是比数据类型更为具体,用列类型描述表列可能包含的值的种类以及范围,列的值必须符合规定,不能包含对应的数据类型所允许的所有值。
例如,CHAR(16)就规定了存储的字符串值必须是16位。
当然不是你必须存储16个字符,而是指列在表中要占16个字符的宽度的。
MySQL的列类型是一种手段,通过这种手段可以描述一个表列包含什么类型的值,这又决定了MySQL怎样处理这些值。
例如,数值值既可用数值也可用串的列类型来存放,但是根据存放这些值的类型,MySQL对它们的处理将会有些不同。
每种列类型都有几个特性如下:
●其中可以存放什么类型的值。
●值要占据多少空间,以及该值是否是定长的(所有值占相同数量的空间)或可变长的(所占空间量依赖于所存储的值)。
●该类型的值怎样比较和存储。
●此类型是否允许NULL值。
●此类型是否可以索引。
下面是创建一个表的例子:
CREATETABLEteacher
(
idTINYINTUNSIGNEDNOTNULL,
nameCHAR(16)NOTNULL,
teleNUMERIC(8),
sexENUM("F","M")DEFAULT"M"
)
由上面这个例子可以知道,创建列类型的语法是:
col_namecol_type[col_attributes][general_attributes]
●col_name列的名字
●col_type列类型,控制存储在列中的数据类型
●col_attributes专用属性,只能应用于制定列,例如,我们还不知道的BINARY。
如果你使用专用属性,必须在列的类型之后,列的通用属性之前。
●general_attributes通用属性,可以应用在出少数列的任意列,例如上面提到了NULL、NOTNULL、和DEFAULT。
我们将简要地考察一下MySQL列类型以获得一个总的概念,然后更详细地讨论描述每种列类型的属性。
MySQL的数字类型如表1-3所示,可以包括浮点类型和整数类型:
表1-3MySQL的数字列类型
类型名
涵义
TINYI