mysql入門之1小時學會MySQL基礎
MySQL入門
mySQL (關係型資料庫管理系統)
MySQL是一個關係型資料庫管理系統,由瑞典MySQL AB 公司開發,目前屬於 Oracle 旗下產品。MySQL 是最流行的關係型資料庫管理系統之一,在 WEB 應用方面,MySQL是最好的 RDBMS (Relational Database Management System,關係資料庫管理系統) 應用軟體。
MySQL是一種關係資料庫管理系統,關係資料庫將資料儲存在不同的表中,而不是將所有資料放在一個大倉庫內,這樣就增加了速度並提高了靈活性。
MySQL所使用的 SQL 語言是用於訪問資料庫的最常用標準化語言。MySQL 軟體採用了雙授權政策,分為社群版和商業版,由於其體積小、速度快、總體擁有成本低,尤其是開放原始碼這一特點,一般中小型網站的開發都選擇 MySQL 作為網站資料庫。
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 *****