????????在學會創建數據庫之后,在數據庫中需要創建表(實體以表的形式存在),以及對表中存儲的數據記錄進行定義,相當于 Java 語言中對類編寫其屬性。在定義前我們需要了解 SQL 語言有哪些數據類型。
一、數據類型
1.1 數據值類型
????????1.1.1 整型
類型 | 大小 | 說明 | 對應 Java 類型 |
---|---|---|---|
bit [(M)] | 默認 bit | 位值類型。M表示每個值的位數,取值范圍是1~64.如果省略M,則默認是1 | |
tinyint [(M)] | 1 byte | 取值范圍 -2? ~ 2?-1(-128到127),無符號取值范圍2?-1 | Byte |
bool | 1 byte | 通常用 tinyint(1) 表示true。值為零表示假,非零表示真 | Boolean |
smallint [(M)] | 2 byte | 取值范圍 -21? ~ 21?-1,無符號取值范圍 21?-1 | Short |
mediumint [(M)] | 3 byte | 取值范圍 -223 ~ 223-1,無符號取值范圍 22?-1 | |
int [(M)] | 4 byte | 取值范圍 -231 ~ 231-1,無符號取值范圍 232-1? | Int |
integer [(M)] | 4 byte | int[(M)] 的同義詞 | Integer |
bigint [(M)] | 8 byte | 取值范圍 -2?3 ~ 2?3-1,無符號取值 2??-1 | Long |
????????bigint 一般用來作編號的類型。
????????1.1.2 浮點型
類型 | 大小 | 說明 |
---|---|---|
float [(M,D)] | 4 byte | 單精度浮點型,M是總位數,D是小數點后面的位數,大約可以精確到小數點后7位。 |
double [(M,D)] | 8 byte | 單精度浮點型,M是總位數,D是小數點后面的位數,大約可以精確到小數點后15位。 |
decimal [(M,D)] | 動態 | 不存在精度損失,M是總位數,D是小數點后面的位數。decimal的最大位數(M) 是65,最大小數位數(D)是30.如果省略M,則默認是10,如果省略D,則默認為0。M中不計算小數點和負數的-號,如果D為0,則值沒有小數點和小數部分。 |
????????decimal 一般用于表示金額 / 價格,可以存放很大的數,也可以根據項目要求自己設置小數精度,適用范圍廣。
1.2 字符串類型
類型 | 說明 |
---|---|
char [(M)] | 固定長度字符串,M表示長度,以字符為單位,取值范圍0~255,M省略則長度為1 |
varchar (M) | 可變長度字符串,M表示字符最大長度,取值范圍0~65535字節,有效字符個數取決于實際指定的字符數和使用的字符集,最常用 |
tinytext | 小文本類型,最大長度為255個字節,有效字符個數取決于使用的字符集 |
text [(M)] | 文本類型,最大長度為65535個字節,有效字符個數取決于使用的字符集 |
midiumtext | 中文本類型,最大長度為16,777,215個字節,有效字符個數取決于使用的字符集 |
longtext | 大文本類型,最大長度為4,294,967,295 即4GB個字節,有效字符個數取決于使用的字符集 |
????????對于 varchar 最常用的字符串類型其大小如果以字符為單位,就需要根據字符的具體情況用 1~4 個字節來表示一個字符。在 utf8mb4 編碼集下,一個 varchar 字段最多可以存放 65535 / 4 = 16383 個字符。
1.3 二進制類型
????????文本類型是人類能直接看懂的,而二進制類型,則是給機器看的。
類型 | 大小 |
---|---|
binary [(M)] | 固定長度二進制字節,與char類似,但存儲的是二進制字節而不是字符串。M表示長度,以字節為單位,取值范圍0~255,M省略則長度為1 |
varbinary (M) | 可變長度二進制字節,與varchar類似,但存儲的是二進制字節而不是字符串。M表示長度,以字節為單位 |
tinyblob | 小二進制字節類型,最大長度為255個字節 |
blob [(M)] | 二進制字節類型,最大長度為65535個字節 |
midiumblob | 中二進制字節類型,最大長度為16,777,215個字節 |
longblob | 大二進制字節類型,最大長度為 4,294,967,295即4GB個字節 |
1.4 日期類型
數據類型 | 大小 | 說明 | 對應Java類型 |
---|---|---|---|
datetime?[(fsp)] | 8字節 | 日期類型和時間類型結合 范圍從1000-01-01 00:00:00.000000 到 9999-12-31 23:59:59:59.499999,不會進行時區的檢索及轉換 顯示格式 yyyy-mm-dd hh:mm:ss[.fraction] 0值為 0000-00-00 00:00:00 | java.util.Date, java.sql.Timestamp |
timestamp | 4字節 | 時間戳類型 范圍從1970-01-01 00:00:01.000000 到2038-01-19 03:14:07.499999,自動檢索當前時區并進行轉換 0值為 0000-00-00 00:00:00 | java.util.Date, java.sql.Timestamp |
date | 3 字節 | 日期類型 支持范圍 1000-01-01 到 9999-12-31 顯示格式 yyyy-mm-dd 0值 0000-00-00 | |
time [(fsp)] | 3 字節 | 時間類型 支持范圍 -838:59:59.000000 ~ 838:59:59.000000 顯示格式為 hh:mm:ss[.fraction] 0值 00:00:00 | |
year [(4)] | 1 字節 | 4位格式的年份 支持范圍 1901~2155 |
? ? ? ? fsp 為可選設置,用來指定小數秒精度,范圍從 0~6,值為0表示沒有小數部分,如果省略,默認精度為0;
????????對于 timestamp 時間戳,一旦時間超過2038年就會出現溢出的問題,因此現在普遍使用 datetime 類型。
1.5 枚舉和集合
類型 | 說明 |
---|---|
enum('value1', 'value2', ...) | 枚舉 從值列表 'value1','value2'或 ''(空字符串)和null中選一個值 最多可以有65535個不同的元素 單個元素的最大長度是 M <= 255 或 (M * w) <= 1020,其中M是元素字符長度,w是字符集中字符所需的最大字節數 enum 的值在內部表示為整數 |
set('value1', 'value2', ...) | 集合 從值列表 'value1','value2'...中選零個或多個值 最多64個元素 單個元素的最大長度是 M <= 255 或 (M * w) <= 1020,其中M是元素字符長度,w是字符集中字符所需的最大字節數 set 值在內部表示為整數 |
二、表操作指令
????????在操作表之前,應該要選擇要操作的目標數據庫,才能對表進行操作。
2.1 查看所有表指令:show tables;
2.2 創建表
create [temporary] table [if not exists] tbl_name (field datatype [約束] [comment '注解內容'][, field datatype [約束] [comment '注解內容']] ...) [engine 存儲引擎] [character set 字符集] [collate 排序規則];
? temporary:表示創建的是一個臨時表
? field:列名
? datatype:數據類型
? comment:對列的描述或說明
? engine:存儲引擎,不指定則使?默認存儲引擎
? characterset:字符集,不指定則使?默認字符集
? collate:排序規則,不指定則使?默認排序規則
????????注意:定義字段時,最后一個字段是沒有逗號的,且定義字段用一個小括號括起來,最后要以分號結束。
示例:創建一個學生表,表中包含3個字段,id表示學生號,name表示學生姓名,gender表示性別
2.3 查看表結構指令:desc 表名
2.4 刪除表
drop [temporary] table [if exists] tbl_name [,tab_name]...
????????命令行客戶端工具只執行一些簡單的查詢指令,如果一兩句 SQL 可以解決的可以用命令行工具執行。但對于比較復雜的 SQL,比如表涉及、復雜查詢,建議還是使用可視化工具。MySQL 就提供了快捷方式 MySQL Workbench 工具。以下是使用該工具進行建表的示例:
2.5 修改表 alter
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
}
2.5.1 add 向表中新增一列
alter table 表名 add 列名 數據類型 [comment '注釋' after 指定列名];
2.5.2?modify 修改某列的長度
alter table 表名 modify?列名 數值長度;
2.5.3 rename 重命名某列
alter table 表名?rename column 要修改的原始列名?to 新列名;
2.5.4 drop 刪除某個字段
alter table 表名 drop 列名;
2.5.5 rename to 修改表名
alter table 舊表名 rename to 新表名;? ? /? ? rename table 舊表名 to 新表名;