Oracle day02 火推

来源:互联网 发布:金庸 误解 知乎 编辑:程序博客网 时间:2024/06/05 08:52
 Oracle 02



Select语句

回顾From子句

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

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

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

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

    select last_name,salary*13 from s_emp;

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

    select last_name,salary/21 from s_emp;


2.  别名 *

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

    语法格式: 

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

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

    select last_name,salary*13 ys from s_emp;


3.  别名中存在空格等特殊字符时 使用双引号引住 , 可以把空格之类的特殊字符 看作一个整体 ,并且会原样显示(大小写区分显示)
    查询员工的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;

2.  字符串中拼接单引号

    需求: 查询员工的姓'名

    需要通过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;