1. 程式人生 > >MySQL個人學習記錄

MySQL個人學習記錄

// MySQL語句
// WHERE 語句
// 讀取資料通過 SELECT 語句來完成
// 如果需要有條件的選擇資料,可以將WHERE 語句新增到SELECT語句中

// WHERE子句也可以運用於SQL的 DELETE 或者 UPDATE 命令。
// WHERE 子句類似於程式語言中的if條件,根據 MySQL 表中的欄位值來讀取指定的資料。
// 以下為操作符列表,可用於 WHERE 子句中。
// 下表中例項假定 A為10 B為20
// 操作符	描述	例項
// =	等號,檢測兩個值是否相等,如果相等返回true	(A = B) 返回false。
// <>, !=	不等於,檢測兩個值是否相等,如果不相等返回true	(A != B) 返回 true。
// >	大於號,檢測左邊的值是否大於右邊的值, 如果左邊的值大於右邊的值返回true	(A > B) 返回false。
// <	小於號,檢測左邊的值是否小於右邊的值, 如果左邊的值小於右邊的值返回true	(A < B) 返回 true。
// >=	大於等於號,檢測左邊的值是否大於或等於右邊的值, 如果左邊的值大於或等於右邊的值返回true	(A >= B) 返回false。
// <=	小於等於號,檢測左邊的值是否小於於或等於右邊的值, 如果左邊的值小於或等於右邊的值返回true	(A <= B) 返回 true。
// 如果我們想再MySQL資料表中讀取指定的資料,WHERE 子句是非常有用的。
// 使用主鍵來作為 WHERE 子句的條件查詢是非常快速的。
// 如果給定的條件在表中沒有任何匹配的記錄,那麼查詢不會返回任何資料。

// 例子
// BINARY關鍵字設定where子句的字串是區分大小寫的
// SELECT * from table1 WHERE BINARY student_name="zhangsanfeng";

// 修改命令符UPDATE
// 將更新資料表table中 tudent_id 為 123 的 student_name和student_card欄位值
// UPDATE table SET student_name="wwangwei",student_card="xxxxxxx" WHERE tudent_id="123";


// DELETE 刪除資料
// SQL DELETE 語句從MySQL資料表中刪除資料的通用語法:

// DELETE FROM table_name [WHERE Clause]
// 如果沒有指定 WHERE 子句,MySQL表中的所有記錄將被刪除。
// 你可以在 WHERE 子句中指定任何條件
// 您可以在單個表中一次性刪除記錄。
// 當你想刪除資料表中指定的記錄時 WHERE 子句是非常有用的。

// 將刪除 runoob_tbl 表中 runoob_id 為3 的記錄:
// DELETE FROM runoob_tbl WHERE runoob_id="3";

// LIKE語句
// 在MySQL中使用 SQL SELECT 命令來讀取資料, 同時我們可以在 SELECT 語句中使用 WHERE 子句來獲取指定的記錄。
// WHERE 子句中可以使用等號 (=) 來設定獲取資料的條件,如 "runoob_author = 'Sanjay'"。
// 但是有時候我們需要獲取 runoob_author 欄位含有 "jay" 字元的所有記錄,這時我們就需要在 WHERE 子句中使用 SQL LIKE 子句。
// SQL LIKE 子句中使用百分號(%)字元來表示任意字元,類似於UNIX或正則表示式中的星號 (*)。
// 如果沒有使用百分號(%), LIKE 子句與等號(=)的效果是一樣的

// 將runoob_tbl表中獲取runoob_author欄位中以"jay"為結尾的的所有記錄
// SELECT * from runoob_tbl WHERE runoob_author LIKE '%jay';

// 如果我們需要對讀取的資料進行排序,我們就可以使用MySQL的 ORDER BY 子句來設定你想按哪個欄位哪中方式來進行排序,再返回搜尋結果。
// 可以使用任何欄位來作為排序的條件,從而返回排序後的查詢結果。
// 你可以設定多個欄位來排序。
// 你可以使用 ASC升序 或 DESC 降序關鍵字來設定查詢結果是按升序或降序排列。 預設情況下,它是按升排列。
// 你可以新增 WHERE...LIKE 子句來設定條件。

// 在 SQL SELECT 語句中使用 ORDER BY 子句來讀取MySQL 資料表 runoob_tbl 中的資料
// SELECT * from runoob_tbl ORDER BY  runoob_username ASC;
// SELECT * FROM runoob_tbl WHERE runoob_username LIKE "%WANG" ORDER BY runoob_username DESC;





// 如何使用MySQL 的 JOIN 在兩個或多個表中查詢資料。
// 你可以在SELECT, UPDATE 和 DELETE 語句中使用Mysql 的 join 來聯合多表查詢。
// 以下我們將演示MySQL LEFT JOIN 和 JOIN 的使用的不同之處。

// 
[email protected]
# mysql -u root -p password; // Enter password:******* // mysql> use RUNOOB; // Database changed // mysql> SELECT * FROM tcount_tbl; // +-----------------+----------------+ // | runoob_author | runoob_count | // +-----------------+----------------+ // | mahran | 20 | // | mahnaz | NULL | // | Jen | NULL | // | Gill | 20 | // | John Poul | 1 | // | Sanjay | 1 | // +-----------------+----------------+ // 6 rows in set (0.01 sec) // mysql> SELECT * from runoob_tbl; // +-------------+----------------+-----------------+-----------------+ // | runoob_id | runoob_title | runoob_author | submission_date | // +-------------+----------------+-----------------+-----------------+ // | 1 | Learn PHP | John Poul | 2007-05-24 | // | 2 | Learn MySQL | Abdul S | 2007-05-24 | // | 3 | JAVA Tutorial | Sanjay | 2007-05-06 | // +-------------+----------------+-----------------+-----------------+ // 3 rows in set (0.00 sec) // mysql> // 使用MySQL的JOIN來連線以上兩張表來讀取runoob_tbl表中所有runoob_author欄位在tcount_tbl表對應的runoob_count欄位值: // SELECT a.runoob_id,a.runoob_author,b.runoob_count // FROM runoob_tbl a,tcount_tbl b // WHERE a.runoob_author=b.runoob_author; // MySQL left join 與 join 有所不同。 MySQL LEFT JOIN 會讀取左邊資料表的全部資料,即便右邊表無對應資料。 // SELECT a.runoob_id,a.runoob_author,b.runoob_count // FROM runoob_tbl a LEFT JOIN tcount_tbl // ON a.runoob_author = b.runoob_author; // LEFT JOIN,該語句會讀取左邊的資料表runoob_tbl的所有選取的欄位資料, // 即便在右側表tcount_tbl中沒有對應的runoob_author欄位值 // mysql> SELECT a.runoob_id, a.runoob_author, b.runoob_count // -> FROM runoob_tbl a LEFT JOIN tcount_tbl b // -> ON a.runoob_author = b.runoob_author; // +-------------+-----------------+----------------+ // | runoob_id | runoob_author | runoob_count | // +-------------+-----------------+----------------+ // | 1 | John Poul | 1 | // | 2 | Abdul S | NULL | // | 3 | Sanjay | 1 | // +-------------+-----------------+----------------+ // MySQL使用 SQL SELECT 命令及 WHERE 子句來讀取資料表中的資料, // 但是當提供的查詢條件欄位為 NULL 時,該命令可能就無法正常工作 // IS NULL: 當列的值是NULL,此運算子返回true。 // IS NOT NULL: 當列的值不為NULL, 運算子返回true。 // <=>: 比較操作符(不同於=運算子),當比較的的兩個值為NULL時返回true。 // 關於 NULL 的條件比較運算是比較特殊的。你不能使用 = NULL 或 != NULL 在列中查詢 NULL 值 。 // 在MySQL中,NULL值與任何其它值的比較(即使是NULL)永遠返回false,即 NULL = NULL 返回false 。 // MySQL中處理NULL使用IS NULL和IS NOT NULL運算子。 // 查詢為null的資料 // SELECT * from runoob_tbl WHERE runoob_count IS NULL; // mysql> SELECT * FROM tcount_tbl // -> WHERE runoob_count IS NULL; // +-----------------+----------------+ // | runoob_author | runoob_count | // +-----------------+----------------+ // | mahnaz | NULL | // | Jen | NULL | // +-----------------+----------------+ // 查詢不為空的資料 // SELECT * FROM runoob_tbl WHERE runoob_count IS NOT NULL; // mysql> SELECT * from tcount_tbl // -> WHERE runoob_count IS NOT NULL; // +-----------------+----------------+ // | runoob_author | runoob_count | // +-----------------+----------------+ // | mahran | 20 | // | Gill | 20 | // +-----------------+----------------+ // MySQL可以通過 LIKE ...% 來進行模糊匹配 // 下表中的正則模式可應用於 REGEXP 操作符中。 // 模式 描述 // ^ 匹配輸入字串的開始位置。如果設定了 RegExp 物件的 Multiline 屬性,^ 也匹配 '\n' 或 '\r' 之後的位置。 // $ 匹配輸入字串的結束位置。如果設定了RegExp 物件的 Multiline 屬性,$ 也匹配 '\n' 或 '\r' 之前的位置。 // . 匹配除 "\n" 之外的任何單個字元。要匹配包括 '\n' 在內的任何字元,請使用象 '[.\n]' 的模式。 // [...] 字元集合。匹配所包含的任意一個字元。例如, '[abc]' 可以匹配 "plain" 中的 'a'。 // [^...] 負值字元集合。匹配未包含的任意字元。例如, '[^abc]' 可以匹配 "plain" 中的'p'。 // p1|p2|p3 匹配 p1 或 p2 或 p3。例如,'z|food' 能匹配 "z" 或 "food"。'(z|f)ood' 則匹配 "zood" 或 "food"。 // * 匹配前面的子表示式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。* 等價於{0,}。 // + 匹配前面的子表示式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等價於 {1,}。 // {n} n 是一個非負整數。匹配確定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的兩個 o。 // {n,m} m 和 n 均為非負整數,其中n <= m。最少匹配 n 次且最多匹配 m 次。 // 例項 // 查詢name欄位中以'st'為開頭的所有資料: // SELECT NAME FROM TABLE1 WHERE NAME REGEXP '^st'; // 查詢name欄位中以'ok'為結尾的所有資料 // SELECT NAME FROM TABLE WHERE NAME REGEXP 'OK$'; // 查詢name欄位中包含'mar'字串的所有資料: // SELECT NAME FROM TABLE WHERE NAME REGEXP 'MAR'; // 查詢name欄位中以母音字元[aeiou]開頭且以'ok'字串結尾的所有資料: // SELECT NAME FROM TABLE WHERE NAME REGEXP '^[aeiou]|ok$'; // 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 ALTER命令。 // 開始本章教程前讓我們先建立一張表,表名為:testalter_tbl // ALTER 命令及 DROP 子句來刪除以上建立表的 i 欄位 // ALERT TABLE testalert_tbl DROP i; // ----->>>如果資料表中只剩餘一個欄位則無法使用DROP來刪除欄位。 // ADD 子句來想資料表中新增列, // 如下例項在表 testalter_tbl 中新增 i 欄位,並定義資料型別: // ALERT TABLE testalter_tbl ADD i INT COMMENT "COMMENT---->>欄位註釋"; // 修改欄位型別及名稱 // 如果需要修改欄位型別及名稱, 你可以在ALTER命令中使用 MODIFY 或 CHANGE 子句 。 // 例如,把欄位 c 的型別從 CHAR(1) 改為 CHAR(10),可以執行以下命令: // mysql> ALTER TABLE testalter_tbl MODIFY c CHAR(10); // 使用 CHANGE 子句, 語法有很大的不同。 在 CHANGE 關鍵字之後,緊跟著的是你要修改的欄位名,然後指定新欄位的型別及名稱。嘗試如下例項: // mysql> ALTER TABLE testalter_tbl CHANGE i j BIGINT; // mysql> ALTER TABLE testalter_tbl CHANGE j j INT; // ALTER TABLE 對 Null 值和預設值的影響 // 當你修改欄位時,你可以指定是否包含只或者是否設定預設值。 // 以下例項,指定欄位 j 為 NOT NULL 且預設值為100 。 // mysql> ALTER TABLE testalter_tbl // -> MODIFY j BIGINT NOT NULL DEFAULT 100; // 如果你不設定預設值,MySQL會自動設定該欄位預設為 NULL。 // 修改欄位預設值 // 你可以使用 ALTER 來修改欄位的預設值,嘗試以下例項: // mysql> ALTER TABLE testalter_tbl ALTER i SET DEFAULT 1000; // 也可以使用 ALTER 命令及 DROP子句來刪除欄位的預設值,如下例項: // mysql> ALTER TABLE testalter_tbl ALTER i DROP DEFAULT; // 修改資料表型別,可以使用 ALTER 命令及 TYPE 子句來完成。 // 嘗試以下例項,我們將表 testalter_tbl 的型別修改為 MYISAM : // ALTER TABLE testalter_tbl TYPE = MYISAM; // 修改表名 // 如果需要修改資料表的名稱,可以在 ALTER TABLE 語句中使用 RENAME 子句來實現。 // 嘗試以下例項將資料表 testalter_tbl 重新命名為 alter_tbl: // mysql> ALTER TABLE testalter_tbl RENAME TO alter_tbl; // SET FOREIGN_KEY_CHECKS = 0;//去除外來鍵約束 // DROP TABLE IF EXISTS `loggs`; // CREATE TABLE `loggs` ( // `id` int(11) NOT NULL AUTO_INCREMENT, // `uid` longtext CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '操作者id', // `mold` int(11) NOT NULL DEFAULT 0 COMMENT '0登入 1新增 2刪除 3修改', // `texts` longtext CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '描述', // `ip` longtext CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '操作ip', // `type` int(11) NOT NULL DEFAULT 0 COMMENT '操作型別 0管理員 1教師 2學生', // `create_time` timestamp(0) NOT NULL DEFAULT CURRENT_TIMESTAMP, // PRIMARY KEY (`id`) USING BTREE // ) ENGINE = InnoDB AUTO_INCREMENT = 2799 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; // SET FOREIGN_KEY_CHECKS = 1;//加上外來鍵約束 // ENGINE=InnoDB AUTO_INCREMENT=42 DEFAULT CHARSET=utf8 CHECKSUM=1 DELAY_KEY_WRITE=1 ROW_FORMAT=DYNAMIC;詳解 // ENGINE=InnoDB:將mysql資料庫引擎設定為InnoDB。InnoDB表示帶行鎖定和外來鍵的事務安全表。 // AUTO_INCREMENT=42:表示自增欄位的值,每次自增42 // DEFAULT CHARSET=utf8:設定預設字符集為utf8 // CHECKSUM=1:設為1表示對所有行進行實時檢驗求和,用於mysql檢測主從資料一致性 // DELAY_KEY_WRITE=1 :設定為1表示在表關閉之前,將對錶的update操作更新資料到磁碟,不更新索引到磁碟, // 把對索引的更改記錄在記憶體,這樣可以使索引更新更快。在關閉表的時候,一起更新索引到磁碟 // ROW_FORMAT=DYNAMIC:在sql裡面,如果一張表不存在varchar、text、及其變形、blob及其變形的欄位的話, // 這樣的表就是靜態表,即ROW_FORMAT=FIXED,每條記錄所佔用的位元組一樣; // 否則是動態表,每條記錄所佔用的位元組是動態的,優點是節省空間,缺點是增加讀取的時間的開銷。