MYSQL 递归操作

MYSQL 递归?

=====================

表: t_node

node_id int

node_name varchar2(45)

parent_id int

select * from t_node;

递归开始:

1.       向下查询:查找指定组下的所有分组 ( 不包括本身 )

select t2.node_id ,t2.node_name,t2.parent_id

from t_node t1, t_node t2 where t1.node_id=t2.parent_id and (t1.node_id= 0 or t1.parent_id= 0 );

分析:黑色部分为要查的组 id:0

结果:

2.       向下查询:查找指定组下的所有分组 ( 包括本身 )

select t2.node_id ,t2.node_name,t2.parent_id

from t_node t1, t_node t2 where t1.node_id=t2.parent_id and (t1.node_id= 0 or t1.parent_id= 0 )

union select t3.node_id ,t3.node_name,t3.parent_id from t_node t3 where t3.node_id= 0 ;

分析:黑色部分为要查的组 id:0

结果:

 

3.       向上查询:查找该组的所有父组

 

注意:发现一个问题,白马查不到。

上面的查询只能查 3 级,

 

转自:

分类表是一种典型的层次化关系的表,从数据库设计工作的角度看,让每个分类记录的 parentId 字段指向它们父分类的 Id即可。 
把层次关系转化为数据表并不困难,而且层次还相对比较清晰,但在这种表面现象的背后还有许多难题在等待着用户解决。比如,我们无法只用一个简单的 SELECT 就把指定分类的父分类或者子分类全部查询出来,而必须通过多次查询才能解决这个问题(或者一次查出后,用程序来进行处理)。 
事实上,数据库设计和 SQL 编程有着千丝万缕的联系,很难将他们完全区分开来,再者,如果 SQL 不足以把想要查询的数据从数据表里提取出来,那么,想拿出一个优秀的数据为设计方案就只能是一句空谈。 
想要通过数据表去管理和使用层次关系,得解决很多难题,而这些难题几乎都与 SQL 语言不能递归查询这一事实有关。以分类表为例: 
1 、只用一个查询就把指定分类的所有父分类全部查出来是不可能的 
2 、把完整的数据表还原为层次关系(树状)也是一个难点,还是必须执行多次 SQL 才能完成。 
3 、把指定分类下所有子分类全部查询出来 
4 、设计时,一个分类不能有两个父分类(例如: sql 语言既能够放在 database 分类中,但好象放在 programming 分类下也行,因此,如果 sql 语言有两个父分类仿佛才是合理的) 
5 、层次关系最担心 的是留下循环引用隐患(比如手工删除数据或者添加数据时,很容易导致第 4 条的情况发生,数据库层次断链或者重复等) 
虽然有这些存在的问题,但并非不可解决,而从上面这些难点来说,层次关系往往会导致即使是一个相对简单的问题也需要很多条 SQL 查询才能得出答案,而且整个过程都相当慢。如果不使用层次关系(或者使用有限的层次关系),上述问题即都可以避免。如果必须使用多级的层次关系,增加一些数据列或数据表来提供更多关于层次关系的信息,将有助于层次关系的解决方案变得简单一些。 
从范式的标准来说,冗余是不对的,它会导致存储空间不必要的浪费,增加数据库内部管理工作的负担,但为了提高应用程序的执行效率,冗余反而是一种相当简明的解决方案,因此,数据库设计其实是一件多方妥协和折中的事。在数据库领域,通往同一个目标的道路往往有好多条,选择其中的任意一条,都意味着作出了这样或那样的妥协。做出什么样的妥协最有利这往往取决于数据库的具体使用情况:什么类型的查询发生的最为频繁?数据需不需要频繁修改?

MYSQL 递归操作

时间: 2024-11-02 21:26:25

MYSQL 递归操作的相关文章

数据库MySQL简单操作(三)

1.3 多表查询 1.3.1连接查询: #内连接: 自连接查询: #外连接 左外连接(可以查询出表名1的所有记录,而表名2中只能查出匹配的记录) SELECT 属性名列表 FROM 表名1 LEFT JOIN 表名2 ON 表名1.属性名1=表名2.属性名2: # 右外连接(可以查询出表名2的所有记录,而表名1中只能查出匹配的记录): 先给右表插入一些值: 然后进行右外连接查询: 1.4 修改某些记录的字段 前面简单介绍了增(insert into)和 查(select * from),这里接着

MySql数据库操作

MySql数据库操作 –登录MySql:--– Windows环境进入cmd后输入mysql –h localhost –u root –p,再输入密码就可以启动mysql;其中localhost是mysql服务器所在的ip如果是本机可以用localhost. –数据库相关操作--– create database db_name(数据库名称)建名为db_name的数据库 show databases查看已经存在的数据库 drop database db_name删除名为db_name的数据库

Python 3 mysql 库操作

Python 3 mysql 库操作 一.基础相关知识 MySQL数据库基本操作知识储备 数据库服务器:一台计算机(对内存要求比较高) 数据库管理系统:如mysql,是一个软件 数据库:oldboy_stu,相当于文件夹 表:student,scholl,class_list,相当于一个具体的文件 记录:1 刘海龙 324245234 22,相当于文件中的一行内容 二.SQL语言简介 SQL(Structured Query Language 即结构化查询语言) SQL语言主要用于存取数据.查询

mysql的操作

SQL分类 DDL DDL:Data Definition Language,数据定义语言 主要是用来定义和维护数据库的各种操作对象,比如库.表.索引.视图 也可以说,操作的层次是在数据库的库和表的逻辑结构和存储结构上面,并没有对表中的实际的数据进行操作(增删改查)! 主要的操作关键字有:create.drop.alter等 DML DML:Data Manipulation Language,数据操作语言 主要是对表中的记录进行增删改查的操作! 其中,"查询"部分,有可以叫作DQL

MySQL常用操作总结

MySQL常用操作 前提条件:已安装MySQL. 学习目标:用一条sql语句写出A和B的剩余数量 AA表 BB表 以上为一道面试题,接下来由这道面试题来回顾一些数据库的基本操作. 登录MySQL sudo mysql -p,回车,然后输入密码即可,按ctrl+c退出登录: 显示数据库 show databases; 创建数据库 create database xxx; 选择数据库 use database xxx; 显示数据库表 show tables; 创建数据库表 create table 

二叉树高度,以及栈实现二叉树的先序,中序,后序遍历的非递归操作

求解二叉树的高度 树是递归定义的,所以用递归算法去求一棵二叉树的高度很方便. #include <iostream> #include <cstdio> using namespace std; struct Node { char data; Node *lchild; Node *rchild; }; void High(Node *T, int &h) { if (T == NULL) h = 0; else { int left_h; High(T->lchi

MYSQL常用操作函数的封装

1.mysql常用函数封装文件:mysql.func.php <?php /** * 连接MYSQL函数 * @param string $host * @param string $username * @param string $password * @param string $dbName * @param string $charset * @return resource */ function connect($host,$username,$password,$dbName,$

ubuntu命令行操作mysql常用操作

登陆mysql [email protected]:~/ruby/mydiary$ mysql -u root -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. 查看所有的数据库 mysql> show databases; --注意必须要用;结尾否则不会立即执行代码 +--------------------+ | Database | +--------------------+ | inf

mysql常用操作 mysql备份与恢复

先登录mysql  ==>mysql -uroot -p 查看数据库的版本 select version(); 查看有哪些库 show datases; 查看当前处于哪个库 select database(); 查看当前登录用户 select user(); 查看某个库下面的表: use db; show tables; 查看表的字段: desc dong; 创建库 create database db1; 创建表 create  table  tb1 (`id` int(4),`name`ch