首頁 > 軟體

MySQL表的CURD操作(資料的增刪改查)

2023-11-02 06:00:18

一、SQL語句

操作關係型資料庫的程式語言,定義了一套操作關係型資料庫的統一標準,簡稱SQL。

- SQL通用語法

1 . SQL語句可以單行或多行書寫,以分號結尾。

2 . SQL語句可以使用空格/縮排來增強語句的可讀性。

​ 3 . MySQL資料庫的SQL語句不區分大小寫,關鍵字建議使用大寫。

- 註釋

  • 單行註釋: – 註釋內容 或者使用 # 註釋內容 。
  • 多行註釋:/* 註釋內容 */

- SQL語句分類

分類說明
DDL(deifnition)資料定義語言(用來定義資料庫物件,資料庫,表,欄位)
DML(manipulation)資料操縱語言(對資料庫 表中的是資料進行增刪改)
DQL(query)資料查詢語言,用來查詢資料庫中表的記錄
DCL(control)資料控制語言,用來建立資料庫使用者,控制資料庫的存取許可權

二、 基礎表操作

- 建立表

同一個資料庫中,不能有兩個表的名字相同,表名和列名不能和SQL的關鍵詞重複。

語法:

create table 表名(定義列1, 定義列2, .......);
列 -> 變數名 資料型別

舉例:

mysql> create table if not exists book(
    ->   book_name varchar(32) comment '圖書名稱',
    ->   book_author varchar(32)comment  '圖書作者' ,
    ->   book_price decimal(12,2) comment '圖書價格',
    ->   book_category varchar(12) comment '圖書分類',
    ->   publish_data timestamp
    -> )character set utf8mb4;
    
Query OK, 0 rows affected (0.04 sec)

- 檢視庫中的表

語法:

show tables;

舉例:

mysql> show tables;
+--------------------+
| Tables_in_mytestdb |
+--------------------+
| book               |
+--------------------+
1 row in set (0.00 sec)

- 檢視表結構

語法:

desc  表名;

舉例:

MySQL資料庫中的表結構主要包含以下幾種資訊: 欄位名稱,欄位型別,是否允許為空,索引型別。預設值,擴充資訊

- 刪除表

語法:

drop table 表名

舉例 :

mysql> desc test1;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| name  | varchar(10) | YES  |     | NULL    |       |
| age   | int(11)     | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.02 sec)

mysql> drop table test1;
Query OK, 0 rows affected (0.04 sec)

mysql> desc test1;
ERROR 1146 (42S02): Table 'mytestdb.test1' doesn't exist

- 重新命名錶

語法:

rename table old_name to new_name;

舉例:

mysql> rename table book to eBook;
Query OK, 0 rows affected (0.05 sec)

mysql> show tables;
+--------------------+
| Tables_in_mytestdb |
+--------------------+
| ebook              |
+--------------------+
1 row in set (0.00 sec)

三、MySQL 中的增刪查改操作

CRUD 即增加(Create)、查詢(Retrieve)、更新(Update)、刪除(Delete)四個單詞的首字母縮寫

案例:

-- 建立一張圖書表
mysql> create table if not exists book(
    ->   book_name varchar(32) comment '圖書名稱',
    ->   book_author varchar(32)comment  '圖書作者' ,
    ->   book_price decimal(12,2) comment '圖書價格',
    ->   book_category varchar(12) comment '圖書分類',
    ->   publish_data timestamp
    -> )character set utf8mb4;

- 增加(insert語句)

單行插入(全列)

insert into 表名 values(對應列的參數列); 
-- 一次插入一行

多行插入(全列)

insert into 表名 values(對應列的實參列表), (對應列的參數列), (對應列的參數列);              
-- 一次插入多行

指定列插入

values 後面( )中的內容, 個數和型別要和表名後面( )中指定的結構匹配.
未被指定的列會以預設值進行填充.
insert into 表名 (需要插入的列) values(對應列的參數列); 
-- 一次插入一行
insert into 表名 (需要插入的列) values(對應列的參數列), (), ().... 
-- 一次插入多行

案例

# 單行輸入

mysql> 
insert into book values('計算機網路','謝希仁',45,'計算機類','2020-12-25 12:51:00');
Query OK, 1 row affected (0.01 sec)

#多行輸入

mysql> 
insert into book values('計算機組成原理','王峰',45,'硬體類','2020-12-12 12:00:00'),
    -> ('微機原理','李華',97,'硬體類','2000-12-19 20:00:00');
    
Query OK, 2 rows affected (0.04 sec)
Records: 2  Duplicates: 0  Warnings: 0

#指定列插入

mysql>
insert into book(book_name,book_author,publish_data) values ('軟體工程','張三','2020-05-06 12:00:00');
Query OK, 1 row affected (0.02 sec)

插入資料後的表如圖所示:

在MySQL當中 , 多條記錄逐次插入的效率是要低於一次把多條紀錄一起插入的 ,原因如下:

  • 網路請求和響應時間開銷 , 每次插入都會有一定的時間開銷.
  • 資料庫伺服器是把資料儲存在硬碟上的 , IO操作時,操作的次數帶來的影響大於資料量.
  • 每一次sql操作,內部開啟的事務也會佔據一定的開銷.

- 查詢(select語句)

全列查詢

語法

select * from 表名

--  * 表示萬用字元, 可以匹配表中的所有列.

企業級別的資料庫中慎用, 容易把I/O或者網路頻寬吃滿,如果有外邊的使用者使用者端要通過寬頻存取伺服器時,伺服器就無法做出正確的響應.

範例

select * from book;

指定列查詢

select 列名...  from  表名

範例

)mysql> select book_name from book;
+----------------+
| book_name      |
+----------------+
| 計算機網路     |
| 計算機組成原理 |
| 微機原理       |
| 軟體工程       |
+----------------+
4 rows in set (0.01 sec)

mysql> select book_author,book_price from book;
+-------------+------------+
| book_author | book_price |
+-------------+------------+
| 謝希仁      |      45.00 |
| 王峰        |      45.00 |
| 李華        |      97.00 |
| 張三        |       NULL |
+-------------+------------+
4 rows in set (0.00 sec)                  

查詢你欄位為表示式

select 欄位或表示式, 欄位或表示式... from 表名;

範例

-- 查詢圖書漲價10元后所有圖書的名稱作者和價格
mysql> select book_name ,book_author,book_price + 10 from book;
+----------------+-------------+-----------------+
| book_name      | book_author | book_price + 10 |
+----------------+-------------+-----------------+
| 計算機網路     | 謝希仁      |           55.00 |
| 計算機組成原理 | 王峰        |           55.00 |
| 微機原理       | 李華        |          107.00 |
| 軟體工程       | 張三        |            NULL |
+----------------+-------------+-----------------+
4 rows in set (0.00 sec)

將表示式或者欄位指定別名查詢

mysql中支援給所查詢的表示式取一個別名 , 使用 as 可以使查詢結果更加直觀 , 程式碼的可讀性也會更強.

select 列名或表示式 as 別名, ... from 表名;

範例

-- 將漲價20元后的圖書價格取為別名newprice
mysql> select book_name,book_author,book_price + 20 as newprice from book;
+----------------+-------------+----------+
| book_name      | book_author | newprice |
+----------------+-------------+----------+
| 計算機網路     | 謝希仁      |    65.00 |
| 計算機組成原理 | 王峰        |    65.00 |
| 微機原理       | 李華        |   117.00 |
| 軟體工程       | 張三        |     NULL |
+----------------+-------------+----------+
4 rows in set (0.00 sec)

去重查詢

select distinct 列名 from 表名

範例

--book 表中插入一條重複的book_name資料

mysql> insert into book values('計算機網路','張華',89,'計算機類','2020-11-23 11:00:00');
Query OK, 1 row affected (0.00 sec)

mysql> select book_name from book;
+----------------+
| book_name      |
+----------------+
| 計算機網路     |
| 計算機組成原理 |
| 微機原理       |
| 軟體工程       |
| 計算機網路     |
+----------------+
5 rows in set (0.00 sec)

mysql> select distinct book_name from book;
+----------------+
| book_name      |
+----------------+
| 計算機網路     |
| 計算機組成原理 |
| 微機原理       |
| 軟體工程       |
+----------------+
4 rows in set (0.00 sec)

查詢結果當中,沒有了重複的book _ name 元素,達到了去重效果.

排序查詢

select 列名 
from 表名 
order by 列名 asc(升序)/desc(降序); 
#  想要排序的列

範例

# 按照書的價格升序進行排列
mysql> select book_name,book_price from book order by book_price asc;
+----------------+------------+
| book_name      | book_price |
+----------------+------------+
| 軟體工程       |       NULL |
| 計算機網路     |      45.00 |
| 計算機組成原理 |      45.00 |
| 計算機網路     |      89.00 |
| 微機原理       |      97.00 |
+----------------+------------+
5 rows in set (0.00 sec)

#按照書的價格降序進行排列
mysql> select book_name,book_price from book order by book_price desc;
+----------------+------------+
| book_name      | book_price |
+----------------+------------+
| 微機原理       |      97.00 |
| 計算機網路     |      89.00 |
| 計算機網路     |      45.00 |
| 計算機組成原理 |      45.00 |
| 軟體工程       |       NULL |
+----------------+------------+
5 rows in set (0.00 sec)
  • 使用排序查詢時 , 升序查詢 asc 可以省略, 即預設為升序排列, null值一定為其中最小的.
  • 可以對多個欄位進行排序,優先順序按照書寫的順序進行.

範例

# 查詢按照價格升序 ,年份降序
select name,price,age from book order by price asc,age desc;
#查詢按照總成績進行降序
select name,english+math+chinese as total from grade order by total desc;

條件查詢

當我們使用查詢時, 通常具有各種各樣的前提條件 , 此時就需要使用條件查詢來完成.

select 列名.. from 表名..where + 條件

比較運運算元

運運算元說明
>, >=, <, <=大於,大於等於,小於,小於等於
=等於,null 不安全,例如 null = null 的結果是 null(false)
<=>等於,null 安全,例如 null <=> null 的結果是 true(1)
!=, <>不等於
between a0 and a1範圍匹配,[a0, a1],如果 a0 <= value <= a1,返回 true(1)
in (option, …)如果是 option 中的任意一個,返回 true(1)
is null是 null
is not null不是 null
like模糊匹配; % 表示任意多個(包括 0 個)任意字元;_ 表示任意一個字元

邏輯運運算元

運運算元說明
and多個條件必須為 true , 結果才為true
or任意一個條件為true 結果才為true
not條件為true , 結果為false

WHERE條件可以使用表示式,但不能使用別名。

AND的優先順序高於OR,在同時使用時,需要使用小括號()包裹優先執行的部分

案例

-- 查詢圖書價格低於50的圖書作者和圖書名稱
mysql> select book_name,book_author from book where book_price < 50;
+----------------+-------------+
| book_name      | book_author |
+----------------+-------------+
| 計算機網路     | 謝希仁      |
| 計算機組成原理 | 王峰        |
+----------------+-------------+
2 rows in set (0.05 sec)  
-- 查詢圖書價格等於97的圖書作者
mysql> select book_name ,book_author from book where book_price = 97;
+-----------+-------------+
| book_name | book_author |
+-----------+-------------+
| 微機原理  | 李華        |
+-----------+-------------+
1 row in set (0.00 sec)
-- 查詢圖書價格在50 - 100 之間的圖書名稱
mysql> select book_name from book where book_price between 50 and 100;
+------------+
| book_name  |
+------------+
| 微機原理   |
| 計算機網路 |
+------------+
2 rows in set (0.02 sec)
-- 查詢圖書價格在此範圍內的圖書名稱
mysql> select book_name from book where book_price in (12,45);
+----------------+
| book_name      |
+----------------+
| 計算機網路     |
| 計算機組成原理 |
+----------------+
2 rows in set (0.00 sec)

模糊查詢

  • % 匹配任意多個(包括 0 個)字元
  • _ 匹配嚴格的一個字元
#查詢姓張的作者的書本價格書名.
mysql> select book_price,book_name,book_author from book where book_author like '張%';

+------------+------------+-------------+
| book_price | book_name  | book_author |
+------------+------------+-------------+
|       NULL | 軟體工程   | 張三        |
|      89.00 | 計算機網路 | 張華        |
+------------+------------+-------------+
2 rows in set (0.00 sec)
# 查詢字首為'計算機'字尾為七個字的書籍名稱
mysql> select book_name from book where book_name like '計算機____';
+----------------+
| book_name      |
+----------------+
| 計算機組成原理 |
+----------------+
#查詢字首為'計算機'的書籍名稱並去重
mysql> select distinct book_name from book where book_name like '計算機%';
+----------------+
| book_name      |
+----------------+
| 計算機網路     |
| 計算機組成原理 |
+----------------+
2 rows in set (0.00 sec)

分頁查詢

分頁查詢即將查詢出的結果 , 按頁進行呈現,並不是一次性展現出來,這種模式就是分頁查詢, mysql當中使用limit來實現分頁查詢.

  • limit 子句當中接受一個或者兩個引數 , 這兩個引數的值為0 或者正整數

兩個引數的limit子句的用法

select 元素1,元素2  from 表名  limit offset,count;

#offset引數指定要返回的第一行的偏移量。第一行的偏移量為0,而不是1。
#count指定要返回的最大行數。

範例:

mysql> select book_author from book limit 2, 3;
+-------------+
| book_author |
+-------------+
| 李華        |
| 張三        |
| 張華        |
+-------------+
3 rows in set (0.02 sec)

#表示獲取列表當中偏移量為2(表示從第3行開始), 最大行數為3的作者名稱

帶有一個引數的limit子句的用法

select 列名1.列名2 from 表名 limit count;
#  表示從結果集的開頭返回的最大行數為count;
#  獲取前count行的記錄

等同於

select 列名1 ,列名2 from 表名 limit 0 , count;
# 第一行的偏移量為0

範例

mysql> select book_price from book limit 5;
+------------+
| book_price |
+------------+
|      45.00 |
|      45.00 |
|      97.00 |
|       NULL |
|      89.00 |
+------------+
5 rows in set (0.00 sec)

# 獲取表中前五行的圖書價格 , 最大行數為5

limit 結合 order by 語句 和其他條件可以獲取n個最大或者最小值

select book_name,book_price from book order by book_price desc limit 3; 
#獲取價格前三高的圖書名稱和圖書價格
mysql> select book_price,book_name from book order by book_price desc limit 3;
+------------+------------+
| book_price | book_name  |
+------------+------------+
|      97.00 | 微機原理   |
|      89.00 | 計算機網路 |
|      45.00 | 計算機網路 |
+------------+------------+
3 rows in set (0.01 sec)

使用limit 獲取第n高個最大值

偏移量從0開始,所以要指定從n - 1 開始,然後取一行記錄

#範例:獲取價格第二高的圖書名稱
 mysql> select book_name from book order by book_price desc limit 1,1;
+------------+
| book_name  |
+------------+
| 計算機網路 |
+------------+
1 row in set (0.00 sec)

- 修改(update)

MySQL當中使用update關鍵字來對資料進行修改 , 既可以修改單列又可以修改多列.

update 表名 set 列名1 = 值 , 列名2 = 值 ... where 限制條件下修改

SET子句指定要修改的列和新值。要更新多個列,請使用以逗號分隔的列表。以字面值,表示式或子查詢的形式在每列的賦值中來提供要設定的值。
第三,使用WHERE子句中的條件指定要更新的行。WHERE子句是可選的。 如果省略WHERE子句,則UPDATE語句將更新表中的所有行。

範例:

#將書名為'軟體工程'的圖書價格修改為66元
mysql> update book set book_price = 66 where book_name = '軟體工程';
Query OK, 1 row affected (0.05 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select book_price from book where book_name = '軟體工程';
+------------
| book_price |
+------------+
|      66.00 |
+------------+
1 row in set (0.00 sec)

#將所有的圖書價格修改為原來的二倍
mysql> update book set book_price = 2 * book_price;
Query OK, 5 rows affected (0.02 sec)
Rows matched: 5  Changed: 5  Warnings: 0
#更新成功
mysql> select book_price from book;
+------------+
| book_price |
+------------+
|      90.00 |
|      90.00 |
|     194.00 |
|     132.00 |
|     178.00 |
+------------+
5 rows in set (0.00 sec)

- 刪除(delete)

要從表中刪除資料,需要使用delete 語句, delete 語句的 用法如下

delete from 表名 where + 條件

首先指定需要刪除資料的表,其次使用條件指定where子句中刪除的行記錄, 如果行匹配條件,這些行記錄將會刪除.

WHERE子句是可選的。如果省略WHERE子句,DELETE語句將刪除表中的所有行 , 請注意,一旦刪除資料,它就會永遠消失。因此,在執行DELETE語句之前,應該先備份資料庫,以防萬一要找回刪除過的資料。

範例

#刪除圖書表中圖書單價大於150的圖書記錄
mysql> delete from book where book_price > 150;
Query OK, 2 rows affected (0.01 sec)

mysql> select book_price from book;
+------------+
| book_price |
+------------+
|      90.00 |
|      90.00 |
|     132.00 |
+------------+
3 rows in set (0.00 sec)

MySQL中delete 語句也可以結合limit語句 和 order by 語句來控制刪除的數量和條件

總結 

到此這篇關於MySQL表的CURD操作的文章就介紹到這了,更多相關MySQL表CURD操作內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com