1. 程式人生 > >python學習的第43天資料型別、索引、insert

python學習的第43天資料型別、索引、insert

一、資料型別作用

資料之所以分類,是因為生活中的資料就存在不同型別,使用相應的型別可以更 加準確的描述事物

1.描述資料更加準確2.節省記憶體空間

二、資料型別:

1、整型型別:

預設有符號的
設定為無符號
1.create table t2(age tinyint unsigned);
2.建表後用alter修改

重點區分:

 對於整數型別而言長度不是資料所佔的位元組數 是顯示資料時的寬度(字元數)
預設情況下 儲存的數值的十進位制位數 小於所設定的顯示寬度時 不會填充 沒有任何效果
加上zerofill 指定當儲存的數值的十進位制位數 小於所設定的顯示寬度時 用0來填充
當資料的十進位制位長度 大於顯示寬度 可以正常顯示
主要記住 整型後面的長度的含義 有字元是不同的

    tinyint
    smallint
    mediumint
    int  *****
    bigint

總結:除了儲存範圍沒啥區別,都是整型,預設有符號,對於顯示寬度,原理是相同的,

長度引數如果不知道會有預設值

2、嚴格模式

什麼是嚴格模式 對插入的資料嚴格要求 不再範圍內直接報錯 例如往tinyint中插入大於255的值將報錯
什麼是非嚴格模式 不 對插入的資料嚴格要求 不再範圍內也可以儲存 儲存的當前型別最大支援的值
5.6預設是非嚴格模式
5.7以後預設嚴格模式

    檢視SQL模式
        select @@sql_mode;
        show variables like 
"sql_mode"; 修改SQL模式 set @@sql_mode = ""; 正常情況不需要改

3、浮點型

        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的含義

4、字串型別

常用兩種char 定長字串、charvarchar 可變長度字串
注意字串中 長度指定的是資料的字元長度 與位元組沒關係

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或任意個任意字元 使用_表示一個任意字元

5、日期和時間

        year
        time
        date
        datetime  *****
        timestamp *****

 

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

 

6、

列舉:

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

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

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

7、約束

(1)什麼是約束:為了防⽌在資料表中插⼊錯誤的資料,在MySQL中,定義了⼀些維護資料庫完整性的 規則,這個規則就是表的約束。通過這些約束我們可以保證資料的正確性。

(2)主鍵約束:當我們的資料庫中儲存了成千上萬條資料時,如何能找到你需要的那條資料呢? MySQL提供的主鍵約束即可幫助我們快速的查詢到我們想要的資料,當然這個特性 任何一個數據庫都提供。 主鍵是唯一標識一條記錄的,可以把它比喻為身份證號,儘管全世界有那麼多人, 但只要知道了身份證號就可以很快的查詢一個人的資訊。

 

(3)非空約束

非空約束所對應的列在插入資料時不允許為空,也就是必須為該欄位賦值, MySQL中使⽤NOT NULL來表時非空約束其語法為:

CREATE TABLE money(time DATATIME,money int NOT NULL);

在money表中存放錢的操作記錄,五論是增加減少都有金額,如果沒有金額那麼這條資料 沒有任何意義,這個時候我們就可以使非空來進行約束。

(4)唯一約束

唯一約束用於保證資料表中欄位的唯一性,即表中欄位不可以出現重複的值, 唯一約束通過UNIQUE來指定,其語法格式為:

CREATE TABLE person(id int UNIQUE,age INT);

在上述表中id就是一個唯一的欄位,它的值不允許出現重複的。

(5)預設值約束

在一些應用場景下,我們會希望對每一條資料中的某個欄位賦予一個預設值, 例如:在⼀些遊戲中,每個賬號預設會贈送給使用者一定數量的金幣,此時金幣 這個資料就可以使用預設值約束了,MySQL中使用DEFALUT 為欄位指定預設值 其語格式為:

CREATE TABLE user(account CHAR(20),password CHAR(6),money INT DEFALUT 1000);

當在user表中新增一條記錄並且沒有給money欄位賦值時money的值就是預設的1000。

(6)外來鍵約束:略

(7)自動增長

主鍵具有唯一性,通常是一個整型資料,我們在新增資料時,需要手動指定主 鍵的值,一旦插入了已經存在的值會引發主鍵衝突錯誤,這時我們就需要花 時間去獲取一個正確的主鍵值,這是非常低效的。

為此 MySQL提供了手動增長約束。 作用: 手動為這一列賦值,在每一次新增新的資料時該值都會自增,預設從1開 始。

注意: 該約束只能建立在帶有索引的整型欄位上

 

 

三、索引

索引:用於加速查詢
InnoDB 中 索引是樹形結構
為了提高查詢效率 InnoDB為找一個不為空 且唯一的欄位作為主鍵
如果表中不存在這樣的欄位 會自動幫你建一個隱藏主鍵欄位 但是無法提升查詢效率

只要是使用innoDB 就應該為每個表指定一個非空 且唯一的欄位
InnoDB阻止資料時 首先使用主鍵 如果沒有主鍵 找一個非空且唯一 如果也沒有 建一個隱藏欄位

 

四、insert

insert into 表名 values(值1,值n,....)
要求值得順序 個數 必須與表字段完全對應
另一種寫法
insert into 表名(欄位名1,欄位名n,....) values(值1,值n,....)
可以選擇性得插入某些欄位 要求值得順序 必須與表名後面宣告得欄位一致