mysql查询

/*多张表联合起来检索,这种多表联合检索被称为连表查询或跨表查询*/
/*若两张表进行连接查询的时候没有任何条件限制,
最终的查询结果总数是两张表记录的乘积,
该现象称为笛卡尔积现象。*/
select e.ename, d.dname from emp e,dept d;
select * from emp;
select * from dept;
/*SQL92语法*/
/*select xxxx from A表名,B表名 where 表连接条件 and 数据查询条件;*/
/*查询每一个员工所在的部门名称,要求最终显示员工姓
名和对应的部门名称*/
select e.ename, d.dname from emp e,dept d where e.deptno=d.deptno;

/*SQL99语法【只掌握SQL99】*/
/*select xxxx from A表名 join B表名 on 表的连接条件;*/
/*表连接独立,结构清晰,如果结果数据不满足要求,可再追加where条件进行过滤;*/
/*内连接:只连接匹配的行,即A表与B表相连接,能够匹配的记录查询出来*/
select e.ename, d.dname from emp e join dept d on e.deptno=d.deptno;/*等值连接*/
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 empname ,b.ename leadername from emp a join emp b on a.mgr = b.empno;/*自连接*/

/*外连接
A表和B表能够完全匹配的记录查询出来之外,
将其中一张表的记录无条件的完全查询出来,
对方表没有匹配的记录时,会自动模拟出null值与之匹配;
*/
/*左外连接(左连接)
包含左边表的全部行(不管右边的表中是否存在与它们匹配的行),
以及右边表中全部匹配的行;
*/
/*右外连接(右连接)
包含右边表的全部行(不管左边的表中是否存在与它们匹配的行),
以及左边表中全部匹配的行;
*/
desc salgrade;
select * from dept;
/*全连接(了解)
包含左、右两个表的全部行,不管另外一边的表中是否存在与它们匹配的行。
*/

/*找出每一个员工对应的部门名称,要求部门名称全部显示
(左/右外连接)*/
/*右外连接*/
select e.ename,d.dname from emp e right outer join dept d on e.deptno = d.deptno;
select e.ename,d.dname from emp e right join dept d on e.deptno = d.deptno;/*outer可省略*/
/*左外连接*/
select e.ename,d.dname from dept d left outer join emp e on e.deptno = d.deptno;
select e.ename,d.dname from dept d left join emp e on e.deptno = d.deptno;
/*注意:任何一个右外连接都可写成左外连接,任何一个左外连接都可写成右外连接;*/
/*找出每一个员工对应的领导名,要求显示所有员工(左外连接)*/
select e.ename empname,a.ename leadername from emp e left outer join emp a on e.mgr=a.empno;
/*
重点:多张表进行表连接的语法格式:
select
      xxxx
from
    A表
join
    B表
on
  连接条件1
join
    C表
on
  连接条件2;
*/
/*找出每一个员工对应的部门名称,以及该员工对应的工资等
级,要求显示员工姓名、部门名称、工资等级*/
select
      e.ename,d.dname,e.sal,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 语句嵌套 select语句被称为子查询;
注意:select子句可出现在select、 from、 where关键字后面,如下:
select … (select)…【很少很少使用了解即可】
from …(select)…
where …(select)…
*/
/*找出薪水比公司平均薪水高的员工,要求显示员工名和薪水*/
select ename,sal from emp where sal > avg(sal);/*执行错误:因为分组函数不能直接使用在where关键字后面*/
select ename,sal from emp where sal >(select avg(sal) from emp);

/*(from后)找出每个部门的平均薪水,并且要求显示平均薪水的薪水等级*/
select 
       t.deptno,t.avgsal,s.grade
from
    salgrade  s
join 
     (select deptno,avg(sal) as avgsal from emp group by deptno) t /*将查询结果当做临时表*/
on 
   t.avgsal BETWEEN s.losal and s.hisal
order by
      t.deptno;
      
/*select后使用了解
select
e.ename,(select d.dname from dept d where e.deptno = d.deptno) as dname
from emp e;*/ 

     
/*union合并(相加)集合*/
/*定义:将查询的结果集合并
注意事项:合并结果集的时候,查询字段个数必须相同;*/
/*以下写法错误:*/
select empno,ename,job from emp where job = 'MANAGER'
union
select ename,job from emp where job = 'SALESMAN';
/*正确写法*/
select empno,ename,job from emp where job = 'MANAGER'
union
select empno,ename,job from emp where job = 'SALESMAN';

/* 查询字段类型在MySQL中不必完全相同,但是Oracle中一定要类型也相同;*/
select e.empno,e.ename from emp e
union
select d.dname,d.loc from dept d;/*在mysql中同样运行OK*/
select e.empno,e.ename from emp e
union
select d.deptno,d.loc from dept d;
/*查询包含 MANAGER 和 SALESMAN 的员工信息*/
select * from emp where job in ('MANAGER','SALESMAN');
select * from emp where job ='MANAGER' OR job='SALESMAN';
select * from emp where job ='MANAGER'
union
select * from emp where job ='SALESMAN';

/*******************limit 使用***********************/
/*
作用:(只在MySQL中起作用)获取一表前几条或中间某几行数据;
用法:limit 起始下标m,长度n
m:记录开始的index,默认从 0 开始,表示第一条记录;
n :指从第 m+1 条开始,取 n 条;
*/
/*取前5个员工信息*/
select * from emp limit 5;
/*
以上SQL语句中的'limit 5'中的'5'表示:从表中记录下标0开始,取
5条记录
等同于select * from emp limit 0,5;
*/
select * from emp order by sal desc limit 5;/*找出工资排名在前5的员工*/
/*
通用分页SQL【只适用于MySQL数据库管理系统】
select
      t.*
from
    t
order by
      t.xx desc/asc
limit
     (pageNo – 1) * pageSize , pageSize;
*/


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值