distinct查询
PLSQL基础教程三查询(SELECT)
本节教程将继续介绍SQL基础知识中的SELECT相关的⼀些知识,包括基础语法、多表连接、去重、排序、⼦查询等等SELECT⽅⾯的基础知识。
SELECT是SQL中使⽤的⽐较多的,主要是⽤于筛选数据,获取满⾜某些条件的数据,既可以是单条数据,也可以是多条数据,还可以是统计数据或者分组数据等等,后续教程将会⼀⼀介绍。
基础语法
语法基础
SELECT在SQL中主要是⽤于获取满⾜条件的数据的,期基本的语法格式如下:
SELECT <ITEM_LIST>
FROM <TABLE_LIST>
WHERE <WHERE_CLAUSE>
ORDERBY <ORDER_BY_CLAUSE>
语法格式说明:
SELECT:⽤于查询、筛选数据
FORM:筛选数据的来源(表、视图、⾃查询)
WHERE:筛选数据的过滤条件(⾮必须,根据需要添加)
ORDER BY:⽤于对选择的结果集数据进⾏排序(⾮必须,根据需要添加)
ITEM_LIST:需要选取的对应的数据的列信息
TABLE_LIST:需要选取的数据表,⼀个或者多个,既可以是表,也可以是视图,还可以是⾃查询
WHERE_CLAUSE:获取数据的时候的过滤条件,只选取满⾜条件的数据即可,可以没有条件,即获取所有的数据
ORDER_BY_CLAUSE:结果集的排序条件,可以按照⼀个字段或者多个字段排序
该⽰例使⽤SCOTT⽤户下的EMP员⼯⽤户信息表:
SELECT N.EMPNO, N.ENAME, N.JOB, N.MGR, N.HIREDATE, N.SAL, N.COMM, N.DEPTNO
FROM SCOTT.EMP N
WHERE N.SAL > 2000
ORDERBY N.EMPNO ASC;
以上SQL主要是⽤于获取SCOTT.EMP表中的薪⽔⼤于2000的相关的员⼯信息,并且对获得的结果集按照员⼯编号升序排列
备注:在实际的使⽤中,可以给表或者视图起个别名,例如上例中的SCOTT.EMP表的别名是N,在SELECT中便可以使⽤该别名来代替表名来获得对应的表中的列信息,⽐直接使⽤表名⽅便。
常⽤技巧
DISTINCT
在实际⼯作中,有时可能查询的数据结果集中会存在重复数据,此时可以使⽤DISTINCT关键字来去掉重复记录:
未去掉重复记录 :
SELECT N.ENAME, N.JOB, N.DEPTNO FROM EMP N WHERE N.SAL > 2000;
使⽤DISTINCT关键字去掉重复记录之后的查询:
SELECTDISTINCT N.ENAME, N.JOB, N.DEPTNO FROM EMP N WHERE N.SAL > 2000;
可以看到重复的记录只会显⽰⼀条了。
说明:重复的数据是所有的列数据⼀致,要是有不⼀致的数据列,则不是重复数据。⾮重复数据即使使⽤了DISTINCT之后也不会去掉重复记录。如下图所⽰,:
SELECTDISTINCT N.EMPNO,N.ENAME, N.JOB, N.DEPTNO FROM EMP N WHERE N.SAL > 2000;
如果需要对SELECT的结果集进⾏排序操作,就需要使⽤到ORDER BY关键字了。⼀般ORDER BY是和 ASC(升序)、DESC(降序)⼀起使⽤的,常⽤的排序就这两种,可以按照⼀个字段来排列,也可以按照多个字段排列:
SELECT N.EMPNO, N.ENAME, N.JOB, N.DEPTNO
FROM SCOTT.EMP N
WHERE N.SAL > 2000
pno asc;
上图中的脚本就是对结果集按照员⼯编号升序排列的(降序使⽤DESC)
说明:对于查询的数据量⽐较⼤的操作进⾏排序操作会消耗⼀定的系统资源,影响查询效率,因此在使⽤的时候需要根据实际情况来确定是否需要进⾏排序操作。
和UNION ALL
UNION和UNION ALL都是⽤于将两个或者多个查询的结果集拼接到⼀起的,区别就在于UNION会对组合之后的结果集进⾏排序,去掉重复的记录;⽽UNION ALL不会对结果进⾏排序,如果有重复记录则正常展⽰。
UNION和UNION ALL拼接两个查询的时候需要要求两个或者多个查询结果的结果集的选取的列数和对应的数据类型都需要相同,否则⽆法正常执⾏查询。
UNION和UNION ALL使⽤⽰例,此处使⽤同⼀脚本进⾏测试,便于看出区别:
测试脚本,选取员⼯姓名为“JONES”的⼀条记录:
SELECT N.EMPNO, N.ENAME, N.JOB, N.DEPTNO
FROM SCOTT.EMP N
WHERE N.Ename = 'JONES';
使⽤UNION ALL的效果:
SELECT N.EMPNO, N.ENAME, N.JOB, N.DEPTNO
FROM SCOTT.EMP N
WHERE N.Ename = 'JONES'
UNIONALL
SELECT N.EMPNO, N.ENAME, N.JOB, N.DEPTNO
FROM SCOTT.EMP N
WHERE N.Ename = 'JONES'
可以看到结果出现了两条⼀样的记录,⽽如果同样的脚本使⽤UNION来进⾏拼接的话,则会⾃动去掉重复的记录信息:
SELECT N.EMPNO, N.ENAME, N.JOB, N.DEPTNO
FROM SCOTT.EMP N
WHERE N.Ename = 'JONES'
UNION
SELECT N.EMPNO, N.ENAME, N.JOB, N.DEPTNO
FROM SCOTT.EMP N
WHERE N.Ename = 'JONES'
可以看到使⽤UNION拼接两个相同的SQL,但是结果并不会重复,即UNION会⾃动去掉结果集中重复的记录信息。
什么叫“⼦查询”?⼦查询也是查询的⼀种,就是在⼀个查询结果集中使⽤的位于SELCET、FORM或者WHERE中的局部的查询,可以理解为⼦查询也是⼀个⼩的查询结果集,不过不能单独执⾏⽽已,必须嵌套于某个查询之内。
实际使⽤中,在某个查询语句中,如果需要使⽤⼦查询,则可以使⽤⼩括号 () 将某个查询括起来,作为外部查询的嵌套查询语句,该括号括起来的部分就叫做“⼦查询”
⼦查询也是⼀个⼩的查询结果集,既可以返回多⾏数据,也可以返回单⾏数据。⼀般的,⼦查询可以⽤于SELECT结果列表,也可以⽤在FORM语句中,还可以使⽤在WHERE语句中作为过滤条件使⽤。不同的位置,对于⼦查询的要求也是不同的:
在SELECT列中:
位于SELECT列中的⼦查询,将其结果作为SELECT的⼀个列的值,因此该⼦查询匹配的每⾏结果只能返回⼀个单⼀的值,否则就会值过多错误。例如:
正确⽰例:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。