重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
INSTR(str,substr)
成都创新互联公司于2013年创立,是专业互联网技术服务公司,拥有项目成都网站建设、网站建设网站策划,项目实施与项目整合能力。我们以让每一个梦想脱颖而出为使命,1280元东平做网站,已为上家服务,为东平各地企业和个人服务,联系电话:13518219792
返回字符串 str 中子字符串的第一个出现位置。这和LOCATE()的双参数形式相同,除非参数的顺序被颠倒。
代码如下
mysql SELECT INSTR('foobarbar', 'bar');
- 4
mysql SELECT INSTR('xbar', 'foobar');
- 0
LOCATE(substr,str) , LOCATE(substr,str,pos)
第一个语法返回字符串 str中子字符串substr的第一个出现位置。第二个语法返回字符串 str中子字符串substr的第一个出现位置, 起始位置在pos。如若substr 不在str中,则返回值为0。
代码如下
mysql SELECT LOCATE('bar', 'foobarbar');
- 4
mysql SELECT LOCATE('xbar', 'foobar');
- 0
mysql SELECT LOCATE('bar', 'foobarbar',5);
- 7
这个函数支持多字节字元,并且只有当至少有一个参数是二进制字符串时区分大小写。
POSITION(substr IN str)
返回子串 substr 在字符串 str 中第一次出现的位置。如果子串 substr 在 str 中不存在,返回值为 0:
代码如下
mysql SELECT POSITION('bar', ‘foobarbar');
- 4
mysql SELECT POSITION('xbar', ‘foobar');
- 0
效率测试
代码如下
SELECT * FROM `o_soft` WHERE LOCATE('d200',tid2)0
MySQL 返回的查询结果为空(即零行)。 (查询花费 0.0050 秒)
代码如下
SELECT * FROM `o_soft` WHERE INSTR('d200',tid2)0
FROM
子查询
FROM
子句中的子查询
MySQL
FROM
子查询是指
FROM
的子句作为子查询语句,主查询再到子查询结果中获取需要的数据。FROM
子查询语法如下:
SELECT
...
FROM
(subquery)
AS
name
...
子查询会生成一个临时表,由于
FROM
子句中的每个表必须有一个名称,因此
AS
name
是必须的。FROM
子查询也称为衍生数据表子查询。
FROM
子查询实例
table1:
s1
s2
1
5
2
12
3
20
FROM
子查询
SQL
如下:
SELECT
s1,s2
FROM
(SELECT
s1,
s2*2
AS
s2
FROM
table1)
AS
temp
WHERE
s1
1
查询返回结果如下所示:
s1
s2
2
24
3
40
提示
MySQL
FROM
子句中的子查询可以返回标量、列、行或表,但不能为有关联的子查询。
MySQL
子查询
EXISTS
和
NOT
EXISTS
MySQL
EXISTS
和
NOT
EXISTS
子查询
MySQL
EXISTS
和
NOT
EXISTS
子查询语法如下:
SELECT
...
FROM
table
WHERE
EXISTS
(subquery)
该语法可以理解为:将主查询的数据,放到子查询中做条件验证,根据验证结果(TRUE
或
FALSE)来决定主查询的数据结果是否得以保留。
MySQL
EXISTS
子查询实例
下面以实际的例子来理解
EXISTS
子查询。下面是原始的数据表:
article
文章表:
user
用户表:
我们要查出
article
表中的数据,但要求
uid
必须在
user
表中存在。SQL
语句如下:
SELECT
*
FROM
article
WHERE
EXISTS
(SELECT
*
FROM
user
WHERE
article.uid
=
user.uid)
返回查询结果如下:
从语句执行结果可以看出,article
表中第
4
条记录没有被保留,原因就是该条记录的数据在子查询中返回的结果是
FALSE
。
当上面的
SQL
使用
NOT
EXISTS
时,查询的结果就是
article
表中
uid
不存在于
user
表中的数据记录。
提示
EXISTS
(subquery)
只返回
TRUE
或
FALSE,因此子查询中的
SELECT
*
也可以是
SELECT
1
或其他,官方说法是实际执行时会忽略
SELECT
清单,因此没有区别。
EXISTS
子查询的实际执行过程可能经过了优化而不是我们理解上的逐条对比,如果担忧效率问题,可进行实际检验以确定是否有效率问题。
EXISTS
子查询往往也可以用条件表达式、其他子查询或者
JOIN
来替代,何种最优需要具体问题具体分析。
呵呵,奔驰一激动,写了出了点小毛病,我给纠正一下,分给他,不用给我:
select id,date_format(time,%H) as hour
from table
where date_format(time,%H) in(
select date_format(time,%H)
from table
group by date_format(time,%H)
having count(*) 1;
);
子查询指一个查询语句嵌套在另一个查询语句内部的查询,这个特性从 MySQL 4.1 开始引入,在 SELECT 子句中先计算子查询,子查询结果作为外层另一个查询的过滤条件,查询可以基于一个表或者多个表。
子查询中常用的操作符有 ANY(SOME)、ALL、IN 和 EXISTS。
子查询可以添加到 SELECT、UPDATE 和 DELETE 语句中,而且可以进行多层嵌套。子查询也可以使用比较运算符,如“”、“=”、“”、“=”、“!=”等。