### 3.3.2 創建表
創建數據庫是比較容易的部分, 但是現在它是空的, 正如 [`SHOW TABLES`](https://dev.mysql.com/doc/refman/8.0/en/show-tables.html) 告訴你的:
```sql
mysql> SHOW TABLES;
Empty set (0.00 sec)
```
困難的部分是決定數據庫的結構應該是什么: 需要那些表以及每個表應該包含那些列.
你需要一個包含你的每個寵物信息的表. 可以成為 `pet` 表, 它至少應該包含每個動物的名稱. 因為名字本身并不是很有趣, 表中應該包含其它信息. 例如, 如果你家里不止一個人養寵物, 你可能想列出每只動物的主人. 你可能也想記錄一些基本的描述信息, 比如物種和性別.
年齡呢? 這可能很有趣, 但是將其存儲在數據庫中并不是一件好事. 年齡隨著時間的推移而變化, 這意味著你必須經常更新你的記錄. 相反, 最好存儲一個固定的值比如出生日期. 然后, 當你需要年齡的時候, 你可以把它計算成當前日期和出生日期之間的差值. MySQL 提供了執行日期計算的函數, 所有這并不困難. 保存出生日期而不是年齡還有其它好處:
- 你可以使用該數據庫執行任務, 比如為即將到來的寵物生日生成提醒. (If you think this type of query is somewhat silly, note that it is the same question you might ask in the context of a business database to identify clients to whom you need to send out birthday greetings in the current week or month, for that computer-assisted personal touch.)
- 你可以計算年齡與日期的關系, 而不是與當前日期的關系. 例如, 如果你將死亡日期存儲到數據庫中, 你可以輕松的計算出寵物死亡時的年齡.
你可能會想到在 `pet` 表中有用的其它類型的信息, 但是到目前為止所識別的信息已經足夠了: 名稱(name), 所有者(owner), 物種(species), 性別(sex), 出生(birth), 和死亡(death).
使用 [`CREATE TABLE`](https://dev.mysql.com/doc/refman/8.0/en/create-table.html) 語句指定表格的布局:
```sql
mysql> CREATE TABLE pet (name VARCHAR(20), owner VARCHAR(20),
species VARCHAR(20), sex CHAR(1), birth DATE, death DATE);
```
[`VARCHAR`](https://dev.mysql.com/doc/refman/8.0/en/char.html) 對于 `name`, `owner`, 和 `species` 列, 是一個很好的選擇, 因為列值的長度各不相同. 這些列定義的長度不一定都相同, 也不一定是 **20**. 你通常可以選擇 **1** 到 **65535** 之間的任意長度, 只要你覺得最合理. 如果你做了一個糟糕的選擇, 后來發現你需要一個更長的字段, MySQL 提供了一個 [`ALTER TABLE`](https://dev.mysql.com/doc/refman/8.0/en/alter-table.html) 語句.
可以選擇幾種類型的值來表示動物記錄中的性別, 比如 `'m'` 和 `'f'`, 或者 `'male'` and `'female'`. 使用單個字符 `'m'` 和 `'f'` 是最簡單的.
對于 birth 和 death 列使用 [`DATE`](https://dev.mysql.com/doc/refman/8.0/en/datetime.html) 數據類型是一個非常顯而易見的選擇.
一旦你創建了表, [`SHOW TABLES`](https://dev.mysql.com/doc/refman/8.0/en/show-tables.html) 應該會產生一些輸出:
```sql
mysql> SHOW TABLES;
+---------------------+
| Tables in menagerie |
+---------------------+
| pet |
+---------------------+
```
要驗證你的表是按照你期望的方式創建的, 使用 [`DESCRIBE`](https://dev.mysql.com/doc/refman/8.0/en/describe.html) 語句:
```sql
mysql> DESCRIBE pet;
+---------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| name | varchar(20) | YES | | NULL | |
| owner | varchar(20) | YES | | NULL | |
| species | varchar(20) | YES | | NULL | |
| sex | char(1) | YES | | NULL | |
| birth | date | YES | | NULL | |
| death | date | YES | | NULL | |
+---------+-------------+------+-----+---------+-------+
```
你可以隨時使用 [`DESCRIBE`](https://dev.mysql.com/doc/refman/8.0/en/describe.html), 例如, 如果忘記了表中列的名稱或者它們的類型.
有關 MySQL 數據類型的更多信息, 參閱 [Chapter 11, ***數據類型***](https://dev.mysql.com/doc/refman/8.0/en/data-types.html).
- 簡介
- 前言和法律條款
- 安裝和更新 MySQL
- 在 Linux 上安裝 MySQL
- 在 Linux 上使用 APT 庫安裝 MySQL
- 在 Linux 上使用 Docker 部署 MySQL
- 使用 Docker 部署 MySQL 服務器的基本步驟
- 使用 Docker 部署 MySQL 服務器的更多主題
- 教程
- 連接到服務器和從服務器斷開
- 輸入查詢
- 創建和使用數據庫
- 創建和選擇數據庫
- 創建表
- 將數據加載到表中
- 從表中檢索數據
- 選擇所有數據
- 選擇特定行
- 選擇指定列
- 行排序
- 日期計算
- 處理 NULL 值
- 模式匹配
- 計算行數
- 使用多個表
- 獲取數據庫和表的信息
- 在批處理模式使用 mysql
- 常見查詢示例
- 列的最大值
- 包含某一行最大值的記錄
- 每組中列的最大值
- 擁有某個字段的組間最大值的行
- 使用用戶自定義變量
- 使用外鍵
- 兩個鍵上搜索
- 計算每日訪問量
- 使用 AUTO_INCREMENT
- 在 Apache 中使用 MySQL
- MySQL 程序
- MySQL 客戶端程序
- mysql — MySQL 命令行客戶端
- 優化
- 優化概述
- 優化 SQL 語句
- 優化和索引
- 優化數據庫結構
- 優化 InnoDB 表
- 優化 MyISAM 表
- 優化 MEMORY 表
- 理解查詢執行計劃
- 控制查詢優化器
- 緩沖和緩存
- 優化鎖操作
- 優化 MySQL 服務器
- 測量性能 (Benchmarking)
- 檢查線程信息