精選專欄鏈接 🔗
- MySQL技術筆記專欄
- Redis技術筆記專欄
- 大模型搭建專欄
- Python學習筆記專欄
- 深度學習算法專欄
歡迎訂閱,點贊+關注,每日精進1%,與百萬開發者共攀技術珠峰
更多內容持續更新中!希望能給大家帶來幫助~ 😀😀😀
MySQL數據庫與表的創建、修改及數據操作指南
- 1,數據庫的創建和管理
- 1.1,創建數據庫
- 1.2,使用數據庫
- 1.3,修改數據庫
- 1.4,刪除指定數據庫
- 2,表的創建和管理
- 2.1,表的創建
- 2.2,查看數據表結構
- 2.3,修改表
- 2.3.1,添加字段
- 2.3.2,修改字段
- 2.3.3,重命名字段
- 2.3.4,刪除字段
- 2.4,重命名表
- 2.5,刪除表
- 2.6,清空表
- 3,數據操作
- 3.1,添加數據
- 3.1.1,VALUES的方式添加
- 3.1.2,將查詢結果插入到表中
- 3.3,修改數據
- 3.2,刪除數據
- 3.3,對比TRUNCATE TABLE 和 DELETE FROM
- 3.4,MySQL8新特性:計算列
1,數據庫的創建和管理
1.1,創建數據庫
創建數據庫的三種常用方式如下,推薦使用方式三:
方式一:創建數據庫
CREATE DATABASE 數據庫名;
方式二:創建數據庫并指定字符集
CREATE DATABASE 數據庫名 CHARACTER SET 字符集;
方式三:判斷數據庫是否已經存在,不存在則創建數據庫(
推薦
)
# 如果MySQL中已經存在相關的數據庫,則忽略創建語句,不再創建數據庫。
CREATE DATABASE IF NOT EXISTS 數據庫名;
注意:
- DATABASE 不能改名。一些可視化工具可以改名,它是建新庫,把所有表復制到新庫,再刪舊庫完成的;
- 如果創建表時沒有指明使用的字符集,則默認使用表所在的數據庫的字符集;
1.2,使用數據庫
① 查看當前所有的數據庫:
SHOW DATABASES;
② 查看當前正在使用的數據庫
SELECT DATABASE(); #使用的一個 mysql 中的全局函數
③ 查看指定庫下所有的表
SHOW TABLES FROM 數據庫名;
④ 查看數據庫的創建信息
SHOW CREATE DATABASE 數據庫名;
或者:
SHOW CREATE DATABASE 數據庫名\G
⑤ 使用/切換數據庫
USE 數據庫名;
注意:要操作表格和數據之前必須先說明是對哪個數據庫進行操作。
1.3,修改數據庫
更改數據庫字符集
ALTER DATABASE 數據庫名 CHARACTER SET 字符集; #比如:'gbk'、'utf8'等
1.4,刪除指定數據庫
- 方式一:
DROP DATABASE 數據庫名;
- 方式二:(
推薦
)
DROP DATABASE IF EXISTS 數據庫名;
2,表的創建和管理
2.1,表的創建
創建表方式一:從零創建
語法格式:
CREATE TABLE [IF NOT EXISTS] 表名(字段1, 數據類型 [約束條件] [默認值],字段2, 數據類型 [約束條件] [默認值],字段3, 數據類型 [約束條件] [默認值],……[表約束條件]
);
SQL示例:
CREATE TABLE IF NOT EXISTS myemp1( #需要用戶具備創建表的權限。
id INT,
emp_name VARCHAR(15), #使用VARCHAR來定義字符串,必須在使用VARCHAR時指明其長度。
hire_date DATE
);
創建完成后可以使用如下SQL查看表結構:
DESC myemp1;
運行結果如下:
表的創建方式二:基于子查詢創建新表
語法格式:
CREATE TABLE 表名 AS 子查詢
SQL示例:
CREATE TABLE emp1 AS SELECT * FROM employees;
CREATE TABLE myemp3
AS
# 說明:查詢語句中字段的別名,可以作為新創建的表的字段的名稱
SELECT e.employee_id emp_id,e.last_name lname,d.department_name
FROM employees e JOIN departments d
ON e.department_id = d.department_id;
注意:
- 查詢語句中字段的別名,可以作為新創建的表的字段的名稱
- 此時的查詢語句可以結構比較豐富,使用前面章節講過的各種SELECT,具體可以看文章開頭的
MySQL技術筆記專欄
練習:
需求1:創建一個表employees_copy,實現對employees表的復制,包括表數據
CREATE TABLE employees_copy
AS
SELECT *
FROM employees;
需求2:創建一個表employees_blank,實現對employees表的復制,不包括表數據
CREATE TABLE employees_blank
AS
SELECT *
FROM employees
WHERE 1 = 2;
2.2,查看數據表結構
在MySQL中創建好數據表之后,可以查看數據表的結構。MySQL支持使用 DESCRIBE 或 DESC
語句查看數據表結構,也支持使用SHOW CREATE TABLE
語句查看數據表結構。
語法格式如下:
SHOW CREATE TABLE 表名\G
使用SHOW CREATE TABLE語句不僅可以查看表創建時的詳細語句,還可以查看存儲引擎和字符編碼。
2.3,修改表
2.3.1,添加字段
先查看myemp1的結構:
DESC myemp1;
給myemp1表添加字段salary:
ALTER TABLE myemp1
# (10,2)表示一共有10位(包括小數點),2表示小數點后保留2位
ADD salary DOUBLE(10,2);
添加后繼續通過DESC myemp1;
查看表結構:
注意:添加字段時,默認添加到表中的最后一個字段的位置。如果不想添加到最后一個字段位置可以顯式指定。 比如:
需求:添加phone_number字段到表中的第一個字段位置:
ALTER TABLE myemp1
ADD phone_number VARCHAR(20) FIRST;
需求:添加email字段到表中的emp_name字段后面
ALTER TABLE myemp1
ADD email VARCHAR(45) AFTER emp_name;
2.3.2,修改字段
修改字段使用ALTER關鍵字
需求:修改emp_name字段的
最大長度
位25(原本是15)
ALTER TABLE myemp1
MODIFY emp_name VARCHAR(25) ;
需求:修改emp_name字段的
最大長度
位35,并修改默認值為 ’aaa‘
ALTER TABLE myemp1
MODIFY emp_name VARCHAR(35) DEFAULT 'aaa';
通過DESC myemp1;
查看表結構:
- 設置默認值可以實現:當我們向表中插入數據的時候,沒有指定該字段時,會自動使用此默認值。
2.3.3,重命名字段
重命名字段使用CHANGE關鍵字。
需求:將salary 字段改為monthly_salary
ALTER TABLE myemp1
CHANGE salary monthly_salary DOUBLE(10,2);
運行后,通過DESC myemp1;
查看表結構:
重命名字段的同時還可以修改字段長度,比如:
ALTER TABLE myemp1
CHANGE email my_email VARCHAR(50);
2.3.4,刪除字段
刪除字段使用DROP關鍵字。
需求:刪除my_email字段(或my_email列)
ALTER TABLE myemp1
DROP COLUMN my_email;
2.4,重命名表
重命名表有兩種方式,分別是:RENAME方式和ALTER方式
方式一:RENAME方式
RENAME TABLE myemp1
TO myemp11;
方式二:ALTER方式
ALTER TABLE myemp2
RENAME TO myemp12;
2.5,刪除表
刪除表操作使用DROP關鍵字,不光將表結構刪除掉,同時表中的數據也刪除掉,釋放表空間。
需求:刪除表myemp12
DROP TABLE IF EXISTS myemp12;
2.6,清空表
清空表使用TRUNCATE關鍵字,表示清空表中的所有數據,但是表結構保留。
需求:清空employees_copy
employees_copy 表中原本有如下數據:
清空表:
TRUNCATE TABLE employees_copy;
再次查詢表中記錄:
3,數據操作
3.1,添加數據
可以使用 INSERT 語句向表中插入數據。有如下兩種插入方式:
- 使用VALUES方式插入數據;
- 將查詢結果插入到表中,可快速地
從一個或多個表中向一個表中插入多行
;
接下來一一介紹:
3.1.1,VALUES的方式添加
情況1: 沒有指明添加的字段。
此時值列表中需要為表的每一個字段指定值,并且值的順序必須和數據表中字段聲明時的順序相同,否則可能報錯。語法格式如下:
INSERT INTO 表名
VALUES (value1,value2,....);
emp1表結構如下:
插入數據SQL實例如下:
INSERT INTO emp1
VALUES (1,'Tom','2000-12-21',3400); #注意:一定要按照聲明的字段的先后順序添加
插入后執行查詢:
SELECT *
FROM emp1;
查詢結果如下:
情況2: 指明要添加的字段 (推薦)
INSERT INTO emp1(id,hire_date,salary,`name`) # 插入時需要和此處的字段順序匹配
VALUES(2,'1999-09-09',4000,'Jerry');
插入后,查詢結果如下:
情況3: 同時插入多條記錄
INSERT INTO emp1(id,NAME,salary)
VALUES
(4,'Jim',5000), # 多條記錄之間使用逗號隔開
(5,'張俊杰',5500);
插入后,查詢結果如下:
3.1.2,將查詢結果插入到表中
將查詢結果插入到表中會結合SELECT查詢語句。
SQL示例:
INSERT INTO emp1(id,NAME,salary,hire_date)
#查詢語句
SELECT employee_id,last_name,salary,hire_date
FROM employees
WHERE department_id IN (70,60);
注意:
- 查詢的字段一定要與添加到的表的字段一 一對應;
- 上述SQL中,
emp1表中要添加的數據的字段的最大長度不能低于employees表中查詢的字段的長度
。否則會有添加不成功的風險。
如果emp1中的最大字段長度小,employees中的最大字段長度更大,可能出問題;比如:employees表中last_name字段長度為 varchar(25),emp1表中name字段長度為 varchar(15),執行上述SQL,如果employees表中某條記錄的last_name長為20,則會報錯。
3.3,修改數據
使用 UPDATE …SET…語句修改數據。語法如下:
UPDATE table_name
SET column1=value1, column2=value2, … , column=valuen
[WHERE condition]
需求:修改id為5的員工的hire_date為當前時間
SQL語句如下:
UPDATE emp1
SET hire_date = CURDATE()
WHERE id = 5;
需求:修改4號員工的薪資為6000,hire_date為當前時間
UPDATE emp1
SET hire_date = CURDATE(),salary = 6000
WHERE id = 4;
需求:將表中姓名中包含字符a的提薪20%
UPDATE emp1
SET salary = salary * 1.2
WHERE NAME LIKE '%a%';
注意:
- UPDATE語句可以一次更新多條數據。如果省略 WHERE 子句,則表中的所有數據都將被更新;
3.2,刪除數據
使用 DELETE FROM 刪除數據 。語法如下:
DELETE FROM table_name [WHERE <condition>];
需求:刪除表中id為1的員工信息
SQL語句如下:
DELETE FROM emp1
WHERE id = 1;
3.3,對比TRUNCATE TABLE 和 DELETE FROM
對比二者之前,需要了解數據庫中的 COMMIT命令 和 ROLLBACK命令 :
COMMIT提交數據:
一旦執行COMMIT,則數據就被永久的保存在了數據庫中,意味著數據不可以回滾;ROLLBACK回滾數據:
一旦執行ROLLBACK,則可以實現數據的回滾。回滾到最近的一次COMMIT之后;
TRUNCATE TABLE 和 DELETE FROM 的相同點:
- 都可以實現對表中所有數據的刪除,同時保留表結構。
TRUNCATE TABLE 和 DELETE FROM 的不同點:
- TRUNCATE TABLE: 一旦執行此操作,表數據全部清除。同時,
數據是不可以回滾的;
- DELETE FROM: 一旦執行此操作,表數據可以全部清除(不帶WHERE的DELETE FROM語句)。同時,
數據是可以實現回滾的;
原因是:
- TRUNCATE TABLE屬于DDL數據定義語言,DELETE FROM屬于DML數據操作語言;
- DDL數據定義語言一旦執行就不可回滾(因此執行DDL操作要慎重);
- DML數據操作語言,默認情況下,一旦執行,也是不可回滾的,但是如果在執行DML之前,執行了
SET autocommit = FALSE
,則執行的DML操作就可以實現回滾; SET autocommit = FALSE
指令對DDL操作無效。因為在執行完DDL操作之后,一定會執行一次COMMIT。而此COMMIT操作不受SET autocommit = FALSE
指令影響。
SQL演示:DELETE FROM
① 先提交一次
COMMIT;
② 查看表中數據
SELECT *
FROM emp1;
運行結果如下:
③ 禁用自動提交
SET autocommit = FALSE;
④ 執行 TRUNCATE TABLE
TRUNCATE TABLE emp1;
查看表中數據發現刪除成功:
⑤ 回滾
ROLLBACK;
回滾后查看表中數據發現數據回滾成功,回滾到最近一次COMMIT之后:
SQL演示:TRUNCATE TABLE
① 先提交一次
COMMIT;
② 查看表中數據
SELECT *
FROM emp1;
運行結果如下:
③ 禁用自動提交
SET autocommit = FALSE;
④ 執行DELETE FROM
DELETE FROM emp1;
查看表中數據發現刪除成功:
⑤ 回滾
ROLLBACK;
回滾后查看表中數據發現數據回滾后數據未恢復:
3.4,MySQL8新特性:計算列
計算列簡單來說就是某一列的值是通過別的列計算得來的。
例如,a列值為1、b列值為2,c列不需要手動插入,定義a+b的結果為c的值,那么c就是計算列,是通過別的列計算得來的。
在MySQL 8.0中,CREATE TABLE 和 ALTER TABLE 中都支持增加計算列。下面以CREATE TABLE為例進行講解。
需求:定義數據表tb1,然后定義字段id、字段a、字段b和字段c,其中字段c為計算列,用于計算 a+b 的值。
首先創建測試表tb1:
CREATE TABLE tb1(
id INT,
a INT,
b INT,
c INT GENERATED ALWAYS AS (a + b) VIRTUAL # 字段c即為計算列
);
插入一條記錄:
# 只指明了字段a和字段b
INSERT INTO tb1(a,b) VALUES (100,200);
查看數據:
SELECT * FROM tb1;
運行結果如下,c字段自動計算出結果:
更新字段值:
UPDATE tb1 SET a = 500;
查看數據:
SELECT * FROM tb1;
運行結果如下,c字段自動更新結果: