MySQL的庫表的詳細操做

一.庫操做

一、建立數據庫

    1.1 語法html

      CREATE DATABASE 數據庫名 charset utf8;前端

    1.2 數據庫命名規則python

      能夠由字母、數字、下劃線、@、#、$mysql

      區分大小寫sql

      惟一性數據庫

      不能使用關鍵字如 create selectwindows

      不能單獨使用數字緩存

      最長128位安全

基本上跟python或者js的命名規則同樣服務器

二、數據庫相關操做

    也是一些基本操做。

1.查看數據庫
show databases;
show create database db1;
select database();

2.選擇數據庫
USE 數據庫名

3.刪除數據庫
DROP DATABASE 數據庫名;

4.修改數據庫
alter database db1 charset utf8;
庫的基本操做

 

二.表操做

一、存儲引擎

存儲引擎即表類型,mysql根據不一樣的表類型會有不一樣的處理機制,關於存儲引擎的介紹:

 

 

InnoDB引擎
        介紹:InnoDB引擎是MySQL數據庫的另外一個重要的存儲引擎,正稱爲目前MySQL AB所發行新版的標準,被包含在全部二進制安裝包裏。和其餘的存儲引擎相比,InnoDB引擎的優勢是支持兼容ACID的事務(相似於PostGreSQL),以及參數完整性(即對外鍵的支持)。Oracle公司與2005年10月收購了Innobase。Innobase採用雙認證受權。它使用GNU發行,也容許其餘想將InnoDB結合到商業軟件的團體得到受權。
InnoDB引擎特色:
        1.支持事務:支持4個事務隔離界別,支持多版本讀。
        2.行級鎖定(更新時通常是鎖定當前行):經過索引實現,全表掃描仍然會是表鎖,注意間隙鎖的影響。
        3.讀寫阻塞與事務隔離級別相關(有多個級別)。
        4.具體很是高效的緩存特性:能緩存索引,也能緩存數據。
        5.整個表和主鍵與Cluster方式存儲,組成一顆平衡樹。(瞭解)
        6.全部SecondaryIndex都會保存主鍵信息。(瞭解)
        7.支持分區,表空間,相似oracle數據庫。
        8.支持外鍵約束,不支持全文索引(5.5以前),之後的都支持了。
        9.和MyISAM引擎比較,InnoDB對硬件資源要求仍是比較高的。
        小結:三個重要功能:Supports transactions,row-level locking,and foreign keys.
InnoDB引擎適用的生產業務場景
        1.須要事務支持(具備較好的事務特性,例銀行業務)
        2.行級鎖定對高併發有很好的適應能力,但須要確保查詢是經過索引完成。
        3.數據更新較爲頻繁的場景,如:BBS(論壇)、SNS(社交平臺)、微博等
        4.數據一致性要求較高的業務,例如:充值轉帳,銀行卡轉帳。
        5.硬件設備內存較大,能夠利用InnoDB較好的緩存能力來提升內存利用率,儘量減小磁盤IO,能夠經過一些參數來設置
        6.相比MyISAM引擎,Innodb引擎更消耗資源,速度沒有MyISAM引擎快
InnoDB引擎調優精要
        1.主鍵儘量小,避免給Secondery index帶來過大的空間負擔。
        2.避免全表掃描,由於會使用表鎖。
        3.儘量緩存全部的索引和數據,提升響應速度,較少磁盤IO消耗。
        4.在大批量小插入的時候,儘可能本身控制事務而不要使用autocommit自動提交,有開關能夠控制提交方式。
        5合理設置innodb_flush_log_at_trx_commit參數值,不要過分追求安全性。
        若是innodb_flush_log_at_trx_commit的值爲0,log buffer每秒就會被刷寫日誌文件到磁盤,提交事務的時候不作任何操做。
        6.避免主鍵更新,由於這會帶來大量的數據移動。
        能夠看一看InnoDB的重要參數。
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 存儲引擎》一書。

事務介紹:
        簡單地說,事務就是指邏輯上的一組SQL語句操做,組成這組操做的各個SQL語句,執行時要麼全成功要麼全失敗。
        例如:你給我轉帳5塊錢,流程以下
            a.從你銀行卡取出5塊錢,剩餘計算money-5
            b.把上面5塊錢打入個人帳戶上,我收到5塊,剩餘計算money+5.
        上述轉帳的過程,對應的sql語句爲:
                update 你_account set money=money-5 where name='';
                update 我_account set money=money+5 where name='';
        上述的兩條SQL操做,在事務中的操做就是要麼都執行,要麼都不執行,否則錢就對不上了。
        這就是事務的原子性(Atomicity)。
    事務的四大特性:
        1.原子性(Atomicity)
            事務是一個不可分割的單位,事務中的全部SQL等操做要麼都發生,要麼都不發生。
        2.一致性(Consistency)
            事務發生前和發生後,數據的完整性必須保持一致。
        3.隔離性(Isolation)
            當併發訪問數據庫時,一個正在執行的事務在執行完畢前,對於其餘的會話是不可見的,多個併發事務之間的數據是相互隔離的。也就是其餘人的操做在這個事務的執行過程當中是看不到這個事務的執行結果的,也就是他們拿到的是這個事務執行以前的內容,等這個事務執行完才能拿到新的數據。
        4.持久性(Durability)
            一個事務一旦被提交,它對數據庫中的數據改變就是永久性的。若是出了錯誤,事務也不允撤銷,只能經過'補償性事務'。
事務的開啓:
        數據庫默認事務是自動提交的,也就是發一條sql他就執行一條。若是想多條sql放在一個事務中執行,則須要使用事務進行處理。當開啓一個事務,而且沒有提交,mysql會自動回滾事務,或者使用rollback命令手動回滾事務。
        可自學mysql官方手冊,收穫更多。
InnoDB引擎

 

二、表介紹

表至關於文件,表中的一條記錄就至關於文件中的一行內容,表的一條記錄有對應的標題,稱爲表的字段。  

第一行的id、name二、age是字段,,其他的,一行內容稱爲一條記錄。

三、建立表

建表語法    

#語法:
create table 表名(
字段名1 類型[(寬度) 約束條件],
字段名2 類型[(寬度) 約束條件],
字段名3 類型[(寬度) 約束條件]
);

#注意:
1. 在同一張表中,字段名是不能相同
2. 寬度和約束條件可選、非必須,寬度指的就是字段長度約束,例如:char(10)裏面的10
3. 字段名和類型是必須的#語法:
create table 表名(
字段名1 類型[(寬度) 約束條件],
字段名2 類型[(寬度) 約束條件],
字段名3 類型[(寬度) 約束條件]
);

#注意:
1. 在同一張表中,字段名是不能相同
2. 寬度和約束條件可選、非必須,寬度指的就是字段長度約束,例如:char(10)裏面的10
3. 字段名和類型是必須的
mysql> create database db1 charset utf8;

mysql> use db1;

mysql> create table t1(  
    -> id int, 
    -> name varchar(50),
    -> sex enum('male','female'),
    -> age int(3)
    -> );

mysql> show tables; #查看db1庫下全部表名

mysql> desc t1;
+-------+-----------------------+------+-----+---------+-------+
| Field | Type                  | Null | Key | Default | Extra |
+-------+-----------------------+------+-----+---------+-------+
| id    | int(11)               | YES  |     | NULL    |       |
| name  | varchar(50)           | YES  |     | NULL    |       |
| sex   | enum('male','female') | YES  |     | NULL    |       |
| age   | int(3)                | YES  |     | NULL    |       |
+-------+-----------------------+------+-----+---------+-------+

mysql> select id,name,sex,age from t1;
Empty set (0.00 sec)

mysql> select * from t1;
Empty set (0.00 sec)

mysql> select id,name from t1;
Empty set (0.00 sec)
mysql> insert into t1 values
    -> (1,'chao',18,'male'),
    -> (2,'sb',81,'female')
    -> ;
mysql> select * from t1;
+------+------+------+--------+
| id   | name | age  | sex    |
+------+------+------+--------+
|    1 | chao |   18 | male   |
|    2 | sb |   81 | female |
+------+------+------+--------+

mysql> insert into t1(id) values 
    -> (3),
    -> (4);
mysql> select * from t1;
+------+------+------+--------+
| id   | name | age  | sex    |
+------+------+------+--------+
|    1 | chao |   18 | male   |
|    2 | sb |   81 | female |
|    3 | NULL | NULL | NULL   |
|    4 | NULL | NULL | NULL   |
+------+------+------+--------+
建表語法

 

四、查看錶結構

mysql> describe t1; #查看錶結構,可簡寫爲:desc 表名
+-------+-----------------------+------+-----+---------+-------+
| Field | Type                  | Null | Key | Default | Extra |
+-------+-----------------------+------+-----+---------+-------+
| id    | int(11)               | YES  |     | NULL    |       |
| name  | varchar(50)           | YES  |     | NULL    |       |
| sex   | enum('male','female') | YES  |     | NULL    |       |
| age   | int(3)                | YES  |     | NULL    |       |
+-------+-----------------------+------+-----+---------+-------+
mysql> show create table t1\G; #查看錶詳細結構,可加\G
查看錶結構

 

五、MySQL的基礎數據類型

mysql經常使用數據類型概覽:

#1. 數字:
    整型:tinyinit  int  bigint
    小數:
        float :在位數比較短的狀況下不精準
        double :在位數比較長的狀況下不精準
            0.000001230123123123
            存成:0.000001230000

        decimal:(若是用小數,則用推薦使用decimal)
            精準
            內部原理是以字符串形式去存
#2. 字符串:
    char(10):簡單粗暴,浪費空間,存取速度快
        root存成root000000
    varchar:精準,節省空間,存取速度慢

    sql優化:建立表時,定長的類型往前放,變長的日後放
                    好比性別           好比地址或描述信息

    >255個字符,超了就把文件路徑存放到數據庫中。
            好比圖片,視頻等找一個文件服務器,數據庫中只存路徑或url。
#3. 時間類型:
    最經常使用:datetime
#4. 枚舉類型與集合類型
View Code

 

數值類型

(1)整數類型

整數類型:TINYINT,SMALLINT,MEDIUMINT,INT,BIGINT

做用:存儲年齡,等級,id,各類號碼等

tinyint[(m)] [unsigned] [zerofill]

小整數,數據類型用於保存一些範圍的整數數值範圍:
有符號:
-128 ~ 127
無符號:
0 ~ 255

PS: MySQL中無布爾值,使用tinyint(1)構造。
int[(m)][unsigned][zerofill]
整數,數據類型用於保存一些範圍的整數數值範圍:
有符號:
-2147483648 ~ 2147483647
無符號:
0 ~ 4294967295

bigint[(m)][unsigned][zerofill]
大整數,數據類型用於保存一些範圍的整數數值範圍:
有符號:
-9223372036854775808 ~ 9223372036854775807
無符號:0  ~  18446744073709551615
有符號和無符號tinyint
    1.tinyint默認爲有符號
        mysql> create table t1(x tinyint); #默認爲有符號,即數字前有正負號
        mysql> desc t1;
        mysql> insert into t1 values
            -> (-129),
            -> (-128),
            -> (127),
            -> (128);
        mysql> select * from t1;
        +------+
        | x    |
        +------+
        | -128 | #-129存成了-128
        | -128 | #有符號,最小值爲-128
        |  127 | #有符號,最大值127
        |  127 | #128存成了127
        +------+
2.設置無符號tinyint
        mysql> create table t2(x tinyint unsigned);
        mysql> insert into t2 values
            -> (-1),
            -> (0),
            -> (255),
            -> (256);
        mysql> select * from t2;
        +------+
        | x    |
        +------+
        |    0 | -1存成了0
        |    0 | #無符號,最小值爲0
        |  255 | #無符號,最大值爲255
        |  255 | #256存成了255
        +------+
有符號無符號tinyint

注意:對於整型來講,數據類型後面的寬度並非存儲長度限制,而是顯示限制,假如:int(8),那麼顯示時不夠8位則用0來填充,夠8位則正常顯示,經過zerofill來測試,存儲長度仍是int的4個字節長度。默認的顯示寬度就是可以存儲的最大的數據的長度,好比:int無符號類型,那麼默認的顯示寬度就是int(10),有符號的就是int(11),由於多了一個符號,因此沒有必要指定整數類型的數據,不必指定寬度,由於默認的就可以將存的原始數據徹底顯示。

 

int的存儲寬度是4個Bytes,即32個bit,即2**32 無符號最大值爲:4294967296-1 有符號最大值:2147483648-1 有符號和無符號的最大數字須要的顯示寬度均爲10,而針對有符號的最小值則須要11位才能顯示徹底,因此int類型默認的顯示寬度爲11是很是合理的,最後:整形類型,其實沒有必要指定顯示寬度,使用默認的就ok

(2)浮點型

定點數類型 DEC,等同於DECIMAL   浮點類型:FLOAT DOUBLE 做用:存儲薪資、身高、溫度、體重、體質參數等

1.FLOAT[(M,D)] [UNSIGNED] [ZEROFILL]
定義:
單精度浮點數(非準確小數值),m是整數部分+小數部分的總個數,d是小數點後個數。m最大值爲255,d最大值爲30,例如:float(255,30)
有符號:
-3.402823466E+38 to -1.175494351E-38,
1.175494351E-38 to 3.402823466E+38
無符號:
1.175494351E-38 to 3.402823466E+38
精確度: 
**** 隨着小數的增多,精度變得不許確 ****
2.DOUBLE[(M,D)] [UNSIGNED] [ZEROFILL]
定義:
雙精度浮點數(非準確小數值),m是整數部分+小數部分的總個數,d是小數點後個數。m最大值也爲255,d最大值也爲30
有符號:
-1.7976931348623157E+308 to -2.2250738585072014E-308
2.2250738585072014E-308 to 1.7976931348623157E+308
無符號:
2.2250738585072014E-308 to 1.7976931348623157E+308
精確度:
****隨着小數的增多,精度比float要高,但也會變得不許確 ****
3.decimal[(m[,d])] [unsigned] [zerofill]
定義:
準確的小數值,m是整數部分+小數部分的總個數(負號不算),d是小數點後個數。 m最大值爲65,d最大值爲30。比float和double的整數個數少,可是小數位數都是30位
精確度:
**** 隨着小數的增多,精度始終準確 ****
對於精確數值計算時須要用此類型
decimal可以存儲精確值的緣由在於其內部按照字符串存儲。
精度從高到低:decimal、double、float
    decimal精度高,可是整數位數少
    float和double精度低,可是整數位數多
float已經知足絕大多數的場景了,可是什麼導彈、航線等要求精度很是高,因此仍是須要按照業務場景自行選擇,若是又要精度高又要整數位數多,那麼能夠直接用字符串來存。

mysql> create table t1(x float(256,31));
ERROR 1425 (42000): Too big scale 31 specified for column 'x'. Maximum is 30.
mysql> create table t1(x float(256,30));
ERROR 1439 (42000): Display width out of range for column 'x' (max = 255)
mysql> create table t1(x float(255,30)); #建表成功
Query OK, 0 rows affected (0.02 sec)

mysql> create table t2(x double(255,30)); #建表成功
Query OK, 0 rows affected (0.02 sec)

mysql> create table t3(x decimal(66,31));
ERROR 1425 (42000): Too big scale 31 specified for column 'x'. Maximum is 30.
mysql> create table t3(x decimal(66,30));
ERROR 1426 (42000): Too-big precision 66 specified for 'x'. Maximum is 65.
mysql> create table t3(x decimal(65,30)); #建表成功
Query OK, 0 rows affected (0.02 sec)

mysql> show tables;
+---------------+
| Tables_in_db1 |
+---------------+
| t1            |
| t2            |
| t3            |
+---------------+
3 rows in set (0.00 sec)
mysql> insert into t1 values(1.1111111111111111111111111111111); #小數點後31個1
Query OK, 1 row affected (0.01 sec)

mysql> insert into t2 values(1.1111111111111111111111111111111);
Query OK, 1 row affected (0.00 sec)

mysql> insert into t3 values(1.1111111111111111111111111111111);
Query OK, 1 row affected, 1 warning (0.01 sec)

mysql> select * from t1; #隨着小數的增多,精度開始不許確
+----------------------------------+
| x                                |
+----------------------------------+
| 1.111111164093017600000000000000 |
+----------------------------------+
1 row in set (0.00 sec)

mysql> select * from t2; #精度比float要準確點,但隨着小數的增多,一樣變得不許確
+----------------------------------+
| x                                |
+----------------------------------+
| 1.111111111111111200000000000000 |
+----------------------------------+
1 row in set (0.00 sec)

mysql> select * from t3; #精度始終準確,d爲30,因而只留了30位小數
+----------------------------------+
| x                                |
+----------------------------------+
| 1.111111111111111111111111111111 |
+----------------------------------+
1 row in set (0.00 sec)
浮點型

 

(3)位類型

BIT(M)能夠用來存放多位二進制數,M範圍從1~64,若是不寫默認爲1位。注意:對於位字段須要使用函數讀取 bin()顯示爲二進制 hex()顯示爲十六進制

mysql> create table t9(id bit);
mysql> desc t9; #bit默認寬度爲1
+-------+--------+------+-----+---------+-------+
| Field | Type   | Null | Key | Default | Extra |
+-------+--------+------+-----+---------+-------+
| id    | bit(1) | YES  |     | NULL    |       |
+-------+--------+------+-----+---------+-------+
mysql> insert into t9 values(8);
mysql> select * from t9; #直接查看是沒法顯示二進制位的
+------+
| id   |
+------+
|     |
+------+
mysql> select bin(id),hex(id) from t9; #須要轉換才能看到
+---------+---------+
| bin(id) | hex(id) |
+---------+---------+
| 1       | 1       |
+---------+---------+
mysql> alter table t9 modify id bit(5);
mysql> insert into t9 values(8);
mysql> select bin(id),hex(id) from t9;
+---------+---------+
| bin(id) | hex(id) |
+---------+---------+
| 1       | 1       |
| 1000    | 8       |
+---------+---------+
位類型

 

(4)日期類型

類型:DATE,TIME,DATETIME ,IMESTAMP,YEAR 做用:存儲用戶註冊時間,文章發佈時間,員工入職時間,出生時間,過時時間等

YEAR:
YYYY(範圍:1901/2155)2018
DATE:
YYYY-MM-DD(範圍:1000-01-01/9999-12-31)例:2018-01-01 
TIME:
HH:MM:SS(範圍:'-838:59:59'/'838:59:59')例:12:09:32
DATETIME:
YYYY-MM-DD HH:MM:SS(範圍:1000-01-01 00:00:00/9999-12-31 23:59:59    Y)例: 2018-01-01 12:09:32
TIMESTAMP:
YYYYMMDD HHMMSS(範圍:1970-01-01 00:00:00/2037 年某時)
============注意啦,注意啦,注意啦===========
    1. 單獨插入時間時,須要以字符串的形式,按照對應的格式插入
    2. 插入年份時,儘可能使用4位值
    3. 插入兩位年份時,<=69,以20開頭,好比50,  結果2050      
                    >=70,以19開頭,好比71,結果1971

mysql的日期格式對字符串採用的是'放鬆'政策,能夠以字符串的形式插入。
在實際應用的不少場景中,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語句中沒有指定該列的更新值,則默認更新爲當前時間。 
mysql> create table t1(x datetime not null default now()); # 須要指定傳入空值時默認取當前時間
Query OK, 0 rows affected (0.01 sec)

mysql> create table t2(x timestamp); # 無需任何設置,在傳空值的狀況下自動傳入當前時間
Query OK, 0 rows affected (0.02 sec)

mysql> insert into t1 values();
Query OK, 1 row affected (0.00 sec)

mysql> insert into t2 values();
Query OK, 1 row affected (0.00 sec)

mysql> select * from t1;
+---------------------+
| x                   |
+---------------------+
| 2018-07-07 01:26:14 |
+---------------------+
1 row in set (0.00 sec)

mysql> select * from t2;
+---------------------+
| x                   |
+---------------------+
| 2018-07-07 01:26:17 |
+---------------------+
1 row in set (0.00 sec)
舉例:
mysql> create table t6(d1 year ,d2 date,d3 datetime);
Query OK, 0 rows affected (1.75 sec)
mysql> insert into t6 values(now(),now(),now());
Query OK, 1 row affected, 1 warning (0.12 sec)
mysql> select * from t6;

工做中通常都用datetime就能夠了。
日期類型

 

(5)字符串類型

類型:char,varchar 做用:名字,信息等等 做用:名字,信息等等

#官網:https://dev.mysql.com/doc/refman/5.7/en/char.html
#注意:char和varchar括號內的參數指的都是字符的長度
#char類型:定長,簡單粗暴,浪費空間,存取速度快
    字符長度範圍:0-255(一箇中文是一個字符,是utf8編碼的3個字節)
    存儲:存儲char類型的值時,會往右填充空格來知足長度
        例如:指定長度爲10,存>10個字符則報錯(嚴格模式下),存<10個字符則用空格填充直到湊夠10個字符存儲
    檢索:在檢索或者說查詢時,查出的結果會自動刪除尾部的空格,若是想看到它補全空格以後的內容,除非打開pad_char_to_full_length SQL模式(SET sql_mode = 'strict_trans_tables,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)
    檢索:尾部有空格會保存下來,在檢索或者說查詢時,也會正常顯示包含空格在內的內容

下面來進行一些測試,在測試以前,須要學一下mysql提供的兩個方法:
length(字段):查看該字段數據的字節長度
char_length(字段):查看該字段數據的字符長度
sql模式:注意,必定要用嚴格模式

模式設置和修改(以解決上述問題爲例):
方式一:先執行select @@sql_mode,複製查詢出來的值並將其中的NO_ZERO_IN_DATE,NO_ZERO_DATE刪除,而後執行set sql_mode = '修改後的值'或者set session sql_mode='修改後的值';,例如:set session sql_mode='STRICT_TRANS_TABLES';改成嚴格模式 #session能夠不用寫
此方法只在當前會話中生效,關閉當前會話就不生效了。
方式二:先執行select @@global.sql_mode,複製查詢出來的值並將其中的NO_ZERO_IN_DATE,NO_ZERO_DATE刪除,而後執行set global sql_mode = '修改後的值'。
此方法在當前服務中生效,從新MySQL服務後失效
方法三:在mysql的安裝目錄下,或my.cnf文件(windows系統是my.ini文件),新增 sql_mode = STRICT_TRANS_TABLES
添加my.cnf以下:
[mysqld]            sql_mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER
char和varchar性能對比:
以char(5)和varchar(5)來比較,加入要存三我的名:sb,ssb1,ssbb2
char:優勢:簡單粗暴,無論是多長的數據,就按照規定的長度來存,5個5個的存,三我的名就會相似這種存儲:sb ssb1 ssbb2,中間是空格補全,取數據的時候5個5個的取,簡單粗暴速度快
缺點:貌似浪費空間,而且未來存儲的數據的長度可能會良莠不齊
varchar:varchar類型不定長存儲數據,更爲精簡和節省空間
     例如存上面三我的名的時候相似因而這樣的:sbssb1ssbb2,連着的,若是這樣存,請問這三我的名還怎麼取出來,varchar在存數據的時候,會在每一個數據前面加上一個頭,這個頭是1-2個bytes的數據,這個數據指的是後面跟着的這個數據的長度,1bytes能表示2**8=256,兩個bytes表示2**16=65536,能表示0-65535的數字,因此varchar在存儲的時候是這樣的:1bytes+sb+1bytes+ssb1+1bytes+ssbb2,因此存的時候會比較麻煩,致使效率比char慢,取的時候也慢,先拿長度,再取數據。
優勢:節省了一些硬盤空間,一個acsii碼的字符用一個bytes長度就能表示,可是也並不必定比char省,看一下官網給出的一個表格對比數據,當存的數據正好是規定的字段長度的時候,varchar反而佔用的空間比char要多。
Value    CHAR(4)    Storage Required    VARCHAR(4)    Storage Required
''    '    '    4 bytes    ''    1 byte
'ab'    'ab  '    4 bytes    'ab'    3 bytes
'abcd'    'abcd'    4 bytes    'abcd'    5 bytes
'abcdefgh'    'abcd'    4 bytes    'abcd'    5 bytes
缺點:存取速度都慢
總結:因此須要根據業務需求來選擇用哪一種類型來存
其實在多數的用戶量少的工做場景中char和varchar效率差異不是很大,最起碼給用戶的感知不是很大,而且其實軟件級別的慢遠比不上硬件級別的慢,因此公司的運維發現項目慢的時候會加內存、換nb的硬盤,項目的效率提高的會不少,可是做爲專業人士,應該提出來這樣的技術點來提升效率。
可是對於InnoDB數據表,內部的行存儲格式沒有區分固定長度和可變長度列(全部數據行都使用指向數據列值的頭指針),所以在本質上,使用固定長度的CHAR列不必定比使用可變長度VARCHAR列性能要好。於是,主要的性能因素是數據行使用的存儲總量。因爲CHAR平均佔用的空間多於VARCHAR,所以使用VARCHAR來最小化須要處理的數據行的存儲總量和磁盤I/O是比較好的。因此,兩個選哪一個均可以,若是是大型併發項目,追求高性能的時候,須要結合服務器的硬件環境來進行測試,看一下char和varchar哪一個更好,這也能算一個優化的點。
字符串類型,嚴格模式

 

(6)枚舉類型與集合類型

字段的值只能在給定範圍中選擇,如單選框,多選框,若是在應用程序或者前端不作選項限制,在MySQL的字段裏面也能作限制 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')
 mysql> create table consumer( 
    -> name varchar(50),
    -> sex enum('male','female'),
    -> level enum('vip1','vip2','vip3','vip4','vip5'), #在指定範圍內,多選一
    -> hobby set('play','music','read','study') #在指定範圍內,多選多
    -> );
    mysql> insert into consumer values  
        -> ('xiaogui','male','vip5','read,study'),
        -> ('taibai','female','vip1','girl');
    mysql> select * from consumer;
    +------+--------+-------+------------+
    | name | sex    | level | hobby      |
    +------+--------+-------+------------+
    | xiaogui | male   | vip5  | read,study |
    | taibai | female | vip1  |            |
    +------+--------+-------+------------+
枚舉與集合類型

 

六、表的完整性約束2

約束條件與數據類型的寬度同樣,都是可選參數 做用:用於保證數據的完整性和一致性 主要分爲:

PRIMARY KEY (PK)    標識該字段爲該表的主鍵,能夠惟一的標識記錄
FOREIGN KEY (FK)    標識該字段爲該表的外鍵
NOT NULL    標識該字段不能爲空
UNIQUE KEY (UK)    標識該字段的值是惟一的
AUTO_INCREMENT    標識該字段的值自動增加(整數類型,並且爲主鍵)
DEFAULT    爲該字段設置默認值
UNSIGNED 無符號
ZEROFILL 使用0填充

說明:
1. 是否容許爲空,默認NULL,可設置NOT NULL,字段不容許爲空,必須賦值
2. 字段是否有默認值,缺省的默認值是NULL,若是插入記錄時不給字段賦值,此字段使用默認值
sex enum('male','female') not null default 'male'
age int unsigned NOT NULL default 20 必須爲正值(無符號) 不容許爲空 默認是20
3. 是不是key
主鍵 primary key
外鍵 foreign key
索引 (index,unique...)
View Code

 

(1)not null與default
是否可空,null表示空,非字符串 not null - 不可空 null - 可空 默認值,建立列時能夠指定默認值,當插入數據時若是未主動設置,則自動添加默認值 完整性約束

create table t1(name char(10) not null);
create table t1(name char(10) not null default 'xx');
注意一點:若是是非嚴格模式,int類型不傳值的話會默認爲0,由於null不是int類型的,字段是int類型,因此他會自動將null變爲0
(2)unique
獨一無二,惟一屬性:id,身份證號等 是一種key,惟一鍵,是在數據類型以外的附加屬性,其實還有加速查詢的做用 unique #惟一,字段數據不能重複

create table t1(name char(10) unique);
(3)primary key
主鍵primary key是innodb存儲引擎組織數據的依據,innodb稱之爲索引組織表,一張表中必須有且只有一個主鍵。 一個表中能夠:單列作主鍵,多列作主鍵(複合主鍵或者叫作聯合主鍵) primary key #主鍵 約束效果:不爲空且惟一 not null + unique

create table t1(id int primary key);
(4)auto_increment
約束字段爲自動增加,被約束的字段必須同時被key約束,也就是說只能給約束成key的字段加自增屬性,默認起始位置爲1,步長也爲1. auto_increment 自增
create table t1(id int primary key auto_increment); 前面必須是個key
 

 (5)foreign key
foreign key #外鍵 創建表關係使用的約束條件

多對一 (一對多)
​
在多的表裏面添加一個字段,並給這個字段加foreign key,好比:
出版社對應書籍是多對一的關係
1.先建立出版社表  publish表
2.建立書籍表,外鍵寫法:
    create table book(
        id int primary key,
        name char(10),
        pid int,
        foreign key(pid) references publish(id)
        );
3.先給出版社插入數據
一對一關係
學生表(student)和客戶表(customer)
create table student(
        id int primary key,
        name char(10),
        cid int unique,
        foreign key(cid) references customer(id)
        );
多對多關係:
做者表和書籍表
須要藉助第三張表來完整二者的關係記錄
第三張表後建立
create table authortobook(
        id int primary key,
        author_id int,
        book_id int,
        foreign key(author_id) references author1(id),
        foreign key(book_id) references book1(id)
        );

  七、修改表 alter table

    簡單看一下,都是固定的語法格式,按照這個寫就好了,毫無邏輯可言

語法:
1. 修改表名
      ALTER TABLE 表名 
                          RENAME 新表名;

2. 增長字段
      ALTER TABLE 表名
                          ADD 字段名  數據類型 [完整性約束條件…], #注意這裏能夠經過逗號來分割,一下添加多個約束條件
                          ADD 字段名  數據類型 [完整性約束條件…];
      ALTER TABLE 表名
                          ADD 字段名  數據類型 [完整性約束條件…]  FIRST; #添加這個字段的時候,把它放到第一個字段位置去。
      ALTER TABLE 表名
                          ADD 字段名  數據類型 [完整性約束條件…]  AFTER 字段名;#after是放到後的這個字段的後面去了,咱們經過一個first和一個after就能夠將新添加的字段放到表的任意字段位置了。
                            
3. 刪除字段
      ALTER TABLE 表名 
                          DROP 字段名;

4. 修改字段
      ALTER TABLE 表名 
                          MODIFY  字段名 數據類型 [完整性約束條件…];
      ALTER TABLE 表名 
                          CHANGE 舊字段名 新字段名 舊數據類型 [完整性約束條件…];  #change比modify還多了個更名字的功能,這一句是隻改了一個字段名
      ALTER TABLE 表名 
                          CHANGE 舊字段名 新字段名 新數據類型 [完整性約束條件…];#這一句除了改了字段名,還改了數據類型、完整性約束等等的內容

給一個字段添加外鍵屬性的語句:alter table 表2名 add foreign key(表2的一個字段) references 表1名(表1的一個字段);

    注意一點:在mysql裏面表名是不區分大小寫的,若是你將一個名爲t1的(小寫的t1)更名爲一個T1(大寫的T1),是徹底沒用的,由於在數據庫裏面表名都是小寫的。
示例:
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;
View Code

 

  

 

    八、複製表

     經過select查詢出來的結果既有表結構又有表記錄(數據),在從新建立一個和它同樣的表的時候,以前用create還須要本身將表結構寫好,而後把那些數據插入到新建的表中,很麻煩,那麼就能夠直接使用mysql提供的複製表的功能:(複製表用的不多,瞭解一下就好了)


    語法:複製表結構+記錄 (key不會複製: 主鍵、外鍵和索引)
    mysql> create table new_service select * from service;#這句話的意思是你從service表裏面查詢出來的數據不要在屏幕上打印了,你直接給個人新表new_service

    寫個例子:

      

       雖然不能複製key,可是能夠給他加回去啊:alter table xxx

      

 

    只複製表結構,不要數據
    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; #獲取用like能夠達到這個效果

相關文章
相關標籤/搜索