sql学习6

1.连接方式:左连接,右连接,内连接,笛卡尔积,其中笛卡尔积与内连接类似

2.子查询:一个select语句中包含另一个成多个完整的select语句
子查询出现的位置
出现在where子句中: 将子查询返回的结果作为主查询的条件

出现在from子句中:将子查询返回的结果作为主查询的一个表
子查询分类
标量子查询: 返回的结果是一个数据 (单行单列)
行子查询:返回的结果是一行(单行多列)
 列子查询: 返回的结果是一列(多行单列)
 表子查询:返回的结是一张临时表(多行多列) 单表多表实现不了的可以考虑子查询

2.练习出现的问题

解决办法:先计算平均工资,再大于平均工资即可,后面可以考虑合并

本节概念较少,代码的逻辑要弄清楚,有难度,要多练

-- union all不去重
select * from emp;
select * from dept;
select * from salgrade;



-- 多表查询练习
select * from emp;
select * from dept;
select * from salgrade;

-- 查询每位员工的ename,dname,sal



-- 查询各地区的员工数



-- 查询manager的姓名、所属部门名称和入职日期:ename,dname,job,hiredate(内连接/笛卡尔积连接)
select ename,dname,job,hiredate from emp,dept
where emp.deptno=deptno=dept.deptno and job='manager';


-- 查询每位员工的工资等级;empno,ename,sal,grade(不等值连接)
select empno,ename,sal,grade from emp left join salgrade on sal
between losal and highsal;


-- 查询每个工资等级的员工数
use test;
select grade,count(empno) 员工数 from salgrade left join emp
 on sal between losal and highsal group by grade;


-- 查询所有员工姓名及其直属领导姓名(自连接:通过别名,将同一张表视为多张表)
select 员工表.ename 员工姓名, 领导表.ename 直属领导姓名 
from emp as 员工表 left join emp as 领导表 on 员工表.mgr=领导表.empno;


-- 查询入职日期早于其直属领导的员工:empno,ename,dname 
#先用自连接找出员工对应的直属领导,部门编号重复了,再次连接化为一个三表相连
select 员工表.empno,员工表.ename,dname from emp as 员工表 left join emp as 领导表 
on 员工表.mgr=领导表.empno left join dept 
on 员工表.deptno=dept.deptno
 where 员工表.hiredate<领导表.hiredate;


-- 子查询
-- 标量子查询:
-- 查询基本工资高于公司平均工资的员工信息
select avg(sal) from emp;
select ename from emp where sal>2073.3;



-- 练习:查询和allen同一个领导的员工:empno,ename,job,mgr

select mgr from emp where ename='allen';
select * from emp where mgr=7698 and ename !='allen';
#合在一起就是
select * from emp where 
mgr=(select mgr from emp where ename='allen');
#再进一步进行优化
select empno,ename job,mgr from emp where 
mgr=(select mgr from emp where ename='allen');


-- 行子查询
-- 查询和smith同部门同职位的员工:empno,ename,job,deptno
select deptno,job from emp where ename ='smith';
select empno,ename,job,deptno from emp where deptno=20 and job='clerk';
select * from emp;
#进行合并
select empno,ename ,job,deptno
from emp
where(deptno,job)=(select deptno,job from emp where ename ='smith') and ename !='smith';
  • 8
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值