1. 程式人生 > >day44 資料庫學習

day44 資料庫學習

---恢復內容開始---

  今天學習了資料庫的建表語句、資料型別和約束

  一、建表語句

  create table  表名(

  欄位名 資料型別[(長度) 約束條件]

  )

  []代表可選的

  為什麼需要給資料分類?

  1、描述資料更加準確

  2、節省記憶體空間

  二、資料型別

    整數型別

    預設有符號的 設定為無符號的

      1、create table t2(age tinyint unsigned);

      2、建表後用alter修改

 

  對於整數型別而言長度不是資料所佔的位元組數 是顯示資料時的寬度(字元數)

  預設情況下 儲存的數值的十進位制位數 小於所設定的顯示寬度時 不會填充 沒有任何效果

  加上zerofull 指定當儲存的數值的十進位制位數 小於所設定的顯示寬度時 用0來填充

  當資料的十進位制長度 大於顯示寬度 可以正常顯示

  主要記住 整型後面的長度的含義 有字元是不同的

    tinyint、smallint、mediumint、int、bigint

  總結:除了儲存範圍沒啥區別

    都是整型

    預設有符號

    對於顯示寬度 原理是相同的

    長度引數如果不指定 會有預設值

 

  嚴格模式

    什麼是嚴格模式 對插入的資料嚴格要求 不在範圍內直接報錯 例如往tinyint中插入大於255的值將報錯

    什麼是非嚴格模式 不對插入的資料嚴格要求 不在範圍內也可以儲存 儲存的當前型別最大支援的值

    5.6預設是非嚴格模式

    5.7以後預設嚴格模式

 

    檢視SQL模式

      select @@sql_mode

      show variables like "sql_mode":

    修改SQL模式

      set @@sql_mode = "值";

    正常情況不需要改

 

    浮點型別

      float 4位元組

      double 8位元組

      decimal 不固定

      create table t9(num float(m,d))

      m 表示總長度 d表示小數部分的長度

      長度表示不是資料儲存範圍 而是字元長度

      10.12 總長為4  小數部分為2

 

      各個型別的最大長度

      float  (255,30)

      double  (255,30)

      decimal  (65,30)

 

      區別:

        float與double的精度不同 都是不準確的小數

        decimal 準確的小數 不會丟失精度

 

      具體使用哪種型別得根據使用場景判斷

      float滿足大部分使用場景

      decimal適合銀行系統 科學研究等

      

      括號中m和d的值 可以限制資料儲存範圍 與整型不同

      重點:記住m和d的含義

 

    字串型別

      常用兩種

      char 定長字串

      varchar 可變長度字串

      注意字串 長度指定的是資料的字元長度  與位元組沒關係

    

      create table t13(c1 char,c2 varchar(10));

      在建立時 varchar必須指定長度 char有預設值

      

      不同點:

        a char(3) b char(3)

        A  |B  |

        char型別在取資料時 就根據長度來獲取 不關心真實資料長度

        無論這資料有多長 佔用的空間是固定的 造成了一定空間浪費

 

        a varchar(30) b varchar(30)

        (1)A(1)B 

        varchar型別在取資料時 先獲取資料長度 在根據長度獲取真是資料 關心真是資料長度

        先儲存長度需要一個位元組 再儲存真實資料 不會浪費空間

        但是 由於需要計算資料的長度 所以存取速度會比定長慢

         相同點:

        括號中的數字 都是表示儲存最大字元長度

      char使用評率最高

      mysql會在儲存資料時自動將資料末尾的空格去掉

      如果必須要存空格 需要修改sql_mode 增加 PAD_CHAR_TO_FULL__LENGTH 意思是把空格當作有效資料

      由於自動去除空格這個機制 在使用等於符號 和like是有區別

        select *from t1 where name = "yh        "; 會自動去除空格

        select *from t1 where name like "yh     ";不會自動去除空格

        like 用於模糊匹配  使用%表示0或任意個字元 使用_表示一個任意字元

 

    日期和時間

      year、time、date、datetime、timestamp

      timestamp特點是:可以給null 自動輸入當前時間 當這條記錄被修改了會自動更新當前時間

 

    列舉

      enum 可以指定一堆字串的值 在插入資料時 資料必須是這堆字串中的其中一個("男的","女的") 多選一

    集合

      set 可以指定一堆字串的值 在插入資料時 資料必須是這堆字串中的其中一個或多個("男的","女的") 多選多

    共同點:資料都是字串型別

 

  3、約束

    是一種對資料的限制

      已經學習過的  資料型別 unsigned無符號 字串長度 浮點的長度

    約束的作用是為了保證資料的正確性,完整性

    額外的約束:

      NOT NULL 非空約束 限制該字元的值不能為空

      UNIQUE 唯一性約束  限制該欄位的值是唯一的不能出現重複

      DEFAULT  預設值約束  如果插入資料時沒有指定該欄位的值則使用預設值

      PRIMARY KEY 主鍵約束 如果插入資料時沒有指定該欄位的值則使用預設值

      FOREIGN KEY 外來鍵約束 用來指向另一個表的主鍵

      

      每一個表都應該有一個主鍵 需要唯一標識  否則可能出現完全相同的兩個資料 無法區分

      UNIQUE 不能重複 但是可以為空 這樣也不能唯一標識

      UNIQUE NOT NULL 不能為空唯一 可以唯一標識一條資料 書寫順序無所謂

 

      UNIQUE NOT NULL 與 主鍵的區別

        UNIQUE NOT NULL 不能被其他表引用(不能作為其他表的外來鍵)

        UNIQUE NOT NULL 約束一個表中可以有多個 但是主鍵只能有一個

      手動修改自動增長計數

      alter table 表名 auto_increment 新的值:

      注意:如果新的值小於當前的最大值 是無效的

      通常建一個表就要建一個主鍵 主鍵的型別通常是整型

      insert 語句

        insert into 表名 values(值1,值n,.....)

        要求值的順序 個數 必須與表字段完全對應

      另一種寫法

        insert into 表名(欄位名1,欄位名n,.....) values(值1,值n,.....)

        可以選擇性的插入某些欄位 要求值的順序 必須與表名後面宣告的欄位一致      

      

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

---恢復內容結束---