第二章:排序和限制查询
一、排序
1.排序:所谓排序,就是根据某个字段的值按照升序或者降序的情况将记录查询出来 语法: select col_name,... from tb_name order by col_name [asc|desc],... 注意:1.排序使用order by字句,该子句只对查询记录显示调整,并不改变查询结果,所以执行权最低,即最后执行。 2.排序关键词: asc:升序(默认,默认的意思是不加关键词的时候默认为升序排序) desc:降序 3.如果有多个列排序,后面的列排序的前提是前面的列排好序以后有重复(相同)的值。 例子: id id2 1 2 2 3 3 4 4 1 4 2 语句: select id,id2 from test order by id,id2 desc; 结果: id id2 1 2 2 3 3 4 4 2 4 1 注意:先排第一列,如果第一列有重复的值再排第二列,以此类推需求:查看员工的id,名字和薪资,按照薪资的降序排序显示。
首先查看没有排序的序列:
SQL> select id,salary from s_emp where rownum<=10;结果如下所示,在语句中 where rownum<=10的意思是取数据库中s_emp表的前10行:
排序后的结果如下所示:
SQL> select id,salary from s_emp where rownum<=10 order by salary desc;4.order by 后面还可以跟数字,表示使用select后面的第几个列进行排序 从1开始数,数字不能大于你所写的列名的个数。 例如: //使用last_name列进行排序 select last_name,salary from s_emp order by 1; //使用salary列进行排序 select last_name,salary from s_emp order by 2; 二、限制查询,即指定查询条件进行查询 语法: select col_name,... from tb_name where col_name 比较操作表达式 逻辑操作符 col_name 比较操作表达式 ... 注意: 1.限制查询条件,使用where子句 2.条件可以多个,使用逻辑操作符和()进行条件的逻辑整合 3.where子句的优先级别最高 4.比较操作表达式由操作符和值组成 常见的操作: 1》逻辑比较操作符 = > < >= <= 2》不等于:三个都表示不等于的意思(经常用的是!=) != <> ^= 需求:查看员工工资小于1000的员工id和名字 select id,last_name,salary from s_emp where salary <= 1100;
结果如下所示:
3》sql比较操作符SQL comparison operators BETWEEN ... AND... IN(list) LIKE IS NULL 1)between and:在什么范围之内 [x,y],是一种闭区间操作 需求:查看员工工资在700 到 1500之间的员工id,和名字 select id,last_name,salary from s_emp where salary between 700 and 1500;
结果如下所示:
也可以在日期列上使用between and操作,但是要看当前session会话的语言环境来决定是使用中文格式的日期还是英文格式的日期 alter session set nls_language='simplified chinese'; 如果是中文的语言环境: 查询在90年3月8号到91年2月9号之间入职的员工信息 SQL>select id,last_name,start_date from s_emp where start_date between '08-3月-90' and '01-1月-91'; 查询last_name字段从Biri到Patel的员工信息 SQL>select id,last_name,start_date from s_emp here last_name between 'Biri' and 'Patel';下面是更改语言环境之后的查询方式 alter session set nls_language=english; 如果是英文的语言环境: 查询在90年3月8号到91年2月9号之间入职的员工信息 SQL>select id,last_name,start_date from s_emp where start_date between '08-MAR-90' and '09-FEB-91'; 2)in(list):在一个列表中 需求:查看员工号1,3,5,7,9员工的工资 SQL>select id,last_name,salary from s_emp where id not in(1,3,5,7,9);
结果如下所示:
需求:查看是在'08-3月-90'或者'09-2月-91'入职的员工信息 select id,last_name,start_date from s_emp where start_date in ('08-3月-90','02-2月-91');需求:查看名字为Ngao或者Smith的员工信息 select id,last_name,salary from s_emp where last_name in ('Ngao','Smith'); 3) like:模糊查询,即值不是精确的值的时候使用 通配符,即可以代替任何内容的符号 % :通配0到多个字符 _ : 当且仅当通配一个字符(下划线) 转义字符: 默认为\,可以指定,指定的时候用escape 符号指明即可,转义字符只能转义后面的一个字符 需求:查看员工名字以C字母开头的员工的id,工资。 select id,last_name,salary from s_emp where last_name like 'C%';
练习:查看员工名字长度不小于5,且第四个字母为n的员工id和工资 select id,last_name,salary from s_emp where last_name like '___n_%'; 需求:查看员工名字中包含一个_的员工id和工资 注意:_是一个特殊字符,所以要转义 select id,last_name,salary from s_emp where last_name like '%/_%' escape '/'; 4)is null:对null值操作特定义的操作符,不能使用= 需求:查看员工提成为空的员工的id和名字 select id,last_name,commission_pct from s_emp where commission_pct is null;
结果如下所示:
4》逻辑操作符 当条件有多个的时候使用 and:且逻辑 or: 或逻辑 注意: not优先级>and优先级>or优先级 not:非逻辑 NOT BETWEEN AND NOT IN NOT LIKE IS NOT NULL(!!!!) 需求:查看员工部门id为41且职位名称为Stock Clerk(存库管理员)的员工id和名字 select id,last_name,dept_id,title from s_emp where dept_id = 41 and title = 'Stock Clerk';
练习:查看员工部门为41 或者 44号部门 且工资大于1000的员工信息 select id,last_name,dept_id,salary from s_emp where salary > 1000 and ( dept_id = 41 or dept_id = 44 ); 查看员工部门为41且工资大于1000 或者 44号部门的员工信息 select id,last_name,dept_id,salary from s_emp where salary > 1000 and dept_id = 41 or dept_id = 44; 需求:查看员工提成不为空的员工信息 select id,last_name,commission_pct from s_emp where commission_pct is not null;
需求:查看员工名字不是以C字母开头的员工信息。
select id,last_name,salary from s_emp where last_name not like 'C%'; 如果集合中含null,不能使用not in操作符,但可以使用in SQL> select * from s_emp where dept_id not in(10,12,41,42,35,null); 结果显示未:未选定行 SQL> select * from s_emp where dept_id in(10,41,42,35,null)结果显示为:则只显示括号中的内容数字内容,null不显示