在字符串字符,或者日期函数这里面,那如果你想查询公司哪一天的员工都有谁,我先看一下公司员工都有哪些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';
比如说,员工的工资,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
排序叫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是这样,我把引号去了