💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
[TOC] # having和where区别 **where语句字段,必须是”数据表中存在的”字段** **having:语句字段,必须是查询结果集中存在的字段或者要么用聚合函数** 1:having子句同where子句一样,进行条件判断 2:where是针对磁盘进行判断,进入到内存之后,会进行分组操作,分组的结果就需要having进行处理哟 3:having能做where能做的几乎所有的事情,但是where却不能做having能做的很多事情 4:,having能够使用字段别名:where不能,where是从磁盘中取出数据,而名字只可能是字段,别名是字段进行到内存后才会产生 select \[all | distinct\] 字段或表达式列表 \[from子局\] \[where 子局\] \[group by子句\] \[having 子句\] \[order by子句\] \[limit 子句\]; select可以单独用不跟from,如果想跟from可以from一个dual(伪表) all和distinct用于设定select出来的数据,是否消除’重复行’,可以不写,那就是默认all,如果是distinct表示会消除 结果集中可以使用字段别名,但是where条件中要用表的名字 查询时间戳用select unix\_timestamp(); # find_in_set基本语法 FIND_IN_SET(str,strlist) str 要查询的字符串,strlist 字段名 参数以”,”分隔 如 (1,2,6,8) 如果str不在strlist 或strlist 为空字符串,则返回值为 0 。如任意一个参数为NULL,则返回值为 NULL。这个函数在第一个参数包含一个逗号(‘,’)时将无法正常运行。 +----+---------+-----------+-------------+ | id | user_id | follow_id | follow_time | +----+---------+-----------+-------------+ | 13 | 15 | 16,15 | 1478096138 | | 14 | 15 | 17 | 1478177725 | | 15 | 15 | 19 | 1478181035 | +----+---------+-----------+-------------+ 比如这张表,SELECT * from test where FIND_IN_SET('5',follow_id);这样是查不到的,返回值为null,因为follow_id中没有”5”这个值,它不同于 like 模糊查询,它是以“,”来分隔值 Find_IN_SET 是精确匹配,字段值以英文”,”分 # where子句: where中的字段要来自表不能用之前取的别名 算术运算符: +, -, \*, /, % 比较运算符: >, >=, <, <=, =(等于), <>(不等于), !=(不等于) =即代表赋值也代表比较运算 \[not\] between and 介于两者之间或不介于2者之间 is null 为空 is not null 不为空 逻辑运算符: and, or, not # is运算符: xx is null:判断某个字段是”null”值就是没有值 xx is not null: 判断某个字段不是”null”值 xx is true:判断某个字段为真 xx is false:判断某个字段为假 0, 0.0, ‘’, null # between运算符: 判断某个值是否在给定值的范围内---适用于数字类型 xx between 值1 and 值2 # in运算符: 给定确定数据的范围判断,后面罗列的字段用()包括 语法:xx in (值1,值2,值3,….) 表示字段在所列出中的一个就满足条件 # like运算符 对字符串进行模糊查找 语法:xx like ‘要查找的内容’; %代表任何个数的任何字符 \_:它代表一个任何字符 要找%或\_,转义就行了\\%和\\\_ # group by子句 分组 形式:group by 字段1 \[desc | asc\], 字段2 \[desc | asc\] 每一组的数量信息,就是用count(\*)获得,count(字段名)不计空值,count(\*)计算空值 最大值:max(字段名) 最小值:min(字段名) 平均值:avg(字段名) 总和值:sum(字段名) 对取出来的四舍五入,小数点取2位 Round(xx,2) **group\_concat(字段名):可以显示一个分组的普通字段的所有值** group by后面跟主键id,select可以是任何字段 group by后面是普通字段,select跟group by中的字段或者聚合函数 但是也可以用any_value和group_concat包住 或者set sql_model=''; 分组排序 Mysql中,分组默认有排序的功能:按照分组字段进行排序,默认是升序 基本语法:group by 字段 [asc|desc],字段 [asc|desc] **回溯统计with rollup** 当分组进行多分组之后,往上统计的过程中,需要进行层层上报,将这种层层上报统计的过程称之为回溯统计:每一次分组向上统计的过程都会产生一次新的统计数据,而且当前数据对应的分组字段为NULL。 任何一个分组后都会有一个小组,最后都需要向上级分组进行汇报统计,根据当前分组的字段 回溯统计会将分组统计的 单个字段的回溯和多字段回溯 分析第一层分组会有此回溯,第二次分组要看到第一次分组的组数,组数是多少,回溯就是多少,然后加上第一层回溯就行了 ![](https://box.kancloud.cn/78a5456c08022519f04d43383e9b45d2_1928x642.jpg) # order by子句 order by字段1 \[asc | desc\], 字段2 \[asc | desc\],………. desc倒序 asc 顺序(排序默认小到大) limit子句 limit offset,pagesize offset为偏移量,如果为0可以省略. pagesize每页显示的行数 **分页公式:pagesize:每页显示条数,page:当前页. limit(page-1)\*pagesize,pagesize** # 连接的分类 **交叉连接** :cross join **自然连接** :natural join会自动的去找两张表中的相同字段,然后利用相同字段去进行连接,并且相同字段只会显示一个.如果两张表有多个同名字段,只有当多个同名字段值全部相等,才会显示这条记录 **自然左连接** : natural left join以左表为主,然后利用相同字段去连接,自然右类似 **内连接:** inner join 形式:select \* from 表1 \[inner\] join 表2 on 连接条件 没有连接条件其实就是交叉连接 一般都写连接条件:例:select \* from product inner join product\_type on product .protype\_id=product\_type.protype\_id; **左(外)连接** left (outer) join 形式:表1(左表) left \[outer\] join 表2(右表) on 连接条件 其实就是将两个表的内连接的结果再加上左边表的不符合内连接所设定条件的那些数据结果,右边没有对应位置填null,不加on条件不行 **右外连接** right(outer) join **全(外)连接** full(outer) join mysql不支持全连接语法 using(字段名) 在左连接,右连接和内连接时可以不使用on,直接使用using(),指定一个同名字段去自动连接,指定的同名字段只显示一次 #### 子查询 id最好取出来到内存库 子查询是很慢的 形式:select 字段或表达式或子查询\[as 别名\] from 表名或链接结果或子查询 where 字段或表达式或子查询的条件判断 分为: **表子查询:** 一个子查询返回的结果理论上是多行多列的时候.此时可当做一个表来使用,通常放在from后面 **行子查询:** 一个子查询返回的结果理论上是”一行多列”的时候,此时可以当做一个行来使用,通常放在”行比较语法中” 行比较语法类似:where row(字段1,字段2)=(select 行子查询) **列子查询:** 一个子查询语句返回的结果理论上是多行一列的时候.此时可以当多个值来使用,类似(5,17,18,2,6) **标量子查询:** 一个子查询返回的结果,理论上是”一行一列”的时候.此时可以当做一个单个值来使用,即单个数据值 any 满足任意一个值就true all(some) 满足所有才true 例:查询所有非最高价商品 (只会小于上述所有价格中的某一个) select \* from product where price < any (select price from product); 查询所有最高价商品(大于等于”所有价格”) select \* from product where price >= all(select price from product); 子查询有多个值想要判断 例如: where xx > 这边可以用下面的几个关键字() ![](https://box.kancloud.cn/fca27c171cba94913ff2c0a3fc87f06d_2642x648.jpg) #### exists查询 形式:where exists(子查询) 如果子查询有数据,则exists的结果是true,否则是false select \* from product where exists (select \* from product\_type where protype\_name like ‘%电%’ and protype\_id = product.protype\_id) #### 联合查询union 语法形式:select 语句1 union \[all | distinct\] select 语句2; 此联合查询默认会”自动消除重复行”,即默认distinct,如果想都显示,就用all,而且默认使用第一个select的字段名,相同的数据只显示一个 order by子句和limit子句只能对整个联合之后的结果进行排序,如果第一个select子句用别名,order by必须用别名,如果2个子都想使用order by,在order by后面要跟limit **连接查询横向,联合查询纵向** #### 自身连接 ### 自身连接自身,想象有一张和自己一样的表在旁边和他连接 自身连接:同一个数据表对其自身机型连接。 例子 查找所有分类及其父类 ` SELECT s.type_id,s.type_name,p.type_name FROM tdb_goods_types AS s LEFT JOIN tdb_goods_types AS p ON s.parent_id = p.type_id;` # with tmp as http://blog.163.com/weidaolan666@126/blog/static/49479943201171710305298/