======MySQL表相關操做===== 目錄: - 1、存儲引擎介紹 - 2、表介紹 - 3、建立表 - 4、查看錶結構 - 5、數據類型 - 6、表完整性約束 - 7、修改表ALTER TABLE - 8、複製表 - 9、刪除表 1、存儲引擎介紹 - 什麼是存儲引擎 - MySQL支持的存儲引擎 - 使用存儲引擎 存儲引擎即表類型,mysql根據不一樣的表類型會有不一樣的處理機制 - 什麼是存儲引擎 mysql中創建的庫===>文件夾 庫中創建的表===>文件 現實生活中咱們用來存儲數據的文件有不一樣的類型,每種文件類型對應各自不一樣的處理機制:好比處理文本用txt類型,處理表格用excel,處理圖片用png等 數據庫中的表也應該有不一樣的類型,表的類型不一樣,會對應mysql不一樣的存取機制,表類型又稱爲存儲引擎。 存儲引擎說白了就是如何存儲數據、如何爲存儲的數據創建索引和如何更新、查詢數據等技術的實現方 法。由於在關係數據庫中數據的存儲是以表的形式存儲的,因此存儲引擎也能夠稱爲表類型(即存儲和 操做此表的類型) 在Oracle 和SQL Server等數據庫中只有一種存儲引擎,全部數據存儲管理機制都是同樣的。而MySql 數據庫提供了多種存儲引擎。用戶能夠根據不一樣的需求爲數據表選擇不一樣的存儲引擎,用戶也能夠根據 本身的須要編寫本身的存儲引擎 SQL 解析器、SQL 優化器、緩衝池、存儲引擎等組件在每一個數據庫中都存在,但不是每 個數據庫都有這麼 多存儲引擎。MySQL 的插件式存儲引擎可讓存儲引擎層的開發人員設 計他們但願的存儲層,例如,有的應 用須要知足事務的要求,有的應用則不須要對事務有這 麼強的要求 ;有的但願數據能持久存儲,有的只但願 放在內存中,臨時並快速地提供對數據 的查詢。 - MySQL支持的存儲引擎 - show engines\G; #產看全部支持的存儲引擎 - show variables like 'storage_engine%'; #查看正在使用的存儲引擎 - MySQL存儲引擎介紹 - #InnoDB 存儲引擎 支持事務,其設計目標主要面向聯機事務處理(OLTP)的應用。其特色是行鎖設計、支持外鍵,並支 持相似 Oracle 的非鎖定讀,即默認讀取操做不會產生鎖。 從 MySQL 5.5.8 版本開始是默認 的存儲引擎。InnoDB 存儲引擎將數據放在一個邏輯的表空間中,這個表空間就像黑盒同樣由 InnoDB 存儲引擎自身來管理。從 MySQL 4.1(包括 4.1)版本開始,能夠將每一個 InnoDB 存儲引擎的 表單獨 存放到一個獨立的 ibd 文件中。此外,InnoDB 存儲引擎支持將裸設備(row disk)用 於創建其表空間。 InnoDB 經過使用多版本併發控制(MVCC)來得到高併發性,而且實現了 SQL 標準 的 4 種隔離級別,默認 爲 REPEATABLE 級別,同時使用一種稱爲 netx-key locking 的策略來 避免幻讀(phantom)現象的產生。 除此以外,InnoDB 存儲引擎還提供了插入緩衝(insert buffer)、二次寫(double write)、自適應哈希索 引(adaptive hash index)、預讀(read ahead) 等高性能和高可用的功能。 對於表中數據的存儲,InnoDB 存儲引擎採用了彙集(clustered)的方式,每張表都是按 主鍵的順序進行存儲的, 若是沒有顯式地在表定義時指定主鍵,InnoDB 存儲引擎會爲每一 行生成一個 6 字節的 ROWID,並以此做爲主鍵。 InnoDB 存儲引擎是 MySQL 數據庫最爲經常使用的一種引擎,Facebook、Google、Yahoo 等 公司的成功應用已經 證實了 InnoDB 存儲引擎具有高可用性、高性能以及高可擴展性。對其 底層實現的掌握和理解也須要時間和技術 的積累。若是想深刻了解 InnoDB 存儲引擎的工做 原理、實現和應用,能夠參考《MySQL 技術內幕:InnoDB 存儲引擎》一書。 - #MyISAM 存儲引擎 不支持事務、表鎖設計、支持全文索引,主要面向一些 OLAP 數 據庫應用,在 MySQL 5.5.8 版本以前是默認的存儲引擎(除 Windows 版本外)。 數據庫系統 與文件系統一個很大的不一樣在於對事務的支持,MyISAM 存儲引擎是不支持事務的。究其根 本,這也並不難理解。用戶在全部的應用中 是否都須要事務呢?在數據倉庫中,若是沒有 ETL 這些操做,只是簡單地經過報表查詢還須要事務的支持嗎?此外,MyISAM 存儲引擎的 另外一個與衆 不一樣的地方是,它的緩衝池只緩存(cache)索引文件,而不緩存數據文件,這與 大多數的數據庫都不相同。 - #NDB 存儲引擎 2003 年,MySQL AB 公司從 Sony Ericsson 公司收購了 NDB 存儲引擎。 NDB 存儲引擎是一個集羣存儲引擎,相似於 Oracle 的 RAC 集羣, 不過與 Oracle RAC 的 share everything 結構不一樣的是,其結構是 share nothing 的集羣架構,所以能提供更高級別的 高可用性。NDB 存 儲引擎的特色是數據所有放在內存中(從 5.1 版本開始,能夠將非索引數 據放在磁盤上),所以主鍵查找(primary key lookups)的速度極快,而且 可以在線添加 NDB 數據存儲節點(data node)以便線性地提升數據庫性能。因而可知,NDB 存儲引擎是高可用、 高性能、高可擴展性的數據庫集羣 系統,其面向的也是 OLTP 的數據庫應用類型。 - #Memory 存儲引擎 正如其名,Memory 存儲引擎中的數據都存放在內存中,數據庫重 啓或發生崩潰,表中的數據都將消失。它很是適合於存儲 OLTP 數據庫應用中臨時 數據的臨時表,也能夠做爲 OLAP 數據庫應用中數據倉庫的維度表。Memory 存儲引擎默認使用哈希 索引,而不是一般熟悉的 B+ 樹索引。 - #Infobright 存儲引擎 第三方的存儲引擎。其特色是存儲是按照列而非行的,所以很是 適合 OLAP 的數據庫應用。其官方網站是 http://www.infobright.org/,上面 有很多成功的數據 倉庫案例可供分析。 - #NTSE 存儲引擎 網易公司開發的面向其內部使用的存儲引擎。目前的版本不支持事務, 但提供壓縮、行級緩存等特性,不久的未來會實現面向內存的事務支持。 - #BLACKHOLE 黑洞存儲引擎,能夠應用於主備複製中的分發主庫。 MySQL 數據庫還有不少其餘存儲引擎,上述只是列舉了最爲經常使用的一些引擎。若是 你喜歡,徹底能夠編寫專屬於本身的引擎,這就是開源賦予咱們的能力,也是開源的魅 力所在。 - 使用存儲引擎 - 方法一:建表時指定 - create table innodb_t1(id int,name char)engine=innodb; - create table innodb_t2(id int)engine=innodb; - show create table innodb_t1; - show create table innodb_t2; - 方法二:在配置文件中指定默認的存儲引擎 /etc/my.cnf [mysqld] default-storage-engine=iNNODB innodb_file_pre=1 2、表介紹 -表至關於文件,表中的一條記錄就至關於文件的一行內容,不一樣的是,表中的一條記錄有對應的標題,稱爲表的字段。 3、建立表 -語法 create table 表名( 字段名1 類型(寬度) 約束條件, 字段名2 類型(寬度) 約束條件, ...... ); 注:表中最後一個字段不要加逗號 注意: - 在同一張表中,字段名是不能相同 - 寬度和約束條件可選 - 字段名和類型是必須得 4、產看錶結構 - describe 表名; #查看錶結構,可簡寫成爲 desc 表名 - show create table 表名\G; #查看錶詳細結構,可加\G 5、數據類型 - 介紹 - 數值類型 - 日期類型 - 字符創類型 - 枚舉類型與集合類型 - 介紹 - 存儲引擎決定了表的類型,而表內存放的數據也要有不一樣的類型,每種數據類型都有本身的寬度,但寬度是可選的 - MySQL經常使用數據類型概述 - 數字 - 整形:tinyinit int bigint - 小數: - float:在位數比較短的狀況下不許確 - double:在位數較長的狀況下不許確 - decimal:精確(若是是小數,則推薦使用decimal)-內部原理是以字符串的形式去存 - 字符串 - char(10):簡單粗暴,浪費空間,存儲速度塊 root存成root000000 - varchar:準確,節省空間,存儲速度慢 - sql優化: - 建立表時,定長的類型往前放,變長的日後放 - >255個字符,超了就把文件路徑存放在數據庫中 - 時間類型 - 最經常使用:datetime - 枚舉類型與集合類型 - 數據類型 - 整數類型 整數類型:TINYINT SMALLINT MEDIUMINT INT BIGINT 做用:存儲年齡,等級,id,各類號碼等 注:用zerofill測試整數類型的顯示寬度 create table t7(x int(3) zerofill); insert into t7 values(1),(11),(111),(1111); select * from t7; +------+ | x | +------+ | 001 | | 011 | | 111 | | 1111 | #超過寬度限制仍然能夠存 +------+ 注意:爲該類型指定寬度時,僅僅只是指定查詢結果的顯示寬度,與存儲範圍無關 其實咱們徹底不必爲整數類型指定顯示寬度,使用默認的就能夠了 默認的顯示寬度,都是在最大值的基礎上加1 int的存儲寬度是4個Bytes,即32個bit,即2**32 無符號最大值爲:4294967296-1 有符號最大值:2147483648-1 有符號和無符號的最大數字須要的顯示寬度均爲10,而針對有符號的最小值則須要11位才能顯示徹底,因此int類型默認的顯示寬度爲11是很是合理的 最後:整形類型,其實沒有必要指定顯示寬度,使用默認的就ok - 浮點數 定點數類型 DEC等同於DECIMAL 浮點類型:FLOAT DOUBLE 做用:存儲薪資、身高、體重、體質參數等 - 位類型(瞭解) BIT(M)能夠用來存放多位二進制數,M範圍從1~64,若是不寫默認爲1位。 注意:對於位字段須要使用函數讀取 bin()顯示爲二進制 hex()顯示爲十六進制 - 日期類型 DATE TIME DATETIME TIMESTAMP YEAR 做用:存儲用戶註冊時間,文章發佈時間,員工入職時間,出生時間,過時時間等 YEAR YYYY(1901/2155) DATE YYYY-MM-DD(1000-01-01/9999-12-31) TIME HH:MM:SS('-838:59:59'/'838:59:59') DATETIME YYYY-MM-DD HH:MM:SS(1000-01-01 00:00:00/9999-12-31 23:59:59 Y) TIMESTAMP YYYYMMDD HHMMSS(1970-01-01 00:00:00/2037 年某時) ============注意啦,注意啦,注意啦=========== 1. 單獨插入時間時,須要以字符串的形式,按照對應的格式插入 2. 插入年份時,儘可能使用4位值 3. 插入兩位年份時,<=69,以20開頭,好比50, 結果2050 >=70,以19開頭,好比71,結果1971 datetime與timestamp的區別 在實際應用的不少場景中,MySQL的這兩種日期類型都可以知足咱們的須要,存儲精度都爲秒,但在某些狀況下,會展示出他們各自的優劣。下面就來總結一下兩種日期類型的區別。 1.DATETIME的日期範圍是1001——9999年,TIMESTAMP的時間範圍是1970——2038年。 2.DATETIME存儲時間與時區無關,TIMESTAMP存儲時間與時區有關,顯示的值也依賴於時區。在mysql服務器,操做系統以及客戶端鏈接都有時區的設置。 3.DATETIME使用8字節的存儲空間,TIMESTAMP的存儲空間爲4字節。所以,TIMESTAMP比DATETIME的空間利用率更高。 4.DATETIME的默認值爲null;TIMESTAMP的字段默認不爲空(not null),默認值爲當前時間(CURRENT_TIMESTAMP),若是不作特殊處理,而且update語句中沒有指定該列的更新值,則默認更新爲當前時間。 - 字符串類型 #注意:char和varchar括號內的參數指的都是字符的長度 #char類型:定長,簡單粗暴,浪費空間,存取速度快 字符長度範圍:0-255(一箇中文是一個字符,是utf8編碼的3個字節) 存儲: 存儲char類型的值時,會往右填充空格來知足長度 例如:指定長度爲10,存>10個字符則報錯,存<10個字符則用空格填充直到湊夠10個字符存儲 檢索: 在檢索或者說查詢時,查出的結果會自動刪除尾部的空格,除非咱們打開pad_char_to_full_length SQL模式(SET sql_mode = 'PAD_CHAR_TO_FULL_LENGTH';) #varchar類型:變長,精準,節省空間,存取速度慢 字符長度範圍:0-65535(若是大於21845會提示用其餘類型 。mysql行最大限制爲65535字節,字符編碼爲utf-8:https://dev.mysql.com/doc/refman/5.7/en/column-count-limit.html) 存儲: varchar類型存儲數據的真實內容,不會用空格填充,若是'ab ',尾部的空格也會被存起來 強調:varchar類型會在真實數據前加1-2Bytes的前綴,該前綴用來表示真實數據的bytes字節數(1-2Bytes最大表示65535個數字,正好符合mysql對row的最大字節限制,即已經足夠使用) 若是真實的數據<255bytes則須要1Bytes的前綴(1Bytes=8bit 2**8最大表示的數字爲255) 若是真實的數據>255bytes則須要2Bytes的前綴(2Bytes=16bit 2**16最大表示的數字爲65535) 檢索: 尾部有空格會保存下來,在檢索或者說查詢時,也會正常顯示包含空格在內的內容 瞭解兩個函數 length:查看字節數 char_length:查看字符數 1. char填充空格來知足固定長度,可是在查詢時卻會很不要臉地刪除尾部的空格(裝做本身好像沒有浪費過空間同樣),而後修改sql_mode讓其現出原形 2. 雖然 CHAR 和 VARCHAR 的存儲方式不太相同,可是對於兩個字符串的比較,都只比 較其值,忽略 CHAR 值存在的右填充,即便將 SQL _MODE 設置爲 PAD_CHAR_TO_FULL_ LENGTH 也同樣,,但這不適用於like 3.總結: #InnoDB存儲引擎:建議使用VARCHAR類型 單從數據類型的實現機制去考慮,char數據類型的處理速度更快,有時甚至能夠超出varchar處理速度的50%。 但對於InnoDB數據表,內部的行存儲格式沒有區分固定長度和可變長度列(全部數據行都使用指向數據列值的頭指針),所以在本質上,使用固定長度的CHAR列不必定比使用可變長度VARCHAR列性能要好。 於是,主要的性能因素是數據行使用的存儲總量。因爲CHAR平均佔用的空間多於VARCHAR,所以使用VARCHAR來最小化須要處理的數據行的存儲總量和磁盤I/O是比較好的。 #其餘字符串系列(效率:char>varchar>text) TEXT系列 TINYTEXT TEXT MEDIUMTEXT LONGTEXT BLOB 系列 TINYBLOB BLOB MEDIUMBLOB LONGBLOB BINARY系列 BINARY VARBINARY text:text數據類型用於保存變長的大字符串,能夠組多到65535 (2**16 − 1)個字符。 mediumtext:A TEXT column with a maximum length of 16,777,215 (2**24 − 1) characters. longtext:A TEXT column with a maximum length of 4,294,967,295 or 4GB (2**32 − 1) characters. - 枚舉類型與集合類型 字段的值只能在給定範圍中選擇,如單選框,多選框 enum 單選 只能在給定的範圍內選一個值,如性別 sex 男male/女female set 多選 在給定的範圍內能夠選擇一個或一個以上的值(愛好1,愛好2,愛好3...) 枚舉類型(enum) An ENUM column can have a maximum of 65,535 distinct elements. (The practical limit is less than 3000.) 示例: CREATE TABLE shirts ( name VARCHAR(40), size ENUM('x-small', 'small', 'medium', 'large', 'x-large') ); INSERT INTO shirts (name, size) VALUES ('dress shirt','large'), ('t-shirt','medium'),('polo shirt','small'); 集合類型(set) A SET column can have a maximum of 64 distinct members. 示例: CREATE TABLE myset (col SET('a', 'b', 'c', 'd')); INSERT INTO myset (col) VALUES ('a,d'), ('d,a'), ('a,d,a'), ('a,d,d'), ('d,a,d'); 6、表完整性約束 下篇單獨介紹 7、修改表ALTER - 語法 - 修改表名 ALTER TABLE 表名 RENAME 新代表; - 增長字段 ALTER TABLE 表名 ADD 字段名 數據類型 [完整性約束條件...],ADD 字段名 數據類型 [完整性約束條件]; ALTER TABLE 表名 ADD 字段名 數據類型 [完整性約束條件...] FIRST; ALTER TABLE 表名 ADD 字段名 數據類型 [完整性約束條件...] AFTER 字段名; - 刪除字段 ALTER TABLE 表名 DROP 字段名; - 修改字段 ALTER TABLE 表名 MODIFY 字段名 數據類型 [完整性約束條件...]; ALTER TABLE 表名 CHANGE 舊字段名 新字段名 舊數據類型 [完整性約束條件...]; ALTER TABLE 表名 CHANGE 舊字段名 新字段名 新數據類型 [完整性約束條件...]; 例子: 1. 修改存儲引擎 mysql> alter table service -> engine=innodb; 2. 添加字段 mysql> alter table student10 -> add name varchar(20) not null, -> add age int(3) not null default 22; mysql> alter table student10 -> add stu_num varchar(10) not null after name; //添加name字段以後 mysql> alter table student10 -> add sex enum('male','female') default 'male' first; //添加到最前面 3. 刪除字段 mysql> alter table student10 -> drop sex; mysql> alter table service -> drop mac; 4. 修改字段類型modify mysql> alter table student10 -> modify age int(3); mysql> alter table student10 -> modify id int(11) not null primary key auto_increment; //修改成主鍵 5. 增長約束(針對已有的主鍵增長auto_increment) mysql> alter table student10 modify id int(11) not null primary key auto_increment; ERROR 1068 (42000): Multiple primary key defined mysql> alter table student10 modify id int(11) not null auto_increment; Query OK, 0 rows affected (0.01 sec) Records: 0 Duplicates: 0 Warnings: 0 6. 對已經存在的表增長複合主鍵 mysql> alter table service2 -> add primary key(host_ip,port); 7. 增長主鍵 mysql> alter table student1 -> modify name varchar(10) not null primary key; 8. 增長主鍵和自動增加 mysql> alter table student1 -> modify id int not null primary key auto_increment; 9. 刪除主鍵 a. 刪除自增約束 mysql> alter table student10 modify id int(11) not null; b. 刪除主鍵 mysql> alter table student10 -> drop primary key; 8、複製表 - 複製表結構+記錄 (key不會複製: 主鍵、外鍵和索引) mysql> create table new_service select * from service; 只複製表結構 mysql> select * from service where 1=2; //條件爲假,查不到任何記錄 Empty set (0.00 sec) mysql> create table new1_service select * from service where 1=2; Query OK, 0 rows affected (0.00 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> create table t4 like employees; 9、刪除表 - DROP TABLE 表名;