码迷,mamicode.com
首页 > 其他好文 > 详细

11-10

时间:2017-11-10 18:30:27      阅读:141      评论:0      收藏:0      [点我收藏+]

标签:desc   tin   hama   lower   它的   没有   nis   集中   情况   

高级查询

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;


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

 

 

 

==========================
3分组查询
定义:利用内置的分组函数来查询

所谓分组,就是看待数据的“角度”不同。
也就是把某类值相同的看做一组。

语法:
select 列名,组函数(列名)...from 表名
where 条件
group by 列
having 字句
order by 列

分组函数:
SUM([distinct] 列|表达式|值) 求和
AVG([distinct] 列|表达式|值) 求平均值
MAX(列|表达式|值) 求最大值
MIN(列|表达式|值) 求最小值
COUNT([distinct] 列|*) 求个数(包含null)

如:

-- 找出员工的最高、最低、平均、以及工资总和
select max(salary),min(salary),avg(salary),sum(salary) from s_emp;

-- 找出各部门员工的最高、最低、平均、以及工资总和
select dept_id, max(salary),min(salary),avg(salary),sum(salary) from s_emp
group by dept_id
order by dept_id
;

-- 找出41,42,50部门员工的最高、最低、平均、以及工资总

select dept_id, max(salary),min(salary),avg(salary),sum(salary) from s_emp
group by dept_id
having dept_id in(41,42,50)
order by dept_id
;

select dept_id, max(salary),min(salary),avg(salary),sum(salary) from s_emp
where dept_id in(41,42,50)
group by dept_id
order by dept_id
;

 


注意1:只有出现在group by 后面的列[用来做为分组条件的列],才有资格
写在SELECT的后面,除非使用组函数进行修饰。

注意2:having 和where 都是条件
区别:
WHERE 子句中是不能使用 组函数的,因为它在GROUP BY 之前。
但是,HAVING 子句中可以使用组函数,因为它在GROUP BY 之后。


-- 统计各个职称中工资高于1100的各有多少人。
select count(*),title
from s_emp
where salary >1100
group by title;
-- 找出订单数量超过>=2个的客户
select c.name
from s_customer c join s_ord o on o.customer_id = c.id
group by c.id,c.name
having count(o.id)>=2;

-- 统计共计多少个员工
select count(e.id) from s_emp e;


-- 统计共计多少个职称[不能重复]
select count(distinct title) from s_emp;

练习:
--1.找出超过(含)4个员工的部门id及部门名称
select d.id,d.name,count(*) from s_emp e
left join s_dept d on e.dept_id = d.id
group by d.id,d.name
having count(*)>=4;

--2.找出订单总费用超过10000元的客户
select c.name,c.id from s_customer c
left join s_ord o on c.id = o.customer_id
where o.total>=10000
group by c.name,c.id;

--3.统计各区域的客户数量,按它的降序排序
select r.id,r.name,count(*) from s_region r
join s_customer c on c.region_id = r.id
group by r.id ,r.name
order by count(*)desc;

--4.统计各经理的所管理的员工数
select e.manager_id ,count(e.id) from s_emp e
left join s_emp m on e.manager_id = m.id
group by e.manager_id;
--5.统计订单中各种支付的费用
select sum(o.total) 费用,o.payment_type 支付方式 from s_ord o group by o.payment_type;

11-10

标签:desc   tin   hama   lower   它的   没有   nis   集中   情况   

原文地址:http://www.cnblogs.com/Heng23/p/7815576.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!