sql基础
069 连接查询——笛卡尔乘积
笛卡尔乘积现象:表1有m行,表2有n行,合成表有(m*n)行
select * from beauty;
select * from boys;
select name, boyname from boy,beauty
where beauty.boyfriend_id=boy_id;
添加有效的连接条件
等值连接
select job_title,COUNT(*)
FROM employees e, jobs j
where e.job_id=j.job_id
group by job_title
order by count(*) Desc;
非等值连接
自连接
在同一张表中需要在前面加上别名来区分查询的东西
外连接
应用场景:查询一个表中有另一个表中没有的记录
sql99语法
同样连接
内连接包括:等值连接、非等值连接、自连接。
非等值连接例子
查询编号>3的女神的男朋友信息,如果有则列出详细,如果没有,则用null填充
select b.id,b.name,bo.*
from beauty b
left outer join boys bo
on b.boyfriend_id=bo.id
where b.id>3
子查询
where后面加相关子查询
查询最低工资大于50号部门最低工资的部门id和其最低工资
1.查询50号部门的最低工资(标量子查询)
select min(salary)
from employees
where department_id
2.查询每个部门的最低工资
select min(salary),department_id
from employees
group by department_id
3.合并
select min(salary),department_id
from employees
group by department_id
having min(salary)>(
select min(salary)
from employees
where department_id
);
列子查询(多行子查询)
有多行值的情况下
操作符 | 含义 |
---|---|
IN/NOT IN | 等于列表中的任意一个 |
ANY/SOME | 和子查询返回的某一个值比较 |
ALL | 和子查询返回的所有值比较 |
行子查询
两个条件相似
select 后面的子查询使用
from后面的子查询使用
案例:查询每个部门的平均工资的工资等级
select
from(
select avg(salary) ag,department_id
from employees
group by department_id
)ag_dep
inner join job_grades g
on ag_dep.ag between lowest_sal and highest_sal
取别名可以用于使用子表查询
exists 后面的子查询
语法:
exists(完整的查询语句)
结果:
1或0(有值和没值的差别)
案例
连接查询
exists查询
分页查询
案例1:查询前五条员工信息
select * from employees limit 0,5