国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【Mysql】一篇學(xué)會SQL中的遞歸的用法

這篇具有很好參考價值的文章主要介紹了【Mysql】一篇學(xué)會SQL中的遞歸的用法。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

【Mysql】SQL高級技巧——遞歸用法及案例詳解

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)進(jìn)行運算,并使用WHERE條件過濾掉不需要的數(shù)據(jù)。最后,在終止條件部分中,我們使用一個條件來判斷遞歸查詢何時停止。當(dāng)遞歸查詢到終止條件時,遞歸查詢結(jié)束,最終結(jié)果被返回。

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

?優(yōu)點:

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

缺點:

  1. 性能:SQL遞歸查詢通常比其他方法慢。這是因為它需要進(jìn)行多次遞歸函數(shù)調(diào)用,并且可能需要訪問大量的數(shù)據(jù)。如果不正確地編寫遞歸查詢算法,還可能會導(dǎo)致死循環(huán)等問題,從而影響性能。
  2. 復(fù)雜性:遞歸查詢算法通常比其他方法更復(fù)雜。如果不熟悉遞歸算法,編寫正確的遞歸查詢算法可能很困難。
  3. 可伸縮性:SQL遞歸查詢不適合處理大型數(shù)據(jù)集。當(dāng)數(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, '財務(wù)部', 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案例詳解:

這個查詢使用了遞歸公共表達(dá)式來遍歷公司部門關(guān)系。公共表達(dá)式使用了兩個 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é)果截圖:

sql遞歸查詢函數(shù),MySQL系列,sql,mysql,數(shù)據(jù)庫文章來源地址http://www.zghlxwxcb.cn/news/detail-638710.html

到了這里,關(guān)于【Mysql】一篇學(xué)會SQL中的遞歸的用法的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 基礎(chǔ)SQL語法語句大全(一篇學(xué)會所有SQL語句)

    基礎(chǔ)SQL語法語句大全(一篇學(xué)會所有SQL語句)

    ? ?如:select distinct name from student; ?如:select name,salary from employee where deptno = 3; ?如:select * from employees where deptno = 3 and salary-5000;(兩個條件同時滿足) select * from employees where (deptno =3 or depton =1) and salary 5000; ?如:select * from dept where loc like \\\'一樓%\\\';(表示查找loc字段中以一樓開

    2023年04月17日
    瀏覽(28)
  • MySQL 中的 SQL 查詢性能調(diào)優(yōu)

    ????????通過 MySQL 中的索引加速 SQL 查詢。安裝、分析查詢并使用存儲過程以獲得最佳結(jié)果。 ????????在本文中,我們將了解索引表列如何幫助提高 SQL 查詢的快速響應(yīng)時間。我們將介紹安裝 MySQL、創(chuàng)建存儲過程、分析查詢以及了解索引的影響的步驟。 ????????我在

    2024年02月12日
    瀏覽(25)
  • SQL的substring函數(shù)及其用法實例——MYSQL另一種截取目標(biāo)字符的函數(shù)

    目錄 1.substring()的語法和用法實例 (1)兩個參數(shù)的語法和用法實例 ①語法:substring(string ,index)|substring(string from index) ②用法實例: 從指定字符串的某序數(shù)開始獲取字符 (2)三個參數(shù)的語法和用法實例 ①語法:substring(string ,index,len)|substring(string from index for len) ②用法實

    2023年04月08日
    瀏覽(364)
  • SQL中的UNION和UNION ALL的區(qū)別及用法詳解、“提高SQL查詢效率:UNION和UNION ALL的比較、使用實例詳解SQL中的UNION和UNION ALL操作符

    UNION 和 UNION ALL 都是 SQL 中用于將多個 SELECT 語句的結(jié)果合并成一個結(jié)果集的操作符。它們都適用于需要將多個表或查詢結(jié)果合并在一起的情況。但是它們的行為略有不同。 UNION 和 UNION ALL 的區(qū)別在于, UNION 會將結(jié)果集合并成一個不含重復(fù)行的結(jié)果集,而 UNION ALL 則會保留所有

    2024年02月03日
    瀏覽(45)
  • 【SQL】MySQL中的窗口函數(shù)(開窗函數(shù))

    窗口函數(shù)是 MYSQL8.0 新增的 聚合函數(shù): 多行變一行,常見的sum,count,max,min 窗口函數(shù): 行數(shù)不變,常見的row_number,rank 語法格式: 窗口函數(shù)(表達(dá)式) over (partition by … order by … frame_clause) partition by是分區(qū),類似于group by,如去掉相當(dāng)于對所有數(shù)據(jù)進(jìn)行計算 order by排序 frame_c

    2024年02月07日
    瀏覽(21)
  • SQL中的單條件判斷函數(shù)IF,和多條件判斷CASE WHEN的用法

    SQL中的單條件判斷函數(shù)IF,和多條件判斷CASE WHEN的用法

    在SQL中,條件判斷函數(shù)IF用于根據(jù)指定的條件返回不同的值。 condition:要判斷的條件。 value_if_true:如果條件為真,則返回的值。 value_if_false:如果條件為假,則返回的值。 假設(shè)有如下名為studensts的表,包含id、name和score字段: 我們想根據(jù)學(xué)生的分?jǐn)?shù)判斷是否及格,并返回相

    2024年02月11日
    瀏覽(60)
  • sql遞歸查詢

    sql遞歸查詢

    一、postgresql 遞歸sql ? sql中with xxxx as () 是對一個查詢子句做別名,同時數(shù)據(jù)庫會對該子句生成臨時表; with recursive 則是一個遞歸的查詢子句,他會把查詢出來的結(jié)果再次代入到查詢子句中繼續(xù)查詢 p為自定義臨時表名,最后一句select后跟的字段必須小于等于t1和t2中字段。 第

    2024年02月11日
    瀏覽(28)
  • SQL高級:遞歸查詢

    如果在單表或兩表中存儲了 樹形結(jié)構(gòu) 數(shù)據(jù),那么在查詢這些數(shù)據(jù)時,就有可能要用到遞歸查詢。 在實際的業(yè)務(wù)場景中, 樹形結(jié)構(gòu) 的數(shù)據(jù)很常見。比如組織架構(gòu)、產(chǎn)品材料清單、產(chǎn)品大類和小類等等。 遞歸查詢也是一個很有趣的知識點。我們來學(xué)習(xí)一下它。 為了學(xué)習(xí)這個知

    2024年02月03日
    瀏覽(19)
  • 遞歸sql查詢完整科目名稱

    遞歸sql查詢完整科目名稱

    已知表 科目編號 科目名稱 1001 1001 現(xiàn)金 1002 1002 銀行存款 10020100 0100 工商銀行存款 100201000001 0001 工行重慶路支行 10020200 0200 建設(shè)銀行存款 100202000001 0001 建行鐵北支行 需要整理成 科目編號 科目稱 科目全稱 1001 現(xiàn)金 現(xiàn)金 1002 銀行存款 銀行存款 10020100 工商銀行存款 銀行存款

    2024年02月08日
    瀏覽(25)
  • mysql 自定義函數(shù),返回值為sql查詢后的某個字段的值

    函數(shù)框架:如果使用的是 Navicat 等可視化工具,通過點擊界面填寫相應(yīng)的條件就可以得到函數(shù)框架 1、definer 翻譯成中文是“定義者”的意思。MySQL中,創(chuàng)建視圖(view)、函數(shù)(function)、存儲過程(procedure)、觸發(fā)器(trigger)、事件(event)時,都可以指定 DEFINER = user 選項,即指定此對象

    2024年01月18日
    瀏覽(21)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包