目錄
引言:
一、表的操作
1.1 創建學生表
?1.2 查看表結構
1.3 刪除表
1.4 修改表名
1.5?添加字段
1.6?修改字段
1.7?刪除字段
1.8?小結
二、CRUD
2.1 新增(Create)數據
2.2 查詢(Retrieve)數據
2.3 修改(Update)數據
2.4 刪除(Delete)數據
2.5 小結
引言:
在數據庫中,表(Table)?是最基礎也最重要的數據結構。然而,許多開發者在初次接觸MySQL時,往往只關注SQL查詢的編寫,卻忽視了表操作的重要性。一個設計不當的表結構,可能導致數據冗余、查詢性能低下,甚至引發數據一致性問題。
本文將帶您深入MySQL表操作的每一個細節,從基礎的DDL語句到高級的優化策略,助您構建出高效、穩定、易維護的數據表結構。
一、表的操作
想要操作數據庫中的表時,需要先使用該數據庫:(以數據庫school為例)
use school;
?注釋:在 SQL 中可以使用"--空格+描述"來表示注釋說明
1.1 創建學生表
create table 表名(字段名 字段類型,字段名 字段類型,字段名 字段類型,字段名 字段類型
);-- 或者
create table 表名(字段名 字段類型,字段名 字段類型,字段名 字段類型,字段名 字段類型);
可以使用 comment 增加字段說明。示例:
create table student(id int,name varchar(20) comment '姓名',gender varchar(20) comment '性別',phone varchar(20) comment '電話'
);
常用數據類型:?
- int:整型
- decimal(M,D):浮點數類型
- varchar(size):字符串類型
- timestamp:日期類型
?1.2 查看表結構
desc 表名;
1.3 刪除表
-- 刪除student表
drop table student;-- 如果存在student表,則刪除student表
drop table if exists student;
1.4 修改表名
alter table 表名 rename to 新表名;
1.5?添加字段
alter table 表名 add 字段名 字段類型 [約束];
1.6?修改字段
alter table 表名 change 舊字段名 新字段名 字段類型 [約束];
1.7?刪除字段
alter table 表名 drop 字段名;
1.8?小結
-- 創建表
create table 表名(字段名 字段類型,字段名 字段類型,字段名 字段類型,字段名 字段類型);-- 查看庫中的表
show tables;-- 查看表結構
desc 表名;-- 刪除
drop table 表名;-- 修改表名
alter table 表名 rename to 新表名;-- 添加字段
alter table 表名 add 字段名 字段類型 [約束];-- 修改字段
alter table 表名 change 舊字段名 新字段名 字段類型 [約束];-- 刪除字段
alter table 表名 drop 字段名;
二、CRUD
CRUD 即增加(Create)、查詢(Retrieve)、更新(Update)、刪除(Delete)
學習表的增刪查改的前提是,我們得先有一張表才行。
-- 1.創建數據庫school
create database school;-- 2.使用數據庫
use school;-- 3.建表
create table student(id int,name varchar(20) comment '姓名',gender varchar(20) comment '性別',phone varchar(20) comment '電話'
);
2.1 新增(Create)數據
insert into 表名 [(列,列,列,列...)] values(值,值,值,值...);
-- 此處的值,要和列相匹配(列的個數和類型)
-- 帶上[ ] 為指定列插入 不帶為默認全列插入
單行數據 + 全列插入:
insert into student values (1,'劉備','男','112233');
insert into student values (2,'關羽','男','123456');
insert into student values (3,'張飛','男','778833');
多行數據 + 指定列插入:
insert into student (id,name,gender) values(4,'呂布','男'),(5,'貂蟬','女'),(6,'趙云','男');
?
2.2 查詢(Retrieve)數據
SELECT[DISTINCT] {* | {column [, column] ...} [FROM table_name][WHERE ...][ORDER BY column [ASC | DESC], ...]LIMIT ...
示例:
-- 創建考試表
CREATE TABLE exam_result (id INT,name VARCHAR(20),chinese DECIMAL(3,1),math DECIMAL(3,1),english DECIMAL(3,1)
);-- 插入測試數據
INSERT INTO exam_result (id,name, chinese, math, english) VALUES(1,'唐三藏', 67, 98, 56),(2,'孫悟空', 87.5, 78, 77),(3,'豬悟能', 88, 98.5, 90),(4,'曹孟德', 82, 84, 67),(5,'劉玄德', 55.5, 85, 45),(6,'孫權', 70, 73, 78.5),(7,'宋公明', 75, 65, 30);
全列查詢:
select * from 表名;-- 通常情況下不建議使用 * 進行全列查詢
-- 1.查詢的列越多,意味著要傳輸的數據量越大
-- 2.可能會影響索引的使用(索引會在后續提到)
?指定列查詢:
select 列名,列名,列名 from 表名;
查詢字段為表達式:
-- 查詢所有同學的總分(語文 + 數學 + 英語)
select id,name,chinese + math + english from exam_result;
為查詢結果中的列指定別名,表示返回的結果集中,以別名作為該列的名稱:
select 列/表達式 as 別名 from 表名;
去重查詢:DISTINCT
select distinct 列名 from 表名;
排序:ORDER BY
-- ASC 為升序(從小到大)
-- DESC 為降序(從大到小)
-- 默認為 ASC
SELECT ... FROM 表名 [WHERE ...] ORDER BY 列名 [ASC|DESC];
條件查詢:WHERE
比較運算符:
運算符 | 說明 |
>, >=, <, <= | 大于,大于等于,小于,小于等于 |
= | 等于,NULL 不安全,例如 NULL = NULL 的結果是 NULL |
<=> | 等于,NULL 安全,例如 NULL <=> NULL 的結果是TRUE |
!=, <> | 不等于 |
between a0 and a1 | 范圍匹配,[a0, a1],如果 a0 <= values <= a1,返回TRUE |
in(a,b,c...) | 如果是a,b,c...其中的任意一個,返回TRUE |
IS NULL | 是 NULL |
IS NOT NULL | 不是 NULL |
LIKE | 模糊匹配。 % 表示任意多個(包括 0 個)任意字符; _ 表示任意一個字符 |
邏輯運算符:
運算符 | 說明 |
AND | 與。多個條件必須都為 TRUE,結果才是 TRUE |
OR | 或。任意一個條件為 TRUE, 結果為 TRUE |
NOT | 非。條件為 TRUE,結果為 FALSE |
注意:
- WHERE條件可以使用表達式,但不能使用別名
- AND 的優先級高于 OR ,在同時使用時,需要使用小括號 () 包裹優先執行的部分
2.3 修改(Update)數據
update 表名 set 列名 = 值 [WHERE ...];
-- 將所有同學的語文成績更新為原來的 2 倍
UPDATE exam_result SET chinese = chinese * 2;-- 將孫悟空同學的數學成績變更為 80 分
UPDATE exam_result SET math = 80 WHERE name = '孫悟空';-- 將曹孟德同學的數學成績變更為 60 分,語文成績變更為 70 分
UPDATE exam_result SET math = 60, chinese = 70 WHERE name = '曹孟德';
2.4 刪除(Delete)數據
delete from 表名 [WHERE ...] [ORDER BY ...];
-- 刪除孫悟空同學的考試成績
DELETE FROM exam_result WHERE name = '孫悟空';
-- 刪除整張表數據
-- 準備測試表
CREATE TABLE for_delete (id INT,name VARCHAR(20)
);
-- 插入測試數據
INSERT INTO for_delete (name) VALUES ('A'), ('B'), ('C');
-- 刪除整表數據
DELETE FROM for_delete;
2.5 小結
- 新增
-- 單行插入 insert into 表名 [(列,列,列,列...)] values(值,值,值,值...);-- 多行插入 insert into 表名 (字段1, ... , 字段n) values(value1,...),(value2,...),(value3,...);
- 查詢
-- 全列查詢 select * from 表-- 指定列查詢 select 字段1,字段2... from 表-- 查詢表達式字段 select 字段1 + 100,字段2 + 字段3 from 表-- 別名 select 字段1 as 別名1, 字段2 as 別名2 from 表-- 去重DISTINCT select distinct 字段 from 表-- 排序ORDER BY select * from 表 order by 排序字段-- 條件查詢WHERE: -- (1)比較運算符 (2)BETWEEN ... AND ... (3)IN (4)IS NULL (5)LIKE (6)AND (7)OR (8)NOT select * from 表 where 條件
- 修改
update 表 set 字段1 = value1, 字段2=value2 ... [where ...];
- 刪除
delete from 表名 [WHERE ...] [ORDER BY ...];
?積跬步,以致千里
下章預告——>?約束
本專欄內容均以 MySQL 8.0 為案例