小魔女 发表于 2015-1-16 20:12:32

MYSQL教程之MySQL中数据表操纵详解

一些典型的RDBMS功能并不总是在DBaaS系统中可用。例如MySQL学习教程,WindowsAzureSQLDatabase(以前的SQLAzure)是微软的DBaaS产品,提供了一个类似于SQLServer的数据库平台。择要:本文解说了MySQL数据库中表的操纵办法。经由过程本文的进修您应当把握怎样在MySQL中创立表、删除表,怎样改动表的布局、名字,怎样利用mysqlshow有用程序等。
利用MySQL,今朝你能够在三种基础数据库表格局间选择。当你创立一张表时,你能够告知MySQL它应当关于表利用哪一个表范例。MySQL将老是创立一个.frm文件保留表和列界说。视表范例而定,索引和数据将在其他文件中存储。
你能用ALTERTABLE语句在分歧范例的表之间变更。
MyISAM
在MySQL3.23中,MyISAM是缺省表格范例,它是基于ISAM代码而且有良多有效的扩大。索引存储在一个有.MYI(MYindex)扩大名的文件而且数据存储在有.MYD(MYData)扩大名的文件中。你能用myisamchk有用程序反省/修复MyISAM表。
ISAM
你也能够利用保持的ISAM。这将在不久消散,由于MyISAM是统一个器材的更好完成。ISAM利用一个B-tree索引,这个索引存储在一个有.ISM扩大名的文件中而且数据存储在有.ISD扩大名的文件中,你可用isamchk有用程序反省/修复ISAM表。ISAM表不是跨OS/平台二进制可移植的。
HEAP
HEAP表格利用一个杂凑(hashed)索引而且存储在内存中。这使他们更快,可是假如MySQL溃散,你将得到一切存储的数据。HEAP作为一时表很可用!
用SHOW/DESCRIBE语句显现数据表的信息
句法:
SHOWTABLES
orSHOWCOLUMNSFROMtbl_name
orSHOWINDEXFROMtbl_name
orSHOWTABLESTATUS
{DESCRIBE|DESC}tbl_name{col_name|wild}

你能利用db_name.tbl_name作为tbl_nameFROMdb_name句法的另外一种选择。
SHOWTABLES列出在一个给定的数据库中的表。你也能够用mysqlshowdb_name命令失掉这张表。
注重:假如一个用户没有一个表的任何权限,表将不在SHOWTABLES或mysqlshowdb_name中的输入中显现。
SHOWCOLUMNS列出在一个给定表中的列。假如列范例分歧于你希冀的是基于CREATETABLE语句的那样,注重,MySQL偶然改动列范例。
DESCRIBE语句供应了相似SHOWCOLUMNS的信息。DESCRIBE供应关于一张表的列的信息。col_name能够是一个列名字或包括SQL的“%”和“_”通配符的一个字符串。这个语句为了与Oracle兼容而供应的。
SHOWTABLESTATUS(在版本3.23引进)运转相似SHOWSTATUS,可是供应每一个表的更多信息。你也能够利用mysqlshow--statusdb_name命令失掉这张表。
SHOWFIELDS是SHOWCOLUMNS一个同义词,SHOWKEYS是SHOWINDEX一个同义词。
你也能够用mysqlshowdb_nametbl_name或mysqlshow-kdb_nametbl_name列出一张表的列或索引。
SHOWINDEX以十分类似于ODBC的SQLStatistics挪用的格局前往索引信息。
利用mysqlshow工具失掉信息
上面复杂先容一下mysqlshow有用程序的用法,在失掉数据库和表的信息上,利用起来十分便利。
失掉已无数据库的列表:
shell>mysqlshow
列出某数据库db_name中已有的表:
shell>mysqlshowdb_name
列出某数据库表db_name.tbl_name的布局信息:
shell>mysqlshowdb_nametbl_name
列出一张表的索引:
shell>mysqlshowCkdb_nametbl_name
用CREATETABLE语句创立数据表
用CREATETABLE语句创立表。此语句的完全语法是相称庞大的,由于存在那末多的可选子句,但在实践中此语句的使用相称复杂。如我们在第1章中利用的一切CREATETABLE语句都不那末庞大。
成心思的是,年夜多半庞大器材都是一些子句,这些子句MySQL在剖析后抛弃。参阅附录1能够看到这些庞大的器材。
1、CREATETABLE语句的基础语法
CREATETABLEtbl_name(create_definition,...)
create_definition:col_nametype


在MySQL3.22或今后版本中,表名能够被指定为db_name.tbl_name,不论有无以后的数据库都能够。
比方,创立一个会见者留言表:
shell>mysqlCurootCp
mysql>createdatabasemytest;
mysql>CREATE TABLE guestbook
->(
->visitorVARCHAR(40),
->commentsTEXT,
->entrydateDATETIME
->);

假如统统一般,庆祝你,你已创建了你的第一个表!
你所创立的表名为guestbook,你可使用这个表来存储来字你站点会见者的信息。你是用REEATETABLE语句创立的这个表,这个语句有两部分:第一部分指定表的名子;第二部分是括在括号中的各字段的称号和属性,互相之间用逗号离隔。
表guestbook有三个字段:visitor,comments和entrydate。visitor字段存储会见者的名字,comments字段存储会见者对你站点的定见,entrydate字段存储会见者会见你站点的日期和工夫。
注重每一个字段名前面都跟有一个专门的表达式。比方,字段名comments前面跟有表达式TEXT。这个表达式指定了字段的数据范例。数据范例决意了一个字段能够存储甚么样的数据。由于字段comments包括文本信息,其数据范例界说为文本型。
2、怎样指定表的范例
你也能够在创立表时指定表的范例,假如不指定表的范例,在3.22及之前版本中缺省为ISAM表,在3.23版本中缺省为MyISAM表。你应当只管利用MyISAM表。指定表的范例常常用于创立一个HEAP表:
mysql>CREATETABLEfast(idint,articlesTEXT)TYPE=HEAP;
3、隐含的列申明的改动
在某些情形下,MySQL隐含地改动在一个CREATETABLE语句给出的一个列申明。(这也大概在ALTERTABLE。)长度小于4的VARCHAR被改动为CHAR。假如在一个表中的任何列有可变长度,了局是全部行是变长的。因而,假如一张表包括任何变长的列(VARCHAR、TEXT或BLOB),一切年夜于3个字符的CHAR列被改动为VARCHAR列。这在任何方面都不影响你怎样利用列;在MySQL中,VARCHAR只是存储字符的一个分歧办法。MySQL实行这类改动,是由于它节俭空间而且使表操纵更快速。
TIMESTAMP的显现尺寸必需是偶数且在2~14的局限内。假如你指定0显现尺寸或比14年夜,尺寸被强迫为14。从1~13局限内的奇数值尺寸被强迫为下一个更年夜的偶数。
你不克不及在一个TIMESTAMP列内里存储一个笔墨NULL;将它设为NULL将设置为以后的日期和工夫。由于TIMESTAMP列体现就是如许,NULL和NOTNULL属性不以一样平常的体例使用而且假如你指定他们,将被疏忽。DESCRIBEtbl_name老是呈报该TIMESTAMP列大概付与了NULL值。
假如你想要晓得MySQL是不是利用了除你指定的之外的一种列范例,在创立或改动你的表以后,收回一个DESCRIBEtbl_name语句便可。
使用SELECT的了局创立表
干系数据库的一个主要观点是,任何数据都暗示为行和列构成的表,而每条SELECT语句的了局也都是一个行和列构成的表。在很多情形下,来自SELECT的“表”仅是一个跟着您的事情在显现屏上转动的行和列的图象。在MySQL3.23之前,假如想将SELECT的了局保留在一个表中以便今后的查询利用,必需举行特别的布置:
1)运转DESCRIBE或SHOWCOLUMNS查询以断定想从中猎取信息的表中的列范例。
2)创立一个表,明白地指定方才检察到的列的称号和范例。
3)在创立了该表后,公布一条INSERT...SELECT查询,检索出了局并将它们拔出所创立的表中。
在MySQL3.23中,全都作了修改。CREATETABLE...SELECT语句打消了这些华侈工夫的器材,使得能使用SELECT查询的了局间接得出一个新表。只需一步就能够完成义务,不用晓得或指定所检索的列的数据范例。这使得很简单创立一个完整用所喜好的数据添补的表,而且为进一步查询作了筹办。
假如你在CREATE语句后指定一个SELECT,MySQL将为在SELECT中一切的单位创键新字段。比方:
mysql>CREATETABLEtest
->(aintnotnullauto_increment,primarykey(a),key(b))
->SELECTb,cfromtest2;

这将创立一个有3个列(a,b,c)的表,个中b,c列的数据来自表test2。注重假如在拷贝数据进表时产生任何毛病,表将主动被删除。
能够经由过程选择一个表的全体内容(无WHERE子句)来拷贝一个表,或使用一个老是失利的WHERE子句来创立一个空表,如:
mysql>CREATETABLEtestSELECT*fromtest2;
mysql>CREATETABLEtestSELECT*fromtest2where0;

假如但愿使用LOADDATA将一个数据文件装进本来的文件中,而不敢一定是不是具有指定的准确数据格局时,创立空拷贝很有效。您其实不但愿在第一次未失掉准确的选项时以本来表中畸形的纪录而了结。使用原表的空拷贝同意对特定的列和行分开符用LOADDATA的选项举行实验,直到对输出数据的注释中意时为止。在中意以后,就能够将数据装进原表了。
可分离利用CREATETEMPORARYTABLE与SELECT来创立一个一时表作为它本身的拷贝,如:
这同意修正my_tbl的内容而不影响本来的内容。在但愿实验对某些修正表内容的查询,而又不想变动原表内容时,如许做很有效。为了利用使用原表名的事后编写的剧本,不必要为援用分歧的表而编纂这些剧本;只需在剧本的肇端处增添CREATETEMPORARYTABLE语句便可。响应的剧本将创立一个一时拷贝,并对此拷贝举行操纵,当剧本停止时服务器会主动删除这个拷贝。
要创立一个作为本身的空拷贝的表,能够与CREATETEMPORARY...SELECT一同利用WHERE0子句,比方:
但创立空表时有几点要注重。在创立一个经由过程选择数据添补的表时,其列名来自所选择的列名。假如某个列作为表达式的了局盘算,则该列的“称号”为表达式的文本。表达式不是正当的列名,可在mysql中运转以下查询懂得这一点:
为了一般事情,可为该列供应一个正当的别称:
假如选择了来自分歧表的具有不异称号的列,将会呈现必定的坚苦。假定表t1和t2二者都具有列c,而您但愿创立一个来自两个表中行的一切组合的表。那末能够供应别号指定新表中唯一性的列名,如:经由过程选择数据举行添补来创立一个表并会主动拷贝原表的索引。
用ALTERTABLE语句修正表的布局
偶然你大概必要改动一下现有表的布局,那末AlterTable语句将是你的符合选择。
增添列
altertabletbl_nameaddcol_nametype
比方,给表增添一列weight
mysql>altertablepetaddweightint;
删除列
altertabletbl_namedropcol_name
比方,删除列weight:
mysql>altertablepetdropweight;
改动列
altertabletbl_namemodifycol_nametype
比方,改动weight的范例:
mysql>altertablepetmodifyweightsamllint;
另外一种办法是:
altertabletbl_namechangeold_col_namecol_nametype
比方:
mysql>altertablepetchangeweightweightsamllint;
给列改名
mysql>altertablepetchangeweightwei;
给表改名
altertabletbl_namerenamenew_tbl
比方,把pet表改名为animal
mysql>altertablepetrenameanimal;
改动表的范例
别的,能够为列增添或删除索引等属性,不再胪陈,请参阅附录。
用DROPTABLE语句删除数据表
DROPTABLEtbl_name[,tbl_name,...]
DROPTABLE删除一个或多个数据库表。一切表中的数据和表界说均被删除,故当心利用这个命令!
在MySQL3.22或今后版本,你可使用关头词IFEXISTS类制止不存在表的一个毛病产生。
比方:
mysql>USEmytest;
mysql>DROPTABLEguestbook;
大概,也能够同时指定命据库和表:
mysql>DROPTABLEmytest.guestbook;
总结
本节报告了有关表的年夜部分操纵,如今将所述内容总结以下:
MySQL的表的三品种型
怎样创立表、删除表
怎样改动表的布局、名字
怎样利用mysqlshow有用程序
据我的观察,现在有一个趋势,那些经过正式培训的数据库管理员DBA更倾向于选择一个专有关系数据库,例如Oracle。对于一些具有专门数据库管理员的比较大的环境来说,MySQL很难得到宠爱,这时候,关于MySQL是否真的具有良好的可扩展性的争论已经没有意义。

小魔女 发表于 2015-1-18 18:42:28

如果是将来做数据库的开发设计,就应该详细学习T-SQL的各种细节,包括T-SQL的程序设计、存储过程、触发器以及具体使用某个开发语言来访问数据库。

小妖女 发表于 2015-1-27 17:22:57

where子句的作用是在对查询结果进行分组前,将不符合where条件的行去掉,即在分组之前过滤数据,条件中不能包含聚组函数,使用where条件显示特定的行。

仓酷云 发表于 2015-2-5 14:31:55

以前的DTS轻盈简单。但是现在的SSIS虽然功能强大了很多,但是总是让人感觉太麻烦。看看论坛中询问SSIS的贴子就知道。做的功能太强大了,往往会有很多用户不会用了

深爱那片海 发表于 2015-2-12 07:02:00

一直以来个人感觉SQLServer的优化器要比Oracle的聪明。SQL2005的更是比2k聪明了不少。(有次作试验发现有的语句在200万级时还比50万级的相同语句要快show_text的一些提示没有找到解释。一直在奇怪。)

若相依 发表于 2015-3-3 01:07:03

SQLServer的异构移植功能个人感觉最好了。(如果对比过SQLServer的链接服务器和Oracle的透明网关的朋友会发现SQLServer的sp_addlinkedserver(openquery)异构数据库系列比Oracle真是强太多了。)

海妖 发表于 2015-3-11 08:45:42

其实可以做一下类比,Oracle等数据库产品老早就支持了java编程,而且提供了java池参数作为用户配置接口。但是现在有哪些系统大批使用了java存储过程?!连Oracle自己的应用都不用为什么?!

莫相离 发表于 2015-3-18 03:10:49

只能告诉你,学好数据库语言和原理,多见识几种数据库软件,比一棵树上吊死要好。

愤怒的大鸟 发表于 2015-3-25 10:35:16

我是新手,正在学习数据库和操作系统,深感理论的泛广,唯有一步一步来,但是又感觉时间不够,收集了很多资料却总是没能认真的看完,希望有一个讨论板块,大家共同解决,共同分享,共同努力
页: [1]
查看完整版本: MYSQL教程之MySQL中数据表操纵详解