您的位置:首页 > 数据库 > Oracle

Day30 Oracle基础1 数据库安装与入门 基本SQL语句

2018-02-03 20:38 351 查看

数据库的安装与入门

数据库基本概念

数据

描述事物的符号

多种表现形式:文本,图形,音频,视频

数据库(Database, DB)

粮库 车库

存放数据的仓库 存放在计算机中,按照一定格式存放 可为用户共享

数据库管理系统(Database Management System, DBMS)

如何科学的组织和存储数据,如何高效的获取和维护数据,靠数据库管理系统完成

Oracle MySQL SQL Server DB2 FoxPro,Access

数据库应用程序(DBAS)

在数据库管理系统基础上,使用数据库管理系统的语法,开发的直接面对最终用户的应用程序

学生管理系统、人事管理系统、图书管理系统

数据库管理员( Database Administrator, DBA )

数据库管理系统的操作者

最终用户

数据库应用程序的使用者

数据库系统( Database System, DBS )

数据库+数据库管理系统+数据库应用程序+数据库管理员+最终用户



数据库的发展阶段

网状数据库

层次数据库

关系数据库

采用关系(二维表)结构储存与管理数据

采用结构化查询语言(SQL)作为客户端程数据库服务器间沟通的桥梁

目前主流的数据库技术

对象数据库

把面向对象的方法和数据库技术结合起来可以使数据库系统的分析、设计最大程度地与人们对客观世界的认识相一致

NOSQL数据库

Not Only SQL数据库 泛指非关系数据库。如MongoDB

关系数据库在超大规模和高并发的web2.0纯动态网站已经显得力不从心,暴露了很多难以克服的问题。NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题。

安装和卸载

以oracle 11g XE 版本为例

Oracle安装版本

Oracle11g xe 64位 学习班 免费版 功能弱

Oracle安装

一路next即可

Oracle服务

监听器服务和实例服务必须开启

连接Oracle

SQL plus

PL/SQL Developer

Oracle卸载

一路next即可

测试

概念介绍

全局数据库名 xe

唯一标识Oracle数据库的名称

数据库实例名SID xe

和操作系统交互,Oracle数据库的一个引用

每个启动的数据库都对应一个数据库实例,由这个实例来访问和控制数据库

4000
为了运行数据库,Oracle系统所运行的所有进程和分配的内存结构的组合体

两者名称通常相同

Oralce目录和用户

目录

\NETWORK\ADMIN

listener.ora和tnsnames.ora,配置监听器和本地网络服务名

\oradata\xe

指定数据库实例下的数据文件,控制文件和日志文件

SYS和SYSTEM用户

SYS和SYSTEM用户都是Oracle 的系统用户,它们都使用SYSTEM表空间,SYS拥有更大的权限

Oracle的一个超级用户,Oracle默认的系统管理员,拥有DBA权限

平时用system来管理数据库就可以了。这个用户的权限对于普通的数据库管理来说已经足够权限了。

可以通过观察权限的区别理解两者的不同

SCOTT用户 tiger

测试账户 练习账户

配置连接

Oracle采用服务器/客户端访问方式

服务器端使用监听器对客户端的访问进行监听

客户端访问服务器端时必须明确四个参数包括

访问协议

服务器IP地址

服务器监听端口

服务器端的哪个数据库实例



配置监听器和本地网络服务名

Oracle产品安装完成后,服务器和客户端都需要进行网络配置才能实现网络连接

服务器端配置监听器,客户端配置本地网络服务名(包括四个连接参数)

在安装Oracle服务器软件时自动配置一个监听器,并且自动创建了和数据库实例名相同的本地网络服务名

listener.ora和tnsnames.ora分别用来存储监听器和本地网络服务名的信息

Oracle中的 Net Manager工具和Net Configuration Assistant都能用来配置监听器和网络服务名

安装图形化界面PL/SQL操作Oracle

创建用户和授予权限

创建用户

CREATE USER bjsxt IDENTIFIED BY bjsxt;

分配权限或角色

GRANT CONNECT,RESOURCE TO bjsxt;

取消权限或角色

REVOKE RESOURCE FROM bjsxt;

权限指执行特定类型SQL 命令或访问其他对象的权利

角色是具有名称的一组权限的组合

常用系统预定义角色:

CONNECT:临时用户

RESOURCE:更为可靠和正式的用户

DBA:数据库管理员角色,拥有管理数据库的最高权限

练习表介绍

用户

scott

数据库表

Dept 部门表

Emp 员工表

Salgrade 工资等级表

Bonus 奖金表

表和表之间的关系

员工属于某个部门

–创建一个用户scott,密码tiger

create user scott identified by tiger

–新创建的用户是没有任何权限的,需要管理员来分配

–权限privlige 太多了,逐个分配权限太繁琐了

–为了分配权限简单方便起见,定义了多个角色role,一个角色可以有多个权限

–如何给用户分配权限呢?

–1.直接分配权限,繁琐,一般不采用

–2.分配角色,分配了某个角色,也就具有了该角色的所有权限

– CONNECT

– RESOURCE

– DBA

–授予用户角色

grant connect,resource to scott

–用户可以做哪些操作,是和分配的角色有关的。

分配了 connect,resource,无法创建用户

create user bjsxt identified by bjsxt

–撤销权限/角色

revoke connect,resource from scott

–重新赋予更大权限的角色

grant dba to scott

–以dba角色来创建用户

create user bjsxt identified by bjsxt

–function 函数 procedure 存储过程 对应Java中方法,一般来说function是有返回值,procedure没有返回值

–package 包 trigger 触发器 queue 队列 table 数据库表 !!!! index 索引

–constraint 约束 view 视图 sequence 序列

–role :角色 tablespace 表空间



–dept 部门表 department

–deptno 部门编号

–dname 部门名称

–loc 部门地址 location

–emp 员工表 雇员表 employee

–empno 编号

–ename 姓名

–job 岗位 职位 ANALYST 分析师 PRESIDENT 董事长

–mgr manager 上级编号

–hiredate 入职时间

–sal 工资 salary

–comm 补助 津贴

–deptno 部门编号

–salgrade 工资等级表

–grade 等级

–losal low salary

–hisal high salary

–权限的分类privlige

–系统权限: 允许用户执行特定的数据库动作,如创建表、创建索引、连接实例等

–对象权限: 允许用户操纵一些特定的对象,如读取视图,可更新某些列、执行存储过程等

结构化查询语言(SQL)

SQL语言基础

先睹为快

select * from emp;

select * from emp order by sal desc ;

select * from emp where ename like ‘S%’;

select avg(sal), max(sal), min(sal), sum(sal) from emp;

select deptno, avg(sal) from emp group by deptno;

insert into student (id,name,age) values(2,’lkl’,45);

update student set score=88 where id=2;

delete from student where id=2;

CREATE USER bjsxt IDENTIFIED BY bjsxt;

GRANT connect,resource TO bjsxt;

什么是SQL语言

结构化查询语言(Structured Query Language)(发音ˈes kjuːˈ)

SQL是最重要的关系数据库操作语言,是所有关系数据库管理系统的标准语言

许多数据库厂商在使用SQL的同时,都对SQL进行了扩展,比如ORACLE的PL/SQL语言,MS SQL-Server的T-SQL语言

SQL语言是一种非过程化语言,只需要提出”做什么”,而不需要指明“怎么做”

SQL可以做什么

数据库数据的增删改查操作(CRUD)

数据库对象的创建,修改和删除操作

用户权限/角色的授予和取消

事务控制

SQL语言的分类

DQL(数据查询语言)

select

DML(数据操作语言)

insert、update、delete

DDL(数据定义语言)

create、alter、drop

DCL(数据控制语言)

grant、revoke

TCL(事务控制语言)

SAVEPOINT 、 ROLLBACK、SET TRANSACTION ,COMMIT

数据操作语言针对表中的数据,而数据定义语言针对数据库对象(表、索引、视图、触发器、存储过程、函数、表空间等)

SQL标准发展



关系数据库基本概念

关系:整个二维表

关系名:表格名称

元组:行数据(记录)

属性:列数据(字段)

属性名:列名称(字段名)

主键:唯一确定元组的属性组(关键字)

域:属性的取值范围



select单表查询语句— select子句

最简单的查询方式

select * from emp;

select * from dept;

select empno, ename,sal from emp;

使用算术表达式

select empno, ename,sal,sal*1.08 from emp;

select empno, ename,sal, sal*12 from emp;

select empno, ename,sal, sal*12 +1000 from emp;

注:在Select语句中,对数值型数据可以使用算术运算符创建表达式

使用字段别名

select empno as 员工编号, ename 员工姓名, sal*12 年薪 from emp;

select empno, ename “Ename”, sal*12 “Anual Salary” from emp;

select sal*12+5000 as “年度工资(加年终奖)” from emp;

字段别名

重命名查询结果中的字段,以增强可读性

别名如果含有空格或其他特殊字符或大小写敏感,需用双引号引起来。

AS可以省略

select单表查询语句—去除重复行

缺省情况下,查询结果中包含所有符合条件的记录行,包括重复行

select deptno from emp;

使用DISTINCT关键字可从查询结果中清除重复行

select distinct deptno from emp;

select distinct job from emp;

DISTINCT的作用范围是后面所有字段的组合

select, distinct deptno job from emp;

select单表查询语句—order by子句

使用order by 子句对查询结果进行排序

排序方式包括升序(asc,缺省)和降序(desc)两种:

select empno, ename, sal from emp order by sal;

select empno, ename, sal from emp order by sal desc ;

按多字段排序

select deptno, empno, ename, sal from emp order by deptno, sal;

使用字段别名排序

select empno, ename, sal*12 annsal from emp order by annsal;

select单表查询语句—where子句

指定查询条件使用where子句

用法举例

select * from emp where deptno=10;

select * from emp where ename = ‘SMITH’;

select * from emp where hiredate = ‘02-4月-81’;

注意:

字符串和日期值要用单引号扩起来

字符串大小写敏感

日期值格式敏感,缺省的日期格式是’DD-MON-RR‘

查询条件中可以使用比较运算符

select * from emp where sal > 2900;

select * from emp where deptno <> 30;

select * from emp where sal between 1600 and 2900;

select * from emp where ename in(‘SMITH’,’CLARK’,’KING’);



使用LIKE运算符执行模糊查询(通配查询)

% 表示零或多个字符 _ 表示一个字符

对于特殊符号可使用ESCAPE 标识符来查找

用法举例

select * from emp where ename like ‘S%’;

select * from emp where ename like ‘_A%’;

select * from emp where ename like ‘%_%’ escape ‘\’;

使用IS NULL运算符进行空值判断

用法举例

select * from emp where comm is null;

select * from emp where comm is not null;

查询条件中可以使用逻辑运算符

select * from emp where deptno = 10 and sal > 1000;

select * from emp where deptno = 10 or job = ‘CLERK’;

select * from emp where sal not in (800, 1500, 2000);

SQL优化问题:

AND: 把检索结果较少的条件放到后面

OR: 把检索结果较多的条件放到后面

共计四种运算符:算术>连接>比较>逻辑



可使用小括号强行改变运算顺序

select * from emp where job=’SALESMAN’ or job=’CLERK’ and sal>=1280;

select * from emp where (job=’SALESMAN’ or job=’CLERK’) and sal>=1280;

select单表查询语句—使用函数

使用函数可以大大提高SELECT语句操作数据库的能力;

它给数据的转换和处理提供了方便。

函数只是将取出的数据进行处理,不会改变数据库中的值。

Oracle函数分为单行函数和多行函数两大类

单行函数分类

字符函数 数值函数 日期函数

转换函数 通用函数

多行函数

sum() avg() 仅适用数值型

count() max() min() 适用任何类型数据

字符函数



数值函数



日期函数



转换函数

Oracle的类型转换分为自动类型转换和强制类型转换。

select ‘12.5’+30 from dual;

select ‘12.5’||30 from dual;

尽管数据类型之间可以进行自动转换,仍建议使用显示转换函数,以保持良好的设计风格。常用类型转换函数有to_char(), to_date(), to_number()。





日期字符串转换函数:to_char()

to_char()函数可以将日期型数值转换为字符串形式

to_char(date) //缺省转换为’dd-mon-yy’格式

to_char(date,‘format_model’) //转换为模式串指定的格式

使用举例

select empno, ename, sal, to_char(hiredate,’yyyy-mm-dd’) from emp;

SELECT TO_CHAR(sysdate,’YYYY-MM-DD HH24:MI:SS AM DY’) FROM dual;

SELECT TO_CHAR(sysdate,’YYYY”年”MM”月”DD”日”’) FROM dual;

说明

缺省的日期格式是DD-MON-YY

可使用sysdate函数获取当前系统日期和时间

日期字符串转换函数:to_date()

to_date()函数可以将字符串转换为日期类型

格式:

to_date(char) //按缺省格式进行解析

to_date(char,‘format_model’) //按模式串指定的格式进行解析

使用举例

insert into test2 values(‘Tom’, to_date(‘2008-02-28 ‘, ‘yyyy-mm-dd ‘));



通用函数:NVL()函数

NVL()函数用于将空值null替换为指定的缺省值,适用于字符、数字、日期等类型数据。

语法格式:NVL(exp1, exp2)

说明:如果表达式exp1的值为null,则返回exp2的值,否则返回exp1的值。

用法举例:

select empno, ename, sal, comm, sal + nvl(comm, 0) from emp;

select empno, ename, hiredate, nvl(hiredate, sysdate) from emp;

select empno, ename, job, nvl(job, ‘No job yet’) from emp;

通用函数:NVL2()函数

NVL2()函数用于实现条件表达式功能。

语法格式:NVL2(exp1, exp2, exp3)

说明:如果表达式exp1的值不为null,则返回exp2的值,否则返回exp3的值。

用法举例:

select empno, ename, sal, comm, nvl2(comm, sal+comm, sal) total from emp;

多行函数

对一组数据进行运算,针对一组数据(多行记录)只返回一个结果,也称分组函数。



常用多行函数

sum() avg() 仅适用数值型

count() max() min() 适用任何类型数据

select avg(sal), max(sal), min(sal), sum(sal) from emp;

select max(hiredate), min(hiredate) from emp;

多行函数与空值

多行函数除了count(*)外,都跳过空值而处理非空值

select count(comm),sum(comm),avg(comm) from emp;

可使用NVL()函数强制多行函数处理空值

select count(nvl(comm,0)),sum(nvl(comm,0)),avg(nvl(comm,0)) from emp;

count()函数

count(*)返回组中总记录数目;

count(exp)返回表达式exp值非空的记录数目;

count(distinct(exp))返回表达式exp值不重复的、非空的记录数目。

select count(*) from emp;

select count(comm) from emp;

select count(distinct(deptno)) from emp;

select count(nvl(comm,0)) from emp;

select单表查询语句—group by子句

GROUP BY 子句将表中数据分成若干小组

语法格式

select column, group_function(column)

from table

[where condition]

[group by group_by_expression]

[order by column];

使用举例

select deptno, avg(sal) from emp group by deptno;

select deptno, job, count(*),avg(sal) from emp group by deptno, job;

注意事项

出现在SELECT列表中的字段,如果不是包含在多行函数中,那么该字段必须同时在GROUP BY子句中出现。

错误:select ename,job,sum(sal) from emp group by job;

包含在GROUP BY子句中的字段则不必须出现在SELECT列表中。

如果没有GROUP BY子句,SELECT列表中不允许出现字段(单行函数)与多行函数混用的情况

select empno, sal from emp; //合法

select avg(sal) from emp; //合法

select empno, avg(sal) from emp; //非法

不允许在WHERE 子句中使用多行函数

select deptno, avg(sal) from emp

where avg(sal) > 2000; //执行where时尚未执行groupby 及其他

group by deptno;

select单表查询语句—having子句

对分组查询的结果进行过滤,要使用having从句。

having从句过滤分组后的结果,它只能出现在group by从句之后,而where从句要出现在group by从句之前。

where过滤行,having过滤分组。having支持所有where操作符。

语法格式

select column, group_function(column)

from table

[where condition]

[group by group_by_expression]

[having group_condition]

[order by column];

执行过程:from–where – group by– select-having- order by

用法举例

在emp表中,列出工资最小值小于2000的职位。

思考:select job,min(sal) from emp where min(sal)<=2000

Select job,min(sal) from emp group by job having min(sal)<2000

列出平均工资大于1200元的部门和工作搭配组合

select deptno, job, avg(sal) from emp

group by deptno,job having avg(sal) > 1200 order by deptno,job;

思考:

统计人数小于4的部门的平均工资。

统计各部门的最高工资,排除最高工资小于3000的部门。

DML—insert语句

往表中插入数据的语句是insert语句,方式有两种,一种是记录值的插入,一种是查询结果的插入

记录值的插入语法如下:

INSERT INTO table [(column [, column…])]

VALUES (value [, value…]);

一次插入操作只插入一行

可以添加所有列

insert into emp (empno,ename,job,mgr,hiredate,sal, comm, deptno) values(1111,’gao’,’clerk’,7902,sysdate, 10000,3000,40)

此处插入的元组中列的个数、顺序与emp的结构完全一致,因此表名之后的列名可以省略不写

insert into emp values(2222,’gaohs’,’clerk’,7902,sysdate,10000,3000,40)

也可以只添加部分列

insert into emp(empno,ename) values (3333,’xiaozhang’)

但要求省略的列必须满足下面的条件:

该列定义为允许Null值。

在表定义中给出默认值,这表示如果不给出值,将使用默认值。

如果不符合上面两个条件,将会报错。不能成功插入。

可以用insert语句把一个select语句的查询结果插入到一个基本表中,语法如下:

Insert into tablename(column,..)

select * from tablename2

创建一个临时表

create table temp

as

select * from emp

where 1 = 2

执行插入

insert into ss select * from emp;

DML—update语句

Update语句用于修改基本表中元组的某些列,其语法如下:

UPDATE table

SET column = value [, column = value] …

[WHERE condition];

其语义是:修改基本表中满足条件表达式的那些元组的列值,需修改的列值在set子句中指出。

SQL的删除操作是指从基本表中删除元组,语法如下:

DELETE [FROM] table

[WHERE condition];

其语义是从基本表中删除满足条件表达式的元组

delete from table 表示从表中删除一切元组

如果想从表中删除所有的行,不要使用delete,可使用truncate table 语句,完成相同的工作,但是速度更快。

小结

SQL语言基础

select单表查询语句

select子句

去除重复行

where 条件查询

order by排序

使用函数

group by分组

having 分组筛选

DML

select 语句

--最简单的SQL语句  *:所有字段
select *  from dept
select *  from emp
select empno,ename,sal,comm from emp  --查询部分列

--使用算术表达式
select * from emp;
select empno,ename,sal,comm,sal+comm from emp;--如果没有津贴,就没有月收入,不合理!!1
select empno,ename,sal,sal*12,sal*12+3000  from emp

--使用别名
select empno,ename,sal,sal*12,sal*12+3000 from emp;
select empno,ename,sal 月薪,sal*12 年薪,sal*12+3000 年薪含年终奖 from emp;
select empno,ename,sal as "月薪",sal*12 "OneYearSalary",sal*12+3000 "年薪+含年终奖" from emp;
--使用别名的好处:增加可读性
--as可以省略
--如果含有空格、+等特殊字符、如果区分大小写,必须使用双引号。不是使用单引号

--去除重复行 distinct
select * from emp
select distinct job from emp
select distinct Job,deptno from emp   --distinct是针对后面所有列
select distinct (Job,deptno) from emp  --此处不要使用()

--排序order by
select * from emp
select * from emp order by sal --默认升序排列
select * from emp order by sal  asc --asc  升序 可以省略
select * from emp order by sal  desc --desc 降序  不能省略

select * from emp order by sal desc, hiredate desc --可以按照多个列进行排序

select empno,ename,job,sal 月薪 from emp order by 月薪 desc, hiredate desc --可以按照别名排序


where子句

--查询部分行的数据 where
select * from emp;
select empno,ename from emp;

select * from emp where deptno = 20
select * from emp where deptno != 20
select * from emp where deptno <> 20

select * from emp where ename = 'SMITH'
SELECT * FROM EMP WHERE ENAME = 'SMITH'
--关键字、表名、字段名不区分大小写,但是字段的数据区分大小写

select * from emp where hiredate <'1982-12-23'
select * from emp where hiredate <1982-12-23
select * from emp where hiredate <1982/12/23
select * from emp where hiredate > '23-12月-1982'  --!! 默认的日期字符串个数
select * from emp where hiredate > "23-12月-1982"
--什么时候使用单引号,什么时候使用双引号
--除了使用双引号(只有三种情况,比如别名)的地方,都使用单引号

--工资在1500--2500之间的员工信息
select  * from emp where sal > 1500  AND sal <2500
select  * from emp where sal >= 1500  AND sal <=3000 --出于性能考虑,建议使用between and
select  * from emp where sal between  1500 and  3000 --闭区间  包含=
--岗位是CLERK或者是SALESMAN的员工信息
select * from emp where job ='CLERK' or job = 'SALESMAN';
select * from emp where job ='CLERK' or job = 'SALESMAN' order by job desc;
select * from emp where job ='CLERK' || job = 'SALESMAN'  --不对  ||具有特殊的含义 字符串拼接

select * from emp where job in ('CLERK', 'SALESMAN' );
select * from emp where job not in  ('CLERK', 'SALESMAN' ); -- is not in , not in not

--没有津贴的员工信息
select * from emp where comm is  null -- is null !!!
select * from emp where comm  is not   null  -- is not null

--姓名以S开始,姓名包括S的员工信息 模糊匹配 使用like
select * from emp where ename like  'S%';  --% 任意多个字符
select * from emp where ename like  'SMITH%'; --最少0个字符,可以0,1,2,...多个

select * from emp where ename like '%A%'
--第二个字母是A
select * from emp where ename not  like '_A%'  -- _ 任意一个字符

--()的使用
--使用小括号的作用
--1.增加可读性
--2.改变执行的顺序
select * from emp where job='SALESMAN' or job='CLERK' and sal>=1280;

select * from emp where (job='SALESMAN' or job='CLERK') and sal>=1280;

select * from emp where job='SALESMAN' or (job='CLERK' and sal>=1280);


函数1

--在Select中使用函数
--员工姓名大写、小写、首字母大写
select * from emp;
select empno,ename,upper(ename),lower(ename),initcap(ename)  from emp
select ename from emp --函数不会改变数据库表的值,而是生产一个中间结果
--使用函数的好处,提高SQL语句的处理能力,降低了操作的难度

--员工的人数,平均工资,最高工资
select * from emp
select count(*) from emp;

select avg(sal),max(sal) from emp
select empno,ename from emp  --14
select avg(sal),max(sal) from emp --1
select empno,ename,avg(sal),max(sal) from emp  -- ????

--单行函数  upper(ename),lower(ename),initcap(ename)
--作用于每一行数据,每一行数据分别生产一个结果    14  ----14
--多行函数  count(*) avg(sal),max(sal)
--作用于每一行数据,但是所有行数据生产一条记录

--除了多行函数,都是单行函数
--基本的多行函数只有5个:avg() sum() max() min() count()

--字符函数

select empno,ename,upper(ename),lower(ename),initcap(ename)  from emp
--伪表 dual
select 1+2*6/2 from dual;
select sysdate,user from dual; -- !!!!
select upper('Beijing'),lower('Beijing'),InitCap('beijing') from dual;
select substr('beijing',4,3) from dual;--索引从1开始,
--数字函数 ceiling 向上取整  floor 地板 向下取值
select round(3.5),ceil(3.5),floor(3.5),mod(5,3) from dual;

--日期函数
select months_between ('11-11月-05','11-1月-05') from dual;

--转换函数

--自动转换
select 20 + 34.5 from dual; -- oracle中没有int、double之分
select '20' + 34.5 from dual;-- 54.5   2034.5  Oracle中的+没有字符串拼接的功能

select '20' || 34.5 from dual;  --2034.5  ||不是or,是字符串拼接
--强制转换 to_number()  to_date()  to_char() Local
--数值---字符串
select empno,ename,sal,to_char(sal),to_char(sal,'$00,000.000'),to_char(sal,'L99,999.999') from emp

--日期--字符串
select * from emp where hiredate < '1981-12-23'
--方法1:都变成字符串  DateFormat
select * from emp where to_char(hiredate,'YYYY/MM/DD') > '1981/12/23'
select to_char(hiredate,'YYYY/MM/DD') from emp
--方法2:都变成日期
select * from emp where hiredate > to_date('23-12-1981','DD-MM-YYYY')
--方法3:默认转换
select * from emp where hiredate > '23-12月-1981'

--其他函数


函数2

--其他单行函数 nvl nvl2 decode
--统计一个员工的月总收入 = sal + comm
select * from emp;
select empno,sal,comm from emp
select empno,sal,comm,sal+comm 月总收入 from emp
--nvl  if(comm is null) then comm = 0 if单分支
select empno,sal,comm,nvl(comm,0),sal+nvl(comm,0) 月总收入 from emp
--nvl2 if(comm is not null) then sal+comm  else sal  if多分支
select empno,sal,comm,nvl2(comm,sal+comm,sal) 月总收入 from emp
--decode
--员工的岗位使用中文表示  经理  董事长
--相当于if的多分支语句  if (job =='CLERK') then '店员' else if (job =='SALESMAN') then '销售' ........  else '其他'
select empno,ename,job,decode(job,'CLERK','店员','SALESMAN','销售','MANAGER','经理','其他') 中文岗位 from emp;

--多行函数
--1.什么是多行函数:对一组数据进行运算,针对一组数据(多行记录)只返回一个结果
--2.常用的多行函数:sum()  avg()  只针对数值数据   count()   max()   min()   针对所有类型数据

--获取所有员工的人数,最高工资、最低工资、总工资、平均工资
select max(sal),min(sal),sum(sal),avg(sal),count(sal) from emp;

--多行函数都没有将null值计算在内
select comm from emp
select count(comm),sum(comm),avg(comm) from emp
--如果想将null也计算在内,可以使用nvl
select count(nvl(comm,0)),sum(comm),avg(nvl(comm,0)) from emp

--统计数据库表有几条记录
select comm from emp
select count(comm) from emp --4  因为有null,不能用于计数

select * from emp;
select count(*) from emp;  --!!! 经常用来统计数据库表的记录数

select 1 from emp;
select count(1) from emp;--!!! 经常用来统计数据库表的记录数 建议采用该方式

--统计岗位的数量
select job from emp
select distinct job from emp;
select count(distinct job) from emp


分组和having

--select group by  having
--所有员工的平均工资
select * from emp
select avg(sal) from emp --1
select deptno from emp;  --14

--各个部门的员工的平均工资
select deptno,avg(sal) from emp --?? 字段、单行函数不能和多行函数共存,除非是group by

select deptno,avg(sal) --如果字段和多行函数工资,字段必须是参与分组的字段
from emp
group by deptno

select job,avg(sal) --如果字段和多行函数工资,字段必须是参与分组的字段
from emp
group by deptno

--分组之后按照平均工资降序排列
select deptno,avg(sal) --如果字段和多行函数工资,字段必须是参与分组的字段
from emp
group by deptno
order by avg(sal) desc

select deptno,avg(sal) --如果字段和多行函数工资,字段必须是参与分组的字段
from emp
--where sal > 2000 --where子句中不允许出现多行函数
group by deptno
having avg(sal)>2000 --having和where都是用来筛选记录的
order by avg(sal) desc

--where和having的区别
--1.where中不能出现多行函数 例如avg(sal),having中可以出现
--2.where是对分组group by之前的数据进行筛选,having是对group by之后的数据进行筛选

--各个子句的书写顺序
--select、 from、 where 、group by、 having 、order by

--各个子句的执行顺序
--from  where  group by  select having order by
--最后执行的order by

--为什么where子句中不能使用多行函数
--group by之后的子句可以使用多行函数
--where执行顺序在group by之前,所以不能使用分组函数

--各个岗位的平均工资,除了MANAGER
select * from emp;

select job, avg(sal)
from emp
--where
group by job
having  job !='MANAGER'
order by   job

select job,avg(sal)
from emp
where job != 'MANAGER'
group by job
having avg(sal) > 1500
--order by job
order by avg(sal)

--如果查询条件不是多行函数,可以写在where子句或者having子句
--如果查询条件是多行函数,只能写在having子句中

--在emp表中,列出工资最小值小于2000的职位
--职位   工资最小值 min()  小于2000

--在emp表中,列出各个职位的工资最小值
select * from emp;

select job,min(sal)
from emp
group by job

--在emp表中,列出工资最小值小于2000的职位
select job,min(sal)
from emp
group by job
having min(sal)<2000
order by min(sal) desc

--统计各部门的最高工资,排除最高工资小于3000的部门。
select deptno,max(sal) maxsal
from emp
group by deptno
having max(sal) <3000
--having maxsal < 3000

--统计人数小于4的部门的平均工资。
select deptno,count(*),avg(sal)
from emp
group by deptno
having count(*)<4

--列出平均工资大于1200元的部门和工作搭配组合
select * from emp
select job,deptno from emp

select deptno,job,count(*),avg(sal)
from emp
group by deptno,job
having avg(sal) > 1200
order by avg(sal)


DML

--DQL:select单表查询  select ... from ...where...group by ...having...order by
--还有SELECT多表查询 子查询

--DML:insert update delete  都需要事务
--insert
select * from dept;
insert into dept values(50,'教学部','beijing');
commit; --提交  真正的写入到数据库
rollback; --回滚  放弃写入到数据库
--注意:insert update、delete需要事务
insert into dept values(50,'教学部','beijing');--主键约束  部门编号唯一 不能重复
insert into dept values(60,'市场部市场部市场部市场部','beijing'); --dname长度超过了限定值
insert into dept values(60,'市场部','beijing');
desc dept;--查看表的结构

select * from emp
insert into emp values(1111,'1111',1111,1111,'23-12月-1980',800,90,30);--注意日期写法
insert into emp values(2222,'2222',2222,2222,sysdate,800,30)--没有足够的值
insert into emp values(2222,'2222',2222,2222,sysdate,800,null,30)
insert into emp (empno,ename,sal)values (3333,'3333',3333);
--update
update emp set ename ='4444' where empno=3333
update emp set ename ='5555',job='6666',sal = 7777 where empno = 2222

--delete
delete emp where empno = 1111
delete from  emp where empno = 2222 or empno = 3333
delete from emp where empno in (2222,3333)  --Oracle中from可以省略  MySQL中from不可缺少

--其他形式的添加和删除
create table emp2
as
select * from emp

select * from emp2

create table emp3
as
select * from emp where 1=2

select * from emp3
--!!!!使用比较少,但是效率高,有用途
insert into emp3
select * from emp where sal > 2500

create table emp4
as
select empno,ename,sal,comm  from emp where sal > 2000

select * from emp4

--删除所有数据
delete emp4; --需要事务  可以提交或者回滚
select * from emp3

truncate table emp3; --直接删除,无法回滚  删除所有数据采用该方法,效率高
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: