MySQL基本語句
阿新 • • 發佈:2020-12-27
一、約束條件相關語句
1.1 主鍵約束
簡單來說就是要求主鍵列的資料唯一,並且不允許為空!
① 建立列時便指定主鍵
create database t1; #建立資料庫,名稱為t1 use t1; #切換到t1資料庫 create table t1( id int(10), name varchar(10) primary key, sex varchar(5), info varchar(200) ); #建立一個表,並指定name欄位為主鍵 desc t1; # 檢視資料的詳細資訊 +-------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+--------------+------+-----+---------+-------+ | id | int(10) | YES | | NULL | | | name | varchar(10) | NO | PRI | NULL | | | sex | varchar(5) | YES | | NULL | | | info | varchar(200) | YES | | NULL | | +-------+--------------+------+-----+---------+-------+ #確認name欄位有PRI字樣
② 所有列建立完成後指定主鍵
create table t2( id int(10), name varchar(10), sex varchar(5), info varchar(200), primary key(id) ); desc t2; +-------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+--------------+------+-----+---------+-------+ | id | int(10) | NO | PRI | NULL | | | name | varchar(10) | YES | | NULL | | | sex | varchar(5) | YES | | NULL | | | info | varchar(200) | YES | | NULL | | +-------+--------------+------+-----+---------+-------+ #確認id欄位有PRI字樣
1.2 非空約束
簡單來說就是不允許列的值為空!
create table t3( id int(6) not null, name varchar(10) ); #建立表,指定id欄位不允許為空 desc t3; +-------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+-------+ | id | int(6) | NO | | NULL | | | name | varchar(10) | YES | | NULL | | +-------+-------------+------+-----+---------+-------+ #確認id的一行上NULL欄位為NO
1.3 設定值的唯一性
簡單來說就是不允許有重複資料,可以為空,單隻能有一個空,否則就會被視為重複!
create table t4(
id int not null unique,
name varchar(20)
);
#建立一個表,指定id列不能為空,且不能重複
desc t4;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(20) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
#可以看出其被標識為主鍵,但是在建立時並沒有指定它是主鍵,而是這一列的屬性基本滿足了主鍵的要求,如唯一、不可為空!
1.4 設定列的預設值
顧名思義就是如果沒有給列賦予值,則直接使用預設值!
create table t5(
id int not null,
name varchar(20),
project varchar(20) default 'mysql'
);
#建立一個表,指定project列的預設值為mysql
desc t5;
+---------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| id | int(11) | NO | | NULL | |
| name | varchar(20) | YES | | NULL | |
| project | varchar(20) | YES | | mysql | |
+---------+-------------+------+-----+---------+-------+
#可以看出project列的Default欄位為msyql
1.5 設定自增值
一般用於用於id列,自增列必須設定為主鍵!
注:mysql只允許設定初始值,而不允許設定自增值,也就是說,可以設定為第一個值為5,然後依次遞增,如:5、6、7.....但不可以設定其一次遞增2個數,比如:5、7、9......
create table t6(
id int not null primary key auto_increment,
name varchar(20)
);
#建立表,指定id列為自增值
desc t6;
+-------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(20) | YES | | NULL | |
+-------+-------------+------+-----+---------+----------------+
#查看錶的詳細資訊,確認id列的Extra欄位為auto_increment
insert into t6(name)
values('zhangsan'),('lisi');
#插入資料進行測試
select * from t6;
+----+----------+
| id | name |
+----+----------+
| 1 | zhangsan |
| 2 | lisi |
+----+----------+
#查看錶中儲存的資料
從上面的測試可以看出,只插入了兩個name的值,並沒有插入id的值,但是查看錶資料時,id已經有值了,說明自增生效。
1.6 設定自增的起始值
create table t7(
id int primary key auto_increment,
name varchar(20)
) auto_increment = 5;
#新建表,指定id列為自增值,並且初始值為5
insert into t7(name)
value('xiaozhang'),('xiaolisi');
#插入資料
select * from t7;
+----+-----------+
| id | name |
+----+-----------+
| 5 | xiaozhang |
| 6 | xiaolisi |
+----+-----------+
#驗證
二、ALTER指令的使用
2.1 修改值的資料長度
desc t1;
+-------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| id | int(10) | YES | | NULL | |
| name | varchar(10) | NO | PRI | NULL | |
| sex | varchar(5) | YES | | NULL | |
| info | varchar(200) | YES | | NULL | |
+-------+--------------+------+-----+---------+-------+
#檢視t1表的詳細資訊,注意name欄位的字元長度為10
alter table t1 modify name varchar(20);
#更改name欄位的字元長度為20
desc t1;
+-------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| id | int(10) | YES | | NULL | |
| name | varchar(20) | NO | PRI | NULL | |
| sex | varchar(5) | YES | | NULL | |
| info | varchar(200) | YES | | NULL | |
+-------+--------------+------+-----+---------+-------+
#驗證
2.2 修改欄位名稱
在修改欄位名稱的同時,還可以修改其新欄位名的資料型別及資料長度!
desc t1;
+-------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| id | int(10) | YES | | NULL | |
| name | varchar(20) | NO | PRI | NULL | |
| sex | varchar(5) | YES | | NULL | |
| info | varchar(200) | YES | | NULL | |
+-------+--------------+------+-----+---------+-------+
#檢視t1表的各個欄位(注意info欄位)
alter table t1 change info infoinfo char(20);
#更改info欄位名稱及資料型別
desc t1;
+----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| id | int(10) | YES | | NULL | |
| name | varchar(20) | NO | PRI | NULL | |
| sex | varchar(5) | YES | | NULL | |
| infoinfo | char(20) | YES | | NULL | |
+----------+-------------+------+-----+---------+-------+
#驗證
2.3 向表中插入一個新的欄位
① 在末尾插入新列
desc t1;
+----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| id | int(10) | YES | | NULL | |
| name | varchar(20) | NO | PRI | NULL | |
| sex | varchar(5) | YES | | NULL | |
| infoinfo | char(20) | YES | | NULL | |
+----------+-------------+------+-----+---------+-------+
alter table t1 add tel int(13);
#新增一列,名稱為tel,並指定資料型別
desc t1;
+----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| id | int(10) | YES | | NULL | |
| name | varchar(20) | NO | PRI | NULL | |
| sex | varchar(5) | YES | | NULL | |
| infoinfo | char(20) | YES | | NULL | |
| tel | int(13) | YES | | NULL | |
+----------+-------------+------+-----+---------+-------+
#驗證
② 在開頭插入
alter table t3 add sex char(1) first;
③ 在指定列後插入新列
alter table t3 add loc varchar(255) after name;
④ 新增欄位時新增約束
alter table t3 add hobyy varchar(255) default 'work';
⑤ 新增一個外來鍵
進行此操作之前,需要自行找一個有主鍵的表(這裡使用t1表為例)。
desc t1;
+----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| id | int(10) | YES | | NULL | |
| name | varchar(20) | NO | PRI | NULL | |
| sex | varchar(5) | YES | | NULL | |
| infoinfo | char(20) | YES | | NULL | |
| tel | int(13) | YES | | NULL | |
+----------+-------------+------+-----+---------+-------+
desc t3;
+-------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| sex | char(1) | YES | | NULL | |
| id | int(6) | NO | | NULL | |
| name | varchar(10) | YES | | NULL | |
| loc | varchar(255) | YES | | NULL | |
| tel | int(13) | YES | | NULL | |
| hobyy | varchar(255) | YES | | work | |
+-------+--------------+------+-----+---------+-------+
#檢視t1和t3的表結構
alter table t3 add constraint t3_t1_name foreign key(name) references t1(name);
#現在將t3表的name列新增為t1表的name列的外來鍵(其中t3_t1_name為自定義的約束名稱)
desc t3;
+-------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| sex | char(1) | YES | | NULL | |
| id | int(6) | NO | | NULL | |
| name | varchar(10) | YES | MUL | NULL | |
| loc | varchar(255) | YES | | NULL | |
| tel | int(13) | YES | | NULL | |
| hobyy | varchar(255) | YES | | work | |
+-------+--------------+------+-----+---------+-------+
#注意name欄位的Key為MUL
⑥ 刪除外來鍵
將剛才新增的外來鍵刪除,t3_t1_name是外來鍵的名稱。
alter table t3 drop foreign key t3_t1_name;
alter table t3 drop key t3_t1_name;
desc t3;
+-------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| sex | char(1) | YES | | NULL | |
| id | int(6) | NO | | NULL | |
| name | varchar(10) | YES | | NULL | |
| loc | varchar(255) | YES | | NULL | |
| tel | int(13) | YES | | NULL | |
| hobyy | varchar(255) | YES | | work | |
+-------+--------------+------+-----+---------+-------+
#驗證
⑦ 刪除列
alter table t3 drop hobyy;
注意:如果要刪除的列和其他表中的列有關聯關係,則需要先刪除關係,再刪除列。否則當以後再建立了相同名稱的列時,會自動將其建立關係。
⑧ 修改列的順序
alter table t3 modify name varchar(10) first;
#將name欄位移動到列表開頭
三、刪除表
3.1 使用delete刪除
刪除指定資料行的值(必須要明確要更改哪一行,一般delete語句都有where的條件)
delete from student where id=7;
3.2 偽刪除(修改表結構)
alter table student add column state tinyint not null default 1;
#新增state狀態列
update student set state=0 where id=1;
select * from student where state=1;
#指定條件進行檢視
3.3 使用drop刪除
drop table t5;
#直接刪除
drop table t5;
ERROR 1051 (42S02): Unknown table 'test01.t5'
#再次刪除,由於已經刪除了,所以表不存在,會報錯
drop table if exists t5;
#進行判斷後刪除,if exists表示如果存在就刪除
Query OK, 0 rows affected, 1 warning (0.00 sec)
#可以看到上述返回的資訊有1個warning事項,可以執行以下命令進行檢視
show warnings;
+-------+------+---------------------------+
| Level | Code | Message |
+-------+------+---------------------------+
| Note | 1051 | Unknown table 'test01.t5' |
+-------+------+---------------------------+
#記錄的資訊時不知道test01庫中的t5表
3.4 delete,drop,truncate區別?
- delete
邏輯上,逐行刪除,資料行過多,耗時最長。並沒有真正從磁碟上刪除,只是在儲存層打標機,磁碟空間不立即刪除。不會覆蓋原本的自增值; - drop
將表結構(元資料)和資料行物理層次刪除; - truncate
清空表、段中的所有資料頁,物理層次將表中的資料進行刪除,磁碟空間立即刪除。覆蓋原本的自增值;
注意:同樣,當執行刪除表操作時,如果存在關聯關係,則需要先刪除關聯關係,再刪除表。