mysql約束和高級sql詳解
約束
MySQL中的約束用于定義表中數(shù)據(jù)的規(guī)則,以確保數(shù)據(jù)的準(zhǔn)確性和可靠性。以下是MySQL中常用的一些約束類型及其概述:
- PRIMARY KEY(主鍵):唯一標(biāo)識表中每條記錄的字段或字段組合, 一個表中只能有一個主鍵。
- 主鍵字段的值不能為NULL。
- FOREIGN KEY(外鍵):用于建立兩個表之間的關(guān)系,確保引用的數(shù)據(jù)的完整性,外鍵字段的值必須在它所引用的表中存在,或者為NULL(取決于外鍵約束的設(shè)置)。
- UNIQUE(唯一約束):保證列中的所有值都是唯一的,即不允許有重復(fù)的值
- NOT NULL(非空約束):確保列中的值不能為NULL。
- CHECK(檢查約束):用于限制列中的值必須滿足的條件。(在MySQL 8.0.16及更高版本中支持)
- DEFAULT(默認值):當(dāng)沒有為列提供值時,將使用默認值。
- AUTO_INCREMENT(自增):用于整數(shù)類型的列,自動為新記錄生成一個唯一的數(shù)字。
高級sql
MySQL 提供了多種高級功能來處理復(fù)雜的數(shù)據(jù)操作和業(yè)務(wù)邏輯。以下是你提到的幾個關(guān)鍵概念的簡要介紹:
1.子查詢(Subquery):子查詢是嵌套在另一個查詢中的 SQL 查詢。它可以返回單個值、一行或多行結(jié)果。子查詢通常用在SELECT、INSERT、UPDATE和DELETE語句中,可以用于條件表達式或作為值提供者。
SELECT name, MAX(salary) AS max_salary FROM employees WHERE salary = ( SELECT MAX(salary) FROM salaries );
首先確定 salaries 表中最高的薪資是多少,然后在外層查詢中查找 employees 表中薪資等于這個最高值的員工信息。
2. 連接(JOIN):連接用于結(jié)合兩個或多個表的行,基于相關(guān)的列。MySQL 支持多種類型的連接,包括內(nèi)連接、左連接、右連接和全連接(FULL JOIN)。
SELECT books.title, authors.name FROM books INNER JOIN authors ON books.author_id = authors.id;
這個查詢的結(jié)果將是一個包含兩列的表 books.title 和 authors.name,每一行都對應(yīng)一個書籍及其作者的名稱。
3.事務(wù) (Transaction) : 事務(wù)用于處理操作量大,復(fù)雜度高的數(shù)據(jù)。事務(wù)是一組SQL語句的集合,它們要么全部成功執(zhí)行,要么全部不執(zhí)行,把一系列的操作放在一個地方,然后再決定是否生效。這種特性被稱為原子性(Atomicity)。事務(wù)還必須滿足一致性(Consistency)、隔離性(Isolation)和持久性(Durability)這三個特性,通常合稱為ACID特性。
事務(wù)的基本操作MySQL通過以下三個主要的SQL語句來管理事務(wù):
- START TRANSACTION 或 BEGIN:標(biāo)記事務(wù)的開始。
- COMMIT:提交事務(wù),將事務(wù)中的所有更改永久保存到數(shù)據(jù)庫中。
- ROLLBACK:回滾事務(wù),撤銷自事務(wù)開始以來的所有更改,使數(shù)據(jù)庫回到事務(wù)開始前的狀態(tài)。
自動提交模式默認情況下,MySQL在執(zhí)行每個SQL語句后會自動提交事務(wù)。但是,你可以通過設(shè)置autocommit變量來控制這個行為:
- SET autocommit=OFF或SET autocommit=0:關(guān)閉自動提交,這樣就需要顯式地使用COMMIT或ROLLBACK來結(jié)束事務(wù)。
- SET autocommit=ON或SET autocommit=1:開啟自動提交,每個SQL語句執(zhí)行后都會自動提交。
事務(wù)的使用示例:
-- 開始事務(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; -- 查詢更新后的結(jié)果 SELECT * FROM student_scores WHERE student_id = 1; ELSE -- 如果更新失敗,回滾事務(wù) ROLLBACK; -- 查詢當(dāng)前的分數(shù),確認沒有變化 SELECT * FROM student_scores WHERE student_id = 1; END IF;
正確使用事務(wù)可以確保數(shù)據(jù)庫操作的原子性和一致性,避免數(shù)據(jù)不一致的問題。
4.存儲過程: MySQL存儲過程是一組為了完成特定功能的SQL語句集合,它被編譯并存儲在數(shù)據(jù)庫中,可被多次調(diào)用執(zhí)行,使用存儲過程可以提高性能,加強可維護性。
1.創(chuàng)建存儲過程
- DELIMITER:改變MySQL的命令結(jié)束符,因為存儲過程中會用;作為SQL語句的結(jié)束,如果不改變結(jié)束符,MySQL會錯誤地在第一個;處結(jié)束存儲過程的定義。
- CREATE PROCEDURE:用來創(chuàng)建新的存儲過程。
- 參數(shù):存儲過程可以有參數(shù),參數(shù)有三種類型:IN(輸入?yún)?shù))、OUT(輸出參數(shù))和INOUT(既可輸入也可輸出)。
2.存儲過程體
- BEGIN ... END:存儲過程的主體部分,包含了要執(zhí)行的SQL語句。
- DECLARE:用來聲明局部變量。
- SET:用來給變量賦值。
示例:
DELIMITER // CREATE PROCEDURE SumTwoNumbers(IN num1 INT, IN num2 INT, OUT result INT) BEGIN SET result = num1 + num2; END // DELIMITER ;
- DELIMITER //改變了MySQL的默認分隔符,這樣我們就可以在存儲過程內(nèi)部使用分號。
- CREATE PROCEDURE SumTwoNumbers 創(chuàng)建了一個名為 SumTwoNumbers 的存儲過程。
- IN num1 INT, IN num2 INT 定義了兩個輸入?yún)?shù) num1 和 num2 ,它們都是整數(shù)類型。
- OUT result INT 定義了一個輸出參數(shù) result ,它也是整數(shù)類型,用于存儲計算結(jié)果。
- SET result = num1 + num2; 是存儲過程的核心,它將兩個輸入?yún)?shù)相加,并將結(jié)果賦值給輸出參數(shù) result 。
- END 標(biāo)記了存儲過程的結(jié)束。
- DELIMITER ; 將分隔符重置回默認的分號。
如果要調(diào)用該存儲內(nèi)容:
CALL SumTwoNumbers(10, 20, @sumResult); SELECT @sumResult;
到此這篇關(guān)于mysql約束和高級sql的文章就介紹到這了,更多相關(guān)mysql約束和高級sql內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
通過Query Profiler查看MySQL語句運行時間的操作方法
這篇文章主要介紹了通過Query Profiler查看MySQL語句運行時間的操作方法,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-03-03MySQL同步數(shù)據(jù)Replication的實現(xiàn)步驟
本文主要介紹了MySQL同步數(shù)據(jù)Replication的實現(xiàn)步驟,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03Mysql中批量替換某個字段的部分數(shù)據(jù)(推薦)
這篇文章主要介紹了Mysql中批量替換某個字段的部分數(shù)據(jù),通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2020-02-02MySQL安裝第四步報錯(initializing?database報錯)的圖文解決方法
這篇文章主要給大家介紹了關(guān)于MySQL安裝第四步報錯(initializing?database報錯)的解決方法,"initializing?database"?通常出現(xiàn)在安裝MySQL的過程中,表示MySQL數(shù)據(jù)庫初始化過程中遇到了問題,需要的朋友可以參考下2024-06-06使用dreamhost空間實現(xiàn)MYSQL數(shù)據(jù)庫備份方法
使用dreamhost空間實現(xiàn)MYSQL數(shù)據(jù)庫備份方法...2007-07-07php mysql insert into 結(jié)合詳解及實例代碼
在mysql中如果要保存數(shù)據(jù)到數(shù)據(jù)庫我們就會用到insert into命令了,下面我來給大家介紹mysql insert into幾種常用的使用方法,需要的朋友可以參考下2016-11-11MySQL物理備份與恢復(fù)工具XtraBackup使用小結(jié)
本文主要介紹了MySQL物理備份與恢復(fù)工具XtraBackup使用小結(jié),借助Percona XtraBackup工具實現(xiàn)MySQL的物理備份與恢復(fù),相當(dāng)于將整個MySQL進行了復(fù)制,再粘貼到其他地方運行,感興趣的可以了解一下2024-07-07Mysql日期格式以及內(nèi)置日期函數(shù)用法詳解
MySQL中有多種數(shù)據(jù)類型可以用于日期和時間的表示,這篇文章主要給大家介紹了關(guān)于Mysql日期格式以及內(nèi)置日期函數(shù)用法的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下2023-05-05