数据库对层次结构的处理模型有好多种,可以根据自己的需求来设计模型,当然最简单的也是最容易设计的模型就是所谓的邻接模型。在这方面,其他数据库比如Oracle 提供了现成的分析方法 connect by,而MySQL在这方面就显得有些薄弱了。 不过可以用MySQL的存储过
数据库对层次结构的处理模型有好多种,可以根据自己的需求来设计模型,当然最简单的也是最容易设计的模型就是所谓的邻接模型。在这方面,其他数据库比如Oracle 提供了现成的分析方法 connect by,而MySQL在这方面就显得有些薄弱了。 不过可以用MySQL的存储过程实现ORACLE类似的分析功能
这样,先来创建一个简单的数表。
create table country ( id number(2) not null, name varchar(60) not null); create table country_relation (id number(2), parentid number(2));
插入一些数据
-- Table country. insert into country (id,name) values (0,'Earth'); insert into country (id,name) values (2,'North America'); insert into country (id,name) values (3,'South America'); insert into country (id,name) values (4,'Europe'); insert into country (id,name) values (5,'Asia'); insert into country (id,name) values (6,'Africa'); insert into country (id,name) values (7,'Australia'); insert into country (id,name) values (8,'Canada'); insert into country (id,name) values (9,'Central America'); insert into country (id,name) values (10,'Island Nations'); insert into country (id,name) values (11,'United States'); insert into country (id,name) values (12,'Alabama'); insert into country (id,name) values (13,'Alaska'); insert into country (id,name) values (14,'Arizona'); insert into country (id,name) values (15,'Arkansas'); insert into country (id,name) values (16,'California');
-- Table country_relation. insert into country_relation (id,parentid) values (0,NULL); insert into country_relation (id,parentid) values (2,0); insert into country_relation (id,parentid) values (3,0); insert into country_relation (id,parentid) values (4,0); insert into country_relation (id,parentid) values (5,0); insert into country_relation (id,parentid) values (6,0); insert into country_relation (id,parentid) values (7,0); insert into country_relation (id,parentid) values (8,2); insert into country_relation (id,parentid) values (9,2); insert into country_relation (id,parentid) values (10,2); insert into country_relation (id,parentid) values (11,2); insert into country_relation (id,parentid) values (12,11); insert into country_relation (id,parentid) values (13,11); insert into country_relation (id,parentid) values (14,11); insert into country_relation (id,parentid) values (15,11); insert into country_relation (id,parentid) values (16,11);
在Oracle 里面,对这些操作就比较简单了,都是系统提供的。
比如下面四种情形:
1). 查看深度,
select max(level) "level" from COUNTRY_RELATION a start with a.parentid is NULL connect by PRIOR a.id = a.PARENTID order by level; level ---------- 4 已用时间: 00: 00: 00.03
2). 查看叶子节点
select name from ( select b.name, connect_by_isleaf "isleaf" from COUNTRY_RELATION a inner join country b on (a.id = b.id) start with a.parentid is NULL connect by prior a.id = a.PARENTID ) T where T."isleaf" = 1; NAME -------------------------------------------------- Canada Central America Island Nations Alabama Alaska Arizona Arkansas California South America Europe Asia Africa Australia 已选择13行。 已用时间: 00: 00: 00.01
3) 查看ROOT节点
select connect_by_root b.name from COUNTRY_RELATION a inner join country b on (a.id = b.id) start with a.parentid is NULL connect by a.id = a.PARENTID CONNECT_BY_ROOTB.NAME -------------------------------------------------- Earth 已用时间: 00: 00: 00.01
4). 查看路径
select sys_connect_by_path(b.name,'/') "path" from COUNTRY_RELATION a inner join country b on (a.id = b.id) start with a.parentid is NULL connect by prior a.id = a.PARENTID order by level,a.id; path -------------------------------------------------- /Earth /Earth/North America /Earth/South America /Earth/Europe /Earth/Asia /Earth/Africa /Earth/Australia /Earth/North America/Canada /Earth/North America/Central America /Earth/North America/Island Nations /Earth/North America/United States /Earth/North America/United States/Alabama /Earth/North America/United States/Alaska /Earth/North America/United States/Arizona /Earth/North America/United States/Arkansas /Earth/North America/United States/California 已选择16行。 已用时间: 00: 00: 00.01
接下来我们看看在MySQL 里面如何实现上面四种情形:
前三种都比较简单,可以很容易写出SQL。
1)查看深度
mysql> SELECT COUNT(DISTINCT IFNULL(parentid,-1)) AS LEVEL FROM country_relation ; +-------+ | LEVEL | +-------+ | 4 | +-------+ 1 row in set (0.00 sec
)
2)查看ROOT节点
mysql> SELECT b.`name` AS root_node FROM -> ( -> SELECT id FROM country_relation WHERE parentid IS NULL -> ) AS a, country AS b WHERE a.id = b.id; +-----------+ | root_node | +-----------+ | Earth | +-----------+ 1 row in set (0.00 sec)
3). 查看叶子节点
mysql> SELECT b.`name` AS leaf_node FROM -> ( -> SELECT id FROM country_relation WHERE id NOT IN (SELECT IFNULL(parentid, -1) FROM country_relation) -> ) AS a, country AS b WHERE a.id = b.id; +-----------------+ | leaf_node | +-----------------+ | South America | | Europe | | Asia | | Africa | | Australia | | Canada | | Central America | | Island Nations | | Alabama | | Alaska | | Arizona | | Arkansas | | California | +-----------------+ 13 rows in set (0.00 sec) mysql>
4) 查看路径
这一块没有简单的SQL实现,不过可以用MySQL的存储过程来实现同样的功能。
存储过程代码如下:
DELIMITER $$ USE `t_girl`$$ DROP PROCEDURE IF EXISTS `sp_show_list`$$ CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_show_list`() BEGIN -- Created by ytt 2014/11/04. -- Is equal to oracle's connect by syntax. -- Body. DROP TABLE IF EXISTS tmp_country_list; CREATE TEMPORARY TABLE tmp_country_list (node_level INT UNSIGNED NOT NULL, node_path VARCHAR(1000) NOT NULL); -- Get the root node. INSERT INTO tmp_country_list SELECT 1, CONCAT('/',id) FROM country_relation WHERE parentid IS NULL; -- Loop within all parent node. cursor1:BEGIN DECLARE done1 INT DEFAULT 0; DECLARE i1 INT DEFAULT 1; DECLARE v_parentid INT DEFAULT -1; DECLARE v_node_path VARCHAR(1000) DEFAULT ''; DECLARE cr1 CURSOR FOR SELECT parentid FROM country_relation WHERE parentid IS NOT NULL GROUP BY parentid ORDER BY parentid ASC; DECLARE CONTINUE HANDLER FOR NOT FOUND SET done1 = 1; OPEN cr1; loop1:LOOP FETCH cr1 INTO v_parentid; IF done1 = 1 THEN LEAVE loop1; END IF; SET i1 = i1 + 1; label_path:BEGIN DECLARE done2 INT DEFAULT 0; DECLARE CONTINUE HANDLER FOR NOT FOUND SET done2 = 1; -- Get the upper path. SELECT node_path FROM tmp_country_list WHERE node_level = i1 - 1 AND LOCATE(v_parentid,node_path) > 0 INTO v_node_path; -- Escape the outer not found exception. IF done2 = 1 THEN SET done2 = 0; END IF; INSERT INTO tmp_country_list SELECT i1,CONCAT(IFNULL(v_node_path,''),'/',id) FROM country_relation WHERE parentid = v_parentid; END; END LOOP; CLOSE cr1; END; -- Update node's id to its real name. update_name_label:BEGIN DECLARE cnt INT DEFAULT 0; DECLARE i2 INT DEFAULT 0; SELECT MAX(node_level) FROM tmp_country_list INTO cnt; WHILE i2 < cnt DO UPDATE tmp_country_list AS a, country AS b SET a.node_path = REPLACE(a.node_path,CONCAT('/',b.id),CONCAT('/',b.name)) WHERE LOCATE(CONCAT('/',b.id),a.node_path) > 0; SET i2 = i2 + 1; END WHILE; END; SELECT node_path FROM tmp_country_list; END$$ DELIMITER ;
调用结果:
mysql> CALL sp_show_list(); +-----------------------------------------------+ | node_path | +-----------------------------------------------+ | /Earth | | /Earth/North America | | /Earth/South America | | /Earth/Europe | | /Earth/Asia | | /Earth/Africa | | /Earth/Australia | | /Earth/North America/Canada | | /Earth/North America/Central America | | /Earth/North America/Island Nations | | /Earth/North America/United States | | /Earth/North America/United States/Alabama | | /Earth/North America/United States/Alaska | | /Earth/North America/United States/Arizona | | /Earth/North America/United States/Arkansas | | /Earth/North America/United States/California | +-----------------------------------------------+ 16 rows in set (0.04 sec) Query OK, 0 rows affected (0.08 sec) mysql>

MySQLは、初心者がデータベーススキルを学ぶのに適しています。 1.MySQLサーバーとクライアントツールをインストールします。 2。selectなどの基本的なSQLクエリを理解します。 3。マスターデータ操作:テーブルを作成し、データを挿入、更新、削除します。 4.高度なスキルを学ぶ:サブクエリとウィンドウの関数。 5。デバッグと最適化:構文を確認し、インデックスを使用し、選択*を避け、制限を使用します。

MySQLは、テーブル構造とSQLクエリを介して構造化されたデータを効率的に管理し、外部キーを介してテーブル間関係を実装します。 1.テーブルを作成するときにデータ形式と入力を定義します。 2。外部キーを使用して、テーブル間の関係を確立します。 3。インデックス作成とクエリの最適化により、パフォーマンスを改善します。 4.データベースを定期的にバックアップおよび監視して、データのセキュリティとパフォーマンスの最適化を確保します。

MySQLは、Web開発で広く使用されているオープンソースリレーショナルデータベース管理システムです。その重要な機能には、次のものが含まれます。1。さまざまなシナリオに適したInnodbやMyisamなどの複数のストレージエンジンをサポートします。 2。ロードバランスとデータバックアップを容易にするために、マスタースレーブレプリケーション機能を提供します。 3.クエリの最適化とインデックスの使用により、クエリ効率を改善します。

SQLは、MySQLデータベースと対話して、データの追加、削除、変更、検査、データベース設計を実現するために使用されます。 1)SQLは、ステートメントの選択、挿入、更新、削除を介してデータ操作を実行します。 2)データベースの設計と管理に作成、変更、ドロップステートメントを使用します。 3)複雑なクエリとデータ分析は、ビジネス上の意思決定効率を改善するためにSQLを通じて実装されます。

MySQLの基本操作には、データベース、テーブルの作成、およびSQLを使用してデータのCRUD操作を実行することが含まれます。 1.データベースの作成:createdatabasemy_first_db; 2。テーブルの作成:createTableBooks(idintauto_incrementprimarykey、titlevarchary(100)notnull、authorvarchar(100)notnull、published_yearint); 3.データの挿入:InsertIntoBooks(タイトル、著者、公開_year)VA

WebアプリケーションにおけるMySQLの主な役割は、データを保存および管理することです。 1.MYSQLは、ユーザー情報、製品カタログ、トランザクションレコード、その他のデータを効率的に処理します。 2。SQLクエリを介して、開発者はデータベースから情報を抽出して動的なコンテンツを生成できます。 3.MYSQLは、クライアントサーバーモデルに基づいて機能し、許容可能なクエリ速度を確保します。

MySQLデータベースを構築する手順には次のものがあります。1。データベースとテーブルの作成、2。データの挿入、および3。クエリを実行します。まず、createdAtabaseおよびcreateTableステートメントを使用してデータベースとテーブルを作成し、InsertINTOステートメントを使用してデータを挿入し、最後にSelectステートメントを使用してデータを照会します。

MySQLは、使いやすく強力であるため、初心者に適しています。 1.MYSQLはリレーショナルデータベースであり、CRUD操作にSQLを使用します。 2。インストールは簡単で、ルートユーザーのパスワードを構成する必要があります。 3.挿入、更新、削除、および選択してデータ操作を実行します。 4. Orderby、Where and Joinは複雑なクエリに使用できます。 5.デバッグでは、構文をチェックし、説明を使用してクエリを分析する必要があります。 6.最適化の提案には、インデックスの使用、適切なデータ型の選択、優れたプログラミング習慣が含まれます。


ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

SecLists
SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。

ドリームウィーバー CS6
ビジュアル Web 開発ツール

ZendStudio 13.5.1 Mac
強力な PHP 統合開発環境
