最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

一篇文章學會SQL中的遞歸用法(Mysql)

 更新時間:2023年10月23日 08:33:10   作者:yqyn  
這篇文章主要給大家介紹了關(guān)于如何一篇文章學會SQL中的遞歸用法,眾所周知目前的mysql版本中并不支持直接的遞歸查詢,但是通過遞歸到迭代轉(zhuǎn)化的思路,還是可以在一句SQL內(nèi)實現(xiàn)樹的遞歸查詢的,需要的朋友可以參考下

1. SQL遞歸概念:

SQL遞歸查詢是一種用于處理具有層次結(jié)構(gòu)的數(shù)據(jù)的技術(shù)。它使用遞歸函數(shù)來遍歷樹形結(jié)構(gòu),例如組織結(jié)構(gòu)、分類結(jié)構(gòu)等等。

遞歸查詢通常使用 " WITH RECURSIVE " 語句實現(xiàn)。

WITH RECURSIVE 語句包含兩部分:

a.遞歸部分: 定義了如何遞歸查詢數(shù)據(jù);            

b.終止條件部分: 定義了遞歸查詢何時停止。

2. SQL遞歸一般形式:

WITH RECURSIVE recursive_query_name (col1, col2, ..., coln) AS (
    -- 遞歸部分
    SELECT 
			initial_query_result_col1, 
			initial_query_result_col2, 
			...,
			initial_query_result_coln
    FROM initial_query
    UNION ALL
    SELECT 
			recursive_query_result_col1,
			recursive_query_result_col2, 
			..., 
			recursive_query_result_coln
    FROM recursive_query_name, recursive_query
    WHERE recursive_query_condition
)
-- 終止條件部分
SELECT * FROM recursive_query_name WHERE termination_condition;

在遞歸部分,我們先通過一個初始查詢(initial_query)得到一些初始的結(jié)果。然后我們通過UNION ALL運算將初始結(jié)果集合并到遞歸查詢結(jié)果中。接下來,在每次遞歸查詢中,我們使用前一次遞歸的結(jié)果(recursive_query_name)與遞歸查詢(recursive_query)進行運算,并使用WHERE條件過濾掉不需要的數(shù)據(jù)。最后,在終止條件部分中,我們使用一個條件來判斷遞歸查詢何時停止。當遞歸查詢到終止條件時,遞歸查詢結(jié)束,最終結(jié)果被返回。

3. SQL遞歸優(yōu)缺點:

 優(yōu)點:

  • 靈活性:SQL遞歸查詢適用于各種類型的樹形結(jié)構(gòu),而且可以根據(jù)具體的需要自定義遞歸查詢算法。
  • 可讀性:遞歸查詢通常比使用嵌套查詢或連接查詢更易于閱讀和理解。它可以用簡單的SQL語句來表示一個復雜的樹形結(jié)構(gòu)。
  • 便于維護:SQL遞歸查詢通常比其他方法更易于維護。例如,如果要更改樹形結(jié)構(gòu)中的某些節(jié)點,只需更改遞歸查詢算法即可。

缺點:

  • 性能:SQL遞歸查詢通常比其他方法慢。這是因為它需要進行多次遞歸函數(shù)調(diào)用,并且可能需要訪問大量的數(shù)據(jù)。如果不正確地編寫遞歸查詢算法,還可能會導致死循環(huán)等問題,從而影響性能。
  • 復雜性:遞歸查詢算法通常比其他方法更復雜。如果不熟悉遞歸算法,編寫正確的遞歸查詢算法可能很困難。
  • 可伸縮性:SQL遞歸查詢不適合處理大型數(shù)據(jù)集。當數(shù)據(jù)集變得太大時,查詢可能會變得非常緩慢,甚至無法運行。

總體而言,SQL遞歸查詢是一種非常有用的技術(shù),可以處理樹形結(jié)構(gòu)的數(shù)據(jù)。雖然它具有一些缺點,但在正確使用的情況下,它仍然是一種非常強大和靈活的工具。

4.案例:公司部門關(guān)系遞歸查詢

a.按DDL建表:

CREATE TABLE company_department (
    department_id INT PRIMARY KEY,
    department_name VARCHAR(50),
    parent_department_id INT REFERENCES company_department(department_id)
);

b.插入數(shù)據(jù):

INSERT INTO company_department 
    (department_id, department_name, parent_department_id)
VALUES
    (1, '公司', NULL),
    (2, '人力資源部', 1),
    (3, '財務部', 1),
    (4, '市場部', 1),
    (5, '技術(shù)部', 1),
    (6, '招聘部', 2),
    (7, '薪資部', 2),
    (8, '成本控制部', 3),
    (9, '收支管理部', 3),
    (10, '品牌推廣部', 4),
    (11, '銷售部', 4),
    (12, '前端開發(fā)部', 5),
    (13, '后端開發(fā)部', 5)

c.遞歸查詢公司部門關(guān)系SQL語句

WITH RECURSIVE department_tree (department_id, department_name, parent_department_id, depth, path) AS (
		SELECT 
			department_id, 
			department_name, 
			parent_department_id, 
			1 AS depth, 
			CAST(department_id AS CHAR(200)) AS path
		FROM company_department
		WHERE parent_department_id IS NULL
		UNION ALL
		SELECT 
			cd.department_id, 
			cd.department_name, 
			cd.parent_department_id, 
			dt.depth + 1 AS depth, 
			CONCAT(dt.path, ',', cd.department_id) AS path
		FROM company_department cd
			JOIN department_tree dt ON cd.parent_department_id = dt.department_id
	)
SELECT 
	department_id, department_name, parent_department_id, depth, path
FROM department_tree
ORDER BY path;

d.sql案例詳解:

這個查詢使用了遞歸公共表達式來遍歷公司部門關(guān)系。公共表達式使用了兩個 SELECT 語句:

第一個 SELECT 語句選取了所有沒有父部門的根部門,并將它們添加到臨時表 department_tree 中。它們的深度被初始化為 1,并且它們的路徑被設(shè)置為它們的部門 ID。這個 SELECT 語句是遞歸查詢的起點。

第二個 SELECT 語句連接了 company_department 表和 department_tree 表。它選取了 company_department 表中所有具有父部門的部門,并連接到 department_tree 表中已經(jīng)存在的部門。對于每個連接的行,它們的深度是父部門的深度加 1,并且它們的路徑是父部門的路徑加上逗號和它們自己的部門 ID。

查詢返回了 department_tree 表中所有的部門,按照它們的路徑排序。這個排序方法使得在結(jié)果集中,每個部門都在它們的父部門之后,并且它們的順序是深度優(yōu)先遍歷的順序。        

e.查詢結(jié)果截圖:

總結(jié)

到此這篇關(guān)于SQL中遞歸用法(Mysql)的文章就介紹到這了,更多相關(guān)SQL遞歸用法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • mySQL服務器連接,斷開及cmd使用操作

    mySQL服務器連接,斷開及cmd使用操作

    這篇文章主要介紹了mySQL服務器連接,斷開及cmd使用操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-07-07
  • mysql分區(qū)表的增刪改查的實現(xiàn)示例

    mysql分區(qū)表的增刪改查的實現(xiàn)示例

    增刪查改在數(shù)據(jù)庫中是很常見的操作,本文主要介紹了mysql分區(qū)表的增刪改查的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,需要的朋友們下面隨著小編來一起學習學習吧
    2024-01-01
  • 詳解如何修改MySQL最大連接數(shù)

    詳解如何修改MySQL最大連接數(shù)

    本文主要介紹了詳解如何修改MySQL最大連接數(shù),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-08-08
  • mysql 連接出現(xiàn)Public Key Retrieval is not allowed的問題解決

    mysql 連接出現(xiàn)Public Key Retrieval is n

    在MySQL連接中出現(xiàn)“Public Key Retrieval is not allowed”錯誤,通常是因為在使用安全套接字層(SSL)連接時遇到了問題,本文就來介紹一下解決方法,感興趣的可以了解一下
    2024-03-03
  • MySQL進行表之間關(guān)聯(lián)更新的實現(xiàn)方法

    MySQL進行表之間關(guān)聯(lián)更新的實現(xiàn)方法

    在實際編程工作或運維實踐中,對MySQL數(shù)據(jù)庫表進行關(guān)聯(lián)更新是一種比較常見的應用場景,針對這樣的業(yè)務場景,我們來看看有什么方法可以實現(xiàn)關(guān)聯(lián)更新,需要的朋友可以參考下
    2023-10-10
  • 一篇文章搞懂MySQL加鎖機制

    一篇文章搞懂MySQL加鎖機制

    線程安全就是多線程訪問時,采用了加鎖機制,當一個線程訪問該類的某個數(shù)據(jù)時進行保護,下面這篇文章主要給大家介紹了關(guān)于MySQL加鎖機制的相關(guān)資料,需要的朋友可以參考下
    2022-01-01
  • MYSQL必知必會讀書筆記第十和十一章之使用函數(shù)處理數(shù)據(jù)

    MYSQL必知必會讀書筆記第十和十一章之使用函數(shù)處理數(shù)據(jù)

    這篇文章主要介紹了MYSQL必知必會讀書筆記第十和十一章之使用函數(shù)處理數(shù)據(jù)的相關(guān)資料,需要的朋友可以參考下
    2016-05-05
  • mysql 8.0.12 winx64詳細安裝教程

    mysql 8.0.12 winx64詳細安裝教程

    這篇文章主要為大家詳細介紹了mysql 8.0.12 winx64詳細安裝配置圖文教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-08-08
  • MySQL 5.7臨時表空間如何玩才能不掉坑里詳解

    MySQL 5.7臨時表空間如何玩才能不掉坑里詳解

    這篇文章主要給大家介紹了關(guān)于MySQL 5.7臨時表空間如何玩才能不掉坑里的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用mysql具有一定的參考學習價值,需要的朋友們下面隨著小編來一起看看吧
    2018-09-09
  • mysqldumpslow用法示例(慢查詢)

    mysqldumpslow用法示例(慢查詢)

    這篇文章主要介紹了mysqldumpslow是mysql自帶的用來分析慢查詢的工具,需要的朋友可以參考下
    2016-08-08

最新評論

揭阳市| 金乡县| 微山县| 靖江市| 临沭县| 郑州市| 全州县| 石泉县| 巴楚县| 咸阳市| 藁城市| 晋宁县| 会东县| 寻甸| 台东县| 沧州市| 汉源县| 天全县| 虎林市| 麟游县| 盱眙县| 嘉禾县| 保亭| 隆安县| 永靖县| 阿巴嘎旗| 堆龙德庆县| 赤城县| 惠州市| 宜丰县| 眉山市| 安岳县| 易门县| 承德市| 南和县| 塘沽区| 深州市| 屏南县| 嘉祥县| 繁峙县| 庆阳市|