(十)mysql语法-连接查询
#非等值连接查询
#案例1:查询员工的工资和工资级别
select a.salary,b.grade_level from employees a,job_grades b
where a.salary BETWEEN b.lowest_sal and b.highest_sal;
#自连接;简单的理解就是自己连接自己进行查询
#查询员工名和上级的名称 这种情况说明是这张表中有一些比较特殊的字段,一共查询了这张表两遍 一张表当做两张表来使用,有些情况下,甚至当作更多张表来使用,分别当作了员工表和领导表
SELECT a.employee_id,a.last_name,b.manager_id,b.last_name FROM employees a,employees b where a.employee_id=b.manager_id;
SELECT a.employee_id,a.last_name,b.employee_id,b.last_name FROM employees a,employees b where a.employee_id=b.manager_id;--这两种写法,查询出来的效果是一样的
#获取随机数
select RAND();--返回0-1之间的随机数
#password函数 将给定的字符进行加密
select PASSWORD('赵永强');--结果:*7B24462CC76FA0D6E59A26F942D0C8B46F31F533
#MD5函数,将给定的字符进行MD5加密
select MD5('赵永强');--结果:8983fb3e10bd6c6817f6e7d128c67276
#sql99语法标准
语法: select 查询列表
from 表1 别名 【连接类型】
join 表2 别名
on 连接条件
where 筛选条件
分类:
内连接:inner
外连接:
左外连接 left [OUTER]
右外连接 right [OUTER]
全外连接 full [OUTER]
交叉连接:cross
#等值连接
@案例一:查询员工名、部门名
select a.last_name,b.department_name
from employees a
INNER JOIN departments b
on a.department_id=b.department_id
SELECT a.last_name,b.department_name from employees a , departments b where a.department_id=b.department_id;--这两种写法的查询出来的效果是一样的
@案例二:查询名字中包含e的员工名和工种名
select a.last_name,b.job_title
from employees a
INNER JOIN jobs b
on a.job_id=b.job_id
where a.last_name like '%e%';
select a.last_name,b.job_title from employees a,jobs b where a.job_id=b.job_id AND a.last_name like '%e%';--这两种写法的查询出来的效果是一样的
#查询部门个数>3的城市名和部门个数(添加分组和筛选)
select b.city,count(*)
from departments a
INNER JOIN locations b
ON a.location_id=b.location_id
GROUP BY b.city
HAVING count(*)>3;
#案例4:查询哪个部门的盐工个数大于3的部门名和员工个数,并按照个数降序排列
select count(*) 个数,department_name
from employees a
JOIN departments b
on a.department_id=b.department_id
GROUP BY department_name
HAVING count(*)>3
ORDER BY count(*) desc;
#5.查询员工名,部门名、工种名,并按照部门名进行降序排列(添加三表连接)
select last_name,department_name,job_title
from employees a
INNER JOIN departments b on a.department_id=b.department_id
INNER JOIN jobs c on a.job_id=c.job_id
ORDER BY department_name desc;
------其实上面所有的inner都是可以省略的,筛选条件放在where 后面,连接条件放在on后面 ,便于阅读
#非等值连接
#查询员工的工资级别
select a.salary,b.grade_level from employees a INNER JOIN job_grades b on a.salary BETWEEN b.lowest_sal and b.highest_sal
#查询工资级别的个数》20的个数,并按照工资级别进行降序排列
select count(*),b.grade_level from employees a INNER JOIN job_grades b on a.salary BETWEEN b.lowest_sal and b.highest_sal
GROUP BY b.grade_level desc
HAVING count(*)>20
#自连接
#查询名字中包含字符k的员工姓名、上级的名字
select a.last_name,b.last_name from employees a INNER JOIN employees b on a.employee_id = b.manager_id
WHERE a.last_name like '%k%'
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY