oracle基础(第二节)

数据的筛选 条件筛选
select 具体列,表达式...
from 表
where 条件

进行筛选的基本运算符号:

大于 >
小于 <
等于 =
大于等于(不少于,不低于)  >=
小于等于(不多于,不高于)  <=
不等于 != 或者 <> (个人推荐使用第2种写法)

--查询月薪高于2000的员工的姓名和其月薪

select ename, sal
from emp
where sal > 2000;

--查询员工SMITH的员工信息
--关键字,表名,列名:大小写是不敏感(随意写)
--数据:大小写是敏感(不能随意写)

select *
fRom emp
where ename = 'SMITH'

--查询不在20号部门工作的员工信息

select *
from emp
where deptno <> 20;

--查询在20号部门工作并且月薪高于2000的员工信息

select *  from emp where deptno = 20 and sal > 2000;

--查询职位是MANAGER或者月薪不低于3000的员工信息

select * from emp where job = 'MANAGER' or sal >= 3000;

--查询在10号部门工作月薪低于2000并且职位不是CLERK的员工信息

select * from emp where deptno = 10 and sal < 2000 and job <> 'CLERK'

--查询在10号部门工作或(20号部门工作并且月薪不低于1500)的员工信息
--and的优先级要高于or 如果两者混合使用,需要注意优先级的问题
--加括号解决优先级问题

select * from emp where (deptno = 10 or deptno = 20) and sal >= 1500;

--SQL注入:利用了and的优先级高于or完成无密码进行登录

select * from haha where lname = 'xxxx' and lpass = '' or lname = 'admin';

--SQL片段:通过在密码框中输入下方的SQL片段,更改了原有SQL语句的逻辑 ' or lname = 'admin --or前的逻辑:账号随意,密码为空 (登录失败) --or后的逻辑:用户名是admin的账号 (调取了admin的信息)

课后练习

--1.查询10号部门职位是MANAGER的员工信息

select *
from emp
where deptno = 10 and job = 'MANAGER';

--2.查询月薪低于2000或月薪高于3000的员工信息

select *
from emp
where sal < 2000 or sal > 3000

--3.查询员工编号是7902的员工的所有下属的员工信息

select *
from emp
where mgr = 7902

--4.查询职位是CLERK或SALESMAN,并且月薪不低于1000的员工信息

select *
from emp
where (job = 'CLERK' or job = 'SALESMAN') and sal >= 1000;

--5.查询月收入不低于2500的员工信息

select *
from emp
where (sal+nvl(comm,0)) >= 2500;

--不能使用列别名在where中进行筛选
--原因是:SQL语句的执行顺序
--书写: select...from...where...
--执行: from...where...select...
--在执行where语句时,select语句还没有执行,此时列别名还没有生成出来,所以不能使用

--6.查询30号部门年收入低于10000的员工信息

select *
from emp
where deptno = 30 and (sal+nvl(comm,0))*12 < 10000;

--7.查询员工SCOTT的月薪,奖金和月收入

select sal,comm, sal+nvl(comm,0)
from emp
where ename = 'SCOTT';

--8.查询在1982年之前入职的员工信息(选做)

select *
from emp
where hiredate < '01-1月-82';

select *
from emp
where hiredate >= '01-1月-82' and hiredate < '01-1月-83';

特殊的运算符号

1.between A and B 运算符 (在A与B之间,包含A和B)

--相当于 >= A and <= B
--查询月薪在1000-2000区间的员工信息

①select *
from emp
where sal >= 1000 and sal <= 2000;

②select *
from emp
where sal between 1000 and 2000;

--82年入职的员工

select *
from emp
where hiredate between '01-1月-82' and '31-12月-82';
--2.(重点)实现模糊查询"like"

--like '特定字符'
-- 特定字符:由转义字符和搜索文本组成
-- 转义字符: %: 0-n个字符(任意长度的任意字符)
-- : 1个字符(1个长度的任意字符)
-- 比如 姓李 特定字符的写法 '李%'
-- 第二个字符是哈 特定字符的写法 '
哈%'

--查询员工名字首字母是S的员工

select *
from emp
where ename like 'S%';

--查询名字中倒数第2个字符是T的员工

select *
from emp
where ename like '%T_';

--查询名字中包含字母T的员工

select *
from emp
where ename like '%T%';

--查询名字中包含两个字母T的员工

select *
from emp
where ename like '%T%T%';

--查询有两个连续的T

select *
from emp
where ename like '%TT%';

--查询名字中有%字符的员工
--声明标识字符

select *
from emp
where ename like '%\%%' escape '\';

select *
from emp
where ename like '%(%%' escape '(';
--3.in(A,B,C...)

--相当于 = A or = B or = C...

--查询在10号部门或20号部门工作的员工

select *
from emp
where deptno = 10 or deptno = 20;

select *
from emp
where deptno in(10,20);

--查询在10号部门工作或月薪高于1200的员工

select *
from emp
where deptno = 10 or sal > 1200
--4.查询没有奖金的员工(null)的员工

-- = null 无法筛选任何数据

select *
from emp
where comm = null;

-- is null 筛选null值

select *
from emp
where comm is null;
--5.对于特殊运算符取反 NOT

-- not between A and B 不在A与B区间内
-- not like '%A%' 名字里面没有A
-- not in(A,B,C) 不是A,B,C其中之一
-- is not null 不为null

--查询月薪不在1000-2000区间内并且名字中不包含字母T的员工信息

select *
from emp
where (sal not between 1000 and 2000) and (ename not like '%T%')

--数据的排序

--order by 列名 或 列别名 或 表达式 或 列序号
--ASC 升序 由小到大
--DESC 降序 由大到小
--不写 默认是升序

--##书写顺序:select...from...where...order by...
--##执行顺序:from...where...select...order by...

--查询所有员工的信息,按照月薪的升序排序

select *
from emp
order by sal asc;

--再按照月薪的降序排序

select *
from emp
order by sal desc;

--利用表达式排序

select ename,sal,comm, (sal+nvl(comm,0))*12 as income
from emp
order by (sal+nvl(comm,0))*12 desc;

--利用列别名进行排序

select ename,sal,comm, (sal+nvl(comm,0))*12 as income
from emp
order by income desc;

--利用列序号进行排序(第4列)

select ename,sal,comm, (sal+nvl(comm,0))*12 as income
from emp
order by 4 desc;

--排序的原则:
--1.数值按照数值的大小
--2.文本按照字典顺序

select *
from emp
order by ename;

--3.日期按照未来的大

select *
from emp
order by hiredate;

--#####order by 可以修饰多个列
-- ##order by A, B 先A的升序排序,如果A相同,再按B的升序排序
-- ##order by A desc, B desc 先A的降序排序,如果A相同,再按B的降序排序

--查询月薪高于1000的员工,按照部门的升序排序,再按照入职日期降序排序

select *
from emp
where sal > 1000
order by deptno asc, hiredate desc;

--推荐在order by中使用列名或列别名

课后练习

--1.查询名字中包含字母T,并且月薪在1500-3000之间的员工姓名和月薪

select ename, sal
from emp
where ename like '%T%' and sal between 1500 and 3000;

--2.查询公司的BOSS信息(mgr值为null的人)

select *
from emp
where mgr is null;

--3.查询员工姓名,月薪,奖金,年收入,按照年收入降序进行排序显示

select ename, sal, comm, (sal+nvl(comm, 0))*12 as income
from emp
order by income desc;

--4.查询职位中包含MAN并且有奖金收入(不是null不是0)的员工信息

select *
from emp
where job like '%MAN%' and comm > 0;

-- in中出现null,查询就没有结果
-- not in(A,B,C,D...)  A,B,C,D...值中不能出现null值,否则没有查询结果
-- X not in(null,25)  X!=null or X!=25

--5.查询在在1981年期间入职的员工信息,并按照月薪降序排序

select *
from emp
where hiredate between '01-1月-81' and '31-12月-81'
order by sal desc;

--6.查询员工信息,并按照职位升序,部门升序进行排序显示

select *
from emp
order by job asc, deptno asc;

--7.查询不在10号或20号部门工作,月薪低于1500的员工信息

select *
from emp
where deptno not in(10,20) and sal < 1500;

--8.查询所有的职位名称,去掉重复后按照名称的升序排序显示

select distinct job
from emp
order by job asc;

--9.查询员工SCOTT和ADAMS的员工信息

select *
from emp
where ename in('SCOTT','ADAMS');

--10.查询年收入高于45000的员工信息,并按照年收入降序排序显示

select ename, sal, comm, (sal+nvl(comm, 0))*12 as income
from emp
where (sal+nvl(comm, 0))*12 > 15000
order by income desc;

你可能感兴趣的:(oracle基础(第二节))