[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/
- SQL
- 名词
- mysql
- 初识mysql
- 备份和恢复
- 存储引擎
- 数据表损坏和修复
- mysql工具
- 数据库操作
- 增
- 删
- 改
- 查
- 数据类型
- 整数类型
- 小数类型
- 日期时间类型
- 字符和文本型
- enum类型
- set类型
- 时间类型
- null与not null和null与空值''的区别
- 数据表操作
- 创建
- 索引
- 约束
- 表选项列表
- 表的其他语句
- 视图
- sql增删改查
- sql增
- sql删
- sql改
- sql查
- sql语句练习
- 连接查询和更新
- 常用sql语句集锦
- 函数
- 字符函数
- 数值运算符
- 比较运算符与函数
- 日期时间函数
- 信息函数
- 聚合函数
- 加密函数
- null函数
- 用户权限管理
- 用户管理
- 权限管理
- pdo
- 与pdo相关的几个类
- 连接数据库
- 使用
- pdo的错误处理
- pdo结果集对象
- pdo结果集对象常用方法
- pdo预处理
- 常用属性
- mysql编程
- 事务
- 语句块
- mysql中的变量
- 存储函数
- 存储过程
- 触发器
- mysql优化
- 存储引擎
- 字段类型
- 三范式和逆范式
- 索引
- 查询缓存
- limit分页优化
- 分区
- 介绍
- 分区算法
- list分区
- range范围
- Hash哈希
- key键值
- 分区管理
- 特别注意
- 分表
- 数据碎片与维护
- innodb表压缩
- 慢查询
- explain执行计划
- count和max,groupby优化
- 子查询优化
- mysql锁机制
- 介绍
- 演示
- 总结
- 乐观锁和悲观锁
- 扛得住的mysql
- 实例和故事
- 系统参数优化
- mysql体系结构
- mysql基准测试
- 索引
- mysql的复制
- win配置MySQL主从
- mysql5.7新特性
- 常见问题
- general log
- 忘记密码
- uodo log与redo log
- 事务隔离级别
- mysql8密码登录
- explain
- 高效的Tree表
- on delete cascade 总结
- mongod
- 简介
- 集合文档操作语句
- 增删改查
- 索引
- 数据导入和导出
- 主从复制
- php7操作mongod
- 权限管理
- redis
- redis简介
- 3.2版本配置文件
- 3.0版本配置文件
- 2.8版本配置文件
- 配置文件总结
- 外网连接
- 持久化
- RDB备份方式保存数据
- AOF备份方式保存数据
- 总结
- win安装redis和sentinel部署
- 事务
- Sentinel模式配置
- 分布式锁
- 管道
- php中redis代码
- 发布订阅
- slowlog
- Redis4.0
- scan和keys
- elasticsearch
- 配置说明
- 启动
- kibana
- kibana下载
- kibana配置文件
- kibana常用功能
- 常用术语
- Beats
- Beats简介
- Filebeat
- Packetbeat
- Logstash
- 配置
- elasticsearch架构
- es1.7
- head和bigdesk插件
- 插件大全
- 倒排索引
- 单模式下API增删改查
- mget获取多个文档
- 批量操作bulk
- 版本控制
- Mapping映射
- 基本查询
- Filter过滤
- 组合查询
- es配置文件
- es集群优化和管理
- logstash
- kibana
- es5.2
- 安装
- 冲突处理
- 数据备份
- 缺陷不足
- 集群管理api
- 分布式事务
- CAP理论
- BASE模型
- 两阶段提交(2PC)
- TCC (Try-Confirm-Cancle)
- 异步确保型
- 最大努力通知型
- 总结