MySQL「查詢/聯(lián)表查詢/索引/序列/導(dǎo)出」

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
內(nèi)連接查詢結(jié)果集
(2)LEFT JOIN

? MySQLLEFT JOINJOIN有所不同。 它會(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
左連接查詢結(jié)果集
(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
由連接查詢結(jié)果集

# 索引

? 索引的建立對(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)度;如果是BLOBTEXT類型,必須指定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;
最后編輯于
?著作權(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ù)。

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