数据库的用途
数据库系统本质上是用来管理各种信息的。这些信息来自于不同的地方,比如,奥运会上运动员的各种数据统计、公司销售统计、学生成绩、财务报表等。如果一项工作很简单,那就不需要用到数据库。比如上街购物,我只需要在白纸上列出购物清单,购买后在上面划个对勾就行了,即使你身上带有掌上电脑,也不需要用到数据库。
数据库系统主要用在组织和管理的信息很庞大或很复杂,用手工处理极为繁重时。比如病人到医院就医,需要通过挂号、就诊、买药、住院、治疗、康复等一系列程序。挂号就要登记病人姓名、性别、年龄等情况。买药的时候医院依据药单从成千上万种药物中挑出符合要求的药品,需要知道药的品名、具体位置、库存多少、存取多少等等。如果病人很多,医院选药就很复烦了。如果手工处理,工作量大,而且有可能调拿错药。这时如果通过数据库处理,只需简单地输入药品名就马上可以知道具体位置、库存还有多少等详细情况。这样是不是很方便、提高了效率,并且还避免了拿错药的情况。
数据库系统的组成
数据库应用系统主要包括数据库(DataBase,简称DB)、数据库管理系统(DataBaseManagementSystem,简称DBMS)、数据库应用3大部分。这3部分之间的关系如图1所示。
图1
实际的数据库可能相当复杂,对数据库的操作就更加复杂。为了更有效地管理和操作数据库,人们研制出数据库管理系统(DataBaseManagementSystem,简称DBMS)。DBMS是用于操作数据库的软件产品。我们平常说的数据库Oracle、MSSQLServer、MySQL、Sybase、FoxPro、Access等等,都是属于DBMS范畴。虽然这些DBMS产品的功能各有所异,但是基本功能到大同小异差不多。
MySQL介绍
MySQL是一个真正的多用户、多线程SQL数据库服务器,它是一个客户机/服务器结构的实现。MySQL是现在流行的关系数据库中其中的一种,相比其它的数据库管理系统(DBMS)来说,MySQL具有小巧、功能齐全、查询迅捷等优点。MySQL主要目标是快速、健壮和易用。关键的是它是免费的,可以在Internet上免费下载到,并可免费使用。MySQL对于一般中小型,甚至大型应用都能够胜任。
MySQL的官方网站是:http://www.mysql.com。技术支持网站很多,一般如果在学习过程中遇到问题,可以到下列网站寻求支持:
http://www.itpub.net/http://www.linuxforum.net/http://www.csdn.com/http://tech.ccidnet.com/pub/column/c1108.html
最重要的,别忘记了还有:http://www.google.com/http://www.baidu.com/
1.2安装前的准备
Windows系统要求:32位Windows操作系统,例如9x、Me、NT、2000、XP或WindowsServer2003。基于WindowsNT的操作系统(NT,2000,XP,2003),将MySQL服务器做为服务来运行。
如果你计划通过ODBC连接MySQL服务器,你还需要一个连接器/ODBC驱动程序。请参见手册,“MySQLConnector/ODBC”。MyODBC是开放源码软件。你可以在网站http://dev.mysql.com/downloads/connector/odbc/上找到它的最新版本。请注意,2.50.x版采用的是LGPL许可,而3.51.x版采用的是GPL许可。
如果表需要占用的空间大于4GB,则在NTFS或更新的文件系统上安装MySQL。当创建表时不要忘记使用MAX_ROWS和AVG_ROW_LENGTH。请参见13.1.5节,“CREATETABLE语法”。
由于是MySQL基础入门,因此只需要一个MySQL的学习平台即可。所以这里只介绍Windows平台下的安装。
本篇以WindowsXP(带SP2)为安装平台,在Windows2000和Windows2003下的安装与这一样。
所需软件:
WindowsXP操作系统
MySQL4.1.0及其以上版本(包括最新的5.0.20和将来的5.1版本)
首先安装好WindowsXP操作系统,然后从官方网站http://dev.mysql.com/downloads/直接下载MySQL数据库管理软件产品,或者从比较快的镜像网站下载。我是从国内的镜像网站http://mysql.mirror.vmmatrix.net/downloads/mysql/5.0.html
下载的MySQL5.0。其他国家或地区的镜像网站:
http://dev.mysql.com/get/Downloads/MySQL-5.0/mysql-essential-5.0.20a-win32.msi/from/pick。大家如果发现还有比较快的镜像,也告知我一声。
我看见许多刚接触MySQL的朋友都在问如何安装MySQL、为什么安装不成功,我就繁琐、详细地说明如何正确安装MySQL。MySQL有测试版和稳定版,现在最新的测试版是5.1.9-beta,最新的稳定版是5.0.20a,建议初学者安装稳定版。下载后是个ZIP的压缩包:MySQL-5.0.20a-win32.zip(注意找在Windows下使用的安装包),用WinZip或WinRAR解压缩后运行setup.exe进行安装,如图2。
图2
安装过程与其它Windows安装程序一样,首先出现的是安装向导欢迎界面,见图3。
图3
直接点击“Next”,继续,选择安装类型,见图4。
图4
这里有3个类型:Typical(典型)、Complete(完全)、Custom(自定义)。
选择“自定义”(Custom)安装,然后点“Next”下一步,出现自定义安装界面,见图5。
图5
默认情况下MySQL将会被安装到C:\ProgramFiles\MySQL\MySQLServer5.0\文件夹里面。自己可以改路径,点“Change”更改路径。建议不要放在与操作系统同一分区,这样可以防止系统备份还原的时候,数据被清空,按“OK”继续。我更改到了E:\usr\MySQL5020a\目录下,见图6。
在“DeveloperComponents(开发者部分)”上左键单击,选择“Thisfeature,andallsubfeatures,willbeinstalledonlocalharddrive.”,即“此部分,及下属子部分内容,全部安装在本地硬盘上”,在上面的“MySQLServer(mysql服务器)”、“ClientPrograms(mysql客户端程序)”、“Documentation(文档)”也如此操作,以保证安装所有文件,点选“Change...”,手动指定安装目录:
图6
点“OK”后回到自定义安装界面,可看见路径已经改为你设置的路径了,见图7。
图7
点“Next”,准备开始安装,见图8。
图8
点“Install”开始安装,见图9。
图9
直到出现下面的界面(大概5.1之后的版本就没有下面的界面了),完成后出现创建MySQL.com帐号的界面,这个帐号可以用于MySQL官方网站(http://www.mysql.com)登录。如果是首次使用MySQL,选“CreateanewfreeMySQL.comaccout”,见图10。如果已经拥有一个MySQL.COM的帐号,选“LogintoMySQL.com”,填入已拥有的帐号。如果不想注册,选“SkipSign-Up”跳过注册完成安装,见图14。
图10
点“Next”,输入你的Email地址和自己设定的用于登录MySQL.com的密码,见图11。
图11
填完后点“Next”进入第二步填写基本资料,见图12。
图12
在这里填写姓名等相关信息,填完点“Next”,进入第三步填写联系方式,见图13。
图13
填完电话号码、公司名称等信息后,点“Next”,然后出现预览你刚才填的信息的界面,再点“Next”出现安装完成界面,见图14。
图14
注意,图14里面有个配置向导的选项(ConfiguretheMySQLServernow),建议勾选它然后立即开始配置你的MySQL。许多人说安装完MySQL后无法启动,原因就在于没有配置MySQL。点击“Finish”完成安装,并开始配置MySQL,见图15。
图15配置
点“Next”,进入配置类型选择页面。选“Detailedconfiguration”(详细配置),选择配置方式,“DetailedConfiguration(手动精确配置)”、“StandardConfiguration(标准配置)”,我们选择“DetailedConfiguration”,方便熟悉配置过程:见图16。
图16详细配置
点“Next”,进入服务类型选择页面。选“DeveloperMachine”(开发者机器),这样占用系统的资源不会很多,见图17。选择服务器类型,“DeveloperMachine(开发测试类,mysql占用很少资源)”、“ServerMachine(服务器类型,mysql占用较多资源)”、“DedicatedMySQLServerMachine(专门的数据库服务器,mysql占用所有可用资源)”。当给客户装Mysql是注意应选为后两个之一。
图17DeveloperMachine”(开发者机器
点“Next”后,进入数据库用法选择页面。选择“MultifunctionalDatabase”(多功能数据库),见图18。
选择mysql数据库的大致用途,“MultifunctionalDatabase(通用多功能型,好)”、“TransactionalDatabaseOnly(服务器类型,专注于事务处理,一般)”、“Non-TransactionalDatabaseOnly(非事务处理型,较简单,主要做一些监控、记数用,对MyISAM数据类型的支持仅限于non-transactional),按“Next”继续:
图18多功能数据库
点“Next”,进入选择InnoDB数据存放位置页面,见图19。
图19
对InnoDBTablespace进行配置,就是为InnoDB数据库文件选择一个存储空间,如果修改了,要记住位置,重装的时候要选择一样的地方,否则可能会造成数据库损坏,当然,对数据库做个备份就没问题了,这里不详述,我这里没有修改,使用用默认位置。不用更改设置,直接放在InstallationPath安装目录里即可,然后点“Next”,选择MySQL的同时连接数,见图20。
图20同时连接数
选择您的网站的一般mysql访问量,同时连接的数目,“DecisionSupport(DSS)/OLAP(20个左右)”、“OnlineTransactionProcessing(OLTP)(500个左右)”、“ManualSetting(手动设置,自己输一个数)”,选择“ManualSetting”,设置为100(根据自己需要,酌情设置),点“Next”,配置MySQL在TCP/IP通讯环境中的端口,见图21。
图21
是否启用TCP/IP连接,设定端口,如果不启用,就只能在自己的机器上访问mysql数据库了,我这里启用,把前面的勾打上,PortNumber:3306,在这个页面上,您还可以选择“启用标准模式”(EnableStrictMode),这样MySQL就不会允许细小的语法错误,如果您还是个新手,我建议您取消标准模式以减少麻烦,但熟悉MySQL以后,尽量使用标准模式,因为它可以降低有害数据进入数据库的可能性,按“Next”继续选择默认的3306端口即可。点“Next”,选择MySQL中的字符设置,见图22。
图22
这个比较重要,就是对mysql默认数据库语言编码进行设置,第一个是西文编码,第二个是多字节的通用utf8编码,都不是我们通用的编码,这里选择第三个,然后在CharacterSet那里选择或填入“gbk”,当然也可以用“gb2312”,区别就是gbk的字库容量大,包括了gb2312的所有汉字,并且加上了繁体字、和其它乱七八糟的字——使用mysql的时候,在执行数据操作命令之前运行一次“SETNAMESGBK;”(运行一次就行了,GBK可以替换为其它值,视这里的设置而定),就可以正常的使用汉字(或其它文字)了,否则不能正常显示汉字,按“Next”继续:注意,这里的选择将会影响你是否能在MySQL中使用中文。我们选择gb2312字符集以便支持简体中文,繁体中文选big5,同时支持简/繁体选gbk,同时支持多国语言选utf8。点“Next”,设置Windows服务选项,见图23。
图23“InstallAsWindowsService”一定要勾选
选择是否将mysql安装为windows服务,还可以指定ServiceName(服务标识名称),是否将mysql的bin目录加入到WindowsPATH(加入后,就可以直接使用bin下的文件,而不用指出目录名,比如连接,“mysql.exe-uusername-ppassword;”就可以了,不用指出mysql.exe的完整地址,很方便),我这里全部打上了勾,ServiceName不变。注意,这里的选择很关键。“InstallAsWindowsService”一定要勾选,这是将MySQL作为Windows的服务运行。“ServiceName”就用默认的“MySQL”或者你喜欢的服务名(推荐用默认的“MySQL”)。
下面的“LaunchtheMySQLServerautomatically”一定要勾选,这样Windows启动时,MySQL就会自动启动服务,要不然就要手工启动MySQL。许多人说安装MySQL后无法启动、无法连接、出现10061错误,原因就在这里。点“Next”,设置根帐号root的登录密码,见图24。
图24
这一步询问是否要修改默认root用户(超级管理)的密码(默认为空),“Newrootpassword”如果要修改,就在此填入新密码(如果是重装,并且之前已经设置了密码,在这里更改密码可能会出错,请留空,并将“ModifySecuritySettings”前面的勾去掉,安装配置完成后另行修改密码),“Confirm(再输一遍)”内再填一次,防止输错。
“Enablerootaccessfromremotemachines(是否允许root用户在其它的机器上登陆,如果要安全,就不要勾上,如果要方便,就勾上它)”。最后“CreateAnAnonymousAccount(新建一个匿名用户,匿名用户可以连接数据库,不能操作数据,包括查询)”,一般就不用勾了,设置完毕。
ModifySecuritySettings”是设置根帐号的密码,输入你设定的密码即可。“CreateAnAnonymousAccount”是创建一个匿名帐号,这样会导致未经授权的用户非法访问你的数据库,有安全隐患,建议不要勾选。点“Next”,MySQL配置向导将依据你上面的所有设定配置MySQL,以便MySQL的运行符合你的需要,见图25。
图25
点“Execute”开始配置,当出现“Servicestartedsuccessfully”时,说明你的配置完成,MySQL服务启动成功,见图26。
图26
点“Finish”完成,整个MySQL的配置完成,剩下的就是用MySQL客户端连接MySQL服务器,然后使用了。
在安装和配置MySQL过程中可能会遇到许多问题。
下面是一些经常会遇到的问题,以及相应的解决措施。
(1)配置无法继续,出现“CannotcreateWindowsserviceforMySQL.Error:0”,见图27。
图27
原因:出现这种情况主要是以前安装过MySQL没有卸载干净,致使Windows服务名称重复造成的。
解决方法:指定一个不同的Windows服务名称。
(2)配置时出现连接错误警告,见图28。
图28
原因:出现这种情况有两个原因。一是防火墙阻止了MySQL的端口,二是安装路径在以前安装了的MySQL路径上。
解决方法:第一种情况,制定防火墙规则,让防火墙允许通行MySQL的连接端口,默认是TCP3306端口。第二种情况,删除或者转移安装目录下的文件和data子文件夹。或者指定一个不同于以前安装MySQL的安装目录。
这里有一个比较常见的错误:
1、安装mysql出现writeconfigurationfile通不过,比如:后面的提示是configurationfiletemplateD:\学习\mysql\my-template.inicouldnotbeprocessedandwrittentoD:\学习\mysql\my.ini.errorcode-1
可能原因:安装路径带有中文。
解决办法:换到另外全部是英文和数字的目录安装应该就正常了。
2、不能“Startservice”
可能原因:一般出现在以前有安装mysql的服务器上。
解决办法:先保证以前安装的mysql服务器彻底卸载掉了;不行的话,检查是否按上面一步所说,之前的密码是否有修改,照上面的操作;如果依然不行,将mysql安装目录下的data文件夹备份,然后删除,在安装完成后,将安装生成的data文件夹删除,备份的data文件夹移回来,再重启mysql服务就可以了,这种情况下,可能需要将数据库检查一下,然后修复一次,防止数据出错。
以Windows服务方式启动MySQL
点击开始菜单à设置à控制面板à管理工具à服务,找到mysql服务,点击右键,可以启动或者停止mysql服务,同时可以设置mysql开机自启动。假如设置成手动启动,想用mysql的时候,记得启动一下服务。
说明:
假如点击mysqlcommandlineclient,输入root口令,什么提示也没有,窗口自动关闭。可能的原因有2个:一个是可能mysql服务没启动,另一个是root口令输入不正确。
Mysql安装好后,点开始菜单---->程序---->MySQL---->MySqlServer5.0---->MySQLCommandLineClient出现下图:
此处提示输入root口令,输入刚才安装mysql时设置的root口令,密码是123456。然后出现下图。
我们可以先查看一下mysql中有什么数据库,在mysql>提示符下,输入SHOWDATABASES;出现下图。
图28
information_schema是数据库视图,mysql、test都是系统自带的数据库。
在MySQL中创建表时要熟悉MySQL的数据类型,它与Oracal不同。
面向对象的应用程序接口(API)
Int整型4个字节,但是可以指定长度,最多可指定11个字节
Char定长字符串
DOUBLE浮点型
VARChar(M)[BINARY]一个变长字符串。注意:当值被存储时,尾部的空格被删除(这不同于ANSISQL规范)。M的范围是1~255个字符。VARCHAR值根据缺省字符集以大小写不区分的方式排序和比较,除非给出BINARY关键词值。VARCHAR是CHARACTERVARYING一个缩写。
Datetime一个日期和时间组合。支持的范围是’1000-01-0100:00:00′到’9999-12-3123:59:59′。MySQL以’YYYY-MM-DDHH:MM:SS’格式来显示DATETIME值,但是允许你使用字符串或数字把值赋给DATETIME的列。
Longtext长字符串类型,一个BLOB或TEXT列,最大长度为4294967295(2^32-1)个字符
SQL是StructuredQueryLanguage(结构化查询语言)的英文缩写,MySQL使用SQL语句存储和检索信息。
MySQL支持SQL语句:
数据定义语句(DDL): |
用于改变数据库结构,包括创建、更改和删除数据库对象 |
用于操作表结构的DDL语句有: CREATEDATABASE DROPDATABASE CREATETABLE ALTERTABLE DROPTABLE CREATEINDEX DROPINDEX |
数据操纵语句(DML) |
DML用于检索和修改数据 |
SELECT INSERT UPDATE DELETE |
事务控制语句(TCL) |
事务是最小的工作单元,作为一个整体同时成功或失败,称为事务控制 |
用于事务控制的语句有: STARTTRANSACTION–开始事务处理 COMMIT-提交并结束事务处理 ROLLBACK-撤销事务中已完成的工作 SAVEPOINT–标记事务中可以回滚的点 |
数据控制语句(DCL) |
注意所有的文本命令必须以斜线开始,且以分号结束,不区分大小写
重复上一条命令的快捷键同matlab向上键,在执行前可进行修改
成功地连接后,可以在mysql>提示下输入QUIT或exit;(或\q)随时退出:mysql>quit
使用SHOW语句找出服务器上当前存在什么数据库:mysql>SHOWDATABASES;
+----------+
|Database|
+----------+
|Information_schema|
|mysql|
|test|
+----------+
如果test数据库存在,尝试访问它:mysql>USEtest
Databasechanged
注意,USE,类似QUIT,不需要一个分号,USE语句在使用上也有另外一个特殊的地方:它必须在一个单行上给出。
创建数据库:createdatabasemydata;是database不是databases |
一定要与useename连用,以创建者此数据库之下。
mysql>createtabledept%创建部门表,没有分号 ->(%输入的是(,但是显示的是< ->deptnointprimarykey,%departmentmumber数据类型为int,是主键 ->dnamevarchar(14),%departmentname ->locvarchar(13)%location所在地 ->); QueryOK,0rowsaffected(0.31sec)%表已经创建好,问题解决Query(问题) 创建数据表时开始和结尾要加括号,这里用的是小括号"()",不是"<>",虽然mysql命令行显示是<>。 |
注:主键 MYSQL的primarykey和uniquekey的区别 PrimaryKey与UniqueKey Primarykey与UniqueKey都是唯一性约束。但二者有很大的区别: 1、Primarykey的1个或多个列必须为NOTNULL,如果列为NULL,在增加Primarykey时,列自动更改为NOTNULL。而UNIQUEKEY对列没有此要求。 2、一个表只能有一个PRIMARYKEY,但可以有多个UNIQUEKEY。 |
createtableemp%雇员表
createtableemp ( empnointprimarykey, enamevarchar(10), jobvarchar(10), mgrint, hiredatedatetime, saldouble, commdouble, deptnoint(3),%int可指定长度1-11之间 foreignkey(deptno)referencesdept(deptno)%创建外键deptno引用主键dept的deptno字段 );引用其实就是相等 |
--工资级别表
createtablesalgrade ( gradeint(3)primarykey, losalint(3), hisalint(3) ); |
不同数据库之间的不同主要有:数据类型、分页程序。
用于管理MySQL的数据库和表的内容的软件为MySQLAdminister
12.1查询:查询表中所有数据:select*fromtable_name;
查询指定字段的数据:select字段1,字段2fromtable_name;
例:selectid,usernamefrommytablewhereid=1orderbydesc;多表查询语句------------参照第17条
insertintodeptvalues(deptno,“dname”,“loc”);与上表中的结构对应。
--往部门表中查数据 insertintodeptvalues(10,'Accounting','NewYork'); insertintodeptvalues(20,'Research','Dallas'); insertintodeptvalues(30,'Sales','Chicago'); insertintodeptvalues(40,'Operations','Boston'); insertintodeptvalues(50,'Admin','Washing'); Commit制定好之后提交,托付;交付 |
14.1数据库删除:Dropdatabasedb_name;删除时可先判断是否存在,写成:dropdatabaseifexitsdb_name
14.2删表:droptabletable_name;例:droptablemytable;
14.3删除整个表中的信息,不删除表:deletefromtable_name;
删除表中指定条件的语句:deletefromtable_namewhere条件语句;条件语句如:列名=列内容,注意对字符串要加‘’。
表faults的内容如下:
不同数据库之间的不同主要有:自动递增字段。
mysql>Createtablearticle->(idintprimarykeyauto_increment,%自动递增字段titlevarchar(255)); QueryOK,0rowsaffected(0.20sec) mysql>insertintoarticlevalues(null,'a');将id设为空,title=a插入到表中 QueryOK,1rowaffected(0.25sec) mysql>select*fromarticle;可以看到id自动编号为1 +----+-------+ |id|title| +----+-------+ |1|a| +----+-------+ 1rowinset(0.00sec) mysql>insertintoarticlevalues(null,'b');再将id设为空,title=b插入到表中 QueryOK,1rowaffected(0.27sec) mysql>Select*fromarticle; +----+-------+ |id|title| +----+-------+ |1|a| |2|b| +----+-------+ 2rowsinset(0.00sec) 或者insertintoarticle(title)values(‘c’);%只在title上插值 Select*fromarticle; |
Selectdate_format(now(),‘%y-%m-%d%h:%i:%s);注意使用i表示分钟,不是m
%W星期名字(Sunday……Saturday)
%w一个星期中的天数(0=Sunday……6=Saturday)
%D有英语前缀的月份的日期(1st,2nd,3rd,等等。)
%d月份中的天数,数字(00……31)
%Y年,数字,4位
%y年,数字,2位
%a缩写的星期名字(Sun……Sat)
%e月份中的天数,数字(0……31)
%m月,数字(01……12)
%c月,数字(1……12)
%b缩写的月份名字(Jan……Dec)
%j一年中的天数(001……366)
%H小时(00……23)
%k小时(0……23)
%h小时(01……12)
%I小时(01……12)
%l小时(1……12)
%i分钟,数字(00……59)
%r时间,12小时(hh:mm:ss[AP]M)
%T时间,24小时(hh:mm:ss)
%S秒(00……59)
%s秒(00……59)
%pAM或PM
%U星期(0……52),这里星期天是星期的第一天
%u星期(0……52),这里星期一是星期的第一天
%%一个文字“%”。
向表emp中插入日期,插之前先看看它的结构。
Descemp
程序中deptnoint(3),foreignkey(deptno)referencesdept(deptno)
而insertintodeptvalues(deptno,‘dname’,‘loc’);与上表中的结构对应。
表dept的结构 --往部门表中查数据 insertintodeptvalues(10,'Accounting','NewYork'); insertintodeptvalues(20,'Research','Dallas'); insertintodeptvalues(30,'Sales','Chicago'); insertintodeptvalues(40,'Operations','Boston'); insertintodeptvalues(50,'Admin','Washing'); Commit制定好之后提交,托付;交付 |
所以在填写emp的deptno一项时应该引用dept的deptno。
Insertintoempvalues(1,‘chenyy’,‘market’,123,‘2010-09-0111:11:11’,8000,80,10);