多表查询
等值连接
--查询员工信息,员工号,姓名,月薪,部门名称
select e.empno,e.ename,d.dname
from emp e,dept d
where e.deptno=d.deptno;
不等值连接
--查询员工信息,姓名,薪水,薪水级别
select e.ename 姓名,e.sal 工资,s.grade 工资等级 from emp e,salgrade s
where e.sal between s.losal and s.hisal
外连接
--按部门统计员工人数:部门号 部门名称 各部门人数
--确定是多表查询,因为部门表中没有人数,人数和部门表有关
--因为需要统计各个部门的人数,需要分组 select e.deptno,d.dname,count(*)
from emp e,dept d
where e.deptno=d.deptno
group by e.deptno,d.dname--理解:在group by之前已经形成了一个笛卡尔积的表,group by是对该表进行分组 --40号部门不在笛卡尔积表中
--我们希望把不符合条件的部门(40号部门)也要显示出来
--希望把不满足等值条件的数据也显示出来==》外连接技术
左连接:想把d.deptno都显示出来,把(+)写在等号右边,叫左连接
右连接相反 select d.deptno,d.dname,count(*)
from emp e,dept d
where e.deptno(+)=d.deptno
group by e.deptno,d.dname
结果显示
DEPTNO DNAME COUNT(*)
------ -------------- ----------
ACCOUNTING
OPERATIONS
RESEARCH
SALES
--结果分析发现40号部门竟然有一个人,但是emp表中并没有人
--问题出现在count(*),这里*号统计的是笛卡尔积表中的数据,新拼接的笛卡尔积有一条40号部门的数据
--这里我们应该统计emp员工表中的数据,修改count(*)===>count(e.ename)
自连接
--查询员工直属上司的信息,显示***的老板是**
--思路:可以将一张表分成两张表,员工表,老板表,两张表进行笛卡尔积连接
select a.ename||'的老板是'|| nvl(b.ename,a.ename)
from emp a,emp b
--where a.empno=b.mgr 错误:这种写法导致如果是员工,就无法在笛卡尔积中显示
--where a.mgr=b.empno 这样b才是老板表,但是总老板没有显示,此时应该使用外连接技术
但是在哪张表上使用外连接呢?假设在老板表使用外连接,那么老板表会把所有员工信息都显示出来
如果在员工表使用外连接,可以把老板也显示出来
where a.mgr=b.empno(+)
子查询
--对于一个问题,一步不能求解,需要多步
--子查询的本质是select语句的嵌套
--查询谁的工资比scott高
--.先求scott的工资
--.求比3000大的工资
SQL> select ename from emp
where sal >(select sal from emp where ename='SCOTT');
子查询的注意点:
.子查询要包含在括号内
.将子查询放在比较条件的右侧
.单行操作符对应单行子查询,多行操作符对应多行子查询
子查询类型
--单行子查询==》查询结果是一条数据
--多行子查询==》查询结果是多条数据
子查询知识架构(重点)
--.注意语法结构
--.子查询的()不要丢掉
--.主查询和子查询可以不是同一张表,只要子查询返回的结果主查询能用就行
--.子查询的位置
select ...(可以放置子查询--单行子查询)
from ...(可以放置子查询)
where ...(可以放置子查询)
group by ...(不能放置子查询)
having ...(可以放置子查询)
order by ...(不能放置子查询)
--.单行子查询只能用单行比较操作符(> = <)
多行子查询只能用多行比较操作符(in ant all)
按照子查询和主查询执行顺序来分
一般子查询
相关子查询
--.子查询返回空值问题
--.子查询中一般不使用order by,但是Top-N问题,子查询必须要用order by
eg:求工资的前三名...
解释子查询知识3--查询部门名称是SALES的员工信息
--因为SALES在部门表中,查找部门表才能获取部门编号,接着在员工表中查询信息
--两种实现方式--子查询或者多表查询
select ename,deptno
from emp
where deptno=(select deptno from dept where dname='SALES'); select e.name,e.deptno,d.dname
from emp e,dept d
where e.deptno=d.deptno and d.dname='SALES';
sql优化③:子查询检索数据库两次,但是多表查询只检查数据库一次,所有优先使用多表查询,多表查询是笛卡尔积,牺牲了内存空间(因为要拼接两个表),以空间换时间
解释子查询知识4
--select中的子查询
select ename,job,(select sal from emp where deptno=) 十号部门所有工资
from emp;
报错:单行子查询返回多个行
结论:select中的子查询只能是单行子查询 select ename,job,(select sal from emp where deptno= and ename='CLARK') 十号部门所有工资
from emp;
执行成功 --from中的子查询
select *
from emp;--emp表,表就是一个集合 select * from (select a,b,c from emp where d='aa');这种情况在oracle中使用比较多 --查询员工号和员工姓名
select *
from (select ename,empno from emp);
多行子查询
--返回多行
--使用多行比较操作符
IN 等于列表中的任何一个
ANY 和子查询返回的任意一个值比较
ALL 和子查询返回的所有值比较
--查询部门名称为SALES和ACCOUNTING的员工信息
--多表查询
select e.*
from emp e,dept d
where e.deptno=d.deptno and d.dname in ('SALES','ACCOUNTING');
--子查询
select *
from emp
where deptno in (select deptno from dept where dname in ('SALES','ACCOUNTING'));
--查询薪水比30号部门 员工最低薪水要高的员工信息
select *
from emp
where sal> (select min(sal) from emp where deptno=)--单行子查询 --any的使用
select *
from emp
where sal> any(select sal from emp where deptno=)--多行子查询
--查询薪水比30号部门 所有员工薪水要高的员工信息
select *
from emp
where sal> (select max(sal) from emp where deptno=)--单行子查询 --all的使用
select *
from emp
where sal> all(select sal from emp where deptno=)--多行子查询
解释子查询知识6
--查询不是官的员工
--思路:先查询是经理的员工信息
select *
from emp
--where empno not in (select distinct mgr from emp)--此时因为有空值,所以无法得出正确结果
where empno not in (select distinct mgr from emp where mgr is not null)--进行过滤空值 in和not in与空值null的本质理解
空值参与任何运算都是空值
deptno in (,,null)
相当于deptno=||deptno=||deptno=null;这是或的关系,就算有空值也不影响结果
deptno not in (,,null)
相当于 deptno!=&&deptno!=&&deptno!=null;这是与的关系,有一个为空,整个结果就是假
解释子查询知识7
--有关oracle伪列 rownum的说明
.rownum是oracle的数据字典,rownum的生成按照oracle的默认顺序生成,每一个结果集都有相应的rownum
.rownum只能使用<功能,不能使用>或者>=功能例如where rownum>3;这是错误的 --查找员工表中工资最高的前三名
select rownum,empno,ename,sal
from
(select rownum r,empno,ename,sal from emp
order by sal)
where rownum<=
--注释:每一个结果集都有相应的rownum,所以本SQL语句中的两个集合分别有两个rownum,并且各不相同
oracle的分页
--按照员工薪水,降序,求第二页数据(每页4条数据)
--第一步:获取所有数据,降序排列
select empno,ename,sal
from emp
order by sal desc
--第二步:以第一步的集合获取前8条数据(因为是第二页,每页四条,并且rownum只能使用<)
select rownum,empno,ename,sal
from (
select empno,ename,sal
from emp
order by sal desc
)
where rownum<=
--第三步:以第二步集合为基础查询第二页数据,每个查询结果集都有一个rownum,并且rownum不可以使用>
但是如果我将这个数据集作为源数据,再查询一遍,那么源数据中的rownum就会变成一个列名,
不再是oracle的数据字典,这样就可以做>操作
select r,empno,ename,sal--这里的r是第二步源数据集合中的r,之所以取别名是因为rownum是oracle的数据字典,防止冲突
from (
select rownum r,empno,ename,sal
from (
select empno,ename,sal
from emp
order by sal desc
)
where rownum<=
)
where r>=; oracle分页总结--内层排序,外层选择
综合案例
--找到员工表中薪水大于本部门平均薪水的员工
方案一:
--分析:结果是员工信息
--各部门因此需要分组,分组求出部门号和部门平均工资
--将上一步数据当作一个集合,与原表进行多表查询
select e.ename,e.sal,r.avgsal
from emp e, (
select deptno,avg(sal) avgsal
from emp
group by deptno
) r
where e.deptno=r.deptno and e.sal>r.avgsal 方案二(相关子查询)
--相关子查询:主查询中的参数 通过 别名的方式,传给子查询
select deptno,ename,sal,(select avg(sal) from emp where deptno=e.deptno)
from emp e
where sal>(select avg(sal) from emp where deptno=e.deptno)

数据库 数据库SQL语句四的更多相关文章

  1. Oracle数据库 基础SQL语句练习

    一.说明 第一次使用Oracle,想做一些练习,熟悉一些oracle. 表:使用的是scott用户,默认的表 具体表讲解,可以参考该文档:https://www.cnblogs.com/xjcheng ...

  2. 总结一些关于操作数据库是sql语句还是存储过程问题

    总结一些关于操作数据库是sql语句还是存储过程问题 程序中,你跟数据的交互,需要向数据库拿数据.更改数据库的数据等,这些操作,本身不是程序完成的,而是程序发命令给数据库去做的,不管是通过sql语句方式 ...

  3. SQL Server 【附】创建"商品管理数据库"、"学生选课数据库"的SQL语句

    附:(创建“商品管理数据库”的SQL语句) --建立"商品管理数据库"数据库-- create database 商品管理数据库 on(name='商品管理数据库_m', file ...

  4. 在线数据库表(sql语句)生成java实体类工具

    相信每个做java开发的读者,都接触过SQL建表语句,尤其是在项目开发初期,因为数据库是项目的基石. 在现代项目开发中,出现了许多ORM框架,通过简单的实体映射,即可实现与数据库的交互,然而我们最初设 ...

  5. GP数据库 常用SQL语句

    GP数据库 常用SQL语句 --1,查看列名以及类型 select upper(column_name) ,data_type from information_schema.columns wher ...

  6. Oracle,SQL Server 数据库较MySql数据库,Sql语句差异

    原文:Oracle,SQL Server 数据库较MySql数据库,Sql语句差异 Oracle,SQL Server 数据库较MySql数据库,Sql语句差异 1.关系型数据库 百度百科 关系数据库 ...

  7. mysql(数据库,sql语句,普通查询)

    第1章 数据库 1.1 数据库概述 l 什么是数据库 数据库就是存储数据的仓库,其本质是一个文件系统,数据按照特定的格式将数据存储起来,用户可以对数据库中的数据进行增加,修改,删除及查询操作. l 什 ...

  8. [数据库]简单SQL语句总结

    1.在查询结果中显示列名:a.用as关键字:select name as '姓名'   from students order by ageb.直接表示:select name '姓名'   from ...

  9. 《大话数据库》-SQL语句执行时,底层究竟做了什么小动作?

    <大话数据库>-SQL语句执行时,底层究竟做了什么小动作? 前言 大家好,我是Taoye,试图用玩世不恭过的态度对待生活的Coder. 现如今我们已然进入了大数据时代,无论是业内还是业外的 ...

随机推荐

  1. Service 生命周期

    有了 Service 类我们如何启动他呢,有两种方法: • Context.startService() • Context.bindService()  1.  在同一个应用任何地方调用 start ...

  2. bitBucket readme文件图片添加

    bitBucket一个和github一样的强大的代码托管站点,前者支持免费无限的私有仓库:后者私有仓库要付费: 在bitbucket项目中可以使用markDown语法创建一个README.md文件,但 ...

  3. 高阶函数简述 js

    1.简述 高阶函数似乎是一种先进编程的的技术.然而,并不是. 高阶函数其实就是将函数作为参数或者返回值的函数.其中作为参数的函数一般是回调函数. 2.例子 (1)最简单的例子 大家都熟悉数组的sort ...

  4. MVC4 WebApi开发中如果想支持Session请做好如下几个方面的问题

    1.在WebApiConfig中建立建立HttpControllerHandler和HttpControllerRouteHandler 并覆写它 public class SessionRouteH ...

  5. [转载]最完整PHP.INI中文版

    [转载]最完整PHP.INI中文版 http://www.21andy.com/blog/20090718/1344.html 最完整PHP.INI中文版 适用于 php-5.2 的 php.ini ...

  6. iOS 获得通讯录中联系人的所有属性--b

    ABAddressBookRef addressBook = ABAddressBookCreate(); CFArrayRef results = ABAddressBookCopyArrayOfA ...

  7. Linux top里面%CPU和us%的解释

    我们有时会把%CPU和us%搞晕,也就是下图所示在top的时候查看cpu的信息. 这时有人会问:这两个CPU到底哪个是对的. 其实都是对的,只是表达的意思不一样. 官方解释如下 Cpu(s):34.0 ...

  8. 字符编解码的故事(ASCII,GBK,Unicode,Utf-8区别)

    很久很久以前,有一群人,他们决定用8个可以开合的晶体管来组合成不同的状态,以表示世界上的万物.他们认为8个开关状态作为原子单位很好,于是他们把这称为"字节". 再后来,他们又做了一 ...

  9. Js/jQuery实时监听输入框值变化

    前言 在做web开发时候很多时候都需要即时监听输入框值的变化,以便作出即时动作去引导浏览者增强网站的用户体验感.而采用onchange时间又往往是在输入框失去焦点(onblur)时候触发,有时候并不能 ...

  10. RPC服务框架dubbo(四):Dubbo中Provider搭建

    1.新建Maven Project, 里面只有接口(dubbo-service) 1.1 为什么这么做? RPC框架,不希望Consumer知道具体实现.如果实现类和接口在同一个项目中,Consume ...