MySQL中的DDL、DML與DCL的深度探究
一、DDL:構(gòu)建數(shù)據(jù)世界的基石
DDL(Data Definition Language,數(shù)據(jù)定義語(yǔ)言)是 SQL 中用于定義和修改數(shù)據(jù)庫(kù)結(jié)構(gòu)的語(yǔ)句集合。它賦予了開(kāi)發(fā)者構(gòu)建、調(diào)整數(shù)據(jù)庫(kù)架構(gòu)的強(qiáng)大力量,無(wú)論是創(chuàng)建新的數(shù)據(jù)庫(kù)、表,還是修改現(xiàn)有表結(jié)構(gòu)、刪除不再需要的數(shù)據(jù)庫(kù)對(duì)象,DDL 都能輕松應(yīng)對(duì)。
(一)創(chuàng)建數(shù)據(jù)庫(kù)與表
在開(kāi)始任何數(shù)據(jù)存儲(chǔ)之前,首先需要?jiǎng)?chuàng)建一個(gè)數(shù)據(jù)庫(kù)以及相應(yīng)的表。這就好比建造房屋前,先要規(guī)劃好整體布局,確定各個(gè)房間的位置與功能。
-- 創(chuàng)建一個(gè)名為 my_database 的數(shù)據(jù)庫(kù) CREATE DATABASE my_database;
此代碼行創(chuàng)建了一個(gè)名為 my_database 的新數(shù)據(jù)庫(kù),為后續(xù)的數(shù)據(jù)存儲(chǔ)搭建了基本框架。接下來(lái),在這個(gè)數(shù)據(jù)庫(kù)中創(chuàng)建一張表,用于存儲(chǔ)用戶(hù)信息。
-- 在 my_database 數(shù)據(jù)庫(kù)中創(chuàng)建 users 表
CREATE TABLE my_database.users (
id INT AUTO_INCREMENT PRIMARY KEY, -- 主鍵,自動(dòng)遞增
username VARCHAR(50) NOT NULL, -- 用戶(hù)名,最大長(zhǎng)度 50,不能為空
email VARCHAR(100) UNIQUE NOT NULL, -- 郵箱地址,最大長(zhǎng)度 100,唯一且不能為空
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP -- 創(chuàng)建時(shí)間,默認(rèn)為當(dāng)前時(shí)間戳
); 這段代碼詳細(xì)定義了 users 表的結(jié)構(gòu),包括四個(gè)字段:id(主鍵,用于唯一標(biāo)識(shí)每個(gè)用戶(hù))、username(用戶(hù)名)、email(郵箱地址,要求唯一性以避免重復(fù)注冊(cè))以及 created_at(記錄用戶(hù)創(chuàng)建時(shí)間,默認(rèn)值為數(shù)據(jù)插入時(shí)的時(shí)間戳)。通過(guò) AUTO_INCREMENT 屬性,MySQL 會(huì)自動(dòng)為新插入的用戶(hù)分配一個(gè)唯一的 id 值,而 PRIMARY KEY 約束則確保了 id 字段的值在表中是唯一的,為數(shù)據(jù)的檢索與關(guān)聯(lián)提供了關(guān)鍵依據(jù)。
(二)修改表結(jié)構(gòu)
隨著業(yè)務(wù)的發(fā)展,原有的表結(jié)構(gòu)可能無(wú)法滿(mǎn)足新的需求,此時(shí)就需要對(duì)表結(jié)構(gòu)進(jìn)行修改。DDL 提供了靈活的修改語(yǔ)句,以適應(yīng)各種變化。
-- 向 users 表中添加一個(gè) phone 字段 ALTER TABLE my_database.users ADD COLUMN phone VARCHAR(20);
通過(guò) ALTER TABLE 語(yǔ)句,我們?cè)?users 表中新增了一個(gè)名為 phone 的字段,用于存儲(chǔ)用戶(hù)的電話(huà)號(hào)碼。此操作不會(huì)影響表中已有的數(shù)據(jù),只是在表結(jié)構(gòu)層面進(jìn)行了擴(kuò)展,為后續(xù)存儲(chǔ)用戶(hù)電話(huà)信息提供了空間。再比如,如果發(fā)現(xiàn) username 字段的最大長(zhǎng)度限制過(guò)低,不足以滿(mǎn)足某些用戶(hù)的需求,也可以通過(guò) DDL 進(jìn)行調(diào)整:
-- 修改 users 表中 username 字段的長(zhǎng)度 ALTER TABLE my_database.users MODIFY COLUMN username VARCHAR(100);
這條語(yǔ)句將 username 字段的最大長(zhǎng)度從 50 修改為 100,使得用戶(hù)可以使用更長(zhǎng)的用戶(hù)名,從而更好地適應(yīng)業(yè)務(wù)需求的變化。
(三)刪除數(shù)據(jù)庫(kù)與表
當(dāng)某個(gè)數(shù)據(jù)庫(kù)或表不再被需要時(shí),為了節(jié)省存儲(chǔ)空間、保持?jǐn)?shù)據(jù)庫(kù)的整潔,可以使用 DDL 語(yǔ)句將其刪除。
-- 刪除 my_database 數(shù)據(jù)庫(kù) DROP DATABASE my_database;
執(zhí)行此語(yǔ)句后,my_database 數(shù)據(jù)庫(kù)及其內(nèi)部的所有表、數(shù)據(jù)和結(jié)構(gòu)都將被永久刪除,因此在執(zhí)行刪除操作前,務(wù)必確保已經(jīng)備份了所有重要數(shù)據(jù),或者確實(shí)不再需要該數(shù)據(jù)庫(kù)中的任何信息。對(duì)于單獨(dú)的表,也可以單獨(dú)進(jìn)行刪除:
-- 刪除 my_database 數(shù)據(jù)庫(kù)中的 users 表 DROP TABLE my_database.users;
這條語(yǔ)句僅刪除 my_database 數(shù)據(jù)庫(kù)中的 users 表,而不會(huì)影響到數(shù)據(jù)庫(kù)中的其他表或數(shù)據(jù)庫(kù)本身。同樣,在執(zhí)行刪除表的操作前,需要謹(jǐn)慎考慮,因?yàn)橐坏﹫?zhí)行,表中的所有數(shù)據(jù)都將無(wú)法恢復(fù)。
二、DML:數(shù)據(jù)世界的靈動(dòng)舞者
DML(Data Manipulation Language,數(shù)據(jù)操縱語(yǔ)言)是 SQL 中用于操作數(shù)據(jù)庫(kù)中數(shù)據(jù)的語(yǔ)句集合。與 DDL 關(guān)注數(shù)據(jù)庫(kù)結(jié)構(gòu)不同,DML 更側(cè)重于對(duì)數(shù)據(jù)本身的增、刪、改、查操作,賦予了數(shù)據(jù)以靈動(dòng)的生命力,使其能夠根據(jù)業(yè)務(wù)需求不斷變化與更新。
(一)插入數(shù)據(jù)
向數(shù)據(jù)庫(kù)表中添加新的數(shù)據(jù)記錄是 DML 的常見(jiàn)操作之一。這就好比在圖書(shū)館的書(shū)架上增添新的書(shū)籍,為知識(shí)的殿堂注入新的活力。
-- 向 my_database.users 表中插入一條新用戶(hù)數(shù)據(jù)
INSERT INTO my_database.users (username, email, phone)
VALUES ('john_doe', 'john@example.com', '1234567890'); 此代碼行通過(guò) INSERT INTO 語(yǔ)句,向 my_database.users 表中插入了一條新記錄,包含用戶(hù)名 john_doe、郵箱地址 john@example.com 和電話(huà)號(hào)碼 1234567890。在插入數(shù)據(jù)時(shí),需要指定要插入的字段以及對(duì)應(yīng)的值,MySQL 會(huì)根據(jù)表結(jié)構(gòu)自動(dòng)為新記錄分配一個(gè)唯一的 id 值(由于 id 字段設(shè)置了 AUTO_INCREMENT 屬性),并將當(dāng)前時(shí)間戳記錄在 created_at 字段中。如果需要一次性插入多條數(shù)據(jù),也可以使用如下方式:
-- 向 my_database.users 表中批量插入多條用戶(hù)數(shù)據(jù)
INSERT INTO my_database.users (username, email, phone)
VALUES
('jane_doe', 'jane@example.com', '0987654321'),
('alice', 'alice@example.com', '1122334455'),
('bob', 'bob@example.com', '5566778899');這段代碼一次性插入了三條用戶(hù)數(shù)據(jù),大大提高了數(shù)據(jù)插入的效率,尤其適用于批量導(dǎo)入用戶(hù)信息等場(chǎng)景。
(二)查詢(xún)數(shù)據(jù)
從數(shù)據(jù)庫(kù)中檢索所需數(shù)據(jù)是 DML 的核心功能之一。無(wú)論是查看用戶(hù)信息、統(tǒng)計(jì)銷(xiāo)售數(shù)據(jù),還是分析用戶(hù)行為,查詢(xún)語(yǔ)句都能精準(zhǔn)地獲取目標(biāo)數(shù)據(jù),為決策提供有力支持。
-- 查詢(xún) my_database.users 表中所有用戶(hù)的信息 SELECT * FROM my_database.users;
此語(yǔ)句通過(guò) SELECT * FROM 語(yǔ)法,查詢(xún)了 my_database.users 表中的所有記錄,* 表示選擇表中的所有字段。執(zhí)行該語(yǔ)句后,將返回表中的所有數(shù)據(jù)行,包括每行的所有字段值,方便開(kāi)發(fā)者全面查看用戶(hù)信息。在實(shí)際應(yīng)用中,往往只需要查詢(xún)特定的字段或滿(mǎn)足特定條件的數(shù)據(jù)。例如,若只想獲取用戶(hù)的用戶(hù)名和郵箱地址,可以指定字段名稱(chēng):
-- 查詢(xún) my_database.users 表中所有用戶(hù)的用戶(hù)名和郵箱地址 SELECT username, email FROM my_database.users;
這條語(yǔ)句僅查詢(xún)了 username 和 email 兩個(gè)字段的值,減少了數(shù)據(jù)傳輸量,提高了查詢(xún)效率。此外,還可以通過(guò) WHERE 子句添加條件,篩選出符合特定要求的數(shù)據(jù)。比如,要查詢(xún)郵箱地址以 example.com 結(jié)尾的用戶(hù):
-- 查詢(xún) my_database.users 表中郵箱地址以 example.com 結(jié)尾的用戶(hù) SELECT * FROM my_database.users WHERE email LIKE '%example.com';
WHERE email LIKE '%example.com' 表示篩選出 email 字段值以 example.com 結(jié)尾的記錄,% 是一個(gè)通配符,表示任意數(shù)量的任意字符,從而實(shí)現(xiàn)了對(duì)特定郵箱域名用戶(hù)的精準(zhǔn)查詢(xún)。
(三)更新數(shù)據(jù)
隨著業(yè)務(wù)的發(fā)展,用戶(hù)信息可能會(huì)發(fā)生變化,如用戶(hù)更換了電話(huà)號(hào)碼、更新了郵箱地址等。此時(shí),就需要使用 DML 的更新語(yǔ)句來(lái)修改表中的數(shù)據(jù)。
-- 更新 my_database.users 表中用戶(hù) john_doe 的電話(huà)號(hào)碼 UPDATE my_database.users SET phone = '9876543210' WHERE username = 'john_doe';
此代碼行通過(guò) UPDATE 語(yǔ)句,將 my_database.users 表中用戶(hù)名為 john_doe 的用戶(hù)的電話(huà)號(hào)碼更新為 9876543210。SET phone = '9876543210' 指定了要更新的字段及新值,而 WHERE username = 'john_doe' 則明確了更新的條件,確保只有符合條件的記錄會(huì)被修改,避免誤操作導(dǎo)致大量數(shù)據(jù)被錯(cuò)誤更新。如果需要同時(shí)更新多個(gè)字段,也可以在 SET 子句中繼續(xù)添加字段賦值語(yǔ)句,例如:
-- 更新 my_database.users 表中用戶(hù) john_doe 的電話(huà)號(hào)碼和郵箱地址 UPDATE my_database.users SET phone = '9876543210', email = 'new_john@example.com' WHERE username = 'john_doe';
這條語(yǔ)句同時(shí)更新了 john_doe 用戶(hù)的電話(huà)號(hào)碼和郵箱地址,進(jìn)一步完善了用戶(hù)信息,使其能夠準(zhǔn)確反映用戶(hù)的最新情況。
(四)刪除數(shù)據(jù)
當(dāng)某些數(shù)據(jù)不再需要或不再符合業(yè)務(wù)要求時(shí),可以使用 DML 的刪除語(yǔ)句將其從表中移除。
-- 刪除 my_database.users 表中用戶(hù) john_doe 的數(shù)據(jù) DELETE FROM my_database.users WHERE username = 'john_doe';
此代碼行通過(guò) DELETE FROM 語(yǔ)句,刪除了 my_database.users 表中用戶(hù)名為 john_doe 的用戶(hù)記錄。WHERE username = 'john_doe' 精準(zhǔn)定位了要?jiǎng)h除的記錄,確保只有符合條件的那條數(shù)據(jù)被刪除,而不會(huì)影響到表中的其他用戶(hù)數(shù)據(jù)。在執(zhí)行刪除操作時(shí),同樣需要格外謹(jǐn)慎,因?yàn)橐坏?shù)據(jù)被刪除,就很難恢復(fù)。如果需要?jiǎng)h除表中的所有數(shù)據(jù),可以省略 WHERE 子句,但這種操作通常較少使用,除非確實(shí)需要清空整個(gè)表:
-- 刪除 my_database.users 表中的所有數(shù)據(jù) DELETE FROM my_database.users;
此語(yǔ)句將刪除 my_database.users 表中的所有記錄,使表重新回到一個(gè)空的狀態(tài),但表的結(jié)構(gòu)本身仍然保留,后續(xù)可以根據(jù)需要重新插入數(shù)據(jù)。
三、DCL:守護(hù)數(shù)據(jù)世界的秩序
DCL(Data Control Language,數(shù)據(jù)控制語(yǔ)言)是 SQL 中用于控制用戶(hù)對(duì)數(shù)據(jù)庫(kù)訪問(wèn)權(quán)限的語(yǔ)句集合。它如同數(shù)據(jù)庫(kù)世界的守護(hù)者,通過(guò)精細(xì)的權(quán)限管理,確保數(shù)據(jù)的安全性與完整性,防止未經(jīng)授權(quán)的訪問(wèn)與操作,維護(hù)數(shù)據(jù)庫(kù)的正常秩序。
(一)授權(quán)
在多用戶(hù)環(huán)境中,不同的用戶(hù)往往需要不同的權(quán)限來(lái)訪問(wèn)數(shù)據(jù)庫(kù)。DCL 提供了授權(quán)語(yǔ)句,允許數(shù)據(jù)庫(kù)管理員根據(jù)用戶(hù)的角色和職責(zé),授予其相應(yīng)的權(quán)限。
-- 授予用戶(hù) user1 對(duì) my_database 數(shù)據(jù)庫(kù)中所有表的查詢(xún)和插入權(quán)限 GRANT SELECT, INSERT ON my_database.* TO 'user1'@'localhost';
此代碼行通過(guò) GRANT 語(yǔ)句,授予用戶(hù) user1(登錄主機(jī)為 localhost)對(duì) my_database 數(shù)據(jù)庫(kù)中所有表的查詢(xún)(SELECT)和插入(INSERT)權(quán)限。my_database.* 表示 my_database 數(shù)據(jù)庫(kù)中的所有表,TO 'user1'@'localhost' 指定了授權(quán)對(duì)象,即用戶(hù) user1 在 localhost 主機(jī)上的登錄賬戶(hù)。授權(quán)操作可以根據(jù)實(shí)際需求靈活指定權(quán)限類(lèi)型和作用范圍。例如,如果只想授予用戶(hù)對(duì)特定表的特定權(quán)限,可以明確指定表名和權(quán)限類(lèi)型:
-- 授予用戶(hù) user2 對(duì) my_database.users 表的更新權(quán)限 GRANT UPDATE ON my_database.users TO 'user2'@'localhost';
這條語(yǔ)句僅授予用戶(hù) user2 對(duì) my_database.users 表的更新(UPDATE)權(quán)限,使得用戶(hù) user2 只能對(duì)該表的數(shù)據(jù)進(jìn)行更新操作,而無(wú)法執(zhí)行其他類(lèi)型的操作,如查詢(xún)、插入或刪除,從而實(shí)現(xiàn)了對(duì)用戶(hù)權(quán)限的精細(xì)控制。
(二)撤銷(xiāo)權(quán)限
當(dāng)用戶(hù)的權(quán)限需要調(diào)整或用戶(hù)不再需要某些權(quán)限時(shí),可以通過(guò) DCL 的撤銷(xiāo)權(quán)限語(yǔ)句收回之前授予的權(quán)限。
-- 撤銷(xiāo)用戶(hù) user1 對(duì) my_database 數(shù)據(jù)庫(kù)中所有表的查詢(xún)和插入權(quán)限 REVOKE SELECT, INSERT ON my_database.* FROM 'user1'@'localhost';
此代碼行通過(guò) REVOKE 語(yǔ)句,撤銷(xiāo)了之前授予用戶(hù) user1 的對(duì) my_database 數(shù)據(jù)庫(kù)中所有表的查詢(xún)和插入權(quán)限。FROM 'user1'@'localhost' 明確指定了撤銷(xiāo)權(quán)限的對(duì)象,使得用戶(hù) user1 不再具有對(duì)這些表的查詢(xún)和插入能力,從而及時(shí)調(diào)整了用戶(hù)的權(quán)限范圍,保證了數(shù)據(jù)庫(kù)的安全性。撤銷(xiāo)權(quán)限操作同樣需要精確指定要撤銷(xiāo)的權(quán)限類(lèi)型和作用范圍,以確保權(quán)限調(diào)整的準(zhǔn)確性。例如,如果只想撤銷(xiāo)用戶(hù)對(duì)特定表的特定權(quán)限,可以這樣操作:
-- 撤銷(xiāo)用戶(hù) user2 對(duì) my_database.users 表的更新權(quán)限 REVOKE UPDATE ON my_database.users FROM 'user2'@'localhost';
這條語(yǔ)句僅撤銷(xiāo)了用戶(hù) user2 對(duì) my_database.users 表的更新權(quán)限,使得用戶(hù) user2 無(wú)法再對(duì)該表的數(shù)據(jù)進(jìn)行更新操作,而其可能具有的其他權(quán)限(如查詢(xún)權(quán)限等)不受影響,實(shí)現(xiàn)了對(duì)用戶(hù)權(quán)限的靈活調(diào)整與精準(zhǔn)控制。
五、總結(jié)
在 MySQL 數(shù)據(jù)庫(kù)的世界里,DDL、DML 和 DCL 三大類(lèi) SQL 語(yǔ)句各司其職,又緊密協(xié)作,共同構(gòu)建起一個(gè)功能強(qiáng)大、靈活高效且安全可靠的數(shù)據(jù)庫(kù)操作體系。DDL 語(yǔ)句負(fù)責(zé)搭建和調(diào)整數(shù)據(jù)庫(kù)的架構(gòu)框架,為數(shù)據(jù)存儲(chǔ)與管理提供堅(jiān)實(shí)的基礎(chǔ);DML 語(yǔ)句則在數(shù)據(jù)層面施展拳腳,通過(guò)靈活多樣的數(shù)據(jù)操作實(shí)現(xiàn)業(yè)務(wù)邏輯的落地與數(shù)據(jù)價(jià)值的挖掘;DCL 語(yǔ)句則如同忠誠(chéng)的衛(wèi)士,守護(hù)著數(shù)據(jù)庫(kù)的安全防線(xiàn),通過(guò)對(duì)用戶(hù)權(quán)限的精細(xì)管理確保數(shù)據(jù)在合法合規(guī)的軌道上流轉(zhuǎn)。在實(shí)際的數(shù)據(jù)庫(kù)應(yīng)用開(kāi)發(fā)中,熟練掌握并合理運(yùn)用這三類(lèi) SQL 語(yǔ)句,能夠幫助開(kāi)發(fā)者高效地完成數(shù)據(jù)庫(kù)的設(shè)計(jì)、開(kāi)發(fā)、維護(hù)與管理任務(wù),讓數(shù)據(jù)庫(kù)成為驅(qū)動(dòng)業(yè)務(wù)發(fā)展的強(qiáng)大引擎。
希望本文的介紹與示例能夠?yàn)楦魑蛔x者深入理解 MySQL 中的 SQL 語(yǔ)句提供有益的幫助,助力大家在數(shù)據(jù)庫(kù)編程的道路上更加得心應(yīng)手,創(chuàng)造出更多優(yōu)秀的應(yīng)用作品。
到此這篇關(guān)于MySQL SQL語(yǔ)句精要:DDL、DML與DCL的深度探究的文章就介紹到這了,更多相關(guān)mysql ddl dml dcl內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
update.where無(wú)索引導(dǎo)致MySQL死鎖問(wèn)題解決
這篇文章主要為大家介紹了update.where無(wú)索引導(dǎo)致MySQL死鎖問(wèn)題解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11
MySQL壓力測(cè)試方法 如何使用mysqlslap測(cè)試MySQL的壓力?
生產(chǎn)服務(wù)器用LANMP組合和用LAMP組合有段時(shí)間了,總體來(lái)說(shuō)都很穩(wěn)定。但出現(xiàn)過(guò)幾次因?yàn)镸YSQL并發(fā)太多而掛掉,一直想對(duì)MYSQL做壓力測(cè)試。剛看到一篇介紹MYSQL壓力測(cè)試的文章,確實(shí)不錯(cuò),先收藏先吧2016-05-05
MySql 中聚合函數(shù)增加條件表達(dá)式的方法
這篇文章主要介紹了MySql 中聚合函數(shù)增加條件表達(dá)式的方法,需要的朋友可以參考下2018-06-06
kali虛擬機(jī)mysql修改綁定ip的問(wèn)題
這篇文章主要介紹了kali虛擬機(jī)mysql修改綁定ip,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-06-06

