数据库(二)

本文详细讲解了SQL查询中的去重方法,包括distinct关键字的使用,以及内连接、外连接、笛卡尔积、子查询和分页查询在MySQL和Oracle中的实践。涵盖了各种连接类型、避免笛卡尔积现象和使用limit实现分页的方法。
摘要由CSDN通过智能技术生成

sql不区分大小写,但是数据有大小写之分, mysql语法松散一些,所以数据也不区分,oracle区分

查询结果集的去重

select distinct job from emp;//distinct关键字去除重复记录

select ename, distinct job from emp;//错误,distinct只能出现在所有字段的最前面

select distinct deptno, job from emp;//联合去重

统计岗位的数量

select count(distinct job) from emp;

链接查询

多表联合查询取出最终结果;

数据都存在一张表中,数据会大量重复。

链接查询的分类

sql92              sql99(较新的语法)

表的链接方式:

内连接:等值链接 非等值链接 自链接

外连接:左外链接(左连接) 右外链接(右链接)

全连接(很少用):

笛卡尔积现象(笛卡尔乘积现象)

找出每个员工的部门名称,显示员工名和部门名

select  ename, dname from emp, dept;

笛卡尔积现象:当两张表进行连接查询的时候,没有任何条件进行限制,最后查询结果条数是两张记录条数的乘积。

表的别名 select  e.ename, d.dname from emp e, dept d;

表的别名的好处:1.执行效率高 2.可读性好。

避免笛卡尔积现象:加条件进行过滤,不会减少匹配次数,是只显示有效记录。

找出每个员工的部门名称,显示员工名和部门名

select e.ename, d.dname from emp e, dept d where e.deptno = d.deptno;//sql92

内连接之等值连接

条件是等量关系

查询每个员工的部门名称,显示员工名和部门名 

select e.ename, d.dname from emp e, dept d where e.deptno = d.deptno;//sql92

select e.ename, d.dname from emp e join dept d on e.deptno = d.deptno;//常用,结构更清晰,连接条件和where 条件分离了,inner 可以省略,带着可读性好

语法: ... A join B on 连接条件 where ...

内连接之非等值连接

连接条件中的关系是非等量关系

找出每个员工的工资等级,显示员工名、工资、工资等级

select e.ename, e.sal, s.grade from emp e, join salgrade s on e.sal between s.losal and s.hisal;

自连接

一张表看作两张表,自己连自己

找出每个员工的上级领导,显示员工名称和对应的领导名

select a.ename '员工', b.ename '领导' from emp a join emp b on a.mgr = b.empno;

外连接

内连接:凡是a表和b表能够匹配的记录查询出来,无主副之分

外连接:ab两张表中有一张是主表,一张是副表,主要查询主表中的数据,捎带查询副表,当副表中的数据没有和主表的数据匹配,副表自动模拟出null与之匹配

左连接:左边的是主表

右连接:右边的是主表

左连接有右链接的写法,右链接有左连接的写法

找出每个员工的上级领导(所有员工必须全部查询)

select a.ename '员工', b.ename '领导' from emp a left join emp b on a.mgr = b.empno;左连接 outer可以省略

select a.ename '员工', b.ename '领导' from mp b right join emp a on a.mgr = b.empno;右连接

外连接特点:主表数据无条件查询

找出哪个部门没有员工

select d.* from emp e right join dept d on e.deptno = d.deptno where e.empno is null;

全连接 

full join

三张表连接

select ... A join B join C on ... A与B先连接,得到结果与C表连接

找出每个员工的部门名称以及工资等级

select  e.ename, d.dname, s.grade from emp e join dept d on e.deptno = d.deptno join salgrade s on  e.sal between s.losal and s.hisal;

找出每个员工的部门名称、工资等级,以及上级领导

select  e.ename '员工', d.dname, s.grade, e2.ename'领导' from emp e join dept d on e.deptno = d.deptno join salgrade s on  e.sal between s.losal and s.hisal left join emp e2 on e.mgr = e2.empno;

子查询

select语句中嵌套select语句,被嵌套的select语句是子查询

select ... (select), from ...(select), where ...(select);

where子句中使用子查询

找出高于平均薪资的员工信息

select * from emp where sal > avg(sal);//错误 where 后不能直接使用分组函数

select * from emp where sal > (select avg(sal) from emp;);

from 后面嵌套子查询

找出每个部门平均薪水的薪资等级(按部门编号分组,求sal平均值)

1.找出部门平均薪水

select deptno, avg(sal) as avgsal from emp group by deptno;

2.将上述查询结果当作临时表t,让t和salgrade s表连接,条件是 t.avgsal between s.losal and s.hisal;

select t.avgsal, s.grade from (select deptno, avg(sal) as avgsal from emp group by deptno) t join salgrade s on t.avgsal between s.losal and s.hisal;

找出每个部门平均的薪水等级

1.找出每个员工的工资等级

select a.deptno, s.grade from emp a join salgrade s on a.sal between s.losal and s.hisal;

2.根据部门分组,求工资等级平均值

select t.deptno, avg(t.grade) from (select a.deptno, s.grade from emp a join salgrade s on a.sal between s.losal and s.hisal) t group by t.deptno;//不需要当作临时表

select a.deptno, avg(s.grade) from emp a join salgrade s on a.sal between s.losal and s.hisal group by a.deptno;

找出每个员工所在的部门名称,显示员工名和部门名

select e.ename, d.dname from emp e join dept d on e.deptno = d.deptno;

select e.ename, e.deptno, (select d.dname from dept d where e.deptno = d.deptno) as dname from emp e;

union 可以将查询结果集相加

找出工作岗位是salesman和manager 的员工

select ename, job from emp where job='salesman' or job='manager';

select ename, job from emp where job in ('manager', 'salesman');

select ename, job from emp where job = 'manager' union select ename, job from emp where job = 'salesman';

两张不相干的表的数据拼在一起显示

select ename from emp union select dname from dept;//列数得相同

limit 分页查询

mysql 特有,其他数据库没有(oracle有一个相同的机制 rownum )

limit取结果集中的部分数据

语法机制 limit startIndex, length startIndex表示起始位置,从0开始  length表示取几个

取出工资前五名的员工(降序前五个)

select ename, sal from emp order by sal desc limit 0, 5;

select ename, sal from emp order by sal desc limit  5;

limit是sql语句最后执行的一个环节

select... from ... where... group by ...  having ... order by... limit ...

5              1          2            3                    4          6              7

找出工资排名在第四到第九名的员工

select ename, sal from emp order by sal desc limit 3, 5;

通用的标准分页sql

每页显示三条记录:第一页 0 ,3 第二页 3, 3 第三页 6, 3第四页 9, 3第五页12, 3

3*(n-1) 第pageno页:(pageno - 1) * pagesize, pagesize

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值