有时我们需要查询某个字段是否包含某值时,通常用like进行模糊查询,但对于一些要求比较准确的查询时(例如:微信公众号的关键字回复匹配查询)就需要用到MySQL的 find_in_set()函数; 以下是用...find_in_set()函数写的sq查询l语句示例: $keyword = '你好'; $sql = "select * from table_name where find_in_set('"....$keyword"',msg_keyword) and msg_active = 1"; 以下是在tp框架中使用find_in_set()函数的查询示例: $keyword = '你好'; $where...数据库中存的关键字要以英文“,”分隔; 2.存储数据要对分隔符进行处理,保证以英文“,”分隔关键字。...以上这篇使用tp框架和SQL语句查询数据表中的某字段包含某值就是小编分享给大家的全部内容了,希望能给大家一个参考。
当查询结果返回表中 30% 内的数据时,应该走索引(表中数据量小,其实 phone 的等值查询也是);当查询结果返回的是超过表中 30% 数据时,基本会走全表扫描。...有人说基数高的列,有人说在 where 条件中的列。这些答案并不完美。基数高究竟多高?没有和总行数对比,始终不知道有多高。比如一个列的基数是几万行,但是总数是十几亿行,那么这个列的基数还高?...当一个列出现在 where 条件中,该列没有创建索引并且选择性大于 20% 时,那么该列必须创建索引,从而提升 SQL 查询性能。当然了,如果表只有几百条数据,那我们就不用创建索引了。...回表(TABLE ACCESS BY INDEX ROWID) 当对一个列创建索引之后,索引会包含该列的键值及键值对应行所在的 rowid。通过索引中记录的 rowid 访问表中的数据就叫回表。...select count (*) from test; 这样的 SQL 就无需回表。 当要查询的列也包含在索引中,这个时候就不需要回表,所以我们往往会建立组合索引来消除回表,从而提升性能。
penalties表中 也可以把本表中的行再次添加到本表中。...playerno FROM players; ##新建表的第一列数据已经插入完毕 UPDATE players_data pd ##更新,将新建表的第一列数据分别访问matches 表 SET number_mat...没有WHERE条件,则删除表中的所有行 示例: DELETE FROM penalties WHERE playerno=44; 语句释义:删除44号球员的罚款 2.带子查询 注:在WHERE子句的子查询中...[WHERE where_condition] 如果FROM中的表有别名,在DELETE子句中只能使用表别名 示例: DELETE teams, matches FROM teams, matches...数据的修改都是在内存中进行的 通过查询表,当前用户(事务)能够查看DML操作的结果 其它用户(事务)不能查看当前用户(事务)所做的DML操作的结果。
Tables:查询中涉及到的表 Explain:SQL语句 四、SQL优化利器—explain使用 explain模拟优化器执行SQL语句,在5.6以及以后的版本中,除过select,其他比如insert...--类型type还有其他值,如ref_or_null(与ref类似,区别在于条件中包含对NULL的查询)、index_merge(索引合并优化)、unique_subquery(in的后面是一个查询主键字段的子查询...7)rows:扫描行的数量 8)Extra:执行情况的说明和描述,包含不适合在其他列中显示但是对执行计划非常重要的额外信息。...6)限制每张表上的索引数量,建议单张表索引不超过5个 7)出现在SELECT、UPDATE、DELETE语句的WHERE条件的列,和包含在ORDER BY、GROUP BY、DISTINCT中的列,通常建立联合索引效果更好...8)区分度最高的放在联合索引的最左侧(区分度=列中不同值的数量/列的总行数) 9)尽量把字段长度小的列放在联合索引的最左侧(因为字段长度越小,一页能存储的数据量越大,IO性能也就越好) 10)使用最频繁的列放到联合索引的左侧
SELECT SELECT 可能是最常用的 SQL 语句,每次使用 SQL 查询数据时,几乎都会用到它。 例如,在下面的代码中,从customers表中查询name字段。...FROM customers; FROM FROM 指定查询的来源表 SELECT name FROM customers; WHERE 过滤查询,返回匹配条件的结果,一般条件将配合=,>,=,...customers WHERE age BETWEEN 45 AND 55; LIKE like用于模糊查询,在下面的示例代码中,将返回名称中包含字符 Bob 的数据 SELECT name FROM...customers WHERE name LIKE ‘%Bob%’; LIKE 的其他运算符: %x — 将选择所有以 x 开头的值 %x% — 将选择包含 x 的所有值 x% — 将选择所有以 x...CREATE INDEX idx_name ON customers (name); CREATE VIEW CREATE VIEW 根据 SQL 语句的结果集创建虚拟表,一个视图就像一张普通的表(可以像一张表一样查询
SELECT – 查询数据 SELECT 语句用于从表中选取数据,结果被存储在一个结果表中(称为结果集)。...WHERE – 条件过滤 如果需要从表中选取指定的数据,可将 WHERE 子句添加到 SELECT 语句。...JOIN – 多表关联 JOIN 用于根据两个或多个表中的列之间的关系,从这些表中查询数据。 有时为了得到完整的结果,我们需要从两个或更多的表中获取结果。我们就需要执行 join。...数据库中的表可通过键将彼此联系起来。主键(Primary Key)是一个列,在这个列中的每一行的值都是唯一的。在表中,每个主键的值都是唯一的。...VIEW – 视图 在 SQL 中,视图是基于 SQL 语句的结果集的可视化的表。 视图包含行和列,就像一个真实的表。视图中的字段就是来自一个或多个数据库中的真实的表中的字段。
SQL 面向数据库执行查询 SQL 可从数据库取回数据 SQL 可在数据库中插入新的记录 SQL 可更新数据库中的数据 SQL 可从数据库删除记录 SQL 可创建新数据库 SQL 可在数据库中创建新表...SELECT – 查询数据 SELECT 语句用于从表中选取数据,结果被存储在一个结果表中(称为结果集)。...WHERE – 条件过滤 如果需要从表中选取指定的数据,可将 WHERE 子句添加到 SELECT 语句。...有时为了得到完整的结果,我们需要从两个或更多的表中获取结果。我们就需要执行 join。 数据库中的表可通过键将彼此联系起来。主键(Primary Key)是一个列,在这个列中的每一行的值都是唯一的。...VIEW – 视图 在 SQL 中,视图是基于 SQL 语句的结果集的可视化的表。 视图包含行和列,就像一个真实的表。视图中的字段就是来自一个或多个数据库中的真实的表中的字段。
user表的总行数是5,gender 列的基数是 2,说明 gender 列里面有大量重复值,name 列的基数等于总行数,说明 name列没有重复值,相当于主键。...回表 当对一个列创建索引之后,索引会包含该列的键值及键值对应行所在的 rowid。通过索引中记录的 rowid 访问表中的数据就叫回表。...回表次数太多会严重影响 SQL 性能,如果回表次数太多,就不应该走索引扫描,应该直接走全表扫描。 EXPLAIN命令结果中的 UsingIndex意味着不会回表,通过索引就可以获得主要的数据。...Handlerreadrnd_next:数据文件中读取下一行的请求数,如果正在进行大量的表扫描,值将较高,则说明索引利用不理想。...当查询其他列时,就需要回表查询,这也是为什么要避免 SELECT*的原因之一: EXPLAIN SELECT*FROM userwherestatus=1; ?
通过索引中记录的 rowid 访问表中的数据就叫回表。回表次数太多会严重影响 SQL 性能,如果回表次数太多,就不应该走索引扫描,应该直接走全表扫描。...EXPLAIN命令结果中的Using Index意味着不会回表,通过索引就可以获得主要的数据。Using Where则意味着需要回表取数据。...Handler_read_rnd_next:数据文件中读取下一行的请求数,如果正在进行大量的表扫描,值将较高,则说明索引利用不理想。...; 而是查询条件中是否包含索引最左列字段: EXPLAIN SELECT * FROM user WHERE status=2 ; 5.union、in、or 都能够命中索引,建议使用 in。...where status=1; 当查询其他列时,就需要回表查询,这也是为什么要避免SELECT *的原因之一: EXPLAIN SELECT * FROM user where status=1
student where id > 1; 因为「union会对结果去重,内部创建了一个 名字的临时表,把查询 1 和查询 2 的结果集都合并到这个临时表中,利用唯一键进行去重,...将被标记为:DERIVED SUBQUERY 在SELECT或WHERE列表中包含了子查询 DERIVED 在FROM列表中包含的子查询被标记为DERIVED(衍生);MySQL会递归执行这些子查询...UNION RESULT 从UNION表获取结果的SELECT DEPENDENT SUBQUERY 在SELECT或WHERE列表中包含了子查询,子查询基于外层 UNCACHEABLE SUBQUREY...三、覆盖索引 索引覆盖:「只需要在一棵索引树上就能获取SQL所需的所 有列数据,无需回表,速度更快」 覆盖索引形式:,搜索的索引键中的字段恰好是查询的字段 实现索引覆盖最常见的方法就是:将被查询的字段,...第一次将排序字段读取出来,然后排序;第二 次去读取其他字段数据。 单路排序:从磁盘查询所需的所有列数据,然后在内存排序将结果返回。
'Fish%' -- 查询Fish开头 where prod_name like '%Fish' -- 查询Fish结尾 where prod_name like '%Fish%' -- 查询包含Fish...为什么需要存储过程 简化操作:将处理封装在一个单元中,简化复杂的操作,隐藏赋复杂的业务逻辑 防止错误:不必要建立重复的一系列处理步骤,保证数据的一致性 保证安全:简化对变动的管理。...-- 商品名字 7.08, -- 价格 'a product of skin' -- 描述 ); 存储过程自动将新的行添加到Products表中,并且将传入的属性传给对应的列。...as select * from TENNIS.MATCHES; 存储过程实例 mysql>delimiter $$ -- 将SQL语句的结束符临时改为$$(这个符号可以自定义) mysql>...create procedure delete_matches(in p_playerno integer) ->begin -> delete from matches -> where
简单来说: COUNT(1) 和 COUNT(*) 表示的是直接查询符合条件的数据库表的行数。而 COUNT(列名) 表示的是查询符合条件的列的值不为 NULL 的行数。...结果是一个 BIGINT 值。 如果查询结果没有命中任何记录,则返回 0。 但是,值得注意的是,COUNT(*) 的统计结果中会包含值为 NULL 的行数。...MyISAM 之所以能够记录表中的总行数并供 COUNT(*) 查询使用,是因为其表级锁机制保证了行数查询的准确性,没有并发的行数修改。...从 MySQL 8.0.13 开始,针对 InnoDB 的 SELECT COUNT(*) FROM tbl_name 查询,在扫表过程中进行了优化,前提是查询语句不包含 WHERE 或 GROUP BY...这些优化的前提是查询语句中不包含 WHERE 和 GROUP BY 条件。
组合索引 INDEX:即一个索引包含多个列,多用于避免回表查询。...user表的总行数是5,gender列的基数是2,说明gender列里面有大量重复值,name列的基数等于总行数,说明name列没有重复值,相当于主键。...回表:当对一个列创建索引之后,索引会包含该列的键值及键值对应行所在的rowid。通过索引中记录的rowid访问表中的数据就叫回表。...回表次数太多会严重影响SQL性能,如果回表次数太多,就不应该走索引扫描,应该直接走全表扫描。 EXPLAIN命令结果中的Using Index意味着不会回表,通过索引就可以获得主要的数据。...当查询其他列时,就需要回表查询,这也是为什么要避免SELECT*的原因之一: EXPLAIN SELECT * FROM user where status=1; ?
聚合函数又叫组函数,通常是对表中的数据进行统计和计算,一般结合分组(group by)来使用,用于统计和计算分组数据 常用的聚合函数: count(col): 表示求指定列的总行数 max(col):...表示求指定列的最大值 min(col): 表示求指定列的最小值 sum(col): 表示求指定列的和 avg(col): 表示求指定列的平均值 2、求总行数 -- 返回非NULL数据的总行数. select...分组查询 1、分组查询介绍 分组查询就是将查询结果按照指定字段进行分组,字段中数据相等的分为一组 分组查询基本的语法格式如下: GROUP BY 列名 [HAVING 条件表达式] [WITH ROLLUP...第一范式(1NF): 强调的是列的原子性,即列不能够再分成其他几列。...开发流程是先画出E-R模型,然后根据三范式设计数据库中的表结构 外键SQL语句的编写 1、外键约束作用 外键约束:对外键字段的值进行更新和插入时会和引用表中字段的数据进行验证,数据如果不合法则更新和插入会失败
回表:当对一个列创建索引之后,索引会包含该列的键值及键值对应行所在的rowid。通过索引中记录的rowid访问表中的数据就叫回表。...回表次数太多会严重影响SQL性能,如果回表次数太多,就不应该走索引扫描,应该直接走全表扫描。 EXPLAIN命令结果中的Using Index意味着不会回表,通过索引就可以获得主要的数据。...Handler_read_rnd_next:数据文件中读取下一行的请求数,如果正在进行大量的表扫描,值将较高,则说明索引利用不理想。...最左原则并不是说是查询条件的顺序: EXPLAIN SELECT * FROM user WHERE status=1 AND name='swj'; 而是查询条件中是否包含索引最左列字段: EXPLAIN...where status=1; 当查询其他列时,就需要回表查询,这也是为什么要避免SELECT*的原因之一: EXPLAIN SELECT * FROM user where status=1;
子查询必须被圆括号 () 括起来。 内部查询首先在其父查询之前执行,以便可以将内部查询的结果传递给外部查询。执行过程可以参考下图: ?...,并生成一个结果集,其中包含来自 UNION 中参与查询的提取行。...UNION 基本规则 所有查询的列数和列顺序必须相同。 每个查询中涉及表的列的数据类型必须相同或兼容。 通常返回的列名取自第一个查询。...只能包含一个 ORDER BY 子句,并且必须位于语句的最后。 应用场景 在一个查询中从不同的表返回结构数据。 对一个表执行多个查询,按一个查询返回数据。...DESC, prod_name ASC; GROUP BY GROUP BY 子句将记录分组到汇总行中。
如果查询的结果没有命中任何记录,则返回0 但是,值得注意的是,COUNT(*)的统计结果中,包含值为NULL的行数。...所以, COUNT(常量)和 COUNT(*)表示的是直接查询符合条件的数据库表的行数。而COUNT(列名)表示的是查询符合条件的列的值不为NULL的行数。...MyISAM之所以可以把表中的总行数记录下来供COUNT(*)查询使用,那是因为MyISAM数据库是表级锁,不会有并发的数据库行数修改,所以查询得到的行数是准确的。...前提是查询语句中不包含WHERE或GROUP BY等条件。...至此,我们介绍完了MySQL数据库对于COUNT(*)的优化,这些优化的前提都是查询语句中不包含WHERE以及GROUP BY条件。
表中总行数除以分区大小给出生成的SQL语句(即流文件)的数量。值为0表示将生成一个流文件,其SQL语句将获取表中的所有行。...) Additional WHERE clause 在构建SQL查询时,要在WHERE条件中添加一个自定义子句。...表中总行数除以分区大小给出生成的SQL语句(即流文件)的数量。值为0表示将生成一个流文件,其SQL语句将获取表中的所有行。...)Additional WHERE clause 在构建SQL查询时,要在WHERE条件中添加一个自定义子句。...应用场景 GenerateTableFetch使用其属性和指定的数据库连接生成包含SQL语句的流文件,这些SQL语句可用于从表中获取分页的数据。
回表:当对一个列创建索引之后,索引会包含该列的键值及键值对应行所在的rowid。通过索引中记录的rowid访问表中的数据就叫回表。...回表次数太多会严重影响SQL性能,如果回表次数太多,就不应该走索引扫描,应该直接走全表扫描。 EXPLAIN命令结果中的Using Index意味着不会回表,通过索引就可以获得主要的数据。...Handler_read_rnd_next:数据文件中读取下一行的请求数,如果正在进行大量的表扫描,值将较高,则说明索引利用不理想。...,最左原则并不是说是查询条件的顺序: EXPLAIN SELECT * FROM user WHERE status=1 AND name='swj'; 而是查询条件中是否包含索引最左列字段: EXPLAIN...where status=1; 当查询其他列时,就需要回表查询,这也是为什么要避免SELECT*的原因之一: EXPLAIN SELECT * FROM user where status=1;
领取专属 10元无门槛券
手把手带您无忧上云