1. 程式人生 > 資料庫 >mysql入門之1小時學會MySQL基礎

mysql入門之1小時學會MySQL基礎

MySQL入門

mySQL (關係型資料庫管理系統)

MySQL是一個關係型資料庫管理系統,由瑞典MySQL AB 公司開發,目前屬於 Oracle 旗下產品。MySQL 是最流行的關係型資料庫管理系統之一,在 WEB 應用方面,MySQL是最好的 RDBMS (Relational Database Management System,關係資料庫管理系統) 應用軟體。

MySQL是一種關係資料庫管理系統,關係資料庫將資料儲存在不同的表中,而不是將所有資料放在一個大倉庫內,這樣就增加了速度並提高了靈活性。

MySQL所使用的 SQL 語言是用於訪問資料庫的最常用標準化語言。MySQL 軟體採用了雙授權政策,分為社群版和商業版,由於其體積小、速度快、總體擁有成本低,尤其是開放原始碼這一特點,一般中小型網站的開發都選擇 MySQL 作為網站資料庫。

由於其社群版的效能卓越,搭配 PHP 和 Apache 可組成良好的開發環境。

1. 資料庫(Database)是按照資料結構來組織、儲存和管理資料的倉庫,每個資料庫都有一個或多個不同的API用於建立,訪問,管理,搜尋和複製所儲存的資料。

2. 使用關係型資料庫管理系統(RDBMS)來儲存和管理的大資料量。關係型資料庫是建立在關係模型基礎上的資料庫,藉助於集合代數等數學概念和方法來處理資料庫中的資料。

3. RDBMS特點:

1.資料以表格的形式出現

2.每行為各種記錄名稱

3.每列為記錄名稱所對應的資料域

4.許多的行和列組成一張表單

5.若干的表單組成database

4. RDBMS 術語

冗餘:儲存兩倍資料,冗餘可以使系統速度更快。

主鍵:主鍵是唯一的。一個數據表中只能包含一個主鍵。你可以使用主鍵來查詢資料。

外來鍵:外來鍵用於關聯兩個表。

複合鍵:複合鍵(組合鍵)將多個列作為一個索引鍵,一般用於複合索引。

索引:使用索引可快速訪問資料庫表中的特定資訊。索引是對資料庫表中一列或多列的值進行排序的一種結構。類似於書籍的目錄。

參照完整性: 參照的完整性要求關係中不允許引用不存在的實體。與實體完整性是關係模型必須滿足的完整性約束條件,目的是保證資料的一致性

5. MySQL是一種關聯資料庫管理系統,關聯資料庫將資料儲存在不同的表中,而不是將所有資料放在一個大倉庫內,這樣就增加了速度並提高了靈活性。

MySQL管理

6. 啟動及關閉 MySQL伺服器:

(1) 檢查MySQL伺服器是否啟動:

ps -ef | grepmysqld

(2) 啟動MySQL伺服器:

root@host# cd/usr/bin

./safe_mysqld&

(3) 關閉目前執行的 MySQL 伺服器:

root@host# cd/usr/bin

./mysqladmin-u root -p shutdown

Enterpassword: ******

7. MySQL 使用者設定

在 MySQL 資料庫中的 user 表新增新使用者:

root@host# mysql -u root –p //選擇資料庫
Enter password:*******
mysql> use mysql;
Database changed

mysql> INSERT INTO user
(host,user,password,select_priv,insert_priv,update_priv) //設定許可權Y
VALUES ('localhost','guest',PASSWORD('guest123'),'Y','Y');

Query OK,1 row affected (0.20 sec)

mysql> FLUSH PRIVILEGES;

注意需要執行 FLUSH PRIVILEGES 語句。這個命令執行後會重新載入授權表。

另外一種新增使用者的方法為通過SQL的 GRANT命令

mysql> GRANTSELECT,INSERT,UPDATE,DELETE,CREATE,DROP
-> ON TUTORIALS.*
-> TO 'zara'@'localhost'
-> IDENTIFIED BY'zara123';

8. 管理MySQL的命令

USE 資料庫名 :選擇要操作的MySQL資料庫:

mysql> use W3CSCHOOL;

Database changed

SHOW DATABASES: 列出 MySQL 資料庫管理系統的資料庫列表:

mysql> SHOWDATABASES;

SHOW TABLES: 顯示指定資料庫所有表,用該命令前需用 use 命令選擇操作的資料庫。

mysql> useW3CSCHOOL;

Database changed

mysql> SHOW TABLES;

SHOW COLUMNS FROM 資料表:顯示資料表的屬性,屬性型別,主鍵資訊,是否NULL,預設值等其他資訊。

mysql> SHOW COLUMNSFROM W3Cschool_tbl;

+-----------------+--------------+------+-----+---------+-------+

| Field | Type | Null | Key | Default | Extra |

+-----------------+--------------+------+-----+---------+-------+

SHOW INDEX FROM 資料表:顯示資料表的詳細索引資訊,包括PRIMARY KEY(主鍵)。

SHOW TABLE STATUS LIKE 資料表\G: 該命令將輸出MySQL資料庫管理系統的效能及統計資訊。

mysql> SHOW TABLESTATUS FROM W3CSCHOOL; # 顯示資料庫 W3CSCHOOL 中所有表的資訊

mysql> SHOW TABLESTATUS from W3CSCHOOL LIKE 'W3Cschool%'; #表名以W3Cschool開頭的表的資訊

mysql> SHOW TABLESTATUS from W3CSCHOOL LIKE 'W3Cschool%'\G; #加上 \G,查詢結果按列列印

9. PHP MySQL函式格式:mysql_function(value,value,...);

MySQL 連線

10.使用MySQL二進位制方式連線

[root@host]# mysql -uroot -p
Enter password:******
登入成功後會出現mysql> 命令提示視窗,你可以在上面執行任何 SQL 語句。
退出 mysql> 命令提示視窗可以使用exit 命令:mysql> exit

11.使用 PHP指令碼連線 MySQL

PHP 提供了 mysql_connect() 函式來連線資料庫。
connectionmysql_connect(server,passwd,new_link,client_flag);5各引數均可選
使用PHP的mysql_close() 函式來斷開與MySQL資料庫的連結。
bool mysql_close (resource $link_identifier );
通常不要用mysql_close(),因為已開啟的非持久連線會在指令碼執行完畢後自動關閉。
mysql_close() 不會關閉由 mysql_pconnect() 建立的持久連線

$conn = mysql_connect($dbhost,$dbuser,$dbpass);
if(! $conn )
{
die('Could not connect: ' .mysql_error());
}
echo 'Connected successfully';
mysql_close($conn);

MySQL 建立/刪除資料庫

12.使用 mysqladmin建立資料庫

用root使用者登入,root使用者擁有最高許可權,可以使用 mysql mysqladmin 命令來建立資料庫。
[root@host]#mysqladmin -u root -pcreate/drop W3CSCHOOL
Enter password:*****

13.使用 PHP指令碼建立資料庫

PHP使用 mysql_query 函式來建立或者刪除 MySQL 資料庫。

bool mysql_query( sql,connection);
 
$conn = mysql_connect($dbhost,$dbpass);
if(! $conn )
{
 die('連線錯誤: ' . mysql_error());
}
echo '連線成功<br />';
$sql= 'CREATE/DROP DATABASE W3CSCHOOL';
$retval= mysql_query( $sql,$conn );
if(! $retval )
{
 die('建立資料庫失敗: ' . mysql_error());
}
echo "資料庫 W3CSCHOOL建立成功\n";
mysql_close($conn);

MySQL 選擇資料庫

14.使用PHP指令碼選擇MySQL資料庫

PHP 提供了函式 mysql_select_db來選取一個數據庫。

bool mysql_select_db( db_name,connection );
$conn = mysql_connect($dbhost,$dbpass);
if(! $conn )
{
 die('連線失敗: ' . mysql_error());
}

echo '連線成功';
mysql_select_db('W3CSCHOOL' );
mysql_close($conn);

MySQL 建立/刪除資料表

15.MySQL 建立資料表

建立MySQL資料表需要以下資訊:

表名

表字段名

定義每個表字段

建立語法:CREATE TABLE table_name (column_name column_type);

刪除語法:DROP TABLE table_name ;

以下例子中我們將在 W3CSCHOOL 資料庫中建立資料表w3cschool_tbl:

tutorials_tbl(
 tutorial_id INT NOT NULL AUTO_INCREMENT,tutorial_title VARCHAR(100) NOT NULL,tutorial_author VARCHAR(40) NOT NULL,submission_date DATE,PRIMARY KEY ( w3cschool_id )
);

16.通過命令提示符建立表

使用 SQL 語句 CREATE TABLE 來建立資料表。

mysql> CREATE TABLE w3cschool_tbl(
 -> w3cschool_id INT NOTNULL AUTO_INCREMENT,-> w3cschool_titleVARCHAR(100) NOT NULL,-> w3cschool_authorVARCHAR(40) NOT NULL,-> submission_date DATE,-> PRIMARY KEY (w3cschool_id )
 -> );

MySQL命令終止符為分號 (;) 。

17.使用PHP指令碼建立/刪除資料表或插入資料

語法:bool mysql_query( sql,connection);

$sql = "CREATE TABLEtutorials_tbl( "建立
  "tutorial_id INT NOTNULL AUTO_INCREMENT,".
  "tutorial_titleVARCHAR(100) NOT NULL,".
  "tutorial_authorVARCHAR(40) NOT NULL,".
  "submission_dateDATE,".
  "PRIMARY KEY (tutorial_id )); "
;
$sql = "DROP TABLEw3cschool_tbl";刪除
 
mysql_select_db( 'TUTORIALS' );
$retval = mysql_query( $sql,$conn);   //判斷是否成功而設定的引數;
if(! $retval )
{
 die('資料表建立失敗: ' . mysql_error());
}
echo "資料表建立成功\n";
mysql_close($conn);

MySQL 插入資料

18.向MySQL資料表插入資料通用的 INSERT INTO SQL語法:

INSERT INTO table_name (field1,field2,...fieldN )
VALUES
( value1,value2,...valueN );

如果資料是字元型,必須使用單引號或者雙引號,如:"value"。

w3cschool_tbl表插入一條資料:

mysql> INSERT INTOw3cschool_tbl
->(w3cschool_title,w3cschool_author,submission_date)
->VALUES
->("Learn PHP","JohnPoul",NOW());

(->)不是SQL語句的一部分,它僅表示一個新行,如SQL語句太長,可通過回車鍵建立一個新行編寫SQL語句,SQL語句的命令結束符為分號(;)。

19.使用PHP指令碼插入資料

$sql = "INSERT INTO w3cschool_tbl ".
"(w3cschool_title,submission_date) ".
"VALUES ".
"('$w3cschool_title','$w3cschool_author','$submission_date')";

MySQL 查詢資料

20.為在MySQL資料庫中查詢資料通用的 SELECT語法:

SELECT column_name,column_name
FROM table_name
[WHERE Clause]
[OFFSET M ][LIMIT N]

可以通過SELECT 命令讀取一條或者多條記錄。

可以通過OFFSET指定SELECT語句開始查詢的資料偏移量預設情況下偏移量為0。

可以使用 LIMIT 屬性來設定返回的記錄數。

你可以使用星號(*)來代替其他欄位,SELECT語句會返回表的所有欄位資料

mysql> SELECT * from w3cschool_tbl


21.使用PHP指令碼來獲取資料

使用PHP函式的mysql_query()及SQL SELECT命令來獲取資料。
該函式用於執行SQL命令,然後通過 PHP 函式 mysql_fetch_array() 來使用或輸出所有查詢的資料。

嘗試以下例項來顯示資料表w3cschool_tbl 的所有記錄

$sql = 'SELECT w3cschool_id,w3cschool_title,
w3cschool_author,submission_date
FROM w3cschool_tbl';
mysql_select_db('W3CSCHOOL');
$retval = mysql_query( $sql,$conn );
if(! $retval )
{
die('Could not get data: ' .mysql_error());
}
while($row =mysql_fetch_array($retval,MYSQL_ASSOC))
while($row =mysql_fetch_assoc($retval))

用MYSQL_NUM引數顯示資料表

while($row =mysql_fetch_array($retval,MYSQL_NUM))

用MYSQL_NUM引數顯示資料表

{
echo "Tutorial ID:{$row['w3cschool_id']} <br>".
"Title:{$row['w3cschool_title']} <br> ".
"Author:{$row['w3cschool_author']} <br> ".
"Submission Date : {$row['submission_date']}<br> ".
"--------------------------------<br>";
}
mysql_free_result($retval); 釋放遊標記憶體
echo "Fetched data successfully\n";
mysql_close($conn);


MYSQL_ASSOC, 設定該引數查詢結果返回關聯陣列,你可以使用欄位名稱來作為陣列的索引。

MySQL 選擇資料

22.從MySQL表中使用SQL SELECT語句來讀取資料。

如需有條件地從表中選取資料,可將 WHERE 子句新增到 SELECT 語句中
以下是SQL SELECT語句使用 WHERE 子句從資料表中讀取資料的通用語法:

SELECT field1,...fieldN FROM table_name1,table_name2...
[WHERE condition1 [AND[OR]] condition2.....

WHERE子句也可以運用於SQL的 DELETE 或者 UPDATE 命令。
使用 LIKE 來比較字串,否則MySQL的WHERE子句的字串比較是不區分大小寫的。 你可以使用 BINARY 關鍵字來設定WHERE子句的字串比較是區分大小寫的。

23.使用PHP指令碼讀取資料

使用PHP函式的mysql_query()及相同的SQL SELECT 帶上 WHERE 子句的命令來獲取資料。該函式用於執行SQL命令,然後通過 mysql_fetch_array() 來輸出所有查詢的資料。

$sql = 'SELECT w3cschool_id,submission_date
FROM w3cschool_tbl
WHEREw3cschool_author="Sanjay"';

MySQL UPDATE

24.修改或更新MySQL中的資料,我們可以使用SQL UPDATE 命令來操作。

通用SQL語法:

UPDATE table_name SET field1=new-value1,field2=new-value2

[WHERE Clause]

更新資料表中 w3cschool_id 為 3 的 w3cschool_title 欄位值:

mysql>UPDATE w3cschool_tbl
-> SET w3cschool_title='Learning JAVA'
- > WHERE w3cschool_id=3;

使用PHP指令碼更新資料

$sql = 'UPDATE w3cschool_tbl
SETw3cschool_title="Learning JAVA"
WHERE w3cschool_id=3';

MySQL DELETE

25.DELETE FROM table_name[WHERE Clause

如果沒有指定 WHERE 子句,MySQL表中的所有記錄將被刪除。

可以在 WHERE 子句中指定任何條件

刪除w3cschool_tbl 表中 w3cschool_id 為3 的記錄

mysql> DELETE FROMw3cschool_tbl WHERE w3cschool_id=3;

用 PHP 指令碼刪除資料

$sql = 'DELETE FROMw3cschool_tbl
WHERE w3cschool_id=3';

MySQL LIKE 子句

QL LIKE 子句中使用百分號(%)字元來表示任意字元

沒有使用百分號(%),LIKE 子句與等號(=)的效果是一樣的。
26.QL SELECT語句使用 LIKE子句從資料表中讀取資料的通用語法:
SELECT field1,...fieldN table_name1,table_name2...
WHERE field1 LIKEcondition1 [AND [OR]] filed2 = 'somevalue'
LIKE 通常與 % 一同使用,類似於一個元字元的搜尋


在PHP指令碼中使用 LIKE 子句

$sql = 'SELECTw3cschool_id,submission_date
FROM w3cschool_tbl
WHERE w3cschool_author LIKE"%jay%"';

MySQL 排序

SELECT field1,table_name2...

ORDER BY field1,[field2...] [ASC [DESC]]

ASC 或 DESC 關鍵字來設定查詢結果是按升序或降序排列。預設情況下,它是按升排列。

MySQL 分組

SELECT column_name,function(column_name)
FROM table_name
WHERE column_nameoperator value
GROUP BY column_name;

WITH ROLLUP 可以實現在分組統計資料基礎上再進行相同的統計(SUM,AVG,COUNT…)。

coalesce 來設定一個可以取代NUll 的名稱,coalesce 語法:

select coalesce(a,b,c);

引數說明:如果a==null,則選擇b;如果b==null,則選擇c;如果a!=null,則選擇a;如果a b c 都為null ,則返回為null(沒意義)。

mysql> SELECTcoalesce(name,'總數'),SUM(singin) as singin_countFROM employee_tbl GROUP BY name WITHROLLUP;

+--------------------------+--------------+

| coalesce(name,'總數') | singin_count |

+--------------------------+--------------+

| 小麗 | 2 |

| 小明 | 7 |

| 小王 | 7 |

| 總數 | 16 |

+--------------------------+--------------+

MySQL 多表查詢

27.在SELECT,UPDATE 和 DELETE 語句中使用 Mysql 的 JOIN 來聯合多表查詢。

JOIN 按照功能大致分為如下三類:

INNER JOIN(內連線,或等值連線):獲取兩個表中欄位匹配關係的記錄。
LEFT JOIN(左連線):獲取左表所有記錄,即使右表沒有對應匹配的記錄。
RIGHT JOIN(右連線):與 LEFT JOIN 相反,用於獲取右表所有記錄,即使左表沒有對應匹配的記錄。

| w3cschool_author |w3cschool_count |

+-----------------+----------------+

| mahran | 20 |

| mahnaz | NULL |

| Jen | NULL |

| Gill | 20 |

| John Poul | 1 |

| Sanjay | 1 |

+-----------------+----------------+

mysql> SELECT * fromw3cschool_tbl;

+-------------+----------------+-----------------+-----------------+

| w3cschool_id | w3cschool_title | w3cschool_author |submission_date |

+-------------+----------------+-----------------+-----------------+

| 1 | Learn PHP | John Poul |2007-05-24 |
| 2 | LearnMySQL | Abdul S | 2007-05-24 |
| 3 | JAVATutorial | Sanjay | 2007-05-06 |

連線以上兩張表來讀取w3cschool_tbl表中所有w3cschool_author欄位在tcount_tbl表對應的w3cschool_count欄位值:

mysql> SELECTa.w3cschool_id,a.w3cschool_author,b.w3cschool_count FROM w3cschool_tbl aINNER JOIN tcount_tbl b ON a.w3cschool_author = b.w3cschool_author;

+-----------+---------------+--------------+

| w3cschool_id | w3cschool_author | w3cschool_count |

+-----------+---------------+--------------+

| 1 | John Poul | 1 |

| 3 | Sanjay | 1 |

w3cschool_tbl 為左表,tcount_tbl 為右表,

mysql> SELECTa.w3cschool_id,b.w3cschool_count FROM w3cschool_tbl a LEFTJOIN tcount_tbl b ON a.w3cschool_author = b.w3cschool_author;

+-------------+-----------------+----------------+

| w3cschool_id | w3cschool_author | w3cschool_count |

+-------------+-----------------+----------------+

| 1 | John Poul | 1 |

| 2 | Abdul S | NULL |

| 3 | Sanjay | 1 |

左邊的資料表w3cschool_tbl的所有選取的欄位資料,即便在右側表tcount_tbl中沒有對應的w3cschool_author欄位值Abdul S。

MySQL NULL

IS NULL: 當列的值是NULL,此運算子返回true。
IS NOT NULL: 當列的值不為NULL,運算子返回true。

NULL值與任何其它值的比較(即使是NULL)永遠返回false,

使用PHP指令碼處理 NULL 值:

PHP指令碼中你可以在 if...else 語句來處理變數是否為空,並生成相應的條件語句。

MySQL 正則表示式

28.MySQL中使用 REGEXP 操作符來進行正則表示式匹配。

^ 匹配輸入字串的開始位置。如果設定了 RegExp 物件的 Multiline 屬性,^ 也匹配 '\n' 或 '\r' 之後的位置。
$ 匹配輸入字串的結束位置。如果設定了RegExp 物件的 Multiline 屬性,$ 也匹配 '\n' 或 '\r' 之前的位置。
. 匹配除"\n" 之外的任何單個字元。要匹配包括 '\n' 在內的任何字元,請使用象 '[.\n]' 的模式。

例項(表名:person_tbl )來加深我們的理解:

查詢name欄位中以'st'為開頭的所有資料:

mysql> SELECT name FROM person_tbl WHERE name REGEXP '^st';

查詢name欄位中以'ok'為結尾的所有資料:

mysql> SELECT name FROM person_tbl WHERE name REGEXP 'ok$';

查詢name欄位中包含'mar'字串的所有資料:

mysql> SELECT name FROM person_tbl WHERE name REGEXP 'mar';

查詢name欄位中以母音字元開頭或以'ok'字串結尾的所有資料:

mysql> SELECT name FROM person_tbl WHERE name REGEXP'^[aeiou]|ok$';

MySQL 事務

29.MySQL 事務主要用於處理操作量大,複雜度高的資料。

在MySQL中只有使用了Innodb資料庫引擎的資料庫或表才支援事務

事務處理可以用來維護資料庫的完整性,保證成批的SQL語句要麼全部執行,要麼全部不執行

事務用來管理insert,update,delete語句

事務必須滿足4個條件(ACID): Atomicity(原子性)、Consistency(穩定性)、Isolation(隔離性)、Durability(可靠性)

1、事務的原子性:一組事務,要麼成功;要麼撤回。

2、穩定性: 有非法資料(外來鍵約束之類),事務撤回。

3、隔離性:事務獨立執行。一個事務處理後的結果,影響了其他事務,那麼其他事務會撤回。事務的100%隔離,需要犧牲速度。

4、可靠性:軟、硬體崩潰後,InnoDB資料表驅動會利用日誌檔案重構修改。可靠性和高速度不可兼得, innodb_flush_log_at_trx_commit選項 決定什麼時候吧事務儲存到日誌裡。

在MySQL控制檯使用事務來操作:

1,開始一個事務

start transaction

2,做儲存點

savepoint 儲存點名稱

3,操作

4,可以回滾,可以提交,沒有問題,就提交,有問題就回滾。

PHP中使用事務例項

mysql_query("SETAUTOCOMMIT=0");//設定為不自動提交,因為MYSQL預設立即執行mysql_query("BEGIN");//開始事務定義

if(!mysql_query("insertinto trans (id) values('2')"))
{
mysql_query("ROOLBACK");//判斷當執行失敗時回滾
}
mysql_query("COMMIT");//執行事務
mysql_close($handler);
MySQL ALTER

30.修改資料表名或者修改資料表字段時,就需要使用到MySQL ALTER命令。

使用了 ALTER 命令及 DROP 子句來刪除以上建立表的 i欄位:

mysql> ALTER TABLEtestalter_tbl DROP i;

資料表中只剩餘一個欄位則無法使用DROP來刪除欄位。

ADD 子句來想資料表中新增列,在表 testalter_tbl 中新增 i 欄位,並定義資料型別:

mysql> ALTER TABLEtestalter_tbl ADD i INT;

以下 ALTERTABLE 語句,在執行成功後,使用 SHOW COLUMNS 查看錶結構的變化:

ALTER TABLEtestalter_tbl DROP i;
ALTER TABLEtestalter_tbl ADD i INT FIRST;
ALTER TABLEtestalter_tbl DROP i;
ALTER TABLEtestalter_tbl ADD i INT AFTER c;

FIRST 和 AFTER 關鍵字只佔用於 ADD 子句,所以如果你想重置資料表字段的位置就需要先使用 DROP 刪除欄位然後使用 ADD 來新增欄位並設定位置。

修改欄位型別及名稱:

31.在ALTER命令中使用 MODIFY 或 CHANGE 子句 。

把欄位 c 的型別從 CHAR(1) 改為 CHAR(10),可以執行以下命令:
mysql> ALTER TABLEtestalter_tbl MODIFY c CHAR(10);
使用 CHANGE 子句,語法有很大的不同。 在 CHANGE 關鍵字之後,緊跟著的是你要修改的欄位名,然後指定新欄位的型別及名稱。嘗試如下例項:
mysql> ALTER TABLEtestalter_tbl CHANGE i j BIGINT;
<p如果你現在想把欄位 j 從 BIGINT 修改為 INT,SQL語句如下:
mysql> ALTER TABLEtestalter_tbl CHANGE j j INT;

ALTER修改欄位的預設值,mysql> ALTER TABLEtestalter_tbl ALTER i SET DEFAULT 1000;
ALTER 及DROP刪除欄位的預設值,ALTER TABLEtestalter_tbl ALTER i DROP DEFAULT;
ALTER及 TYPE修改資料表型別,mysql> ALTER TABLEtestalter_tbl TYPE = MYISAM;
ALTER TABLE 使用RENAME修改資料表的名稱,mysql> ALTER TABLEtestalter_tbl RENAME TO alter_tbl;

MySQL 索引

索引可以大大提高MySQL的檢索速度
索引分單列索引和組合索引。單列索引,即一個索引只包含單個列,一個表可以有多個單列索引,但這不是組合索引。組合索引,即一個索包含多個列。
建立索引,確保該索引是應用在 SQL 查詢語句的條件(一般作為 WHERE 子句的條件)。
索引也是一張表,該表儲存了主鍵與索引欄位,並指向實體表的記錄。
缺點:雖然索引大大提高了查詢速度,同時卻會降低更新表的速度,如對錶進行INSERT、UPDATE和DELETE。因為更新表時,MySQL不僅要儲存資料,還要儲存一下索引檔案。
3方式建立普通索引

CREATE INDEX indexName ONmytable(username(length));

如果是CHAR,VARCHAR型別,length可以小於欄位實際長度;如果是BLOB和TEXT型別,必須指定 length。

修改表結構

ALTER mytable ADD INDEX[indexName] ON (username(length))

建立表的時候直接指定

CREATE TABLE mytable( 
ID INT NOT NULL,username VARCHAR(16) NOTNULL,INDEX [indexName](username(length)) 
); 

刪除索引的語法

DROP INDEX [indexName] ONmytable;

唯一索引:前面加UNIQUE

使用ALTER 命令新增和刪除索引

有四種方式來新增資料表的索引:

ALTER TABLE tbl_name ADD PRIMARYKEY (column_list):該語句新增一個主鍵,這意味著索引值必須是唯一的,且不能為NULL。
ALTER TABLE tbl_name ADD UNIQUEindex_name (column_list):這條語句建立索引的值必須是唯一的(除了NULL外,NULL可能會出現多次)。
ALTER TABLE tbl_name ADD INDEXindex_name (column_list):新增普通索引,索引值可出現多次。
ALTER TABLE tbl_name ADD FULLTEXTindex_name (column_list):該語句指定了索引為 FULLTEXT ,用於全文索引。

使用 ALTER 命令新增和刪除主鍵

主鍵只能作用於一個列上,新增主鍵索引時,你需要確保該主鍵預設不為空(NOT NULL)。例項如下:

mysql> ALTER TABLEtestalter_tbl MODIFY i INT NOT NULL;

mysql> ALTER TABLEtestalter_tbl ADD PRIMARY KEY (i);

你也可以使用 ALTER 命令刪除主鍵:

mysql> ALTER TABLEtestalter_tbl DROP PRIMARY KEY;

SHOW INDEX 命令列出表中的相關的索引資訊。可以通過新增 \G 來格式化輸出資訊。

mysql> SHOW INDEX FROMtable_name\G

MySQL 臨時表

臨時表只在當前連線可見,當關閉連線時,MySQL會自動刪除表並釋放所有空間。

mysql> CREATE TEMPORARY TABLE SalesSummary

mysql> DROP TABLE SalesSummary;

MySQL 複製表

建立新的克隆表clone_tbl。如果你想拷貝資料表的資料你可以使用 INSERT INTO... SELECT 語句來實現。

mysql> INSERT INTOclone_tbl (w3cschool_id,
-> w3cschool_title,
-> w3cschool_author,
-> submission_date)
-> SELECT w3cschool_id,submission_date
->FROM w3cschool_tbl;

MySQL 元資料

想知道MySQL以下三種資訊:

查詢結果資訊: SELECT,UPDATE 或 DELETE語句影響的記錄數。
資料庫和資料表的資訊: 包含了資料庫及資料表的結構資訊。
MySQL伺服器資訊: 包含了資料庫伺服器的當前狀態,版本號等。

(1)使用do( ) 執行 $query

my $count = $dbh->do($query);

(2)使用prepare( )及 execute( ) 執行 $query

my $sth =$dbh->prepare ($query);

my $count =$sth->execute ( );

在PHP中,使用mysql_affected_rows( ) 函式獲取查詢語句影響的記錄數。

$result_id =mysql_query ($query,$conn_id);
# 如果查詢失敗返回
$count = ($result_id ?mysql_affected_rows ($conn_id) : 0);
print ("$countrows were affected\n");

資料庫和資料表列表

PERL 例項

# 獲取當前資料庫中所有可用的表。

my @tables =$dbh->tables ( );
foreach $table (@tables){
 print "Table Name $table\n";
}

PHP 例項:

$db_list =mysql_list_dbs($con);
while ($db = mysql_fetch_object($db_list))
{
 echo $db->Database . "<br/>";
}

MySQL 序列

MySQL序列是一組整數:1,2,3,...,

用 MySQLAUTO_INCREMENT 來定義列。

mysql> CREATE TABLEinsect

-> (

-> id INT UNSIGNED NOT NULLAUTO_INCREMENT,

用 SQL中的LAST_INSERT_ID() 函式來獲取最後的插入表中的自增列的值。

PERL例項

使用mysql_insertid 屬性來獲取 AUTO_INCREMENT 的值。例項如下:

$dbh->do("INSERT INTO insect (name,date,origin)

VALUES('moth','2001-09-14','windowsill')");

my $seq =$dbh->{mysql_insertid};

PHP例項

PHP 通過 mysql_insert_id ()函式來獲取執行的插入SQL語句中 AUTO_INCREMENT列的值。

mysql_query("INSERT INTO insect (name,origin)
VALUES('moth','windowsill')",$conn_id);
$seq = mysql_insert_id($conn_id);

重置序列

刪除了資料表中的多條記錄,並對剩下資料的AUTO_INCREMENT列進行重新排列,那麼你可以通過刪除自增的列,然後重新新增來實現。

mysql> ALTER TABLEinsect DROP id;

mysql> ALTER TABLEinsect

-> ADD id INT UNSIGNED NOT NULLAUTO_INCREMENT FIRST,

-> ADD PRIMARY KEY (id);

一般情況下序列的開始值為1,但如果你需要指定一個開始值100:

-> id INT UNSIGNEDNOT NULL AUTO_INCREMENT = 100,

或在表建立成功後,通過以下語句來實現:

mysql> ALTER TABLE tAUTO_INCREMENT = 100;

MySQL 處理重複資料

防止表中出現重複資料

在MySQL資料表中設定指定的欄位為PRIMARY KEY(主鍵)或者UNIQUE(唯一)索引保證資料的唯一性。

設定表中欄位first_name,last_name資料不能重複,你可以設定雙主鍵模式來設定資料的唯一性, 如果你設定了雙主鍵,那麼那個鍵的預設值不能為NULL,可設定為NOT NULL。如下所示:

CREATE TABLE person_tbl
(
 first_name CHAR(20) NOT NULL,last_name CHAR(20) NOT NULL,sexCHAR(10),PRIMARY KEY (last_name,first_name)
);

INSERT IGNOREINTO與INSERT INTO的區別就是INSERT IGNORE會忽略資料庫中已經存在的資料,如果資料庫沒有資料,就插入新的資料,如果有資料的話就跳過這條資料。這樣可以保留資料庫中已經存在資料,達到在間隙中插入資料的目的。

用了INSERT IGNORE INTO,執行後不會出錯,也不會向資料表中插入重複資料:

mysql> INSERT IGNORE INTO person_tbl(last_name,first_name)

->VALUES( 'Jay','Thomas');

Query OK,1 row affected (0.00 sec)

REPLACE INTO into如果存在primary 或 unique相同的記錄,則先刪除掉。再插入新記錄。

UNIQUE(last_name,first_name)

查詢重複記錄

select user_name,count(*) as count fromuser_table group by user_name having count>1;

select * from people

where peopleId in (select peopleId from peoplegroup by peopleId having count(peopleId) > 1)

統計重複資料

統計表中 first_name 和 last_name的重複記錄數:

mysql> SELECT COUNT(*) as repetitions,last_name,first_name

 ->FROM person_tbl
 ->GROUP BY last_name,first_name
 ->HAVING repetitions > 1;

過濾重複資料

讀取不重複的資料可以在SELECT 語句中使用 DISTINCT 關鍵字來過濾重複資料。

mysql> SELECT DISTINCT last_name,first_name

->FROM person_tbl

->ORDER BY last_name;

也可以使用 GROUP BY 來讀取資料表中不重複的資料:

mysql> SELECT last_name,first_name
 ->FROM person_tbl
 ->GROUP BY (last_name,first_name);

刪除重複資料

刪除資料表中的重複資料,你可以使用以下的SQL語句:

mysql> CREATE TABLE tmp SELECT last_name,first_name,sex

 ->     FROMperson_tbl;

 ->     GROUP BY(last_name,first_name);

mysql> DROP TABLE person_tbl;

mysql> ALTER TABLE tmp RENAME TO person_tbl;

也可以在資料表中新增 INDEX(索引) 和 PRIMAY KEY(主鍵)這種簡單的方法來刪除表中的重複記錄。方法如下:

mysql> ALTER IGNORE TABLE person_tbl
 ->ADD PRIMARY KEY (last_name,first_name);

MySQL 及 SQL 注入

沒有過濾特殊字元時,出現的SQL情況:

// 設定$name 中插入了我們不需要的SQL語句

$name = "Qadir';DELETE FROM users;";

mysql_query("SELECT* FROM users WHERE name='{$name}'");

以上的注入語句中,我們沒有對 $name 的變數進行過濾,$name中插入了我們不需要的SQL語句,將刪除 users 表中的所有資料。

防止SQL注入,注意以下幾個要點:

1.永遠不要信任使用者的輸入。對使用者的輸入進行校驗,可以通過正則表示式,或限制長度;對單引號和雙"-"進行轉換等。

2.永遠不要使用動態拼裝sql,可以使用引數化的sql或者直接使用儲存過程進行資料查詢存取。

3.永遠不要使用管理員許可權的資料庫連線,為每個應用使用單獨的許可權有限的資料庫連線。

4.不要把機密資訊直接存放,加密或者hash掉密碼和敏感的資訊。

5.應用的異常資訊應該給出儘可能少的提示,最好使用自定義的錯誤資訊對原始錯誤資訊進行包裝

6.sql注入的檢測方法一般採取輔助軟體或網站平臺來檢測,軟體一般採用sql注入檢測工具jsky,網站平臺就有億思網站安全平臺檢測工具。MDCSOFT SCAN等。採用MDCSOFT-IPS可以有效的防禦SQL注入,XSS攻擊等。

在指令碼語言,如Perl和PHP可以對使用者輸入的資料進行轉義從而來防止SQL注入。

PHP的MySQL擴充套件提供了mysql_real_escape_string()函式來轉義特殊的輸入字元。

if (get_magic_quotes_gpc())
{
 $name = stripslashes($name);
}

$name =mysql_real_escape_string($name);
mysql_query("SELECT * FROMusers WHERE name='{$name}'");

Like語句中的注入

like查詢時,如使用者輸入的值有"_"和"%",則會出現這種情況:使用者本只想查詢"abcd_",查詢結果中卻有"abcd_"、"abcde"、"abcdf"等等;使用者要查詢"30%"(注:百分之三十)時也會出現問題。

在PHP指令碼中我們可以使用addcslashes()函式來處理以上情況,如下例項:

$sub =addcslashes(mysql_real_escape_string("%something_"),"%_");

// $sub == \%something\_

mysql_query("SELECT * FROMmessages WHERE subject LIKE '{$sub}%'");

addcslashes() 函式在指定的字元前新增反斜槓。

語法格式:

addcslashes(string,characters)

MySQL 匯出資料

使用 SELECT ...INTO OUTFILE 語句匯出資料

將資料表w3cschool_tbl 資料匯出到 /tmp/tutorials.txt 檔案中:

mysql> SELECT * FROMtutorials_tbl

-> INTO OUTFILE '/tmp/tutorials.txt';

生成一個檔案,各值用逗號隔開。這種格式可以被許多程式使用。

SELECT a,a+b INTOOUTFILE '/tmp/result.text'
FIELDS TERMINATED BY',' OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY'\n'
FROM test_table;

SELECT ... INTO OUTFILE 語句有以下屬性:

LOAD DATA INFILE是SELECT ... INTO OUTFILE的逆操作,SELECT句法。為了將一個數據庫的資料寫入一個檔案,使用SELECT ... INTO OUTFILE,為了將檔案讀回資料庫,使用LOAD DATA INFILE。

SELECT...INTO OUTFILE 'file_name'形式的SELECT可以把被選擇的行寫入一個檔案中。該檔案被建立到伺服器主機上,因此您必須擁有FILE許可權,才能使用此語法。

輸出不能是一個已存在的檔案。防止檔案資料被篡改。

你需要有一個登陸伺服器的賬號來檢索檔案。否則SELECT ... INTO OUTFILE 不會起任何作用。

在UNIX中,該檔案被建立後是可讀的,許可權由MySQL伺服器所擁有。這意味著,雖然你就可以讀取該檔案,但可能無法將其刪除

匯出表作為原始資料

mysqldump是MySQL用於轉儲存資料庫的實用程式。

將資料表tutorials_tbl 匯出到 /tmp 目錄中:

$ mysqldump -u root -p--no-create-info \

--tab=/tmp W3CSCHOOL w3cschool_tbl

password ******

匯出整個資料庫的資料,可以使用以下命令:

$ mysqldump -u root -pW3CSCHOOL > database_dump.txt

password ******

備份所有資料庫,可以使用以下命令:

$ mysqldump -u root -p--all-databases > database_dump.txt

password ******

在 mysqldump 命令中指定資料庫名及資料表。

在源主機上執行以下命令,將資料備份至 dump.txt 檔案中:

$ mysqldump -u root -pdatabase_name table_name > dump.txt

password *****

將備份的資料庫匯入到MySQL伺服器中,可以使用以下命令,使用以下命令你需要確認資料庫已經建立:

$ mysql -u root -pdatabase_name < dump.txt password *****

以下命令將匯出的資料直接匯入到遠端的伺服器上,但請確保兩臺伺服器是相通的,是可以相互訪問的:</p>

$ mysqldump -u root -pdatabase_name \

| mysql -h other-host.com database_name

MySQL 匯入資料

從當前目錄中讀取檔案dump.txt ,將該檔案中的資料插入到當前資料庫的 mytbl 表中。

mysql> LOAD DATALOCAL INFILE 'dump.txt' INTO TABLE mytbl;

如果使用者指定一個FIELDS 子句,它的子句(TERMINATED BY、[OPTIONALLY] ENCLOSED BY 和 ESCAPED BY) 也是可選的,不過,使用者必須至少指定它們中的一個。

mysql> LOAD DATALOCAL INFILE 'dump.txt' INTO TABLE mytbl

-> FIELDS TERMINATED BY ':'

-> LINES TERMINATED BY '\r\n';

指定列的順序。

如,在資料檔案中的列順序是a,c,但在插入表的列順序為b,c,a,則資料匯入語法如下:

mysql> LOAD DATALOCAL INFILE 'dump.txt'

-> INTO TABLE mytbl (b,a);

使用mysqlimport 匯入資料

mysqlimport客戶端提供了LOADDATA INFILEQL語句的一個命令列介面。mysqlimport的大多數選項直接對應LOAD DATA INFILE子句。

從檔案 dump.txt 中將資料匯入到 mytbl資料表中,可以使用以下命令:

$ mysqlimport -u root-p --local database_name dump.txt

password *****

mysqlimport命令可以指定選項來設定指定格式,命令語句格式如下:

$ mysqlimport -u root-p --local --fields-terminated-by=":" \

--lines-terminated-by="\r\n" database_name dump.txt

password *****

mysqlimport 語句中使用 --columns 選項來設定列的順序:

$ mysqlimport -u root-p --local --columns=b,a \

database_name dump.txt

password *****