Oracle基础01

1.Oracle简介

Oracle数据库是美国ORACLE公司(甲骨文公司)提供的分布式数据库为核心的一组软件产品,是目前最流行的客户/服务器(B/S)体系结构的数据库之一。Oracle数据库是目前世界上使用最广泛的数据库管理系统

 

2>Oracle数据库的体系结构

数据库:database(Oracle数据库是数据的物理存储)

实例:一个Oracle实例有一系列的后台进程和内存结构组成。一个数据库可以有n个实例

数据库文件(dbf):数据库文件是数据库的物理存储单位,如果要删除某个数据文件只能删除其所属于的表空间才行

表空间:表空间是Oracle对物理数据库上的相关数据文件(ora/dbf文件)的逻辑映射,一个数据文件只能属于一个表空间

表:Oracle中有三种表(标准表、临时表、索引表)

用户:即使用者,用户是在实例下建立的,不同的实例中可以创建相同名字的用户

集群:多个内存实例来操作数据库

 

3>scott用户和hr用户

在安装成功后,也创建了初始的用户,scott和hr都是初始的普通用户。这些用户下默认存在了表结构供我们学习使用

 

2.基本查询

Oracle的基本查询与mysql/sql server并无多大区别,Oracle大小写敏感,日期格式敏感

日期和字符只能在单引号中出现

0>SQL优化原则:尽量使用列名,where执行顺序 右 > 左,尽量使用多表查询,尽量不要使用集合运算

SQL中的null:包含null的表达式都为null(使用is null),null永远!=null(使用not null/不能使用=null),空值不是空格或0

 

1>操作命令

显示当前用户:show user

显示表结构:desc emp

清屏:host cls

设置行宽:show linesize(显示)/set linesize 120(修改)

设置列宽:col sal(列名) for 9999

ed:修改前一条sql语句

/:执行前一条sql语句

 

2>sql语句

查询表中所有信息:select * from emp;

通过列名查询:select empno,ename,job,mgr,hiredate,sal,comm,deptno from emp;

查询员工信息:员工号 姓名 月薪 年薪 奖金 年收入:select empno,ename,sal,sal*12,comm,sal*12+comm from emp;

distinct 去掉重复记录:select distinct deptno from emp;(distinct作用于后面所有的列)

连接符 ||:select ename||'的薪水是'||sal "信息" from emp;

concat函数:select concat('Hello','  World') from dual;

dual表:是一个空表,Oracle提供给我们测试表达式时使用的表(select 3+2 from dual;)

 

3>过滤和排序(where/order by)where后面的执行顺序 右 > 左(从右到左)

查询10号部门的员工:seelct * from emp where deptno=10;

查询名叫KING的员工:seelct * from emp where ename='KING'

查询入职日期是17-11月-81的员工:seelct * from emp where hiredate='17-11月-81';(Oracle默认的日期格式)

查询薪水1000~2000之间的员工(between and): select * from emp where sal between 1000 and 2000;

查询10和20号部门的员工(in 在集合中):select * from emp where deptno in (10,20);

查询不是10和20号部门的员工: select * from emp where deptno not in (10,20);

where deptno not in (10,20,null):失败    where deptno in (10,20,null):成功

查询名字是4个字的员工:select * from emp where ename like '____';

查询名字中含有下划线的员工(转意字符):select * from emp where ename like '%\_%' escape '\';

查询员工信息,按照月薪排序(默认升序ASC/DESC):select * from emp order by sal;

order by 后面  + 列、表达式、别名、序号;desc只作用于离他最近的列;排序后的结果,不是原来的表

查询员工信息,按照奖金排序(null的值是最大/null的排序):select * from emp order by comm desc nulls last;

 

3.进阶查询

1>单行函数

函数:输入一组参数,返回一个我们需要的结果值(函数可以没有参数,但必须要有返回值

单行函数:输入(处理)单个参数,分为(字符、数值、日期、转换、通用)

字符函数:大小写控制(LOWER、UPPER),字符控制(CONCAT、SUBSTR...)

数值函数:四舍五入ROUND(45.926,2) >>> 45.93、截断TRUNC(45.926,2) >>>45.92,求余MOD(1600,300) >>> 100

日期函数:指定日期的下一个日期(NEXT_DAY),两个月相差的月数(MONTHS_BETWEEN)

转换函数:隐式(自动转换),显示(TO_CHAR、TO_DATE、TO_NUMBER)

通用函数:空值处理(nvl),nvl(变量值,0); >>> 当变量值为空时返回0

条件表达式(IF-THEN-ELSE):CASE表达式(SQL99,类似Basic,比较繁琐)、DECODE(Oracle自带,类似Java,比较简洁)

 

2>多行函数

多行函数:输入多个参数处理

常用多行函数:AVG、COUNT、MAX、MIN、SUM

分组数据(group by):将表中的数据分成若干租,

注意:如果使用分组函数,SQL只可以把GOURP BY分组条件字段和分组函数字段查询出来,不能有其他字段‘如果使用分组函数,不使用GOURP BY只可以查询出来分组函数的值

分组过滤(HAVING):在group by后面需要增加条件时,使用having

注意:where后面不能有group by

 

3>多表查询(划重点)

笛卡儿积:X与Y直接相乘的结果(尽量避免)

等值连接:通过某个相等的值来进行两个表之间的连接

--查询员工信息:员工号  姓名 月薪 部门名称:
select e.empno,e.ename,e.sal,d.dname from emp e,dept d where e.deptno=d.deptno;

 

外连接:左外连接(where e.deptno=d.deptno(+)),右外连接(where e.deptno(+)=d.deptno)

select d.deptno 部门号,d.dname 部门名称,count(e.empno) 人数 from emp e,dept d where e.deptno(+)=d.deptno group by d.deptno,d.dname;

 

自连接:表自身的连接(不适用于大表)

select e.ename 员工姓名,b.ename 老板姓名  from emp e,emp b  where e.mgr=b.empno;

 

猜你喜欢

转载自blog.csdn.net/langao_q/article/details/82947552