Oracle数据库 Select语句 day02

Select语句

回顾From子句

  1. 查询员工表(s_emp)的id与salary字段

    select id,salary from s_emp;
    辅助查询的额外功能

  2. 算数运算 *
    +-*/%

    需求: 查询员工的last_name与年薪:

    select last_name,salary*13 from s_emp;

    需求: 查询员工的日薪 , 按照每个月21天工作日计算

    select last_name,salary/21 from s_emp;

  3. 别名 *

    有时候 ,我们在对表格进行查询时, 因为字段进行了运算, 它的表头出现了改变, 我们需要指定一个别名, 来更方便的使用它

    语法格式:

    select 查询的列或者表达式1 别名,查询的列或者表达式2 别名 from 表名;
    单个列只允许存在一个别名 !
    

    需求: 查询年薪, 并且给年薪字段添加别名:

    select last_name,salary*13 ys from s_emp;

  4. 别名中存在空格等特殊字符时 使用双引号引住 , 可以把空格之类的特殊字符 看作一个整体 ,并且会原样显示(大小写区分显示)
    查询员工的id , 并加10000显示, 给id添加别名 id heheda

    select id+10000 “id heheda” from s_emp;
    SQL中的字符串

使用英文单引号引住的 就是字符串

-   Oracle中关于大小写敏感的规则: 
    在oracle的sql中 只有字符串是大小写敏感的 !

字符串的定义形式 与 表现形式

例如:
Java中我们定义一个字符串的变量:

定义形式: "Oracle"
表现形式: Oracle

Oracle中我们定义一个字符串的变量:

定义形式: 'Oracle'
表现形式: Oracle

1. 字符串的拼接
在sql中拼接字符串, 通过||(字符串连接符)

需求: 查询员工的 姓(last_name)名(first_name) :

select last_name||first_name name from s_emp;

需求: 查询员工的姓$名

select last_name||'$'||first_name name from s_emp;
  1. 字符串中拼接单引号

    需求: 查询员工的姓’名

    需要通过4个单引号, 表示一个字符串中的单引号

    select last_name||””||first_name name from s_emp;
    null值的处理 *

oracle中null值经过运算后, 结果永远为null

nvl(参数1,参数2)

作用  :用来处理null值, 让null值可以合理的参与运算 ,如果参数1为null则返回参数2 , 如果参数1不为null则返回参数1
参数1.需要判断是否为null的值
参数2.参数1为null时,替换的值

需求: 查询员工的月薪(salary),提成(commission_pct)

select id,salary,commission_pct from s_emp;

需求: 计算一年的薪水加提成

select id,salary*13+salary*13*commission_pct/100 from s_emp;

上面的运算出现了问题, 因为没有对null值进行处理 , 加入nvl后:

select id, salary*13 ,salary*13+salary*13*nvl(commission_pct,0)/100  ys from s_emp;

数据排重显示

排重关键字: distinct

查询员工的月薪,排重显示:

select distinct salary from s_emp;--单字段排重显示

多字段排重

查询月薪与领导编号

select distinct salary,manager_id from s_emp;

where子句*

对于查询进行条件的添加 , 对于查询结果进行过滤 , 匹配规则的将被正确的查询到, 不匹配规则的将从结果集中舍弃!

格式: select 列名 from 表名 where 条件; *

常用的比较运算符: = ,!=,>,<,>=,>=

字符串进行比较与number类型没有区别

需求:

查询员工的last_name,id, 条件是:id大于5
select last_name,id from s_emp where id>5;

查询员工的last_name,id, 条件是:id等于1
select last_name,id from s_emp where id=1;
  1. 特殊的极限条件: 永真与永假条件

    永真条件:
    select id from s_emp where 1=1;

    永假条件
    select id from s_emp where 1!=1;
    select id from s_emp where 1=2;

  2. 字符串的比较 *

    • 字符串的定义形式
    • 在oracle中字符串大小写敏感

    查询员工的id,salary , 条件式last_name为Chang

    select id,salary from s_emp where last_name=’Chang’;

  3. 特殊的运算符

    • between : 闭区间 (包含开始与结尾边界)

    格式: select 字段 from 表名 where 字段 between 初始范围 and 最大范围!

    需求: 查询员工的last_name,与salary , 条件为: 工资在1100到1450之间

    select last_name,salary from s_emp where salary between 1100 and 1450;

    • in: 匹配列表

    格式: select 字段 from 表名 where 字段 in(值1,值2…值n);

    条件匹配in值列表中的的任意一个, 就会被查询到

    查询员工的last_name与id , 条件为id为1或者2或者3的员工
    select last_name,id from s_emp where id in(1,2,3);

    • null值判断 *

    查询所有的领导编号为1的员工 ,查询他的last_name与id信息
    select id,last_name from s_emp where manager_id=1;

    查询所有的领导编号不为1的员工
    select id,last_name from s_emp where manager_id!=1;

    上面的两个案例 共获取了24条记录 ,缺少一条领导编号为null值的员工 !
    判断数据是否为空: is null *

    需求:查询所有的领导编号为null的员工

    select last_name,id from s_emp where manager_id is null;
    

    判断数据是否不为空: is not null
    需求:查询存在提成的员工 的 id,last_name,commission_pct

    select id,last_name,commission_pct from s_emp where commission_pct is not null;
    模糊查询 *

    like

    格式: select 列名 from 表名 where 字段名 like ‘模糊查询的文本’;

    通配符:

    -   _ :表示一个任意字符
    -   % :0-n个任意字符
    

    例如一段文本:

    1.  床前明月光,
    2.  玻璃好上霜。
    3.  要不及时擦,
    4.  整不好得脏。
    
    '_不%': 匹配了3和4
    '%不%': 匹配了3和4
    '%床%': 匹配了1
    '玻璃%':匹配了2
    

    需求:

    1. 查询s_emp表格中last_name中包含a字符的员工 , 查询他的last_name与id
      select last_name,id from s_emp where last_name like ‘%a%’;

    2. 查询s_emp表格中last_name中开头为N字符的员工, 查询他的last_name与id
      select last_name,id from s_emp where last_name like ‘N%’;

    3. 查询s_emp表格中的last_name中第二个字符为e的员工 , 查询他的last_name与id
      select last_name,id from s_emp where last_name like ‘_e%’;

    4. 查询s_emp表格中的last_name中倒数第二个字符为a的员工 , 查询他的last_name与id
      select last_name,id from s_emp where last_name like ‘%a_’;
      oracle中存在一个表格user_tables,包含了数据库中所有的表格信息 ;

    我们查询这个user_tables,获取所有的表名:
    select table_name from user_tables;

    需求: 查询user_tables表格中的所有的table_name列的值, 条件为table_name以s_开头

    特殊的疑问:

    我们要模糊查询的文本 中包含 %与_ 怎么办? 
    
    描述转义字符 escape '\'; 
    

    案例:
    select table_name from user_tables where table_name like ‘S_%’ escape ‘\’;
    逻辑条件连接符

与 and *

-   查询s_emp表格中的员工信息 , 条件如下: 
        1.  员工id为2
        2.  领导编号为1的员工
    select last_name,id from s_emp where id=2 and manager_id=1;

-   查询员工工资在1100(含)到1450(含)之间的员工信息
    select salary,last_name,id from s_emp where salary>=1100 and salary <=1450;

或 or *

-   查询员工的id为1或者员工的id为2的员工信息
    select last_name,id from s_emp where id=1 or id=2;

-   查询员工的id与salary , 条件为: 员工的id为1或者员工的薪资小于1000; 
    select id,salary from s_emp where id=1 or salary<1000;

非 not *

-   not between

    加入not以后, 是匹配不属于闭区间的内容!

    -   获取员工的id,salary,条件为月薪的范围不再1100-1450之间
    select id,salary from s_emp where salary not between 1100 and 1450;

-   not in

    获取员工id不为1,2,3,4的员工salary,id信息
    select salary,id from s_emp where id not in(1,2,3,4);

-   is not null *

    获取员工的manager_id不为null的员工的id,last_name;

    select id,last_name from s_emp where manager_id is not null;


思考条件的优先级问题: 

    获取员工的id,last_name,dept_id(部门编号),salary,条件如下:
    员工的工资小于1000 , 并且部门的id为31或者42

    select id,last_name,dept_id,salary from s_emp where salary<1000 and (dept_id=31 or dept_id=42);

order by 子句(排序)

order by 子句 只能放在select 语句的最后面

注意: null值在排序中永远是最大的 !

对于查询的结果, 按照指定的排序规则, 进行排序: 

规则:  
    -   asc  默认升序 (因为是默认 可以 不写)
    -   desc 降序

格式: select 列名 from 表名 [where 条件] [order by 排序字段名 排序规则];

-   查询员工的id , 要求id降序排列

    select id from s_emp order by id desc;

-   按照dept_id(部门编号)进行排序 (升序与降序)
    select dept_id,last_name from s_emp order by dept_id ;
    select dept_id,last_name from s_emp order by dept_id desc;

-   按照manager_id(领导编号) 进行排列, 查询id,manager_id,last_name信息;
    -   null值最大
    select id,manager_id,last_name from s_emp order by manager_id desc;

多字段排序

格式与单个字段排序基本一致, 多个字段之间使用英文逗号隔开

格式: select 列名 from 表名 [where 条件] [order by 排序字段名1 排序规则1,排序字段名2 排序规则2...排序字段名n 排序规则n];


-   按照部门id升序排列 , 如果部门id相同, 则按照工资升序排列;

select id,dept_id,salary from s_emp order by dept_id asc,salary asc;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值