MySQL 5 入門實踐
首先在Solaris下安裝了mysql-5.0.45-solaris8-sparc-64bit.tar.gz,從網(wǎng)上找個基礎(chǔ)命令學習文檔實踐了一下,所有命令都是當前庫操作記錄,有些地方自己也做了修正,另外增加了一些基本內(nèi)容,權(quán)當入門者學習了。以下都是在windows下的MySQL數(shù)據(jù)庫操作的。

 

 

一、啟停MySQL數(shù)據(jù)庫服務(wù)

假如安裝的時候取的服務(wù)名是mysql,那么起停數(shù)據(jù)庫服務(wù)的命令是:

D:\>net stop mysql
The MySQL service is stopping.
The MySQL service was stopped successfully.

D:\>net start mysql
The MySQL service is starting.
The MySQL service was started successfully.

當然也可以到windows的服務(wù)管理里手工起停了。

當直接敲入mysql的時候遇到如下錯誤,說明數(shù)據(jù)庫服務(wù)還未啟動:

D:\>mysql
ERROR 2003 (HY000): Can't connect to MySQL server on 'localhost' (10061)

二、連接和退出MySQL

格式: mysql -h主機地址 -u用戶名 -p用戶密碼

1、連接到本機上的MYSQL。

首先在打開DOS窗口,然后進入目錄C:\Program Files\MySQL\MySQL Server 5.0\bin(安裝的時候如果已經(jīng)把該目錄設(shè)置到了環(huán)境變量PATH里,就不用進入該目錄也可以),再鍵入命令mysql -uroot -p,回車后提示你輸密碼,輸入密碼直接回車即可進入到MYSQL中,MYSQL的提示符是:

mysql>

2、連接到遠程主機上的MYSQL。假設(shè)遠程主機的IP為:110.110.110.110,用戶名為root,密碼為abcd123。則鍵入以下命令:

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

注:u與root可以不用加空格,其它也一樣。

3、退出MYSQL命令:

D:\>exit(回車)

D:\>quit(回車)

你也可以用control-D退出。

三、修改用戶密碼

格式:mysqladmin -u用戶名 -p舊密碼 password 新密碼

D:\>mysqladmin -uroot -piamwangnc password newpwd

也可以直接修改user表的root用戶口令:

mysql> use mysql;    --用名字叫mysql的庫當作當前庫
Database changed
mysql> update user set password=password('21century') where user='root';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> flush privileges;
Query OK, 0 rows affected (0.14 sec)
注:flush privileges的意思是強制刷新內(nèi)存授權(quán)表,否則用的還是緩沖中的口令。

四、增加新用戶

注:MySQL環(huán)境中的命令后面都帶一個分號作為命令結(jié)束符。但是use、exit、quit幾個命令不用分號結(jié)尾也可以的。

例1、增加一個用戶admin密碼為oss,可以從任何地方連接服務(wù)器的一個完全的超級用戶。首先用以root用戶連入MySQL,然后鍵入以下命令:

mysql> grant all privileges on *.* to admin@"%" identified by 'oss' with grant option;
Query OK, 0 rows affected (0.00 sec)

但例1增加的用戶是十分危險的,你想如某個人知道admin的密碼,那么他就可以在internet上的任何一臺電腦上登錄你的MySQL數(shù)據(jù)庫并對你的數(shù)據(jù)可以為所欲為了,解決辦法見例2。

例2、增加一個用戶test2密碼為abc,讓他只可以在localhost上登錄,并可以對數(shù)據(jù)庫mysql進行查詢、插入、修改、刪除的操作(localhost指本地主機,即MySQL數(shù)據(jù)庫所在的那臺主機),這樣用戶即使用知道test2的密碼,他也無法從internet上直接訪問數(shù)據(jù)庫,只能通過MySQL主機上的web頁來訪問。

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

如果你不想test2有密碼,可以再打一個命令將密碼消掉。

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

五、基本操作命令

注:如果你打命令時,回車后發(fā)現(xiàn)忘記加分號,你無須重打一遍命令,只要打個分號回車就可以了。也就是說你可以把一個完整的命令分成幾行來打,完后用分號作結(jié)束標志就完成。可以使用光標上下鍵調(diào)出以前的命令。mysql命令的大小寫結(jié)果是一致的。


1、顯示數(shù)據(jù)庫列表:

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| test               |
+--------------------+
3 rows in set (0.00 sec)

mysql庫很重要,它里面有MYSQL的系統(tǒng)信息,我們改密碼和新增用戶,實際上就是用這個庫進行操作。

2、顯示庫中的數(shù)據(jù)表:

mysql> use mysql;
Database changed
mysql> show tables;
+---------------------------+
| Tables_in_mysql           |
+---------------------------+
| columns_priv              |
| db                        |
| func                      |
| help_category             |
| help_keyword              |
| help_relation             |
| help_topic                |
| host                      |
| proc                      |
| procs_priv                |
| tables_priv               |
| time_zone                 |
| time_zone_leap_second     |
| time_zone_name            |
| time_zone_transition      |
| time_zone_transition_type |
| user                      |
+---------------------------+
17 rows in set (0.00 sec)

3、顯示數(shù)據(jù)表的結(jié)構(gòu):

mysql> desc func;
+-------+------------------------------+------+-----+---------+-------+
| Field | Type                         | Null | Key | Default | Extra |
+-------+------------------------------+------+-----+---------+-------+
| name | char(64)                     | NO   | PRI |         |       |
| ret   | tinyint(1)                   | NO   |     | 0       |       |
| dl    | char(128)                    | NO   |     |         |       |
| type | enum('function','aggregate') | NO   |     | NULL    |       |
+-------+------------------------------+------+-----+---------+-------+
4 rows in set (0.08 sec)

4、建庫:

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

5、建表:

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

6、顯示表中的記錄:

mysql> select * from t_test;
Empty set (0.00 sec)

7、將表中記錄清空:

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

8、刪庫和刪表:

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

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

七、一個建庫、建表、改表以及插入數(shù)據(jù)的實例

mysql> drop database if exists school;
Query OK, 0 rows affected, 1 warning (0.00 sec)    //如果存在SCHOOL則刪除

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

mysql> use school;    //打開庫SCHOOL
Database changed

mysql> create table teacher    //建立表TEACHER
    -> (
    -> id int(3) auto_increment not null primary key,
    -> name char(10) not null,
    -> address varchar(50) default '深圳',
    -> year date
    -> );    //建表結(jié)束
Query OK, 0 rows affected (0.15 sec)

注:
(1)將ID設(shè)為長度為3的數(shù)字字段int(3),并讓它每個記錄自動加一auto_increment,并不能為空not null,而且讓它成為主鍵primary key
(2)將NAME設(shè)為長度為10的字符字段
(3)將ADDRESS設(shè)為長度50的字符字段,而且缺省值為深圳。
(4)將YEAR設(shè)為日期字段。

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

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

mysql> select * from teacher;
+----+------------+----------+------------+
| id | name       | address | year       |
+----+------------+----------+------------+
| 1 | glchengang | 深圳一中 | 1976-10-10 |
| 2 | jack       | 深圳一中 | 1975-12-23 |
+----+------------+----------+------------+
2 rows in set (0.00 sec)

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

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

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

mysql> desc t_teacher;
+------------+-------------+------+-----+---------+-------+
| Field      | Type        | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+-------+
| newid      | varchar(5) | NO   | PRI | NULL    |       |
| name       | char(10)    | NO   |     | NULL    |       |
| address    | varchar(50) | YES |     | 深圳    |       |
| leave_time | datetime    | NO   |     | NULL    |       |
| year       | date        | YES |     | NULL    |       |
+------------+-------------+------+-----+---------+-------+
5 rows in set (0.01 sec)

如果你在MySQL提示符鍵入上面的命令也可以,但不方便調(diào)試。你可以將以上命令原樣寫入一個文本文件中假設(shè)為school.sql,然后復(fù)制到c:\下,然后鍵入以下命令:
D:\> mysql -uroot -p密碼 < c:\school.sql

如果成功,空出一行無任何顯示;如有錯誤,會有提示。

 


八、基本select操作

mysql> select version(),current_date();
+----------------------+----------------+
| version()            | current_date() |
+----------------------+----------------+
| 5.0.51a-community-nt | 2008-03-26     |
+----------------------+----------------+
1 row in set (0.00 sec)

mysql> Select (20+5)*4;
+----------+
| (20+5)*4 |
+----------+
|      100 |
+----------+
1 row in set (0.00 sec)

mysql> Select (20+5)*4 AS Result,sin(pi()/3);
+--------+------------------+
| Result | sin(pi()/3)      |
+--------+------------------+
|    100 | 0.86602540378444 |
+--------+------------------+
1 row in set (0.00 sec)

mysql> select user(),now();
+----------------+---------------------+
| user()         | now()               |
+----------------+---------------------+
| root@localhost | 2008-03-26 11:58:54 |
+----------------+---------------------+
1 row in set (0.00 sec)

mysql> select user();select now();
+----------------+
| user()         |
+----------------+
| root@localhost |
+----------------+
1 row in set (0.00 sec)

+---------------------+
| now()               |
+---------------------+
| 2008-03-26 11:59:08 |
+---------------------+
1 row in set (0.00 sec)

mysql> select * from user limit 3;    #返回前3行

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

mysql> select * from user limit 3,5;    #返回從第4行開始的前5行,即4-8行

第一個參數(shù)指定返回的第一行在所有數(shù)據(jù)中的位置,從0開始(注意不是1),第二個參數(shù)指定最多返回行數(shù)。

九、將文本數(shù)據(jù)轉(zhuǎn)到數(shù)據(jù)庫中

1、文本數(shù)據(jù)應(yīng)符合的格式:字段數(shù)據(jù)之間用tab鍵隔開,null值用\n來代替。
例:
3 rose 深圳二中 1976-10-10
4 mike 深圳一中 1975-12-23

2、數(shù)據(jù)傳入命令 load data local infile "文件名" into table 表名。

注意:你最好將文件復(fù)制到C:\Program Files\MySQL\MySQL Server 5.0\bin目錄下,并且要先用use命令打表所在的庫。

十、備份數(shù)據(jù)庫

導出meeting數(shù)據(jù)庫:
D:\>mysqldump -uroot -p21century school > school.sql

導人dbname數(shù)據(jù)庫:
D:\>mysqldump -uroot -p21century dbname < xxx.sql

導入數(shù)據(jù)庫還可用類似于oracle中@my_script.sql的方式一次執(zhí)行大量sql語句,這在使用mysqldump不起作用時非常有用。
例:
D:\>mysql -uroot -p < db_meeting_2003.sql
(注:create database、use databasename、create table和insert into語句都可寫在上面的腳步文件中)


十一、優(yōu)化命令

mysql >show status;

該命令將顯示出一長列狀態(tài)變量及其對應(yīng)的值,其中包括:被中止訪問的用戶數(shù)量,被中止的連接數(shù)量,嘗試連接的次數(shù),并發(fā)連接數(shù)量最大值,以及其他許多有用的信息。這些信息對于確定系統(tǒng)問題和效率低下的原因是十分有用的。SHOW命令除了能夠顯示出MySQL服務(wù)器整體狀態(tài)信息之外,它還能夠顯示出有關(guān)日志文件、指定數(shù)據(jù)庫、表、索引、進程和許可權(quán)限表的寶貴信息。


mysql> explain select * from user;
+----+-------------+-------+------+---------------+------+---------+------+------+-------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+---------------+------+---------+------+------+-------+
| 1 | SIMPLE      | user | ALL | NULL          | NULL | NULL    | NULL |    7 |       |
+----+-------------+-------+------+---------------+------+---------+------+------+-------+
1 row in set (0.11 sec)

EXPLAIN能夠分析SELECT命令的處理過程。這不僅對于決定是否要為表加上索引很有用,而且對于了解MySQL處理復(fù)雜連接的過程也很有用。

 

 

十二、MySQL5的新特性:存儲過程和函數(shù)

從MySQL5開始增加了存儲過程特性。下面是一個包括存儲過程的實例聲明:

CREATE PROCEDURE procedure1 /* name存儲過程名*/
(IN parameter1 INTEGER) /* parameters參數(shù)*/
BEGIN /* start of block語句塊頭*/
DECLARE variable1 CHAR(10); /* variables變量聲明*/
IF parameter1 = 17 THEN /* start of IF IF條件開始*/
   SET variable1 = 'birds'; /* assignment賦值*/
ELSE
   SET variable1 = 'beasts'; /* assignment賦值*/
END IF; /* end of IF IF結(jié)束*/
INSERT INTO table1 VALUES (variable1);/* statement SQL語句*/
END /* end of block語句塊結(jié)束*/

什么樣的SQL語句在Mysql存儲過程中才是合法的呢?你可以創(chuàng)建一個包含INSERT, UPDATE,DELETE, SELECT, DROP, CREATE, REPLACE等的語句。你唯一需要記住的是如果代碼中包含MySQL擴充功能,那么代碼將不能移植。在標準SQL語句中:任何數(shù)據(jù)庫定義語言都是合法的。

 


下面從簡單的開始:

mysql> create procedure sp1() create table t_test (c1 date);
Query OK, 0 rows affected (0.00 sec)

mysql> create procedure sp2() select * from t_test;
Query OK, 0 rows affected (0.00 sec)

mysql> create procedure sp3() drop table t_test;
Query OK, 0 rows affected (0.00 sec)

mysql> call sp1;
Query OK, 0 rows affected (0.15 sec)

mysql> call sp2;
Empty set (0.00 sec)

Query OK, 0 rows affected (0.01 sec)

mysql> call sp3;
Query OK, 0 rows affected (0.03 sec)

mysql> drop procedure sp1;
Query OK, 0 rows affected (0.00 sec)

mysql> drop procedure sp2;
Query OK, 0 rows affected (0.00 sec)

mysql> drop procedure sp3;
Query OK, 0 rows affected (0.00 sec)

mysql>

 


復(fù)雜一點的,Characteristics Clauses 特征子句。

CREATE PROCEDURE sp()
LANGUAGE SQL <--
NOT DETERMINISTIC <--
SQL SECURITY DEFINER <--
COMMENT 'A Procedure' <--
SELECT CURRENT_DATE, RAND() FROM t;

這里我給出的是一些能反映存儲過程特性的子句。子句內(nèi)容在括號之后,主體之前。這些子句都是可選的。

LANGUAGE SQL <--這個LANGUAGE SQL子句是沒有作用的。僅是為了說明下面過程的主體使用SQL語言編寫。這條是系統(tǒng)默認的,但你在這里聲明是有用的,因為某些DBMS(IBM的 DB2)需要它,如果你關(guān)注DB2的兼容問題最好還是用上。此外,今后可能會出現(xiàn)除SQL外的其他語言支持的存儲過程。

NOT DETERMINISTIC <--是傳遞給系統(tǒng)的信息。這里一個確定過程的定義就是那些每次輸入一樣輸出也一樣的程序。在這個案例中,既然主體中含有SELECT語句,那返回肯定是未知的因此我們稱其NOT DETERMINISTIC。但是MySQL內(nèi)置的優(yōu)化程序不會注意這個,至少在現(xiàn)在不注意。

SQL SECURITY DEFINER <--意味著在調(diào)用時檢查創(chuàng)建過程用戶的權(quán)限,告訴MySQL服務(wù)器檢查創(chuàng)建過程的用戶就可以了,當過程已經(jīng)被調(diào)用,就不檢查執(zhí)行調(diào)用過程的用戶了。而另一個選項(INVOKER)則是告訴服務(wù)器在這一步仍然要檢查調(diào)用者的權(quán)限。

COMMENT 'A Procedure' <--是一個可選的注釋說明。最后,注釋子句會跟過程定義存儲在一起。

特征子句也有默認值,如果省略了就相當于:

LANGUAGE SQL NOT DETERMINISTIC SQL SECURITY DEFINER COMMENT ''

如上面過程跟下面語句是等效的:

CREATE PROCEDURE sp()
SELECT CURRENT_DATE, RAND() FROM t;

 


讓我們更進一步的研究怎么在存儲過程中定義參數(shù),就和Oracle中的一樣:

1.CREATE PROCEDURE p5() ... //參數(shù)列表是空的

2.CREATE PROCEDURE p5([IN] name data-type) ... //有一個輸入?yún)?shù),這里的詞IN可選,因為默認參數(shù)為IN(input)

3.CREATE PROCEDURE p5(OUT name data-type) ... //有一個輸出參數(shù)

4.CREATE PROCEDURE p5(INOUT name data-type) ... //有一個參數(shù),既能作為輸入也可以作為輸出

 


舉例:

mysql> CREATE PROCEDURE p5(p INT) SET @x = p;
Query OK, 0 rows affected (0.00 sec)

mysql> CALL p5(12345);
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT @x;
+-------+
| @x    |
+-------+
| 12345 |
+-------+
1 row in set (0.00 sec)

mysql> CREATE PROCEDURE p6 (OUT p INT) SET p = -5;
Query OK, 0 rows affected (0.00 sec)

mysql> CALL p6(@y);
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT @y;
+------+
| @y   |
+------+
| -5   |
+------+
1 row in set (0.00 sec)

 


現(xiàn)在我們展開的詳細分析一下過程體:

CREATE PROCEDURE p7 ()
BEGIN
SET @a = 5;
SET @b = 5;
INSERT INTO t VALUES (@a);
SELECT s1 * @a FROM t WHERE s1 >= @b;
END;

 


完成過程體的構(gòu)造就是BEGIN/END塊。這個BEGIN/END語句塊和 Pascal語言中的BEGIN/END是基本相同的,和C語言的框架是很相似的。我們可以使用塊去封裝多條語句。在這個例子中,我們使用了多條設(shè)定會話變量的語句,然后完成了一些insert和select語句。如果你的過程體中有多條語句,那么你就需要BEGIN/END塊了。BEGIN/END塊也被稱為復(fù)合語句,在這里你可以進行變量定義和流程控制。

 


--End--