# SQL
## 基本增刪改查
> insert delete update select
>
> from XXX
>
> where XXX
## 排序查詢
> ```
> order by
> ```
>
> 排序查詢語句應在分組查詢之后,limit語句之前
### 分組查詢
> ```
> group by
> ```
>
> 和分組函數一同查詢的字段必須是group by后出現的字段
>
> 篩選分為兩類:分組前篩選和分組后篩選
>
> 分組可以按單個字段也可以按多個字段
>
> 可以搭配著排序使用
>
> 對分組之后的字段、函數進行條件判斷,使用having,并在group by之后
>
> 分組查詢語句應在where語句之后,排序查詢語句之前
## 常見函數
> 單行函數
>
> 分組函數:做統計使用,又稱為統計函數、聚合函數、組函數
> 常見:
>
> 一、單行函數
>
> ? 字符函數:
>
> > length:獲取字節個數(utf-8一個漢字代表3個字節,gbk為2個字節)
> >
> > concat
> > substr
> > instr
> > trim :去除字符串中空格或指定字符
> > upper:大寫
> >
> > lower:小寫
> >
> > lpad:左填充
> >
> > rpad:右填充
> >
> > replace :替換
>
> ? 數學函數:
>
> > round
> >
> > ceil:取整
> >
> > floor
> >
> > truncate
> >
> > mod:取余
>
> 日期函數:
>
> > now
> >
> > curdate
> > curtime
> > year
> > month
> > monthname
> > day
> > hour
> > minute
> > second
> > str_to_date
> >
> > date_format
>
> 其他函數:
>
> > version
> > database
> > user
>
> 控制函數:
>
> > if
> >
> > case
## 連接查詢
即多表聯查
笛卡爾乘積現象:表1 有m行,表2有n行,結果=m*n行
> 發生原因:沒有有效的連接條件
> 如何避免:添加有效的連接條件
>
> 分類:
>
> 按年代分類:
> sql92標準:僅僅支持內連接
> sql99標準【推薦】:支持內連接+外連接(左外和右外)+交叉連接
>
> 按功能分類:
> 內連接:
> 等值連接 A-B a.id = b.a_id
> 非等值連接 一般對區間的判斷
> 自連接 A-A
> 外連接:
> 左外連接
> 右外連接
> 全外連接
>
> 交叉連接
### 等值連接
> ① 多表等值連接的結果為多表的交集部分
> ②n表連接,至少需要n-1個連接條件
> ③ 多表的順序沒有要求
> ④一般需要為表起別名
> ⑤可以搭配前面介紹的所有子句使用,比如排序、分組、篩選
### 非等值連接
> ```
> SELECT
> salary,grade_level
> FROM employees e,job_grades g
> WHERE salary BETWEEN g.`lowest_sal` AND g.`highest_sal` AND……
> ```
### 自連接
> ```
>
> SELECT
> e.employee_id,e.last_name,m.employee_id,m.last_name
> FROM employees e,employees m
> WHERE e.`manager_id`=m.`employee_id`;
> ```
### 外連接
> 左外連接還返回左表中不符合連接條件單符合查詢條件的數據行。
> 右外連接還返回右表中不符合連接條件單符合查詢條件的數據行。
> 全外連接還返回左表中不符合連接條件單符合查詢條件的數據行,并且還返回右表中不符合連接條件單符合查詢條件的數據行。全外連接實際是上左外連接和右外連接的數學合集(去掉重復),即“全外=左外 UNION 右外”。
> 說明:左表就是在“(LEFT OUTER JOIN)”關鍵字左邊的表。右表當然就是右邊的了。在三種類型的外連接中,OUTER 關鍵字是可省略的。
>
> > 左外連接
> >
> > ```
> > SELECT O.ID,O.ORDER_NUMBER,O.CUSTOMER_ID,C.ID,C.NAME
> > FROM ORDERS O LEFT OUTER JOIN CUSTOMERS C ON C.ID=O.CUSTOMER_ID;
> > ```
>
> > 右外連接
> >
> > ```
> > SELECT O.ID,O.ORDER_NUMBER,O.CUSTOMER_ID,C.ID,C.NAME
> > FROM ORDERS O RIGHT OUTER JOIN CUSTOMERS C ON C.ID=O.CUSTOMER_ID;
> > ```
>
> > 全外連接
> >
> > ```
> > SELECT O.ID,O.ORDER_NUMBER,O.CUSTOMER_ID,C.ID,C.NAME
> > FROM ORDERS O FULL OUTER JOIN CUSTOMERS C ON C.ID=O.CUSTOMER_ID;
> > ```
>
> 注意:WHERE條件放在ON后面查詢的結果是不一樣的。因此, 在寫連接查詢的時候,ON后面只跟連接條件,而對中間表限制的條件都寫到WHERE子句中。