MySQL数据库(十七)__2018.11.18

本文探讨了数据库中无限级分类的实现方法,通过自身连接查询展示如何构建和查询多级分类结构,同时介绍了正则表达式在SQL查询中的应用,包括多种模式字符及其使用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

那接着呢,在我们这种特殊形式的查询中还有最后一种,稍微麻烦一点,稍微需要动点脑筋才能理解的查询方式。就是我们的自身连接查询,或者我们叫做自查询,无限级分类查询。

自身连接查询:自己和自己进行连接查询,这就是我们这种无限级分类的需求。

无限级分类,分类的数量是无法确定的。要通过程序来实现这种无限级分类。

#测试自身连接
USE 自身连接;
CREATE TABLE cate(
	id SMALLINT UNSIGNED AUTO_INCREMENT KEY,
	cateName VARCHAR(100)NOT NULL UNIQUE,
	pId SMALLINT UNSIGNED NOT NULL DEFAULT 0 COMMENT'父Id'
);
#插入一个顶级分类
#或者说我们创建好几个顶级分类
INSERT cate(cateName,pId)VALUES('服装',0);
#家电也可以是一个顶级分类
INSERT cate(cateName,pId)VALUES('数码',0);
INSERT cate(cateName,pId)VALUES('儿童玩具',0);
#父Id为0
#我们可以把男装的父Id指向服装这个顶级分类
INSERT cate(cateName,pId)VALUES('男装',1);
INSERT cate(cateName,pId)VALUES('女装',1);
INSERT cate(cateName,pId)VALUES('内衣',1);

INSERT cate(cateName,pId)VALUES('电视',2);
INSERT cate(cateName,pId)VALUES('冰箱',2);
INSERT cate(cateName,pId)VALUES('洗衣机',2);

INSERT cate(cateName,pId)VALUES('爱马仕',3);
INSERT cate(cateName,pId)VALUES('LV',3);
INSERT cate(cateName,pId)VALUES('GUCCI',3);
#这相当于二级分类,在它下面还可以再有分类
#记住它的父类编号就行了

INSERT cate(cateName,pId)VALUES('夹克',4);
INSERT cate(cateName,pId)VALUES('衬衫',4);
INSERT cate(cateName,pId)VALUES('裤子',4);

INSERT cate(cateName,pId)VALUES('液晶电视',10);
INSERT cate(cateName,pId)VALUES('等离子电视',10);
INSERT cate(cateName,pId)VALUES('背投电视',10);

#查询所有的分类信息,并且得到其父分类
SELECT s.id,s.cateName AS sCateName,p.cateName AS pCateName
FROM cate AS s
LEFT JOIN cate AS p
#虚拟化出两张表,用自身连接
ON s.pId=p.`id`;

这就是一个自身连接查询。

#查询所有的分类信息,并且得到其父分类
SELECT p.id,p.cateName AS pCateName,s.cateName AS sCateName
FROM cate AS s
RIGHT JOIN cate AS p
#虚拟化出两张表,用自身连接
ON s.pId=p.`id`;

统计所有子分类

#查询所有分类并且得到子分类的数目
SELECT p.id,p.cateName AS pCateName,COUNT(s.cateName)AS COUNT
FROM cate AS s
RIGHT JOIN cate AS p
ON s.pid=p.id
GROUP BY p.cateName
ORDER BY id ASC;

特殊查询中的最后一种,正则表达式查询。

正则表达式的模式字符:

1.^匹配字符串开始的部分(以谁开始)

2.$匹配字符串结束的部分(以谁结尾)

3..代表一个任意字符(通配符)

4.以方括号指定集合abc[abc][a-z][0-9]

5.[^字符集合]除了集合中的内容

6.s1|s2|s3:匹配s1或者s2或者s3

7.*代表匹配前面的字符0次1次或多次

8.+表示匹配前面的字符至少出现1次

9.字符{n}:代表前面的字符至少出现n次

10.字符{m,n}:前面的字符至少出现m次,最多出现n次

select 字段名称,……from tb_name where 字段名称 regexp '匹配模式';

#测试正则表达式
#查询用户名以字母K开始的记录
SELECT *FROM user1
WHERE username REGEXP '^k';

#测试正则表达式
#查询用户名以字母n结束的记录
SELECT *FROM user1
WHERE username REGEXP 'n$';

#测试正则表达式
#查询用户名以字母n结束的记录
SELECT *FROM user1
WHERE username REGEXP '^q...n$';

#用户名包含aeiou
SELECT *FROM user1
WHERE username REGEXP '[aeiou]';

#匹配用户名字包含ki|im|qu的字符串
SELECT *FROM user1
WHERE username REGEXP 'ki|im|qu';

SELECT *FROM user1
WHERE username REGEXP 'que*n';

SELECT *FROM user1
WHERE username REGEXP 'imo*n';

SELECT *FROM user1
WHERE username REGEXP 'imo+c';
#至少要出现一次

#一次到三次之间
SELECT *FROM user1
WHERE username REGEXP 'imo{1,3}c';

这里只是简单的拿正则当作一个条件,来使用它。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值