A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© ~Maybe 中级黑马   /  2018-11-15 09:09  /  1759 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

一、基本查询
1.基本语法格式
        
语法格式
      
作用
  
   
select  字段或表达式
  
展示结果集

   
from  表、视图或结果集等
  
指定数据源

   
where  检索条件
  
指定检索条件

   
group  by 字段
  
指定按某字段分组

   
having  检索条件
  
用在group by之后,指定检索条件

   
order  by 字段
  
指定按某字段进行排序,默认增序asc,降序desc

   
limit  初始索引, 长度
  
限制结果,索引从0开始,若为0,则可省略仅写长度
2.常见查询
2.1 select 指定展示结果集
1.  #导入了3个sql文件,老师给的!
2.  #1.查询emp表中所有的员工信息
3.  select * from emp;
4.  #2.在emp表中查询所有员工的姓名和职位信息
5.  select ename, job from emp;
2.2 where指定检索条件:关系运算符、逻辑运算符、in关键词、是否空值、范围查询between and
1.  #3.在emp表中查询所有的20号部门的员工信息
2.  select * from emp where deptno=20;
3.  #4.在emp表中查询工作大于2000的员工的姓名和工资
4.  select ename, sal from emp where sal > 2000;
5.  #5.在emp表中查询工作在1000到2000之间的员工信息(范围查询)
6.  select * from emp where sal > 1000 and sal < 2000;
7.  select * from emp where sal between 1000 and 2000;
8.  #6.在emp表中查询员工编号为7788,7369,7521的员工信息
9.  select * from emp where empno = 7788 or empno = 7369 or empno = 7521;
10.         select * from emp where empno in (7788,7369,7521);
11.         #9.在emp表中查询所有没有奖金的员工信息。(comm值为空)
12.         select * from emp where comm is null;
13.         select * from emp where comm is not null;
2.3 去重distinct 关键字
1.  #7.在emp表中查询所有的职位信息(去重)
2.  select distinct job from emp;
2.4 取别名
1.  #8.在emp中查询工资提升5%后的员工姓名及工资(别名:字段、表达式、表、结果集等)
2.  # 别名格式:[as] 别名
3.  select ename,sal * 1.05 nsal from emp;
4.  select emp.ename,emp.sal from emp;
5.  select e.ename,e.sal from emp e;
2.5 排序 order by 和限制结果查询 limit
1.  #10.在emp中查询工资最高的员工信息
2.  #方法一:使用SQL提供的函数
3.  #方法二:倒序排序取第一个
4.  #排序:order by 排序的字段(默认升序,asc 升序,desc 降序)
5.  #先按照工资降序排序,如果工资一样,则按照编号降序排序
6.  select * from emp order by sal desc, empnodesc;
7.  #限制结果查询(格式:limit 开始索引, 长度,其中索引从0开始,如果是从0开始,则索引可以不
8.  #写,直接写 limit 5,表示去前5条),限制结果查询功能仅适用于mysql。
9.  select * from emp order by sal desc limit 1;
2.6 模糊查询
关键字和通配符:
·      模糊查询:like
·      %:代表0到多个字符
·      _:代表1位字符
示例代码
1.  #11.查询名称中包含s的员工信息(模糊查询:like %:代表0到多个字符 _:代表1位字符)
2.  select * from emp where ename like '%s%';
3.  select * from emp where ename like 's%';
4.  select * from emp where ename like '%s';
5.  #查询名称第3个字符是L的员工信息
6.  select * from emp where ename like '__L%';
二、高级查询
1.关联查询(也称为连接查询)
1.1 定义:查询多张表或结果集
1.2 分类:内连接和外连接
1.3 内连接
语法格式:
1.  #在emp查询所有的员工及其所在部门信息
2.  #语法一:
3.  #where的条件相当于从笛卡尔积中进行检索
4.  select * from emp,dept where emp.deptno = dept.deptno;
5.  #语法二:inner join … on
6.  select * from emp inner join dept on emp.deptno = dept.deptno;
7.  #语法三:存在通用列,所以可以这样写
8.  select * from emp inner join dept  using(deptno);
特点总结:
·      多张关联表共有的记录才能出现在结果集中。
·      内连接的结果与连接顺序无关。
1.4 外连接
语法格式:
·      左外连接:left [outer] join … on …
·      右外连接:right [outer] join … on …
示例代码:
1.  #查询所有的部门及其部门下的员工信息(内连接就解决不了了)
2.  select * from dept left join emp on emp.deptno = dept.deptno;
3.  select * from dept left join emp on dept.deptno = emp.deptno;
4.   
5.  #自然连接(自然连接都是等值连接,等值连接不一定是自然连接)
6.  select * from emp natural join dept;
7.   
8.  #查询20号部门所有员工及其所在部门信息
9.  select * from emp , dept where emp.deptno = dept.deptno and emp.deptno=20;
10.         select * from (select * from emp where deptno = 20) e,dept wheree.deptno=dept.deptno;
11.         
12.         #查询所有员工及其上级领导(mgr)的名称(自连接)
13.         select e1.ename '姓名', e2.ename '领导' from emp e1 left join emp e2 on e1.mgr=e2.empno;
特点总结:
·      外连接结果与连接顺序有关。
·      有主从表之分,依次遍历主表每条记录并与关联表进行匹配,若匹配成功则关联展示到结果集,若匹配失败则以null填充。
2.子查询
1.1 定义
将一个查询结果作为另一个查询的条件或组成继续进行检索。
2.2 分类
单行子查询:子查询返回的结果是一条记录
多行子查询:子查询返回的结果是多条记录
2.3 单行子查询
示例代码:
1.  #查询编号为7788的员工所在部门的信息
2.  #方法一:关联查询实现
3.  select dept.* from (select * from emp where empno = 7788) e, dept where e.deptno=dept.deptno;
4.  #方法二:子查询(或嵌套查询)实现
5.  #查询7788员工的部门编号,将条件和结果放到一张表中(查找通用列)
6.  select * from dept where deptno = (select deptno from emp where empno = 7788);
7.   
8.  #查询工资>20号部门平均工资的员工信息
9.  select * from emp where sal > (select avg(sal) from emp where deptno = 20);
10.         #查询工资>20号部门平均工资并且不在20号部门的员工信息
11.         select * from emp where sal > (select avg(sal) from emp where deptno = 20) and deptno<>20;
2.4 多行子查询
2.4.1 关键词: any 与all
1.  # 关键词:any / all:
2.  # =any:相当于in >any:大于最小值 <any:小于最大值
3.  # >all:大于最大值 <all:小于最小值
4.   
5.  #查询工资大于2000的员工所在部门信息
6.  select * from dept where deptno in (select distinct deptno from emp where sal > 2000);
7.   
8.  #查询工资大于所在部门的平均工资的员工信息
9.  #关联查询实现
10.         select emp.* from emp , (select deptno , avg(sal) avg from emp group by deptno) e where
11.         emp.deptno = e.deptno and sal > e.avg;
12.         #子查询实现
13.         #步骤:
14.         #1.主查询将deptno传给子查询
15.         #2.子查询根据主查询的deptno查询指定部门的平均工资
16.         #3.子查询将该部门平均工资返回给主查询
17.         #4.主查询根据返回结果进行最后检索。
18.         select * from emp e1 where sal > (
19.             select avg(sal) from emp e2 where e2.deptno = e1.deptno
20.         );
2.4.2 关键词:exists
示例代码:
1.  #查询工资>2000的员工所在的部门信息
2.  #exists:
3.  #1.将主查询的记录一次次交给子查询
4.  #2.在子查询中匹配记录,如果能够找到匹配的记录,返回true,此时将展示主查询该条记录;如
5.  #果不匹配则返回false,主查询该条记录不展示
6.  select * from dept where exists (
7.      select * from emp where sal > 2000 and emp.deptno =dept.deptno
8.  );
in和exsits的区别:
·      in先执行子查询,exists先执行主查询
·      in需要关注子查询返回值的字段信息;exists不需要关心返回字段
·      exists将主查询的记录依次在子查询中匹配,如果匹配返回true展示。
2.5  总结
什么时候使用关联查询?什么时候使用子查询?
·      当查询结果存在多张表,使用关联查询;当查询结果存在于一张表,用子查询。
·      关联查询资源消耗高,子查询资源消耗低但可能存在多次查询。
3.联合查询:合并结果集
3.1 条件
多个结果集的字段必须保持一致,才能进行联合查询
3.2 关键词
union:联合结果集并去重
union all:联合结果集但不去重
3.3 为什么使用联合查询?
理论上可以用or关键词代替联合查询,但or关键词会导致索引失效故此使用联合查询。
3.4 示例代码
1.  #查询20号部门以及工资>2000的员工信息
2.  select * from emp where deptno = 20 or sal > 2000;
3.  select * from emp where deptno = 20 union select * from emp where sal > 2000;
4.  select * from emp where deptno = 20 union all select * from emp where sal > 2000;

2 个回复

倒序浏览
回复 使用道具 举报
奈斯
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马