一、使用DDL語句創建表
DDL語言全面數據定義語言(Data Define Language)
主要的DDL動詞:
CREATE(創建)、DROP(刪除)、ALTER(修改)
TRUNCATE(截斷)、RENAME(重命名)
注意:
1、使用DDL語言時,必須在動詞后跟上數據庫對象名詞(例如:TABLE、VIEW、INDEX、SCHEMA、TRIGGER等)。
2、MySQL的DDL語言創建數據庫,如CREATE DATABASE、DROP DATABASE(在Oracle中沒有)。
語法:
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] [database_name.] <table_name> ( <column_name> <data_type> [[not] null],… )
TEMPORARY:指明創建臨時表
IF NOT EXISTS:如果要創建的表已經存在,強制不顯示錯誤消息
database_name:數據庫名
table_name:表名
column_name:列名
data_type:數據類型
mysql> help create table #查看詳細的建表幫助信息
示例:創建一個員工(employee)信息表
mysql> create table emp_xinxi -> ( -> id int unsigned not null primary key, -> name varchar(20) not null, -> sex char(1) not null, -> birth date not null, -> job varchar(30) null
-> ); mysql> desc emp_xinxi; +-------+------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------------+------+-----+---------+-------+
| id | int(10) unsigned | NO | PRI | NULL | |
| name | varchar(20) | NO | | NULL | |
| sex | char(1) | NO | | NULL | |
| birth | date | NO | | NULL | |
| job | varchar(30) | YES | | NULL | |
+-------+------------------+------+-----+---------+-------+
MySQL反引號`的使用:為了區分保留字與普通字符而引入的符號
舉個栗子:
SELECT `select` FROM `test` WHERE select='字段值';
解析:
在test表中,有個select字段,如果不用反引號,MySQL將把select視為保留字而導致出錯,所以,有mysql保留字作為字段的,必須加上反引號來區分。
①保留字不能用於表名,比如desc,此時需要加入反引號來區別;但是,使用表名時可忽略反引號
mysql> create table desc……報錯 mysql> create table `desc`……成功 mysql> create table `test`……成功 mysql> drop table test……成功
②保留字不能用於字段名,比如desc,此時也需要加入反引號;並且,insert等使用時也要加上反引號
mysql> create table `test`(`desc` varchar(255)); 成功 mysql> insert into test(desc) values('fxf'); 失敗 mysql> insert into test(`desc`) values('fxf'); 成功
所以:在容易因為保留字問題會出現問題的情況下,都使用反引號`進行區分,不容易出錯。
二、建表時列的數據類型
1、整型:(5種)
每個整型類型可以指定一個最小顯示寬度(注意:這個寬度並不表示存儲的值有多大)
基本格式:
INT[(M)] [UNSIGNED] [ZEROFILL]
①M:指定顯示寬度(默認是M=10),以實際的取值范圍為准,值超過顯示寬度,顯示寬度自動增加
②unsigned:無符號的,表示只允許正數,所以取值范圍取絕對值且最大值*2
(例:int unsigned range is 0 to 4294967295)
③zerofill:填充0(如果聲明了zerofill,該列會自動設為unsigned)
影響數字的顯示方式:
如果一個數字的寬度小於所允許的最大寬度,這個值前面會用0填充;
如果寬度大於所允許的最大寬度但不超過取值范圍,以實際的取值范圍為准,不填0;超出取值范圍的報錯不存儲。
mysql> create table t1(id int zerofill); #默認顯示寬度10 mysql> insert into t1 values(-1); ERROR 1264 (22003): Out of range value for column 'id' at row 1 mysql> insert into t1 values(123); mysql> insert into t1values(12300); mysql> insert into t1values(1.123);
mysql> select * from t1 +------------+
| id |
+------------+
| 0000000123 |
| 0000012300 |
| 0123456789 |
| 0000000001 |
+------------+
解析:因為建表的設置是int整數,小數點后的數會四舍五入
2、小數類型
1)定點小數:decimal(dec)
同義詞:decimal=dec=numeric=fixed
基本格式:
DEC[(M[,D])] [UNSIGNED] [ZEROFILL]
①M:精度,(整數位數+小數位數)不包含小數點的數字總位數(1--30)。不指定默認為10
②D:小數位數,如果不指定,默認為0
若位數不夠,小數末尾補零;若位數超預算(整數位數=M-D),報錯。
mysql> create table t2id dec(5,3) unsigned); ##數字總位數5 ##整數位數5-3=2(不夠沒關系;超出報錯) ##小數位數3(不夠補零;超出四舍五入) mysql> insert into t2values(12.345); mysql> insert into t2values(1.23); mysql> insert into t2values(123); ERROR 1264 (22003): Out of range value for column 'id' at row 1 mysql> insert into t2values(12.3456); mysql> select * from t2; +--------+
| id |
+--------+
| 12.345 |
| 1.230 |
| 12.346 |
+--------+
2)浮點小數:float/double
基本格式:
float[(length) | (<display width>,<scale>)]
double[(precision) | (<display width>,<scale>)]
兩者區別在於值所保留的存儲空間數量不同
注意:
由於對一個浮點數字來說,可用的存儲空間有限,如果一個數字非常大或非常小,將存儲這個數字的近似值而不是實際值
①使用一個參數來指定浮點類型
length(precision):在一個浮點數據類型中可以指定長度,來確定具體的浮點類型
0~24:單精度float,從第7位有效位,進行四舍五入存儲
25~30:雙精度double,從第16位有效位,進行四舍五入存儲
mysql> create table t3(id float(8)); m=8,說明是單精度,存儲6位的近似值(第7位四舍五入,后面為0) mysql> insert into t3 values(123); mysql> insert into t3 values(1234567); mysql> insert into t3 values(123456789); mysql> insert into t3 values(123456789.123456789); mysql> select * from t3; +-----------+
| id |
+-----------+
| 123 |
| 1234570 |
| 123457000 |
| 123457000 |
+-----------+
②使用兩個參數來指定浮點類型
單精度float(m,d):m表示精度(0~24),d表示小數位數
雙精度double(m,d):m表示精度(25~30),d表示小數位數
示例:設一個字段定義為float(5,3)---單精度浮點,精度5,小數位3(和dec一樣)
mysql> create table t_3(id float(5,3) unsigned); ##數字總位數5 ##整數位數5-3=2(不夠沒關系;超出報錯) ##小數位數3(不夠補零;超出四舍五入) mysql> insert into t_3 values(123); ERROR 1264 (22003): Out of range value for column 'id' at row 1 mysql> insert into t_3 values(12.3); mysql> insert into t_3 values(12.3456); mysql> insert into t_3 values(1.23456);
mysql> select * from t_3; +--------+
| id |
+--------+
| 12.300 |
| 12.346 |
| 1.235 |
+--------+
解析:float的小數位數不是固定的;超出存儲范圍,近似值進行存儲。
3、位類型
基本格式:
BIT [(LENGTH)]
存儲基於位的值,Length取值范圍1---64.默認為1
mysql> create table an_bit (id bit(8));
mysql> insert into an_bit values(b'11'); #插入數據,用b注釋插入的是位類型數據(默認是十進制數據),要添加的數據用引號引起 mysql> select * from an_bit;
#注意:位類型數據不能如此查詢,會亂碼 mysql> select id+0 from an_bit; #可以看到十進制的值 +------+
| id+0 |
+------+
| 3 |
+------+ mysql> select bin(id+0) from an_bit; #可以看到二進制的值 +-----------+
| bin(id+0) |
+-----------+
| 11 |
+-----------+ mysql> select hex(id+0) from an_bit; #可以看到十六進制的值 +-----------+
| hex(id+0) |
+-----------+
| 3 |
+-----------+
位類型一般用在記錄數據只有兩種選擇,比如:男1女0、省內1省外0……
4、字符串類型
①char[(length)]:固定長度字符串
值少於長度則在尾部自動填充空格
length的單位是字符,取值范圍0---255
②varchar[(length)]:可變長度字符串
length的單位是字符,取值范圍0---65535
對於char和varchar,如果長度為0,則只能存儲null值或者空字符串’’值
③long varchar:可變長度字符串
最大長度2的24次方減1個字符
④longtext:可變長度字符串
最大長度4G個字符
text是varchar的同義詞,mediumtext是long varchar的同義詞
5、日期類型
date : 3字節
datetime: 8字節
time : 3字節
timestamp : 4字節
year[(2) | (4)] : 1字節
6、二進制大對象類型
binary: 255個字符
varbinary :65535個字符
blob: 65535字符(圖片、文件)
long varbinary: 2的24次方減1個字符
long blob: 2的32次方-1個字符
圖片存儲方式:
①在數據庫中定義數據類型為blob,進行圖片存儲
②……varchar,“mysql.PNG“,在數據庫中存放圖片的路徑,指向文件系統該照片對象
三、添加數據類型選項
1、對於字符串類型,可以添加類型選項:character set和collate
character set:設置字符集
collate:設置校對規則
mysql> create table t1(id int,name varchar(20)) character set=gbk collate=gbk_bin;
#t1建表指定校對規則(區分大小寫)
2、對於bit之外的所有數字類型,可以添加一個或是幾個類型選項:
①unsigned:無符號的,表示只允許正數
②zerofill:填充0,(自動設unsigned)若數字的寬度小於所允許的最大寬度,在值前面用0填充
③auto_increment:自動增長,只適應於整數類型,一個表中只有一個列可以是自動增長的。(一般會用在主鍵序列自增)
示例:創建一個city_names表,其主鍵是自動增長的
注意:
當在insert語句中為auto_increment列,指定了null值或者沒有指定值時,MySQL自動為其賦值;
MySQL會記住給出的最后一個順序號碼是多少。當要分配一個新的順序號碼時,最后一個順序號碼被找到,並且列中的最大值被確定。新的順序號碼就是這兩個值中的最大者加1。
mysql> insert into city_names values(10,'武漢'); mysql> insert into city_names(name) values('贛州');
mysql> select * from city_names; +-------+--------+
| seqno | name |
+-------+--------+
| 1 | 北京 |
| 2 | 上海 |
| 3 | 深圳 |
| 10 | 武漢 |
| 11 | 贛州 |
+-------+--------+ mysql> delete from city_names; #刪除表中的所有行 mysql> insert into city_names values(null,'天津'); mysql> insert into city_names values(null,'成都'); mysql> select * from city_names; +-------+--------+
| seqno | name |
+-------+--------+
| 12 | 天津 |
| 13 | 成都 |
+-------+--------+
即使刪除了表中的所有行,插入新行時,編號還是從原來的位置繼續;要想再次從1開始,必須刪除整個表並重新創建。
默認情況下,順序號碼從1開始並且每次加1;可以分別使用兩個系統變量來改變默認行為:
mysql> show variables like '%auto_increment%'; +--------------------------+-------+ | Variable_name | Value | +--------------------------+-------+ | auto_increment_increment | 1 | | auto_increment_offset | 1 | +--------------------------+-------+ mysql> set @@auto_increment_offset=10; --起始值 mysql> set @@auto_increment_increment=10; --每次加幾 mysql> create table t5(id integer auto_increment not null primary key); mysql> insert into t5 values(null),(null); mysql> select * from t5; +----+ | id | +----+ | 10 | | 20 | +----+