欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

MySQL數(shù)據(jù)庫(kù)表的CRUD操作

 更新時(shí)間:2025年05月16日 08:26:47   作者:IsLand1314~  
這篇文章主要介紹了MySQL數(shù)據(jù)庫(kù)表的CRUD操作,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

一、insert

語(yǔ)法

INSERT [INTO] table_name
    [(column [, column] ...)] #列字段
    VALUES (value_list) [, (value_list)] ... #列字段的內(nèi)容
    
value_list: value, [, value] ...

案例

-- 創(chuàng)建一張學(xué)生表
CREATE TABLE students (
    id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
    sn INT NOT NULL UNIQUE COMMENT '學(xué)號(hào)',
    name VARCHAR(20) NOT NULL,
    qq VARCHAR(20)
);

1. 單行數(shù)據(jù) - 全列插入 + 指定列插入

  • 指定列插入:列字段和列字段的內(nèi)容一定要一一匹配
insert into student (sn, name, qq) values (123, '張飛', '12345');
  • 全列插入:全列插入有兩種方式,一個(gè)是省略 values 左側(cè)字段名,一個(gè)是都指定
insert into students values (10, 124, '關(guān)羽', '13245');
insert into students (id, sn, name, qq) values (14, 125, '劉備', '14525');

可以省略 into

insert students (sn, name, qq) values (126, '諸葛亮', '12525');

2. 多行數(shù)據(jù) - 全列插入 + 指定列插入

指定列多行插入

insert students (sn, name, qq) values (127, '曹操', '15256'), (128, '許攸', '23445');

全列多行插入

insert students values (20, 129, '孫權(quán)', '12256'), (21, 130, '呂布', '33445');

3. 插入否則更新

由于 主鍵 或者 唯一鍵 對(duì)應(yīng)的值已經(jīng)存在而導(dǎo)致插入失敗。

但我就是想讓它先確認(rèn)是不是在數(shù)據(jù)庫(kù)中存在,不存在就插入,存在不要攔我然后執(zhí)行后面的修改語(yǔ)句。

選擇性的進(jìn)行同步更新操作 語(yǔ)法:

INSERT ... ON DUPLICATE KEY UPDATE
    column = value [, column = value] ...

如果不存在就插入,存在發(fā)生主鍵或者唯一鍵沖突不要報(bào)錯(cuò),接著執(zhí)行后面的修改語(yǔ)句。

insert into students values (14, 111, '周瑜', '56321') on duplicate key update sn=111, name='周瑜', qq=56321;

注意更新的值不能和其他的主鍵和唯一鍵沖突,否則不能更新。

  • 0 row affected:表中有沖突數(shù)據(jù),但沖突數(shù)據(jù)的值和 update 的值相等

  • 1 row affected:表中沒(méi)有沖突數(shù)據(jù),數(shù)據(jù)被插入

  • 2 row affected:表中有沖突數(shù)據(jù),并且數(shù)據(jù)已經(jīng)被更新

通過(guò) MySQL 函數(shù)獲取受到影響的數(shù)據(jù)行數(shù)

mysql> select row_count();
+-------------+
| row_count() |
+-------------+
|          -1 |
+-------------+
1 row in set (0.00 sec)

4. 替換

主鍵或者唯一鍵沒(méi)有沖突,則直接插入,如果沖突,則 刪除后再插入(replace into)

mysql> insert into students values (22, 31,'Mike', '9856');
Query OK, 1 rows affected (0.00 sec)
mysql> select * from students;
+----+----+------+------+
| id | sn | name | qq   |
+----+----+------+------+
| 22 | 31 | Mike | 9856 |
+----+----+------+------+

mysql> REPLACE INTO students (sn, name, qq) values (31, 'Tom', '9856');
Query OK, 2 rows affected (0.00 sec)

mysql> select * from students;
+----+----+------+------+
| id | sn | name | qq   |
+----+----+------+------+
| 23 | 31 | Tom  | 9856 |
+----+----+------+------+
  • 1 row affected: 表中沒(méi)有沖突數(shù)據(jù),數(shù)據(jù)被插入
  • 2 row affected: 表中有沖突數(shù)據(jù),刪除后重新插入
  • 這里從 id 就可以看到是刪除后插入的,因?yàn)?nbsp;id 是自增的,剛才是 22,現(xiàn)在是 23 了。

二、Retrieve

語(yǔ)法:

SELECT
    [DISTINCT] {* | {column [, column] ...}
    [FROM table_name] # 從那個(gè)表篩選
    [WHERE ...] # 篩選條件
    [ORDER BY column [ASC | DESC], ...] # 對(duì)篩選結(jié)果排序
    LIMIT ... # 限定篩選出來(lái)的條數(shù)

distinct:對(duì)內(nèi)容進(jìn)行去重

  • *:全列查詢(xún)
  • column,column…:指定列查詢(xún)

案例

-- 創(chuàng)建表結(jié)構(gòu)
CREATE TABLE exam_result (
    id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(20) NOT NULL COMMENT '同學(xué)姓名',
    chinese float DEFAULT 0.0 COMMENT '語(yǔ)文成績(jī)',
    math float DEFAULT 0.0 COMMENT '數(shù)學(xué)成績(jī)',
    english float DEFAULT 0.0 COMMENT '英語(yǔ)成績(jī)'
);
 
-- 插入測(cè)試數(shù)據(jù)
INSERT INTO exam_result (name, chinese, math, english) VALUES
    ('唐三藏', 67, 98, 56),
    ('孫悟空', 87, 78, 77),
    ('豬悟能', 88, 98, 90),
    ('曹孟德', 82, 84, 67),
    ('劉玄德', 55, 85, 45),
    ('孫權(quán)', 70, 73, 78),
    ('宋公明', 75, 65, 30);

1. select 列

全列查詢(xún)通常情況下不建議使用 * 進(jìn)行全列查詢(xún)查詢(xún)的列越多,意味著需要傳輸?shù)臄?shù)據(jù)量越大;可能會(huì)影響到 索引 的使用

select * from exam_result;

指定列查詢(xún)指定列的順序不需要按定義表的順序來(lái)

select id, name, chinese from exam_result;

查詢(xún)字段為表達(dá)式 select 非常特殊,后面可以跟 select 自帶的子句,篩選條件等,也可以跟 表達(dá)式

  • 為查詢(xún)結(jié)果 指定別名 語(yǔ)法:
SELECT column [AS] alias_name [...] FROM table_name; # 這里 as 可以不帶
  • 結(jié)果去重
select distinct math from exam_result;

2. where 條件

  • 剛剛是對(duì)表的整體信息做篩選,但是實(shí)際在做查詢(xún)的時(shí)候一定有篩選條件。
  • 按條件篩選影響的是未來(lái)顯示出來(lái)信息的條目數(shù)或者說(shuō)是行數(shù),以前是按列位單位把全部行都拿出來(lái)了。
  • 如果一列想拿那些行由 where 條件來(lái)決定。

where 是篩選子句,后面可以跟特定的比較運(yùn)算符來(lái)決策我們應(yīng)該如何進(jìn)行篩選,

where 就有點(diǎn)像C/C++里面的 if 語(yǔ)句,根據(jù)后面條件進(jìn)行判斷。

?? 比較運(yùn)算符

運(yùn)算符說(shuō)明
>, >=, <, <=大于,大于等于,小于,小于等于
=等于,NULL 不安全,例如 NULL = NULL 的結(jié)果是 NULL
<=>等于,NULL 安全,例如 NULL <=> NULL 的結(jié)果是 TRUE(1)
!=, <>不等于
value 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è)字符

?? 注意事項(xiàng)

  • = 時(shí)兩側(cè)進(jìn)行 null 值比較,是不能參與運(yùn)算的
  • 如果想判斷 null 是否相等 使用 <=>
  • 不過(guò)一般也不這樣去判斷,一般更喜歡用 IS NULL 去判斷一個(gè)值是否是null

?? 邏輯運(yùn)算符:

運(yùn)算符說(shuō)明
AND多個(gè)條件必須都為 TRUE(1),結(jié)果才是 TRUE(1)
OR任意一個(gè)條件為 TRUE(1), 結(jié)果為 TRUE(1)
NOT條件為 TRUE(1),結(jié)果為 FALSE(0)

具體案例

  • 基于上面的建表,下面只會(huì)寫(xiě)出指令,最終結(jié)果為了節(jié)省篇幅就省略了

① 英語(yǔ)不及格的同學(xué)名字及英語(yǔ)成績(jī) ( < 60 )

select name, english from exam_result where english < 60;

**② **語(yǔ)文成績(jī)?cè)?[80, 90] 分的同學(xué)及語(yǔ)文成績(jī) 使用 AND 進(jìn)行條件連接

select name, chinese from exam_result where chinese >= 80 and chinese <= 90;

使用 BETWEEN … AND … 條件

select name, chinese from exam_result where chinese between 80 and 90;

③ 數(shù)學(xué)成績(jī)是 58 或者 59 或者 98 或者 99 分的同學(xué)及數(shù)學(xué)成績(jī)使用 OR 進(jìn)行條件連接,滿足任意一個(gè)就為真

select name, math from exam_result where math = 58 or math = 59 or math = 98 or math = 99;

使用 IN 條件,滿足 () 里任意一個(gè)就為真

select name, math from exam_result where math in (58, 59, 98, 99);
  • 姓孫的同學(xué) 及 孫某同學(xué) 有時(shí)候匹配并不給具體值的更細(xì)節(jié)的字段含義,可能就只給一個(gè)模糊搜索的關(guān)鍵字。就如上面。反正條件不給全就給一個(gè)模糊的條件。
  • 我們就可以用 LIKE 模糊匹配 % 匹配任意多個(gè)(包括 0 個(gè))任意字符注意 MySQL 可以用 ‘ ’ 或者 “ ” 表示字符串
select name from exam_result where name like '孫%';

_ 匹配嚴(yán)格的一個(gè)任意字符:

select name from exam_result where name like '孫_';

④ 語(yǔ)文成績(jī)好于英語(yǔ)成績(jī)的同學(xué)

select name, chinese, english from exam_result where chinese > english;

⑤ 總分在 200 分以下的同學(xué)

mysql> select name, math + chinese + english total from exam_result where math + chinese + english < 200;
+-----------+-------+
| name      | total |
+-----------+-------+
| 劉玄德    |   185 |
| 宋公明    |   170 |
+-----------+-------+

# 但是寫(xiě)成這樣就會(huì)有問(wèn)題
mysql> select name, math + chinese + english as total from exam_result where total < 200;
ERROR 1054 (42S22): Unknown column 'total' in 'where clause'

為啥這里它報(bào)錯(cuò)了未知列total,我們不是做過(guò)重命名嗎。這個(gè)total不是已經(jīng)有了嗎,怎么這里報(bào)不知道total呢?

解釋如下:

  • 很簡(jiǎn)單,我們一定是先執(zhí)行 from ,在執(zhí)行 where ,然后在執(zhí)行 select
  • 篩選后再執(zhí)行,從 1 中帶著 2 去3中篩選
  • **原因:**只把小于操作 2 的相加后再打印,更節(jié)省空間
  • 所以不可以在 where 中使用重命名

⑥ 語(yǔ)文成績(jī) > 80 并且不姓孫的同學(xué)

AND 與 NOT 的使用

select name, chinese from exam_result where chinese>80 and name not like '孫%';

⑦ 孫某同學(xué),否則要求總成績(jī) > 200 并且 語(yǔ)文成績(jī) < 數(shù)學(xué)成績(jī) 并且 英語(yǔ)成績(jī) > 80

要么就是孫某同學(xué),要么就得滿足后面的一堆要求,總共就兩個(gè)條件,在mysql如果條件很多可以用()把這個(gè)條件括起來(lái),表示一個(gè)單元

select name, chinese, math, english, chinese + math + english total 
from exam_result 
where name like '孫_' or (chinese + math + english > 200 and chinese < math and english > 80);

3. 結(jié)果排序 – order by

語(yǔ)法

SELECT ... FROM table_name [WHERE ...]
    ORDER BY column [ASC|DESC], [...];
  • ASC 為升序(從小到大)(ascending)
  • DESC 為降序(從大到?。?descding)
  • 默認(rèn)為 ASC

注意:沒(méi)有 ORDER BY 子句的查詢(xún),返回的順序是未定義的,永遠(yuǎn)不要依賴(lài)這個(gè)順序

【案例】

  • 基于上面建的表來(lái)操作

yi同學(xué)及數(shù)學(xué)成績(jī),按數(shù)學(xué)成績(jī)升序顯示

select name, math from exam_result order by math asc;
  • 注意:NULL 視為比任何值都小,升序出現(xiàn)在最上面

② 查詢(xún)同學(xué)各門(mén)成績(jī),依次按 數(shù)學(xué)降序,英語(yǔ)升序,語(yǔ)文升序的方式顯示

select name, math, english, chinese from exam_result order by math desc, english, chinese;

③ 查詢(xún)同學(xué)及總分,由高到低

select name, chinese + math + english total from exam_result order by total desc;
  • 欸,看到這里有個(gè)問(wèn)題 ? 為什么在order by這里可以使用別名進(jìn)行排序,而where后面沒(méi)有辦法使用別名?

因此可以得到一個(gè)結(jié)論:能不能用別名完全是取決于當(dāng)前sql中子句的執(zhí)行順序!

  • 你要對(duì)表結(jié)構(gòu)的數(shù)據(jù)進(jìn)行排序,一定是得先有數(shù)據(jù)!
  • 有人可能說(shuō)不是表結(jié)構(gòu)不就天然有數(shù)據(jù)嗎,因此就直接可以把表結(jié)構(gòu)數(shù)據(jù)全排完,然后在選行不行,但我們肯定不會(huì)愿意這樣 浪費(fèi)時(shí)間處理數(shù)據(jù)排序
  • 因?yàn)槟銢](méi)有篩選,在排序的時(shí)候一定有大批數(shù)據(jù)其實(shí)是不需要排序的,而對(duì)這些數(shù)據(jù)排序本身就是浪費(fèi)空間和時(shí)間,mysql沒(méi)有這么笨!
  • 所以會(huì)先篩選 select 再排序 order by

4. 篩選分頁(yè) – limit

什么是分頁(yè)呢?

  • 如果一個(gè)表中數(shù)據(jù)量太大,這個(gè)時(shí)候如果全列查詢(xún)就有一大堆,這樣不便于查看分析
  • 有時(shí)候我們不想一次顯示這么多,因此我們就可以對(duì)結(jié)果進(jìn)行 LIMIT 分頁(yè)。

limit 本身沒(méi)有篩選功能,只是 按照它后面跟的數(shù)字 把要顯示的結(jié)果按照 起始位置 和 步長(zhǎng),給我們顯示多條記錄。

語(yǔ)法

-- 起始下標(biāo)為 0
 
-- 從 s 開(kāi)始,篩選 n 條結(jié)果
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT s, n
 
-- 從 0 開(kāi)始,篩選 n 條結(jié)果
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT n;
 
-- 從 s 開(kāi)始,篩選 n 條結(jié)果,比第二種用法更明確,建議使用
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT n OFFSET s;

建議: 對(duì)未知表進(jìn)行查詢(xún)時(shí),最好加一條 LIMIT 1,避免因?yàn)楸碇袛?shù)據(jù)過(guò)大,查詢(xún)?nèi)頂?shù)據(jù)導(dǎo)致數(shù)據(jù)庫(kù)卡死。

  • 默認(rèn)從 0 下標(biāo)開(kāi)始,篩選多條記錄。
  • limit 分頁(yè)讀取的執(zhí)行順序,是在最后的
  • 也可以指定下標(biāo)開(kāi)始篩選后面跟的是步長(zhǎng)。從指定位置開(kāi)始,連續(xù)讀取多條記錄。

如下

mysql> select id, name, math from exam_result order by id limit 3 offset 0;
+----+-----------+------+
| id | name      | math |
+----+-----------+------+
|  1 | 唐三藏    |   98 |
|  2 | 孫悟空    |   78 |
|  3 | 豬悟能    |   98 |
+----+-----------+------+

mysql> select id, name, math from exam_result order by id limit 3 offset 6;
+----+-----------+------+
| id | name      | math |
+----+-----------+------+
|  7 | 宋公明    |   65 |
+----+-----------+------+
  • LIMIT 后面跟的是篩選幾行,OFFSET 后面跟的是從那行開(kāi)始。
  • limit 可以進(jìn)行分頁(yè)。就比如數(shù)據(jù)多就可以這樣進(jìn)行 分頁(yè)讀

關(guān)鍵字執(zhí)行順序總結(jié)

  • **from > on> join > where > group by > with > having > select(**含重命名) > distinct > order by > limit

三、Update | Delete | 插入查詢(xún)結(jié)果

3.1 Update

語(yǔ)法

UPDATE table_name SET column = expr [, column = expr ...]
    [WHERE ...] [ORDER BY ...] [LIMIT ...]
  • set 后面跟的是要重新設(shè)定的值,可以是多列。
  • 一般在 update 的時(shí)候必須采用對(duì)應(yīng) where 子句進(jìn)行條件篩選,如果沒(méi)有的話會(huì)把這個(gè)表中指定的列全部都更新,這是不合理的。

【案例】:基于上面創(chuàng)建的 exam_result 表

對(duì)查詢(xún)到的結(jié)果進(jìn)行列值更新: set

① 將孫悟空同學(xué)的數(shù)學(xué)成績(jī)變更為 80 分

update exam_result set math=80 where name='孫悟空';

② 將曹孟德同學(xué)的數(shù)學(xué)成績(jī)變更為 60 分,語(yǔ)文成績(jī)變更為 70 分

update exam_result set math=60, chinese=70 where name='曹孟德';

③ 將總成績(jī)倒數(shù)前三的 3 位同學(xué)的數(shù)學(xué)成績(jī)加上 30 分

  • 更新值為原值基礎(chǔ)上變更。
  • 注意據(jù)更新,不支持 math += 30 這種語(yǔ)法。

④ 將所有同學(xué)的語(yǔ)文成績(jī)更新為原來(lái)的 2 倍

update exam_result set chinese=chinese*2;

注意:更新全表的語(yǔ)句慎用!

3.2 Delete

語(yǔ)法:

DELETE FROM table_name [WHERE ...] [ORDER BY ...] [LIMIT ...]
  • 一般都是拿著條件刪除 where
  • 不加條件就是把整表的內(nèi)容刪除了,不過(guò)表結(jié)構(gòu)還在。
  • 刪表結(jié)構(gòu)drop

比如刪除之前 exam_result 中的孫悟空的成績(jī),如下:

delete from exam_result where name='孫悟空';

我們?cè)賮?lái)個(gè)測(cè)試,測(cè)試表 如下:

-- 準(zhǔn)備測(cè)試表
create table for_delete(id int primary key auto_increment, name varchar(20));
 
 
-- 插入測(cè)試數(shù)據(jù)
INSERT INTO for_delete (name) VALUES ('A'), ('B'), ('C');

-- 查詢(xún)表數(shù)據(jù)
select * from for_delete;
+----+------+
| id | name |
+----+------+
|  1 | A    |
|  2 | B    |
|  3 | C    |
+----+------+

現(xiàn)在我們可以看到id設(shè)置了自增,目前已經(jīng)插入三條記錄了,如果在插入一條記錄這個(gè)id就是4了。

但我們現(xiàn)在不插直接把表刪除,如下:

-- 刪除表
delete from for_delete;

mysql> show create table for_delete \G;
*************************** 1. row ***************************
       Table: for_delete
Create Table: CREATE TABLE `for_delete` (
  `id` int NOT NULL AUTO_INCREMENT,
  `name` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)


mysql> select last_insert_id();
+------------------+
| last_insert_id() |
+------------------+
|                1 |
+------------------+

-- 插入新數(shù)據(jù)
insert into for_delete(name) values('E');

mysql> select * from for_delete;
+----+------+
| id | name |
+----+------+
|  4 | E    |
+----+------+

當(dāng)新插入一條記錄時(shí)這個(gè)id是4,并且自增長(zhǎng)已經(jīng)變成下一個(gè)id值了

  • 說(shuō)明 delete from 清空表 的方式不會(huì)將 自增值置 0

清空表還有一種做法叫做 截?cái)啾?/strong>。在效果和 delete 一模一樣,但是在細(xì)節(jié)和原理是有差別的。

截?cái)啾?/h3>

語(yǔ)法

TRUNCATE [TABLE] table_name

注意:這個(gè)操作慎用

  • 只能對(duì)整表操作,不能像 DELETE 一樣針對(duì)部分?jǐn)?shù)據(jù)操作;
  • 實(shí)際上 MySQL 不對(duì)數(shù)據(jù)操作,所以比 DELETE 更快,但是 TRUNCATE 在刪除數(shù)據(jù)的時(shí)候,并不經(jīng)過(guò)真正的事物,所以無(wú)法回滾
  • 會(huì)重置 AUTO_INCREMENT 項(xiàng)

【案例】:

mysql> select * from for_delete; # 操作前
+----+------+
| id | name |
+----+------+
|  4 | E    |
+----+------+

-- 插入
insert into for_delete(name) values('A'), ('B'), ('C');

-- truncate 操作
mysql> truncate for_delete;
Query OK, 0 rows affected (0.04 sec)

mysql> insert into for_delete(name) values('E');
Query OK, 1 row affected (0.01 sec)

mysql> select * from for_delete; # 操作后
+----+------+
| id | name |
+----+------+
|  1 | E    |
+----+------+
  • 可以看到表結(jié)構(gòu)還在,但是內(nèi)容已經(jīng)被清空了。但是這里值得注意的一點(diǎn)是,之前自增長(zhǎng)是5,現(xiàn)在 truncata 清空表后自增長(zhǎng)已經(jīng)沒(méi)有了。
  • 然后新插一條記錄,id變成1了。自增長(zhǎng) 變成 2 了
  • 換句話說(shuō) truncate 會(huì)重置自增長(zhǎng)。而 delete 并不會(huì)。

實(shí)際上,TRUNCATE 和 DELETE 還存在一些差異。TRUNCATE 操作是直接將表中的數(shù)據(jù)清空,并且這個(gè)操作不通過(guò)事務(wù)處理。而 DELETE 和其他 SQL 操作則會(huì)在執(zhí)行時(shí)被包裝進(jìn) 事務(wù) 中,再由 MySQL 處理。

事務(wù)的影響

事務(wù) 的使用與否會(huì)影響 MySQL 對(duì)操作信息的記錄方式。MySQL 使用其自身的 日志系統(tǒng) 來(lái)記錄數(shù)據(jù)操作的信息,主要包括以下幾種 日志

  • bin.log:存儲(chǔ)經(jīng)過(guò)優(yōu)化的歷史 SQL 語(yǔ)句。
  • redo.log:用于在 MySQL 遭遇宕機(jī)時(shí)能夠恢復(fù)數(shù)據(jù)。
  • undo.log:用于存儲(chǔ)回滾段信息。

日志的作用

  • bin.log 記錄的是歷史 SQL 語(yǔ)句,并支持 MySQL 的主從同步機(jī)制。當(dāng)一個(gè)數(shù)據(jù)庫(kù)執(zhí)行完某些操作后,可以通過(guò) bin.log 將這些 SQL 同步到另一個(gè)數(shù)據(jù)庫(kù),從而使兩個(gè)數(shù)據(jù)庫(kù)的數(shù)據(jù)保持一致(主從同步), 需要注意,默認(rèn)情況下 bin.log 是 關(guān)閉 的。
  • redo.log 在 MySQL 遇到故障時(shí) 提供數(shù)據(jù)恢復(fù)功能

持久化方式

持久化方式指的是為了能夠在系統(tǒng)崩潰后快速恢復(fù)數(shù)據(jù)庫(kù)數(shù)據(jù) 的方法。

將數(shù)據(jù)以文件的形式寫(xiě)入磁盤(pán),通常有兩種方式

  • 記錄歷史sql語(yǔ)句
  • 記錄數(shù)據(jù)本身

Truncate的特點(diǎn)

由于 TRUNCATE 不記錄自己的操作到 日志 中,也不將其作為 事務(wù) 的一部分,因此它僅是簡(jiǎn)單地清空表中的數(shù)據(jù),這樣做的結(jié)果是 TRUNCATE 的執(zhí)行速度較快。

  • TRUNCATE 因?yàn)槠浞鞘聞?wù)性及不記錄日志的特點(diǎn),在執(zhí)行速度上有優(yōu)勢(shì)
  • 但在數(shù)據(jù)恢復(fù)和一致性方面不如 DELETE

3.3 插入查詢(xún)結(jié)果

語(yǔ)法

INSERT INTO table_name [(column [, column ...])] SELECT ...

我們要插就插,要?jiǎng)h就刪,要改就改,要查就查,實(shí)際我們也可以將select和insert組合。可以把數(shù)據(jù)從其他表里面篩選出來(lái),然后插入到另一個(gè)表里面。

我們來(lái)實(shí)現(xiàn)如下一個(gè)小實(shí)驗(yàn):

刪除表中的重復(fù)記錄,重復(fù)的數(shù)據(jù)只能有一份,現(xiàn)在我們有如下的一個(gè)表:

mysql> select * from duplicate_t;
+------+------+
| id   | name |
+------+------+
|    1 | a    |
|    1 | a    |
|    2 | b    |
+------+------+

我的做法是

  • 創(chuàng)建一個(gè)和原表一樣結(jié)構(gòu)的空表 no_duplicate_t,

  • 從原始表中把去重之后的結(jié)果篩選出來(lái)插入到 no_duplicate_t 這個(gè)表不就是不重復(fù)的嘛

  • 然后對(duì) duplicate_t 重命名,no_duplicate_t 改名字為 duplicate_t。最終不就完成了對(duì) duplicate_t去重

mysql> create table no_duplicate_t like duplicate_t; # 創(chuàng)建完全一樣的表,用 like
mysql> insert into no_duplicate_t select distinct * from duplicate_t; # 全列插入就不用指定列

-- 重命名
mysql> rename table duplicate_t to old_duplicate_t;
mysql> rename table no_duplicate_t to duplicate_t;

mysql> select * from duplicate_t; # 查詢(xún)最終結(jié)果
+------+------+
| id   | name |
+------+------+
|    1 | a    |
|    2 | b    |
+------+------+

?這里有個(gè)細(xì)節(jié)問(wèn)題,為什么最后是通過(guò) rename 方式進(jìn)行的?

如果今天想把一個(gè)文件上傳到 linux 上,比如這個(gè)文件是1G上傳時(shí)間可能是10分鐘,我們想把這個(gè)文件上傳號(hào)之后放到一個(gè)目錄下,并且要求它是為 原子性方式 放入的。

  • 所以一般我們不能直接把文件上傳到對(duì)應(yīng)的目錄下,因?yàn)樗蟼鞯倪^(guò)程一種在寫(xiě)入一定不是 原子 ,它太慢了。
  • 所以我們把這個(gè)文件上傳到臨時(shí)目標(biāo)下,全部上傳之后然后再把文件 move 到那個(gè)目錄下。
  • 直接 move 這個(gè)動(dòng)作實(shí)際上是 原子的 ,其實(shí)對(duì)一個(gè)文件進(jìn)行 重命名 也是同一個(gè)道理

所以我們最后通過(guò) rename 方式,就是單純的想等一切都就緒了,然后統(tǒng)一放入,更新,生效等! 和冗長(zhǎng)的其他動(dòng)作相比,這個(gè)動(dòng)作非常輕。

到此這篇關(guān)于MySQL數(shù)據(jù)庫(kù)表的CRUD操作的文章就介紹到這了,更多相關(guān)MySQL 表CRUD操作內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Mysql注入中的outfile、dumpfile、load_file函數(shù)詳解

    Mysql注入中的outfile、dumpfile、load_file函數(shù)詳解

    這篇文章主要介紹了Mysql注入中的outfile、dumpfile、load_file,需要的朋友可以參考下
    2018-05-05
  • mysql中文顯示為問(wèn)號(hào)?的問(wèn)題及解決

    mysql中文顯示為問(wèn)號(hào)?的問(wèn)題及解決

    這篇文章主要介紹了mysql中文顯示為問(wèn)號(hào)?的問(wèn)題及解決方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • mysql截取函數(shù)常用方法使用說(shuō)明

    mysql截取函數(shù)常用方法使用說(shuō)明

    常用的mysql截取函數(shù)有:left(), right(), substring(), substring_index(),很多新手朋友不是很了解,接下來(lái)詳細(xì)說(shuō)明,需要的朋友可以參考下
    2012-12-12
  • mysql的binlog三種配置模式小結(jié)

    mysql的binlog三種配置模式小結(jié)

    本文主要介紹了mysql的binlog三種配置模式小結(jié),主要是binlog_format的值有3個(gè)選項(xiàng),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-07-07
  • 詳解MySQL 用戶(hù)權(quán)限管理

    詳解MySQL 用戶(hù)權(quán)限管理

    這篇文章主要介紹了MySQL 用戶(hù)權(quán)限管理的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)使用MySQL,感興趣的朋友可以了解下
    2021-04-04
  • MySQL中replace into與replace區(qū)別詳解

    MySQL中replace into與replace區(qū)別詳解

    本文主要介紹了MySQL中replace into與replace區(qū)別詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • MySQL數(shù)據(jù)庫(kù)主機(jī)127.0.0.1與localhost區(qū)別

    MySQL數(shù)據(jù)庫(kù)主機(jī)127.0.0.1與localhost區(qū)別

    這篇文章主要介紹了MySQL主機(jī)127.0.0.1與localhost區(qū)別總結(jié),需要的朋友可以參考下
    2018-06-06
  • 一文帶你深入了解并掌握MySQL的DML和DCL

    一文帶你深入了解并掌握MySQL的DML和DCL

    在數(shù)據(jù)庫(kù)管理中,數(shù)據(jù)操作語(yǔ)言(DML)和數(shù)據(jù)控制語(yǔ)言(DCL)是至關(guān)重要的概念,DML使我們能夠?qū)?shù)據(jù)庫(kù)中的數(shù)據(jù)進(jìn)行增加、修改和刪除操作,本文將深入探討這兩個(gè)關(guān)鍵領(lǐng)域的核心概念和操作方法,幫助您更好地理解和應(yīng)用數(shù)據(jù)庫(kù)管理技術(shù)
    2024-02-02
  • MySQL索引下推(ICP)的簡(jiǎn)單理解與示例

    MySQL索引下推(ICP)的簡(jiǎn)單理解與示例

    大家應(yīng)該都知道索引下推可以提高查詢(xún)效率,所以下面這篇文章主要給大家介紹了關(guān)于MySQL索引下推(ICP)的簡(jiǎn)單理解與示例的相關(guān)資料,需要的朋友可以參考下
    2021-09-09
  • SQL實(shí)現(xiàn)LeetCode(196.刪除重復(fù)郵箱)

    SQL實(shí)現(xiàn)LeetCode(196.刪除重復(fù)郵箱)

    這篇文章主要介紹了SQL實(shí)現(xiàn)LeetCode(196.刪除重復(fù)郵箱),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08

最新評(píng)論