DDL數據定義語言
(一)概述
DDL(Data Definition Language):數據定義語言,用來定義數據庫對象,庫、表、列等;創建、刪除、修改 庫,表結構。主要分為操作數據庫的DDL和操作表的DDL。
(二)操作數據庫的DDL
這里所提到的數據庫不同於我們之前提到的MySQL數據庫、Oracle數據庫等。MySQL數據庫中的”數據庫”是指一個數據庫管理系統(DBMS),而這里所提到的數據庫是指用來組織和管理一些對象(表、視圖等)的結構,簡單可以理解問磁盤上的文件夾。
一個數據庫服務器包含多個庫。
一個數據庫包含多張表。
一張表包含多條記錄。
1、創建數據庫
(1)直接創建數據庫
- 在創建數據庫時,如果沒有使用可選關鍵字創建,並且數據庫已經存在,則會報錯;如果使用了 if not exists 關鍵字創建,則不會報錯
-
CREATE DATABASE [IF NOT EXISTS] 數據庫名;
(2)指定字符集方式創建數據庫
- 語法:
CREATE DATABASE 數據庫名 CHARACTER SET 字符集;
- 示例:
CREATE DATABASE db1 CHARACTER SET UTF8
(3)指定字符集和排序規則創建數據庫
- 語法:
CREATE DATABASE 數據庫名 CHARACTER SET 字符集 COLLATE 排序規則;
- 示例:
CREATE DATABASE db2 CHARACTER SET UTF8 COLLATE utf8_bin;
-
排序規則說明
針對不同字符集,MySQL指定了不同的排序規則(可以參考MySQL的幫助文檔)。
例如:utf8字符集中指定的 utf8_general_ci 和 utf8_bin,對數據庫中存儲數據庫的規則就有所不同。
utf8_general_ci:ci是 case insensitive, 即 "大小寫不敏感", a 和 A 會在字符判斷中會被當做一樣的。
utf8_bin:將字符串每個字符串用二進制數據編譯存儲,區分大小寫,而且可以存二進制的內容。
2、查看數據庫
- 查看所有數據庫
- 語法
SHOW DATABASES;
- 語法
- 查看指定數據庫
- 可以查看數據庫創建的時的語法(編碼、排序規則等)
- 語法:
SHOW CREATE DATABASE 數據庫名 ;
3、修改數據庫
- 只能修改數據庫的字符集和排序規則,不能修改數據庫名字
- 語法
ALTER DATABASE 數據庫名 CHARACTER SET 字符集 [COLLATE 排序規則];
- 演示:
4、刪除數據庫
- 語法:
DROP DATABASE 數據庫名;
- 演示:
5、使用數據庫
- 查看正在使用的數據庫:
SELECT DATABASE();
- 切換數據庫:
USE 數據庫名;
演示:
(三)操作表的DDL
-
表是一種數據庫對象,表由若干個字段(列)組成。是我們在操作數據庫時使用最為頻繁的數據庫對象。
-
創建表:
- 注意:在創建表之前,一定要先使用數據庫(也就是說,表一定要創建在某個數據庫中)
- 語法:
CREATE TABLE 表名 (字段名1 數據類型,字段名2 數據類型,…,字段名n 數據類型) 建議寫成如下格式: CREATE TABLE 表名 ( 字段名1 數據類型, 字段名2 數據類型, ..., 字段名n 數據類型 );
- 示例:
-
數據類型
(1)數值類型
a、整數類型
類型名稱 |
字節 |
說明 |
tinyint |
1 |
無符號:0~255 有符號:-128~127 |
smallint |
2 |
無符號:0~65535 有符號:-32768~32767 |
mediumint |
3 |
無符號:0~1677215 有符號:-8388608~8388607 |
int、integer |
4 |
無符號:0~4294967295 有符號:-2147483648~2147483647 |
bigint |
8 |
無符號:0~18446744073709551615 有符號:-9223372036854775808~9223372036854775807 |
在建表時默認都是有符號的。
如要使用無符號的,在建表語句中指定。例如:id int unsigned
b、近似數類型
在MySQL中,可以通過浮點數和定點數來表示近似值。
浮點數
-
-
- MySQL中的浮點數包括float和double兩種,定義格式為float(M,D)、double(M,D)。
- M-表示所存儲的值共有M位(M的取值范圍是0~255)
- D-表示小數點后有D位(D的取值范圍是0~30)
- 例如:float(7,4)存儲的數據范圍時-999.9999~999.9999。
-
定點數 :(涉及到計算的最好使用定點數,因為浮點數會有精度的損失)
-
-
- decimal 是MySQL的定點數。相較與浮點數定點數表示的近似值更加精確。定義格式為decimal(M,D)
- M-表示所存儲的值共有M位(M的默認取值是10,取值范圍是1~65)
- D-表示小數點后有D位(D的默認取值是0,取值范圍是0~30)
-
(2)字符串類型
MySQL提供了多種針對字符串的存儲類型。如下表所示
字符串類型 |
取值范圍和存儲需求 |
char(M) |
M為0~255之間的整數 |
varchar(M) |
M為0~65535之間的整數 |
tinyblob |
允許長度0~255字節 |
blob |
允許長度0~65535字節 |
meduimblob |
允許長度0~167772150字節 |
longblob |
允許長度0~4294967295字節 |
tinytext |
允許長度0~255字節 |
text |
允許長度0~65535字節 |
mediumtext |
允許長度0~167772150字節 |
longtext |
允許長度0~4294967295字節 |
varbinary(M) |
允許長度0~M個字節的變長字節字符串 |
binary(M) |
允許長度0~M個字節的定長字節字符串 |
enum |
允許的值選自一個允許值列表,這個列表最多能存儲的值數量為65535個 |
set |
和enum類似,set類型是一個多選字符串數據類型 |
a、char和varchar
char和varchar兩種類型相似,都是MySQL數據庫中用來存儲較短字符串格式的類型。但這兩種類型的主要區別在於存儲方式不同,char類型的長度是固定的,而varchar類型的長度是可變的。例如,存儲字符串”abc”,char(5)表示存儲的字符將占5個字節(包括2個空字符),而varchar(5)只占用3個字節的長度,5只是最大值,當存儲的字符小於5個時,按實際長度存儲。同時在檢索時,char類型會刪除尾部的空格,而varchar類型會保留尾部的空格。因為長度的問題,所以導致兩種數據類型的數據尋址速度不同,如果字符在10個以內,推薦使用char。(但是在MySql3.10中測試,占的是字符的個數,而不是字節數,如:char(5)存儲的字母個數和漢字個數是一樣的,都是5個)
b、BLOB和TEXT
BLOB是一個二進制大對象,可以容納可變數量的數據。有4種BLOB類型:tinyblob、blob、mediumblob和longblob。它們只是可容納值的最大長度不同。
有4種TEXT類型:tinytext、text、mediumtext和longtext。這些對應4種BLOB類型,有相同的最大長度和存儲需求。
因為大文件中的字符可能存在非法,所以推薦使用BLOB,比如ascii字符集下存儲一張含有”0XFF”字節的圖片,入庫過濾。
(3)日期和時間類型
MySQL中有多種日期和時間類型的數據數據類型。如下表所示
類型 |
字節 |
最小值 |
最大值 |
date |
4 |
1000-01-01 |
9999-12-31 |
datetime |
8 |
1000-01-01 00:00:00 |
9999-12-31 23:59:59 |
timestamp |
4 |
1970-01-01 00:00:01.000000 |
2038-01-19 03:14:07.999999' |
time |
3 |
-838:59:59 |
838:59:59 |
year |
1 |
1901 |
2155 |
對於這些數據類型的選擇,有如下使用准則:
1、如果要表示年月日,通常使用date。
2、如果要表示年月日時分秒,通常使用datetime。
3、如果要表示時分秒,通常使用time。
4、如果要表示年,通常使用year。
5、如果要表示當前系統的時間,通常使用timestamp。
timestamp和datetime
雖然timestamp類型和datetime類型一樣可以表示日期時間,但兩者存在差別。
1、timestamp類型存儲的時間與MySQL數據庫系統安裝時所選的時區有關,在不同時區下查看的同一批數據將會得出不同的結果。
查看時區的SQL語句: show variables like ‘time_zone’; 默認與主機一致,顯示結果為SYSTEM。
修改時區的SQL語句:set time_zone=’+9:00’(設置為東9區)
1、兩者的取值范圍不同,datetime的取值范圍是1000-01-01 00:00:00到9999-12-31 23:59:59,timestamp的取值范圍是1970-01-01 00:00:01.000000到2038-01-19 03:14:07.999999'。
最常用類型總結:整數 int 、 浮點數 double 、字符串 varchar、日期 date。
創建表示例
需求:創建employee表,包含字段,編號(id int)、姓名(emp_name varchar)、性別(gender enum(‘M’,’F’))、入職日期(hire_date date)、薪資(salary double)、簡歷(resume text) create table employee( id int, emp_name varchar(100), gender enum(‘M’,’F’), hire_date date, salary double, resume text )
-
查看表
查看所有表:
SHOW TABLES;
查看表結構:
DESC 表名: 或 DESCRIBE 表名
查看創表語句
語法:
SHOW CREATE TABLE 表名;
示例
-
復制表結構:
語法:
CREATE TABLE 新表名 LIKE 舊表名;
示例:
-
修改表
- 添加新列:
- 語法:
ALTER TABLE 表名 ADD 列名 類型;
- 示例:為學生表添加一個新字段remake,類型為varchar(20)
- 語法:
- 添加新列:
-
- 修改列類型:
- 語法:
ALTER TABLE 表名 MODIFY 列名 新的類型
- 示例:將student表中的remark字段的改成varchar(100):
- 語法:
- 修改列類型:
-
- 修改列名:
- 語法:
ALTER TABLE 表名 CHANGE 舊列名 新列名 類型
- 示例:將s1表中的remark字段名改成intro,類型varchar(30)
- 語法:
- 修改列名:
注意:修改列名的時候,也可以一起修改列類型的取值范圍,但是不能修改列類型(varchar-->int 是不可以的)。一般情況是不會這樣修改列類型的。
-
- 刪除列:
- 語法:
ALTER TABLE 表名 DROP 列名;
- 示例:刪除student表中的字段intro
- 語法:
- 刪除列:
-
- 修改表名:
- 語法:
RENAME TABLE 表名 TO 新表名;
- 示例:將學生表student改名成student2
- 語法:
- 修改表名:
-
- 修改字符集
- 語法:
ALTER TABLE 表名 CHARACTER SET 字符集;
- 示例:將sutden2表的編碼修改成gbk
- 語法:
- 修改字符集
注意:即使修改了表的字符集,但是表中的列類型的字符集並不會被修改
-
- 刪除表
- 語法:
DROP TABLE 表名;
- 示例:刪除表student2
- 語法:
- 刪除表