MySQL(三)——DML、TCL和數(shù)據(jù)庫的對(duì)象

1.DML


1.1INSERT

INSERT INTO table [(column [, column...])] VALUES (value [, value...]);

一般來說,一條INSERT只能插入一條數(shù)據(jù),因?yàn)镸YSQL沒有batch操作,所以,MYSQL也支持在一條INSERT中插入多條數(shù)據(jù)

INSERT INTO table [(column [, column...])] VALUES (value [, value...]),(value [, value...]),...

當(dāng)然,一條SQL的長(zhǎng)度是有限的,可以通過調(diào)整max_allowed_packet參數(shù);

1.2UPDATE

UPDATE   table
SET column = value [, column = value] …
[WHERE   condition];

UPDATE語句也可以使用表連接,子查詢等多種方式執(zhí)行;

1.3DELETE

DELETE [FROM]   table
[WHERE  condition];

在delete語句中,where子句是可選的部分,如果使用了where子句,則刪除的數(shù)據(jù)是符合where條件的所有記錄;如果省略了where子句,則全表的數(shù)據(jù)都會(huì)被刪除,delete語句的where條件也同樣支持子查詢,但是一定注意,刪除語句中的where條件不能是要?jiǎng)h除的數(shù)據(jù)表中的數(shù)據(jù);所以,在涉及到刪除的數(shù)據(jù)是通過要?jiǎng)h除的表中的數(shù)據(jù)查詢出來的,一般會(huì)把查詢結(jié)果臨時(shí)保存到另一張表,再通過delete語句刪除;

2.TCL


2.1數(shù)據(jù)庫事務(wù)概念

在數(shù)據(jù)庫中,所謂事務(wù)是指一組邏輯操作單元,使數(shù)據(jù)從一種狀態(tài)變換到另一種狀態(tài)。

為確保數(shù)據(jù)庫中數(shù)據(jù)的一致性,數(shù)據(jù)的操縱應(yīng)當(dāng)是離散的成組的邏輯單元:當(dāng)它全部完成時(shí),數(shù)據(jù)的一致性可以保持,而當(dāng)這個(gè)單元中的一部分操作失敗,整個(gè)事務(wù)應(yīng)全部視為錯(cuò)誤,所有從起始點(diǎn)以后的操作應(yīng)全部回退到開始狀態(tài)。

說白了: 把多個(gè)操作看成是一個(gè)不可分割的整體(事務(wù)):

  • 如果多個(gè)操作都成功了,則認(rèn)為成功. ------>提交事務(wù)
  • 如果多個(gè)操作中有一個(gè)失敗,則認(rèn)為失敗.------>回滾事務(wù).

在MySQL中,InnoDB支持事務(wù),MyISAM不支持.

事務(wù)的操作:先定義開始一個(gè)事務(wù),然后對(duì)數(shù)據(jù)作修改操作,這時(shí)如果提交(COMMIT),這些修改就永久地保存下來,如果回退(ROLLBACK),數(shù)據(jù)庫管理系統(tǒng)將放棄您所作的所有修改而回到開始事務(wù)時(shí)的狀態(tài)。

2.2事務(wù)的ACID屬性:

    1. 原子性(Atomicity)原子性是指事務(wù)是一個(gè)不可分割的工作單位,事務(wù)中的操作要么都發(fā)生,要么都不發(fā)生。
    1. 一致性(Consistency)事務(wù)必須使數(shù)據(jù)庫從一個(gè)一致性狀態(tài)變換到另外一個(gè)一致性狀態(tài)。(數(shù)據(jù)不被破壞)
    1. 隔離性(Isolation)事務(wù)的隔離性是指一個(gè)事務(wù)的執(zhí)行不能被其他事務(wù)干擾,即一個(gè)事務(wù)內(nèi)部的操作及使用的數(shù)據(jù)對(duì)并發(fā)的其他事務(wù)是隔離的,并發(fā)執(zhí)行的各個(gè)事務(wù)之間不能互相干擾。
    1. 持久性(Durability)持久性是指一個(gè)事務(wù)一旦被提交,它對(duì)數(shù)據(jù)庫中數(shù)據(jù)的改變就是永久性的,接下來的其他操作和數(shù)據(jù)庫故障不應(yīng)該對(duì)其有任何影響

2.3數(shù)據(jù)庫的事務(wù)由下列語句組成:

一組DML語句,修改的數(shù)據(jù)在他們中保持一致

一個(gè) DDL (Data Define Language) 語句

一個(gè) DCL (Data Control Language)語句

  • DCL(Grant(賦于權(quán)限 ) / Revoke(回收權(quán)限 ))

2.4控制語句

COMMIT和 ROLLBACK可以顯示的控制事務(wù)。
好處:
1、保證數(shù)據(jù)一致性,修改過的數(shù)據(jù)在沒有提交之前是不能被其他用戶看到的。
2、在數(shù)據(jù)永久性生效前重新查看修改的數(shù)據(jù)
3、將相關(guān)操作組織在一起,一個(gè)事務(wù)中相關(guān)的數(shù)據(jù)改變或者都成功,或者都失敗。

1、開始于第一個(gè)執(zhí)行的語句
2、結(jié)束于:
用戶執(zhí)行COMMIT 或 ROLLBACK

單個(gè)的DDL or DCL 語句

用戶連接異常錯(cuò)誤,或者用戶斷開連接

系統(tǒng)崩潰


image.png
image.png

2.4數(shù)據(jù)庫的事務(wù)并發(fā)問題

image.png
image.png
image.png
image.png
image.png
image.png

為了解決這些問題:數(shù)據(jù)庫提出了隔離級(jí)別:

image.png

SELECT * FROM dept for update;獲取鎖.
只能有一個(gè)線程去操作數(shù)據(jù)庫,其他線程只能等著該線程提交或者回滾之后,才能繼續(xù)操作.

3.數(shù)據(jù)庫的對(duì)象

數(shù)據(jù)庫對(duì)象:表,索引,視圖,圖表,缺省值,規(guī)則,觸發(fā)器,語法,函數(shù)等。
1、對(duì)象名稱必須以字母開頭
2、有效的字符包括數(shù)字、字母和三個(gè)特殊字符(# _ $)
3、不要使用保留字作為對(duì)象名稱
4、同一用戶下的對(duì)象不能同名,即使是不同的對(duì)象類型

3.1表

3.1.1創(chuàng)建表:定義表的結(jié)構(gòu)(有哪些列,每一列存儲(chǔ)什么類型的數(shù)據(jù))

create table 表名(
列名 類型 約束,
列名 類型 約束,
列名 類型 約束
);

簡(jiǎn)單的創(chuàng)建表語句

CREATE TABLE emp_copy AS SELECT * FROM emp
CREATE TABLE emp_copy AS SELECT * FROM emp WHERE 1=2

使用select的方式拷貝表結(jié)構(gòu),不會(huì)拷貝表的索引等結(jié)構(gòu),
所以一般使用
CREATE TABLE emp_bak LIKE emp :來復(fù)制表結(jié)構(gòu)(不會(huì)拷貝外鍵);

3.1.2修改表結(jié)構(gòu)
  • 增加表字段
ALTER TABLE table
ADD    (column datatype [DEFAULT expr]
           [, column datatype]...);

使用 ADD 子句增加字段,新的字段只能被加到整個(gè)表的最后,并且不能與表中原有的字段重名

alter table employee add column sex char(1);
  • 修改表字段
ALTER TABLE table
MODIFY     (column datatype [DEFAULT expr]
           [, column datatype]...);

可修改列的數(shù)據(jù)類型,大小

alter table employees modify sex tinyint;

不是任何情況都可以修改的,當(dāng)字段只包含空值時(shí),類型、大小都可以修改,否則修改可能不能成功

  • 刪除表字段
ALTER TABLE table
DROP  column     (columns);

可以從表中刪除列:

ALTER TABLE employee  DROP COLUMN sex;

從每行中刪除掉字段占據(jù)的長(zhǎng)度和數(shù)據(jù),釋放在數(shù)據(jù)塊中占用的空間。刪除大表中的字段將需要比較長(zhǎng)的時(shí)間.

3.1.3刪除表

drop table:刪除表,但并不釋放表所占空間;

TRUNCATE TABLE 語句
清除表中所有的記錄,delete可以選擇刪除表中的一部分
是DDL語句,不可以回滾,delete可以使用rollback回滾,放棄修改。
釋放表的存儲(chǔ)空間,delete不釋放空間
2、 是刪除數(shù)據(jù)的方法之一
3、TRUNCATE TABLE table_name;

注意:
1、表中所有數(shù)據(jù)將被刪除
2、沒有完成的事務(wù)被提交
3、所有相關(guān)的索引被刪除
4、這個(gè)刪除操作不能回滾

3.2表的約束(針對(duì)于某一列):

  • 1.非空約束:NOT NULL,不允許某列的內(nèi)容為空。
  • 2.設(shè)置列的默認(rèn)值:DEFAULT。
  • 3.唯一約束:UNIQUE,在該表中,該列的內(nèi)容必須唯一。
  • 4.主鍵約束:PRIMARY KEY, 非空且唯一。
  • 5.主鍵自增長(zhǎng):AUTO_INCREMENT,從1開始,步長(zhǎng)為1。
  • 6.外鍵約束:FOREIGN KEY,A表中的外鍵列. A表中的外鍵列的值必須參照于B表中的某一列(B表主鍵)。

3.3索引

3.3.1原理

索引是:
一個(gè)數(shù)據(jù)庫對(duì)象
用來加速對(duì)表的查詢
通過使用快速路徑訪問方法快速定位數(shù)據(jù),減少了磁盤的I/O
與表獨(dú)立存放
由數(shù)據(jù)庫自動(dòng)維護(hù)

索引為什么能夠加快查詢?

3.3.2創(chuàng)建索引

自動(dòng):
當(dāng)在表上定義一個(gè)PRIMARY KEY時(shí),自動(dòng)創(chuàng)建一個(gè)對(duì)應(yīng)的唯一索引.
當(dāng)在表上定義一個(gè)外鍵時(shí),自動(dòng)創(chuàng)建一個(gè)普通索引;

手動(dòng):
用戶可以創(chuàng)建索引以加速查詢.
在一列或者多列上創(chuàng)建索引.

 CREATE INDEX index ON table (column[, column]...);

如果多列在一起,就叫做復(fù)合索引;在很多情況下,復(fù)合索引比單個(gè)索引更好(理解原理即可);

3.3.3優(yōu)化索引

哪些值可以創(chuàng)建索引?
1,外鍵一般要?jiǎng)?chuàng)建索引
2,經(jīng)常使用的查詢條件要?jiǎng)?chuàng)建索引。如果使用like ‘%’操作,不會(huì)使用索引。
3,索引不是越多越好
4,不要在可選值很少的屬性上面創(chuàng)建索引
5,MySQL索引的使用,并不是所有情況下都會(huì)使用索引,只有當(dāng)MySQL認(rèn)為索引足夠能夠提升查詢性能時(shí)才會(huì)使用;

3.4視圖

3.4.1概念

視圖也就是虛表,實(shí)際上視圖就是一個(gè)命名的查詢,用于改變基表數(shù)據(jù)的顯示。

可以限制對(duì)數(shù)據(jù)的訪問
可以使復(fù)雜的查詢變的簡(jiǎn)單
提供了數(shù)據(jù)的獨(dú)立性
提供了對(duì)相同數(shù)據(jù)的不同顯示

3.4.2創(chuàng)建視圖

語法:
在CREATE VIEW語句后加入子查詢.

CREATE [OR REPLACE] VIEW view
     [(alias[, alias]...)] 
     AS subquery
     [WITH READ ONLY];

創(chuàng)建視圖

CREATE OR REPLACE VIEW emp_v_30
AS SELECT  empno, ename, sal
FROM    emp
WHERE   deptno =30;

在子查詢中使用別名創(chuàng)建視圖.

CREATE VIEW     sal_v_10
AS SELECT  employee_id ID, last_name NAME,
salary*12 ANN_SALARY
FROM    employees
WHERE   department_id = 10;

在視圖中的列名使用的是子查詢中列的別名.

3.4.3使用視圖

在查詢時(shí),不需要再寫完全的Select查詢語句,只需要簡(jiǎn)單的寫上從視圖中查詢的語句就可以了

SELECT * FROM sal_v_10;

默認(rèn)情況下,可以直接通過對(duì)視圖的DML操作去修改視圖對(duì)應(yīng)表中的內(nèi)容(前提是視圖中沒有通過公式導(dǎo)出的列);

3.4.4刪除視圖

刪掉視圖不會(huì)導(dǎo)致數(shù)據(jù)的丟失,因?yàn)橐晥D是基于數(shù)據(jù)庫的表之上的一個(gè)查詢定義.

DROP VIEW view_name;
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容