oricle基础之——SQL第一篇<行查询与列查询>

emp表格

emp表格字段解释:

EMPNO: 员工编号                 ENAME:员工姓名        JOB:工种              MGR:员工上级部门编号      HIREDATE: 员工入职日期      SAL: 员工月薪      COMM: 员工奖金           DEPTNO:员工部门编号  

dept表
salgrade表

第一篇:SELECT(查询)

oracle 命令不区分大小写 (SELECT select) , 存储数据 | 内容 区分大小写

一、查询列

(一)语法

1、语法格式概述:

select distinct *|字段1|表达式1 as 别名1字段2|表达式2 as 别名2 from 表别名

 (1)语法使用说明1:蓝色字体处“ |”等同于“ 或者”,多选一查询;多个字段间用逗号隔开;
 (2)语法使用说明2:绿色字体处为自定义内容;
 (3)语法使用说明3:下划线代表该处内容可省略。
2、执行流程: from --> select 
3、语法具体使用格式如下:
-->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、查部分列

--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、所有列

       查询所有的字段 通配符 * ( 书写方便、可以检索未知列 ; 但是降低检索的性能 ) , 数据的顺序跟定义表结构 的顺序一致。
--1) 、检索所有列 1
--查询部门的所有信息
select * from dept;

--2)、检索所有列2

--查询部门的所有信息
select deptno,dname,loc from dept;

3、去重:distinct

      使用 distinct 去重,确保查询结果的唯一性
--去重
select distinct deptno from emp; 

4、别名

(1)使用别名便于操作识别 、隐藏底层信息。存在字段别名和表别名。
(2)as: 字段别名可以使用 as; 表别名不能使用 as
(3)"":对其中内容 原样输出,内容可以存在 空格,也区分大小写
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、伪列

     不存在的列,可用表达式、整数或字符串构建虚拟的列
     例如:下面第三行代码中'cmj'是伪列
--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) 、 ornot
--(2)区间判断两种方法:

            --1):条件1 and 条件2;

            --2):between 值1 and 值2;

--4、条件判断操作符

(1)关系运算符:

           --等于:=           --不等于:!= 或者  <>          --大于:>           

           --小于:          --小于等于:<=                    --大于等于:>=

(2)集合操作符: 

           UnionUnion AllIntersectMinus

--查询工资大于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:模糊查询操作符
--  模糊查询,使用通配符 :
     --  %: 零个及以上 ( 任意个数的 ) 的字符
     --  _: 一个字符
     --  遇到内容中包含 % _ 使用 escape(' 单个字符 ') 指定转义符
--查询员工姓名中包含字符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)inexists精准查询操作符

         --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;
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值