二級MySQL數據庫程序設計(四)

課程目錄
第1章 數據庫的基本概念與設計方法
第2章 MySQL簡介
第3章 數據庫和表
第4章 表數據的基本操作
第5章 數據庫的查詢
第6章 索引
第7章 視圖
第8章 數據完整性約束與表維護語句
第9章 觸發器
第10章 事件
第11章 存儲過程與存儲函數
第12章 訪問控制與安全管理
第13章 備份與恢復
第14章 PHP和MySQL數據庫編程
第15章 開發實例

本章學習流程圖

在這裏插入圖片描述

本章學習大綱

在這裏插入圖片描述

4.1 插入表數據

數據庫與表創建成功以後,需要使用USE語句指定要操作的數據庫作爲當前數據庫,然後向當前數據庫中的表插入數據。在MySQL中可以使用INSERT或REPLACE語句向數據庫中已有的表插入一行或者多行元組數據。

INSERT語句

INSERT語句有三種語法形式,分別爲:

  • INSERT…VALUE語句
  • INSERT…SET語句
  • INSERT…SELECT語句

(1)INSERT VALUE語句

語法格式:

INSERT INTO <表名> [<列名1>[,...<列名n>]] VALUES (1)[...,(值n)];

語法說明:

  • <表名>:指定被操作的表名。
  • <列名>:指定需要插入數據的列名。

如果是向表中所有列插入數據,則全部的列名均可以省略。直接採用INSERT<表名>VALUES(…)即可。這種語法高度依賴表中所有列的定義次序,應該儘量避免使用這種方法,因爲列的次序可能會改變,這就很不安全。如果只是向表的部分列插入數據,則必須明確指定這些列的名稱,而對於沒有被指定的列,它們的值會根據列的默認值或相關屬性來確定,處理原則如下:

① 具有默認值的列,其值可通過在INSERT語句中指定關鍵字DEFAULT將其設爲默認值。

② 由於AUTO_INCREMENT屬性列的值是在表中其他列被賦值之後生成的,所以在對錶中其他列做任何賦值操作時,對該AUTO_INCREMENT屬性列的引用只會返回數字0。

③ 沒有默認值的列,若允許爲空值,則其值可通過在INSERT語句中指定關鍵字NULL將其設爲空值;若不允許爲空值,則INSERT語句執行出錯。

④ 對於具有標誌(IDENTITY)屬性的列,系統會自動生成序號值來唯一標誌該列。

⑤ 對於類型爲TIMESTAMP的列,系統會自動爲其賦值。

  • VALUES或VALUE子句:該子句包含要插入的數據清單。數據清單中數據的順序要和列的順序相對應。VALUES子句的值可以是如下兩種情況:

① 可以是一個常量、變量或表達式,也可以是空值NULL,其值的數據類型要與列的數量類型一致,如果類型不匹配,系統會提示錯誤。當列值爲字符型時,需要用單引號 括起。

②DEFAULT:用於指定此列值爲該列的默認值。前提是該列之前已經明確指定了默認值,否則插入語句會出錯。

(2)INSERT…SELECT語句

用於快速地從一個或多個表中取出數據,並將這些數據作爲行數據插入到另一個表中。SELECT子句返回的是一個查詢到的結果集,INSERT語句將這個結果集插入到指定表中,結果集中的每行數據的字段數、字段的數據都必須與被操作的表完全一致。

(3)INSERT…SET語句
用於直接給表中的某些列指定對應的列值,即要插入的數據的列名在SET子句中指定,col_name爲指定的列名,等號後面爲指定數據,而對於未指定的列,列值會指定爲該列的默認值。

由INSERT語句的三種形式可以看出,
使用INSERT…VALUES語句可以向表中插入一行數據,也可以插入多行數據;
使用INSERT…SET語句可以指定插入行中每列的值,也可以指定部分列的值;
使用INSERT…SELECT語句向表中插入其他表的值。

【例】使用INSERT…VALUES語句向數據庫my_test的表students中插入這樣一行完整數據:
(1320,‘王麗’,‘1’,‘22’,‘計算機專業’,‘138xxxxxx’)。

mysql> set names gbk;
Query OK, 0 rows affected (0.00 sec)

mysql> insert into my_test.students
    -> values(1320,'王麗','1','22','計算機專業','138xxxxxx');
Query OK, 1 row affected (0.54 sec)

mysql> select * from students;
+------------+--------------+-------------+-------------+---------------+-----------------+
| student_id | student_name | student_sex | student_age | student_major | student_contact |
+------------+--------------+-------------+-------------+---------------+-----------------
|       1320 | 王麗         | 1           | 22          | 計算機專業    | 138xxxxxx       |
+------------+--------------+-------------+-------------+---------------+-----------------+
1 row in set (0.00 sec)

注意:Windows操作系統默認使用gb2312字符集,MySQL客戶端和服務器默使用latin1,這就導致一個字符集和字符校驗不匹配的問題,因此這裏採用 SET NAMES GBK 改變字符集,這樣才能正確地插入中文。

【例】使用INSERT…VALUES語句向數據庫my_test的表students中插入這樣一行數據,這行數據值給出student_name, student_major 和 student_age列的信息,對應的值是“李明”,“數學專業”,“22”。其中student_id由系統自動生成,其他採用默認或者不指定值。

mysql> insert into my_test.students
    -> values(0,'李明',default,22,'數學專業',null);
Query OK, 1 row affected (0.58 sec)

mysql> select * from students;
+------------+--------------+-------------+-------------+---------------+-----------------+
| student_id | student_name | student_sex | student_age | student_major | student_contact |
+------------+--------------+-------------+-------------+---------------+-----------------+
|          0 | 李明         | 1           |          22 | 數學專業      | NULL            |
|       1320 | 王麗         | 1           |          22 | 計算機專業    | 138xxxxxx       |
+------------+--------------+-------------+-------------+---------------+-----------------+
2 rows in set (0.00 sec)

通過分析,student_id列的值可不必在INSERT語句的列表清單中列出,由系統自動生成,同時允許NULL列也不必給出,因爲系統允許其值爲空。只需要給出student_name,student_sex,student_age和student_major列的值,執行如下語句也可以完成數據插入:

mysql> insert into my_test.students
    -> (student_name,student_sex,student_age,student_major)
    -> values('李明',default,22,'數學專業');
ERROR 1364 (HY000): Field 'student_id' doesn't have a default value

警告:按照書中的做法操作會報錯,因爲student_id爲主鍵,不允許爲NULL。

【例】使用INSERT…SET語句來實現上述例子中的數據插入需求。

mysql> insert into my_test.students
    -> set student_id=1321,student_name='李明',student_sex=default,student_age=22,student_major='數學專業';
Query OK, 1 row affected (0.19 sec)

mysql> select * from students;
+------------+--------------+-------------+-------------+---------------+-----------------+
| student_id | student_name | student_sex | student_age | student_major | student_contact |
+------------+--------------+-------------+-------------+---------------+-----------------+
|       1320 | 王麗         | 1           |          22 | 計算機專業    | 138xxxxxx       |
|       1321 | 李明         | 1           |          22 | 數學專業      | NULL            |
+------------+--------------+-------------+-------------+---------------+-----------------+
2 rows in set (0.00 sec)

採用INSERT…SET語句可以向表中插入部分列的值,這種方式更爲靈活。INSERT…VALUES語句可以一次插入多條數據,如下例。

【例】使用INSERT…VALUE語句,一次向 my_test 表 students 插入兩條數據,數據分別爲(1322,‘張三’,‘1’,24,‘化學專業’)和,1323,‘王五’,‘1’,23,‘數學專業’)。

mysql> insert into my_test.students
    -> (student_id,student_name,student_sex,student_age,student_major)
    -> values(1322,'張三','1',24,'化學專業'),
    -> (1323,'王五','1',23,'數學專業');
Query OK, 2 rows affected (0.58 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> select * from students;
+------------+--------------+-------------+-------------+---------------+-----------------+
| student_id | student_name | student_sex | student_age | student_major | student_contact |
+------------+--------------+-------------+-------------+---------------+-----------------+
|       1320 | 王麗         | 1           |          22 | 計算機專業    | 138xxxxxx       |
|       1321 | 李明         | 1           |          22 | 數學專業      | NULL            |
|       1322 | 張三         | 1           |          24 | 化學專業      | NULL            |
|       1323 | 王五         | 1           |          23 | 數學專業      | NULL            |
+------------+--------------+-------------+-------------+---------------+-----------------+
4 rows in set (0.02 sec)

在MySQL中,用單條INSERT語句處理多個插入要比使用多條INSERT語句更快。當使用單挑INSERT語句插入多行數據的時候,只需要將每行數據用圓括號括起來即可。
使用INSERT VALUES和INSERT SET語句可以向表中插入數據。INSERT SELECT語句也可以向表中插入數據。

【例】使用INSERT…VALUE語句,一次向 my_test 表 students 插入兩條數據,數據分別爲(1322,‘張三’,‘1’,24,‘化學專業’)和,1323,‘王五’,‘1’,23,‘數學專業’)。
我們先設置一個students_copy表,並輸入一條信息。

mysql> select * from students_copy;
+------------+--------------+-------------+-------------+---------------+-----------------+
| student_id | student_name | student_sex | student_age | student_major | student_contact |
+------------+--------------+-------------+-------------+---------------+-----------------+
|       1324 | 趙柳         | 1           |          20 | 英語專業      | NULL            |
+------------+--------------+-------------+-------------+---------------+-----------------+
1 row in set (0.00 sec)
mysql> insert into my_test.students
    -> (student_id,student_name,student_sex,student_age,student_major)
    -> select student_id,student_name,student_sex,student_age,student_major
    -> from my_test.students_copy;
Query OK, 1 row affected (0.60 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> select * from students;
+------------+--------------+-------------+-------------+---------------+-----------------+
| student_id | student_name | student_sex | student_age | student_major | student_contact |
+------------+--------------+-------------+-------------+---------------+-----------------+
|       1320 | 王麗         | 1           |          22 | 計算機專業    | 138xxxxxx       |
|       1321 | 李明         | 1           |          22 | 數學專業      | NULL            |
|       1322 | 張三         | 1           |          24 | 化學專業      | NULL            |
|       1323 | 王五         | 1           |          23 | 數學專業      | NULL            |
|       1324 | 趙柳         | 1           |          20 | 英語專業      | NULL            |
+------------+--------------+-------------+-------------+---------------+-----------------+
5 rows in set (0.00 sec)

說明:

  • SELECT語句用於從一個表中檢索出要插入的值,而非列出這些值。SELECT語句中列出的每個列對應於待插入表的每一列。如果SELECT語句檢索出的數據行數爲0,則表示沒有行會被插入到待插入表中,此時操作合法,不會報錯。
  • INSERT語句與SELECT語句中可使用相同的列名,也可以使用不同的列名,即要求列名完全匹配。MySQL不關心SELECT語句返回的列名,它使用的是列的位置,SELECT語句中的第一列用來填充待插入表中指定的第一個列,第二列用來填充待插入表中的第二個列,如此順序依次填充。
  • INSERT…SELECT語句中的SELECT子句可以包含WHERE等從句來過濾待插入的數據。
  • 對於student_id這類主鍵,當出現主鍵重複時,後續的INSERT操作會出錯。此時可以在INSERT…SELECT語句中省略這個列,讓該列的值在MySQL導入數據的過程中自動產生新值。

REPLACE語句
如果一個待插入的表存在有 PRIMARY KEY 或者 UNIQUE KEY,而待插入的數據行中包含有與待插入表中已有行的PRIMARY KEY或者UNIQUE KEY列值,換句話說,就是插入的數據主鍵和已有數據的主鍵重複,則INSERT語句無法插入此行。此時若需要插入此行數據,則可以使用REPLACE語句來實現。即REPLACE的功能是替換主鍵重複的行數據。
REPLACE語句有三種語法形式,分別爲:

REPLACE…VALUES語句;
REPLACE…SET語句;
REPLACE…SELECT語句。

REPLACE VALUES語法格式:

REPLACE INTO <表名> [<列名1>[,...<列名n>])] VALUES (1)[,(值n)]

【例】使用INSERT語句成功執行後,數據庫my_test表students中會存在這樣一條數據:(1320,‘王麗’,‘1’,22,‘計算機專業’,‘137xxxxxxxx’)。現在想該表中插入一條新數據:(1320,‘王芳’,‘1’,26,‘會計專業’,‘137xxxxxxxx’)。

mysql> insert into students
    -> values(1320,'王芳','1',26,'會計專業','137xxxxxxxx');
ERROR 1062 (23000): Duplicate entry '1320' for key 'students.PRIMARY'

從系統返回的結果可以看出,該語句不能成功執行,原因在於新插入的行數據的主鍵和原有數據的主鍵相同,都爲1320。此時如果仍然要插入該數據,可以使用REPLACE語句來替換原來的數據:

mysql> replace into students
    -> values(1320,'王芳','1',26,'會計專業','137xxxxxxxx');
Query OK, 2 rows affected (0.57 sec)

mysql> select * from students;
+------------+--------------+-------------+-------------+---------------+-----------------+
| student_id | student_name | student_sex | student_age | student_major | student_contact |
+------------+--------------+-------------+-------------+---------------+-----------------+
|       1320 | 王芳         | 1           |          26 | 會計專業      | 137xxxxxxxx     |
|       1321 | 李明         | 1           |          22 | 數學專業      | NULL            |
|       1322 | 張三         | 1           |          24 | 化學專業      | NULL            |
|       1323 | 王五         | 1           |          23 | 數學專業      | NULL            |
|       1324 | 趙柳         | 1           |          20 | 英語專業      | NULL            |
+------------+--------------+-------------+-------------+---------------+-----------------+
5 rows in set (0.00 sec)

4.2 刪除表數據

在MySQL中,可以使用DELETE語句或TRUNCATE TABLE語句來刪除表的一行或者多行數據。

使用DELETE語句從單個表中刪除數據
語法格式:

DELETE FROM <表名>[WHERE子句][ORDER BY子句][LIMIT子句]

語法說明:

  • <表名>:指定要刪除數據的表名
  • ORDER BY子句:可選項。表示刪除時,表中各行將按照子句中指定的順序進行刪除。
  • WHERE子句。可選項。表示爲刪除操作限定刪除條件;若省略該子句,則代表刪除該表中的所有行。
  • LIMIT子句:可選項。用於告知服務器在控制命令被返回到客戶端前被刪除行的最大值。

注意:在不適用WHERE條件的時候,將刪除所有數據。

【例】使用DELETE語句刪除數據庫表students中名字爲‘王芳’的學生信息。

mysql> delete from students
    -> where student_name='王芳';
Query OK, 1 row affected (0.66 sec)

mysql> select * from students;
+------------+--------------+-------------+-------------+---------------+-----------------+
| student_id | student_name | student_sex | student_age | student_major | student_contact |
+------------+--------------+-------------+-------------+---------------+-----------------+
|       1321 | 李明         | 1           |          22 | 數學專業      | NULL            |
|       1322 | 張三         | 1           |          24 | 化學專業      | NULL            |
|       1323 | 王五         | 1           |          23 | 數學專業      | NULL            |
|       1324 | 趙柳         | 1           |          20 | 英語專業      | NULL            |
+------------+--------------+-------------+-------------+---------------+-----------------+
4 rows in set (0.00 sec)

使用DELETE語句從多個表中刪除數據

語法格式:

DELETE <表名> FROM <1,表2...,表n>[WHERE子句];

語法說明:

  • 該命令刪除位於FROM子句之前的表中的數據行。
  • <表1,表2,…表n>:指定多個表的聯合。

【例】假設數據庫中有三個表tbl1、tbl2和tbl3,它們均含有id列,現在要求刪除表tbl1中id值的等於表tbl2的id值的所有行,以及表tbl2中id值等於表tbl3的id值的所有行。

DELETE tbl1,tbl2 FROM tbl1,tbl2,tbl3
WHERE tbl1.id=tbl2.id AND tbl2.id=tbl3.id;

使用TRUNCATE語句刪除表數據

如果要從表中刪除所有的行,可以使用TRUNCATE語句。TRUNCATE語句可以直接刪除指定表的所有數據,執行速度比DELETE語句更快。因爲TRUNCATE操作過程是先刪除原來的表,並再重新創建一個表,而不是逐行刪除表中的數據。因此,TRUNCATE語句又被稱爲清楚表數據語句。
語法格式:

TRUNCATE TABLE<表名>

語法說明:

  • 使用TRUNCATE後,表中的AUTO_INCRENMENT計數器將被置爲該列的初始值。對於參與了索引和視圖的表,不能使用TRUNCATE語句刪除數據,而應該使用DELETE語句。
  • TRUNCATE操作比DELETE操作佔用的系統和事務日誌資源更少,因爲DELETE每刪除一行就會在日誌中記錄一項,而TRUNCATE是通過釋放存儲表數據所用的數據頁來刪除數據的,因此只在日誌中記錄頁的釋放。
  • 由於TRUNCATE語句在功能上與不帶WHERE子句的DELETE語句相同,它將刪除表中的所有數據,且數據無法恢復,因此使用的過程要小心,在確認數據完全不需要的時候,再進行操作。

注意:在需要清空整個表中所有數據的情形下,採用TRUNCATE比採用DELETE更爲高效。

事務日誌:一個與數據庫文件分開的文件。它存儲對數據庫進行的所有更改,並全部記錄插入、更新、刪除、提交、回退和數據庫模式變化。

4.3 修改表數據

在MySQL中,可以使用UPDATE語句來修改、更新一個或多個表的數據。

使用UPDATE語句修改單個表

語法格式:

UPDATE <表名> SET 字段1=1 [,字段2=2...][WHERE子句][ORDER BY子句][LIMIT子句]

語法說明:

  • <表名>:用於指定要更新的表名稱。
  • SET子句:用於指定表中藥修改的列名及其列值。其中,每個指定的列值可以是表達式,也可以是該列對應的默認值。如果指定的是默認值,可用關鍵字DEFAULT表示列值。
  • WHERE子句:可選項。用於限定表中要修改的行。不指定則修改表中所有的行。
  • ORDER BY子句:可選項。用於限定表中的行被修改的次序。
  • LIMIT子句:可選項。用於限定被修改的行數。

【例】使用UPDATE語句將數據庫 my_test 的表 students 中姓名爲‘張三’的學生的聯繫方式改爲‘139xxxxxxxx’。

mysql> update my_test.students
    -> set student_contact='139xxxxxxxx'
    -> where student_name='張三';
Query OK, 1 row affected (0.60 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from students;
+------------+--------------+-------------+-------------+---------------+-----------------+
| student_id | student_name | student_sex | student_age | student_major | student_contact |
+------------+--------------+-------------+-------------+---------------+-----------------+
|       1321 | 李明         | 1           |          22 | 數學專業      | NULL            |
|       1322 | 張三         | 1           |          24 | 化學專業      | 139xxxxxxxx     |
|       1323 | 王五         | 1           |          23 | 數學專業      | NULL            |
|       1324 | 趙柳         | 1           |          20 | 英語專業      | NULL            |
+------------+--------------+

【例】使用UPDATE語句將數據庫 my_test 的表 students 中姓名爲‘趙柳’的學生的年齡修改爲23,將專業修改爲‘物理專業’。

mysql> update my_test.students
    -> set student_age=23,student_major='物理專業'
    -> where student_name='趙柳';
Query OK, 1 row affected (0.55 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from students;
+------------+--------------+-------------+-------------+---------------+-----------------+
| student_id | student_name | student_sex | student_age | student_major | student_contact |
+------------+--------------+-------------+-------------+---------------+-----------------+
|       1321 | 李明         | 1           |          22 | 數學專業      | NULL            |
|       1322 | 張三         | 1           |          24 | 化學專業      | 139xxxxxxxx     |
|       1323 | 王五         | 1           |          23 | 數學專業      | NULL            |
|       1324 | 趙柳         | 1           |          23 | 物理專業      | NULL            |
+------------+--------------+-------------+-------------+---------------+-----------------+
4 rows in set (0.00 sec)

修改一行數據的多個列值,SET子句每個值用逗號分開即可。

使用UPDATE語句修改多個表

語法格式:

UPDATE<1,2,...>SET列名=1[,列名2=2,...][WHERE子句];

語法說明:

  • 對於多個表的修改,UPDATE語句會同時修改<表1,表2,…>中滿足限定條件的每個表。注意,在這種修改中不能使用ORDER BY 和 LIMIT 子句。
  • <表1,表2,…>:用於指定多個表的聯合,各表之間可用逗號分隔。

【例】假設數據庫中有兩個表tbl1和tbl2,它們都有兩個名爲id和name列,其中id列爲各自的主鍵,現在要求當表tbl1和表tbl2中的id值相同時,將表tbl1中name列的值修改爲“李明”,將表tbl2中name列的值修改爲“王偉”。

update tbl1,tbl2
set tbl1.name='李明',tbl2.name='王偉'
where tbl1.id=tbl2.id
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章