MySQL,關(guān)系型數(shù)據(jù)庫(kù)(RDBMS),有幾個(gè)關(guān)鍵術(shù)語(yǔ)需要鞏固一下
- 冗余:存儲(chǔ)兩倍數(shù)據(jù),冗余降低了性能,但提高了數(shù)據(jù)的安全性。
- 主鍵:主鍵是唯一的。一個(gè)數(shù)據(jù)表中職能包含一個(gè)主鍵,你可以使用主鍵來(lái)查詢。
- 復(fù)合鍵:復(fù)合鍵(組合鍵)將 多個(gè)列作為一個(gè)索引值,一般用于復(fù)合索引。
- 索引:使用索引可以快速訪問(wèn)數(shù)據(jù)庫(kù)表中的特定信息。索引是對(duì)數(shù)據(jù)庫(kù)表中的一列或多了的值進(jìn)行排序的一種結(jié)構(gòu),類似與書籍的目錄。
- 參照完整性:參照的完整性要求關(guān)系中不允許引用不存在的實(shí)體。與實(shí)體完整性是關(guān)系模型必須滿足的完整性約束條件。目的是保證數(shù)據(jù)的一致性。
# SELECT 基本語(yǔ)法
? MySQL數(shù)據(jù)庫(kù)使用SQL SELECT語(yǔ)句來(lái)查詢數(shù)據(jù),其基礎(chǔ)語(yǔ)法如下:
SELECT field1, filed2, ...filedn
FROM table_name1, table_name2...
[WHERE condition1 [AND [OR]] condition2...]
[LIMIT N][ OFFSET M]
SELECT命令可以讀取一條或多條記錄
SELECT關(guān)鍵字,必填,跟不同的列名,用逗號(hào)隔開,表示要返回的查詢結(jié)果集;
FROM 必填,跟表名,表示從哪個(gè)表查詢;指定多個(gè)表時(shí)用逗號(hào)隔開。
WHERE 可選,跟查詢條件;使用AND(邏輯與)和OR(邏輯或)可添加條件組合,
LIMIT 可選,對(duì)查詢結(jié)果進(jìn)行條數(shù)的限制,當(dāng)庫(kù)掃描表查詢結(jié)果等于limit值時(shí)將不再掃描。
OFFSET 可選,指定開始查詢的偏移量。
WHERE 查詢條件
? WHERE在語(yǔ)句中,可以指定查詢條件,可以使用AND或者OR指定一個(gè)或多個(gè)條件;他有如下操作符可供選擇,假設(shè) A = 10, B = 20,則:
| 操作符 | 描述 | 實(shí)例 |
|---|---|---|
| = | 等于 | (A = B) 返回false
|
| !=, <> | 不等于 | (A != B) 返回true
|
| > | 大于 | (A > B) 返回false
|
| < | 小于 | (A < B) 返回true
|
| >= | 大于等于 | (A >= B) 返回false
|
| <= | 小于等于 | (A <= B) 返回true
|
? 在常規(guī)的查詢操作中,使用主鍵來(lái)作為WHERE子句的查詢條件能夠提高很大查詢效率
SELECT f_code, f_name, f_type, f_cors_type
FROM t_label
WHERE f_type = 5 AND f_cors_type=1
LIMIT 30;
?
WHERE ... LIKE 模糊匹配
? 在WHERE中使用等號(hào)=來(lái)設(shè)定獲取數(shù)據(jù)的條件,MySQL支持使用LIKE子句替代 = 來(lái)實(shí)現(xiàn)模糊匹配,表示查詢數(shù)據(jù)源中包含查詢條件的記錄。
? LIKE通常和%一同使用,類似于一個(gè)元字符的搜索,同樣,可以使用 AND 或者 OR 來(lái)組合條件查詢。
SELECT f_code, f_name, f_type, f_source, f_cors_type
FROM t_iam_label
WHERE f_name LIKE '%負(fù)責(zé)人' AND f_cors_type=1
值得注意的是,如果沒(méi)有使用
%來(lái)修飾,如以上為LIKE '負(fù)責(zé)人',則效果等同于=,為精確匹配。
幾中常見的用法如下
| 用法 | 說(shuō)明 |
|---|---|
| ‘%A’ | 以A為結(jié)尾的數(shù)據(jù) |
| ‘A%’ | 以A為開頭的數(shù)據(jù) |
| ‘%A%’ | 含有a的數(shù)據(jù) |
| '_A_' | 三個(gè)字符且中間字母是A |
| '_A' | 兩位且以A結(jié)尾 |
| ‘A_’ | 兩位且以A開頭 |
| [AB] | 出現(xiàn)A或B |
| [^A] | 不出現(xiàn) A |
| [%] | 含字符%的數(shù)據(jù) (%識(shí)別為普通字符) |
?
UNION 操作符
? MySQL UNION 操作符用于連接兩個(gè)以上的 SELECT 語(yǔ)句的查詢結(jié)果組合到一個(gè)結(jié)果集合中。多個(gè) SELECT 語(yǔ)句會(huì)刪除重復(fù)的數(shù)據(jù)。語(yǔ)法如下:
SELECT field1, field2, ...fieldn
FROM table1
[WHERE condition]
UNION [ALL | DISTINCT]
SELECT fielda, fieldb, ...fieldn
FROM table2
[WHERE condition]
? ALL:可選,表示返回所有結(jié)果集,包含重復(fù)數(shù)據(jù)
? DISTINCT:可選,表示返回已過(guò)濾重復(fù)數(shù)據(jù)的結(jié)果集。注,UNION默認(rèn)會(huì)過(guò)濾重復(fù)數(shù)據(jù)。
需要注意的是,聯(lián)合的兩個(gè)表列數(shù)必須相同。以上案例均為n列。兩個(gè)select查詢可以查詢不同的表。查詢結(jié)果會(huì)被拼接成一個(gè)表。先寫的 select查詢結(jié)果在前。
?
ORDER_BY 排序
? 使用ORDER BY 子句來(lái)設(shè)定你想按哪個(gè)字段那種方式來(lái)進(jìn)行排序,再返回結(jié)果。
SELECT field1, field2, field3
FROM table1
ORDER BY field1 [ASC [DESC][默認(rèn)ASC]], [field2...] [ASC [DESC]]
? ASC:升序
? DESC:降序
? 你可以使用任何字段來(lái)作為排序條件,也可以設(shè)定多個(gè)字段來(lái)進(jìn)行排序,使用ASC來(lái)指定升序,或DESC來(lái)指定降序排列,默認(rèn)為ASC升序。
?
GROUP BY 分組
? GROUP BY 語(yǔ)句根據(jù)一個(gè)或多個(gè)列對(duì)結(jié)果集進(jìn)行分組。
? 在分組的列上可以使用COUNT,SUM,AVG 等函數(shù)
SELECT field1, field2, function(field3) as another_name
FROM table
WHERE field operator value
GROUP BY field
? function:COUNT,SUM,AVG等計(jì)算函數(shù),as表示將計(jì)算的結(jié)果重新命名
? WITH ROLLUP: 可以實(shí)現(xiàn)在分組統(tǒng)計(jì)數(shù)據(jù)基礎(chǔ)上再進(jìn)行相同的統(tǒng)計(jì)
?
# 聯(lián)表查詢
? 在MySQL中,使用JOIN來(lái)聯(lián)合查詢,JOIN按照功能可分為三類:
(0), 逗號(hào)連接
? 逗號(hào)連接其實(shí)也是內(nèi)連接(INNER JOIN),但其效率沒(méi)有內(nèi)連接使用的效率高
SELECT a.field1, a.field2, b.field1
FROM table1 a, table2 b
ON a.field3 = b.field3
(1)INNER JOIN 或 JOIN:內(nèi)連接或等值連接
?用來(lái)獲取兩個(gè)表中字段匹配的關(guān)系的記錄。
SELECT a.field1, a.field2, b.field1
FROM table1 a INNER JOIN table2 b
ON a.field3 = b.field3

(2)LEFT JOIN
? MySQLLEFT JOIN 與JOIN有所不同。 它會(huì)讀取左數(shù)據(jù)表的全部數(shù)據(jù),即便右數(shù)據(jù)表無(wú)對(duì)應(yīng)數(shù)據(jù)。
SELECT a.field1, a.field2, b.field1
FROM table1 a LEFT JOIN table2 b
ON a.field3 = b.field3

(3)RIGHT JOIN
? MySQL RIGHT JOIN 會(huì)讀取右邊數(shù)據(jù)表的全部數(shù)據(jù),即便左邊邊表無(wú)對(duì)應(yīng)數(shù)據(jù)。
SELECT a.field1, a.field2, b.field1
FROM table1 a RIGHT JOIN table2 b
ON a.field3 = b.field3

# 索引
? 索引的建立對(duì)于MySQL來(lái)說(shuō)很重要,他可以大大提高M(jìn)ySQL的檢索速度。
? 索引其實(shí)也是一張表,該表存儲(chǔ)了主鍵與索引字段,并指向?qū)嶓w表的記錄。適當(dāng)?shù)慕⑺饕梢源蟠筇岣吡藱z索速度,濫用則所降低更新表的速度。因?yàn)樵谑褂肐NSER、UPDATE、DELETE等命令時(shí),他們不僅需要更新表,還需要更新索引。
1. 普通索引
(1)創(chuàng)建一個(gè)基本的索引
CREATE INDEX indexName ON table1
如果是CHAR,VARCHAR類型,length可以小于字段實(shí)際長(zhǎng)度;如果是BLOB和TEXT類型,必須指定length
(2)為某個(gè)表添加索引(修改表結(jié)構(gòu))
ALTER table table1 ADD INDEX indexName(columnName)
(3)創(chuàng)建表的時(shí)候直接指定
CREATE TABLE mytable(
ID INT NOT NULL,
username VARCHAT(16) NOT NULL,
INDEX [indexName] (username(length))
)
(4)刪除索引
DROP INDEX [indexName] ON table1
?
2. 唯一索引
? 它與前面的普通索引類似,不同的就是:索引列的值必須唯一,但允許有空值。如果是組合索引,則列值的組合必須唯一。它有以下幾種創(chuàng)建方式:
(1)創(chuàng)建索引
CREATE UNIQUE INDEX indexName ON table1(username(length))
(2)為某個(gè)表添加索引 (修改表結(jié)構(gòu))
ALTER table mytable ADD UNIQUE [indexName] (username(length))
(3)創(chuàng)建表的時(shí)候直接指定
CREATE TABLE mytable(
ID INT NOT NULL,
username VARCHAT(16) NOT NULL,
UNIQUE [indexName] (username(length))
)
?
3. 使用 ALTER 命令添加和刪除索引
? 有四種方式添加索引
(1)添加一個(gè)主鍵,這意味著索引值必須是唯一的,且不能為NULL。
ALTER TABLE table1 ADD PRIMARY KEY (column_list)
(2)創(chuàng)建唯一索引,索引值必須唯一,可以為NULL,且NULL可能出現(xiàn)多次
ALTER TABLE table1 ADD UNIQUE index_name (column_list)
(3)添加普通索引,索引值可出現(xiàn)多次
ALTER TABLE table1 ADD INDEX index_name (column_list)
(4)創(chuàng)建全文索引 FULLTEXT
ALTER TABLE table1 ADD FULLTEXT index_name (column_list)
?
? 使用DROP來(lái)刪除索引
ALTER TABLE table1 DROP INDEX index_name;
?
4. 使用 ALTER 命令添加和刪除主鍵
(1)添加主鍵時(shí)需要先確保主鍵默認(rèn)不為空,在執(zhí)行ADD操作
ALTER TABLE table1 MODIFY i INT NOT NULL
ALTER TABLE testalter_tbl ADD PRIMARY KEY (i)
(2)刪除主鍵:刪除主鍵時(shí)只需指定PRIMARY KEY,但在刪除索引時(shí),你必須知道索引名
ALTER TABLE table1 DROP PRIMARY KEY
5. 顯示索引信息
? 你可以使用 SHOW INDEX 命令來(lái)列出表中的相關(guān)的索引信息。可以通過(guò)添加 \G 來(lái)格式化輸出信息。
SHOW INDEX FROM table1; \G
?
# 臨時(shí)表 TEMPORARY TABLE
? 臨時(shí)表只在當(dāng)前連接可見,當(dāng)關(guān)閉連接時(shí),Mysql會(huì)自動(dòng)刪除表并釋放所有空間。
創(chuàng)建一個(gè)臨時(shí)表
CREATE TEMPORARY TABLE table1 (
ID INT NOT NULL,
username VARCHAT(16) NOT NULL,
UNIQUE [indexName] (username(length))
)
? 使用SHOW TABLES命令顯示數(shù)據(jù)表列表時(shí),無(wú)法查看到臨時(shí)表。
刪除臨時(shí)表
? 刪除臨時(shí)表和刪除普通標(biāo)沒(méi)什么區(qū)別,使用DROP命令如下:
DROP TABLE table1
?
# 序列
? 序列是一組整數(shù):1, 2, 3, ...,由于一張數(shù)據(jù)表只能有一個(gè)自增字段即主鍵, 如果你想讓其他字段也實(shí)現(xiàn)自動(dòng)增加,就會(huì)使用到MySQL序列。
(1)使用 AUTO_INCREMENT
CREATE TEMPORARY TABLE table1 (
ID INT UNSIGNED NOT NULL AUTO_INCREMENT,
username VARCHAT(16) NOT NULL,
UNIQUE [indexName] (username(length))
)
(2)獲取AUTO_INCREMENT值
? 可以使用 SQL中的LAST_INSERT_ID( ) 函數(shù)來(lái)獲取最后的插入表中的自增列的值
(3)重置序列
? 此操作需要先刪除原有序列,再添加。如果在刪除的同時(shí)又有新記錄添加,有可能會(huì)出現(xiàn)數(shù)據(jù)混亂,因此庫(kù)不易變更時(shí)謹(jǐn)慎操作
ALTER TABLE insect DROP id;
ALTER TABLE insect
ADD id INT UNSIGNED NOT NULL AUTO_INCREMENT FIRST,
ADD PRIMARY KEY (id);
(4)設(shè)置序列的開始值
? 一般情況下序列的開始值為1,但如果你需要指定一個(gè)開始值100,那我們可以通過(guò)以下語(yǔ)句來(lái)實(shí)現(xiàn):
CREATE TABLE insect (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
PRIMARY KEY (id),
name VARCHAR(30) NOT NULL,
date DATE NOT NULL,
origin VARCHAR(30) NOT NULL
) engine=gee auto_increment=100 charset=utf8;
或者使用修改表的方式設(shè)置
ALTER TABLE t AUTO_INCREMENT = 100;
?
# 導(dǎo)出數(shù)據(jù)
? MySQL中你可以使用SELECT...INTO OUTFILE語(yǔ)句來(lái)簡(jiǎn)單的導(dǎo)出數(shù)據(jù)到文本文件上。
? 以下實(shí)例中我們將數(shù)據(jù)表 table1 數(shù)據(jù)導(dǎo)出到 /tmp/table1.txt 文件中:
SELECT * FROM table1
INTO OUTFILE '/tmp/table1.txt';
? 你可以通過(guò)命令選項(xiàng)來(lái)設(shè)置數(shù)據(jù)輸出的指定格式,以下實(shí)例為導(dǎo)出 CSV 格式:
SELECT * FROM passwd INTO OUTFILE '/tmp/runoob.txt'
FIELDS TERMINATED BY ',' ENCLOSED BY '"'
LINES TERMINATED BY '\r\n';
? 在下面的例子中,生成一個(gè)文件,各值用逗號(hào)隔開。這種格式可以被許多程序使用。
SELECT a,b,a+b INTO OUTFILE '/tmp/result.text'
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n'
FROM test_table;