1.DDL數據定義語言
DDL是什么——————創建、修改、刪除 數據庫和表結構的命令。
基本語法
針對數據庫的操作
-- 創建數據庫
CREATE DATABASE 數據庫名;
-- 比如
CREATE DATABASE myschool;
--查看所有數據庫
SHOW DATABASES;
--使用某個數據庫
USE myschool;
-- 刪除數據庫//需謹慎
DROP DATABASE myschool;
針對表的操作
-- 創建表
CREATE TABLE 表名 (字段名1 數據類型,字段名2 數據類型,...
);
-- 比如
CREATE TABLE LI(
name VARCHAR(10),
age INT,
hobby VARCHAR(20);
)--1.2.2 數據類型(常用)
--表格
--復制
--類型 說明 例子
--INT 整數 10, 20
--VARCHAR(n) 字符串 '張三'
--DATE 日期 '2025-08-09'
--FLOAT 小數 3.14--查看當前數據庫的所有表
SHOW TABLES;
--查看表結構
DESC students;
--刪除表
DROP TABLE students;-- 修改表結構(ALTER)
--添加一列
ALTER TABLE students ADD COLUMN email VARCHAR(50);
--刪除一列
ALTER TABLE students DROP COLUMN email;
--修改列名或類型
ALTER TABLE students CHANGE COLUMN name fullname VARCHAR(30);
-- COLUMN :列 ALTER ;改變
--“建庫用 CREATE,看庫用 SHOW,用庫寫 USE,刪庫要小心!”
--“建表寫 CREATE TABLE,看表結構用 DESC,改表結構用 ALTER。”
小練習
1.創建一個數據庫叫 testdb
2.創建一個表叫 users,字段有:id INT,username VARCHAR(20)
3.查看表結構
4.添加一個字段 email VARCHAR(50)
5.刪除這個表
1
CREATE DATABASE testdb;
2
CREATE TABLE users(
id INT,
username VARCHAR(20)
);
3
DESC users;
4
ALTER TABLE users ADD COLUMN email VARCHAR(50);
5
DROP TABLE users;
2.DML (Data Manipulation Language)數據操縱語言
核心語法
插入數據(INSERT)
假設我們已經有了這張表
CREATE DATABASE testdb;
USE testdb;CREATE TABLE users (id INT,username VARCHAR(20),email VARCHAR(50)
);
但是現在我們想給這個數據庫表插入數據我們可以選擇運行
-- 單個數據插入
INSERT INTO users (id, username, email)
VALUES
(1, '張三', 'zhangsan@qq.com');
這樣子我們就有了張三這個數據庫實例
當然一個一個添加太麻煩了我們可以批量添加
-- 多個數據插入
INSERT INTO users (id, username, email)
VALUES
(2, '李四', 'lisi@qq.com'),
(3, '王五', 'wangwu@qq.com');
相對于來說就是加個逗號結尾還是用常規結束符;
我們也可以選擇插入部分字段(其余為NULL)
-- 插入部分字段(其余為NULL)
INSERT INTO users (id, username)
VALUES (4, '趙六');
數據修改(UPDATE)
UPDATE users
SET email = 'new_email@qq.com'
WHERE id = 1;、
-- 意為修改id=1 的email為'new_email@qq.com'
數據刪除(DELETE)
--從users表中刪除一個id=4的數據
DELETE FROM users
WHERE id = 4;
練習
1插入 3 個用戶:張三、李四、王五
2把張三的郵箱改成 zhangsan@new.com
3刪除王五
4查看剩下的人
1
INSERT INTO users(username)
VALUES
('張三'),
('李四'),
('王五');
2
UPDATE users SET email ='zhangsan@new.com' WHERE username ='張三'
3
DELETE FROM users WHERE username ='王五'
4
SELECT * FROM users;
3.約束
什么是約束?
約束就是給表里的字段加“規矩”,讓數據不能亂填,保證數據的正確性和一致性
3.1主鍵約束(PRIMARY KEY)
作用:唯一標識一條記錄(就像身份證號)
要求:不能重復,不能為 NULL
通常配合:AUTO_INCREMENT(自動增長)(常用于id)
-- id 會自動從 1、2、3……往上加,保證每個學生都有獨一無二的編號。
CREATE TABLE students (id INT PRIMARY KEY AUTO_INCREMENT
);
聯合主鍵
由多個列組成的主鍵稱為聯合主鍵:
CREATE TABLE student (
student_id INT,
seat_id INT ,
...
PRIMARY KEY (student_id,seat_id))
修改表結構添加主鍵
ALTER TABLE student ADD PRIMARY KEY(cours_id )
刪除主鍵
ALTER TABLE student DROP PRIMARY KEY;
3.2非空約束(NOT NULL)
作用:這個字段必須填,不能空著
name VARCHAR(20) NOT NULL
-- 如果你插入數據時不寫 name,就會報錯!
3.3唯一約束(UNIQUE)
作用:這個字段的值不能重復
email VARCHAR(50) UNIQUE
-- 兩個人的郵箱不能一樣,否則會報錯。
3.4默認值約束(DEFAULT)
作用:如果你不填這個字段,就用默認值
age INT DEFAULT 18
-- 插入數據時不寫 age,MySQL 自動填 18。
3.5零填充約束(ZEROFILL)!! mysql8.0以后版本已刪除
作用:數字前面自動補 0
student_number INT(4) ZEROFILL
-- 插入 1,實際顯示 0001;插入 25,顯示 0025。
3.6自增約束(AUTO_INCREMENT)
作用:每次插入數據,自動加 1
只能用于:整數類型,并且必須是 主鍵 或 唯一鍵
id INT PRIMARY KEY AUTO_INCREMENT
-- 你不需要手動寫 id,MySQL 幫你自動填。
3.7外鍵約束(FOREIGN KEY) (重點)!!!
作用:讓兩個表產生“關聯”,保證數據一致性
class_id INT,
FOREIGN KEY (class_id) REFERENCES classes(id)
-- 學生表里的 class_id 必須是班級表里已經存在的 id,否則插不進去。
一、想像兩份 Excel 表
班級表
id | class_name |
---|---|
1 | 三年二班 |
2 | 四年一班 |
學生表
id | name | class_id |
---|---|---|
1 | 張三 | 1 → 指向三年二班 |
2 | 李四 | 2 → 指向四年一班 |
3 | 王五 | 99 → ? 指向一個根本不存在的班級! |
如果允許王五這條記錄存在,數據就“臟”了。
外鍵的作用就是:
“students 表里的 class_id 只能填 classes 表里已經出現過的 id”
我們先創建一個父表
CREATE TABLE classes (id INT PRIMARY KEY AUTO_INCREMENT,class_name VARCHAR(20)
);
再建(子表),并聲明外鍵
CREATE TABLE students (id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(20) NOT NULL,class_id INT,-- 外鍵聲明:students.class_id 必須來自 classes.idCONSTRAINT fk_stu_clsFOREIGN KEY (class_id) --外鍵REFERENCES classes(id)
);
說明:
? fk_stu_cls 是外鍵的名字,可以隨便取,最好見名知意。
? 數據類型必須一致:students.class_id 與 classes.id 都是 INT。
一對多關系-創建外鍵約束
CREATE TABLE father_table (
id INT PRIMARY KEY,
son_id INT
);
CREATE TABLE son_table (
id INT PRIMARY KEY ,
father_id INT,
FOREIGN KEY (father_id) REFERENCES father_table(son_id)
);.
練習1:外鍵創建
創建一個
orders 訂單表,包含訂單ID、訂單號、客戶ID、訂單日期字段,其中客戶ID作為外鍵引用
customers 表的主鍵。
練習2:外鍵驗證
向e
mployees 表中插入一條dept_id為100的記錄,會發生什么?為什么?
練習3:復合外鍵
如何創建一個
order_items 表,使其包含訂單ID和產品ID兩個外鍵,分別引用
orders 和
products
表?
刪除外鍵
-- 查看表
SHOW CREATE TABLE 表名;
-- 刪除外鍵
ALTER TABLE 表名 DROP FOREIGN KEY 外鍵名;
4.查詢
DQL = Data Query Language,就是用來 查詢數據 的語言。它的核心命令是 SELECT。
簡單查詢
-- 查詢表的所有列
SELECT * FROM studentl;
-- 查詢指定列
SELECT name, age, id FROM student
-- 給予列別名
SELECT name AS 姓名 , age AS 年齡, her AS MY_LOVE FROM student;-- 去重
SELECT DISTINCT id FROM student;
條件查詢(WHERE 子句)
-- 等于
SELECT * FROM students WHERE age = 18;
-- 不等于
SELECT * FROM LOVE WHERE age != 20;
-- 大于
SELECT * FROM students WHERE score > 80;-- BETWEEN...AND
SELECT * FROM LOVE WHERE lover BETWEEN she love me AND I love she ;
-- IN
SELECT * FROM TOBELOVE WHERE IAM IN her heart;
-- IS NULL
SELECT * FROM why_she WHERE my-heart IS NULL ;
-- 邏輯運算符
SELECT * FROM LOVE WHERE me = 'Remance' AND me = 'rich' AND me = 'love she '
常用查詢
排序查詢
-- 升序 上小下大
SELECT * FROM MYBRO ORDER BY AGE ASC;
-- 降序 上大下小
SELECT * FROM MYBRO ORDER BY AGE DESC;
-- 多列排序
SELECT * FROM students ORDER BY id ASC, age DESC;
聚合查詢
-- 統計總數
SELECT COUNT(*) AS 好友總數 FROM friends;
-- 統計我列表的男性總數
SELECT COUNT(*) AS 我的好兄弟有多少 FROM friends WHERE gender = '男';
-- 計算平均身高
select COUNT(*) AS 平均身高 FROM men_high;
-- 計算總成績
SELECT SUM(score) AS 總成績 FROM students;
-- 最高分和最低分
SELECT MAX(score) AS 最高分, MIN(score) AS 最低分 FROM students;
聚合查詢-null值處理
COUNT(*) 包含NULL值的行
COUNT(列名) 不包含NULL值的行
SUM、AVG、MAX、MIN 忽略NULL值
分組查詢
分組查詢: GROUP BY 列名;
分組后篩選: HAVING 條件;
-- 按班級分組,統計每個班級的學生數量
SELECT class_id, COUNT(*) AS 學生數量 FROM students GROUP BY class_id;
-- 按班級分組,計算每個班級的平均成績
SELECT class_id, AVG(score) AS 平均成績 FROM students GROUP BY class_id;
-- 分組后篩選,只顯示學生數量大于2的班級
SELECT class_id, COUNT(*) AS 學生數量 FROM students GROUP BY class_id HAVING COUNT(*) >2;
分頁查詢
核心內容
分頁查詢: LIMIT 偏移量, 每頁數量;
偏移量從0開始
-- 每頁顯示2條數據,查詢第一頁
SELECT * FROM students LIMIT 0, 2;
-- 每頁顯示2條數據,查詢第三頁
SELECT * FROM students LIMIT 2, 2
練習題
- 什么是約束?MySQL支持哪些類型的約束?
約束 是一組規則,用于限制表中數據的類型、取值范圍或數據之間的關系,從而保證數據的完整性和一致性
約束類型 | 關鍵字 | 作用說明 |
---|---|---|
主鍵約束 | PRIMARY KEY | 唯一標識每一行記錄,不能為 NULL,且不能重復。 |
唯一約束 | UNIQUE | 保證某列或某組合列的值唯一,但允許 NULL(不同版本對 NULL 的處理略有差異)。 |
非空約束 | NOT NULL | 禁止該列的值為 NULL。 |
默認值約束 | DEFAULT | 當未指定值時,自動使用默認值。 |
外鍵約束 | FOREIGN KEY | 建立表與表之間的關系,確保引用完整性(子表中的值必須在父表中存在)。 |
檢查約束 | CHECK | 限制列中的值必須滿足特定條件(MySQL 8.0.16+ 才支持,早期版本語法支持但無效)。 |
- 簡述主鍵約束和唯一約束的區別。
對比項 | 主鍵約束(PRIMARY KEY) | 唯一約束(UNIQUE) |
---|---|---|
是否允許 NULL | 不允許 | 允許(可有多條 NULL) |
表中個數 | 只能有 1 個(或復合主鍵 1 組) | 可以有多個 |
用途 | 唯一標識整行記錄 | 僅保證列值不重復 |
自動索引 | 自動創建聚簇索引 | 自動創建二級索引 |
-
自增約束有哪些特點?
-
-
編寫SQL語句,查詢students表中年齡大于20且成績大于85的學生信息。
SELECT * FROM students WHERE age > 20 AND grand > 85;
- 編寫SQL語句,按班級分組,統計每個班級的學生數量和平均成績,并按平均成績降序排序。
SELECTclass_id,COUNT(*) AS student_count,AVG(score) AS avg_score
FROMstudents
GROUP BYclass_id
ORDER BYavg_score DESC;
- 編寫SQL語句,查詢students表中成績排名前3的學生信息
SELECT *
FROM students
ORDER BY score DESC
LIMIT 3;
聯合查詢
聯合查詢是同時查詢多個表中的數據,包括
交叉連接(CROSS JOIN)
交叉連接(CROSS JOIN)是 SQL 中最簡單、最暴力的一種多表查詢方式。它把左表的每一行和右表的每一行全部拼在一起,形成一張“大表”。
實際生產中很少直接使用,除非:
你想生成笛卡爾積(例如做組合測試、窮舉所有配對)。
兩張表本來就很確定只有 1 行(比如常量表)。
語法示例
-- 顯式寫法
SELECT *
FROM A
CROSS JOIN B;-- 隱式寫法(逗號分隔,效果相同,但不推薦)
SELECT *
FROM A, B;
內連接查詢
內連接(INNER JOIN)是關系型數據庫里最常用、最“安全”的連接方式。它只保留兩張表中滿足連接條件的行,其余全部丟棄,因此結果集不會爆炸,語義也最貼近“匹配”這一業務需求。
SELECT * FROM table1 INNER JOIN table2 ON 連接條件;-- 或
SELECT * FROM table1 JOIN table2 ON 連接條件;-- 或(隱式內連接)
SELECT * FROM table1, table2 WHERE 連接條件-- 顯式內連接
SELECT e.id, e.name, d.name AS dept_name, e.salary
FROM employees e INNER JOIN departments d
ON e.dept_id = d.id;-- 隱式內連接
SELECT e.id, e.name, d.name AS dept_name, e.salary
FROM employees e, departments d
WHERE e.dept_id = d.id
比如現有兩個表
Employees(emp_id, dept_id, name) | Departments(dept_id, dept_name) |
---|---|
1, 10, ‘Alice’ | 10, ‘Sales’ |
2, 20, ‘Bob’ | 30, ‘HR’ |
3, 10, ‘Cara’ |
我們運行
SELECT e.emp_id, e.name, d.dept_name
FROM Employees AS e
JOIN Departments AS dON e.dept_id = d.dept_id;
結果為
emp_id | name | dept_name |
---|---|---|
1 | Alice | Sales |
3 | Cara | Sales |