免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 11279 | 回复: 9
打印 上一主题 下一主题

MySQL5入门实践 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-03-28 10:45 |只看该作者 |倒序浏览
  1. 今天开始研究一下MySQL了,对于高手来说,我真的是太落伍了。

  2. 首先在自己的windows xp下安装了mysql-5.0.51a-win32.zip([url]http://hi.baidu.com/edeed/blog/item/093aca80beced2d39023d924.html[/url]),同时在Solaris下安装了mysql-5.0.45-solaris8-sparc-64bit.tar.gz([url]http://hi.baidu.com/edeed/blog/item/d227f624d302ed378744f9c8.html[/url]),从网上找个基础命令学习文档实践了一下,所有命令都是当前库操作记录,有些地方自己也做了修正,另外增加了一些基本内容,权当入门者学习了。以下都是在windows下的MySQL数据库操作的。

  3. 一、启停MySQL数据库服务

  4. 假如安装的时候取的服务名是mysql,那么起停数据库服务的命令是:
  5. D:>net stop mysql
  6. The MySQL service is stopping.
  7. The MySQL service was stopped successfully.

  8. D:>net start mysql
  9. The MySQL service is starting.
  10. The MySQL service was started successfully.
  11. 当然也可以到windows的服务管理里手工起停了。
  12. 当直接敲入mysql的时候遇到如下错误,说明数据库服务还未启动:
  13. D:>mysql
  14. ERROR 2003 (HY000): Can't connect to MySQL server on 'localhost' (10061)

  15. 二、连接和退出MySQL

  16. 格式: mysql -h主机地址 -u用户名 -p用户密码

  17. 1、连接到本机上的MYSQL。

  18. 首先在打开DOS窗口,然后进入目录Crogram FilesMySQLMySQL Server 5.0in(安装的时候如果已经把该目录设置到了环境变量PATH里,就不用进入该目录也可以),再键入命令mysql -uroot -p,回车后提示你输密码,输入密码直接回车即可进入到MYSQL中,MYSQL的提示符是:

  19. mysql>

  20. 2、连接到远程主机上的MYSQL。假设远程主机的IP为:110.110.110.110,用户名为root,密码为abcd123。则键入以下命令:

  21. D:>mysql -h110.110.110.110 -uroot -pabcd123

  22. 注:u与root可以不用加空格,其它也一样。

  23. 3、退出MYSQL命令:

  24. D:>exit(回车)

  25. D:>quit(回车)

  26. 你也可以用control-D退出。

  27. 三、修改用户密码

  28. 格式:mysqladmin -u用户名 -p旧密码 password 新密码

  29. D:>mysqladmin -uroot -piamwangnc password newpwd
  30. 也可以直接修改user表的root用户口令:

  31. mysql> use mysql;    --用名字叫mysql的库当作当前库
  32. Database changed
  33. mysql> update user set password=password('21century') where user='root';
  34. Query OK, 1 row affected (0.00 sec)
  35. Rows matched: 1 Changed: 1 Warnings: 0
  36. mysql> flush privileges;
  37. Query OK, 0 rows affected (0.14 sec)
  38. 注:flush privileges的意思是强制刷新内存授权表,否则用的还是缓冲中的口令。

  39. 四、增加新用户

  40. 注:MySQL环境中的命令后面都带一个分号作为命令结束符。但是use、exit、quit几个命令不用分号结尾也可以的。

  41. 例1、增加一个用户admin密码为oss,可以从任何地方连接服务器的一个完全的超级用户。首先用以root用户连入MySQL,然后键入以下命令:

  42. mysql> grant all privileges on *.* to [email=admin@%22%%22]admin@"%"[/email] identified by 'oss' with grant option;
  43. Query OK, 0 rows affected (0.00 sec)

  44. 但例1增加的用户是十分危险的,你想如某个人知道admin的密码,那么他就可以在internet上的任何一台电脑上登录你的MySQL数据库并对你的数据可以为所欲为了,解决办法见例2。

  45. 例2、增加一个用户test2密码为abc,让他只可以在localhost上登录,并可以对数据库mysql进行查询、插入、修改、删除的操作(localhost指本地主机,即MySQL数据库所在的那台主机),这样用户即使用知道test2的密码,他也无法从internet上直接访问数据库,只能通过MySQL主机上的web页来访问。

  46. mysql> grant select,insert,update,delete on mysql.* to test2@localhost identified by "abc";
  47. Query OK, 0 rows affected (0.00 sec)

  48. 如果你不想test2有密码,可以再打一个命令将密码消掉。

  49. mysql> grant select,insert,update,delete on mysql.* to test2@localhost identified by "";
  50. Query OK, 0 rows affected (0.00 sec)

  51. 五、基本操作命令

  52. 注:如果你打命令时,回车后发现忘记加分号,你无须重打一遍命令,只要打个分号回车就可以了。也就是说你可以把一个完整的命令分成几行来打,完后用分号作结束标志就完成。可以使用光标上下键调出以前的命令。mysql命令的大小写结果是一致的。
  53. 1、显示数据库列表:

  54. mysql> show databases;
  55. +--------------------+
  56. | Database           |
  57. +--------------------+
  58. | information_schema |
  59. | mysql              |
  60. | test               |
  61. +--------------------+
  62. 3 rows in set (0.00 sec)

  63. mysql库很重要,它里面有MYSQL的系统信息,我们改密码和新增用户,实际上就是用这个库进行操作。

  64. 2、显示库中的数据表:

  65. mysql> use mysql;
  66. Database changed
  67. mysql> show tables;
  68. +---------------------------+
  69. | Tables_in_mysql           |
  70. +---------------------------+
  71. | columns_priv              |
  72. | db                        |
  73. | func                      |
  74. | help_category             |
  75. | help_keyword              |
  76. | help_relation             |
  77. | help_topic                |
  78. | host                      |
  79. | proc                      |
  80. | procs_priv                |
  81. | tables_priv               |
  82. | time_zone                 |
  83. | time_zone_leap_second     |
  84. | time_zone_name            |
  85. | time_zone_transition      |
  86. | time_zone_transition_type |
  87. | user                      |
  88. +---------------------------+
  89. 17 rows in set (0.00 sec)

  90. 3、显示数据表的结构:

  91. mysql> desc func;
  92. +-------+------------------------------+------+-----+---------+-------+
  93. | Field | Type                         | Null | Key | Default | Extra |
  94. +-------+------------------------------+------+-----+---------+-------+
  95. | name | char(64)                     | NO   | PRI |         |       |
  96. | ret   | tinyint(1)                   | NO   |     | 0       |       |
  97. | dl    | char(12                    | NO   |     |         |       |
  98. | type | enum('function','aggregate') | NO   |     | NULL    |       |
  99. +-------+------------------------------+------+-----+---------+-------+
  100. 4 rows in set (0.08 sec)

  101. 4、建库:

  102. mysql> create database testdb;
  103. Query OK, 1 row affected (0.01 sec)

  104. 5、建表:

  105. mysql> use testdb;
  106. Database changed
  107. mysql> create table t_test (c1 date);
  108. Query OK, 0 rows affected (0.29 sec)

  109. 6、显示表中的记录:

  110. mysql> select * from t_test;
  111. Empty set (0.00 sec)
  112. 7、将表中记录清空:

  113. mysql> delete from t_test;
  114. Query OK, 0 rows affected (0.00 sec)

  115. 8、删库和删表:

  116. mysql> drop table t_test;
  117. Query OK, 0 rows affected (0.11 sec)

  118. mysql> drop database testdb;
  119. Query OK, 0 rows affected (0.01 sec)

  120. 七、一个建库、建表、改表以及插入数据的实例

  121. mysql> drop database if exists school;
  122. Query OK, 0 rows affected, 1 warning (0.00 sec)    //如果存在SCHOOL则删除

  123. mysql> create database school;    //建立库SCHOOL
  124. Query OK, 1 row affected (0.01 sec)

  125. mysql> use school;    //打开库SCHOOL
  126. Database changed

  127. mysql> create table teacher    //建立表TEACHER
  128.     -> (
  129.     -> id int(3) auto_increment not null primary key,
  130.     -> name char(10) not null,
  131.     -> address varchar(50) default '深圳',
  132.     -> year date
  133.     -> );    //建表结束
  134. Query OK, 0 rows affected (0.15 sec)

  135. 注:
  136. (1)将ID设为长度为3的数字字段int(3),并让它每个记录自动加一auto_increment,并不能为空not null,而且让它成为主键primary key
  137. (2)将NAME设为长度为10的字符字段
  138. (3)将ADDRESS设为长度50的字符字段,而且缺省值为深圳。
  139. (4)将YEAR设为日期字段。

  140. mysql> insert into teacher values(1,'glchengang','深圳一中','1976-10-10');    //以下为插入字段
  141. Query OK, 1 row affected (0.06 sec)

  142. mysql> insert into teacher values(2,'jack','深圳一中','1975-12-23');
  143. Query OK, 1 row affected (0.04 sec)

  144. mysql> select * from teacher;
  145. +----+------------+----------+------------+
  146. | id | name       | address | year       |
  147. +----+------------+----------+------------+
  148. | 1 | glchengang | 深圳一中 | 1976-10-10 |
  149. | 2 | jack       | 深圳一中 | 1975-12-23 |
  150. +----+------------+----------+------------+
  151. 2 rows in set (0.00 sec)

  152. mysql> rename table teacher to t_teacher;    //给表改名
  153. Query OK, 0 rows affected (0.09 sec)

  154. mysql> alter table t_teacher change id newid varchar(5) not null;    //修改字段属性
  155. Query OK, 2 rows affected (0.24 sec)
  156. Records: 2 Duplicates: 0 Warnings: 0

  157. mysql> alter table t_teacher add leave_time datetime not null after address;    //在表中的address后增加一字段
  158. Query OK, 2 rows affected (0.24 sec)
  159. Records: 2 Duplicates: 0 Warnings: 0

  160. mysql> desc t_teacher;
  161. +------------+-------------+------+-----+---------+-------+
  162. | Field      | Type        | Null | Key | Default | Extra |
  163. +------------+-------------+------+-----+---------+-------+
  164. | newid      | varchar(5) | NO   | PRI | NULL    |       |
  165. | name       | char(10)    | NO   |     | NULL    |       |
  166. | address    | varchar(50) | YES |     | 深圳    |       |
  167. | leave_time | datetime    | NO   |     | NULL    |       |
  168. | year       | date        | YES |     | NULL    |       |
  169. +------------+-------------+------+-----+---------+-------+
  170. 5 rows in set (0.01 sec)

  171. 如果你在MySQL提示符键入上面的命令也可以,但不方便调试。你可以将以上命令原样写入一个文本文件中假设为school.sql,然后复制到c:下,然后键入以下命令:
  172. D:> mysql -uroot -p密码 < c:school.sql

  173. 如果成功,空出一行无任何显示;如有错误,会有提示。

  174. 八、基本select操作

  175. mysql> select version(),current_date();
  176. +----------------------+----------------+
  177. | version()            | current_date() |
  178. +----------------------+----------------+
  179. | 5.0.51a-community-nt | 2008-03-26     |
  180. +----------------------+----------------+
  181. 1 row in set (0.00 sec)
  182. mysql> Select (20+5)*4;
  183. +----------+
  184. | (20+5)*4 |
  185. +----------+
  186. |      100 |
  187. +----------+
  188. 1 row in set (0.00 sec)
  189. mysql> Select (20+5)*4 AS Result,sin(pi()/3);
  190. +--------+------------------+
  191. | Result | sin(pi()/3)      |
  192. +--------+------------------+
  193. |    100 | 0.86602540378444 |
  194. +--------+------------------+
  195. 1 row in set (0.00 sec)
  196. mysql> select user(),now();
  197. +----------------+---------------------+
  198. | user()         | now()               |
  199. +----------------+---------------------+
  200. | [email=root@localhost]root@localhost[/email] | 2008-03-26 11:58:54 |
  201. +----------------+---------------------+
  202. 1 row in set (0.00 sec)
  203. mysql> select user();select now();
  204. +----------------+
  205. | user()         |
  206. +----------------+
  207. | [email=root@localhost]root@localhost[/email] |
  208. +----------------+
  209. 1 row in set (0.00 sec)
  210. +---------------------+
  211. | now()               |
  212. +---------------------+
  213. | 2008-03-26 11:59:08 |
  214. +---------------------+
  215. 1 row in set (0.00 sec)
  216. mysql> select * from user limit 3;    #返回前3行

  217. mysql> select * from user limit 0,3;    #返回前3行

  218. mysql> select * from user limit 3,5;    #返回从第4行开始的前5行,即4-8行

  219. 第一个参数指定返回的第一行在所有数据中的位置,从0开始(注意不是1),第二个参数指定最多返回行数。

  220. 九、将文本数据转到数据库中

  221. 1、文本数据应符合的格式:字段数据之间用tab键隔开,null值用
  222. 来代替。
  223. 例:
  224. 3 rose 深圳二中 1976-10-10
  225. 4 mike 深圳一中 1975-12-23

  226. 2、数据传入命令 load data local infile "文件名" into table 表名。

  227. 注意:你最好将文件复制到Crogram FilesMySQLMySQL Server 5.0in目录下,并且要先用use命令打表所在的库。

  228. 十、备份数据库

  229. 导出meeting数据库:
  230. D:>mysqldump -uroot -p21century school > school.sql

  231. 导人dbname数据库:
  232. D:>mysqldump -uroot -p21century dbname < xxx.sql

  233. 导入数据库还可用类似于oracle中@my_script.sql的方式一次执行大量sql语句,这在使用mysqldump不起作用时非常有用。
  234. 例:
  235. D:>mysql -uroot -p < db_meeting_2003.sql
  236. (注:create database、use databasename、create table和insert into语句都可写在上面的脚步文件中)

  237. 十一、优化命令

  238. mysql >show status;

  239. 该命令将显示出一长列状态变量及其对应的值,其中包括:被中止访问的用户数量,被中止的连接数量,尝试连接的次数,并发连接数量最大值,以及其他许多有用的信息。这些信息对于确定系统问题和效率低下的原因是十分有用的。SHOW命令除了能够显示出MySQL服务器整体状态信息之外,它还能够显示出有关日志文件、指定数据库、表、索引、进程和许可权限表的宝贵信息。
  240. mysql> explain select * from user;
  241. +----+-------------+-------+------+---------------+------+---------+------+------+-------+
  242. | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
  243. +----+-------------+-------+------+---------------+------+---------+------+------+-------+
  244. | 1 | SIMPLE      | user | ALL | NULL          | NULL | NULL    | NULL |    7 |       |
  245. +----+-------------+-------+------+---------------+------+---------+------+------+-------+
  246. 1 row in set (0.11 sec)

  247. EXPLAIN能够分析SELECT命令的处理过程。这不仅对于决定是否要为表加上索引很有用,而且对于了解MySQL处理复杂连接的过程也很有用。

  248. 十二、MySQL5的新特性:存储过程和函数

  249. 从MySQL5开始增加了存储过程特性。下面是一个包括存储过程的实例声明:

  250. CREATE PROCEDURE procedure1 /* name存储过程名*/
  251. (IN parameter1 INTEGER) /* parameters参数*/
  252. BEGIN /* start of block语句块头*/
  253. DECLARE variable1 CHAR(10); /* variables变量声明*/
  254. IF parameter1 = 17 THEN /* start of IF IF条件开始*/
  255.    SET variable1 = 'birds'; /* assignment赋值*/
  256. ELSE
  257.    SET variable1 = 'beasts'; /* assignment赋值*/
  258. END IF; /* end of IF IF结束*/
  259. INSERT INTO table1 VALUES (variable1);/* statement SQL语句*/
  260. END /* end of block语句块结束*/
  261. 什么样的SQL语句在Mysql存储过程中才是合法的呢?你可以创建一个包含INSERT, UPDATE,DELETE, SELECT, DROP,CREATE,REPLACE等的语句。你唯一需要记住的是如果代码中包含MySQL扩充功能,那么代码将不能移植。在标准SQL语句中:任何数据库定义语言都是合法的。

  262. 下面从简单的开始:

  263. mysql> create procedure sp1() create table t_test (c1 date);
  264. Query OK, 0 rows affected (0.00 sec)
  265. mysql> create procedure sp2() select * from t_test;
  266. Query OK, 0 rows affected (0.00 sec)
  267. mysql> create procedure sp3() drop table t_test;
  268. Query OK, 0 rows affected (0.00 sec)
  269. mysql> call sp1;
  270. Query OK, 0 rows affected (0.15 sec)
  271. mysql> call sp2;
  272. Empty set (0.00 sec)
  273. Query OK, 0 rows affected (0.01 sec)
  274. mysql> call sp3;
  275. Query OK, 0 rows affected (0.03 sec)
  276. mysql> drop procedure sp1;
  277. Query OK, 0 rows affected (0.00 sec)
  278. mysql> drop procedure sp2;
  279. Query OK, 0 rows affected (0.00 sec)
  280. mysql> drop procedure sp3;
  281. Query OK, 0 rows affected (0.00 sec)
  282. mysql>

  283. 复杂一点的,Characteristics Clauses 特征子句。

  284. CREATE PROCEDURE sp()
  285. LANGUAGE SQL <--
  286. NOT DETERMINISTIC <--
  287. SQL SECURITY DEFINER <--
  288. COMMENT 'A Procedure' <--
  289. SELECT CURRENT_DATE, RAND() FROM t;

  290. 这里我给出的是一些能反映存储过程特性的子句。子句内容在括号之后,主体之前。这些子句都是可选的。
  291. LANGUAGESQL <--这个LANGUAGESQL子句是没有作用的。仅是为了说明下面过程的主体使用SQL语言编写。这条是系统默认的,但你在这里声明是有用的,因为某些DBMS(IBM的DB2)需要它,如果你关注DB2的兼容问题最好还是用上。此外,今后可能会出现除SQL外的其他语言支持的存储过程。
  292. NOTDETERMINISTIC<--是传递给系统的信息。这里一个确定过程的定义就是那些每次输入一样输出也一样的程序。在这个案例中,既然主体中含有SELECT语句,那返回肯定是未知的因此我们称其NOT DETERMINISTIC。但是MySQL内置的优化程序不会注意这个,至少在现在不注意。
  293. SQLSECURITY DEFINER<--意味着在调用时检查创建过程用户的权限,告诉MySQL服务器检查创建过程的用户就可以了,当过程已经被调用,就不检查执行调用过程的用户了。而另一个选项(INVOKER)则是告诉服务器在这一步仍然要检查调用者的权限。
  294. COMMENT 'A Procedure' <--是一个可选的注释说明。最后,注释子句会跟过程定义存储在一起。
  295. 特征子句也有默认值,如果省略了就相当于:
  296. LANGUAGE SQL NOT DETERMINISTIC SQL SECURITY DEFINER COMMENT ''
  297. 如上面过程跟下面语句是等效的:
  298. CREATE PROCEDURE sp()
  299. SELECT CURRENT_DATE, RAND() FROM t;

  300. 让我们更进一步的研究怎么在存储过程中定义参数,就和Oracle中的一样:

  301. 1.CREATE PROCEDURE p5() ... //参数列表是空的
  302. 2.CREATE PROCEDURE p5([IN] name data-type) ... //有一个输入参数,这里的词IN可选,因为默认参数为IN(input)
  303. 3.CREATE PROCEDURE p5(OUT name data-type) ... //有一个输出参数
  304. 4.CREATE PROCEDURE p5(INOUT name data-type) ... //有一个参数,既能作为输入也可以作为输出
  305. 举例:
  306. mysql> CREATE PROCEDURE p5(p INT) SET @x = p;
  307. Query OK, 0 rows affected (0.00 sec)
  308. mysql> CALL p5(12345);
  309. Query OK, 0 rows affected (0.00 sec)
  310. mysql> SELECT @x;
  311. +-------+
  312. | @x    |
  313. +-------+
  314. | 12345 |
  315. +-------+
  316. 1 row in set (0.00 sec)
  317. mysql> CREATE PROCEDURE p6 (OUT p INT) SET p = -5;
  318. Query OK, 0 rows affected (0.00 sec)
  319. mysql> CALL p6(@y);
  320. Query OK, 0 rows affected (0.00 sec)
  321. mysql> SELECT @y;
  322. +------+
  323. | @y   |
  324. +------+
  325. | -5   |
  326. +------+
  327. 1 row in set (0.00 sec)

  328. 现在我们展开的详细分析一下过程体:

  329. CREATE PROCEDURE p7 ()
  330. BEGIN
  331. SET @a = 5;
  332. SET @b = 5;
  333. INSERT INTO t VALUES (@a);
  334. SELECT s1 * @a FROM t WHERE s1 >= @b;
  335. END;
  336. 完成过程体的构造就是BEGIN/END块。这个BEGIN/END语句块和Pascal语言中的BEGIN/END是基本相同的,和C语言的框架是很相似的。我们可以使用块去封装多条语句。在这个例子中,我们使用了多条设定会话变量的语句,然后完成了一些insert和select语句。如果你的过程体中有多条语句,那么你就需要BEGIN/END块了。BEGIN/END块也被称为复合语句,在这里你可以进行变量定义和流程控制。

  337. --End--

  338. from:
复制代码


http://hi.baidu.com/edeed/blog/item/f3d4f6030b9676733912bb01.html

[ 本帖最后由 yueliangdao0608 于 2008-5-29 16:55 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2008-04-27 13:21 |只看该作者
谢谢LZ,辛苦了

论坛徽章:
0
3 [报告]
发表于 2008-04-28 09:08 |只看该作者
看错了,原来不是原创

[ 本帖最后由 yueliangdao0608 于 2008-5-29 16:56 编辑 ]

论坛徽章:
0
4 [报告]
发表于 2008-05-22 16:32 |只看该作者
真的不错呀,MYSQL很难学吗

论坛徽章:
0
5 [报告]
发表于 2008-05-22 22:02 |只看该作者
支持支持支持支持

论坛徽章:
0
6 [报告]
发表于 2008-05-25 14:17 |只看该作者
不得不顶一下
睡会觉,一会回来继续看……

论坛徽章:
0
7 [报告]
发表于 2008-05-26 14:17 |只看该作者
这个Mark一下,我接触的时间更短

论坛徽章:
0
8 [报告]
发表于 2008-05-26 14:22 |只看该作者
不过……例子怎么都是深圳那个学校?

网上好几个文章都是这个

copy来copy去

论坛徽章:
0
9 [报告]
发表于 2008-05-27 14:50 |只看该作者
谢谢LZ...........................

论坛徽章:
0
10 [报告]
发表于 2008-05-28 20:05 |只看该作者

回复 #1 edeed 的帖子

写的不错,mysql入门不难,再深入就要多花功夫和经验了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP