一 基本概念
1数据库(Database) 数据库管理系统DBMS(Database Management System)
2标准数据查询语言SQL((Structured Query Language)
主要包括DDL(数据定义语言),DML(数据管理语言),DCL(数据库控制语言)
3 DML(数据管理语言)中DQL(数据查询语言)最重要
2 表从属于用户,查询表采用(用户名.表名)
用户访问自己的表可省略用户名
其他用户若存在访问权限,访问表需要写明用户名
4 oracle 命令不区分大小写
二 表结构
主体结构
表名
字段名
字段类型
number(长度,[精度]) char(定长长度) varchar2(变成长度) data timestamp
字段约束
记录
三范式
每一列都是不可分割的基本数据项定义每一列唯一性
非主属性依赖于主键 定义主键
非主键属性依赖于主键 定义外键,便于拆分表,避免冗余
三 DQL(数据查询语言)
1 基本格式
SELECT (distinct) 列名|* |表达式 FROM 表名 WHERE 行过滤条件 GROUP BY 分组字段1,分组字段2 分组 HAVING 组过滤条件 ORDER BY 排序条件 |
执行顺序(from—where—group by—having—select—order by ) 注意之后定义的内容不能之前使用
查询逻辑(查询的内容 来源 条件)
列名表示需要的字段,通过逗号分隔
别名定义列的显示名称
表名表示锁查询的表
distinct去重 null也会进行去重
--表示注释
Order by 指定字段排序
2 运算符与比较
表达式根据计算结果生成一个列,可定义别名,表达式可以包含类名运算
= 、>、 <、 >=、 <=、 !=(不等于)、 <>(不等于) not
and且、 or或、 not非
between (较小值)and(较大值) 范围区间
in (值1,值2 ) 多个定值满足任意一个,可为值和字符串
Union 对两个结果集求并集(去重)
Union All 对两个结果集求全集(不去重)
Minus 对两个结果集求差集(获取内容不重复的部分)
Intersect 对两个结果集求交集(去重)
Is 判断属性是否相同,=判断值是否相同 is和is not用于对null的判断
3 字符串
3.1基本概念
1字符串用单引号扩住
2字符串中小写自动转为大写 空格为非标准写法
3通过””双引号扩住,能够保证非标准写法和小写原样输出
4字符字符串拼接采用 || 实现
3.2字符串模糊查找
like 关键字进行查找 查找对象 % 表示若干任意字符 _ 表示一个任意字符
基本结构 like ‘%呵呵_%’ escape(‘A’) 通过escape定义转义字符
3.3null
Null为空串,只能进行字符串拼接,无法进行计算
null处理 nvl(列名,null的设定值) 若该列的值不为null不该变,若为null则设为设定值
null值比较通过 is和is not执行
3 子查询
通过子查询获取结果集,结果集可以作为数据来源
--查询工资比SMITH高的同一部门的员工信息 select empno, ename, deptno, sal from (select * --结果集 from emp where sal > (select sal from emp where ename = 'SMITH') and deptno = (select deptno from emp where ename = 'SMITH')); |
在条件判断中通过子查询获取值,通过子查询结果进行条件判断
--查询工资比SMITH高的同一部门的员工信息 select * from emp where sal > (select sal from emp where ename = 'SMITH') and deptno = (select deptno from emp where ename = 'SMITH'); |
子查询能够使用外查询定义的表
4 exsit 存在即合法
select * from emp where exsit(内部为一个存在判断)
作用1判断是否满足条件,若满足则全部显示
作用2执行动态查找 外部存在
--查询'SALES', 'ACCOUNTING'部门的员工信息 select * from emp where exists (select deptno from dept where dname in ('SALES', 'ACCOUNTING') --执行子查询 and emp.deptno = dept.deptno); --将子查询的内容与外部查询关联 |
若是子查询与主查询都查的一个表,可以通过别名 进行区分
5 别名
as关键字 字段别名之前可以使用as 表别名不能使用as
双引号原样输出,可以存在 空格与区分大小写
7 获取所有记录
select * from 表
select * from 表 where 1+1 (推荐 便于程序后续处理,拼接and…)
select * from 表 where 任意字段 like ‘%’
8 Order By结果排序
asc升序(默认) desc降序 null last null first升序
格式 order by 字段1 desc(asc) , 字段2 desc(asc) null last
5 时间对象
SYSDATE 和 CURRENT_DATA 当前时间
字符串转换
将字符串转为时间对象to_data('2019/6/18 14:20:13','yyyy/mm/dd hh24:mi:ss')
将时间对象转为字符串to_char(时间对象, 'yyyy”年”mm/dd hh24:mi:ss')可部分获取
时间+(int) 对天数进行更改,可为负数
add_months(时间对象,变化月) 对月份进行修改
months_between(时间对象1,时间对象2) 获取月份差(大月前,小月后)
last_day(时间对象) 获取当月最后一天
next_day(时间对象,’星期几’) 获取下一周的指定日的时间
6 decode 和case 选择处理
结构 decode(字段,值1,结果1,值2,结果2…,默认值)
对字段值进行判断,根据内容赋给不同的对应值 值可以为其他字段/字符串/数字
结构 case 字段 when 值 then (重复when,then)结果1 else 默认值 end
对字段值进行判断,根据内容赋给不同的对应值 值可以为其他字段/字符串/数字
11 事务与回滚
commit 对数据增加,删除,修改的时候,会自动开启事务
rollback 取消当前事务的修改内容
12 伪列和虚表
伪列: 表中不存在的列 可以是计算公式可以是字符串
SELECT 1+1 FROM EMP 获取1+1的伪列
虚表:dual表中没有任何数据
SELECT 1+1 FROM DUAL 获取生成1+1伪劣的DUAL的虚表
四 聚合函数
常用名称:函数|组函数|组合函数|聚合函数
max()最大 min()最小 avg()平均 sum()求和 count(字段|1|*)计数
null不会导致报错
-- 计算20部门每个月的工资花销和平均工资 select sum(sal),avg(sal) from emp where deptno=20; |
聚合函数只能和组函数或者分组字段共同使用不能直接使用在where中
能够通过子查询间接使用
select ename,sal from emp where sal=(select max(sal) from emp); |
聚合函数能够嵌套
select min(avg(sal)) from emp group by deptno |
五 分组
group by …having…
--找出20部门和30部门的最高工资 select max(sal) ,deptno from emp group by deptno having deptno in(20,30);
select max(sal), deptno from emp where deptno in(20,30) group by deptno; |
聚合函数和分组字段混用
select max(sal),deptno from emp group by deptno; |
六 行转列
Id |
Name |
Course |
Score |
1 |
张三 |
语文 |
81 |
2 |
张三 |
数学 |
75 |
3 |
李四 |
语文 |
81 |
4 |
李四 |
数学 |
90 |
5 |
王五 |
语文 |
81 |
6 |
王五 |
数学 |
100 |
7 |
王五 |
英语 |
90 |
select name, min(decode(course, '语文', score)) --语文 min(decode(course, '数学', score)) --数学 min(decode(course, '英语', score)) --英语 from tb_student group by name; |
张三 81 75 李四 81 90 王五 81 100 90
张三 |
81 |
75 |
|
李四 |
81 |
90 |
|
王五 |
81 |
100 |
90 |