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屬性:
- 原子性(Atomicity)原子性是指事務(wù)是一個(gè)不可分割的工作單位,事務(wù)中的操作要么都發(fā)生,要么都不發(fā)生。
- 一致性(Consistency)事務(wù)必須使數(shù)據(jù)庫從一個(gè)一致性狀態(tài)變換到另外一個(gè)一致性狀態(tài)。(數(shù)據(jù)不被破壞)
- 隔離性(Isolation)事務(wù)的隔離性是指一個(gè)事務(wù)的執(zhí)行不能被其他事務(wù)干擾,即一個(gè)事務(wù)內(nèi)部的操作及使用的數(shù)據(jù)對(duì)并發(fā)的其他事務(wù)是隔離的,并發(fā)執(zhí)行的各個(gè)事務(wù)之間不能互相干擾。
- 持久性(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)崩潰


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






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

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;