DDL的全稱Data Definition Language,即數據定義語言 DDL的語法有:create、alter、drop、rename、truncate。對此做一個詳細的解釋: create (創建) create 可以創建資料庫 create 可以創建表格 創建表格的語法:方括弧的表示可以 ...
DDL的全稱Data Definition Language,即數據定義語言
DDL的語法有:create、alter、drop、rename、truncate。對此做一個詳細的解釋:
create (創建)
create 可以創建資料庫
# 創建資料庫 create database database_name; # 然後進入該資料庫 use database_name;
create 可以創建表格
創建表格的語法:方括弧的表示可以省略
create [temporary] table [if not exits] table_name(
column_name data_type [not null | null] [default default_value] [auto_increment] [comment ""] [Constraints約束條件],
);
[if not exits] 如果新建表不存在,則會創建新表;如果存在,不會報錯,數據也不會被覆蓋
create table if not exits table_name( id int, name varchar(20) );
[temporary] 創建臨時表 用於存儲臨時計算的數據,生命周期只限於本次連接
create temporary table table_name( id int key, name varchar(20) );
[not null | null] 欄位值是否可以為空; 如果這個欄位值設置不為空,後面還有預設值,那麼在插入時當前欄位不插入數據,會按照後面的預設值填入
create table null_test( account varchar(20) not null, password varchar(32) not null, gender enum("0", "1") null ); insert into null_test(account) values("zhangsan"); # error 因為password不能為空 insert into null_test(account, password) values("zhangsan", "abcdef");
[default default_value] 欄位值的預設值是什麼,建議項目中表格的每一列都給預設值(以防用戶不填數據)
create table default_test( id int not null default 0, address varchar(50) default "", gender enum("0", "1") null default "0" ); # 首先id不為空,插入時也沒有寫,在插入的過程中,會將預設值插進去 insert into default_test(address, gender) values ("kunshan", "1");
[auto_increment] 欄位值自動增加,一般(不是必須)適用於主鍵而且是int類型,預設從1開始
# auto_increment的三種表現形式 create table auto_test( id int primary key auto_increment, name varchar(20) not null ); create table auto_test( id int primary key auto_increment, name varchar(20) not null )auto_increment=1; create table auto_test( id int primary key auto_increment, name varchar(20) not null )auto_increment=2016211001000;
[comment ""] 給表格欄位添加備註
create table comment_test( id int comment "標號" );
Constraints約束:
約束是用來限制和保護表的數據符合我們定義的條件
約束的表現形式:
列級約束
寫在列的後面,針對某個列的約束
• Create table student(id number primary key,name varchar(10));
表級約束
寫在建表語句的後邊,針對某個列的約束
• Create table student(id number , name varchar(10),primary key(id));
列級約束和表級約束作用相同,但是表級約束功能更強一些,具體見後邊
如果是表級約束,若涉及聯合唯一或者是聯合主鍵,只有聯合的所有的欄位值一樣的才會報錯(局部可以重覆,全局不可以重覆)
not null 上面已有介紹
unique 欄位值唯一
create table unique_test( id int, stuno int not null unique # 列級約束 ); create table unique_test( id int, stuno int not null unique default 0 # 只能預設插入一次 ); create table unique_test( id int, stuno int not null, unique(stuno) # 表級約束 ); create table unique_test( id int, stuno in not null, unique(id, stuno) # 表級約束---聯合約束唯一 ); # 聯合唯一:單個列可以重覆,整體不能重覆; 條件必須時表級約束,同時重覆才會報錯
primary key(表格的主鍵) 非空 唯一 索引
create table primary_test( id int primary key, # 列級約束 name char(20) ); create table primary_test( id int, name char(20), primary key(id) # 表級約束 ); create table primary_test( id int, name char(20), primary key(id, name) # 表級約束 -----聯合主鍵 );
# 聯合唯一:單個列可以重覆,整體不能重覆; 條件必須時表級約束,同時重覆才會報錯
foreign key(表格的外鍵)
外鍵只能是表級約束,先有主表(與之關聯的外鍵表),才有外表(當前表是外表)
外表的引擎必須是InnoDB,在分號之前建議寫上
兩者關聯涉及的欄位值類型必須相同
刪除數據(表),先刪除子(外)數據(表),在刪除父(主)數據(表)
填寫foreign key(欄位名) references 主表名(主鍵)
# 主表(父表) create table parent_table( id int primary key, # 列級約束 name varchar(20) not null default "", ); # 外表(子表) create table child_table( id int, parent_id int, name varchar(20) not null default "", primary key(id), # 表級約束 foreign key (parent_id) references parent_table(id) # 表級約束 ); #插入數據: 先插入父表的數據,在插入子表的數據 insert into parent_table values(1001); insert into child_table values(1, 1001);
index/key 索引 建立索引提高查詢速率
key:如果表格沒有主鍵,又是列級約束,會自動設置成主鍵;又是表級約束,就是普通的索引key了
在已有的表格上創建/刪除 索引:create/drop index index_name on table_name
# key 索引測試 create table key_test( id int key, # 列級約束轉換成主鍵了 name varchar(20) ); create table key_test( id int, name varchar(20), key(id) # 表級約束 ---只是一個關鍵字索引 ); create table key_test( id int, name varchar(20), key(id, name) # 表級約束---聯合約束 ); #index 索引測試 create table index_test( id int index, # index 沒有列級約束 # error name varchar(20) ); create table index_test( id int, name varchar(20), index(id) # 表級約束 ---只是一個關鍵字索引 ); create table index_test( id int, name varchar(20), indexid, name) # 表級約束---聯合約束 ); # 在已有的表格創建索引 create index index_name on table_name(column_item1[, column_item2]); # 在已有的存在索引欄位的表格刪除索引 drop index index_name on table_name(column_item1[, column_item2]);
check(沒有什麼具體作用)
創建視圖view(視圖和相關聯的表格是一致的):
create view view_name as 數據(某個結果數據集);
增加、刪除、修改、查詢(前提是操作成功)等功能和表格的一樣
視圖的作用:
重用sql語句,即多次使用相同語句
數據的安全性:限定特定欄位數據
對數據的重構並且不影響其他程式的運行,讓數據更加清晰
# 創建一個視圖(可以將視圖比作望遠鏡) # 即實物與望遠鏡看到的事物是一致的 create view view_name as select * from table_name; # 下麵兩個結果是一樣的 select * from view_name; select * from table_name;
DROP
drop可以刪除資料庫、數據表、view視圖、index索引
drop database database_name; drop table table_name; drop view view_name; drop index index_name on table_name(column_item1[, column_item2]);
RENAME(重命名)
rename只限於表格操作
# 修改表格名稱 rename table old_name to new_name
TRUNCATE
清空表格的數據,釋放磁碟空間(自定義的設置會回覆原來的設置)
create table truncate_test( id int primary key auto_increment, name varchar(20) )auto_increment=10000; insert into truncate_test(name) values ("aaa"); truncate truncate_test; # 原來設置的auto_increment=10000,會改為auto_increment=1
ALTER
alter 完整語法的用法:
# 創建一個測試表格 create table test(id int);
1、向表格增加一列:
# 語法: #alter table table_name add column_name column_type column_constraints alter table test add name varchar(20) not null;
2、向表格的一個/多個欄位增加索引(多個欄位即聯合索引)
# 語法 # alter table table_name add index [unique_name](column_name1[,column_name2])
alter table test add index (id);
3、向表格的一個/多個欄位增加主鍵(多個欄位即聯合主鍵)
# 語法: # alter table table_name add primary key (column_name1[,colum_name2]) alter table test add primary key (id);
4、向表格的一個/多個欄位增加唯一(多個欄位即聯合唯一)
# 語法: # alter table table_name add unique [unique_name] (column_name1[, clumn_name2]) alter table test add unique (id);
5、修改/刪除表格某個欄位的預設值
# 語法: # alter table table_name alter column_name {set defaulle column_value |drop default} # 色湖之預設值 alter table test alter name set default "root"; # 刪除預設值 alter table test alter name drop default;
6、修改表格欄位
# 語法: # 修改欄位過程中若連同欄位名也修改採用change # alter table table_name change column_old_name column_new_name [constraints] alter table test change id test_id int primary key; # 不修改欄位名可採用modify # alter table table_name modify column_name [constraints] alter table test modify test_id int(10) unsigned primary key;
7、刪除欄位、主鍵、索引
# 語法: # 刪除某個欄位 # alter table table_name drop column_name alter table test drop name; # 刪除索引 # alter table table_name drop index index_name 預設是欄位名,也可以查看表結構 alter table test drop index id; # 刪除主鍵 # alter table table_name drop primary key alter table test drop primary key;
8、修改表格的名稱
# 修改表格的兩種方式: # 1、採用rename方式 # rename table table_old_name to table_new_name; rename table test to test1; # 2、採用alter方式 # alter table table_name rename [as] table_new_name alter table test1 rename test;
9、修改表格的配置
# 語法 # 修改的地方是在 ) 和 ; 之間的配置 # 修改引擎 # alter table table_name engine=InnoDB alter table test engine=InnoDB; # 修改字元編碼 # alter table table_name charset=gbk2313 alter table test charset=gbk2312;