Oracle小复习(1)

一,数据库概述

    (1)数据库相关概念

      数据:在数据库领域看来,数据是存储的基本单位,包含文本,图片,视频,音频
      数据库:就是数据仓库,存储数据的地方,特指计算机设备中的硬盘,以二进制压缩文本的形式存放,该文件不能直接操作,必须由各数据库公司提供的工具方可操作,该文件的格 式是每个数据库公司内部定义的,不是统一规则
      数据库对象:在Oracle中,例如:表,视图,索引,函数,过程,触发器。。。
      关系型数据库:简单的说,以行列结构的形式,将数据库中的信息表示出来的对象,即二维表
      常见流行的关系型数据库:Oracle&MySQL/Oracle-->DB2/IBM--->SQLServer/Microsoft-->。。。

 (2) oracle数据库服务器由二部份组成
       (A)实例:理解为对象,看不见的
       (B)数据库:理解为类,看得见的,E:\app\Administrator\oradata\orcl\*.DBF

(3)计算机语言
    第一代:机器语言
    第二代:汇编        
    第三代:C/C++/C#/Java/VB/...
    第四代:SQL 【结构化查询语言,面向关系的】

   二,一些SQL


设置显示的列宽(字符型varchar2、日期型date),10个宽度位,a表示字符型,大小写均可
column ename format a12;
column hiredate format a10;

设置显示的列宽(数值型number),9表示数字型,一个9表示一个数字位,四个9表示四个数字位,只能用9
column empno format 9999;
column mgr format 9999;


设置一页显示80个条记录的高度
set pagesize 80;

查询emp表的员工编号,姓名,工资,部门号,列名,大小写不敏感,但提倡大写
select empno "编号",ename "姓名",sal "工资",deptNO "部门号" FROM Emp;

查询emp表的不重复的工作
select distinct job from emp;

查询员工的编号,姓名,月薪,年薪(月薪*12)
select empno,ename,sal,sal*12 "年薪" from emp;

查询员工的编号,姓名,入职时间,月薪,年薪,年收入(年薪+奖金)
select empno "编号",ename"姓名",hiredate "入职时间",sal "月薪",sal*12 "年薪",sal*12+comm "年收入" from emp;
如果结果为null,在sqlplus客户端工具中,是不显示null这个值的

解决null的问题,使用NVL()函数,NVL(a,b):如果a是NULL,用b替代;如果a是非NULL,就不用b替代,直接返回a的值\
select NVL(null,10) from emp;结果有14行记录
select NVL(null,10) from dual;结果有1行记录
select empno "编号",ename"姓名",hiredate "入职时间",sal "月薪",sal*12 "年薪",sal*12+NVL(comm,0) "年收入"
from emp;
注意:null与具体数字运算时,结果为null

使用列别名,查询员工的编号,姓名,月薪,年薪,年收入(年薪+奖金),AS大小写都可且可以省略AS,别名用双引号
select empno AS "编号",ename as "姓名",sal "月薪"
from emp;

select empno AS 编号,ename as 姓名,sal 月薪
from emp;
区别
select empno AS "编号",ename as 姓名,sal "月    薪"
from emp;
不加双引号的别名不能有空格;加了双引号的别名可以有空格
要加只能加双引号,不能加单引号,因为在oracle中单引号表示字符串类型或者是日期类型
列名不能使用单引号,因为oracle认为单引号是字符串型或日期型

使用dual哑表或者伪表,使用字符串连接符号||,输出"hello world",在oracle中from是必须写的
select 'hello' || ' world' "结果" from dual;

使用sysdate,显示系统当前时间,在默认情况下,oracle只显示日期,而不显示时间,格式:26-4月-15
select sysdate from dual;

使用字符串连接符号||,显示如下格式信息:****的薪水是****美元
select ename || '的薪水是' || sal || '美元'
from emp;

使用spool命令,保存SQL语句到硬盘文件e:/oracle-day01.sql,并创建sql文件
spool e:/oracle-day01.sql;

使用spool off命令,保存SQL语句到硬盘文件e:/oracle-day01.sql,并创建sql文件,结束语句
spool off;

使用@命令,将硬盘文件e:/crm.sql,读到orcl实例中,并执行文件中的sql语句
@ e:/crm.sql;

使用--符号,设置单行注释
--select * from emp;

使用/* */符号,设置多行注释
/*
select
*
from
emp;
*/

SQL语句的特点
1)是SQL92/99的ANSI官方标准,只要按照该标准来写,在任何的关系型数据库中都可以直接执行
2)SQL语句的关健字不能简写,例如:select,where,from
3)大小写不敏感,提倡大写
4)能够对表数据进行增删改查操作
5)必须以分号结束
6)通常称做语句

SQLPLUS命令的特点
1)是oracle自带的一款工具,在该工具中执行的命令叫SQLPLUS命令
2)SQLPLUS工具的命令中的关健字可以简写,也可以不简写,例如:col ename for a10;
3)大小写不敏感,提倡大写
4)不能够对表数据进行增删改查操作,只能完成显示格式控制,例如:设置显示列宽,清屏,记录执行结果
5)可以不用分号结束,也可以用分号结束,个人提倡不管SQL或SQLPLUS,都以分号结束
6)通常称做命令,是SQLPLUS工具中的命令
注意:SQLPLUS命令是SQLPLUS工具中特有的语句

单引号出现的地方如下:
1)字符串型,例如:'hello' || ' world'
2)日期型,例如'25-4月-15'

双引号出现的地方如下:
1)列别名,例如:sal*12 "年 薪",或 sal*12 年薪,个人提倡用""双引号作列别名
            

----where


查询emp表中20号部门的员工信息
select * from emp where deptno = 20;

查询姓名是SMITH的员工,字符串使用'',内容大小写敏感
select * from emp where ename = 'SMITH';
总结:你所学过的技术中,哪些是大小写敏感,哪些是大小写不敏感

查询1980年12月17日入职的员工,注意oracle默认日期格式(DD-MON-RR表示2位的年份)
select * from emp where hiredate = '17-12月-80';

查询工资大于1500的员工
select * from emp where sal > 1500;

查询工资不等于1500的员工【!=或<>】
select * from emp where sal <> 1500;

查询薪水在1300到1600之间的员工,包括1300和1600
select * from emp where (sal>=1300) and (sal<=1600);

select * from emp where sal between 1300 and 1600;

查询薪水不在1300到1600之间的员工,不包括1300和1600
select * from emp where sal NOT between 1300 and 1600;

查询入职时间在"1981-2月-20"到"1982-1月-23"之间的员工
select * from emp where hiredate between '20-2月-81' and '23-1月-82';

查询20号或30号部门的员工,例如:根据ID号,选中的员工,批量删除
select * from emp where (deptno=20) or (deptno=30);

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

查询不是20号或30号部门的员工
select * from emp where deptno NOT in (30,20);

查询姓名以大写字母S开头的员工,使用%表示0个,1个或多个字符
select * from emp where ename like 'S';
等价
select * from emp where ename = 'S';
select * from emp where ename like 'S%';

注意:
凡是精确查询用=符号
凡是不精确查询用like符号,我们通常叫模糊查询
 
查询姓名以大写字母N结束的员工
select * from emp where ename like '%N';

查询姓名第一个字母是T,最后一个字母是R的员工
select * from emp where ename like 'T%R';

查询姓名是4个字符的员工,且第二个字符是I,使用_只能表示1个字符,不能表示0个或多个字符
select * from emp where ename like '_I__';

插入一条姓名为'T_IM'的员工,薪水1200
insert into emp(empno,ename) values(1111,'T_IM');

查询员工姓名中含有'_'的员工,使用\转义符,让其后的字符回归本来意思【like '%\_%' escape '\'】
select * from emp where ename like '%\_%' escape '\';

插入一个姓名叫'的员工
insert into emp(empno,ename) values(2222,'''');

插入一个姓名叫''的员工
insert into emp(empno,ename) values(2222,'''''');

查询所有员工信息,使用%或%%
select * from emp;
select * from emp where ename like '%';
select * from emp where ename like '%_%';

查询佣金为null的员工
select * from emp where comm is null;
注意:null不能参数=运算
      null能参数number/date/varchar2类型运算

查询佣金为非null的员工
select * from emp where comm is not null;

查询无佣金且工资大于1500的员工
select *
from emp
where (comm is null) and (sal>1500);

查询工资是1500或3000或5000的员工
select *
from emp
where sal in (4000,10000,1500,3,300,3000,5000);

查询职位是"MANAGER"或职位不是"ANALYST"的员工(方式一,使用!=或<>)
select *
from emp
where (job='MANAGER') or (job<>'ANALYST');

查询职位是"MANAGER"或职位不是"ANALYST"的员工(方式二,使用not)
select *
from emp
where (job='MANAGER') or (not(job='ANALYST'));


---------order by


查询员工信息(编号,姓名,月薪,年薪),按月薪升序排序,默认升序,如果月薪相同,按oracle内置的校验规则排序
select empno,ename,sal,sal*12
from emp
order by sal asc;

查询员工信息(编号,姓名,月薪,年薪),按月薪降序排序
select empno,ename,sal,sal*12
from emp
order by sal desc;

查询员工信息,按入职日期降序排序,使用列名
select empno,ename,sal,hiredate,sal*12 "年薪"
from emp
order by hiredate desc;

order by后面可以跟列名、别名、表达式、列号(从1开始,在select子句中的列号)
列名:
select empno,ename,sal,hiredate,sal*12 "年薪"
from emp
order by hiredate desc;

别名:
select empno,ename,sal,hiredate,sal*12 "年薪"
from emp
order by "年薪" desc;

表达式:
select empno,ename,sal,hiredate,sal*12 "年薪"
from emp
order by sal*12 desc;

列号,从1开始:
select empno,ename,sal,hiredate,sal*12 "年薪"
from emp
order by 5 desc;

查询员工信息,按佣金升序或降序排列,null值看成最大值
select * from emp order by comm desc;

查询员工信息,对有佣金的员工,按佣金降序排列,当order by 和 where 同时出现时,order by 在最后
select *
from emp
where comm is not null
order by comm desc;

查询员工信息,按工资降序排列,相同工资的员工再按入职时间降序排列
select *
from emp
order by sal desc,hiredate desc;

select *
from emp
order by sal desc,hiredate asc;
注意:只有当sal相同的情况下,hiredate排序才有作用

查询20号部门,且工资大于1500,按入职时间降序排列
select *
from emp
where (deptno=20) and (sal>1500)
order by hiredate desc;

select * from emp where deptno in (10,20,30,50,'a');

posted @ 2016-10-20 15:13  乔伊米洛  阅读(254)  评论(0编辑  收藏  举报