亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

1. SQL遞歸概念:

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

遞歸查詢(xún)通常使用 " WITH RECURSIVE " 語(yǔ)句實(shí)現(xiàn)。

WITH RECURSIVE 語(yǔ)句包含兩部分:

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

b.終止條件部分: 定義了遞歸查詢(xún)何時(shí)停止。

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;

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

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

 優(yōu)點(diǎn):

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

缺點(diǎn):

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

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

4.案例:公司部門(mén)關(guān)系遞歸查詢(xú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, '財(cái)務(wù)部', 1),
    (4, '市場(chǎng)部', 1),
    (5, '技術(shù)部', 1),
    (6, '招聘部', 2),
    (7, '薪資部', 2),
    (8, '成本控制部', 3),
    (9, '收支管理部', 3),
    (10, '品牌推廣部', 4),
    (11, '銷(xiāo)售部', 4),
    (12, '前端開(kāi)發(fā)部', 5),
    (13, '后端開(kāi)發(fā)部', 5)

c.遞歸查詢(xún)公司部門(mén)關(guān)系SQL語(yǔ)句

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案例詳解:

這個(gè)查詢(xún)使用了遞歸公共表達(dá)式來(lái)遍歷公司部門(mén)關(guān)系。公共表達(dá)式使用了兩個(gè) SELECT 語(yǔ)句:

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

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

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

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

總結(jié)

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

相關(guān)文章

  • 基于unique與primary約束的區(qū)別分析

    基于unique與primary約束的區(qū)別分析

    本篇文章介紹了unique與primary約束的區(qū)別分析。需要的朋友參考下
    2013-04-04
  • MySQL CPU過(guò)高的排查方法

    MySQL CPU過(guò)高的排查方法

    這篇文章主要介紹了MySQL CPU過(guò)高的排查方法,通過(guò)top命令查看服務(wù)器CPU資源使用情況,明確CPU占用率較高的是否是mysqld進(jìn)程,文章通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2023-11-11
  • mysql中TIMESTAMPDIFF案例詳解

    mysql中TIMESTAMPDIFF案例詳解

    這篇文章主要介紹了mysql中TIMESTAMPDIFF案例詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • SSM實(shí)現(xiàn)mysql數(shù)據(jù)庫(kù)賬號(hào)密碼密文登錄功能

    SSM實(shí)現(xiàn)mysql數(shù)據(jù)庫(kù)賬號(hào)密碼密文登錄功能

    這篇文章主要介紹了SSM實(shí)現(xiàn)mysql數(shù)據(jù)庫(kù)賬號(hào)密碼密文登錄功能,本文分為三步給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下
    2019-08-08
  • mysql實(shí)現(xiàn)sequence功能的代碼

    mysql實(shí)現(xiàn)sequence功能的代碼

    今天小編就為大家分享一篇關(guān)于mysql實(shí)現(xiàn)sequence功能的代碼,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-03-03
  • mysql重裝后出現(xiàn)亂碼設(shè)置為utf8可解決

    mysql重裝后出現(xiàn)亂碼設(shè)置為utf8可解決

    mysql重裝后出現(xiàn)亂碼解決辦法:只能在配置文件中將database 和 server 字符集 設(shè)置為utf8 ,否則不起作用,具體如下感興趣的朋友可以參考下哈,希望對(duì)大家有所幫助
    2013-07-07
  • mysql執(zhí)行sql文件報(bào)錯(cuò)Error: Unknown storage engine‘InnoDB’的解決方法

    mysql執(zhí)行sql文件報(bào)錯(cuò)Error: Unknown storage engine‘InnoDB’的解決方法

    最近在執(zhí)行一個(gè)innoDB類(lèi)型sql文件的時(shí)候,發(fā)現(xiàn)系統(tǒng)報(bào)錯(cuò)了,通過(guò)查找相關(guān)的資料終于解決了,所以下面這篇文章主要給大家介紹了關(guān)于mysql執(zhí)行sql文件時(shí)報(bào)錯(cuò)Error: Unknown storage engine 'InnoDB'的解決方法,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。
    2017-07-07
  • MySQL?從0到1打開(kāi)數(shù)據(jù)庫(kù)管理操作方法

    MySQL?從0到1打開(kāi)數(shù)據(jù)庫(kù)管理操作方法

    數(shù)據(jù)庫(kù)管理系統(tǒng)(DataBase?Management?System)是用來(lái)創(chuàng)建數(shù)據(jù)庫(kù)和管理數(shù)據(jù)庫(kù)數(shù)據(jù)的一個(gè)管理軟件,我們口頭說(shuō)的MySQL數(shù)據(jù)庫(kù)就是這個(gè)管理系統(tǒng),這篇文章主要介紹了MySQL從0到1打開(kāi)數(shù)據(jù)庫(kù)管理,需要的朋友可以參考下
    2023-06-06
  • MySQL數(shù)據(jù)庫(kù)優(yōu)化技術(shù)之索引使用技巧總結(jié)

    MySQL數(shù)據(jù)庫(kù)優(yōu)化技術(shù)之索引使用技巧總結(jié)

    這篇文章主要介紹了MySQL數(shù)據(jù)庫(kù)優(yōu)化技術(shù)之索引使用方法,結(jié)合實(shí)例形式總結(jié)分析了MySQL表的優(yōu)化、索引設(shè)置、SQL優(yōu)化等相關(guān)技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2016-07-07
  • MySQL優(yōu)化之緩存優(yōu)化

    MySQL優(yōu)化之緩存優(yōu)化

    在平時(shí)被問(wèn)及最多的問(wèn)題就是關(guān)于 MySQL 數(shù)據(jù)庫(kù)性能優(yōu)化方面的問(wèn)題,所以最近打算寫(xiě)一個(gè)MySQL數(shù)據(jù)庫(kù)性能優(yōu)化方面的系列文章,希望對(duì)初中級(jí) MySQL DBA 以及其他對(duì) MySQL 性能優(yōu)化感興趣的朋友們有所幫助。
    2017-03-03

最新評(píng)論