Mysql比知必會系列教程(五) --------mysql數據表操作

Mysql數據表操作

創建一個原本沒有的數據表:

create table if not exits語句,無需假設它需要用到的數據表是否存在。當存在一個相同的表名時用create table語句創建時就會出錯。所以使用 If not exits語句就不會有這些問題了。

臨時數據表

如果在數據表創建語句加入temporary關鍵字,服務器將創建一個臨時的數據表,當與服務器連接斷開時會自動消失。

create temporary table tab1_name…;

這樣做服務器會在客戶回話結束時自動刪除一個Temporary數據表,但也可以用完後顯式的進行刪除、一個temporary的數據表允許與一個永久性表名相同,只是在臨時表期間不能夠訪問原來的永久表數據(原來的表被隱藏了,只能訪問臨時表)。無法創建兩個同名的臨時表。如果使用連接池則與mysql的連接狀態會保持連接,這意味着創建的temporary數據表不一定會在應用程序結束時自動消失、

從其他數據表或查詢結果創建數據表

Create table … like 語句

創建一個新數據表作爲原始數據表的一份空白副本。將原來的數據表結構複製過來。包括數據列的所有屬性,索引內容。不能將原始數據表以外的數據列複製。

這時新的數據表是個空白的數據表需要用insert into selecte 語句進行填充數據,

create table new_table_name like tab1_name;

insert into new_table_name select * from tab1_name;

過濾一部分數據到數據表中

create table new_table_name like tab1_name;

insert into new_table_name select * from tab1_name where xxxx0 ;

create table … select語句

可以從任意一條select語句的查詢結果創建新的數據表。可以同時完成創建和填充新的數據,。

複製表數據

複製表數據時創建表

SELECT vale1, value2 into Table2 from Table1

SELECT INTO 語句從一個表複製數據,然後把數據插入到另一個新表中。

要求目標表Table2不存在,因爲在插入時會自動創建表Table2,並將Table1中指定字段數據複製到Table2中。示例如下:

select * into notes_note_migrate1 from notes_note where createatutc>=‘2019-7-1’;

複製表數據不創建表(新的表結構必須存在)

Insert into Table2(field1,field2,…) select value1,value2,… from Table1

要求目標表Table2必須存在,由於目標表Table2已經存在,所以我們除了插入源表Table1的字段外,還可以插入常量

提示

MySQL 數據庫不支持 SELECT … INTO 語句,但支持 INSERT INTO … SELECT

當然你可以使用以下語句來拷貝表結構及數據:

CREATE TABLE 新表
AS
SELECT * FROM 舊錶 

刪除數據表

Drop table tabe1_name;// 直接刪除

數據表創建索引

索引,加快對數據表內容的訪問速度的基本手段,尤其是涉及數據表的關聯查詢。

索引主要有以下幾個作用

  1. 即上述所說,索引能極大地減少掃描行數
  2. 索引可以幫助服務器避免排序和臨時表
  3. 索引可以將隨機 IO 變成順序 IO
索引分類

唯一索引:不允許索引項出現重複的值,對涉及一個數據列的索引不會包涵重複的值,對於多個數據列的索引(複合索引)就是這幾個數據列的值的組合在數據表的範圍內不能重複出現重複。
普通(非唯一)索引:允許索引值重複。

FullText索引:用來進行全文檢索,只適用於MyISAM數據表

SPATIAL索引:只適用於MyISAM數據表

hash索引:memory數據表的默認索引類型。也可以改用爲Btree索引代替這個默認索引。

索引類型:

普通索引:僅加速查詢

唯一索引:加速查詢 + 列值唯一(可以有null)

主鍵索引:加速查詢 + 列值唯一(不可以有null)+ 表中只有一個 每個數據表中只能有一個 PRIMARY key, 並且不可以爲NULL

組合索引:多列值組成一個索引,專門用於組合搜索,其效率大於索引合併

全文索引:對文本的內容進行分詞,進行搜索

ps.索引合併,使用多個單列索引組合搜索

覆蓋索引,select的數據列只用從索引中就能夠取得,不必讀取數據行,換句話說查詢列要被所建的索引覆蓋

可以使用alert table或create index語給數據表加索引。mysql內部會把create index語句映射爲alter table 操作。

alert table tab1_name add INDEX index_name

alert table tab1_name add UNIQUE index_name

alert table tab1_name add PRIMARY KEY (index_name)

alert table tab1_name add FullTEXT index_name

對於某個字符數據列的一個前綴編索引是col_name(n),n是代表的是索引包含列值的前n個字節(二進制字符串類型)或前n個字符(非二進制字符串類型)比如:alert table tab1_name add index_name(10),blob類型或text數據類型只能創建前綴索引。索引本身的長度等於構成索引的各個數據列的索引部分的長度總和。如果長度超出則可以使用縮短編排的前綴索引。

刪除索引:

刪除索引可以用Drop index或alert table語句來完成。

Drop index index_name on tb1_name;

alert table tab1_name drop index index_name;

同樣可以使用,show create table或者show index 查詢出索引。

索引的優點

索引大大減少了服務器需要掃描的數據量

索引可以幫助服務器避免排序和臨時表

索引將隨機I/O變爲順序I/O

索引並不是最好的工具,總的來說,只有當索引幫助存儲引擎快速查找到記錄帶來的好處大於其帶來的額外工作時,索引纔是有效。對於中大行的表,索引就非常有效。但對於特大型的表,建立和使用索引的代價隨之增長。

改變數據表的結構

alter table語句

alter table tab1_name action [,action] … ;

每一個action代表一個要修改的數據表字段

alter table mytab1 Modify i mediumint unsigned;

alter table mytab1 change i i mediumint unsigned;

change子句在改變時還可以重新命名。

alter table mytab1 change i k mediumint unsigned;

改變數據列時,同時指定字符集: alter table t modify c char(20) character set

使用alter table重新命名一個數據表。alter table tab_name rename new_tab_name;

alter table語句每次只能重新命名一個數據表,而rename語句可以一次重新命名多個數據表 rename table t1 to tmp,t2 to t1, tmp to t2

獲取數據庫元數據

各種的show語句

show databases;列出所有的數據庫。

show create database db_name;查看給定數據庫的 create databases 語句

show tables;show tables from db_name 列出數據表

show create table tb1_name; 查看數據表的 create table 語句

show columns from tab1_name;查看數據表了裏面的列

show index from tb1_name; 查看數據列或索引信息

describle tb1_name和 explain tb1_name 語句是show columns from tb1_name語句的同義詞。

show table status;show table status from db_name 查看默認數據庫或給定數據庫表的描述信息。

infomation_schema數據庫裏的數據

infomation_schema數據庫是以sql語言標準爲基礎。雖然一部分是mysql特有的,優於show語句的可移植性。

infomation_schame數據庫可想像爲是一個虛擬的數據庫是一些由不同的數據庫元數據構成的視圖。

show tables in infomation_schema;

輸出以下結果:

CHARACTER_SETS :所支持的字符集
COLLATIONS :每種字符集的排序方式
COLLATION_CHARACTER_SET_APPLICABILITY :每種排序方式與他的字符集的映射關係信息
COLUMNS :數據列
COLUMN_PRIVILEGES
ENGINES :存儲引擎
EVENTS :數據庫事件
FILES : 關於NDB硬盤數據文件的信息。
GLOBAL_STATUS
GLOBAL_VARIABLES :全局變量
KEY_COLUMN_USAGE :數據列的約束條件信息
OPTIMIZER_TRACE
PARAMETERS
PARTITIONS :數據庫分區
PLUGINS :服務插件信息
PROCESSLIST :服務器內執行的線程信息。
PROFILING
REFERENTIAL_CONSTRAINTS :外鍵的信息
ROUTINES :存儲例程(store routine)
SCHEMATA :數據庫
SCHEMA_PRIVILEGES
SESSION_STATUS
SESSION_VARIABLES
STATISTICS :關於數據表索引特性的信息
TABLES :數據表
TABLESPACES
TABLE_CONSTRAINTS : 數據表的約束條件
TABLE_PRIVILEGES
TRIGGERS :觸發器
USER_PRIVILEGES ::全局的權限
VIEWS :視圖
INNODB_LOCKS
INNODB_TRX
INNODB_SYS_DATAFILES
INNODB_FT_CONFIG
INNODB_SYS_VIRTUAL
INNODB_CMP
RDS_EVENTS_THREADS_WAITS_CURRENT
INNODB_CMP_RESET
INNODB_CMP_PER_INDEX
INNODB_CMPMEM_RESET
INNODB_FT_DELETED
INNODB_BUFFER_PAGE_LRU
INNODB_LOCK_WAITS
INNODB_TEMP_TABLE_INFO
INNODB_SYS_INDEXES
INNODB_SYS_TABLES
INNODB_SYS_FIELDS
INNODB_CMP_PER_INDEX_RESET
INNODB_BUFFER_PAGE
INNODB_FT_DEFAULT_STOPWORD
INNODB_FT_INDEX_TABLE
INNODB_FT_INDEX_CACHE
INNODB_SYS_TABLESPACES
INNODB_METRICS
INNODB_SYS_FOREIGN_COLS
INNODB_CMPMEM
INNODB_BUFFER_POOL_STATS
INNODB_SYS_COLUMNS
INNODB_SYS_FOREIGN
INNODB_SYS_TABLESTATS
RDS_PROCESSLIST
INNODB_FT_BEING_DELETED

infomation_schema數據庫往往可以通過一些騷操作快速處理一些sql:

比如:
select * from information_schema.INNODB_TRX #查看當前運行的所有事務
select * from information_schema.INNODB_LOCKS # 當前出現的鎖
SELECT * from information_schema.INNODB_LOCK_WAITS # 鎖等待的對應的關係
快速查出各數據表tabals中的信息:
SELECT
TABLE_NAME,
TABLE_ROWS
FROM
information_schema.TABLES
WHERE
TABLE_SCHEMA = ‘Db名稱’;
快速查出數據列的信息:
select table_name,column_name,column_type,column_key,column_comment from information_schema.Columns
where table_schema=‘Db’

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章