高级查询,关联查询

高级查询

1.关联查询
作用:可以跨越多表查询

--查询出员工的名字和他所在部门的的名字
//错误
select first_name,name from s_emp,s_dept;
//错误的原因:
产生笛卡尔积(在查询两张表的时候,一张表中的数据与另一张表中的数据一一匹配),产生了冗余数据。

//古老的写法:
select first_name,name from s_emp,s_dept where s_emp.deop_id = s_dept.id;

//现在的写法:
select e.first_name,d.name from s_emp e
join s_dept d on e.dept_id = d.id;

语法:
select 列,列,列
from 表1 join 表2
on 表1外键=表2主键

案例:
-- 找出Sales 部门的所有员工
select * from s_emp e
 join s_dept d on e.dept_id=d.id
 where d.name = ‘Sales‘;

-- 找出在 Asia 地区工作的员工
select  * from s_emp e
join s_dept d on e.dept_id = d.id
join s_region r on d.region_id = r.id
where r.name  = ‘Asia‘;

--找出客户‘Hamada Sport‘ 的所有订单号、费用、下订日期
select o.id,o.total,o.date_ordered,c.name from s_ord o
join s_customer c on o.customer_id = c.id
where c.name =‘Hamada Sport‘;

--找出所有在‘Asia‘客户的信息
select * from s_region r
join s_customer c on c.region_id = r.id
where r.name  = ‘Asia‘;

练习:

--查询出客户名字叫unisports的订单信息
select o.* from s_ord o
join s_customer c on o.customer_id = c.id
where lower(c.name) =lower(‘unisports‘);
 
--查询出设在北美的的部门名称
select s.name from s_dept s
join s_region r on s.region_id = r.id
where r.name = ‘North America‘;

--查询出在北美工作的员工姓名、工资、入职日期和职位
select e.first_name, e.salary ,e.start_date,e.title from s_emp e
join s_dept d on e.dept_id = d.id
join s_region r on d.region_id  =r.id
where r.name = ‘North America‘;

--查询出所有客户名,及其订单号
select c.name,o.id from s_customer c
left join s_ord o on o.customer_id = c.id
order by c.name
;

2.外联接

左外联[left outer join]
    以关联的左边为准,即使右边没有与之匹配的记录,则左边的记录也要
    出现在结果集中,右边全部以NULL值显示。

右外联[right outer join]
    以关联的右边为准,即使左边没有与之匹配的记录,则右边的记录也要
    出现在结果集中,左边全部以NULL值显示。
    
补充:全外联,交叉外联
    
    
--查询出所有客户名,及其订单号
select c.name,o.id from s_customer c
left join s_ord o on o.customer_id = c.id
order by c.name
;

--查询所有订单号,订单费用以及订单所对应的客户名
select c.name,o.id,o.total from s_customer c
right join s_ord o on o.customer_id = c.id;

--找出Womansport所购买的订单信息(订单编号,费用,支付方式)
select o.id,o.total,o.payment_type from s_ord o
right join s_customer c on o.customer_id = c.id
where c.name = ‘Womansport‘;

--找出Operations部门工作的员工名,工资,并且按照工资降序排列
select e.first_name,e.salary from s_emp e
left join s_dept d on e.dept_id  =d.id
where d.name  = ‘Operations‘
order by e.salary desc;
注意:如何验证:
--第一步:select * from s_emp;select  * from s_dept;查看员工人数和部门个数,以及是否存在员工没有分配部门的 情况,和是否存在新部门没有员工的情况
--第二步:如果存在员工没有分配部门,那么以员工表为主表
--第三部:如果存在新部门没有员工的情况,以部门表为主表

自关联:
-- 查询出所有的员工名以及员工的上司名
select e.firstname,m.fitstname from s_emp e
left join s_emp m on e.manager_id = m.id;

----
注:关联的条件不一定总是做等值比较的。

时间: 2024-10-08 00:36:24

高级查询,关联查询的相关文章

sql:判断+sql+子查询+关联查询

孵化园页面: public class MeimsServiceImpl implements MeimsService { private ParkinfoDomain parkinfoDomain; /**   * 动态监测主控查询   *   * @param parkName   *            孵化园名称   * @param parkType   *            孵化园类型   * @return List<Parkinfo>   */ @Override pu

Mybatis关联查询(转载)

原文地址: http://www.cnblogs.com/xiaolang8762400/p/7399892.html mybatis 提供了高级的关联查询功能,可以很方便地将数据库获取的结果集映射到定义的Java Bean 中.下面通过一个实例,来展示一下Mybatis对于常见的一对多和多对一关系复杂映射是怎样处理的. 设计一个简单的博客系统,一个用户可以开多个博客,在博客中可以发表文章,允许发表评论,可以为文章加标签.博客系统主要有以下几张表构成: Author表:作者信息表,记录作者的信息

mybatis关联查询问题(一对多、多对一)

mybatis 提供了高级的关联查询功能,可以很方便地将数据库获取的结果集映射到定义的Java Bean 中.下面通过一个实例,来展示一下Mybatis对于常见的一对多和多对一关系复杂映射是怎样处理的. 设计一个简单的博客系统,一个用户可以开多个博客,在博客中可以发表文章,允许发表评论,可以为文章加标签.博客系统主要有以下几张表构成: Author表:作者信息表,记录作者的信息,用户名和密码,邮箱等. Blog表   :  博客表,一个作者可以开多个博客,即Author和Blog的关系是一对多.

MyBatis:学习笔记(3)——关联查询

MyBatis:学习笔记(3)--关联查询 关联查询 理解联结 SQL最强大的功能之一在于我们可以在数据查询的执行中可以使用联结,来将多个表中的数据作为整体进行筛选. 模拟一个简单的在线商品购物系统,如果我们将用户信息和订单信息都保存在user表中,这样就不存在联结关系,因为我们仅仅操作一张表就好. 但是这是非常不明智的选择,举例来说,一个用户可以拥有多个订单,如果保存在一个表中,势必会导致用户信息的多次出现,因为每个订单绑定的用户信息都是相同的. 所以我们尽量要将不同的信息存储与不同的表中,但

JAVA-Unit03: SQL(基础查询) 、 SQL(关联查询)

Unit03: SQL(基础查询) . SQL(关联查询) 列别名 当SELECT子句中查询的列是一个函数 或者表达式时,那么查询出来的结果集 中对应的该字段的名字就是这个函数或者 表达式的名字.为此可以为这一列添加 别名,这样结果集中该字段就使用别名 作为该列的名字. 若希望别名区分大小写或者含有空格,那么 该别名可以使用双引号括起来. SELECT ename,sal*12 "s al" FROM emp AND,OR AND优先级高于OR,可以通过括号 提高优先级. SELECT

MySQL多表关联查询与存储过程

1.多表关联查询 --  **************关联查询(多表查询)**************** -- 需求:查询员工及其所在部门(显示员工姓名,部门名称) -- 1.1 交叉连接查询(不推荐.产生笛卡尔乘积现象:4 * 4=16,有些是重复记录) SELECT empName,deptName FROM employee,dept; -- 需求:查询员工及其所在部门(显示员工姓名,部门名称) -- 多表查询规则:1)确定查询哪些表   2)确定查询哪些字段   3)表与表之间连接条件

mysql-(四)-关联查询

建立数据表 //部门表create table dept( id int primary key, deptName varchar(20) ) //员工表 create table employee( id int primary key, empName varchar(20), deptId int , --部门名称 CONSTRAINT employee_dept_fk FOREIGN KEY(deptId) references dept(id) 外键名称 外键 参考表(参考字段) )

Mybatis深入了解(六)----关联查询(高级映射)

一对一查询 resultType resultMap 一对多查询 resultType resultMap 多对多查询 一对一查询 resultType resultType:使用resultType实现非常简单,如果POJO中没有包括查询的列名,可以新建扩展类继承父类,并在子类中添加列名对应的属性,即可完成映射. package cn.itcast.ssm.po; /** * 订单的扩展类 * @author Administrator * */ //通过此类映射订单和用户查询的结果,让此类继

Oracle 高级查询1 关联查询 分组查询

高级查询 1.关联查询作用:可以跨越多表查询 --查询出员工的名字和他所在部门的的名字 语法:select 列,列,列 from 表1 join 表2on 表1外键=表2主键 2.外联接 左外联[left outer join] 以关联的左边为准,即使右边没有与之匹配的记录,则左边的记录也要 出现在结果集中,右边全部以NULL值显示. 右外联[right outer join] 以关联的右边为准,即使左边没有与之匹配的记录,则右边的记录也要 出现在结果集中,左边全部以NULL值显示. 3分组查询