# 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子句中。