那接着呢,在我们这种特殊形式的查询中还有最后一种,稍微麻烦一点,稍微需要动点脑筋才能理解的查询方式。就是我们的自身连接查询,或者我们叫做自查询,无限级分类查询。
自身连接查询:自己和自己进行连接查询,这就是我们这种无限级分类的需求。
无限级分类,分类的数量是无法确定的。要通过程序来实现这种无限级分类。
#测试自身连接
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';
这里只是简单的拿正则当作一个条件,来使用它。