单行函数
length():获取参数的字节值
concat():拼接字符串
upper():变大写
lower():变小写
substr():截取字符
instr():获取字符串第一次出现的索引
replace():替换
trim():去除前后空格或者指定字符
SELECT TRIM('+' FROM '++++李刚+++刘邦+++') AS out_put;
lpad():用指定的字符实现左填充指定长度
Rpad():右填充
SELECT LPAD('梅林',8,'+') AS out_put;
8是字符串总长度
流程控制
有两种情况
方式一:
case 后面加变量 匹配 then后面的东西
SELECT salary 原始工资,department_id,
CASE department_id
WHEN 30 THEN salary1.1
WHEN 40 THEN salary1.2
WHEN 50 THEN salary*1.3
ELSE salary
END AS 新工资
FROM employees;
方式二:
case后面无表达式,when后加表达式
SELECT salary,
CASE
WHEN salary>20000 THEN 'A'
WHEN salary>15000 THEN 'B'
WHEN salary>10000 THEN 'C'
ELSE 'D'
END AS 工资等级
FROM employees;
组函数
介绍:作统计使用,又称聚合函数/统计函数/组函数
分类:sum,avg,max,min,count
特点:
1、
Where后面不能加 组函数,Having 后面可
分组查询
结构
select 分组函数,分组后的字段
from 表
【where 筛选条件】
group by 分组的字段
【having 分组后的筛选】
【order by 排序列表】
注意!!
group by 后面的分组的字段 和 select 后面分组的字段要写成一样的。
分组的操作消耗的资源比较大,所以先过滤掉一些,再分组,这样的效率比较高。
*案例
#引入:查询每个部门的平均工资
SELECT AVG(salary) FROM employees;
#案例1:查询每个工种的最高工资
SELECT MAX(salary),job_id FROM employees
GROUP BY job_id;
#案例2:查询每个位置上的部门个数
SELECT COUNT(*),location_id
FROM departments
GROUP BY location_id;
#添加筛选条件
#案例1:查询邮箱中包含a字符的,每个部门的平均工资
SELECT AVG(salary),department_id FROM employees
WHERE email LIKE '%a%' GROUP BY department_id;
#案例2:查询有奖金的每个领导手下员工的最高工资
SELECT MAX(salary),manager_id FROM employees
WHERE commission_pct IS NOT NULL
GROUP BY manager_id;
#添加复杂的筛选条件
#案例1:查询哪个部门的员工个数>2
#1.查询每个部门的员工个数
SELECT COUNT(*),department_id FROM employees
GROUP BY department_id;
#2.根据1的结果进行筛选,查询哪个部门的员工个数大于2
SELECT COUNT(*),department_id FROM employees
GROUP BY department_id HAVING COUNT(*)>2;
#案例2:查询每个工种有奖金的员工的最高工资>12000的工种编号和最高工资
#1.查询每个工种有奖金的员工的最高工资
SELECT MAX(salary),job_id FROM employees
WHERE commission_pct IS NOT NULL GROUP BY job_id;
#2.根据结果继续筛选,最高工资>12000
SELECT MAX(salary), job_id FROM employees
WHERE commission_pct IS NOT NULL GROUP BY job_id
HAVING MAX(salary)>12000;
#按表达式或函数分组
#案例:按员工姓名的长度分组,查询每一组的员工个数,筛选员工个数>5
#1.查询每个长度的员工个数
SELECT COUNT(*),LENGTH(last_name) len_name
FROM employees GROUP BY LENGTH(last_name);
#2.添加筛选条件
SELECT COUNT(*) c,LENGTH(last_name) len_name
FROM employees GROUP BY len_name HAVING c>5;
#按多个字段查询
#案例:查询每个部门每个工种的员工的平均工资
SELECT AVG(salary),department_id,job_id
FROM employees GROUP BY department_id,job_id;
#添加排序
#案例:查询每个部门每个工种的员工的平均工资,按平均工资的高低查询
SELECT AVG(salary),department_id,job_id
FROM employees GROUP BY department_id,job_id
ORDER BY AVG(salary) DESC;
连接查询
使用范围:数据来源于多个表
按功能分类:
-等值连接
-非等值连接
-自连接
-内连接
-外连接
左外连接
右外连接
全外连接
-交叉连接
内连接:就是普通的连接
外连接:分左外连接,和右外连接
左外连接:搜索的结果左边,包含一些没有匹配的信息(如空值等)
右连接同理。
%代表任意个,一个零个或多个;
等值连接:
sql92,sql99连接的有区别,
但是只记住sql99标准就好了。
SQL99的语法
select 查询列表
from 表1 别名 【连接类型】
join 表2 别名
on 连接条件
【where 筛选条件】
【group by 分组】
【having 筛选条件】
【order by 排序列表】
内连接(★):inner
外连接
左外(★):left 【outer】
右外(★):right 【outer】
全外:full【outer】
交叉连接:cross
Inner 可以省略
Outer可以省略
子查询
多表连接
笛卡尔积的错误
自连接
非自连接
非等值连接
三张表连接
[图片上传失败...(image-ab5f74-1600854090108)]
笛卡机的错误
自连接
自己连接自己
基表,辅表
非等值连接
使用`` ,代表里面的内容是字段名,而非关键字。
外连接。
左半连接
内连接:就是普通的连接
外连接:分左外连接,和右外连接。
左外连接:搜索的结果左边,包含一些没有匹配的信息(如空值等)
%代表任意个,一个零个或多个;
Inner 可以省略
Outer可以省略
函数(方法)
字符函数
Lower,upper
SQL
初始下标为1,不是0
后面位置为5,
(index,length)
LPAD 左边填充,右对齐
RPAD 右边填充,左对齐
TRIM 去除两端的东西
[图片上传失败...(image-b0e7a7-1600854090108)]
Ifnull
Case 表达式
Case 1
When 2 then3
When 3 then 4
Else
other
End
Case
When 表达式1 then 2
When 表达式3 then4
别名加在end后面
值 case后面 加
表达式 case后面 不加东西
组函数
Avg 求平均值 没把 null 算在里面
Sum
Max
对任何类型的数值做运算
Min
Count
统计不为null 的数据
Count(*), 统计表中有多少条数据。
Count(1) 和Count(2)
Count (数值)比count(*)效率高
Select 后面出现组函数,
后面不能加字段,
若加 ,必须出现在group by后面
Group by
Where 约束
Having 用来过滤
Having和where
用having就一定要和group by连用,
用group by不一有having (它只是一个筛选条件用的)
[图片上传失败...(image-16f96b-1600854090108)]
Max是组函数的一种,
Where 不能和组函数和一起用,
Having 可以和组函数一起用。
Where一般放 group by前面
Having 放group 后面
分组的操作消耗的资源比较大,所以先过滤掉一些,再分组,这样的效率比较高。
[图片上传失败...(image-1f8e76-1600854090108)]
组函数
Where 和having
位置上:
Where在group by 前面
Having 在group by 后面
Where后面不能出现组函数
Having 能
过滤时间
Where 先过滤再分组
Having 先分组再过滤 ?
先过滤再分组
[图片上传失败...(image-ef3f23-1600854090107)]
子查询
在查询语句中再嵌套其他查询语句。
单行子查询:结果只有一条
多行子查询:结果有多条
单行子查询: > > =
多行子查询: