基本SQL语句(Oracle)

版权声明:Mr.O版权所有 转载请标明出处 https://blog.csdn.net/qq_28189423/article/details/82946692

 

oracle数据类型

文本,二进制类型:

char  存放字符串,最大存放2000个字符,是定长。

varchar2 存放字符串,最大可以存放4000个字符,可变长度。

如果数据长度是固定的,应当使用char,如果存放的数据长度是变化的,则使用varchar2。

nvarchar2  Unicode数据类型,变长,最大长度4000。

clob 字符型大对象,变长,最大8tb

blob 二进制大对象,变长,可以存放图片和声音  【注意:一般不直接存放图片和声音,而是存放链接。】

 

数值型:

number  可以存放整数,也可以存放小数。

number  保存数据范围,   -1.0e-130<=number<1.0e126,默认可以表示整数和小数。

number(10,5)   有效数字10位,小数5位

number(5,0) 、number(5)  有效数字5位,小数0位  整数。

注意:如果有明确要求小数点保存到第几位,则明确指定,如果没有,直接使用number即可。

number是变长 使用1-22bytes来表示

 

日期类型:

date  用于表示时间   年月日时分秒,默认格式 DD-MM-YYYY,从公元前4712年1月1日到公元4712年12月31日的所有合法日期。

添加的时候使用to_date('20180408 222730','yyyyMMdd  hh24miss')

TimeStamp 更加精确,精确到小数秒,最多小数点后9位,默认6位。

使用麻烦,如果没有特别要求,不推荐。

insert into TEST(updatetime) values(to_timestamp(to_char(sysdate,'YYYY-MM-DD HH24:MI:SS'),'YYYY-MM-DD HH24:MI:SS'));

 

数据表的创建

类和表的对应关系。

学生信息表,教师信息表。

 

基本语法:

create table student(

       id number,

       name varchar2(64),

       sex char(2),

       birthday date,

       score number(4,2),

       resume clob

);

 

 

使用sql脚本创建表。

使用工具创建表。

 

数据表的修改

添加列:

alter table 表名 add(新的列名 列的类型);

alter table 表名 add(新的列名 列的类型,新的列名2 列的类型2);

 

 

删除列:

alter table 表名 drop column(列名);

alter table 表名 drop (列名,列名2);--删除多列不能添加column

 

 

修改字段的类型:

alter table 表名 modify(列名 列的新类型);

alter table 表名 modify(列名 列的新类型,列名2 列2的新类型);

 

修改表名

rename 旧表名to 新表名;

 

删除表

drop table 表名;

 

CRUD操作

增加(Create)、读取查询(Retrieve)、更新(Update)和删除(Delete)

 

INSERT

  1. 插入的数据应与字段数据类型相同。
  2. 数据的大小应该在规定范围之内。
  3. 在values中列出的数据位置必须与被加入的列的排列位置相对应。
  4. 字符和日期型数据应包含在单引号中。
  5. 插入空值,不指定’’或给null

insert into stu values(1,'ouyang','男');

insert into stu(id) values(1);

insert into stu values(1,null,’’);

 

比较运算符

> 大于

< 小于

>= 大于等于

<= 小于等于

=  等于

!= 不等于

<>不等于

SELECT

select * from表名 where 条件

select 列名 from 表名 where 条件

 

select 指定查询哪些列的数据。

column指定列名

 

使用scott用户下的三张表:dept,emp,salgrade进行查询演示。

  1. 基本查询语句 select [distinct] *|[column 1,column 2 ……] from表名 [where (条件)]

示例:

查询所有列。      select * from emp;

查询指定列。     select distinct job from emp;

不显示重复列。   select distinct job from emp;

  1. 查询中使用算术表达式 select sal*12 from emp;
  2. 查询中使用函数 select sal*12+nvl(comm,0)  from emp;

说明: NVL(E1, E2)的功能为:如果E1为NULL,则函数返回E2,否则返回E1本身。

  1. 拼接字符串select ename||'是一个'||job from emp;

说明:在查询时,如果希望将多列拼接起来作为一个字符串可以使用||

  1. where子句的用法

查询工资高于3000的员工

select * from emp where sal>3000;

 

查询1982年1月1日之后入职的员

select * from emp where hiredate>to_date('19820101','yyyymmdd');

 

显示工资在2000和2500之间的员工信息

select * from emp where sal>=2000 and sal<=2500;

 

  1. between  and  在两者之间

select * from emp where sal between 2000 and 2500;--闭区间

select * from emp where sal not between 2000 and 2500;

  1. in

select * from emp where ename in ('ALLEN','WARD','MARTIN');

select * from emp where ename not in ('ALLEN','WARD','MARTIN');

  1. 使用like模糊查询

%表示0到多个字符

_表示一个字符

select * from emp where ename like '%ITH';

select * from emp where ename like '_ITH';--没有数据

select * from emp where ename like '_MITH';

select * from emp where ename not like '%LEN';--不常用

  1. is null的用法

显示没有上级的员工

select * from emp where mgr is null;

  1. 使用逻辑运算符

select * from emp where mgr is null or comm is null;

select * from emp where mgr is null and comm is null;

  1. 增加排序功能order by

select [distinct] *|[column 1,column 2 ……] from表名 [where (条件) order by 列名 ]

 

select * from emp order by sal;--默认升序

select * from emp order by sal asc;--升序

select * from emp order by sal desc;--降序

select * from emp where job = 'CLERK' order by sal desc;--降序

select * from emp where job = 'CLERK' order by empno,sal desc;--按照员工号升序工资降序

select * from emp order by 8;--使用数字排序  按照表列的顺序

select empno,ename,deptno from emp order by 3;--使用数字排序  按照查询列的顺序

 

  1. 别名排序

select sal*12+nvl(comm,0)  yearSal  from emp order by yearsal;

 

注意:

oracle 关键字,列名,表名等都不区分大小写,但是表中的数据是区分大小写的。

 

扩展:

select * from user_tables;  查询用户下的所有表

select * from dba_users;--查询所有用户信息,使用管理员用户

 

UPDATE

update 表名 set 列名=表达式 {+}  where 条件

 

update语法可以使用新值更新原有表行中的各列。

set子句指示要修改哪些列和给与哪些值。

where子句指定更新哪些行。如没有where子句,则更新所有的行(特别小心)。

DELETE

delete from 表名where 条件

 

truncate table 表名;删除所有记录,不写日志,速度快,无法恢复。

COMMIT和ROLLBACK

commit 提交

rollback 回滚

 

DML,DDL,DCL

DML(data manipulation language):

它们是SELECT、UPDATE、INSERT、DELETE,就象它的名字一样,这4条命令是用来对数据库里的数据进行操作的语言

DDL(data definition language):

DDL比DML要多,主要的命令有CREATE、ALTER、DROP等,DDL主要是用在定义或改变表(TABLE)的结构,数据类型,表之间的链接和约束等初始化工作上,他们大多在建立表时使用

DCL(Data Control Language):

是数据库控制功能。是用来设置或更改数据库用户或角色权限的语句,包括(grant,deny,revoke等)语句。在默认状态下,只有sysadmin,dbcreator,db_owner或db_securityadmin等人员才有权力执行DCL

 

统计函数

max,min,sum,avg,count

查询员工数量

select count(*) from emp;

查询有奖金的人

select count(comm) from emp;--空值不统计

查询最高工资。

select max(sal) from emp;

查询最低工资。

select min(sal) from emp;

查询最高年薪。

select max((sal+nvl(comm,0))*12) from emp;

查询平均工资。

select avg(sal) from emp;

select avg(comm) from emp;--奖金不一定有,没有的不参与

查询总工资。

select sum(sal) from emp;

查询真正的平均工资

select sum(sal)/count(*) from emp;

 

group by  和 having子句

group by 列名 用于分组

having 表达式  针对于一组数据,譬如求

  

两者一般结合使用,单独使用也可以。

按照部门分组查询部门平均工资和最高工资

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

select avg(sal),max(sal),deptno from emp;--错误 不是单组分组函数

 

查询部门不同岗位的平均工资和最高工资

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

 

查询部门不同岗位的平均工资和最高工资并按照部门和岗位排序。

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

 

查询部门平均工资低于2000的部门的平均工资和最高工资。【典型用法】

select avg(sal) ,max(sal),deptno from emp group by deptno having avg(sal)<2000;

 

select avg(sal) ,max(sal),deptno from emp  where avg(sal)<2000 group by deptno; --错误,此处不允许使用分组函数

 

单独使用having

select avg(sal) ,max(sal),deptno from emp group by deptno having 1>2;--扩展 特殊形式

 

为什么不能使用having替代where

select * from emp having avg(sal)>20;--不是group表达式

 

当同时使用group by   having   order by  的顺序问题

推荐使用顺序 group by   having  order by

查询部门工资低于2000的部门不同岗位的平均工资和最高工资并按照部门和岗位排序。

select avg(sal),max(sal),deptno from emp group by deptno,job having avg(sal)<2000 order by deptno,job;--推荐写法

 

select avg(sal),max(sal),deptno from emp having avg(sal)<2000  group by deptno,job order by deptno,job;--不推荐写法

 

select avg(sal),max(sal),deptno from emp order by deptno,job having avg(sal)<2000  group by deptno,job ;--错误写法

 

其他常用语句

select * from all_tables where owner = 'SCOTT';--查询scott用户下的所有表

select * from user_tables;--查询当前用户的所有表

猜你喜欢

转载自blog.csdn.net/qq_28189423/article/details/82946692