emp表格字段解释:
EMPNO: 员工编号 ENAME:员工姓名 JOB:工种 MGR:员工上级部门编号 HIREDATE: 员工入职日期 SAL: 员工月薪 COMM: 员工奖金 DEPTNO:员工部门编号
第一篇:SELECT(查询)
一、查询列
(一)语法
1、语法格式概述:
select distinct *|字段1|表达式1 as 别名1,字段2|表达式2 as 别名2 from 表 表别名;
-->1、查询某个表中所有行信息
SELECT * FROM 表名;
-->2、查询某个表指定列的信息
SELECT 列名 FROM 表名;
-->3、查询某个表中某两列
SELECT 列名1,列名2 FROM 表名;
-->4、去除重复记录
SELECT distinct 列名 FROM 表名;
-->5、查询表达式
SELECT 表达式 FROM 表名;
-->6、使用别名
SELECT xxx as 别名 FROM 表名 表别名
oracle 命令不区分大小写(SELECT 与 select), 如下代码仅大小不同但表达相同含义
select * from dept;
SELECT * FROM EMP;
(二)实战练习
1、查部分列
select ename from emp; --查询雇员姓名列
--2)、检索多个列
--查询部门表的deptno,dname, loc 字段的数据
select deptno,dname,loc from dept;
--以下查询的数据顺序不同(查询的字段顺序代表数据顺序)
select loc,dname,deptno from dept;
select deptno,dname,loc from dept;
2、查所有列
--查询部门的所有信息
select * from dept;
--2)、检索所有列2
--查询部门的所有信息
select deptno,dname,loc from dept;
3、去重:distinct
--去重
select distinct deptno from emp;
4、别名
select ename as "雇员 姓名" from emp;
select ename "雇员姓名" from emp;
select ename 雇员姓名 from emp;
select ename as 雇员姓名 from emp;
select ename as " Ename" from emp;
5、字符串
select 'my' from emp;
select ename||'a'||'-->' info from emp;
6、伪列
--select distinct 123*456 from emp;--整数伪列:123*456
--select ename,sal,sal*12 from emp;--表达式伪列:sal*12
select empno, 1*2 as count,'cmj' as name,deptno from emp;
运行结果:
7、null
--(1)判断是否为null:is null / is not null(错误写法:!=null / =null)
-- 函数nvl(参数1,参数2) 的使用说明:
对null值判断:如果“参数1”为null,那么函数返回结果是“参数2”的值,否则返回结果是“参数1”的值。下面仅用条件表达式帮助记忆:(参数1 is null) ? 参数2:参数1,实际代码不这样写。
-- 例如下面代码判断员工原本奖金是否为null:
select ename,NVL(comm, -1) from emp;
运行结果:
--nvl() 小练习
--查询所有员工的名字, 工种, 年薪(不带奖金)
select ename,job,sal*12 from emp;
上述代码运行结果:
--查询所有员工的名字,工种,年薪(带12个月奖金)
select ename,job,(sal+nvl(comm,0))*12 from emp;
上述代码运行结果:
--查询所有员工的名字,工种,年薪(带6个月奖金)
select ename,job,(sal+nvl(comm,0))*12 from emp;
上述代码运行结果:
--查询所有员工的名字, 工种, 年薪(带一次奖金)
select ename,job,sal*12+nvl(comm,0) from emp;
上述代码运行结果:
8、decode判定
--判定函数 : decode(判定字段,值1,结果1,值2,结果2....,默认值)
--函数使用说明:对判定字段的值进行判定,如果值为值1,函数的结果为结果1,与值2相等,函数的结果为结果2...,否则取默认值,默认值可缺省。
--练习题:
--给每个部门后后面添加一个伪列,如果10部门,20部门,30部门...,伪列显示为十,二十,三十...
--思路1:
select deptno,dname,loc,decode(deptno,10,'十',20,'二十',30,'三十',40,'四十') 部门 from dept;
上述代码运行结果:
select deptno,dname,loc,decode(deptno,10,'十',20,'二十',30,'三十','无') 部门 from dept;
上述代码运行结果:
--思路2:case when then else end
select deptno,dname,loc,(case deptno when 10 then '十' when 20 then '二十' else '无' end) from dept;
上述代码运行结果:
二、查询行
--(一)条件查询
--1、语法:select What from Source where Filter ----->hang行过滤条件
--1)其中What代表:你要查询什么数据内容,在代码中可按自己的表信息来写此部分内容
--2)其中Source代表:你所要查询内容的来源,在代码中可按自己的表信息来写此部分内容
--3)其中 Filter代表:你所要查询内容的过滤条件,一般放置条件判断操作符,在代码中可按自己的表信息来写此部分内容。
--2、执行流程:from--->where ----->select
--3、多条件间连接符
--(1)逻辑连接符:
条件1 and条件2(既满足条件1又满足条件2) 、 or 、 not
--(2)区间判断两种方法:
--1):条件1 and 条件2;
--2):between 值1 and 值2;
--4、条件判断操作符:
(1)关系运算符:
--等于:= --不等于:!= 或者 <> --大于:>
--小于:< --小于等于:<= --大于等于:>=
(2)集合操作符:
Union、Union All、Intersect、Minus
--查询工资大于1500 或 含有佣金的人员姓名
--union 去除重复行
select ename from emp where sal>1500
union
select ename from emp where comm is not null;
-- union all 不去除重复行
select ename from emp where sal>1500
union all
select ename from emp where comm is not null;
--查询显示不存在雇员的所有部门号。
select deptno from dept
minus
select distinct deptno from emp
--查询工资大于1500 且 含有佣金的人员姓名
select ename,sal,comm from emp where sal>1500 intersect
select ename,sal,comm from emp where comm is not null;
(3)like:模糊查询操作符
--查询员工姓名中包含字符A的员工信息
select * from emp where ename like '%A%';
--查询员工姓名中包含第二个A的员工名称信息
select * from emp where ename like '_A%';
--查询员工姓名中包含字符%的员工名称 岗位 工资 部门编号
select ename,job,sal,deptno from emp where ename like '%a%%' escape('a');
(4)in、exists精准查询操作符
--in
select * from emp where sal in(900,800);
--子查询(查询中再有查询) in 只能存在一个字段
select * from emp where sal in (select sal from emp e where deptno=10);
--10或30部门的雇员信息
select * from emp where deptno in(10,30);
--exists
--select What from Source Where exists (data);
--若data is not null 则每一条被查询的What都会被保留,否则全都不保留。
-- 查询所有员工数据
select * from emp where exists (select * from emp where comm is not null);
--分析:(select * from emp where comm is not null)运行后is not null,则前面每一条查询结果都被保留
--上述情况不能满足对数据的筛选功能,所以一般会在data里写入限定条件进行限制,这样就达到筛选目的。
-- 例:查询10,30部门 的员工信息
select * from emp where exists (select * from dept where deptno in (10,30) and dept.deptno = emp.deptno);
(7)获取所有行记录
select * from emp;
select * from emp where 1=1 ;
select * from emp where ename like '%';
--5、代码练习
--(1)查询20部门的员工信息
--What:员工信息 *
--Source:员工表 emp
--Filter:部门编号deptno =20
--具体代码如下:
select * from emp where deptno = 20;
--(2)查询工资大于1000的员工姓名、工作岗位、工资、所属部门编号
select ename,job,sal,deptno from emp where sal > 1000;
--(3)查询不在 20 部门工作的员工信息3种写法
select * from emp where deptno != 20;
select * from emp where deptno <> 20;
select * from emp where not deptno = 20;
--(4)查询员工的年薪大于20000的员工名称,岗位,年薪
--思路(1:先过滤后查询
select ename,job,sal*12 from emp where sal*12 > 20000;
--思路(2:把sal*12用别名替换
--注意:在where后不能使用别名,因为执行流程是from--->where ----->select
--如下报错:
select ename,job,sal*12 n from emp where n > 20000;
--解决办法:先查询后过滤
select ename,job,sal*12 r from emp;
select * from (select ename,job,sal*12 r from emp) where r>20000;
--(5)查询 any(任意一个) some(任意一个) all(所有)
--1)查询比我们三个人工资都高的那些员工的信息:900,1000,1100
select * from emp where sal > all(900,1000,1100);
--2)查询工资比我们三个人都低的那些员工的信息
select * from emp where sal < all(900,1000,1100);
--3)查询工资比我们随便一个人工资高的员工的信息
select * from emp where sal > some(900,1000,1100);
select * from emp where sal > any(900,1000,1100);
--(6)查询工资比我们随便一个人工资低的员工的信息
select * from emp where sal < some(900,1000,1100);
--(7)查询 工种为'SALESMAN'的员工信息(区分大小写)
select * from emp where job = 'SALESMAN';
--(8)检索工资2000,3000员工的名称,岗位,工资
select ename,job,sal from emp where sal=2000 or sal=3000;
--(9)工资在2000到3000之间的员工信息
select * from emp where sal between 2000 and 3000;
select * from emp where sal >=2000 and sal <=3000;
--(10)查询岗位为 CLERK 且部门编号为20的员工名称,部门编号,工资
select ename,deptno,sal from emp where job='CLERK' and deptno = 20;
--(11)查询岗位为 CLERK 或部门编号为20的员工名称,部门编号,工资
select ename,deptno,sal from emp where job='CLERK' or deptno = 20;
--(12)查询岗位不是 CLERK 的员工名称,部门编号,工资
select ename,deptno,sal from emp where job != 'CLERK';
select ename,deptno,sal from emp where job <> 'CLERK'
select ename,deptno,sal from emp where not job='CLERK';
--(13)查询岗位不是 CLERK 并且部门编号为不20的员工名称,部门编号,工资
select ename,deptno,sal from emp where job!='CLERK' and deptno != 20;
select ename,deptno,sal from emp where not (job='CLERK' or deptno = 20);
--(14)存在佣奖金comm的员工名称
--判断是否为null用:is / is not
--若用= / !=则报错,如下代码报错:
select ename from emp where comm != null ;--用!=报错
--改正
select ename from emp where comm is not null;
--(15)不存在奖金的员工名称
select ename from emp where comm is null;