MySQL_07表的相關操作
MySQL_07表的相關操作
1.建立表的語法格式(DDL)
建表屬於DDL語句,DDL包括:create、drop、alter。
create table 表名(欄位名1 資料型別,欄位名2 資料型別,欄位名3 資料型別);
我習慣於使用如下格式:
create table 表名(
欄位名1 資料型別,
欄位名2 資料型別,
欄位名3 資料型別
);
如何取表名和欄位名?
- 表名:建議以“t_”或者“tbl__”開始,可讀性強,見名知意。
- 欄位名:見名知意。
表名和欄位名都屬於識別符號。
2.MySQL中的資料型別
-
varchar(255)
- 可變長度的字串,會根據實際的資料長度動態分配空間。
- 優點:比較智慧,節省空間。
- 缺點:需要動態分配空間,速度慢。
- 當使用的是姓名等非固定長度的欄位時,選varchar。
-
char(255)
- 固定長度的字串,不管資料實際長度,分配固定長度的空間去儲存資料。
- 優點:不需要動態分配空間,速度快。
- 缺點:使用不當可能會造成記憶體空間上的浪費。
- 當使用性別欄位時,因為性別是固定長度的字串,所以選char。
-
int(11)
- 數字中的整數型,相當於java中的int。
-
bigint
- 數字中的長整數型,相當於java中的long。
-
float
- 單精度浮點型
-
double
- 雙精度浮點型
-
date
- 短日期型別
-
datetime
- 長日期型別
-
clob(Character Large OBject)
- 字元大物件
- 最多可儲存4G的字串。
- 比如:儲存一篇文章。
- 超過255個字元的都要採用clob字元大物件來儲存。
-
blob(Binary Large OBject)
- 二進位制大物件
- 專門用來儲存圖片、聲音、視訊等流媒體資料。
- 往blob型別的欄位上插入資料的時候,需要使用IO流。
3.建立一個學生表並刪除
3.1建立表
create table t_student( no int, name varchar(255), age int(3), email varchar(255) );
3.2刪除表
- drop table t_student;
- 當這張表不存在時會報錯。
- drop table if exists t_student;
- 如果存在這張表,則刪除,不會報錯。
4.insert插入資料(DML)
插入資料的語法格式:
insert into 表名(欄位1,欄位2,欄位3...) values(值1,值1,值1...);#格式1
insert into 表名(欄位1) value(值1);#格式2
insert into 表名 value(值1,值2,值3...);#格式3
4.1插入格式1
欄位名和值要相對應,數量要對應相等,資料型別也要對應相等。
如:
insert into t_student(no,name,age,email) values(1,'LiHua',20,'[email protected]');
insert into t_student(email,name,age,no) values('[email protected]','ZhangSan',22,2);
查詢t_student表:
mysql> select * from t_student;
+------+----------+------+-------------+
| no | name | age | email |
+------+----------+------+-------------+
| 1 | LiHua | 20 | [email protected] |
| 2 | ZhangSan | 22 | [email protected] |
+------+----------+------+-------------+
2 rows in set (0.00 sec)
4.2插入格式2
只插入一個數據:
insert into t_student(no) values(3);
結果:
+------+----------+------+-------------+
| no | name | age | email |
+------+----------+------+-------------+
| 1 | LiHua | 20 | [email protected] |
| 2 | ZhangSan | 22 | [email protected] |
| 3 | NULL | NULL | NULL |
+------+----------+------+-------------+
3 rows in set (0.00 sec)
再次插入一個數據:
insert into t_student(name) values('LiSi');
結果:
+------+----------+------+-------------+
| no | name | age | email |
+------+----------+------+-------------+
| 1 | LiHua | 20 | [email protected] |
| 2 | ZhangSan | 22 | [email protected] |
| 3 | NULL | NULL | NULL |
| NULL | LiSi | NULL | NULL |
+------+----------+------+-------------+
4 rows in set (0.00 sec)
注意:insert語句只要執行成功,就一定會多一條記錄。
沒有給其他欄位指定值的話,預設值是null。
mysql> desc t_student;
+-------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| no | int(11) | YES | | NULL | |
| name | varchar(255) | YES | | NULL | |
| age | int(3) | YES | | NULL | |
| email | varchar(255) | YES | | NULL | |
+-------+--------------+------+-----+---------+-------+
4.3設定預設值
現在我們重新建立一個名為t_student的表,在該表中設定age預設值為18:
drop table if exists t_student;
create table t_student(
no int,
name varchar(255),
age int(3) default 18,
email varchar(255)
);
再次查看錶結構:
mysql> desc t_student;
+-------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| no | int(11) | YES | | NULL | |
| name | varchar(255) | YES | | NULL | |
| age | int(3) | YES | | 18 | |
| email | varchar(255) | YES | | NULL | |
+-------+--------------+------+-----+---------+-------+
在表中插入一條資料:
insert into t_student(no) values(1);
查詢資料:
mysql> select * from t_student;
+------+------+------+-------+
| no | name | age | email |
+------+------+------+-------+
| 1 | NULL | 18 | NULL |
+------+------+------+-------+
1 row in set (0.00 sec)
可見,如果沒有給age指定值,預設值為18。
4.4插入格式3
insert語句中,跟在表名後的小括號中的欄位名可以省略:
insert into t_student value(2);#錯誤
注意:前面的欄位名省略的話,就等於是全寫上了,後面的值都要寫上。
insert into t_student value(2,'Lisi',20,'[email protected]');
查詢:
mysql> select * from t_student;
+------+------+------+-------------+
| no | name | age | email |
+------+------+------+-------------+
| 1 | NULL | 18 | NULL |
| 2 | Lisi | 20 | [email protected] |
+------+------+------+-------------+
2 rows in set (0.00 sec)
4.5一次插入多條記錄
insert into t_student(no,name,age,email) values
(3,'wangwu',22,'[email protected]'),
(4,'zhaoliu',23,'[email protected]');
查詢資料:
mysql> select * from t_student;
+------+---------+------+-------------+
| no | name | age | email |
+------+---------+------+-------------+
| 1 | NULL | 18 | NULL |
| 2 | Lisi | 20 | [email protected] |
| 3 | wangwu | 22 | [email protected] |
| 4 | zhaoliu | 23 | [email protected] |
+------+---------+------+-------------+
4 rows in set (0.00 sec)
4.6插入日期
4.6.1數字格式化:format
員工薪資:
mysql> select ename,sal from emp;
+--------+---------+
| ename | sal |
+--------+---------+
| SMITH | 800.00 |
| ALLEN | 1600.00 |
| WARD | 1250.00 |
| JONES | 2975.00 |
| MARTIN | 1250.00 |
| BLAKE | 2850.00 |
| CLARK | 2450.00 |
| SCOTT | 3000.00 |
| KING | 5000.00 |
| TURNER | 1500.00 |
| ADAMS | 1100.00 |
| JAMES | 950.00 |
| FORD | 3000.00 |
| MILLER | 1300.00 |
+--------+---------+
14 rows in set (0.00 sec)
加入千分位:
mysql> select ename,format(sal,'$999,999') as sal from emp;
+--------+-------+
| ename | sal |
+--------+-------+
| SMITH | 800 |
| ALLEN | 1,600 |
| WARD | 1,250 |
| JONES | 2,975 |
| MARTIN | 1,250 |
| BLAKE | 2,850 |
| CLARK | 2,450 |
| SCOTT | 3,000 |
| KING | 5,000 |
| TURNER | 1,500 |
| ADAMS | 1,100 |
| JAMES | 950 |
| FORD | 3,000 |
| MILLER | 1,300 |
+--------+-------+
14 rows in set, 14 warnings (0.00 sec)
4.6.2str_to_date
將字串varchar型別轉換為date型別。
現建立一個t_user表:
create table t_user(
id int,
name varchar(255),
birth date//生日可以用日期型別
);
日期型別的資料該如何插入呢?
mysql> insert into t_user(id,name,birth) values(1,'zhangsan','01-02-1999');
ERROR 1292 (22007): Incorrect date value: '01-02-1999' for column 'birth' at row 1
報錯,原因是型別不匹配。資料庫birth是date型別,這裡給了一個字串varchar。
此時,我們可以使用str_to_date函式進行型別轉換。
str_to_date函式可以將字串轉換為date日期型別。
語法格式:
str_to_date('字串日期','日期格式')
mysql的日期格式:
- 年:%Y
- 月:%m
- 日:%d
- 時:%h
- 分:%i
- 秒:%s
插入日期資料:
insert into t_user(id,name,birth) values(1,'zhangsan',str_to_date('01-02-1999','%d-%m-%Y'));
查詢資料:
mysql> select * from t_user;
+------+----------+------------+
| id | name | birth |
+------+----------+------------+
| 1 | zhangsan | 1999-02-01 |
+------+----------+------------+
1 row in set (0.00 sec)
str_to_date函式通常使用在insert插入資料方面,因為插入時需要一個日期型別的資料,需要通過該函式將字串轉換為date型別。
好訊息:
如果插入時的日期字串為'%Y-%m-%d',也就是”年-月-日“的格式時,就不需要使用str_to_date函式,mysql會自動轉換為日期型別。
insert into t_user(id,name,birth) values(1,'zhangsan','1999-02-01');
4.6.3date_format
如果我們想在查詢時以特定日期格式展示資料,就可以使用date_format函式。
date_format函式可以將date型別轉換為具有一定格式的varchar字串型別。
使用格式:date_format(日期型別資料,'日期格式')
select id,name,date_format(birth,'%d/%m/%Y') as birth
from t_user;
結果:
+------+----------+------------+
| id | name | birth |
+------+----------+------------+
| 1 | zhangsan | 01/02/1999 |
+------+----------+------------+
這個函式通常用於查詢日期方面。可以設定日期的展示格式。
如果不使用date_format函式,直接查詢birth欄位:
mysql> select id,name,birth from t_user;
+------+----------+------------+
| id | name | birth |
+------+----------+------------+
| 1 | zhangsan | 1999-02-01 |
+------+----------+------------+
1 row in set (0.00 sec)
如果不使用date_format函式,直接查詢,會進行預設的日期格式化,自動將資料庫中的date型別轉換為varchar型別。
並且採用mysql預設的日期格式:'%Y-%m-%d'
4.6.4date和datetime的區別
date是短日期:只包括年月日資訊。
datetime是長日期:包括年月日、時分秒資訊。
現建立t_date表:
drop table if exists t_date;
create table t_date(
name varchar(32),
birth date,
nowdate datetime
);
birth是短日期
- mysql短日期預設格式:%Y-%m-%d
nowdate是長日期
- mysql長日期預設格式:%Y-%m-%d %h:%i:%s
插入資料:
insert into t_date(name,birth,nowdate) values('Zhangsan','1999-02-01','2021-07-21 20:36:07');
檢視資料:
mysql> select * from t_date;
+----------+------------+---------------------+
| name | birth | nowdate |
+----------+------------+---------------------+
| Zhangsan | 1999-02-01 | 2021-07-21 20:36:07 |
+----------+------------+---------------------+
1 row in set (0.00 sec)
另外,在mysql中可以通過now()函式獲取系統當前時間:
並且是datetime型別的。
insert into t_date(name,birth,nowdate) values('Lisi','2000-03-08',now());
檢視資料:
mysql> select * from t_date;
+----------+------------+---------------------+
| name | birth | nowdate |
+----------+------------+---------------------+
| Zhangsan | 1999-02-01 | 2021-07-21 20:36:07 |
| Lisi | 2000-03-08 | 2021-07-21 20:40:12 |
+----------+------------+---------------------+
2 rows in set (0.00 sec)
5.update修改資料(DML)
語法格式:
update 表名 set 欄位名1 = 值1,欄位名2 = 值2...where 條件;
注意:如果沒有條件限制會更新全部資料。
查詢t_student表中資料:
mysql> select * from t_student;
+------+---------+------+-------------+
| no | name | age | email |
+------+---------+------+-------------+
| 1 | NULL | 18 | NULL |
| 2 | Lisi | 20 | [email protected] |
| 3 | wangwu | 22 | [email protected] |
| 4 | zhaoliu | 23 | [email protected] |
+------+---------+------+-------------+
修改第一條記錄:
update t_student set name = 'Zhangsan',email = '[email protected]' where no = 1;
重新查詢:
mysql> select * from t_student;
+------+----------+------+-------------+
| no | name | age | email |
+------+----------+------+-------------+
| 1 | Zhangsan | 18 | [email protected] |
| 2 | Lisi | 20 | [email protected] |
| 3 | wangwu | 22 | [email protected] |
| 4 | zhaoliu | 23 | [email protected] |
+------+----------+------+-------------+
4 rows in set (0.00 sec)
如果不加條件的話:
update t_student set age = 3;
查詢表:
mysql> select * from t_student;
+------+----------+------+-------------+
| no | name | age | email |
+------+----------+------+-------------+
| 1 | Zhangsan | 3 | [email protected] |
| 2 | Lisi | 3 | [email protected] |
| 3 | wangwu | 3 | [email protected] |
| 4 | zhaoliu | 3 | [email protected] |
+------+----------+------+-------------+
所有age欄位的值都改變了。
6.delete刪除資料(DML)
語法格式:
delete from 表名 where 條件;
注意:如果不加條件,會刪除整張表的資料。
查詢t_student表資料:
mysql> select * from t_student;
+------+----------+------+-------------+
| no | name | age | email |
+------+----------+------+-------------+
| 1 | Zhangsan | 3 | [email protected] |
| 2 | Lisi | 3 | [email protected] |
| 3 | wangwu | 3 | [email protected] |
| 4 | zhaoliu | 3 | [email protected] |
+------+----------+------+-------------+
刪除no = 3的記錄:
delete from t_student where no = 3;
重新查詢:
mysql> select * from t_student;
+------+----------+------+-------------+
| no | name | age | email |
+------+----------+------+-------------+
| 1 | Zhangsan | 3 | [email protected] |
| 2 | Lisi | 3 | [email protected] |
| 4 | zhaoliu | 3 | [email protected] |
+------+----------+------+-------------+
如果不加條件:
delete from t_student;
再次查詢:
mysql> select * from t_student;
Empty set (0.00 sec)
所有資料已刪除。
7.表的快速複製
如何快速複製一張表?
create table emp2 as select * from emp;
查看錶:
mysql> show tables;
+-----------------+
| Tables_in_tsccg |
+-----------------+
| dept |
| emp |
| emp2 |
| salgrade |
| t_date |
| t_user |
| user |
+-----------------+
7 rows in set (0.00 sec)
原理:
- 將查詢結果當作一張新表建立
- 可以完成表的快速複製
- 表中資料也會保留
- 可以查詢出一張表的部分資料進行復制
8.將查詢結果插入到一張表中
查詢表t_date:
mysql> select * from t_date;
+----------+------------+---------------------+
| name | birth | nowdate |
+----------+------------+---------------------+
| Zhangsan | 1999-02-01 | 2021-07-21 20:36:07 |
| Lisi | 2000-03-08 | 2021-07-21 20:40:12 |
+----------+------------+---------------------+
2 rows in set (0.00 sec)
複製t_date表:
create table t_date2 as select * from t_date;
將t_date2表中的資料全部刪除:
delete from t_date2;
查詢t_date2表:
mysql> select * from t_date2;
Empty set (0.00 sec)
現在查詢t_date表,將查詢結果插入到t_date2表中:
insert into t_date2 select * from t_date;
再次查詢t_date2表:
mysql> select * from t_date2;
+----------+------------+---------------------+
| name | birth | nowdate |
+----------+------------+---------------------+
| Zhangsan | 1999-02-01 | 2021-07-21 20:36:07 |
| Lisi | 2000-03-08 | 2021-07-21 20:40:12 |
+----------+------------+---------------------+
2 rows in set (0.00 sec)
9.快速刪除表中資料(truncate)【重要】
使用delete刪除t_date2表中資料:
mysql> delete from t_date2;
Query OK, 2 rows affected (0.00 sec)
mysql> select * from t_date2;
Empty set (0.00 sec)
這種方式比較慢。
delete語句刪除資料原理:(DML)
- 表中資料被刪除了,但是資料在硬碟上的真實儲存空間不會被釋放。
- 優點:支援回滾,可以恢復資料。
- 缺點:刪除效率較低。
truncate語句刪除資料原理:(DDL)
- 這種刪除效率較高,表被一次截斷,物理刪除。
- 優點:快速。
- 缺點:不支援回滾。
用法:
truncate table t_date2;
truncate刪除的是表中的資料,表還在。
刪除表:drop table 表名;
10.對錶結構的增刪改
對錶結構的修改就是新增一個欄位、刪除一個欄位或者修改一個欄位。
對錶結構的修改需要使用alter(DDL)。
我們一般不需要掌握這方面的知識,理由如下:
第一:在實際開發中,需求一旦確定,表一旦設計好之後,很少需要進行表結構的修改。而且開發進行中的時候,修改表結構成本比較高。如果中途修改表結構,對應的java程式碼就需要進行大量的修改。這個責任應該由設計人員來承擔。
第二:由於修改表結構的操作很少,所以我們不需要掌握。如果遇到一定要修改表結構的情況時,我們可以使用工具來操作。
修改表結構的操作是不需要寫入java程式中的,也不是java程式設計師的範疇。