MySQL 數(shù)據(jù)庫進階之SQL 數(shù)據(jù)操作與子查詢操作大全
一、子查詢:嵌套在查詢中的查詢
子查詢(Subquery)是指**嵌套在其他 SQL 語句中的查詢語句**,通常用于復(fù)雜的條件篩選或多表關(guān)聯(lián)場景。子查詢的結(jié)果可以作為主查詢的條件、數(shù)據(jù)源或計算字段。
1.1 子查詢的基本語法
SELECT 字段列表 FROM (子查詢語句) AS 別名 WHERE 條件;
1.2 子查詢的實戰(zhàn)示例
示例 1:簡單子查詢作為數(shù)據(jù)源
-- 從學(xué)生表中查詢姓名、性別、年齡,再篩選出姓名為'張三'的記錄
SELECT t1.name FROM (SELECT name, sex, age FROM student) AS t1 WHERE t1.name = '張三';
示例 2:多表關(guān)聯(lián)的子查詢
假設(shè)存在三張表:
- `student`(學(xué)生表):`sno`(學(xué)號)、`name`(姓名)等
- `relationship`(學(xué)生-課程關(guān)系表):`sno`(學(xué)號)、`cno`(課程號)
- `course`(課程表):`cno`(課程號)、`gradeName`(課程名)
需求:查詢所有選擇了“語文”課程的學(xué)生信息
SELECT t1.*, course.gradeName FROM ( #子查詢:關(guān)聯(lián)學(xué)生表和關(guān)系表,獲取學(xué)生信息及所選課程號 SELECT student.*, relationship.cno FROM student LEFT JOIN relationship ON student.sno = relationship.sno ) AS t1 #主查詢:關(guān)聯(lián)子查詢結(jié)果和課程表,篩選出語文課 LEFT JOIN course ON t1.cno = course.cno WHERE course.gradeName = '語文';
**說明**:子查詢的結(jié)果被視為一張臨時表(需指定別名,如 `t1`),主查詢可像操作普通表一樣使用這張臨時表。
二、數(shù)據(jù)添加:INSERT 語句
INSERT 語句用于向表中添加新數(shù)據(jù),支持單行添加和多行添加兩種方式。
2.1 單行添加
語法
INSERT INTO 表名(列1, 列2, 列3, ...)
VALUES('值1', '值2', '值3', ...);示例
-- 向student表添加一條學(xué)生記錄
INSERT INTO student(name, sex, age, sno, class_num)
VALUES ('張三', '男', 18, '10001', '20201004');2.2 多行添加
語法
INSERT INTO 表名(列1, 列2, 列3, ...)
VALUES
('值1', '值2', '值3', ...),
('值1', '值2', '值3', ...),
('值1', '值2', '值3', ...); #多個值列表用逗號分隔示例
#向student表添加多條學(xué)生記錄
INSERT INTO student(name, sex, age, sno, class_num)
VALUES
('張三', '男', 18, '10001', '20201004'),
('李四', '女', 19, '10002', '20201004'),
('王五', '男', 18, '10003', '20201005');**注意**:
- 列名順序需與值列表順序一致;
- 若省略列名,則值列表需包含表中所有字段(按表結(jié)構(gòu)順序);
- 字符串類型的值需用單引號 `'` 包裹;
- 自增主鍵(如 `id`)通常無需手動指定值,數(shù)據(jù)庫會自動生成。
三、數(shù)據(jù)修改:UPDATE 語句
UPDATE 語句用于修改表中已存在的數(shù)據(jù),需通過 `WHERE` 子句指定修改范圍(否則會修改表中所有記錄)。
3.1 語法
UPDATE 表名 SET 列名1 = 新值1, 列名2 = 新值2, ... WHERE 條件; #不寫WHERE會修改所有記錄,謹(jǐn)慎操作!
3.2 示例
# 將id=2的學(xué)生姓名改為'雙手合十',年齡改為22,性別改為'女' UPDATE student SET name = '雙手合十', age = 22, sex = '女' WHERE id = 2; #將20201004班所有學(xué)生的年齡增加1歲 UPDATE student SET age = age + 1 WHERE class_num = '20201004';
**警告**:`UPDATE` 語句如果不帶 `WHERE` 條件,會修改表中**所有記錄**,執(zhí)行前務(wù)必確認(rèn)條件是否正確!
四、數(shù)據(jù)刪除:DELETE、TRUNCATE 與 DROP
4.1 DELETE 語句:刪除部分或全部記錄
語法
DELETE FROM 表名 WHERE 條件; #不寫WHERE會刪除表中所有記錄
示例
# 刪除id=1的學(xué)生記錄 DELETE FROM student WHERE id = 1; #刪除20201005班的所有學(xué)生記錄 DELETE FROM student WHERE class_num = '20201005';
4.2 TRUNCATE 語句:清空表中所有記錄
語法
```sql
TRUNCATE TABLE 表名;
```
示例
```sql
# 清空class表中所有記錄(保留表結(jié)構(gòu))
TRUNCATE TABLE class;
```
4.3 DROP 語句:徹底刪除表
語法
```sql
DROP TABLE 表名;
```
示例
```sql
-- 徹底刪除relationship表(包括表結(jié)構(gòu)和所有數(shù)據(jù))
DROP TABLE relationship;
```
4.4 DELETE、TRUNCATE 與 DROP 的區(qū)別
| 操作 | 功能描述 | 是否保留表結(jié)構(gòu) | 效率 | 是否可回滾(事務(wù)中) |
|---|---|---|---|---|
DELETE | 逐行刪除記錄,可帶條件 | 是 | 較低(逐行刪除) | 是 |
TRUNCATE | 清空所有記錄,相當(dāng)于重建表結(jié)構(gòu) | 是 | 較高(直接重建) | 否 |
DROP | 徹底刪除表,包括結(jié)構(gòu)和數(shù)據(jù) | 否 | 最高 | 否 |
**使用建議**:
- 需刪除部分記錄:用 `DELETE` + `WHERE`;
- 需清空全表(保留結(jié)構(gòu)):用 `TRUNCATE`(效率更高);
- 需徹底刪除表:用 `DROP`(謹(jǐn)慎操作,不可恢復(fù))。
五、SQL 操作的注意事項
1. **子查詢優(yōu)化**:
- 子查詢結(jié)果集不宜過大,否則會影響性能;
- 復(fù)雜子查詢可考慮用 `JOIN` 改寫,提升效率。
2. **數(shù)據(jù)添加**:
- 確保字段類型與值匹配(如數(shù)字類型不加引號);
- 遵守表的約束(如非空字段必須賦值,唯一字段值不重復(fù))。
3. **數(shù)據(jù)修改與刪除**:
- 執(zhí)行前先用 `SELECT` 語句驗證條件是否正確(如 `SELECT * FROM student WHERE id=2`);
- 生產(chǎn)環(huán)境中,刪除/修改操作建議在事務(wù)中執(zhí)行,便于回滾。
4. **MySQL 語法特性**:
- 語句末尾加分號 `;` 表示結(jié)束;
- 關(guān)鍵字不區(qū)分大小寫,但建議大寫關(guān)鍵字(如 `SELECT`、`INSERT`),小寫表名和字段名,增強可讀性。
六、總結(jié):SQL 核心操作要點
1. **子查詢**:嵌套在主查詢中的查詢,可作為數(shù)據(jù)源或條件,常用于復(fù)雜查詢場景;
2. **數(shù)據(jù)添加**:`INSERT INTO ... VALUES` 支持單行和多行添加,需注意字段與值的匹配;
3. **數(shù)據(jù)修改**:`UPDATE ... SET ... WHERE` 用于修改記錄,`WHERE` 條件必不可少;
4. **數(shù)據(jù)刪除**:
- `DELETE` 逐行刪除,可帶條件,支持回滾;
- `TRUNCATE` 清空全表,保留結(jié)構(gòu),效率高;
- `DROP` 徹底刪除表,包括結(jié)構(gòu),謹(jǐn)慎使用。
掌握這些操作后,你已能完成 MySQL 數(shù)據(jù)庫的基本CRUD(創(chuàng)建、讀取、更新、刪除)操作,為后續(xù)學(xué)習(xí)事務(wù)、索引、存儲過程等進階知識奠定基礎(chǔ)。實際開發(fā)中,需結(jié)合業(yè)務(wù)場景選擇合適的操作方式,同時注意數(shù)據(jù)安全和操作效率。
到此這篇關(guān)于MySQL 數(shù)據(jù)庫進階之SQL 數(shù)據(jù)操作與子查詢操作大全的文章就介紹到這了,更多相關(guān)sql數(shù)據(jù)操作與子查詢內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- mysql數(shù)據(jù)庫SQL子查詢(史上最詳細)
- SQL?Server數(shù)據(jù)庫連接查詢和子查詢實戰(zhàn)案例
- MySql數(shù)據(jù)庫基礎(chǔ)之子查詢詳解
- MySQL數(shù)據(jù)庫子查詢語法規(guī)則詳解
- MySQL數(shù)據(jù)庫之union,limit和子查詢詳解
- 詳解MySQL數(shù)據(jù)庫--多表查詢--內(nèi)連接,外連接,子查詢,相關(guān)子查詢
- Mysql數(shù)據(jù)庫性能優(yōu)化之子查詢
- Mysql數(shù)據(jù)庫中子查詢的使用
- 使用SQL Server數(shù)據(jù)庫嵌套子查詢的方法
相關(guān)文章
MySQL數(shù)據(jù)庫存儲引擎和分支現(xiàn)狀分析
在MySQL經(jīng)歷了2008年Sun的收購和2009年Oracle收購Sun的過程中,基本處于停滯發(fā)展的情況,在可以預(yù)見的未來,MySQL是肯定會被Oracle擱置并且逐步雪藏消滅掉的。2011-03-03
深入mysql "ON DUPLICATE KEY UPDATE" 語法的分析
本篇文章是對mysql "ON DUPLICATE KEY UPDATE"語法進行了詳細的分析介紹,需要的朋友參考下2013-06-06
使用phpMyAdmin批量修改Mysql數(shù)據(jù)表前綴的方法
這篇文章主要介紹了使用phpMyAdmin批量修改Mysql數(shù)據(jù)表前綴的方法,需要的朋友可以參考下2015-09-09

