mysql約束和高級(jí)sql詳解
約束
MySQL中的約束用于定義表中數(shù)據(jù)的規(guī)則,以確保數(shù)據(jù)的準(zhǔn)確性和可靠性。以下是MySQL中常用的一些約束類(lèi)型及其概述:
- PRIMARY KEY(主鍵):唯一標(biāo)識(shí)表中每條記錄的字段或字段組合, 一個(gè)表中只能有一個(gè)主鍵。
- 主鍵字段的值不能為NULL。
- FOREIGN KEY(外鍵):用于建立兩個(gè)表之間的關(guān)系,確保引用的數(shù)據(jù)的完整性,外鍵字段的值必須在它所引用的表中存在,或者為NULL(取決于外鍵約束的設(shè)置)。
- UNIQUE(唯一約束):保證列中的所有值都是唯一的,即不允許有重復(fù)的值
- NOT NULL(非空約束):確保列中的值不能為NULL。
- CHECK(檢查約束):用于限制列中的值必須滿足的條件。(在MySQL 8.0.16及更高版本中支持)
- DEFAULT(默認(rèn)值):當(dāng)沒(méi)有為列提供值時(shí),將使用默認(rèn)值。
- AUTO_INCREMENT(自增):用于整數(shù)類(lèi)型的列,自動(dòng)為新記錄生成一個(gè)唯一的數(shù)字。
高級(jí)sql
MySQL 提供了多種高級(jí)功能來(lái)處理復(fù)雜的數(shù)據(jù)操作和業(yè)務(wù)邏輯。以下是你提到的幾個(gè)關(guān)鍵概念的簡(jiǎn)要介紹:
1.子查詢(xún)(Subquery):子查詢(xún)是嵌套在另一個(gè)查詢(xún)中的 SQL 查詢(xún)。它可以返回單個(gè)值、一行或多行結(jié)果。子查詢(xún)通常用在SELECT、INSERT、UPDATE和DELETE語(yǔ)句中,可以用于條件表達(dá)式或作為值提供者。
SELECT name, MAX(salary) AS max_salary FROM employees WHERE salary = ( SELECT MAX(salary) FROM salaries );
首先確定 salaries 表中最高的薪資是多少,然后在外層查詢(xún)中查找 employees 表中薪資等于這個(gè)最高值的員工信息。
2. 連接(JOIN):連接用于結(jié)合兩個(gè)或多個(gè)表的行,基于相關(guān)的列。MySQL 支持多種類(lèi)型的連接,包括內(nèi)連接、左連接、右連接和全連接(FULL JOIN)。
SELECT books.title, authors.name FROM books INNER JOIN authors ON books.author_id = authors.id;
這個(gè)查詢(xún)的結(jié)果將是一個(gè)包含兩列的表 books.title 和 authors.name,每一行都對(duì)應(yīng)一個(gè)書(shū)籍及其作者的名稱(chēng)。
3.事務(wù) (Transaction) : 事務(wù)用于處理操作量大,復(fù)雜度高的數(shù)據(jù)。事務(wù)是一組SQL語(yǔ)句的集合,它們要么全部成功執(zhí)行,要么全部不執(zhí)行,把一系列的操作放在一個(gè)地方,然后再?zèng)Q定是否生效。這種特性被稱(chēng)為原子性(Atomicity)。事務(wù)還必須滿足一致性(Consistency)、隔離性(Isolation)和持久性(Durability)這三個(gè)特性,通常合稱(chēng)為ACID特性。
事務(wù)的基本操作MySQL通過(guò)以下三個(gè)主要的SQL語(yǔ)句來(lái)管理事務(wù):
- START TRANSACTION 或 BEGIN:標(biāo)記事務(wù)的開(kāi)始。
- COMMIT:提交事務(wù),將事務(wù)中的所有更改永久保存到數(shù)據(jù)庫(kù)中。
- ROLLBACK:回滾事務(wù),撤銷(xiāo)自事務(wù)開(kāi)始以來(lái)的所有更改,使數(shù)據(jù)庫(kù)回到事務(wù)開(kāi)始前的狀態(tài)。
自動(dòng)提交模式默認(rèn)情況下,MySQL在執(zhí)行每個(gè)SQL語(yǔ)句后會(huì)自動(dòng)提交事務(wù)。但是,你可以通過(guò)設(shè)置autocommit變量來(lái)控制這個(gè)行為:
- SET autocommit=OFF或SET autocommit=0:關(guān)閉自動(dòng)提交,這樣就需要顯式地使用COMMIT或ROLLBACK來(lái)結(jié)束事務(wù)。
- SET autocommit=ON或SET autocommit=1:開(kāi)啟自動(dòng)提交,每個(gè)SQL語(yǔ)句執(zhí)行后都會(huì)自動(dòng)提交。
事務(wù)的使用示例:
-- 開(kāi)始事務(wù)
START TRANSACTION;
-- 給學(xué)生ID為1的學(xué)生增加10分
UPDATE student_scores SET score = score + 10 WHERE student_id = 1;
-- 檢查是否更新成功
IF (SELECT ROW_COUNT()) > 0 THEN
-- 如果更新成功,提交事務(wù)
COMMIT;
-- 查詢(xún)更新后的結(jié)果
SELECT * FROM student_scores WHERE student_id = 1;
ELSE
-- 如果更新失敗,回滾事務(wù)
ROLLBACK;
-- 查詢(xún)當(dāng)前的分?jǐn)?shù),確認(rèn)沒(méi)有變化
SELECT * FROM student_scores WHERE student_id = 1;
END IF;正確使用事務(wù)可以確保數(shù)據(jù)庫(kù)操作的原子性和一致性,避免數(shù)據(jù)不一致的問(wèn)題。
4.存儲(chǔ)過(guò)程: MySQL存儲(chǔ)過(guò)程是一組為了完成特定功能的SQL語(yǔ)句集合,它被編譯并存儲(chǔ)在數(shù)據(jù)庫(kù)中,可被多次調(diào)用執(zhí)行,使用存儲(chǔ)過(guò)程可以提高性能,加強(qiáng)可維護(hù)性。
1.創(chuàng)建存儲(chǔ)過(guò)程
- DELIMITER:改變MySQL的命令結(jié)束符,因?yàn)榇鎯?chǔ)過(guò)程中會(huì)用;作為SQL語(yǔ)句的結(jié)束,如果不改變結(jié)束符,MySQL會(huì)錯(cuò)誤地在第一個(gè);處結(jié)束存儲(chǔ)過(guò)程的定義。
- CREATE PROCEDURE:用來(lái)創(chuàng)建新的存儲(chǔ)過(guò)程。
- 參數(shù):存儲(chǔ)過(guò)程可以有參數(shù),參數(shù)有三種類(lèi)型:IN(輸入?yún)?shù))、OUT(輸出參數(shù))和INOUT(既可輸入也可輸出)。
2.存儲(chǔ)過(guò)程體
- BEGIN ... END:存儲(chǔ)過(guò)程的主體部分,包含了要執(zhí)行的SQL語(yǔ)句。
- DECLARE:用來(lái)聲明局部變量。
- SET:用來(lái)給變量賦值。
示例:
DELIMITER //
CREATE PROCEDURE SumTwoNumbers(IN num1 INT, IN num2 INT, OUT result INT)
BEGIN
SET result = num1 + num2;
END //
DELIMITER ;- DELIMITER //改變了MySQL的默認(rèn)分隔符,這樣我們就可以在存儲(chǔ)過(guò)程內(nèi)部使用分號(hào)。
- CREATE PROCEDURE SumTwoNumbers 創(chuàng)建了一個(gè)名為 SumTwoNumbers 的存儲(chǔ)過(guò)程。
- IN num1 INT, IN num2 INT 定義了兩個(gè)輸入?yún)?shù) num1 和 num2 ,它們都是整數(shù)類(lèi)型。
- OUT result INT 定義了一個(gè)輸出參數(shù) result ,它也是整數(shù)類(lèi)型,用于存儲(chǔ)計(jì)算結(jié)果。
- SET result = num1 + num2; 是存儲(chǔ)過(guò)程的核心,它將兩個(gè)輸入?yún)?shù)相加,并將結(jié)果賦值給輸出參數(shù) result 。
- END 標(biāo)記了存儲(chǔ)過(guò)程的結(jié)束。
- DELIMITER ; 將分隔符重置回默認(rèn)的分號(hào)。
如果要調(diào)用該存儲(chǔ)內(nèi)容:
CALL SumTwoNumbers(10, 20, @sumResult); SELECT @sumResult;
到此這篇關(guān)于mysql約束和高級(jí)sql的文章就介紹到這了,更多相關(guān)mysql約束和高級(jí)sql內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MySQL中json_extract函數(shù)說(shuō)明及使用方式
今天看mysql中的json數(shù)據(jù)類(lèi)型,涉及到一些使用,使用到了函數(shù)json_extract來(lái),下面這篇文章主要給大家介紹了關(guān)于MySQL中json_extract函數(shù)說(shuō)明及使用方式的相關(guān)資料,需要的朋友可以參考下2022-08-08
CentOS7下mysql 8.0.16 安裝配置方法圖文教程
這篇文章主要為大家詳細(xì)介紹了CentOS7下mysql 8.0.16 安裝配置方法圖文教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-05-05
Ubuntu下取消MySQL數(shù)據(jù)庫(kù)本機(jī)綁定限制方法
在Ubuntu系統(tǒng)中,添加了MySQL賬戶,賦予了數(shù)據(jù)庫(kù)完全操作權(quán)限,并且允許數(shù)據(jù)庫(kù)從外部鏈接 但是,還是無(wú)法遠(yuǎn)程訪問(wèn)MySQL數(shù)據(jù)庫(kù)2013-06-06
MySql利用父id遞歸向下查詢(xún)子節(jié)點(diǎn)的方法實(shí)例
項(xiàng)目中遇到一個(gè)需求,要求查處菜單節(jié)點(diǎn)的所有節(jié)點(diǎn),在網(wǎng)上查了一下,大多數(shù)的方法用到了存儲(chǔ)過(guò)程,由于線上環(huán)境不能隨便添加存儲(chǔ)過(guò)程,所以自己寫(xiě)一個(gè),這篇文章主要給大家介紹了關(guān)于MySql利用父id遞歸向下查詢(xún)子節(jié)點(diǎn)的相關(guān)資料,需要的朋友可以參考下2022-03-03
MySQL中l(wèi)ower_case_table_names作用及使用小結(jié)
在使用DataEase連接外部數(shù)據(jù)庫(kù)時(shí),可能會(huì)遇到啟動(dòng)報(bào)錯(cuò)的問(wèn)題,官方文檔指出,修改數(shù)據(jù)庫(kù)配置文件中的lower_case_table_names=1參數(shù)可以解決此問(wèn)題,此參數(shù)控制表名大小寫(xiě)敏感性,感興趣的可以了解一下2024-09-09
安裝MySQL 5后無(wú)法啟動(dòng)(不能Start service)解決方法小結(jié)
有時(shí)候我們?cè)诎惭bmysql軟件時(shí),卻無(wú)法啟動(dòng),或服務(wù)器安全設(shè)置以后都可能導(dǎo)致mysql無(wú)法運(yùn)行2012-07-07
MySQL創(chuàng)建帶特殊字符的數(shù)據(jù)庫(kù)名稱(chēng)方法示例
這篇文章主要給大家介紹了MySQL創(chuàng)建帶特殊字符的數(shù)據(jù)庫(kù)名稱(chēng)方法,文中給出了詳細(xì)的示例代碼,需要的朋友可以參考學(xué)習(xí),下面來(lái)一起看看吧。2017-03-03
innodb存儲(chǔ)引擎修改表共享空間為獨(dú)立空間
最近在優(yōu)化mysql innodb存儲(chǔ)引擎,把共享表空間轉(zhuǎn)換成獨(dú)立表空間,下面是詳細(xì)步驟2014-01-01

