1. 程式人生 > 實用技巧 >MySQL基本語句

MySQL基本語句

一、約束條件相關語句

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
    清空表、段中的所有資料頁,物理層次將表中的資料進行刪除,磁碟空間立即刪除。覆蓋原本的自增值;

注意:同樣,當執行刪除表操作時,如果存在關聯關係,則需要先刪除關聯關係,再刪除表。