1. 程式人生 > 其它 >MySQL_07表的相關操作

MySQL_07表的相關操作

MySQL_07表的相關操作

1.建立表的語法格式(DDL)

建表屬於DDL語句,DDL包括:create、drop、alter。

create table 表名(欄位名1 資料型別,欄位名2 資料型別,欄位名3 資料型別);

我習慣於使用如下格式:

create table 表名(
    欄位名1 資料型別,
    欄位名2 資料型別,
    欄位名3 資料型別
);

如何取表名和欄位名?

  1. 表名:建議以“t_”或者“tbl__”開始,可讀性強,見名知意。
  2. 欄位名:見名知意。

表名和欄位名都屬於識別符號。

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刪除表

  1. drop table t_student;
    • 當這張表不存在時會報錯。
  2. 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程式設計師的範疇。