下面说说如何来思考上面SQL语句执行情况: from zhu:sql执行的第一步,找表,这个没啥变化; from zhu group by age:没有join 和 where 操作,就是group by...在 MySQL 查询时,当表的名字比较长或者表内某些字段比较长时,为了方便书写或者多次使用相同的表,可以给字段列或表设置别名。...例如,创建一个表 test,该表包含不设置 NOT NULL 的字段,然后向表中插入不同的记录值,其中包括 NULL 值和实际有值的记录,最后通过 SELECT 查询字段中包括 NULL 和不包括 NULL...如果一个整数一个字符串,则会自动将字符串转换为数字,再进行比较。 如果两者都是字符串,则按照字符串进行比较。 如果两者中至少有一个值是 NULL,则比较的结果是 NULL。...,还包括右表中有但是左表中不匹 配的行,这些记录在左表中以 NULL 补足。
的特殊作用, 任何字段 和 NULL 比较的结果都是 false。...group by: 对 SELECT 查询出来的结果集按照某个字段或者表达式进行分组,获得一组组的集合,然后从每组中取出一个指定字段或者表达式的值。...简单的正则表达式测试 可以在不使用数据库表的情况下用SELECT来测试正则表达式。REGEXP 检查总是返回0(没有匹配)或1(匹配)。可以用带文字串的REGEXP来测试表达式,并试验它们。...MySQL 字段属性应该尽量设置为 NOT NULL 指定 NULL 在不指定 NOT NULL 时,多数 DBMS 认为指定的是 NULL,但不是所有的 DBMS 都这样。...建议在定义列的时候,检查 COMMENT 备注,是否运行非空,是否具有唯一性。 SQL 允许指定默认值,在插入行时如果不给出值,DBMS 将自动采用默认值。
2.2、DQL 子句:JOIN 在 MySQL 中,JOIN 语句用于将数据库中的两个表或者多个表组合起来。...也就是两个表中的所有的行的所有可能的组合。这相当于内连接没有连接条件或者连接条件永远为真。 如果一个有 m 行的表和另一个有 n 行的表,它们交叉连接将返回 m * n 行数据。...右连接与左连接处理逻辑相反,右连接以右表的数据行为基础,根据条件匹配左表中的数据。如果匹配不到左表中的数据,则左表中的列为 NULL 值。...AND 运算符是一个双目逻辑运算符,用来组合两个操作数。只有当两个操作数都为真时,结果才返回真,否则返回假或者 NULL。...2.3.3、运算符 IN 在使用 SQL 查询的时候,我们可能需要判断一个字段的值是否位于一组值中,这就需要用到 IN 运算符了。
NULL 与不匹配 在通过过滤选择出不具有特定值的行时,你可能希望返回具有 NULL 值的行。但是,不行。因为未知具有特殊的含义,数据库不知道它们是否匹配,所以在匹配过滤或不匹配过滤时不返回它们。...因此,在过滤数据时,一定要验证返回数据中确实给出了被过滤列具有 NULL 的行。 计算次序 WHERE 可包含任意数目的 AND 和 OR 操作符。允许两者结合以进行复杂和高级的过滤。...❑ 如果分组列中包含具有 NULL 值的行,则 NULL 将作为一个分组返回。如果列中有多行NULL值,它们将分为一组。...例如,指定一个词必须匹配,一个词必须不匹配,而一个词仅在第一个词确实匹配的情况下才可以匹配或者才可以不匹配。...这样,MySQL 可以快速有效地决定哪些词匹配(哪些行包含它们),哪些词不匹配,它们匹配的频率,等等。
当explain与SQL一起使用时,MySQL将显示来自优化器的有关语句执行计划的信息。即MySQL解释了它将如何处理该语句,包括有关如何连接表以及以何种顺序连接表等信息。...这是因为不加单引号时,是字符串跟数字的比较,它们类型不匹配,MySQL会做隐式的类型转换,把它们转换为浮点数再做比较。隐式的类型转换,索引会失效。...2.9 group by使用临时表 group by一般用于分组统计,它表达的逻辑就是根据一定的规则,进行分组。日常开发中,我们使用得比较频繁。如果不注意,很容易产生慢SQL。...我们来看下这个SQL的执行流程 select city ,count(*) as num from staff group by city; 创建内存临时表,表里有两个字段city和num; 全表扫描...可以有这些优化方案: group by 后面的字段加索引 order by null 不用排序 尽量只使用内存临时表 使用SQL_BIG_RESULT 2.10 delete + in子查询不走索引!
表是某种特定类型数据的结构化清单。 存储在表中的数据是同一种类型的数据或者清单 数据库中的每个表都有自己的名字,并且这个表是唯一的。 列 表是由列组成的,列存储表中某部分的信息。列是表中的某个字段。...AND...联合使用 空值检查 当我们创建表的时候,可以指定其中的列是否包含空值。在一个列不包含值时,称其包含空值NULL。...日期和时间处理函数 日期和时间采用相应的数据类型存储在表中,以特殊的格式来存储。...除了聚集函数外,SELECT语句中的每列都必须在GROUP BY子句中列出 如果分组中包含具有NULL的行,则NULL将作为一个分组返回;如果列中出现多个NULL,它们将分成一个组 GROUP BY子句必须在...因此外联结实际上有两种形式,它们之间可以互换 左外联结 右外联结 还有一种比较特殊的外联结,叫做全外联结full outer join,它检索的是两个表中的所有行并关联那些可以关联的行。
在使用等号运算符时,遵循如下规则: 如果等号两边的值、字符串或表达式都为字符串,则MySQL会按照字符串进行比较,其比较的是每个字符串中字符的ANSI编码是否相等。...在fruits表中,查询f_name字段以字母‘b’开头的记录,SQL语句如下: SELECT * FROM fruits WHERE f_name REGEXP '^b'; 查询以特定字符或字符串结尾的记录...在fruits表中,查询f_name字段以字母‘y’结尾的记录,SQL语句如下: SELECT * FROM fruits WHERE f_name REGEXP 'y$'; 用符号"."...在fruits表中,查询f_name字段值 包含字母‘a’与‘g’且两个字母之间只有一个字母的记录,SQL语句如下: SELECT * FROM fruits WHERE f_name REGEXP...在fruits表中,查找f_name字段中包含字母‘o’或者‘t’的记录,SQL语句如下: SELECT * FROM fruits WHERE f_name REGEXP '[ot]'; 匹配指定字符以外的字符
本章节我们将向大家介绍如何使用 MySQL 的 JOIN 在两个或多个表中查询数据。 你可以在 SELECT, UPDATE 和 DELETE 语句中使用 Mysql 的 JOIN 来联合多表查询。...JOIN 按照功能大致分为如下三类: INNER JOIN(内连接,或等值连接):获取两个表中字段匹配关系的记录。 LEFT JOIN(左连接):获取左表所有记录,即使右表没有对应匹配的记录。...: 比较操作符(不同于 = 运算符),当比较的的两个值相等或者都为 NULL 时返回 true。 关于 NULL 的条件比较运算是比较特殊的。你不能使用 = NULL 或 !...在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务。 事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行。...值和默认值的影响 当你修改字段时,你可以指定是否包含值或者是否设置默认值。
,所以在应用反应执行效率出现问题的时候查询慢查询日志并不能定位问题,可以使用show processlist命令查看当前Mysql在进行的线程,包括线程的状态,是否锁表等,可以实时查看sql的执行情况,...; 可以从warning的字段中能够看到,会去除一些恒成立的条件,可以利用explain extended的结果来迅速的获取一个更清晰易读的sql语句 通过show profile 分析sql 查看mysql...连接之所用更有效率是因为mysql不需要在内存中创建临时表来完成这个逻辑上需要两个步骤的查询工作 优化分页查询 一般分页查询,通过创建覆盖索引能够比较好地提高性能。...函数完成统计工作,这两个函数的一般用途就是做数值之间的逻辑 ---- 优化数据库对象 优化表类型 表需要使用何种数据类型工具应用来判断,虽然考虑字段的长度会有一定的冗余,但是不推荐让很多字段都留有大量的冗余...增加的派生列其他作业是在查询时减少连接操作,避免使用集函数 重新组表:指如果许多用户需要查看两个表连接出来的结果数据,则把这两个表查询组成一个表来减少连接而提高性能 分割表 维护数据的完整性 批处理维护是指对复制列或派生列的修改积累一定的时间后
在使用等号运算符时,遵循如下规则: 如果等号两边的值、字符串或表达式都为字符串,则 MySQL 会按照字符串进行比较,其比较的是每个字符串中字符的 ANSI 编码是否相等。...在 fruits 表中,查询 f_name 字段以字母‘b’开头的记录,SQL 语句如下: mysql> SELECT * FROM fruits WHERE f_name REGEXP '^b'; 2...在 fruits 表中,查询 f_name 字段以字母‘y’结尾的记录,SQL 语句如下: mysql> SELECT * FROM fruits WHERE f_name REGEXP 'y$'; 3...在 fruits 表中,查找 f_name 字段中包含字母‘o’或者‘t’的记录,SQL 语句如下: mysql> SELECT * FROM fruits WHERE f_name REGEXP '[...ot]'; 在 fruits 表中,查询 s_id 字段中包含 4、5 或者 6 的记录,SQL 语句如下: mysql> SELECT * FROM fruits WHERE s_id REGEXP
可使用show processlist命令查看当前MySQL在进行的线程,包括线程的状态,是否锁表等,可以实时查看sql的执行情况,同时对一些锁表进行优化。...连接之所用更有效率是因为mysql不需要在内存中创建临时表来完成这个逻辑上需要两个步骤的查询工作 优化分页查询 一般分页查询,通过创建覆盖索引能够比较好地提高性能。...函数完成统计工作,这两个函数的一般用途就是做数值之间的逻辑 ---- 优化数据库对象 优化表类型 表需要使用何种数据类型工具应用来判断,虽然考虑字段的长度会有一定的冗余,但是不推荐让很多字段都留有大量的冗余...增加的派生列其他作业是在查询时减少连接操作,避免使用集函数 重新组表:指如果许多用户需要查看两个表连接出来的结果数据,则把这两个表查询组成一个表来减少连接而提高性能 分割表 维护数据的完整性 批处理维护是指对复制列或派生列的修改积累一定的时间后...特别是在需求变化时,不易于维护 使用触发器,对数据的任何修改立即触发对复制列或者派生列的相应修改,触发器是实时的,而且相应的处理逻辑只在一个地方出现,易于维护,一般来说,是解决这类问题比较好的方法 使用中间表提高统计查询速度
这是因为不加单引号时,是字符串跟数字的比较,它们类型不匹配,MySQL 会做隐式的类型转换,把它们转换为浮点数再做比较。隐式的类型转换,索引会失效。...select * from user where name =’捡田螺的小男孩’; 因为查询条件列 name 不是联合索引 idx_userid_name 中的第一个列,索引不生效 在联合索引中,查询条件满足最左匹配原则时...如果被驱动表没有可用的索引,join 是在 join_buffer 内存做的,如果匹配的数据量比较小或者 join_buffer 设置的比较大,速度也不会太慢。...11、group by 使用临时表 group by 一般用于分组统计,它表达的逻辑就是根据一定的规则,进行分组。日常开发中,我们使用得比较频繁。如果不注意,很容易产生慢 SQL。...我们来看下这个 SQL 的执行流程 select city ,count(*) as num from staff group by city; 创建内存临时表,表里有两个字段 city和num
而在hive SQL中,既有简易的Like关键字匹配特定的字符,也可以使用regexp_extract,regexp_replace这两个函数更灵活地实现目标。接下来我们举例说明。...为了减少干扰,我们将order数据重新读入,并设置了pandas的显示方式。 ? 可以看到,同一个uid对应的订单id已经显示在同一行了,订单id之间以逗号分隔。...下面是在Hive和pandas中查看数据样例的方式。我们的目标是将原始以字符串形式存储的数组元素解析出来。 ? ?...先来看pandas中如何实现,这里我们需要用到literal_eval这个包,能够自动识别以字符串形式存储的数组。...本文的出发点仅仅是对比两者的操作,方便从两个角度理解常见的数据处理手段,也方便工作中的转换查阅,不强调孰优孰劣。
order by的执行比较特殊)再进行的操作, 也就是说sql语句中的order by也会影响分析函数的执行结果: a) 两者一致:如果sql语句中的order by满足与分析函数配合的开窗函数...这里如果开窗函数的统计结果为null或者为0,就是说占用比率的被除数为0或者为null, 则得到的结果也为0....7、KEEP的使用 keep是Oracle下的另一个分析函数,他的用法不同于通过over关键字指定的分析函数,可以用于这样一种场合下:取同一个分组下以某个字段排序后,对指定字段取最小或最大的那个值...而前面的MIN或者MAX则是在KEEP的结果集中取某一字段的最大值或最小值。 ...不匹配换行符号; m:多行模式; x:扩展模式,忽略正则表达式中的空白字符。
两者的兼容关系如下: - S X S √ × X × × 意向锁 1.如果事务T1对表的第5行加了排它锁,T2又想对表加排它锁/共享锁,T2需要检查两件事: 表上是否有表级的排它锁。...表中某一行是否加了排它锁。 在判断第二点的时候,需要遍历表中的每一行才能判断,这样的开销太大了。如果能给表加一个标志,用来标志表内某一行是否有排它锁。这样就产生了意向锁。...=检测是否相等,、!=检测不等,其他还有=。 BINARY表示区分大小写。 WHERE也可以用于DELETE 或者 UPDATE中。...**IS NOT NULL:** 当列的值不为 NULL, 运算符返回 true。 **:** 比较操作符(不同于 = 运算符),当比较的的两个值相等或者都为 NULL 时返回 true。...例如,’o{2}’ 不能匹配 “Bob” 中的 ‘o’,但是能匹配 “food” 中的两个 o。 {n,m} m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。
执行基本查询 要查看表中单个列的所有数据,请使用以下语法: SELECT column FROM table; 要查询同一个表中的多个列,请使用逗号分隔列名: SELECT column_1, column...LIKE 测试值是否与指定的字符串匹配 IS NULL 测试NULL值 IS NOT NULL 测试除以外的所有值 NULL 使用通配符 SQL允许使用通配符。...就其本身而言,上一节中描述的聚合函数仅返回单个值。但是,您可以通过包含GROUP BY子句来查看对列中每个匹配值执行的聚合函数的结果。...以下语法将计算column_2中匹配值的数量,并按升序或字母顺序对它们进行分组: SELECT COUNT(column_1), column_2 FROM table GROUP BY column_...INNER JOIN将返回两个表中具有匹配值的所有记录,但不会显示任何没有匹配值的记录。 通过使用外部 JOIN子句,可以从两个表中的一个表中返回所有记录,包括在另一个表中没有相应匹配的值。
哈希碰撞问题 如果出现两个或多个键值映射到同一个槽位上,也就是出现hash碰撞时,可以通过链表解决问题。...创建、查看、删除索引 索引操作: 创建索引 -- 使用UNIQUE关键字,创建唯一索引 -- 使用FULLTEXT关键字,创建全文索引 -- 不指定上述两者,创建常规索引 CREATE [UNIQUE...profile cpu for query query_id; - explain执行计划 explain执行计划: EXPLAIN或者DESC命令获取MySQL如何执行SELECT语句的信息,包括在...⚪Key_len:表示索引中使用的字节数,该值为索引字段最大可能长度,并非实际使用长度,在不损失精确性的前提下,长度越短越好。...索引设计原则 1.针对于数据量较大,且查询比较频繁的表建立索引。 2.针对于常作为查询条件(where)、排序(order by)、分组(group by)操作的字段建立索引。
如何查看员工表中的所有字段?...= 或者 )这些比较运算符作为过滤条件。 7. 如何查看月薪范围位于 8000 到 12000 之间的员工?...LIKE 支持两个通配符:% 匹配任意多个字符,_ 匹配单个字符。Oracle 区分大小写,MySQL 不区分大小写。 10. 有些员工有奖金(bonus),另一些没有。怎么查看哪些员工有奖金?...SQL 中有哪些连接查询? 答案: 连接(join)查询是基于两个表中的关联字段将数据行拼接到一起,可以同时返回两个表中的数据。...,如果在目标表中存在满足条件的记录,执行 UPDATE 操作更新目标表中对应的记录;如果不 存在匹配的记录,执行 INSERT 在目标表中插入一条新记录。
table1)返回所用行,即使右表(table2)中没有匹配,如果右表中没有匹配,则结果为null。...,即使左表中没有匹配的,如果左表中没匹配则返回null。...=、(不等于)、>、=; --->select * from table_name where name="smith" between..and..两者之间 in(set):判断值是否在某个确定的值的集合内...SQL查询 select语句: select from where order by 大小写不敏感 Oracle中的AS可以省略 别名(表&字段都可以有) 操作符 比较操作符:=、(或者!...%占位符 为空 不为null like:查询某个字段包含“字符”关键字的数据 select * form student where name like "%查询的关键字符%" 在数据库中查询以字符“我
第一个查询是全表扫描,第二个是索引扫描: 区别在于type:all是全表扫描 index 通过索引扫描 或者在查询中输入需要查看执行计划的语句,点击执行,然后点击解释。...eq_ref:最多只会有一条匹配结果,一般是通过主键或者唯一键索引来访问;在连接中,MYSQL在查询时,从前面的表中,对每一个记录的联合都从表中读取一个记录,它在查询使用了索引为主键或惟一键的全部时使用...unique_subquery:子查询中的返回结果字段组合是主键或者唯一约束 index_merge:查询中同时使用两个(或更多)索引,然后对索引结果进行merge 之后再读取表数据; index_subquery...列数据是从仅仅使用了索引中的信息而没有读取实际的行动的表返回的,这发生在对表的全部的请求列都是同一个索引的部分的时候。...Using index for group-by:数据访问和Using index 一样,所需数据只需要读取索引即可,而当Query 中使用了GROUP BY 或者DISTINCT 子句的时候,如果分组字段也在索引中
领取专属 10元无门槛券
手把手带您无忧上云