JAVA入门到精通-第61讲-复杂查询

--笛卡尔积:

不带任何条件会出现笛卡尔积;

SQL是从右向左执行;

从右挑选一个条件和左边的表的每一条记录进行匹配;

这时,只会保留你需要的记录;其他记录会被删除;

 

找到关联,会再次拆选,再次筛选: emp.deptno=dept.deptno

否则,会出现笛卡尔集;

--如果两张表都有相同名字的字段,则需要带表名(别名)

from 后面取表的别名;

select  ?, ?, ?

from  emp, dept

where

--自连接(同一张表上的连接查询)

把自个儿的名字显示出来?

 

ford 和他上级 jones在同一张表,共用一个ename字段;

所有的信息在同一张表中;

找的信息又在自身的表当中;

 

--每个员工---上级的名字--

把emp表看成两张表,认为有两张表取别名:

emp  worker

emp  boss

对这两张表进行联合查询;

select worker.ename , boss.ename

from  emp  worker, emp  boss

--普通查询是内连接

--左外连接/右外连接

 

--子查询

--单行子查询:返回的结果是单行;

--多行子查询:返回多行数据的子查询-in

--from子句中使用子查询

表的复杂查询--多表查询

说明:

多表查询是指基于两个或两个以上的表或是视图的查询,在实际应用中,查询单个表可能不能满足你的需求,(如显示sales部门位置和其员工的姓名),这种情况下需要使用到(dept表和emp表)

--多表查询

--如果多张表都有相同名字的字段,则需要带表名(别名)

--显示sales部门位置和其员工的姓名

select emp.ename"员工姓名",dept.dname"部门名称",dept.loc"部门所在地" from emp,dept where dept.dname=‘sales‘ and emp.deptno=dept.deptno

--显示雇员名,雇员工资及所在部门的名字

select emp.ename"雇员名",emp.sal"雇员工资",dept.dname"部门名称" from emp,dept where emp.deptno=dept.deptno

--如何显示部门号为10的部门名、员工名和工资

select emp.deptno"部门号",dept.dname"部门名称",emp.ename"员工名称",emp.sal"工资" from emp,dept where emp.deptno=dept.deptno and emp.deptno=10

--显示雇员名、雇员工资及所在部门的名字并按部门排序

select e.ename"雇员名字",e.sal"工资",d.dname"部门名称" from emp e,dept d where e.deptno=d.deptno order by d.dname

表的复杂查询--多表查询

自连接

自连接是指在同一张表的连接查询

例:

--自连接

--显示某个员工的上级领导的姓名,比如显示"ford"的上级

select (select ename from emp where ename=‘ford‘)"员工姓名",ename"上级领导" from emp where empno=(select mgr from emp where ename=‘ford‘)

--显示公司每个员工姓名和他的上级的名字

--分析,把emp表看成两张表分别是worker/boss

--外连接(左外连接、右外连接)

select worker.ename"员工名字",boss.ename"领导名字" from emp worker,emp boss where worker.mgr=boss.empno

表的复杂查询--子查询

什么是子查询

子查询是批嵌入在其它sql语句中的select语句,也叫嵌套查询

单行子查询

单行子查询是指只返回一行数据的子查询语句

--如何显示与smith同一部门的所有员工?

select deptno"部门号",ename"员工名字" from emp where deptno=(select deptno from emp where ename=‘smith‘)

多行子查询

多行子查询指返回多行数据的子查询

--如何查询和部门10的工作相同的雇员的名字、岗位、工资、部门号

select * from emp where job in(select distinct job from emp where deptno=10)

在from子句中使用子查询

--如何显示高于部门平均工资的员工名字、薪水、部门的平均工资

--分析:1、首先要知道各个部门的平均工资

select avg(sal)"部门平均工资",deptno from emp group by deptno

--2、把上面的查询结果当作一个临时表对待

select e.ename"员工名字",e.sal"薪水",temp.myavg"部门平均工资",e.deptno from emp e,(select avg(sal) myavg,deptno from emp group by deptno) temp where e.deptno=temp.deptno and e.sal>temp.myavg

在from子句中使用子查询

这里需要说明的当在from子句中使用子查询时,该子查询会被作为一个临时表来对待,当在from子句中使用子查询时,必需给子查询指定别名

分面查询

按雇员的id号升序取出

--请显示第5个到第10个入职的雇员信息(按照入职的时间先后顺序查找)

--分析:1、显示第1个到第4个入职的雇员

select top 4 * from emp order by hiredate

--top后的数表示要取出几条记录

select top 6 * from emp where empno not in(select top 4 empno from emp order by hiredate) order by hiredate

--请显示第11个到13个入职的雇员信息

select top 3 * from emp where empno not in(select top 10 empno from emp order by hiredate) order by hiredate

--请显示第5个到9个入职的雇员信息(按薪水高低排序)

select top 5 * from emp where empno not in(select top 4 empno from emp order by sal desc) order by sal desc

用查询结果创建新表

这个命令是一种快捷的建表方法

select *(这里可以选择字段) into 另一个表名 from 表

--如何删除掉一张表重复记录

create table cat(

catId int,

catName varchar(40)

)

insert into cat values(1,‘aa‘)

select * from cat

--1、把cat表的记录distinct后的结果,放到临时表中

select distinct * into #temp from cat

--2、把cat表的记录清空

delete from cat

--3、把临时表中的数据信息加入到cat表中

insert into cat select * from #temp

--4、删除临时表

drop table #temp

原文地址:https://www.cnblogs.com/xuxaut-558/p/10035724.html

时间: 2024-11-09 06:27:23

JAVA入门到精通-第61讲-复杂查询的相关文章

JAVA入门到精通-第62讲-复杂查询

每个部门的平均工资是不一样的: --from子句中使用查询 分析: 1.首先要知道各个部门的平均工资 select  avg(sal), deptno from emp group by deptno 2.把上面的查询结果当做一个临时表对待 两张表,sal进行比较 tem 临时表   tem表和emp表关联起来: 给所在部门的平均工资取别名 myavg 不给子查询取别名,会访问不到需要的字段: --top ID * top 取5到10个 top 后面的数表示要取出几条记录: top挑出6条,从e

JAVA入门到精通-第94讲-山寨QQ项目8-好友在线提示

遇到的问题: 现在每登录一个人,后面的人是能看到前面的登录的人的: 但是,前面的人看不到后面的人登录: //后面每登录一个人,有责任去通知前面登录的人他已经上线了: 通知了完以后,需要更改好友在线的情况: //不让同一个账号反复登录 //如果 好友不在线,则不能聊天 ================================ [ManageQqChat.java] /** * 这是一个管理用户聊天界面的类 */ package com.qq.client.tools; import jav

JAVA入门到精通-第31讲-常见组件

面板组件-Jpanel  一个JFrame,多个JPanel: JPanel默认是流布局:FlowLayout:  通过JPanel达到复杂布局的目的:  可以认为是网格布局,有3个JPanel:2个Label:2个按钮: 一个密码框和一个文本输入框:   最终展现出来的还是靠JFrame展现的  网格布局好点,3个JPanel,用流布局,控件往里加: ButtonGroup按钮组:一组里面只能选择一个:    对单选框管理,就是把它加入到ButtonGroup里面: 单选框也是一个个放进JPa

JAVA入门到精通-第33讲-绘图技术.坦克大战1

    用的是Access数据库,安全性不够好,性能也不够强大:   躲在这里,坦克很少过来,做了一个随机数: 把得分的记录保存在数据库里面: SQLServer2005中型数据库:    (x,y)坐标:     800x600:     表示计算机屏幕上的每一行由800个点组成,共有600行:   共有480000个像素:   java绘图技术:   绘图一般在JPane上画: 覆盖JPanel的paintat方法 Graphics是一个图形画笔类,绘图的重要类,可以理解为一只画笔 supe

JAVA入门到精通-第72讲-学生管理系统4-model 2模式(1)

删除.查询.添加.修改: -修改: 每个字段都可能修改: //给?赋值 //在prepareStatement语句后面赋值才好用 //修改完了,更新数据 目前为止,已经完成了增删改查-Model1模式 最大特点: 界面和业务逻辑操作是放在一起的: 优点:简单,开发方便: 缺点:代码复用性不高: 中大型项目可读性差,可维护性不高: 前台后端混杂在一起的: 比如:"数据库密码换了, 所有涉及到数据库的地方都需要发生变化" =================================

JAVA入门到精通-第32讲-swing编程实战

 JBorderLayout,左边是JList,拆分窗格: 图片是放在JLabel上的,图片的地址写好就行:  在相关项目下面建立一个文件夹Folder,放置图片:或者复制粘贴:   拆分:水平拆分?垂直拆分?    拆分之后把jList和jl1这两个组件放进去: 可以伸缩:  在窗口左上角出现自己的图标? Border布局: 多行文本框带滚动条,聊天窗口可滚动:   加入QQ左上角图标:      转成图片,getImage; Border布局很有用, CENTER会被自动挤满:  QQ号码.

JAVA入门到精通-第36讲-事件监听-坦克大战4

Java事件处理机制:  事件源:事件:事件监听者:事件处理方法:  任何一个类,只要实现了相应的接口,就可以去监听某个事件源: 一个类要实现监听的基本步骤:  a.实现相应的接口[KeyListener,MouseListener,ActionListener,WindowListener] b.把接口的处理方法根据需要重新编写(override) c.在事件源注册监听 d.事件传递是靠事件对象 通过ActionEvent传递事件: 通过事件进行委派事件模型进行事件处理:  一个事件源可能会生

JAVA入门到精通-第35讲-事件处理-坦克大战3

画出弧形: g.drawArc: 前两个参数:代表中心点,后面代表宽,高,后面是弧度的大小:  50代表弧度,后面方向:    SWING编程三个部分: (1)组件和布局管理器: (2)绘图技术: (3)事件处理机制:  鼠标,键盘按下的某个按钮或者移动等都是事件: JAVA认为,消息是一种事件对象:事件监听者也是一个类: 事件监听者中有函数或者方法专门去处理事件: import  java.awt.Event.*; 需要对事件进行处理,把Event包带进去:  Border布局中间是 默认的:

JAVA入门到精通-第70讲-学生管理系统2-增删改

-完成一个mini版本学生管理系统 jude软件:很好使的,安装一下就可以用了: -学生管理系统的添加 .修改.删除.上下页分页 ---------------------------------------------- 上面是一个流布局,JPanel 下面是一个流布局,JPanel 中间是Border布局,边界布局,CENTER JTextField jtf; 先加JLable--->Jtf文本域->JButton按钮 ------------------------- mis 系统:信息