过滤和排序数据

我们继续这一节的学习,上一节我们学习了基本的SELECT语句,我们能查询一列或者几列,from一个表,这是最基本的一个操作,这一节我们开始学习第二节,叫过滤和排序数据,过滤和排序数据,通过本节我们可以学习哪些内容,在查询中过滤行,相当于我们查询信息的时候,不要所有的数据,我加入一些条件,只要其中某些条数的数据,比如说,90部门的,100号部门的,或者工资大于1000的,这样加入一些条件,加入过滤,另一个在查询中对列进行一个排序,我们查询到的数据,如果有多条的话,我按照其中某一列的,指定的顺序进行排列,比如说按照员工的ID,从小到大,从大到小,再或者按照员工来公司的一个日期,从前往后,这都是一个顺序,这是我们这一节要讲诉的两个知识点,那我们下面就直接进行学习,我们直接以PL/SQL Dev进来

大家这个前提你们要注意,在计算机把服务给开启,我这里已经开启了,我就可以使用scott用户来登陆,orcl这个数据库,在这里我们显示已经登陆成功,开启一个Command Window,这个ed我们来这里编写,我们上节课学习了select employee_id,last_name,from employees;这是最基本的一个操作,我们就能将empoyees这个表,我们打开My Object,将Employees表当中的,两个列的所有数据打出来,107条记录,什么叫过滤呢,就是在from的后面,关键字where,比如我查询,查询什么,我们刚才那个员工,employee_id大于200的select employee_id,last_name from employees where employee_id > 200;看看谁的employee_id大于200的

只有这样6个人,同样的我们还可以查询,员工的工资,salary大于5000select employee_id,last_name,salary from employees where salary > 5000

比较简单吧,你根据你的需要来写,你还可以再写一下,当然在employees这个表里面一定得有department_id这一列,90号部门的

这三个人,这里大家需要注意一点,就是你要查询的这个列,他不一定是你加了这个过滤条件的这个列,他不一定是你要查询的这个列,你可以写,你也可以不写,但是这个列和你要查询的这三个列,一定是存在于employees这个表的,这是毫无疑问的,要不就没法使用这个过滤条件了,这个大家应该都清楚,这里需要说的是,我们往下走,字符和日期要包含在单引号之内,在上一节我们稍微给大家提了一下,说字符和日期如果你要表示的话,要用单引号给他括起来,我们在这给大家说明一下,我们看这个图,这是公司里面的一些员工,我们现在假设要查一下,Higgins,我想查一下这个人的信息,那你就可以这样写,用一个单引号括起来,我们JAVA当中字符串使用的是双引号,在SQL中使用的是单引号,请注意,而且SQL不区分大小写,指的是什么,外面的这些是不区分大小写的,但是如果一旦作为字符串出现的话,那就严格区分大小写

我们看一下这个叫Higgins这个人的信息,就这一条

如果你这里一不小心写成了小写,你再来看,就出不来了,说明他是区分大小写的

在字符串字符,或者日期函数这里面,那如果你想查询公司哪一天的员工都有谁,我先看一下公司员工都有哪些hire_dateselect last_name,hire_date from employees;有这样一些日期

那一天来的都有谁,我们select last_name,hire_date from employees where hire_date = '1994/6/7';加上一个过滤条件,hire_date用一个单引号括起来,后面这个格式怎么写,是我们非常需要关注的,你看他现在是这样写的

我们要是这样搜索的话

文字和类型不匹配,这个还是挺恶心的,这里就涉及到一个本地化的问题了,要按照这种格式

select last_name,hire_date from employees where hire_date = '7-6月-1994';我们看一下

这种格式书写才行,实际上这个,你不需要给他记忆,我们后面会讲的单行函数,在单行行数里面,设计到hire_date和字符之间的一个转换,比如说,我就想查询94年6月7号来的,来的人都有哪些,这样理解一旦有一个操作失误的话,可能这个结果就出不来了,比如你这里一不小心加了一个0select last_name,hire_date from employees where hire_date = '07-06月-1994';

这种格式我们就抛弃了,下一节当中我们讲怎么写,或者我们在这给大家做一个了解,相当于我们把hire_date,给他转化成一个字符串,按照这种格式来转化,转化完以后,1994-06-07select last_name,hire_date from employees where to_char(hire_date,'yyyy-mm-dd') = '1994-06-07';

这一天的话就可以

我们以后写的话是这样来写,抛弃这种写法,现在先了解一下我们使用where,可以加入过滤条件的,格式加date型也是要加单引号的,就可以了,希望注意这个,再往后,在这里我们涉及到过滤条件可以用哪些,操作符,这个很简单吧,大于小于,需要注意的是,我们这里的等号,等于是用的一个等号来表示,JAVA里面用的是双等号,单等号表示赋值,这个是需要你注意的,另外不等于符号,你既可以跟JAVA一样,!=,也可以使用<>,也行,赋值符号是:=,这个我们在SQL里面暂时还接触不到,等学到PL/SQL的时候,我们有了变量了,就可以给变量来赋值,用的就是他,现在大家了解一下就可以了,这几个符号都不难,大家应该都了解,我们给大家写一个吧

比如说,员工的工资,salary大于等于4000select last_name,hire_date from employees where salary >= 4000 and salary < 7000;我们马上就要学连接符,再加一个and,salary小于7000,这一看都明白吧

含4000,不含7000,我这里把工资给打出来select last_name,hire_date,salary from employees where salary >= 4000 and salary < 7000;

他们的工资是满足大于等于4000,且小于7000的,就是这个符号,这个我们就不用多说了,直接往后走,其他的比较运算符,我们分别来讲一下,第一个叫between and,在两个值之间,他这里加了一个括号,说包含边界,也就是between,工资5000到7000,含5000,并且含7000,这是我们刚才操作的这个,我们4000到7000看一下,20个人,这里边既有4000的,也有7000的,那我们现在使用between and实现一下,select last_name,hire_date,salary from employees where salary between 4000 and 7000

我们看一下这个结果,如果也是20条的话,意味着这个确实是包含边界的,如果不到20,那肯定就是不含边界的,我们看一下结果,是20条,所以between and是含边界的,他表示在这两个值之间,且含边界,这是between and,下一个概念叫,in,下一个关键字叫in,in是什么意思,我们给大家说一下,这里我们讲in,where,我们现在这样写,我们刚才查了90号部门,我们之前是这样写的select last_name,hire_date,salary from employees where department_id = 90;我们这里就不加分号了,在外边去加分号,一共有三个人,现在我想查询这个事,说员工在92号部门,或者是在80号部门,再或者是在70号部门,这个应该怎么写,我们一会结合我们要讲的连接符,大家想到了可以这样写select last_name,hire_date,salary from employees where department_id=90 or department_id=80 or department_id=70;

这样来表示,是这三个部门其中之一就可以,我在这里加上一个department_idselect last_name,department_id,salary from employees where department_id=90or department_id=70 or department_id=80

我们看一下,刚才列出来38条记录,都是70号,80号,90号部门的,一共是38条记录,那我们可以像刚才那样的写法,or来连接,也可以使用in,使用in的话就这样写,where department_id,不用等号,in,我用一个小括号括起来,里面写上70,80,90select last_name,department_id,salary from employees where department_id in(70,80,90);

就是department_id要等于的值,跟上面注掉的语句是完全一样的,我们这样的写法相当于是一个简略的一个写法,同样的是38条记录,和刚才我们说的between and,是两种不同的方式,这个in里面仅仅是取这几个值,而between and呢,这个值和这个值之间都算上,这个需要大家注意,尤其是一些离散的值的话,你可以选择用in,如果是一些连续的值,温度多少度到多少度之间的,你不可能把所有的值都写上来,因为有可能还有小数,这个就是无穷无尽的,就是对于无限字段数的话,你还是用between and,如果就这么几个值,就用in就可以了,有限个值的时候用in就可以了,这是我们说的between and和in,后边还有一个叫like,或者叫模糊查询,就是像这个的,什么什么,我们举个例子,你看我们现在这么多员工有名字,我现在想查询这么一个事,叫做模糊查询,查询个什么事,我想查询一下,在公司工作的员工当中,名字含有a的都有谁,名字含有a的,我们就可以使用and,员工中名字含有a的有哪些,这个写法我们就得这样,只要是涉及到一些条件的,都要考虑要过滤,所以这里要用到where,那这个where我们是紧跟着from的,比如我们后面要讲orderby排序,order by 排序的话,这是需要注意的,from和where这两个比较亲密,得挨着,from employees where,名字中含有a的,就是last_name,我们用的叫like,既然是字符了,肯定是单引号,怎么表示含有a,我们使用的是百分号%,百分号意味着,在我们写的a的字符前面,是有可能含有多个字符的,至于说是什么,我不管,那么含有的个数,是从0个开始到无穷多个的,那名字中含有a,那是不是要在后边再加个百分号select last_name,department_id,salary from employees where last_name like '%a%'

就是名字含有a,后边a可能没有了,那他就是最末尾的一个值,没有关系,也是包含的,一共是52条记录,大家你看一下,这些名字当中是一定是含有a的,一定是含a的,像这个他的末位是a,没有问题,这是我们说的百分号,如果你要是把后面这个去了,就意味着员工中名字末位是字符a的员工select last_name,department_id,salary from employees where last_name like '%a'

最后一个是a,只有这样四个人

这四条记录肯定是也包含在刚才52条记录里的,好了,我们接着说,这里说的是含a,百分号是说从0个开始到无穷多个都行,现在我再想谈个事,员工中名字的第二位是字符a的员工有哪些select last_name,department_id,salary from employees where last_name like '_a'名字第二位是字符a,你现在这个百分号肯定是不合适的,我们用什么表示,我们用下划线,一个下划线表示一个字符,那么第二个字符是a,后面含有不确定多个

33个人第二个字符是a,如果第三个字符是a,那就加两个下划线select last_name,department_id,salary from employees where last_name like '__a';

大家注意,两个下划线,这是两个,不要画蛇添足,中间加一个空格,这成啥了,这就成了第二个字符是空格,且第四个字符是a的呢,select last_name,department_id,salary from employees where last_name like '_ _a';所以说前两个你得让他连起来,表示第三个字符是a

这两个人的last_name是一样的,但是first_name不一样,这是需要大家注意的一点,然后我们再说一个事,这个下划线刚才说了,表示一个字符的意思,你再加一个表示第四个字符是a的员工有哪些select last_name,department_id,salary from employees where last_name like '___a';那你假设说有这样一种情况,如果有一个员工的名字就是有一个含有下划线的,员工的名字中含有_的员工有哪些他名字就是下划线,现在我们这个表里是没有含下划线的,我生成一个,比如我这里面最后一个人,我把他的名字给改一下,把他的名字中含有下划线,这个操作我们在后面会讲,这里你仅仅看一下就可以了update employees set last_name = 'Wha_len' where last_name = 'Whalen';

名字中含有下划线的名字有哪些,那你要是那样说的话,那写法是不是应该是这样的,名字中含有下划线的,这样是你想说的

但是你这样写的话出来107条记录,因为此时他表示的是一个字符,相当于这个名字中只要有字符就行,他不是表示的下划线,这肯定不行的,如何让下划线不让他表示一个字符,就本身下划线的意思呢,需要一个转义字符,转义字符怎么写select last_name,department_id,salary from employees where last_name like '%\_%' escape '\';

大家看,这个时候是不是查询出来了,这个就是我们要讲的转义字符,我们通过一个下划线,一个斜杠,一个下划线,这个时候表示下划线是一个转义字符,斜线是一个转义字符,此时的下划线就是一个下划线,不再表示特殊的含义,这个你既可以用斜线表示,也可以用井号表示select last_name,department_id,salary from employees where last_name like '%#_%' escape '#';他就是一个转义字符

转义字符让下划线不再是特殊的含义,我们说的叫like,三个说完了,我们再说第四个,IS NULL,说他是空的,这个怎么来理解呢,我们在这个表当中有一个列,是有空值的,空值如果参与到运算的话,结果也是空值,当时哪个变量是空,commission_pct,这个叫员工的奖金率,他有可能是空的,那我们就把空的给查询出来select last_name,department_id,salary from employees where commission_pct is null

看一下,72条记录,这些员工的commission_pct都是空的,没有问题,他们都是空的,如果你想查询不是空的

都是非空的,35条,35加72,正好等于107,就是这个意思

讲的逻辑关系,其实刚才我们已经用到了,or表示叫逻辑或,not表示逻辑否,and表示逻辑并,这个我们再举一个例子

我现在想查询这个事,查询公司当中,部门是80号部门,工资小于5000的,是80号部门的,where department_id=80,并且and,salary小于等于5000的

没有人

没有人我们给他改一改,8000

部门员工的薪资相对比较高,最低的你看6100,那我们接着往下说,这里有一个叫优先级,刚才我们说了算数的加减乘除,连接,比较,还有between and,这个大家你了解一下就完了,我觉得你去记忆他意义也不大,如果你想让一些运算混合起来,想让哪个先算,哪个后算,想让先算的你加小括号就完了,也不建议你全用上,这个你了解一下就可以了

排序叫order by,这也是一组关键字,关键字,我们来写一下,假设我们现在想做这个事,我想查询一下80号部门员工的工资,按照工资从高往低排,从高往低排,你就加一个过滤条件,然后排序,order by salary,按照工资排select last_name,department_id,salary from employees where department_id=80 order by salary desc从高往低可以叫desc,可以这样理解,然后简写叫desc,他表示从大到小的顺序

最高是8400,最低是6100,这个就是排序的意思,你也可以让他从低往高排,叫ascselect last_name,department_id,salary from employees where department_id=80 order by salary asc

如果你这里如果asc不写的话select last_name,department_id,salary from employees where department_id=80 order by salary

就仅写一个order by,他默认的也是从小到大来排,这个给大家说一下,然后我们再说这样一个事,比如我现在把这个给他干掉select last_name,employee_id,salary from employees order by salary干掉以后,相当于把整个公司的员工工资从高往低排

看一下,整个公司员工的工资,从低往高的,从这里可以看到有些员工的工资是一样,员工的工资都一样,然后其他的不一样,那我就想,除了工资排序以外,剩下的如果出现salary一样的了,我想再定一个排序的列,可不可以,这个是可以的,比如说这样,如果按照工资排序完了以后,如果出现相同了,我们再按照部门来排,如果再相同了,我可以按照名字来排,这就出现三层了,如果你工资一样了,然后我按照你的名字来排,按照名字从高往低的顺序排,你就得这样写,order by salary,这里我们使用asc,同时我们让你按照last_name来排,也是按照asc的顺序select last_name,department_id,salary from employees order by salary asc,last_name asc

大家看一下,如果工资都是10000的这些人,他们的名字就是从低往高,刚才那个时候不是吧,那么这里就实现了这个排序,如果你想这样,想按照工资的从高往低,就把它改成desc就完了select last_name,department_id,salary from employees order by salary desc,last_name asc然后last_name让他从低往高

涉及到多层排序了,先按照你指定的排,如果一样的就按照第二个来排,这就是我们这一节讲的内容,主要就是两个,一个是叫使用where进行过滤,里面我们用到比较运算符,between and,in,like,null,and,or,not,order by 排序,这个也不难,排序这儿,我还可以按照别名来排

这个你一说你就明白了,我现在输出了员工的salary,我还把他一年的工资输出一下,12*salary,然后给他取个别名,我们别名用双引号,也可以省略,annual_salselect last_name,department_id,salary,12*salary "annual_sal" from employees order by annual_salorder by就按我们刚才的annual_sal

这个我加引号了select last_name,department_id,salargy, 12*salary annual_sal order by annual_sal是这样,我把引号去了

annual_sal从低往高的顺序排序,就是说可以使用别名,来进行排序,就是这个意思

 


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部