[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。
任何一個分組后都會有一個小組,最后都需要向上級分組進行匯報統計,根據當前分組的字段
回溯統計會將分組統計的
單個字段的回溯和多字段回溯
分析第一層分組會有此回溯,第二次分組要看到第一次分組的組數,組數是多少,回溯就是多少,然后加上第一層回溯就行了

# 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 > 這邊可以用下面的幾個關鍵字()

#### 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)
- 異步確保型
- 最大努力通知型
- 總結