oracle 单表查询受外键影响吗?
发布网友
发布时间:2022-04-07 20:38
我来回答
共3个回答
懂视网
时间:2022-04-08 01:00
(一)基本语句
1、语法
select 【distinct】 * | {列名...} from 表名
【where {条件}】
2、注意
1)distinct:指显示结果时,是否剔除重复数据
指查询的字段数据,全部一致,才算重复。SELECT distinct deptno,job,empno FROM EMP order by deptno;
查询的这(deptno,job,empno)三个字段需要一样,才算重复。
SELECT a.deptno,a.job FROM EMP a;
SELECT distinct a.deptno,a.job FROM EMP a order by a.deptno
查询的这(deptno,job)2个字段需要一样
2)去重:
SELECT a.deptno,a.job FROM EMP a;
SELECT distinct a.deptno,a.job FROM EMP a order by a.deptno
查询的这(deptno,job)2个字段需要一样
(二)其他用法
1、算数表达式
1)方法:
ABS(x) :绝对值sign(x) :判断正负。
正值返回1,负值返回-1,0返回0
ceil(x):向上取整。
select ceil(3.1),ceil(0),ceil(-3.9) from dual; --4、0、-3
floor(x) :向下取整。power(x,y) :返回x的y次幂 mod(x,y) :返回x除以y的余数round(x[,y]) :返回四舍五入后的值 trunc(x[,y]) :返回x按精度y截取后的值 。*select trunc(5555.66666,2.1),trunc(5555.66666,-2.6),trunc(5555.033333) from dual;
显示:5555.66、5500、5555
sqrt(x) :返回x的平方根
2)、实例:显示每个雇员的年工资
语句:SELECT a.ename,(a.sal*13+nvl(a.comm,0)*13) as "年薪", a.ename||'-'||(a.sal*13+nvl(a.comm,0)*13) as "拼接字串"FROM EMP a ;
comm:为奖金
注意:
nvl(字段,0):处理null值as "" :增加别名||:拼接字串
2、where 条件
1)to_char()函数:
SELECT * FROM EMP a WHERE to_char(a.hiredate,'yyyy-mm-dd') > '1981-11-17';
2)like:‘%’-0~多个;‘_’-1个
3)between:薪水在2000~2500的员工
SELECT * FROM EMP a WHERE a.sal between 2000 and 2500;--包含本身,都是闭区间SELECT * FROM EMP a WHERE a.sal >= 2000 and a.sal <= 2500;
4)in:员工编号号为7369,7521,7654的员工
SELECT * FROM EMP a WHERE a.empno in (7369,7521,7654);
5)is null :没有上级的员工
SELECT * FROM EMP a WHERE a.mgr IS NULL;
6)逻辑操作符:NOT 、And 、Or
SELECT * FROM EMP a WHERE (a.sal >500 or a.job='MANAGER') and a.ename like 'J%';
and 与 or的优先级:NOT > AND > OR
where 后面如果有or的条件,则or自动会把左右的查询条件分开用()来区分执行顺序
7)order by:对结果进行排序(先有结果,支持对别名排序)
asc-升序(默认)/desc-降序排序实例SELECT * FROM EMP a order by a.sal;--一个条件
SELECT * FROM EMP a order by a.deptno , a.hiredate desc;--2个条件
先按deptno 排序在第一个排序结果中,按第二个条件。
按列的别名排序
SELECT a.ename,(a.sal*13+nvl(a.comm,0)*13) as "年薪" FROM EMP a order by 年薪;
这边可以按照列的编号排序SELECT a.ename,(a.sal*13+nvl(a.comm,0)*13) as "年薪" FROM EMP a order by 1;
这边的编号,不能超出显示的列的数量。
二、聚合函数:max、min、avg、sum、count
1、取最高和最低工资:max、min
1)SQL实例
SELECT max(a.sal),min(a.sal) FROM emp a ;
SELECT max(a.sal*13) , min(a.sal*13) FROM emp a ;
--放在一起,前提条件是max 和min都返回一个值
2)注意:max 与min 只能返回一个值。
2、显示平均工资与工资总额:avg、sum
1)SQL实例
SELECT round(avg(a.sal),2),sum(a.sal) FROM emp a ;
round:四舍五入
2)注意:avg:计算平均值,不会把sal为null的统计在内
SELECT avg(a.comm) FROM emp a ;
SELECT sum(a.comm)/count(*) FROM emp a ;
为空的参与,可以这么解决
3、计算总的员工数:count
1)SQL实例
SELECT count(*) FROM emp a ;SELECT count(a.empno) FROM emp a ;
2)注意:
SELECT count(a.comm) FROM emp a ;
不统计 null 的列。
4、扩展练习
1)显示工资最高的员工的名字,工作岗位
SELECT a.ename,a.job FROM emp a WHERE a.sal = (SELECT max(a.sal) FROM emp a);
子查询可以先查出最高工资然后查出哪位员工的工资是这么多
分析执行顺序
sql执行默认是从右到左执行先执行:SELECT max(a.sal) FROM emp a 得到 5000再执行:SELECT a.ename,a.job FROM emp a WHERE a.sal =5000;
2)显示工资高于平均工资的员工信息
SELECT a.ename,a.job FROM emp a WHERE a.sal > (SELECT avg(a.sal) FROM emp a);
三、分组:group by 和 having
1、解释:
group by:对查询的结果进行分组统计having:修饰分组的条件,限制分组显示结果。
不支持别名
2、实例:
1)显示每个部门的平均工资和最高工资
SQL:
SELECT avg(a.sal), max(a.sal),a.deptno FROM emp a group by a.deptno;
分析:
SELECT avg(a.sal), max(a.sal),a.deptno FROM emp 报错avg(a.sal) 和max(a.sal)为一个结果,而 a.deptno 很多结果。
2)显示每个部门的每种岗位的平均工资和最低工资
SQL:
SELECT avg(a.sal), max(a.sal),a.deptno,a.job FROM emp a group by a.deptno ,a.job order by a.deptno ;
分析:
先对【部门】分组,再对【岗位】分组。【排序】都是放在末尾
3)显示部门平均工资低于2000 的部门号和它的平均工资
SQL:
SELECT avg(a.sal) as "平均工资", a.deptno FROM emp a group by a.deptno having avg(a.sal)<2000
分析:
having:限制分组显示结果。后面不支持别名,只能重新计算。先分组,计算各个部门的平均工资。再利用having对分组后的结果进行删选。
3、原则总结:
1)聚合函数(avg...)只能出现在选择列表、having、order by 子句中,绝不能出现在group by 函数 和where中。
2)如果在 select 语句中同时包含 group by 、having、order by 那么他们的顺序是 group by 、having、order by 。
3)在选择列中如果有列、表达式和聚合函数,那么这些列和表达式必须有一个出现在 group by 子句中,否则就会出错。
SELECT avg(a.sal), max(a.sal),a.deptno,a.job FROM emp a group by a.deptno, a.job;这边的 deptno 和 job 必须都要 出现在 group by 中。原因为聚合函数 每次返回一个结果
Oracle基础(四):单表查询
标签:order by group by having where条件 聚合函数
热心网友
时间:2022-04-07 22:08
在Oracle数据库中,外键是强制实施参照完整性的一种方式,我们约定主键表为主表,外键表为从表,使用外键就意味着一个表中的值在另一个表中也必须出现,指挥在修改时受到影响,在查询时是不受影响的。
或者在查询时也可以禁用外键,语法参考:
热心网友
时间:2022-04-07 23:26
正确答案应该是不受影响的
oracle 单表查询受外键影响吗?
在Oracle数据库中,外键是强制实施参照完整性的一种方式,我们约定主键表为主表,外键表为从表,使用外键就意味着一个表中的值在另一个表中也必须出现,指挥在修改时受到影响,在查询时是不受影响的。或者在查询时也可以禁用外键,语法参考:
oracle里的外键是不是影响效率,影响到什么程度
肯定影响啊。插入数据的时候,要去B表查看,该数据是否存在于B表,删除B表数据的时候,要查看外头时候有关联中的数据。虽然这些都是oracle系统管理的,但是想想就知道需要资源,如果B表中的数据比较多,那么查找就慢,同样的删除的时候,关联的表数据要是多,也会影响,关联的表越多越影响。
oracle中 主键和外键是什么意思?什么地方采用呢?
主键就是区别这个表的唯一关键字 比如一个学生表 学号不能重复且唯一 学号就是关键字 外键就是跟其他表联系的字段 还是比如有一张学生表 还有一张选课表 这个时候要修改学生表中的学号 选课表里对应的就也得变 这样就需要给选课表加学号作为外键约束 这样当你修改 学号时 所有外键关联的就都改了 ...
oracle中外键对表的修改、删除、插入会有怎么样的印象。 外键是从另...
1、外键的概念:外键是关系数据库三个完整性的五个约束条件之一,是表与表之间建立的一种关系。在Oracle数据库的scott/tiger用户中,表Dept和Emp通过外键进行了关联。在这里Dept表叫主表,Emp表叫从表,外键是字段Deptno。2、加入外键的条件:a、两个表有相同属性字段,取值范围相同;b、外键在主表中...
oracle的外键怎么使用?
2、所以,外键只是辅助,并不能起到你说的【B.NAME是否也自动出现张三两个字】。3、外键的作用是能够避免如下情况。如 【班级信息表】存放的是班级信息表。【学生表】存放的是学生信息,包含班级信息。这个时候 在【学生表】中存放的班级信息应该在【班级信息表】存在才合法,自己人为控制的话难免有...
小议Oracle外键约束修改行为(一)
Oracle的外键用来限制子表中参考的字段的值 必须在主表中存在 而且在主表的记录发生变化导致外键参考唯一约束值发生了变化时 定义了一系列的动作 在SQL 标准中定义了几种外键改变后 如何处理子表记录的动作 其中包括 限制Restrict 这种方式不允许对被参考的记录的键值执行更新或删除的操作 置为空Set to...
oracle 为什么查询数据很快 但是插入数据很慢
跟索引关系不大 看看你这个表有没有外键吧 我之前的项目里就出现过这个情况,一个记录INSERT很慢,后来定位是外键的问题,把 FK去掉之后,速度可是瞬间完成。只不过去掉外键也有可能造成数据异常,这个需要应用程序来做部分的保证了!
多表连接查询和多次单表查询哪个效率高?为什么?
不知道有没有注意到,debug所打印出来的多表联合查询, 都是拆分为“单个表查询”,然后使用PHP处理的。 Happy coding :-) 是做表连接查询还是做分解查询要具体情况具体分析。 如果数据库的结构合理,索引设计得当,表连接的效率要高于分解查询。比如,在有外键的时候,数据库可以为外键建表并建立索引从而提升多个表连接...
“oracle主键、外键、主键约束、唯一约束”这几个词语如何理解?
主键:就是这个表的目录,以方便你查询、更新等等,既然是“目录”,所以不可能有重复的定义出现,所以也就自动有一个主键约束。外键:就是这个表外在的约束,要求某一列值,必须与外面的某一数据相符 ,是表与表之间数据的约束 。主键约束 :就是要求,主键不能重复,才可以生成“目录”。唯一约束 ...
oracle怎么查看外键在哪个表
如果不了解表之间的关系,可以通过以下语句查询到外键是建在哪张表上的:select * from dba_constraints where constraint_name='xxx' and constraint_type = 'R';例如:我的程序日志中报如下错误,我要知道外键是在那个表上.2015-09-08 18:28:18 [ main:261597003 ] - [ ERROR ] java.sql....