等值与非等值连接查询
WHERE 子句指定连接条件
use pangu
select distinct orders.p_id, p_name
from orders, products
where orders.p_id = products.p_id
FROM 子句中用 JOIN 连接符指定连接条件
use pangu
select distinct orders.order_id, p_name
from orders join products on orders.p_id = products.p_id
非等值连接查询
> >= < <= != BETWEEN…AND等
自连接查询
select a.emp_id, a.e_name, b.emp_id, b.e_name, a.hire_date
from employee a join employee b /* 用 a 和 b 指定了表的两个别名 */
on a.emp_id!=b.emp_id and a.hire_date = b.hire_date
where a.e_name < b.e_name
order by a.hire_date
外部连接查询
在内部连接中 参与连接的表的地位是平等的 与内部连接相对的方式称为外部连接 Outer Join 在外部连接中 参与连接的表有主从之分 以主表的每行数据去匹配从表的数据列 符合连接条件的数据将直接返回到结果集中 对那些不符合连接条件的列 将被填上 NULL 值后再返回到结果集中
以主表所在的方向区分外部连接 主表在左边 则称为左外部连接 主表在右边 则称为右外部连接
use pangu
select a.order_id, b.f_name,c.p_name
from orders a left join firms b on a.firm_id = b.firm_id
right join products c on c.p_id = a.p_id
order by a.o_date
运行结果如下
order_id f_name p_name
-------- -------------------------------------------------- --------------------
NULL NULL 管理经验
NULL NULL 财务报告
00010109 010101 路由器
00021011 神通 网卡
嵌套查询
1、用谓词 EXISTS 连接子查询
例 查询单笔订货量超过 7000 单位的产品名称
use pangu
select p_name
from products
where exists /* 测试订货表中是否存在有单笔订货量超过 7000 单位的产品 */
(select p_id
from orders
where p_id = products.p_id and o_quantity > 7000)
order by p_id
---------看不懂!
2、用 HAVING 子句连接子查询
例 查询平均工资低于公司平均工资的部门编号 名称及其平均工资
use pangu
select department.dept_id, d_name, avg(e_wage) as avg_wage
from department, employee
where department.dept_id = employee.dept_id
group by department.dept_id, d_name
having avg(e_wage) <
(select avg(e_wage)
from employee)
order by avg_wage
合并查询
合并查询就是使用 UNION 操作符将来自不同查询的数据组合起来 形成一个具有综合信息的查询结果 UNION 操作会自动将重复的数据行剔除 必须注意的是 参加合并查询的各子查询的使用的表结构应该相同 即各子查询中的数据数目和对应的数据类型都必须相同
例 查询各部门的负责人的编号 姓名
use pangu
select emp_id as 编号, e_name as 名称
from employee
where job_level = '2'
union
select chief_id, d_name
from department
order by 1 /* 按第一列排序 */