MySQL使用交流.docx
《MySQL使用交流.docx》由会员分享,可在线阅读,更多相关《MySQL使用交流.docx(70页珍藏版)》请在冰豆网上搜索。
![MySQL使用交流.docx](https://file1.bdocx.com/fileroot1/2023-5/15/5478d083-d440-4019-b813-4f892de86ffa/5478d083-d440-4019-b813-4f892de86ffa1.gif)
MySQL使用交流
Mysql使用交流
体验了几天Mysql,有些感想,分享给大家,供参考。
本次仅从优化实际使用出发,以话单为例子进行一次完整分析流程分析,分别进行了
✓软件安装
✓客户端连接数据库
✓数据库基本操作
✓话单分析实例
如果需要进一步了解学习Mysql,可以参考Mysql安装手册。
1.软件安装
软件安装非常简单,按向导进行安装和配置即可,记得设置root密码以供后续连接数据库使用。
mysql下载地址:
详细安装方法请参照Mysql安装手册安装MySQL
2.客户端连接数据库
Mysql有很多客户端端,有兴趣可以度娘一下,挑一个自己喜欢的。
一个做开发的同事推荐了一个叫NavicatforMysql,试用了几天,非常不错。
界面简单,图形可视化操作,不想码sql的有福了。
非常适合入门。
使用非常简单,安装后即可使用。
有图有真像
连接数据库
新建表
表查询
命令行界面
3.Mysql数据库基本操作(转自Mysql安装手册)
本节通过演示如何使用mysql客户程序创造和使用一个简单的数据库,提供一个MySQL的入门教程。
mysql(有时称为“终端监视器”或只是“监视”)是一个交互式程序,允许你连接一个MySQL服务器,运行查询并察看结果。
mysql可以用于批模式:
你预先把查询放在一个文件中,然后告诉mysql执行文件的内容。
本节将介绍使用mysql的两个方法。
本节假定mysql已经被安装在你的机器上,并且有一个MySQL服务器可以连接。
否则,请联络MySQL管理员。
本节描述建立和使用一个数据库的全过程。
如果你仅仅对访问一个已经存在的数据库感兴趣,可以跳过描述怎样创建数据库及它所包含的表的章节。
由于本节是一个教程,省略了许多细节。
关于这里所涉及的主题的详细信息,请查阅Mysql安装手册的相关章节。
3.1. 输入查询
确保你连接上了服务器,如在先前的章节讨论的。
连接上服务器并布代表选择了任何数据库,但这样就可以了。
知道关于如何查询的基本知识,比马上跳至创建表、给他们装载数据并且从他们检索数据更重要。
本节描述输入命令的基本原则,使用几个查询,你能尝试了解mysql是如何工作的。
这是一个简单的命令,要求服务器告诉它的版本号和当前日期。
在mysql>提示输入如下命令并按回车键:
mysql>SELECTVERSION(),CURRENT_DATE;
+-----------------+--------------+
|VERSION() |CURRENT_DATE|
+-----------------+--------------+
|5.1.2-alpha-log|2005-10-11 |
+-----------------+--------------+
1rowinset(0.01sec)
mysql>
这询问说明mysql的几个方面:
· 一个命令通常由SQL语句组成,随后跟着一个分号。
(有一些例外不需要分号。
早先提到的QUIT是一个例子。
后面我们将看到其它的例子。
)
· 当发出一个命令时,mysql将它发送给服务器并显示执行结果,然后显示另一个mysql>显示它准备好接受其它命令。
· mysql用表格(行和列)方式显示查询输出。
第一行包含列的标签,随后的行是查询结果。
通常,列标签是你取自数据库表的列的名字。
如果你正在检索一个表达式而非表列的值(如刚才的例子),mysql用表达式本身标记列。
· mysql显示返回了多少行,以及查询花了多长时间,它给你提供服务器性能的一个大致概念。
因为他们表示时钟时间(不是 CPU 或机器时间),并且因为他们受到诸如服务器负载和网络延时的影响,因此这些值是不精确的。
(为了简洁,在本章其它例子中不再显示“集合中的行”。
)
能够以大小写输入关键词。
下列查询是等价的:
mysql>SELECTVERSION(),CURRENT_DATE;
mysql>selectversion(),current_date;
mysql>SeLeCtvErSiOn(),current_DATE;
这是另外一个查询,它说明你能将mysql用作一个简单的计算器:
mysql>SELECTSIN(PI()/4),(4+1)*5;
+------------------+---------+
|SIN(PI()/4) |(4+1)*5|
+------------------+---------+
|0.70710678118655| 25|
+------------------+---------+
1rowinset(0.02sec)
至此显示的命令是相当短的单行语句。
你可以在一行上输入多条语句,只需要以一个分号间隔开各语句:
mysql>SELECTVERSION();SELECTNOW();
+-----------------+
|VERSION() |
+-----------------+
|5.1.2-alpha-log|
+-----------------+
1rowinset(0.00sec)
+---------------------+
|NOW() |
+---------------------+
|2005-10-1115:
15:
00|
+---------------------+
1rowinset(0.00sec)
不必全在一个行内给出一个命令,较长命令可以输入到多个行中。
mysql通过寻找终止分号而不是输入行的结束来决定语句在哪儿结束。
(换句话说,mysql接受自由格式的输入:
它收集输入行但直到看见分号才执行。
)
这里是一个简单的多行语句的例子:
mysql>SELECT
->USER()
->,
->CURRENT_DATE;
+---------------+--------------+
|USER() |CURRENT_DATE|
+---------------+--------------+
|jon@localhost|2005-10-11 |
+---------------+--------------+
在这个例子中,在输入多行查询的第一行后,要注意提示符如何从mysql>变为->,这正是mysql如何指出它没见到完整的语句并且正在等待剩余的部分。
提示符是你的朋友,因为它提供有价值的反馈,如果使用该反馈,将总是知道mysql正在等待什么。
如果你决定不想执行正在输入过程中的一个命令,输入\c取消它:
mysql>SELECT
->USER()
->\c
mysql>
这里也要注意提示符,在你输入\c以后,它切换回到mysql>,提供反馈以表明mysql准备接受一个新命令。
下表显示出可以看见的各个提示符并简述它们所表示的mysql的状态:
提示符
含义
mysql>
准备好接受新命令。
->
等待多行命令的下一行。
'>
等待下一行,等待以单引号(“'”)开始的字符串的结束。
">
等待下一行,等待以双引号(“"”)开始的字符串的结束。
`>
等待下一行,等待以反斜点(‘`’)开始的识别符的结束。
/*>
等待下一行,等待以/*开始的注释的结束。
当你打算在一个单行上发出一个命令时,通常会“偶然”出现多行语句,但是没有终止分号。
在这种情况中,mysql等待进一步输入:
mysql>SELECTUSER()
->
如果出现这种情况(你认为输完了语句,但是只有一个->提示符响应),很可能mysql正在等待分号。
如果你没有注意到提示符的提示,在意识到你需要做什么之前,你可能会呆坐一会儿。
输入一个分号完成语句,mysql将执行:
mysql>SELECTUSER()
->;
+---------------+
|USER() |
+---------------+
|jon@localhost|
+---------------+
在字符串收集期间将出现 '> 和 "> 提示符(提示MySQL正等待字符串的结束)。
在MySQL中,可以写由‘'’或‘"’字符括起来的字符串 (例如,'hello'或"goodbye"),并且mysql允许输入跨越多行的字符串。
当看到一个 '> 或 "> 提示符时,这意味着已经输入了包含以‘'’或‘"’括号字符开始的字符串的一行,但是还没有输入终止字符串的匹配引号。
这显示你粗心地省掉了一个引号字符。
例如:
mysql>SELECT*FROMmy_tableWHEREname='SmithANDage<30;
'>
如果你输入SELECT语句,然后按Enter(回车)键并等待结果,什么都没有出现。
不要惊讶,“为什么该查询这么长呢?
”,注意">提示符提供的线索。
它告诉你mysql期望见到一个未终止字符串的余下部分。
(你看见语句中的错误吗?
字符串"Smith丢掉了第二个引号。
)
走到这一步,你该做什么?
最简单的是取消命令。
然而,在这种情况下,你不能只是输入\c,因为mysql作为它正在收集的字符串的一部分来解释它!
相反,应输入关闭的引号字符(这样mysql知道你完成了字符串),然后输入\c:
mysql>SELECT*FROMmy_tableWHEREname='SmithANDage<30;
'>'\c
mysql>
提示符回到mysql>,显示mysql准备好接受一个新命令了。
`> 提示符类似于 '> 和"> 提示符,但表示你已经开始但没有结束以`> 开始的识别符。
知道'>和">提示符的含义很重要,因为如果你错误地输入一个未终止的字符串,任何后面输入的行将要被mysql忽略--包括包含QUIT的行!
这可能令人相当困惑,特别是如果取消当前命令前还不知道你需要提供终止引号。
3.2. 创建并使用数据库
知道怎样输入命令,便可以访问数据库了。
假定在你的家(你的“动物园”)中有很多宠物,并且你想跟踪关于它们各种类型的信息。
你可以通过创建表来保存你的数据并根据所需要的信息装载他们,然后你可以从表中检索数据来回答关于动物不同种类的问题。
本节显示如何做到所有这些事情:
· 创建数据库
· 创建数据库表
· 装载数据到数据库表
· 以各种方法从表中检索数据
· 使用多个表
动物园数据库很简单(特意的),但是不难把它想象成可能用到类似数据库的真实世界情况。
例如,农夫可以使用这样的一个数据库来追踪家畜,或者兽医可以用它跟踪病畜记录。
从MySQL网址上可以获得后面章节中将用到的含有部分查询和样例数据的动物园分发。
有tar压缩格式 ( (
使用SHOW语句找出服务器上当前存在什么数据库:
mysql>SHOWDATABASES;
+----------+
|Database|
+----------+
|mysql |
|test |
|tmp |
+----------+
可能你的机器上的数据库列表是不同的,但是很可能有mysql和test数据库。
mysql是必需的,因为它描述用户访问权限,test数据库经常作为用户试身手的工作区。
请注意如果没有SHOWDATABASES权限,则不能看见所有数据库。
参见13.5.1.3节,“GRANT和REVOKE语法”。
如果test数据库存在,尝试访问它:
mysql>USEtest
Databasechanged
注意,USE,类似QUIT,不需要一个分号。
(如果你喜欢,你可以用一个分号终止这样的语句;这无碍)USE语句在使用上也有另外一个特殊的地方:
它必须在一个单行上给出。
你可列在后面的例子中使用test数据库(如果你能访问它),但是你在该数据库创建的任何东西可以被访问它的其它人删除,因此,你应该询问MySQL管理员许可你使用自己的一个数据库。
假定你想要调用你的menagerie,管理员需要执行这样一条命令:
mysql>GRANTALLONmenagerie.*TO'your_mysql_name'@'your_client_host';
这里your_mysql_name是分配给你的MySQL用户名,your_client_host是所连接的服务器所在的主机。
3.2.1. 创建并选择数据库
如果管理员在设置权限时为你创建了数据库,你可以开始使用它。
否则,你需要自己创建数据库:
mysql>CREATEDATABASEmenagerie;
在Unix下,数据库名称是区分大小写的(不像SQL关键字),因此你必须总是以menagerie访问数据库,而不能用Menagerie、MENAGERIE或其它一些变量。
对表名也是这样的。
(在Windows下,该限制不适用,尽管你必须在一个给定的查询中使用同样的大小写来引用数据库和表。
但是,由于多种原因,作为最好的惯例,一定要使用与数据库创建时的同样的大小写。
)
创建数据库并不表示选定并使用它,你必须明确地操作。
为了使menagerie成为当前的数据库,使用这个命令:
mysql>USEmenagerie
Databasechanged
数据库只需要创建一次,但是必须在每次启动mysql会话时在使用前先选择它。
你可以根据上面的例子执行一个USE语句来实现。
还可以在调用mysql时,通过命令行选择数据库,只需要在提供连接参数之后指定数据库名称。
例如:
shell>mysql-hhost-uuser-pmenagerie
Enterpassword:
********
注意,刚才显示的命令行中的menagerie不是你的密码。
如果你想要在命令行上在-p选项后提供密码,则不能插入空格(例如,如-pmypassword,不是-pmypassword)。
但是,不建议在命令行输入密码,因为这样会暴露密码,能被在机器上登录的其它用户窥探到。
3.2.2. 创建表
创建数据库是很容易的部分,但是在这时它是空的,正如SHOWTABLES将告诉你的:
mysql>SHOWTABLES;
Emptyset(0.00sec)
较难的部分是决定你的数据库结构应该是什么:
你需要什么数据库表,各数据库表中有什么样的列。
你将需要一个包含你每个宠物的记录的表。
它可称为pet表,并且它应该包含,最少,每个动物的名字。
因为名字本身不是很有趣,表应该包含另外的信息。
例如,如果在你豢养宠物的家庭有超过一个人,你可能想要列出每个动物的主人。
你可能也想要记录例如种类和性别的一些基本的描述信息。
年龄呢?
那可能有趣,但是存储到一个数据库中不是一件好事情。
年龄随着时间流逝而变化,这意味着你将要不断地更新你的记录。
相反, 存储一个固定值例如生日比较好,那么,无论何时你需要年龄,可以以当前日期和出生日期之间的差来计算它。
MySQL提供了日期运算函数,因此这并不困难。
存储出生日期而非年龄还有其它优点:
· 你可以使用数据库完成这样的任务,例如生成即将到来的宠物生日的提示。
(如果你认为这类查询有点蠢,注意,这与从商务数据库来识别出不久要发给生日祝贺的客户是同一个问题,因为计算机帮助私人联络。
)
· 你可以相对于日期而不止是当前日期来计算年龄。
例如,如果你在数据库存储死亡日期,你能很容易地计算出一只宠物死时有多大。
你可能想到pet表中其它有用的其它类型信息,但是到目前为止这些已经足够了:
名字、主人、种类,性别、出生和死亡日期。
使用一个CREATETABLE语句指定你的数据库表的布局:
mysql>CREATETABLEpet(nameVARCHAR(20),ownerVARCHAR(20),
->speciesVARCHAR(20),sexCHAR
(1),birthDATE,deathDATE);
VARCHAR适合于name、owner和species列,因为列值是变长的。
这些列的长度不必都相同,而且不必是20。
你可以挑选从1到65535的任何长度,从中选择一个最合理的值。
(如果选择得不合适,后来证明你需要一个更长的字段,MySQL提供一个ALTERTABLE语句。
)
可以用多种类型的值来表示动物记录中的性别,例如,"m"和"f",或"male"和"female"。
使用单字符"m"和"f"是最简单的方法。
很显然,birth和death列应选用DATE数据类。
创建了数据库表后,SHOWTABLES应该产生一些输出:
mysql>SHOWTABLES;
+---------------------+
|Tablesinmenagerie|
+---------------------+
|pet |
+---------------------+
为了验证你的表是按你期望的方式创建,使用一个DESCRIBE语句:
mysql>DESCRIBEpet;
+---------+-------------+------+-----+---------+-------+
|Field |Type |Null|Key|Default|Extra|
+---------+-------------+------+-----+---------+-------+
|name |varchar(20)|YES | |NULL | |
|owner |varchar(20)|YES | |NULL | |
|species|varchar(20)|YES | |NULL | |
|sex |char
(1) |YES | |NULL | |
|birth |date |YES | |NULL | |
|death |date |YES | |NULL | |
+---------+-------------+------+-----+---------+-------+
你可以随时使用DESCRIBE,例如,如果你忘记表中的列的名称或类型时。
3.2.3. 将数据装入表中
创建表后,需要填入内容。
通过LOADDATA和INSERT语句可以完成该任务。
假定你的宠物纪录描述如下。
(假定在MySQL中期望的日期格式是YYYY-MM-DD;这可能与你习惯的不同。
)
name
owner
species
sex
birth
death
Fluffy
Harold
cat
f
1993-02-04
Claws
Gwen
cat
m
1994-03-17
Buffy
Harold
dog
f
1989-05-13
Fang
Benny
dog
m
1990-08-27
Bowser
Diane
dog
m
1979-08-31
1995-07-29
Chirpy
Gwen
bird
f
1998-09-11
Whistler
Gwen
bird
1997-12-09
Slim
Benny
snake
m
1996-04-29
因为你是从一个空表开始的,填充它的一个简易方法是创建一个文本文件,每个动物各一行,然后用一个语句将文件的内容装载到表中。
你可以创建一个文本文件“pet.txt”,每行包含一个记录,用定位符(tab)把值分开,并且以CREATETABLE语句中列出的列次序给出。
对于丢失的值(例如未知的性别,或仍然活着的动物的死亡日期),你可以使用NULL值。
为了在你的文本文件中表示这些内容,使用\N(反斜线,字母N)。
例如,Whistler鸟的记录应为(这里值之间的空白是一个定位符):
name
owner
species
sex
birth
death
Whistler
Gwen
bird
\N
1997-12-09
\N
要想将文本文件“pet.txt”装载到pet表中,使用这个命令:
mysql>LOADDATALOCALINFILE'/path/pet.txt'INTOTABLEpet;
请注意如果用Windows中的编辑器(使用\r\n做为行的结束符)创建文件,应使用:
mysql>LOADDATALOCALINFILE'/path/pet.txt'INTOTABLEpet
->LINESTERMINATEDBY'\r\n';
(在运行OSX的Apple机上,应使用行结束符'\r'。
)
如果你愿意,你能明确地在LOADDATA语句中指出列值的分隔符和行尾标记,但是默认标记是定位符和换行符。
这对读入文件“pet.txt”的语句已经足够。
如果该语句失败,可能是你安装的MySQL不与使用默认值的本地文件兼容。
关于如何更改请参见5.6.4节,“LOADDATALOCAL安全问题”。
如果想要一次增加一个新记录,可以使用INSERT语句。
最简单的形式是,提供每一列的值,其顺序与CREATETABLE语句中列的顺序相同。
假定Diane把一只新仓鼠命名为Puffball,你可以使用下面的INSERT语句添加一条新记录:
mysql>INSERTINTOpet
->VALUES('Puffball','Diane','hamster','f','1999-03-30',NULL);
注意,这里字符串和日期值均为引号扩起来的字符串。
另外,可以直接用INSERT语句插入NULL代表不存在的值。
不能使用LOADDATA中所示的的\N。
从这个例子,你应该能看到涉及很多的键入用多个INSERT语句而非单个LOADDATA语句装载你的初始记录。
3.2.4. 从表检索信息
SELECT语句用来从数据表中检索信息。
语句的一般格式是:
SELECTwhat_to_select
FROMwhich_table
WHEREconditions_to_satisfy;
what_to_select指出你想要看到的内容,可以是列的一个表,或*表示“所有的列”。
which_table指出你想要从其检索数据的表。