oracle之基本SQL语句

基本SQL语句

01 SQL语言基础

一、先睹为快
oracle之基本SQL语句_第1张图片
二、什么是SQL语言
结构化查询语言(Structured Query Language)(发音?es kju??)
SQL是最重要的关系数据库操作语言,是所有关系数据库管理系统的标准语言
许多数据库厂商在使用SQL的同时,都对SQL进行了扩展,比如ORACLE的PL/SQL语言, MS SQL -Server的T-SQL语言
SQL语言是一种非过程化语言, 只需要提出"做什么”,而不需要指明“怎么做”
三、SQL可以做什么
数据库数据的增删改查操作(CRUD)
数据库对象的创建,修改和删除操作
用户权限/角色的授予和取消
事务控制
四、SQL语言的分类
1.DQL(数据查询语言)select
2. DML (数据操作语言) insert、 update、
delete
3. DDL (数据定义语言) create、 alter、 drop
4. DCL (数据控制语言) grant、 revoke
5. TCL(事务控制语言)SAVEPOINT、
ROLLBACK、SET TRANSACTION ,
COMMIT
数据操作语言针对表中的数据,而数据定义语言针对数据库对象(表、索引、视图、触发器、存储过程、函数、表空间等)
五、SQL标准的发展
oracle之基本SQL语句_第2张图片

02 练习表介绍

一、用户
scott
二、数据库表
1.Dept部门表
2. Emp员工表
3. Salgrade 工资等级表
4. Bonus奖金表
oracle之基本SQL语句_第3张图片
oracle之基本SQL语句_第4张图片
三、表和表之间的关系
员工属于某个部门
四、关系数据库基本概念
1.关系:整个二维表
2.关系名:表格名称.
3.元组:行数据(记录)
4.属性:列数据(字段)
5.属性名:列名称(字段名)
6.主键:唯一-确定元组的属性组(关键字)
7.域:属性的取值范围
oracle之基本SQL语句_第5张图片

03 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 ename ||'is a '|| job from emp;
select empno, ename || '"s annual salary is ' ||sal*12 from emp;

连接运算符“||”可以把列与字符、或其它表达式连接在一起,得到一个新的字符串,实现’合成’列的功能。

04 查询语去除重复行

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

select deptno from emp;

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

select distinct deptno from emp;
select distinct job from emp;

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

select, distinct deptno job from emp;

05 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;

06 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','CL ARK';KING');

oracle之基本SQL语句_第6张图片
三、使用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:把检索结果较多的条件放到后面
七、四种运算符优先级:算术>连接>比较>逻辑
oracle之基本SQL语句_第7张图片
可使用小括号强行改变运算顺序

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

07 函数的使用——单行

一、前言
使用函数可以大大提高SEL ECT语句操作数据库的能力。它给数据的转换和处理提供了方便。函数只是将取出的数据进行处理,不会改变数据库中的值。
Oracle函数分为单行函数和多行函数两大类
●单行函数分类
1.字符函数
2.转换函数
3.通用函数
4.数值函数
5.日期函数
多行函数
1.sum() avg() 仅适用数值型
2. count() max() min() 适用任何类型数据
一、字符函数
oracle之基本SQL语句_第8张图片
二、数值函数
oracle之基本SQL语句_第9张图片
三、日期函数
oracle之基本SQL语句_第10张图片
四、转换函数
Oracle的类型转换分为自动类型转换和强制类型转换。

select '12.5'+30 from dual;
select '12 5'||30 from dual;

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

oracle之基本SQL语句_第11张图片
oracle之基本SQL语句_第12张图片
五、其他函数
oracle之基本SQL语句_第13张图片

08 函数的使用——多行

一、定义
对一组数据进行运算,针对一组数据(多行记录)只返回一个结果,也称分组函数。
二、看图说话
oracle之基本SQL语句_第14张图片
三、常用的多行函数
1.sum() avg()仅适用数值型
2. 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;

六、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;
七、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- having- select-- 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

八、相关SQL

select max(sal),count(*) from emp;
//显示所有员工的最高工资和人数
//显示每个部]的最高工资和人数
select deptno,max(sal),count(*) from emp group by deptno;
select deptno,max(sal),count(*) from emp group by deptno ;
select deptno,max(sal),count(*) from emp group by deptno order by deptno;
select deptno,max(sal),count(*) from emp group by deptno order by max(sal);

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

select upper(job), count(*) from emp
group by upper(job);
select * from emp for update;

显示每个部]的不同岗位的人数

select deptno,job, count(*)
from emp
where deptno >10
group by deptno,job
order by deptno desc,job desc;

where与having的区别
区别1: where是分组之前对所有的记录进行筛选,having是分组之后对分组的数据进行筛选。
区别2: where中不允许出现多行函数, having中可以出现多行函数。
区别3:某些功能使用where和having都可以实现, 使用where效率高;某些功能只有才有having才可以实现。
显示部门]编号大于10 的部门的人数,要求人数大于4 .

select deptno,count(*)
from emp
where count(* )>4
group by deptno;
select deptno,count(*)
from emp
group by deptno
having count(*)>4;

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

select job,min(sal)
from emp
where job <> 'PRESIDENT'
group by job
having min(sal)<2000
order by job desc;

09 DML语句

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

INSERT INTO table [(column [, colum..)] 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 temp select * from emp;

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

UPDATE table
SET column = value [, column = value] ...
[WHERE condition];

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

UPDATE TEMP SET ENAME=’ 张三’, SAL=10000 WHERE empno=7369;

三、删除
1.使用DELETE
SQL的删除操作是指从基本表中删除元组,语法如下:

DELETE [FROM] table [WHERE condition]; 

其语义是从基本表中删除满足条件表达式的元组.
delete from table表示从表中删除-切元组
如果想从表中删除所有的行,不要使用delete,可使用truncate table语句,完成相同的工作,但是速度更快。
SQL

DELETE FROM TEMP WHERE EMPNO=7369;

2.使用TRUNCATE
使用Truncate语句是删除表中的所有记录。
语法格式: Truncate [table] table_ name;
(1 )删除所有记录不保留记录占用空间

Truncate [table] table_ name [drop storage];

如:删除users表中的所有数据并不保存占用空间: Truncate table users drop storage;由于默认使用drop storage关键字,所以可以省略drop storage;
(2)删除所有记录保留记录占用空间

Truncate [table] table_ name [reuse storage];

如:删除users表中的所有数据并保存占用空间: Truncate table users reuse storage;
四,注意
进行添加,删除,更新这之后可以回滚可以提交,只有提交了才算真正更改了

你可能感兴趣的:(sql,oracle,数据库)