bcp out 带列名导出_从零开始学习 MySQL 系列索引、视图、导入和导出
閱讀本文大概需要 8?分鐘
前言上篇文章我們學(xué)習(xí)了數(shù)據(jù)庫和數(shù)據(jù)表操作語句,今天我們學(xué)習(xí)下數(shù)據(jù)庫索引,視圖,導(dǎo)入和導(dǎo)出的知識。作為基礎(chǔ)篇,不會涉及到關(guān)于索引和視圖的高級應(yīng)用和核心概念,但是基本操作大家會了解,尤其是關(guān)于索引的內(nèi)容,學(xué)會建立恰當(dāng)?shù)乃饕梢源蟠筇岣邤?shù)據(jù)庫的查詢效率,后續(xù)會深入拓展相關(guān)知識,敬請關(guān)注呀~(想看看周末還有多少愛學(xué)習(xí)的小伙伴,你們在哪里呀,O(∩_∩)O哈哈~)1、目錄索引
視圖
導(dǎo)入
導(dǎo)出
2、步驟
在正式開始本實驗內(nèi)容之前,需要先下載相關(guān)代碼。
該代碼可以新建一個數(shù)據(jù)庫,名為 mysql_shiyan ,并在 mysql_shiyan 數(shù)據(jù)庫中建 4 個表(department,employee,project,table_1),然后向其中插入數(shù)據(jù)。
其中創(chuàng)建數(shù)據(jù)庫和數(shù)據(jù)表語句可以在這里下載。
git?clone?https://github.com/rongweihe/MoreThanCode/tree/master/mysql_shiyan/SQL;下載完成后,輸入命令開啟 MySQL 服務(wù)并使用 root 用戶登錄:#打開 MySQL 服務(wù)sudo service mysql start#使用 root 用戶登錄mysql?-u?root下載的 SQL6 目錄下,有兩個文件 MySQL-06.sql 和 in.txt,其中第一個文件用于創(chuàng)建數(shù)據(jù)庫并向其中插入數(shù)據(jù),第二個文件用于測試數(shù)據(jù)導(dǎo)入功能。如果之前的數(shù)據(jù)庫還存在,首先把 mysql_shiyan 數(shù)據(jù)庫刪掉,執(zhí)行命令:source?/home/MySQL_05_01.sql;輸入命令運行第一個文件,搭建數(shù)據(jù)庫并插入數(shù)據(jù):mysql>?source?/home/mysql_sql/SQL6/MySQL-06.sql;
3、索引
索引是一種可以提高數(shù)據(jù)庫檢索速度的一種數(shù)據(jù)結(jié)構(gòu)。它的作用相當(dāng)于一本書的目錄,可以根據(jù)目錄中的頁碼快速找到需要的內(nèi)容。
當(dāng)表中有大量記錄的時候,若需要對表進(jìn)行查詢,沒有索引的情況下,走的是全表搜索;將所有記錄一一取出,和查詢條件進(jìn)行對比,然后返回滿足條件的記錄。
這樣的方式會執(zhí)行大量磁盤 I/O 操作,并花費大量數(shù)據(jù)庫系統(tǒng)的時間。
而如果在表中已經(jīng)建立索引,在索引中找到符合查詢條件的索引值,通過索引值就可以快速找到表中的數(shù)據(jù),可以大大地加快查詢的速度
對一張表中的某個列建立索引,有以下兩種語句格式:
ALTER?TABLE?表名字?ADD?INDEX?索引名?(列名);CREATE?INDEX?索引名?ON?表名字?(列名);我們用這兩種語句分別建立索引:
ALTER?TABLE?employee?ADD?INDEX?idx_id?(id);??#在employee表的id列上建立名為idx_id的索引CREATE?INDEX?idx_name?ON?employee?(name);???#在employee表的name列上建立名為idx_name的索引索引的效果是加快查詢速度,當(dāng)表中數(shù)據(jù)不夠多的時候是感受不出它的效果的。這里我們使用命令 SHOW INDEX FROM 表名字; 查看剛才新建的索引:
在使用 SELECT 語句查詢的時候,語句中 WHERE 里面的條件,會自動判斷有沒有可用的索引。
比如有一個用戶表,它擁有用戶名(username)和個人簽名(note)兩個字段。其中用戶名具有唯一性,并且格式有一定的限制,我們給用戶名加上一個唯一索引;個性簽名格式多變,而且允許不同用戶使用重復(fù)的簽名,不加任何索引。
這時候,如果要查找某一用戶,使用語句
?select?*?from?user?where?username=??和?select?*?from?user?where?note=??性能是有很大差距的,對建立了索引的用戶名進(jìn)行條件查詢會比沒有索引的個性簽名條件查詢快幾倍,在數(shù)據(jù)量大的時候,這個差距會更大。
但是也要注意:一些字段不適合創(chuàng)建索引,比如性別,這個字段存在大量的重復(fù)記錄,索引帶來的效率在這里就不太合適,甚至?xí)侠蹟?shù)據(jù)庫,導(dǎo)致數(shù)據(jù)冗余和額外的 CPU 開銷。
具體原因涉及到聚集索引和非聚集索引,我們后面在深入展開。
比如下面的例子:可以看到相同的 sql,加索引之后比不加索引慢許多。
4、視圖
視圖是從一個或多個表中導(dǎo)出來的表,是一種虛擬存在的表。它就像一個窗口,通過這個窗口可以看到系統(tǒng)專門提供的數(shù)據(jù),這樣,用戶可以視圖是從一個或多個表中導(dǎo)出來的表,是一種虛擬存在的表。
它就像一個窗口,通過這個窗口可以看到系統(tǒng)專門提供的數(shù)據(jù),這樣,用戶可以不用看到整個數(shù)據(jù)庫中的數(shù)據(jù),而只關(guān)心對自己有用的數(shù)據(jù)。
注意理解視圖是虛擬的表:
數(shù)據(jù)庫中只存放了視圖的定義,而沒有存放視圖中的數(shù)據(jù),這些數(shù)據(jù)存放在原來的表中;
使用視圖查詢數(shù)據(jù)時,數(shù)據(jù)庫系統(tǒng)會從原來的表中取出對應(yīng)的數(shù)據(jù);
視圖中的數(shù)據(jù)依賴于原來表中的數(shù)據(jù),一旦表中數(shù)據(jù)發(fā)生改變,顯示在視圖中的數(shù)據(jù)也會發(fā)生改變;
在使用視圖的時候,可以把它當(dāng)作一張表。
創(chuàng)建視圖的語句格式為:
CREATE?VIEW?視圖名(列a,列b,列c)?AS?SELECT?列1,列2,列3?FROM?表名字;可見創(chuàng)建視圖的語句,后半句是一個 SELECT 查詢語句,所以視圖也可以建立在多張表上,只需在 SELECT 語句中使用子查詢或連接查詢。
現(xiàn)在我們創(chuàng)建一個簡單的視圖,名為 v_emp,包含 v_name,v_age,v_phone 三個列:
CREATE?VIEW?v_emp?(v_name,v_age,v_phone)?AS?SELECT?name,age,phone?FROM?employee;5、導(dǎo)入
我們來學(xué)習(xí)一下,如何導(dǎo)入一個純數(shù)據(jù)文件,該文件中將包含與數(shù)據(jù)表字段相對應(yīng)的多條數(shù)據(jù),這樣可以快速導(dǎo)入大量數(shù)據(jù),除此之外,還有可以用 SQL 語句的導(dǎo)入方式,語法為:source *.sql 這是實驗中經(jīng)常用到的。
兩者之間的不同是:數(shù)據(jù)文件導(dǎo)入方式只包含數(shù)據(jù),導(dǎo)入規(guī)則由數(shù)據(jù)庫系統(tǒng)完成;SQL 文件導(dǎo)入相當(dāng)于執(zhí)行該文件中包含的 SQL 語句,可以實現(xiàn)多種操作,包括刪除,更新,新增,甚至對數(shù)據(jù)庫的重建。
數(shù)據(jù)文件導(dǎo)入,可以把一個文件里的數(shù)據(jù)保存進(jìn)一張表。
導(dǎo)入語句格式為:
LOAD?DATA?INFILE?'文件路徑和文件名'?INTO?TABLE?表名字;現(xiàn)在 SQL6 目錄下有一個名為 in.txt 的文件,我們嘗試把這個文件中的數(shù)據(jù)導(dǎo)入數(shù)據(jù)庫 mysql_shiyan 的 employee 表中。
由于導(dǎo)入導(dǎo)出大量數(shù)據(jù)都屬于敏感操作,根據(jù) mysql 的安全策略,導(dǎo)入導(dǎo)出的文件都必須在指定的路徑下進(jìn)行,在 mysql 終端中查看路徑變量:(我這里設(shè)置了任意目錄可以導(dǎo)入)
注意到 secure_file_priv 變量指定安全路徑 ,要導(dǎo)入數(shù)據(jù)文件,需要將該文件移動到安全路徑下。
secure-file-priv 參數(shù)是用來限制mysql導(dǎo)入導(dǎo)出到哪個目錄的。
查閱官方文檔找到secure-file-priv的值有以下幾種情況:
使用命令 vim SQL6/in.txt 查看 in.txt 文件中的內(nèi)容:
可以看到其中僅僅包含了數(shù)據(jù)本身,沒有任何的 SQL 語句
再使用以下命令以 root 用戶登錄數(shù)據(jù)庫,再連接 mysql_shiyan 數(shù)據(jù)庫:
查看一下沒有導(dǎo)入數(shù)據(jù)之前,employee 表中的數(shù)。
現(xiàn)在執(zhí)行導(dǎo)入語句,文件中的數(shù)據(jù)成功導(dǎo)入 employee 表:
6、導(dǎo)出
導(dǎo)出與導(dǎo)入是相反的過程,是把數(shù)據(jù)庫某個表中的數(shù)據(jù)保存到一個文件之中。導(dǎo)出語句基本格式為:
SELECT?列1,列2?INTO?OUTFILE?'文件路徑和文件名'?FROM?表名字;注意:語句中 “文件路徑” 之下不能已經(jīng)有同名文件。
如果導(dǎo)出報錯,可能是 MySQL 沒有權(quán)限對相應(yīng)目錄進(jìn)行操作, 查看系統(tǒng)變量 tmpdir, 如下所示,tmpdir 變量指定路徑為 /tmp。
現(xiàn)在我們把整個 employee 表的數(shù)據(jù)導(dǎo)出到 /var/tmp/mysql-files/ 目錄下,導(dǎo)出文件命名為 out.txt 具體語句為:
SELECT?*?INTO?OUTFILE?'/var/tmp/mysql-files/out.txt'?FROM?employee;用 vim 可以查看導(dǎo)出文件?/var/tmp/mysql-files/out.txt 的內(nèi)容:也可以使用 sudo cat /var/tmp/mysql-files/out.txt 命令查看。
數(shù)據(jù)導(dǎo)出成功。
7、總結(jié)
在本節(jié)實驗中我們學(xué)習(xí)了索引、視圖、導(dǎo)入和導(dǎo)出的知識。
今天的學(xué)習(xí)就到這里啦。
如果各位老鐵感覺寫的不錯,歡迎點在看、留言哦。
祝大家周末愉快~
PS:如果大家在閱讀的過程中,有什么建議和看法,非常歡迎在下方留言,每個留言我都會認(rèn)真看的。
參考:
https://www.shiyanlou.com/courses/9
—?【 THE END 】—本公眾號全部博文已整理成一個目錄,請在公眾號里回復(fù)「m」獲取!3T技術(shù)資源大放送!包括但不限于:Java、C/C++,Linux,Python,大數(shù)據(jù),人工智能等等。在公眾號內(nèi)回復(fù)「1024」,即可免費獲取!!
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的bcp out 带列名导出_从零开始学习 MySQL 系列索引、视图、导入和导出的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: access驱动程序_Linux驱动程序
- 下一篇: linux cmake编译源码,linu