MySQL数据库(十七)__2018.11.18

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

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

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

#测试自身连接
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';

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

猜你喜欢

转载自blog.csdn.net/weixin_40316053/article/details/84204603