SQL中的數據庫對象

視圖:VIEW

  1. 概念
    ① 虛擬表,本身不存儲數據,可以看做是存儲起來的SELECT語句
    ② 視圖中SELECT語句中涉及到的表,稱為基表
    ③ 針對視圖做DML操作,對影響到基表中的數據,反之亦然
    ④ 創建、刪除視圖本身,不會影響到基表

  2. 創建視圖

    CREATE VIEW view_emp_avg_salary(dept_id, avg_salary)
    AS
    SELECT department_id, AVG(salary)
    FROM employees
    WHERE department_id IS NOT NULL
    GROUP BY department_id;
    
  3. 查看視圖:DESC 視圖名;

  4. 修改視圖

    # 方式一
    CREATE OR REPLACE VIEW 視圖名
    AS
    SELECT ...#方式二
    ALTER VIEW 視圖名
    AS
    SELECT ...
    
  5. 刪除視圖

    DROP VIEW 視圖名;
    

索引:INDEX

用于提高查詢性能

存儲過程:PROCEDURE

用于完成一次完整的業務處理,沒有返回值,但可以通過傳出參數將多個值傳給調用者

  1. 創建
    ① 無參數無返回值
    # 查詢所有員工信息
    DELIMITER $
    CREATE PROCEDURE select_all_emp()
    BEGINSELECT * FROM employees;
    END $
    DELIMITER;
    # 調用
    CALL select_all_emp();
    
    ② 無參數有返回值:OUT
    # 查詢員工中的最低工資,并將最低工資輸出到ms
    DELIMITER $
    CREATE PROCEDURE select_min_sal(OUT ms DECIMAL)
    BEGINSELECT MIN(salary) INTO msFROM employees;
    END $
    DELIMITER;
    # 調用
    CALL select_min_sal(@ms);
    # 查看參數結果
    SELECT @ms;
    
    ③ 有參數無返回值:IN
    # 查詢指定姓名的員工工資
    DELIMITER $
    CREATE PROCEDURE show_salary_by_lastname(IN lastName VARCHAR(50))
    BEGINSELECT salaryFROM employeesWHERE last_name = lastName;
    END $
    DEIMITER;
    # 調用
    CALL show_salary_by_lastname('Popp');
    
    ④ 有參數有返回值:INOUT
    # 查詢指定姓名的員工工資和部門,并從參數中返回出來
    DELIMITER $
    CREATE PROCEDURE show_salary_by_lastname2(IN lastName VARCHAR(50), OUT sal DECIMAL, OUT dept_id INT)
    BEGINSELECT salary,department_id INTO sal, dept_idFROM employeesWHERE last_name = lastName;
    END $
    DELIMITER;
    # 調用
    CALL show_salary_by_lastname2('Popp', @sal, @deptId);
    # 查詢結果
    SELECT @sal, @deptId;
    
    ⑤ 有參數有返回值:INOUT
    # 查詢指定員工的領導姓名,并從參數中返回出來
    DELIMITER $
    CREATE PROCEDURE show_manager_by_lastname(INOUT lastName VARCHAR(50))
    BEGINSELECT m.last_name INTO lastNameFROM employees e JOIN employees mON e.manager_id = m.employee_idWHERE e.last_name = lastName;
    END $
    DELIMITER;
    # 調用
    SET @lastname = 'Popp';
    CALL show_manager_by_lastname(@lastname);
    # 查詢結果
    SELECT @lastname;
  2. characteristics
    LANGUAGE SQL:表明存儲過程執行體是由SQL語句構成的
    [NOT] DETERMINISTIC:存儲過程的執行結果是否確定,默認為不確定
    CONTAINS SQL:存儲過程的執行體包含SQL語句,但不包含讀寫數據的SQL語句,默認是這個
    NO SQL:存儲過程的執行體不包含任何SQL語句
    READS SQL DATA:存儲過程的執行體包含讀數據的SQL語句
    MODIFIES SQL DATA:存儲過程的執行體包含寫數據的SQL語句
    SQL SECURITY {DEFINER | INVOKER}:執行權限
    COMMENT:備注信息
  3. 查看創建信息SHOW CREATE PRODECURE 存儲過程名稱;
  4. 查看狀態信息SHOW PROCEDURE STATUS LIKE '存儲過程名稱';
  5. 修改特性
    ALTER PROCEDURE '存儲過程名稱'
    SQL SECURITY INVOKER
    COMMENT '備注信息...';
    
  6. 刪除DROP PROCEDURE '存儲過程名稱';

存儲函數:FUNCTION

用于完成一次特定的計算,有一個返回值

# 查詢指定部門的員工人數
DELIMITER $
CREATE FUNCTION select_count_by_dept(dept_id INT)
RETURNS INT
DETERMINISTIC
CONTAINS SQL
READS SQL DATA
BEGINRETURN(SELECT COUNT(*) FROM employees WHERE department_id = dept_id);
END $
DELIMITER;
# 使用
SELECT select_count_by_dept(50);

觸發器:TRIGGER

相當于事件監聽器,當數據庫發生特定事件時,觸發器被觸發,完成相應的處理

  1. 創建

    代碼格式:
    CREATE TRIGGER 觸發器名稱
    {BEFORE|AFTER} {INSERT|UPDATE|DELETE} ON 表名
    FOR EACH ROW
    BEGIN
    代碼塊;
    END;

    ① 案例一:向一張表中添加數據之前,同時向另一張表添加數據

    DELIMITER //
    CREATE TRIGGER test_before_trigger
    BEFORE INSERT ON table1
    FOR EACH ROW
    BEGININSERT INTO table2(name)VALUES ('before_name...');
    END //
    DELIMITER;
    # 測試
    INSERT INTO table1(age)
    VALUES(18);
    

    ② 案例二:在向employees表中添加員工信息之前,檢驗此員工的工資是否大于領導的工資,大于的話報錯,否則添加成功(NEW代表添加的數據信息,OLD代表刪除的數據信息)

    DELIMITER //
    CREATE TRIGGER verify_trigger
    BEFORE INSERT ON employees
    FOR EACH ROW
    BEGINDECLARE manager_sal DECIMAL DEFAULT 0.0;SELECT salary INTO manager_sal FROM employees WHERE employee_id = NEW.manager_id;IF NEW.salary > manager_sal# 拋出錯誤THEN SIGNAL SQLSTATE 'HY000' SET MESSAGE_TEXT = '添加失敗:薪資高于領導工資';END IF;
    END //
    DELIMITER;
    
  2. 查看
    ① 查看數據庫中的所有觸發器:SHOW TRIGGERS;
    ② 查看某個觸發器的定義:SHOW CREATE TRIGGER 觸發器名稱;

  3. 刪除DROP TRAGGER 觸發器名稱;

變量

  1. 系統變量:以@@開頭
    ① 查看全局系統變量:SHOW GLOBAL VARIABLES;
    ② 查看會話系統變量
    SHOW SESSION VARIABLES;
    SHOW VARIABLES;
    
    ③ 查看指定系統變量
    SELECT @@global.max_connections; # 查看服務器最大連接數
    SELECT @@global.character_set_client; # 查看字符集
    SELECT @@session.character_set_client; # 查看字符集
    SELECT @@session.pseudo_thread_id; # 查看當前會話的MySQL連接ID
    SELECT @@character_set_client; # 先查看會話的字符集,若沒有再查看全局的字符集
    
    ④ 修改系統變量的值
    SET @@global.max_connections = 166; # 修改全局變量,方式一
    SET GLOBAL max_connection = 167; # 修改全局變量,方式二SET @@session.character_set_client = 'gbk'; # 修改會話變量,方式一
    SET SESSION character_set_client = 'gbk'; # 修改會話變量,方式二
    
  2. 用戶變量
    ① 會話用戶變量:以@開頭
    # 聲明和初始化
    SET @a = 1;
    SET @b := 2;
    SELECT @avg_sal := AVG(salary) FROM employees; # 這種情況必須用:=
    SELECT COUNT(*) INTO @emp_total FROM employees;
    #使用
    SELECT @a, @b, @avg_sal, @emp_total;
    
    ② 局部變量
    說明:
    a、使用關鍵字:DECLARE
    b、只能在存儲過程和存儲函數中使用
    c、必須寫在BEGIN...END的首行
    d、格式:DECLARE 變量名 類型 [DEFAULT 值] ,若不指明DEFAULT,則默認是NULL
    DELIMITER $
    CREATE PROCEDURE test()
    BEGIN# 聲明局部變量DECLARE a INT DEFAULT 0;DECLARE b INT;DECLARE name VARCHAR(30);#賦值SET a = 5;SET b := 6;SELECT last_name INTO nameFROM employeesWHERE employee_id = 100;#使用SELECT a, b, name;
    END $
    DELIMITER;
    

定義條件與處理程序

  1. 定義條件
    ① 格式:DECLARE 錯誤名稱 CONDITION FOR 錯誤碼;
    ② 目的:給錯誤碼命名
    ③ 錯誤碼分類:MySQL_error_code、sqlstate_value
  2. 定義處理程序
    ① 格式:DECLARE 處理方式 HANDLER FOR 錯誤類型 處理語句;
    ② 處理方式分類:
    a、CONTINUE:遇到錯誤不處理,繼續執行
    b、EXIT:遇到錯誤馬上退出
    c、UNDO:遇到錯誤后撤回之前的操作
    ③ 錯誤類型分類
    a、SQLSTATE '字符串錯誤碼':字符串類型錯誤碼,長度為5
    b、MySQL_error_code:數值類型錯誤碼
    c、錯誤名稱:定義條件時聲明的名稱
    d、SQLWARNING:匹配所有以01開頭的錯誤碼
    e、NOT FOUND:匹配所有以02開頭的錯誤碼
    f、SQLEXCEPTION:匹配沒有被d、e匹配到的錯誤碼
  3. 案例
    DELIMITER $
    CREATE PROCEDURE UpdateTest()
    BEGIN# 因email是NOT NULL,所以執行第一個UPDATE會報錯“1048 - Column 'email' cannot be null”# 在此聲明錯誤處理DECLARE CONTINUE HANDLER FOR 1048 SET @message = 'aaa';SET @a = 1;UPDATE employees SET email = NULL WHERE employee_id = 100;SET @a = 2;UPDATE employees SET email = '123@qq.com' WHERE employee_id = 100;SET @a = 3;
    END $
    DELIMITER;# 調用
    CALL UpdateTest();
    # 查看變量
    SELECT @a, @message; // 3, aaa
    

流程控制

分支結構

  1. IF

    DELIMITER //
    CREATE PROCEDURE testIf()
    BEGINDECLARE score DECIMAL(10,2) DEFAULT 85;IF score >= 90 THEN SELECT 'A';ELSEIF score >= 80 AND score < 90 THEN SELECT 'B';ELSEIF score >= 60 AND score < 80 THEN SELECT 'C';ELSE SELECT 'D';END IF;
    END //
    DELIMITER;CALL testIf();
    
  2. CASE
    CASE ... WHEN ... THEN ... WHEN ... THEN ... ELSE ... END CASE;

    DELIMITER //
    CREATE PROCEDURE testCase()
    BEGINDECLARE n INT DEFAULT 2;CASE nWHEN 1 THEN SELECT 'n = 1';WHEN 2 THEN SELECT 'n = 2';ELSE SELECT 'n = 9';END CASE;
    END //
    DELIMITER;
    

    CASE WHEN ... THEN ... WHEN ... THEN ... ELSE ... END CASE;

    DELIMITER //
    CREATE PROCEDURE testCase()
    BEGINDECLARE n INT default 10;CASEWHEN n > 20 THEN SELECT 'n > 20';WHEN n >= 10 THEN SELECT 'n >= 10';ELSE SELECT 'n < 10';END CASE;
    END //
    DELIMITER;
    

循環結構

  1. LOOP

    DELIMITER //
    CREATE PROCEDURE testLoop()
    BEGINDECLARE n INT DEFAULT 1; # n = 1# 開始循環aaa: LOOPIF n >= 8THEN LEAVE aaa;END IF;SET n = n + 1;END LOOP aaa;SELECT n;
    END //
    DELIMITER;
    
  2. WHILE

    DELIMITER //
    CREATE PROCEDURE testWhile()
    BEGINDECLARE n INT DEFAULT 1;WHILE n < 10DOSET n = n + 1;END WHILE;SELECT n;
    END //
    DELIMITER;
    
  3. REPEAT

    DELIMITER //
    CREATE PROCEDURE testRepeat()
    BEGINDECLARE n INT DEFAULT 1;REPEATSET n = n + 1;UNTIL n > 10END REPEAT;SELECT n;
    END //
    DELIMITER;
    

跳轉語句

  1. LEAVE
    ① 同BREAK,格式:LEAVE 循環名;
    ② 使用場景:循環體中、BEGIN...END

    DELIMITER //
    CREATE PROCEDURE testLeave(IN num INT)
    label_test: BEGINIF num = 0 THEN LEAVE label_test;ELSEIF num < 5 THEN SELECT num;ELSE SELECT 'num >= 5';END IF;SELECT 'is end';
    END //
    DELIMITER;
    
  2. ITERATE
    ① 同CONTINUE,格式:ITERATE 循環名;
    ② 使用場景:循環體中

    DELIMITER //
    CREATE PROCEDURE test_iterate()
    BEGINDECLARE num  INT DEFAULT 0;iterate_test: LOOPSET num = num + 1;IF num > 5 THEN LEAVE iterate_test;ELSEIF num > 2 THEN ITERATE iterate_test;ELSE SELECT 'is end';END IF;END LOOP;SELECT num;
    END //
    DELIMITER;
    

游標

隨意的定位到某一條記錄,可以逐條讀取數據。在使用游標過程中,會對數據加鎖,不適合高并發場景。

DELIMITER //
CREATE PROCEDURE test_cursor(IN limit_total_salary DECIMAL, OUT total_count INT)
BEGIN# 聲明變量DECLARE sum_sal DECIMAL DEFAULT 0.0;DECLARE emp_count INT DEFAULT 0;DECLARE emp_sal DECIMAL;# 聲明游標DECLARE cursor_test CURSOR FOR SELECT salary FROM employees ORDER BY salary DESC;# 打開游標OPEN cursor_test;# 使用游標WHILE sum_sal < limit_total_salaryDOFETCH cursor_test INTO emp_sal;SET sum_sal = sum_sal + emp_sal;SET emp_count = emp_count + 1;END WHILE;SET total_count = emp_count;# 關閉游標CLOSE cursor_test;
END //
DELIMITER;
# 調用
CALL test_cursor(100000, @count);
SELECT @count;

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/65511.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/65511.shtml
英文地址,請注明出處:http://en.pswp.cn/web/65511.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

flink的EventTime和Watermark

時間機制 Flink中的時間機制主要用在判斷是否觸發時間窗口window的計算。 在Flink中有三種時間概念&#xff1a;ProcessTime、IngestionTime、EventTime。 ProcessTime&#xff1a;是在數據抵達算子產生的時間&#xff08;Flink默認使用ProcessTime&#xff09; IngestionT…

web服務器架構,websocket

1. 非前后端分離架構 1. 前端html后端servlet 被tomcat服務器打包&#xff0c;統一指定根目錄入口。通過原生表單發送到后端&#xff0c;后端根據請求數據進行重定向或請求轉發&#xff0c;這樣就不能進行動態渲染&#xff0c;也就必須存在很多靜態html對應每一個請求。 這里…

Ubuntu 下測試 NVME SSD 的讀寫速度

在 Ubuntu 系統下&#xff0c;測試 NVME SSD 的讀寫速度&#xff0c;有好多種方法&#xff0c;常用的有如下幾種&#xff1a; 1. Gnome-disks Gnome-disks&#xff08;也稱為“Disks”&#xff09;是 GNOME 桌面環境中的磁盤管理工具&#xff0c;有圖形界面&#xff0c;是測試…

SpringBoot之核心配置

學習目標&#xff1a; 1.熟悉Spring Boot全局配置文件的使用 2.掌握Spring Boot配置文件屬性值注入 3.熟悉Spring Boot自定義配置 4.掌握Profile多環境配置 5.了解隨機值設置以及參數間引用 1.全局配置文件 Spring Boot使用 application.properties 或者application.yaml 的文…

后端服務集成ElasticSearch搜索功能技術方案

文章目錄 一、為什么選用ElasticSearch二、ElasticSearch基本概念1、文檔和字段2、索引和映射3、倒排索引、文檔和詞條4、分詞器 三、ElasticSearch工作原理1、Term Dictionary、Term index2、Stored Fields3、Docs Values4、Segment5、Lucene6、高性能、高擴展性、高可用①高性…

舉例說明AI模型怎么聚類,最后神經網絡怎么保存

舉例說明怎么聚類,最后神經網絡怎么保存 目錄 舉例說明怎么聚類,最后神經網絡怎么保存K - Means聚類算法實現神經元特征聚類劃分成不同專家的原理和過程 特征提取: 首先,需要從神經元中提取有代表性的特征。例如,對于一個多層感知機(MLP)中的神經元,其權重向量可以作為特…

ocrmypdf使用時的cannot import name ‘PdfMatrix‘ from ‘pikepdf‘問題

最近在做pdf的ocr,之前使用過ocrmypdf&#xff0c;打算再次使用&#xff0c;發現它更新了&#xff0c;所以就打算使用最新版 環境&#xff1a;win11anaconda 創建虛擬環境后安裝語句&#xff1a; pip install ocrmypdf -i https://pypi.tuna.tsinghua.edu.cn/simple pip in…

【JavaEE進階】獲取Cookie/Session

&#x1f340;Cookie簡介 HTTP協議自身是屬于 "?狀態"協議. "?狀態"的含義指的是: 默認情況下 HTTP 協議的客?端和服務器之間的這次通信,和下次通信之間沒有直接的聯系.但是實際開發中,我們很多時候是需要知道請求之間的關聯關系的. 例如登陸?站成…

Oracle:ORA-00904: “10“: 標識符無效報錯詳解

1.報錯Oracle語句如下 SELECT YK_CKGY.ID,YK_CKGY.DJH,YK_CKGY.BLRQ,YK_CKGY.ZBRQ,YK_CKGY.SHRQ,YK_CKGY.YT,YK_CKGY.ZDR,YK_CKGY.SHR,YK_CKGY.BZ,YK_CKGY.JZRQ,YK_CKGY.ZT,YK_CKGY.CKLX,(case YK_CKGY.CKLXwhen 09 then藥房調借when 02 then科室退藥when 03 then損耗出庫when…

Linux 磁盤管理命令:使用xfs 管理命令

文章目錄 Linux磁盤管理命令使用xfs 管理命令1.命令說明2&#xff0e;建立 XFS 文件系統4&#xff0e;調整 XFS 文件系統各項參數5&#xff0e;在線調整 XFS 文件系統的大小6&#xff0e;暫停和恢復 XFS 文件系統7&#xff0e;嘗試修復受損的 XFS 文件系統8&#xff0e;備份和恢…

《Spring Framework實戰》3:概覽

歡迎觀看《Spring Framework實戰》視頻教程 Spring Framework 為基于現代 Java 的企業應用程序提供了全面的編程和配置模型 - 在任何類型的部署平臺上。 Spring 的一個關鍵要素是應用程序級別的基礎設施支持&#xff1a;Spring 專注于企業應用程序的 “管道”&#xff0c;以便…

借助免費GIS工具箱輕松實現las點云格式到3dtiles格式的轉換

在當今數字化浪潮下&#xff0c;地理信息系統&#xff08;GIS&#xff09;技術日新月異&#xff0c;廣泛滲透到城市規劃、地質勘探、文化遺產保護等諸多領域。而 GISBox 作為一款功能強大且易用的 GIS 工具箱&#xff0c;以輕量級、免費使用、操作便捷等諸多優勢&#xff0c;為…

均值濾波從圖像復原角度的解釋

廖老師說若將圖像生成看作一個隨機過程&#xff0c;均值濾波&#xff08;Mean Filtering&#xff09;可以視為在高斯噪聲模型下的線性最小均方估計&#xff08;Linear Minimum Mean Squared Error, LMMSE&#xff09;或者極大似然估計&#xff08;Maximum Likelihood Estimatio…

高等數學學習筆記 ? 一元函數微分的基礎知識

1. 微分的定義 &#xff08;1&#xff09;定義&#xff1a;設函數在點的某領域內有定義&#xff0c;取附近的點&#xff0c;對應的函數值分別為和&#xff0c; 令&#xff0c;若可以表示成&#xff0c;則稱函數在點是可微的。 【 若函數在點是可微的&#xff0c;則可以表達為】…

linux之自動掛載

如果想要實現自動掛載&#xff0c;應該掛在客戶端&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 客戶端&#xff1a; [rootlocalhost ~]# yum install nfs-utils -y &#xff08;下載軟件&#xff09; [rootlocalhost ~]# systemctl start nfs-utils.servic…

用戶界面軟件01

Jens Coldewey 著&#xff0c;Tom.X 譯 本文中的模式語言逐步深入地探討用戶界面架構的設計&#xff0c;它基于人機工程學&#xff0c;足以形成一套完整的體系。如果你對這方面有興趣&#xff0c;請參考[Tog92]&#xff0c;[Coo95]和[Col95]。 本文不討論用戶界面的布局&…

Spring整合SpringMVC

目錄 【pom.xml】文件&#xff1b; 新建【applicationContext.xml】文件 新建【springmvc.xml】文件&#xff1b; 配置【src/main/webapp/WEB-INF/web.xml】文件&#xff1b; 新建【com.gupaoedu.service.IUserService】&#xff1b; 新建【com.gupaoedu.service.impl.Use…

【數據結構-堆】2233. K 次增加后的最大乘積

給你一個非負整數數組 nums 和一個整數 k 。每次操作&#xff0c;你可以選擇 nums 中 任一 元素并將它 增加 1 。 請你返回 至多 k 次操作后&#xff0c;能得到的 nums的 最大乘積 。由于答案可能很大&#xff0c;請你將答案對 109 7 取余后返回。 示例 1&#xff1a; 輸入&…

2025.1.8(c++對c語言的擴充——堆區空間,引用,函數)

筆記 上一筆記接續&#xff08;練習2的答案&#xff09; 練習&#xff1a;要求在堆區連續申請5個int的大小空間用于存儲5名學生的成績&#xff0c;分別完成空間的申請、成績的錄入、升序排序、成績輸出函數以及空間釋放函數&#xff0c;并在主程序中完成測試 要求使用new和d…

(長期更新)《零基礎入門 ArcGIS(ArcScene) 》實驗七----城市三維建模與分析(超超超詳細!!!)

城市三維建模與分析 三維城市模型已經成為一種非常普遍的地理空間數據資源,成為城市的必需品,對城市能化管理至關重要。語義信息豐富的三維城市模型可以有效實現不同領域數據與IS相信息的高層次集成及互操作,從而在城市規劃、環境模擬、應急響應和輔助決策等眾多領域公揮作用、…