本篇文章帶大家詳細(xì)了解MySQL表的CURD操作,希望對(duì)大家有所幫助!
一、SQL語句
操作關(guān)系型數(shù)據(jù)庫的編程語言,定義了一套操作關(guān)系型數(shù)據(jù)庫的統(tǒng)一標(biāo)準(zhǔn),簡(jiǎn)稱SQL。
– SQL通用語法
1 . SQL語句可以單行或多行書寫,以分號(hào)結(jié)尾。
2 . SQL語句可以使用空格/縮進(jìn)來增強(qiáng)語句的可讀性。
3 . MySQL數(shù)據(jù)庫的SQL語句不區(qū)分大小寫,關(guān)鍵字建議使用大寫。
– 注釋
- 單行注釋: – 注釋內(nèi)容 或者使用 # 注釋內(nèi)容 。
- 多行注釋:/* 注釋內(nèi)容 */
– SQL語句分類
分類 | 說明 |
---|---|
DDL(deifnition) | 數(shù)據(jù)定義語言(用來定義數(shù)據(jù)庫對(duì)象,數(shù)據(jù)庫,表,字段) |
DML(manipulation) | 數(shù)據(jù)操縱語言(對(duì)數(shù)據(jù)庫 表中的是數(shù)據(jù)進(jìn)行增刪改) |
DQL(query) | 數(shù)據(jù)查詢語言,用來查詢數(shù)據(jù)庫中表的記錄 |
DCL(control) | 數(shù)據(jù)控制語言,用來創(chuàng)建數(shù)據(jù)庫用戶,控制數(shù)據(jù)庫的訪問權(quán)限 |
二、 基礎(chǔ)表操作
– 創(chuàng)建表
-
同一個(gè)數(shù)據(jù)庫中,不能有兩個(gè)表的名字相同,表名和列名不能和SQL的關(guān)鍵詞重復(fù)。
-
語法:
create table 表名(定義列1, 定義列2, .......); 列 -> 變量名 數(shù)據(jù)類型
- 舉例:
mysql> create table if not exists book( -> book_name varchar(32) comment '圖書名稱', -> book_author varchar(32)comment '圖書作者' , -> book_price decimal(12,2) comment '圖書價(jià)格', -> book_category varchar(12) comment '圖書分類', -> publish_data timestamp -> )character set utf8mb4; Query OK, 0 rows affected (0.04 sec)
– 查看庫中的表
-
語法:
show tables;
登錄后復(fù)制 -
舉例:
mysql> show tables; +--------------------+ | Tables_in_mytestdb | +--------------------+ | book | +--------------------+ 1 row in set (0.00 sec)
登錄后復(fù)制
– 查看表結(jié)構(gòu)
-
語法:
desc 表名;
登錄后復(fù)制 -
舉例:
MySQL數(shù)據(jù)庫中的表結(jié)構(gòu)主要包含以下幾種信息: 字段名稱,字段類型,是否允許為空,索引類型。默認(rèn)值,擴(kuò)充信息
– 刪除表
- 語法:
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;
登錄后復(fù)制 -
舉例:
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)
登錄后復(fù)制
三、MySQL 中的增刪查改操作
CRUD 即增加(Create)、查詢(Retrieve)、更新(Update)、刪除(Delete)四個(gè)單詞的首字母縮寫
案例:
-- 創(chuàng)建一張圖書表 mysql> create table if not exists book( -> book_name varchar(32) comment '圖書名稱', -> book_author varchar(32)comment '圖書作者' , -> book_price decimal(12,2) comment '圖書價(jià)格', -> book_category varchar(12) comment '圖書分類', -> publish_data timestamp -> )character set utf8mb4;
– 增加(insert語句)
-
單行插入(全列)
insert into 表名 values(對(duì)應(yīng)列的參數(shù)列表); -- 一次插入一行
登錄后復(fù)制 -
多行插入(全列)
insert into 表名 values(對(duì)應(yīng)列的實(shí)參列表), (對(duì)應(yīng)列的參數(shù)列表), (對(duì)應(yīng)列的參數(shù)列表); -- 一次插入多行 -- 一次插入多行
登錄后復(fù)制 -
指定列插入
- values 后面( )中的內(nèi)容, 個(gè)數(shù)和類型要和表名后面( )中指定的結(jié)構(gòu)匹配.
- 未被指定的列會(huì)以默認(rèn)值進(jìn)行填充.
insert into 表名 (需要插入的列) values(對(duì)應(yīng)列的參數(shù)列表); -- 一次插入一行 insert into 表名 (需要插入的列) values(對(duì)應(yīng)列的參數(shù)列表), (), ().... -- 一次插入多行
登錄后復(fù)制 -
案例
# 單行輸入 mysql> insert into book values('計(jì)算機(jī)網(wǎng)絡(luò)','謝希仁',45,'計(jì)算機(jī)類','2020-12-25 12:51:00'); Query OK, 1 row affected (0.01 sec) #多行輸入 mysql> insert into book values('計(jì)算機(jī)組成原理','王峰',45,'硬件類','2020-12-12 12:00:00'), -> ('微機(jī)原理','李華',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)
登錄后復(fù)制 -
插入數(shù)據(jù)后的表如圖所示:
在MySQL當(dāng)中 , 多條記錄逐次插入的效率是要低于一次把多條紀(jì)錄一起插入的 ,原因如下:
- 網(wǎng)絡(luò)請(qǐng)求和響應(yīng)時(shí)間開銷 , 每次插入都會(huì)有一定的時(shí)間開銷.
- 數(shù)據(jù)庫服務(wù)器是把數(shù)據(jù)保存在硬盤上的 , IO操作時(shí),操作的次數(shù)帶來的影響大于數(shù)據(jù)量.
- 每一次sql操作,內(nèi)部開啟的事務(wù)也會(huì)占據(jù)一定的開銷.
– 查詢(select語句)
- 全列查詢
語法
select * from 表名 -- * 表示通配符, 可以匹配表中的所有列.
企業(yè)級(jí)別的數(shù)據(jù)庫中慎用, 容易把I/O或者網(wǎng)絡(luò)帶寬吃滿,如果有外邊的用戶客戶端要通過寬帶訪問服務(wù)器時(shí),服務(wù)器就無法做出正確的響應(yīng).
示例
select * from book;
- 指定列查詢
select 列名... from 表名
- 示例
mysql> select book_name from book; +----------------+ | book_name | +----------------+ | 計(jì)算機(jī)網(wǎng)絡(luò) | | 計(jì)算機(jī)組成原理 | | 微機(jī)原理 | | 軟件工程 | +----------------+ 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)
- 查詢你字段為表達(dá)式
select 字段或表達(dá)式, 字段或表達(dá)式... from 表名;
- 示例
-- 查詢圖書漲價(jià)10元后所有圖書的名稱作者和價(jià)格 mysql> select book_name ,book_author,book_price + 10 from book; +----------------+-------------+-----------------+ | book_name | book_author | book_price + 10 | +----------------+-------------+-----------------+ | 計(jì)算機(jī)網(wǎng)絡(luò) | 謝希仁 | 55.00 | | 計(jì)算機(jī)組成原理 | 王峰 | 55.00 | | 微機(jī)原理 | 李華 | 107.00 | | 軟件工程 | 張三 | NULL | +----------------+-------------+-----------------+ 4 rows in set (0.00 sec)
- 將表達(dá)式或者字段指定別名查詢
mysql中支持給所查詢的表達(dá)式取一個(gè)別名 , 使用 as 可以使查詢結(jié)果更加直觀 , 代碼的可讀性也會(huì)更強(qiáng).
select 列名或表達(dá)式 as 別名, ... from 表名;
- 示例
-- 將漲價(jià)20元后的圖書價(jià)格取為別名newprice mysql> select book_name,book_author,book_price + 20 as newprice from book; +----------------+-------------+----------+ | book_name | book_author | newprice | +----------------+-------------+----------+ | 計(jì)算機(jī)網(wǎng)絡(luò) | 謝希仁 | 65.00 | | 計(jì)算機(jī)組成原理 | 王峰 | 65.00 | | 微機(jī)原理 | 李華 | 117.00 | | 軟件工程 | 張三 | NULL | +----------------+-------------+----------+ 4 rows in set (0.00 sec)
- 去重查詢
select distinct 列名 from 表名
- 示例
--book 表中插入一條重復(fù)的book_name數(shù)據(jù) mysql> insert into book values('計(jì)算機(jī)網(wǎng)絡(luò)','張華',89,'計(jì)算機(jī)類','2020-11-23 11:00:00'); Query OK, 1 row affected (0.00 sec) mysql> select book_name from book; +----------------+ | book_name | +----------------+ | 計(jì)算機(jī)網(wǎng)絡(luò) | | 計(jì)算機(jī)組成原理 | | 微機(jī)原理 | | 軟件工程 | | 計(jì)算機(jī)網(wǎng)絡(luò) | +----------------+ 5 rows in set (0.00 sec) mysql> select distinct book_name from book; +----------------+ | book_name | +----------------+ | 計(jì)算機(jī)網(wǎng)絡(luò) | | 計(jì)算機(jī)組成原理 | | 微機(jī)原理 | | 軟件工程 | +----------------+ 4 rows in set (0.00 sec)
查詢結(jié)果當(dāng)中,沒有了重復(fù)的book _ name 元素,達(dá)到了去重效果.
- 排序查詢
select 列名 from 表名 order by 列名 asc(升序)/desc(降序); # 想要排序的列
- 示例
# 按照書的價(jià)格升序進(jìn)行排列 mysql> select book_name,book_price from book order by book_price asc; +----------------+------------+ | book_name | book_price | +----------------+------------+ | 軟件工程 | NULL | | 計(jì)算機(jī)網(wǎng)絡(luò) | 45.00 | | 計(jì)算機(jī)組成原理 | 45.00 | | 計(jì)算機(jī)網(wǎng)絡(luò) | 89.00 | | 微機(jī)原理 | 97.00 | +----------------+------------+ 5 rows in set (0.00 sec) #按照書的價(jià)格降序進(jìn)行排列 mysql> select book_name,book_price from book order by book_price desc; +----------------+------------+ | book_name | book_price | +----------------+------------+ | 微機(jī)原理 | 97.00 | | 計(jì)算機(jī)網(wǎng)絡(luò) | 89.00 | | 計(jì)算機(jī)網(wǎng)絡(luò) | 45.00 | | 計(jì)算機(jī)組成原理 | 45.00 | | 軟件工程 | NULL | +----------------+------------+ 5 rows in set (0.00 sec)
- 使用排序查詢時(shí) , 升序查詢 asc 可以省略, 即默認(rèn)為升序排列, null值一定為其中最小的.
- 可以對(duì)多個(gè)字段進(jìn)行排序,優(yōu)先級(jí)按照書寫的順序進(jìn)行.
- 示例
# 查詢按照價(jià)格升序 ,年份降序 select name,price,age from book order by price asc,age desc; #查詢按照總成績(jī)進(jìn)行降序 select name,english+math+chinese as total from grade order by total desc;
- 條件查詢
當(dāng)我們使用查詢時(shí), 通常具有各種各樣的前提條件 , 此時(shí)就需要使用條件查詢來完成.
select 列名.. from 表名..where + 條件
比較運(yùn)算符
運(yùn)算符 | 說明 |
---|---|
>, >=, <, <= | 大于,大于等于,小于,小于等于 |
= | 等于,null 不安全,例如 null = null 的結(jié)果是 null(false) |
<=> | 等于,null 安全,例如 null <=> null 的結(jié)果是 true(1) |
!=, <> | 不等于 |
between a0 and a1 | 范圍匹配,[a0, a1],如果 a0 <= value <= a1,返回 true(1) |
in (option, …) | 如果是 option 中的任意一個(gè),返回 true(1) |
is null | 是 null |
is not null | 不是 null |
like | 模糊匹配; % 表示任意多個(gè)(包括 0 個(gè))任意字符;_ 表示任意一個(gè)字符 |
邏輯運(yùn)算符
運(yùn)算符 | 說明 |
---|---|
and | 多個(gè)條件必須為 true , 結(jié)果才為true |
or | 任意一個(gè)條件為true 結(jié)果才為true |
not | 條件為true , 結(jié)果為false |
注:
WHERE條件可以使用表達(dá)式,但不能使用別名。
AND的優(yōu)先級(jí)高于OR,在同時(shí)使用時(shí),需要使用小括號(hào)()包裹優(yōu)先執(zhí)行的部分
- 案例
-- 查詢圖書價(jià)格低于50的圖書作者和圖書名稱 mysql> select book_name,book_author from book where book_price < 50; +----------------+-------------+ | book_name | book_author | +----------------+-------------+ | 計(jì)算機(jī)網(wǎng)絡(luò) | 謝希仁 | | 計(jì)算機(jī)組成原理 | 王峰 | +----------------+-------------+ 2 rows in set (0.05 sec) -- 查詢圖書價(jià)格等于97的圖書作者 mysql> select book_name ,book_author from book where book_price = 97; +-----------+-------------+ | book_name | book_author | +-----------+-------------+ | 微機(jī)原理 | 李華 | +-----------+-------------+ 1 row in set (0.00 sec) -- 查詢圖書價(jià)格在50 - 100 之間的圖書名稱 mysql> select book_name from book where book_price between 50 and 100; +------------+ | book_name | +------------+ | 微機(jī)原理 | | 計(jì)算機(jī)網(wǎng)絡(luò) | +------------+ 2 rows in set (0.02 sec) -- 查詢圖書價(jià)格在此范圍內(nèi)的圖書名稱 mysql> select book_name from book where book_price in (12,45); +----------------+ | book_name | +----------------+ | 計(jì)算機(jī)網(wǎng)絡(luò) | | 計(jì)算機(jī)組成原理 | +----------------+ 2 rows in set (0.00 sec)
模糊查詢
- % 匹配任意多個(gè)(包括 0 個(gè))字符
- _ 匹配嚴(yán)格的一個(gè)字符
#查詢姓張的作者的書本價(jià)格書名. mysql> select book_price,book_name,book_author from book where book_author like '張%'; +------------+------------+-------------+ | book_price | book_name | book_author | +------------+------------+-------------+ | NULL | 軟件工程 | 張三 | | 89.00 | 計(jì)算機(jī)網(wǎng)絡(luò) | 張華 | +------------+------------+-------------+ 2 rows in set (0.00 sec) # 查詢前綴為'計(jì)算機(jī)'后綴為七個(gè)字的書籍名稱 mysql> select book_name from book where book_name like '計(jì)算機(jī)____'; +----------------+ | book_name | +----------------+ | 計(jì)算機(jī)組成原理 | +----------------+ #查詢前綴為'計(jì)算機(jī)'的書籍名稱并去重 mysql> select distinct book_name from book where book_name like '計(jì)算機(jī)%'; +----------------+ | book_name | +----------------+ | 計(jì)算機(jī)網(wǎng)絡(luò) | | 計(jì)算機(jī)組成原理 | +----------------+ 2 rows in set (0.00 sec)
- 分頁查詢
分頁查詢即將查詢出的結(jié)果 , 按頁進(jìn)行呈現(xiàn),并不是一次性展現(xiàn)出來,這種模式就是分頁查詢, mysql當(dāng)中使用limit來實(shí)現(xiàn)分頁查詢.
- limit 子句當(dāng)中接受一個(gè)或者兩個(gè)參數(shù) , 這兩個(gè)參數(shù)的值為0 或者正整數(shù)
兩個(gè)參數(shù)的limit子句的用法
select 元素1,元素2 from 表名 limit offset,count; #offset參數(shù)指定要返回的第一行的偏移量。第一行的偏移量為0,而不是1。 #count指定要返回的最大行數(shù)。
示例:
mysql> select book_author from book limit 2, 3; +-------------+ | book_author | +-------------+ | 李華 | | 張三 | | 張華 | +-------------+ 3 rows in set (0.02 sec) #表示獲取列表當(dāng)中偏移量為2(表示從第3行開始), 最大行數(shù)為3的作者名稱
帶有一個(gè)參數(shù)的limit子句的用法
select 列名1.列名2 from 表名 limit count; # 表示從結(jié)果集的開頭返回的最大行數(shù)為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) # 獲取表中前五行的圖書價(jià)格 , 最大行數(shù)為5
-
limit 結(jié)合 order by 語句 和其他條件可以獲取n個(gè)最大或者最小值
select book_name,book_price from book order by book_price desc limit 3; #獲取價(jià)格前三高的圖書名稱和圖書價(jià)格 mysql> select book_price,book_name from book order by book_price desc limit 3; +------------+------------+ | book_price | book_name | +------------+------------+ | 97.00 | 微機(jī)原理 | | 89.00 | 計(jì)算機(jī)網(wǎng)絡(luò) | | 45.00 | 計(jì)算機(jī)網(wǎng)絡(luò) | +------------+------------+ 3 rows in set (0.01 sec)
登錄后復(fù)制 -
使用limit 獲取第n高個(gè)最大值
偏移量從
0
開始,所以要指定從n – 1 開始,然后取一行記錄
#示例:獲取價(jià)格第二高的圖書名稱 mysql> select book_name from book order by book_price desc limit 1,1; +------------+ | book_name | +------------+ | 計(jì)算機(jī)網(wǎng)絡(luò) | +------------+ 1 row in set (0.00 sec)
– 修改(update)
MySQL當(dāng)中使用update關(guān)鍵字來對(duì)數(shù)據(jù)進(jìn)行修改 , 既可以修改單列又可以修改多列.
update 表名 set 列名1 = 值 , 列名2 = 值 ... where 限制條件下修改
SET
子句指定要修改的列和新值。要更新多個(gè)列,請(qǐng)使用以逗號(hào)分隔的列表。以字面值,表達(dá)式或子查詢的形式在每列的賦值中來提供要設(shè)置的值。- 第三,使用WHERE子句中的條件指定要更新的行。
WHERE
子句是可選的。 如果省略WHERE
子句,則UPDATE
語句將更新表中的所有行。
示例:
#將書名為'軟件工程'的圖書價(jià)格修改為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) #將所有的圖書價(jià)格修改為原來的二倍 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)
要從表中刪除數(shù)據(jù),需要使用delete 語句, delete 語句的 用法如下
delete from 表名 where + 條件
首先指定需要?jiǎng)h除數(shù)據(jù)的表,其次使用條件指定where子句中刪除的行記錄, 如果行匹配條件,這些行記錄將會(huì)刪除.
WHERE
子句是可選的。如果省略WHERE
子句,DELETE
語句將刪除表中的所有行 , 請(qǐng)注意,一旦刪除數(shù)據(jù),它就會(huì)永遠(yuǎn)消失。因此,在執(zhí)行DELETE
語句之前,應(yīng)該先備份數(shù)據(jù)庫,以防萬一要找回刪除過的數(shù)據(jù)。
示例
#刪除圖書表中圖書單價(jià)大于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 語句也可以結(jié)合limit語句 和 order by 語句來控制刪除的數(shù)量和條件
【