一、数据库:
- 即一种数据的组织形式,用于存储数据;
- SQL: 结构化查询语言,不区分大小写;
- SQL语言种类:
- DCL、数据库控制语言
- 是数据库控制语言。是用来设置或更改数据库用户或角色权限的语句,包括(grant,deny,revoke等)语句
- DDL、数据库定义语言
- DDL比DML要多,主要的命令有CREATE、ALTER、DROP等,DDL主要是用在定义或改变表(TABLE)的结构,数据类型,表之间的链接和约束等初始化工作上,他们大多在建立表时使用。
- DML、数据库操纵语言
- 负责对数据库对象运行数据访问工作的指令集,以INSERT、UPDATE、DELETE三种指令为核心
- DQL、数据库查询语言
- 数据查询语言DQL基本结构是由SELECT子句,FROM子句,WHERE
- DCL、数据库控制语言
- SQL语言种类:
- Oracle: 甲骨文公司的产品
二、常用数据类型:
- 数值型number
- number(10,2) 整体长度为10位,小数位2位,整数位8位
- 字符型:char
- 不可变长度字符型
- varchar2可变长度字符型
- 日期类型Date
- 日期格式为日月年: 10-10月-1999
- 最大两个G长文本类型:long
- 可直接存放字符
- 日期格式为日月年: 10-10月-1999
- 大字段:
- 字符为单位CLOB、
- 字节为单位:BLOB
三、用户、数据库基本常识
- 高级用户:
- system
- sys
- 样本数据库
- scott用户默认密码tiger
- 解锁语句:alter user 用户名 account unlock;
- SID唯一标识数据库的一个id,默认orcl
- 约束:限制表中的列可以存放什么样的数据;
- 例如:是否可以为空,是否可以重复,或者数据范围;
- primary key 主键约束
- 添加主键约束的列,该列数据不允许重复且不允许为空;唯一标示行记录;
- not null不允许为空;
- check一种检查约束,开发不用;
四、表操作
- 1、表的创建:
- create table 表名(列名 类型(长度 ) 约束,…)
- 2、查看表结构: desc 表名;
- 3、 数据插入语句:
- insert into 表名 values(值,值,..)
- 或者 insert into 表名(列,列..) values(值,值,…)
- 4、查询所有行记录select语句
- select 列名,… from 表名 [where 过滤条件]
- 5、删除表数据(注意:删除行记录一般我们都根据主键列删除)
- delete from 表名 [where 过滤条件]
- 6、修改表数据(注意:修改行一般也是根据主键列进行修改,注意主键列永远不允许修改):
- update 表名 set 列明=新数据,…. [where 过滤条件]
- 7、表结构的操作:(了解)
- (1)修改列名
- alter table customer rename to cus; 将customer表重命名为cus
- (2)修改列的类型
- 如果该列不为空则,需要清空数据,再修改
- update cus set cusdesc = null (清空数据)
- alter table cus modify cusdesc varchar2(20)
- (3)添加列
- alter table cus add stuno number(15)
- (4)删除列
- alter table cus drop column stuno
- (5)修改表名
- alter table cus rename column cuaname to cusname;
- 将表中cuaname改为cusname
- (1)修改列名
- 8、删除表
- drop table 表名
- 9、清空表数据
- truncate table 表名
- delete table 表名
五、查询 五 、 查 询
- 1、where子句(单表查询):where 关键词表示过滤,添加过滤条件;
- (1) 常用的运算符:
- where后面的 =号表示比较
- > >= < <= !=
- 空即null,表示什么都没有不等同于”
- null不可以通过=比较
- 不为空 is not null,为空 is null
- null不允许使用=比较
- (2)表示关系的运算符(and 、or、not、in、not in、between and、not between and)
- ①and表示并且,要求两边条件同时满足
- ②or表示或者,要求满足两边任意一个条件即可
- ③in 表示在xx中存在,只能表示等值条件判断 not in 与in相反
- ④between and 表示在xx和xx数值之间,包含这两个数,进行比较; not between and 不在xx和xx之间范围
- (3)模糊查询like子句
- 符号:_ 和% 两者用法:
- _表示匹配一个字符
- %匹配多个字符;
- not like;
- 注意:escape 表示指定谁是转义字符
- 符号:_ 和% 两者用法:
- (1) 常用的运算符:
2、常用函数:注意:oracle中字符默认从1下标开始不是0下标
- (1)字符操作函数
- (1.1)concat(列,列) 连接两个字符
- 例如:将Ename和JOb查询结果连接一起,起别名为ename_job
- select concat(emp.ename,emp.job ) ename_job from emp
- 例如:将Ename和JOb查询结果连接一起,起别名为ename_job
- (1.2)substr(列,下标1开始,几个长度)截取字符
- 例如:将ename 从2位置开始截取,3个字符
- select substr(ename,2,3) from emp
- 例如:将ename 从2位置开始截取,3个字符
- (1.3)length(列)求字符长度
- (1.4)instr(列,字符) 找字符所在位置 instr(列,找谁,从哪个位置找,找第几次出现的)
- (1.5)lower(列) ,upper(列) 小写,大写转换
- (1.6)initcap(列)将列数据开头字母大写,其他字符小写
- (1.7) trim 去掉两边空 其他:ltrim(列) rtrim(列)
- trim(‘字符1’ from ‘字符串2’)
- 例如:select trim(‘b’ from ‘bab’ ) from dual
- select trim(’ ’ from ’ ab’ ) from dual
- select trim( ’ ba ’ ) from dual
- select trim(leading ‘a’ from ‘aabbaa’) from dual; – 返回结果为:bbaa
- select trim(trailing ‘a’ from ‘aabbaa’) froam dual;–返回结果为:aabb
- select trim(both ‘a’ from ‘aabbaa’) from dual;–返回为:bb
- trim(‘字符1’ from ‘字符串2’)
- (1.8)replace(列,字符,字符) 替换字符
- 例如:select replace(ename,’MI’,’i’) from emp
- (1.9)|| 连接符
- 例如:查询empno,ename,job 显示为一列,逗号隔开 列别名为:res
- select empno||’,’||ename||’,’||job res from emp
- 例如:查询empno,ename,job 显示为一列,逗号隔开 列别名为:res
- (1.1)concat(列,列) 连接两个字符
- (2)数值函数:
- (2.1)四舍五入操作 round函数 : round(列) 默认取整,四舍五入, round(0), round(列,值)
- 例如:select round(sal,1) ,sal from emp
- (2.2)截断数据 trunc(列)截断小数,即舍去小数位
- (2.3)取余数运算MOD(列,列) 注意:oracle中不是%
- 除法运算/符号
- 注意:分母不可以为0
- null参与运算结果是什么?null n u l l 参 与 运 算 结 果 是 什 么 ? n u l l
- (2.1)四舍五入操作 round函数 : round(列) 默认取整,四舍五入, round(0), round(列,值)
(3)其他函数
- (3.1)查看系统当前时间 :sysdate
- 例如:select sysdate from dual
(3.2)NVL(参数一,参数二) 第一个参数如果为null,则取第二个参数值否则还取参数一
- 例如:select sal+nvl(comm,0) from emp 因为comm有为空的情况,如果为空,空参与运算,永远为空
- NVL2(参数一,参数二,参数三) 参数一如果为空,取第三个参数,否则取第二个参数值
- 例如:
- select nvl2(comm,0,1) from emp
- 例如:
- 显示comm,sal,如果comm为空,则显示’无提成’
- select sal, nvl(comm,’无提成’) from emp(错误,因为comm是number类型,则整体返回number,此时number中存放了这个字符)
- 如何修改上面语句?
- to_char可以将number->char
- select sal, nvl(to_char(comm),’无提成’) from emp(正确)
(3.3) to_char 将number->字符型 或者将date->字符型
- to_char可以对数值型数据、日期类型进行格式化
格式化数字:to_char
- 例如:查询Comm列,如果为空则显示no-comm
- select nvl(to_char(comm),’no-comm’) from emp
- 例如:将1234567.123456金额格式化为$1,234,567.12
- select to_char(1234567.123456,’$999,999,999.00’) from dual
- 例如1234567.123456格式为 ¥1234567.12
- select to_char(1234567.123456,’L999999999.99’) from dual
格式化日期:yyyy MM DD HH mi ss dy to_char
- 例如:系统时间格式化为:2018-06-14 04:02:50 星期四
- select to_char(sysdate,’yyyy-MM-dd HH:mi:ss dy’) from dual
- 例如:系统时间格式化为:2018年6月14日 16:4:40
- select to_char(sysdate,’Fmyyyy”年”Monthdd”日” HH24:mi:ss’) from dual
- 注意:to_char方法格式化日期时,第一个参数必须是日期类型,否则错误
- FM表示去掉数字前的0
- 24表示24小时制
- Month表示月份全称,含有汉字月
- 例如:系统时间格式化为:2018-06-14 04:02:50 星期四
字符转为数值型:to_number
- 例如:将¥1234567.12 字符转为number类型
- select to_number(‘¥1234567.12’,’L99999999999.99’) from dual
- 例如:123.00是字符,如何转number
- select to_number(‘123.00’) from dual
- 例如:将¥1234567.12 字符转为number类型
字符转为日期:to_date
- 例如:
- select to_date(‘1999-10月-10日 23:12:13’,’yyyy-Month-dd”日” HH24:mi:ss’) from dual
- select to_date(‘10-10月-1999’) from dual;
- 例如:
(3.4)日期操作函数:
- ①add_months 向日其中添加多少个月份
- select add_months(‘10-10月-1999’,3) from dual
- ②next_day 求某一个日期下一个星期几,十几号?
- 例如:求员工入职后,第一个星期五是几号
- select next_day(hiredate,’星期五’),hiredate from emp
- 例如:求员工入职后,第一个星期五是几号
- ③last_day 求某一个日期,所在月最后一天十几号?
- 例如:求2018-6-14该日期,上个月第一天日期
- select last_day(add_months(sysdate,-2))+1 from dual
- 例如:求2018-6-14该日期,上个月第一天日期
- ④months_between 求两个日期之间的月份数
- 例如:查询哪些已经转正的人员信息(试用期三个月)
- select *from emp where months_between(sysdate,emp.hiredate)>=3
- 例如:查询哪些已经转正的人员信息(试用期三个月)
- ①add_months 向日其中添加多少个月份
- (3.1)查看系统当前时间 :sysdate
- (1)字符操作函数
- 4、排序
- 排序 order by 永远写在语句末尾; 升序 asc 降序 desc
- 例如:查询员工信息,按照部门编号和工作种类排序, 按照部门编号降序,按照工作种类升序
- select *from emp order by deptno desc,job asc
- 例如:查询员工信息,按照部门编号和工作种类排序, 按照部门编号降序,按照工作种类升序
- 排序 order by 永远写在语句末尾; 升序 asc 降序 desc
- 5、去重 distinct
- select distinct job ,deptno from emp
- 6、别名
- 目的是简化表名和列名
- select emp.empno emp_num,emp.ename as “name” from emp order by deptno desc,job asc
- 7、分组查询 group by
- 组函数(聚合函数):注意:组函数忽略空,解决方法:nvl函数
- avg 平均值
- sum 求和
- count求行记录数
- max 最大值
- min最小值
- 注意:分组查询时,组函数列和非组函数列,同时出现在select或者having 后面,此时必须将非组函数列,在group by后声明
- where 跟group by同出现,不能直接跟在group by后,只能放在表名后出现,表示先过滤后,再分组
- where后面不允许跟组函数,使用having,having后面可以跟组函数,但是后面非组函数列也需要group by后面声明
- having表示分组统计后的结果,进行过滤
- 8、多表关联查询:避免出现笛卡尔积
- 等值关联查询
- select * from emp,dept where emp.deptno=dept.deptno
- 不等值关联查询
- select * from emp,salgrade where emp.sal between salgrade.losal and salgrade.hisal
- 自然联接查询
- 等值条件查询的一种,要求表盒表之间有同名的列,且类型一致;则自动关联
- select * from emp natural join dept
- emp表和dept表自然联接查询,他们有相同列名
- 左外联接、右外联接、全联接
- left outer join on 左表都显示,右表显示匹配数据,不匹配显示null
- select * from emp right outer join dept on emp.deptno=dept.deptno
- right outer join on 右侧表都显示,左侧显示匹配关联条件的,不匹配则显示null
- 本质上和左外联接一样,只要交换表的位置即可
- full join on 匹配不匹配的都显示
- left outer join on 左表都显示,右表显示匹配数据,不匹配显示null
- 内联接
- inner join 等同于等值关联查询
- select * from emp inner join dept on emp.deptno=dept.deptno
and dept.deptno=20
- 自联接
- select e.*,d.empno,d.ename from emp e,emp d
where e.mgr=d.empno
- select e.*,d.empno,d.ename from emp e,emp d
- 等值关联查询
- 9、序列:
- 在数据库中一组自增的数据;sequence,可视化工具创建sequence即可; 查看序列值select cus_seq.nextval from dual;
- 10、子查询
六、事务,索引,视图,权限,PLSQL
- 1、事务:
- 即数据库端的一组执行单元(多个insert、dlete),要么都执行,要么都不执行,恢复原始状态;
- 事务提交:commit;
- 事务回滚:rollback
- 好处,目的,特性:
- 为了保证数据的: 一致性、隔离性、原子性、持久性
- 场景:批处理(连续新增、修改、删除)
- 例如:对删除数据进行数据备份到xx表中,然后对xx进行修改
- 扩展阅读!什么是ACID??
- 2、索引:index
- 目的:加快数据的检索速度
- 保存于数据库服务器端,注意:添加唯一约束和主键、外键约束默认已经加了索引;因此根据id和外键约束或者唯一约束的列,查询速度要快;
- 索引如何创建:例如:对ename,job添加索引
- create index emp_name_index on emp(ename,job)
- 表删除,索引自动删除
- 什么时候使用索引?
- 查询数据作为where子句,且数据量大(存在计算),过滤的数据存在大量空(查询数据占据比例低)
- 索引会根据列前后顺序依次效果削弱
- 注意:不是所有列都要加索引
- 索引的实现方式
- 散列表,B+树红黑数,位图索引;
- 分类
- 唯一索引
- 主键索引
- 聚集索引
- 3、视图:
- view 是数据库服务器端的一个虚拟的表,这个表是一个查询结果集;简化SQL
- 解决:SQL过长,复杂的SQL存储在服务器端实现执行,完成数据的过滤(虚拟的表,查询结果);
- 修改删除新增不允许去操作视图;
- 开发时是否建立视图,要看项目具体要求;
4、权限:
对象权限和系统权限;
- 1、创建一个用户
- create user my_user identified by admin;
- 2、给用户创建表权限、登录、创建视图、创建序列、索引、存储过程、只能访问scott中emp表数据
- grant create table,unlimited tablespace,
create session,create view,create any index ,create procedure ,
create sequence to my_user
- grant create table,unlimited tablespace,
访问scott用户中emp表:
grant select on scott.emp to my_user
可修改scott中emp表ename和sal列权限
- Grant update(ename,sal) on scott.emp to my_user;
- 注意如果加with grant option 表示,当前用户具有的权限,可以再次传递给(赋予)子用户;
- grant select on scott.emp to my_user with grant option
3、撤销创建存储过程、访问scottemp表数据权限
revoke select on scott.emp from my_user
revoke create table,unlimited tablespace,create procedure from my_user
- 1、创建一个用户
- 5、PLSQL
- 过程化sql语言;即对SQL语句的拓展;
- 数据类型:int、number、char、varchar2、boolean、date、exception、
- 游标、%rowType %表名.列明 %type 记录record
- 静态游标:隐式和显示游标;
- 动态游标:弱类型游标和强类型游标
- :=表示赋值, =表示比较
- 存储过程和自定义函数区别: 前者重在处理复杂数据库端业务逻辑;没有返回值;后者有返回值,可以在sql中执行使用;