✅作者简介:C/C++领域新星创作者,为C++和java奋斗中
✨个人社区:微凉秋意社区
系列专栏:MySql一点通
推荐一款模拟面试、刷题神器注册免费刷题
前言
书接上文,今天学习查询的进阶操作,包括函数、分组、分页、子查询和表连接。内容比较实用,建议收藏或者订阅专栏方便学习和复习。
select
之后,from
之前 或作为筛选条件concat(…,列名,…,列名)
用来拼接多列的值
select concat(first_name,last_name) as 全名 from employees
mod(值1,值2)
求值1和值2的取余结果 ,相当于数学运算中的 %(值1%值2)
select mod(10,3) from dual
dual
为虚拟表,作用为使当前SQL符合语法规范,不写时会做自动填充length(列名|数据)
获取长度
select * from employees where length(first_name)>6
now() | sysdate()
获取系统当前时间
示例:
-- 组函数操作salary
select
SUM(salary) 总和,AVG(salary) 平均值,MAX(salary) 最大值,min(salary) 最小值,COUNT(salary) 非空值的数量
from employees
-- 计算表中绩效列不为空的员工数量
select COUNT(commission_pct) from employees
-- 求表中的行数
select COUNT(*) from employees
select COUNT(employee_id) from employees
select 列名 from 表名 group by 列名
select department_id,AVG(salary) 平均薪资 from employees group by department_id
-- 查询部门id为10、20、30的部门的平均薪资、
select department_id,AVG(salary) 平均薪资
from employees
where department_id in(10,20,30) -- 先筛选
GROUP BY department_id -- 后分组查询
select department_id,AVG(salary) 平均薪资
from employees
group by department_id -- 先分组
having department_id in(10,20,30) -- 后筛选
where
,效率更高limit:用来限制显示的查询结果条数,通常用于分页查询
select 列名 from 表名 limit 显示的起始下标,显示条数
select * from employees limit 0,10
select * from employees limit 10
下标为0时可以省略当limit和其他查询关键字联用时,limit一定最后执行
查询的执行顺序:
语法顺序 执行顺序
select 5
from 1
where 2
group by 3
having 4
order by 6
limit 7
-- 查询员工id为100的员工的部门id
select department_id from employees where employee_id=100
-- 子查询::查询员工id为100的员工所在的部门信息
select * from departments
where department_id=(select department_id from employees where employee_id=100)
--查询firstname中包含s的员工所在的部门信息
select * from departments
where department_id in(select department_id from employees where first_name like '%s%')
-- 获取薪资最高的前十个员工的平均薪资
-- 先获取薪资最高的前十名员工的薪资
select salary from employees ORDER BY salary desc LIMIT 10
-- 子查询:再根据子SQL的查询结果临时通过别名构建一张数据表进行查询
select avg(salary) from (select salary from employees ORDER BY salary desc LIMIT 10) as e
表连接的前提:
语法:
select 表1.列名,表2.列名,...
from 表1 inner join 表2
on 连接条件
inner
可省语法:
select 表1.列名,表2.列名,...
from 表1(左表) left outer join 表2(右表)
on 连接条件
outer
可省left
和right
的不同,位置不同,通常用左外连接-- 查询所有的员工信息及符合连接条件的部门信息
select e.*,d.*
from employees e LEFT JOIN departments d
ON e.department_id=d.department_id
全外连接:
union
查询语句2-- 内连接
select e.*,d.*
from employees e inner join departments d
on e.department_id=d.department_id
union -- 对内连接和左连接的查询结果进行合并
-- 左连接
select e.*,d.*
from employees e LEFT JOIN departments d
ON e.department_id=d.department_id
union
会对合并结果进行去重union all
不会对结果去重实际开发中,使用频率较高的是内连接和左外连接
具体使用:
-- 查询:员工id、员工姓名-firstname、直接领导的id、直接领导的姓名
select e1.employee_id 员工id,e1.first_name 员工姓名,e2.employee_id 领导id,e2.first_name 领导姓名
from employees e1 LEFT JOIN employees e2-- e1代表获取员工信息的表,e2代表获取领导信息的表
ON e1.manager_id=e2.employee_id -- 把两个有关联关系的字段作为连接条件
-- 查询工资相同的员工信息
select e1.employee_id 员工1的id,e1.salary 员工1的工资,e2.employee_id 员工2的id,e2.salary 员工2的工资
from employees e1 LEFT JOIN employees e2
on e1.salary=e2.salary -- 连接条件
where e1.employee_id<e2.employee_id -- 防止判断的双方是同一个人,并去重
写在最后
这篇博客算是MySQL里最重磅的内容了,希望大家可以妥善吸收并正确利用,一起加油!!!