目錄
一. 常用的數據類型
1.數值類型
1.1 整形類型
?1.2 浮點型類型
2.字符串類型
char和varchar的區別
如何選擇char和varchar
3.日期類型
4.二進制類型
二. 表的操作
1.查看所有表
2.表的創建
3.查看表的結構
4.表的修改
4.1 添加新的列
?4.2 修改表中現有的列
?4.3 刪除表中現有的列
4.4 重命名表中現有的列
?4.5 重命名當前表
5.表的刪除
一. 常用的數據類型
在我們日常開發中最用的MySQL數據類型有:數值類型、字符串類型、日期型類型、二進制類型,MySQL中的數據類型和我們之前學習的java中的基本類型是類似的,都是用來存儲不同類型的數據,接下來我們分別來認識一下這些類型的特點。
1.數值類型
1.1 整形類型
注:M表示每個值的位數
類型 | 大小 | 說明 |
BIT[(M)] | bit | 只能存0或者1(相當于只能存二進制位的數)取值范圍為1 ~ 64,省略M則默認大小為1 |
TINYINT | 1byte | 取值范圍-2^7 ~ 2^7-1,無符號取值范圍2^8-1 |
BOOL | 1byte | 只能包含1位數字的值,值為0則為假,非零則為真 |
SMALLINT[(M)] | 2byte | 取值范圍 -2^15 ~ 2^15-1,無符號取值范圍2^16-1 |
MEDIUMINT[(M)] | 3byte | 取值范圍 -2^23 ~ 2^23-1,無符號取值范圍2^24-1 |
INT[(M)] | 4byte | 取值范圍 -2^31 ~ 2^31-1,無符號取值范圍2^32-1 |
INTEGER[(M)] | 4byte | INT[(M)]的同義詞(用哪個都行) |
BIGINT[(m)] | 8byte | 取值范圍 -2^63 ~ 2^63-1,無符號取值范圍2^64-1 |
在現在存儲資源不缺乏的情況下,我們能用BIGINT類型就用BIGINT類型,因為取值范圍更大,避免不必要的錯誤
?1.2 浮點型類型
類型 | 大小 | 說明 |
FLOAT[(M,D)] | 4byte | 單精度浮點型,M表示總位數,D表示小數點后面的位置,大約可以精確到小數點后面7位 |
DOUBLE[(M,D)] | 8byte | 雙精度浮點型,M表示總位數,D表示小數點后面的位置,大約可以精確到小數點后面15位 |
DECIMAL[(M,D)] | 動態 | 不存在精度丟失,DECIMAL的最大位數為65 ,最??數位數為30。如果省略M,則默認為10,如果省略D,則默認為0。M中不計算?數點和負數的-號,如果D為0,則值沒有?數點和?數部分。 |
因為FLOAT和DOUBLE的精度丟失問題,在我們的開發中時一般不使用這兩種類型,我們都使用DECIMAL,那么DECIMAL是如何保證數據精度是不受損失的?
假設我們現在有一個浮點數:123456789987654321123456789.123456789987654321123456789
那么Decimal的底層是將這個浮點數進行拆分,每一份用一個int表示:(小數點和符號不記錄)
整數位:123456789 | 987654321 | 123456789 | 小數位:123456789 | 987654321 | 123456789?
整數部分用了3個int表示,小數部分用了3個int表示
那么假設后面還有多余的小數(剩余部分),那么就會使用最小的合適的數據類型進行存儲,最終通過這樣的方式保存數據,就保證了數據精度不受損失。
那么在我們真實的開發過程中,如果遇上描述金額的所需要的數據類型時,一般有以下兩種解決方式:
- 用上述說的不損失精度的Decimal類型
- 將金額的單位轉換成分或者更小的單位,使用int類型去存儲(這是一個小技巧)
2.字符串類型
類型 | 說明 |
CHAR[(M)] | 固定長度的字符串,以字符為單位,取值范圍為0 ~ 255,M省略長度默認為1 |
VARCHAR[(M)] | 可變長度字符串,取值范圍為0 ~ 65535 ,有效字符個數取決于實際字符數和使用字符集,例如使用utf8mb4字符集時65535/4約等于16383個字符 |
TINYTEXT | 小文本類型,最大長度為255個字節 |
TEXT[(M)] | 文本類型,最大長度為65535字節 |
MEDIUMTEXT | 中文本類型,最大長度為16777215字節 |
LONGTEXT | 大文本類型,最大長度為4294967295字節 |
enum(value,value...) | 枚舉類型:
|
set(value,value...) | 集合
|
注:當我們使用TEXT類型時,如果超出的最大長度,那么它就是自動變為MEDIMTEXT類型,當超出?MEDIMTEXT類型時就會自動轉變成LONGTEXT類型
char和varchar的區別
- char是固定長度的字符串,獲取列的值時會從尾部刪除空格(就像java中的next()讀入一樣,不會讀入末尾的空格,但是一個字符串如果中間存在空格,那么是會保留的)
- varchar是可變長度字符串,有效?度取決于實際字符數和使?的字符集,獲取列的值時不會從尾部刪除空格,插?數據時會刪除超出?度的空格。
舉個例子:
varchar類型的字符串是會保留空格的,char類型的字符串將后面的空格進行了刪除?
如何選擇char和varchar
- ?如果數據確定?度都?樣,就使?定? CHAR 類型,?如:?份證,md5,學號,郵編。
- 如果數據?度有變化,就使?變? VARCHAR , ?如:名字,地址,但要規劃好?度,保證最?的字符串能存的進去。
- 定? CHAR 類型?較浪費磁盤空間,但是效率?。
- 變? VARCHAR 類型?較節省磁盤空間,但是效率低?
3.日期類型
類型 | 大小 | 說明 |
DATE | 3 bytes | 日期類型 ?持范圍 1000-01-01 ~ 9999-12-31 顯?格式為 YYYY-MM-DD |
TIME | 3 bytes | 時間類型 ?持范圍 -838:59:59.000000 ~ 838:59:59.000000 顯?格式為 hh:mm:ss |
DATETIME | 8 bytes | ?期類型和時間類型的組合 ?持范圍 1000-01-01 00:00:00.000000 ~ 9999-12-31 23:59:59.499999 顯?格式為 YYYY-MM-DD hh:mm:ss[.fraction] |
YEAR | 1 bytes | 4位格式的年份 ?持范圍 1901 ~ 2155 顯?格式為 YYYY |
4.二進制類型
類型 | 說明 |
BINARY | 固定長度二進制字節,存儲的是二進制字節,取值范圍0~255 |
VARBINARY | 可變長度二進制字節,存儲的是二進制字節 |
注:在現在的開發中我們已經不使用二進制類型來存儲數據了?,了解即可
二. 表的操作
數據庫中的表就像java中的一個類,那么我們一起來學習一下表的基本操作,那么我們需要先新建一個庫,在庫中來實現表的一些操作~
1.查看所有表
在創建表之前,我們肯定需要查看一下當前庫中已經具備了哪些表,以防止重復創建:
show tables;
?那么可以看見當前庫中沒有任何的表,這時候我們就要來創建表啦!
2.表的創建
創建表的語法:
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_namefield datatype [約束] [comment '注解內容'][, field datatype [約束] [comment '注解內容']] ...
) [engine 存儲引擎] [character set 字符集] [collate 排序規則];
- field:列名
- datatype:數據類型
- comment:對列的描述或說明
- engine:存儲引擎,不指定則使?默認存儲引擎
- character set:字符集,不指定則使?默認字符集
- collate:排序規則,不指定則使?默認排序規則
?現在我們來創建一個學生表:
create table users (name VARCHAR(20) comment'姓名',age BIGINT COMMENT'年齡',class VARCHAR(20)COMMENT'班級'
) CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci;
?
?此時一個學生表就創建完成了,接下來我們查看一下當前學生表的結構~
3.查看表的結構
語法:
desc 表名;
?查看剛才創建的學生表:
- Field:表中的列名
- Type:列的數據類型
- Null:該列的值是否允許為Null
- Key:該列的索引類型
- Default:該列的默認值
- Extra:擴展信息
4.表的修改
在我們的項目實際開發中,經常會對表結構進行調整,這個時候就要對表進行修改操作
ALTER TABLE tbl_name [alter_option [, alter_option] ...];
alter_option: {table_options| ADD [COLUMN] col_name column_definition [FIRST | AFTER col_name]| MODIFY [COLUMN] col_name column_definition [FIRST | AFTER col_name]| DROP [COLUMN] col_name| RENAME COLUMN old_col_name TO new_col_name| RENAME [TO | AS] new_tbl_name
- tbl_name:要修改的表名
- ADD:向表中添加列
- MODIFY:修改表中現有的列
- DROP:刪除表中現有的列
- RENAME COLUMN:重命名表中現有的列
- RENAME [TO | AS] new_tbl_name:重命名當前的表
?這么多修改表的操作,我們一個一個來看:
4.1 添加新的列
假設我們現在需要為剛才創建的添加一個birthday列;
此時birthday列就被添加成功了,那么這是在尾部插入一個新的列,那么現在我想在頭部插入一個gender列能不能實現呢?其實是可以實現的,只需要將最后的after改成first即可:
?4.2 修改表中現有的列
那么假設說現在name列的varchar( 20 )不夠用了,我需要做出調整改成varchar( 40 ):
?4.3 刪除表中現有的列
現在我不需要birthday這個列了,需要將它刪除:
此時表中的birthday這個字段就被刪除了
4.4 重命名表中現有的列
現在我需要將表中的name字段重命名成studentname:
?4.5 重命名當前表
我現在需要將當前student表重命名成students:
5.表的刪除
語法:
DROP [TEMPORARY] TABLE [IF EXISTS] tbl_name [, tbl_name] ...
- TEMPORARY:表?臨時表
- tbl_name:將要刪除的表名
?現在我們將剛才創建的students表刪除:
刪除表不僅可以單個刪除,同時也可以進行多個刪除,那么我們現在重新創建兩個表:student表和class表,然后進行多個表同時刪除
?注:表的創建和刪除跟庫的創建和刪除是類似的,都可以加上 if not exists 和 if exists來防止報錯
?