IN关键字可以判断某个字段的值是否在指定的集合中。如果字段的值在集合中,则满足查询条件,该纪录将被查询出来。如果不在集合中,则不满足查询条件。其语法规则如下:[ NOT ] IN ( 元素1, 元素2, …, 元素n )
例如:
select * from STUDENT where STU_AGE in(11,12)
CREATE TABLE person (
name varchar(20)
)
INSERT INTO person VALUES ('a,b,c')
INSERT INTO person VALUES ('a,b')
INSERT INTO person VALUES ('a,c')
DELIMITER //
DROP FUNCTION GetTextCount //
/**********
-- 获取字符串中有几个部分.
**********/
CREATE FUNCTION GetTextCount(pSourceText VARCHAR(255), pDivChar CHAR(1))
RETURNS TINYINT
BEGIN
-- 预期结果.
DECLARE vResult TINYINT
-- 当前逗号的位置.
DECLARE vIndex INT
-- 前一个逗号的位置.
DECLARE vPrevIndex INT
-- 结果的初始值.
SET vResult = 1
-- 查询第一个 逗号的位置.
SET vIndex = INSTR(pSourceText, pDivChar)
IF vIndex = 0 THEN
-- 参数中没有逗号,直接返回.
RETURN vResult
END IF
-- 初始化情况,前一个逗号不存在.
SET vPrevIndex = 0
-- 循环处理。
WHILE vIndex > 0 DO
-- 结果递增.
SET vResult = vResult + 1
-- 前一个逗号的位置 = 当前逗号的位置
SET vPrevIndex = vIndex
-- 查询下一个逗号的位置.
SET vIndex = LOCATE(pDivChar, pSourceText, vPrevIndex + 1)
END WHILE
-- 返回结果.
RETURN vResult
END
//
DROP FUNCTION GetTextValue //
/**********
-- 获取字符串中具体某一个部分的数据.
**********/
CREATE FUNCTION GetTextValue(pSourceText VARCHAR(255), pDivChar CHAR(1), pIndex TINYINT)
RETURNS VARCHAR(255)
BEGIN
-- 预期结果.
DECLARE vResult VARCHAR(255)
IF pIndex = 1 THEN
SELECT SUBSTRING_INDEX(pSourceText, pDivChar, 1) INTO vResult
ELSE
SELECT
REPLACE(
SUBSTRING_INDEX(pSourceText, pDivChar, pIndex),
CONCAT(SUBSTRING_INDEX(pSourceText, pDivChar, pIndex - 1) , pDivChar),
'') INTO vResult
END IF
-- 返回.
RETURN vResult
END
//
DELIMITER
SELECT
GetTextValue(t.name, ',', MaxNum.No) AS `名称`,
COUNT(*) AS `个数`
FROM
person t,
(SELECT 1 No UNION ALL
SELECT 2 No UNION ALL
SELECT 3 No UNION ALL
SELECT 4 No UNION ALL
SELECT 5 No ) MaxNum
WHERE
GetTextCount(t.name, ',') >= MaxNum.No
GROUP BY
GetTextValue(t.name, ',', MaxNum.No)
+------+------+
| 名称 | 个数 |
+------+------+
| a | 3 |
| b | 2 |
| c | 2 |
+------+------+
3 rows in set (0.01 sec)
关系型数据库第一范式就说明了:
数据表中的每一列(字段),必须是不可拆分的最小单元,也就是确保每一列的原子性。
所以一个字段存多个值是不可能的。
当然可以把多个值序列化成一个字符串或者二进制保存到一个字段,比如字符串"作者1,作者2,作者3",但这样做也不是第一范式中所谓的多个值,只算一个值,并且对以后的细划查询也不方便,比如查作者信息,肯定不只是一个作者名啊。
所以一般设计上会有明细表,外键关系关联。
有一个book表,记录书的信息;
再有一个author表,记录作者信息,此表中有一个字段作外键引用book表的书id。
这样查询书有什么作者的时候只需要两个表外键join就行了。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)