ORACLE
SQL(Structured Query Language)结构化查询语言
DML 数据操纵语言
SQL DCL 数据控制语言,控制权限
DDL 数据定义语言 例如:CREATE,DROP,ALTER,DELETE
ORACLE安装
Sys 超级管理员
System system
Scott tiger
Oracle端口号:1521
Oracle只有一个database,通过不同的用户给表分类。
sqlplus
Select * from tab;查询当前用户有哪些表。
set linesize 300;显示一行显示300个字符。
Set pagesize 50;显示一页50行
简单查询语句:
Select [distinct] <列名> [[as] 别名] from <表名> [[as] 别名]
[where <查询条件>]
[order by <排序列名> [asc | desc]]
distinct 去掉查询结果中重复列 字段名不能加’ ’(引号)
select ‘name:’ || ename form emp
字符串连接
Between 1500 and 3000 结果包含了1500和3000
Between ….and….也可用于日期
In:
Select empno,ename from emp where empno in(2011,2001,2300)
通配符:’ -’代表一个字符,‘%’代表0到多个字符。
在sqlplus 中,ed d:/a 表示打开或创建一个sql文件,
@ d:/a 表示执行此文件
单行函数
字符函数:接收字符输入并输出。
upper: 将小写字符转换成大写
select upper(‘jack’) from dual;
oracle有一张特殊的表:dual,完成一项功能使用
initcap:将单词第一个字母转换成大写
select initcap(lower(ename)) from emp; 嵌套使用函数。
Concat:字符串连接
Select concat(‘name:’,ename) from emp; 相当于使用‘ ||’
length: 求长度
select length(‘hello’) from dual;
substr: 截取字符串
substr(‘word’,3) 从第三个开始截取
substr(‘helloword’,1,3) :其中1 为索引,3为长度
索引可从0开始,也可从1开始
Substr(‘helloword’,-3) 从后向前数截取3个
Replace:替换
Select replace(ename,’s’,’9’) from emp;
数字函数:
round:四舍五入
select round(2473.125) from dual; 无小数保留
round(2736.3567,2) 保留两位小数
round(2173.34,-2) 精确到两小点前两位
trunc(2649.34,2)保留两位小数,其余位截去
日期函数:
日期-数字=日期 日期+数字=日期 日期-日期=数字
round((sysdate-hiredate)/7) 求员工入职大约有几个星期
month_betweed(sysdate,hiredate) 求员工入职有几个月
add_months(sysdate,1) 加一个月
next_day(sysdate,’星期一’) 求出给定日期的下星期一是号
last_day(sysdate) 这个月的最后一天是几号
转换函数:
to_char(hiredate) 转换成字符串
to_char(hiredate,’yy-mm-dd’) 转换成日期形式
to_char(hiredate,’fmyyyy-mm-dd’) 其中fm:format去掉前导0
to_char(sal,’$99.999,99’)
to_number(‘34235’)
to_date(’12-28-2012’,’mm-dd-yyyy’) 转换成日期
通用函数:
Oracle中空值参加四则运算,结果为null
select ename,sal*12+nvl(comm,0) from emp;
多表查询:
找关联字段作关联条件
(1) 找出几张表 (2)消除迪卡尔积 (3)确定查询内容
一张表当两张表用时不是一回事
“什么的什么“用时需消除迪卡尔积
表连接:
(1) oracle特有的方式
“+“号在”=“号左边是右连接,在“=”号右边是右连接
以哪张表为基准就是要求其表内容全部显示出来。
select e.ename,m.ename from emp e,emp m where e.mgr = m.empno(+);
(2)通用表连接 sql1999
交叉连接,产生迪卡尔积。
select * from emp cross join dept;
自然连接:自动匹配关联字段,有且只有一个字段名称相同,且是关联字段
select * from emp natural join dept;
select * from emp join dept using(deptno); 若有多个相同字段,用using明确指定哪个字段(字段名称)
select * from emp join dept on(emp.deptno=dept.deptno);
明确指定要关联的字段,字段名不一样时
左连接:
select e.ename,m.ename from emp e left join emp m on(e.mgr=m.empno);
组函数和分组函数:
count():统计函数,查个数
select deptno from emp group by depno;
只有分组条件才能作为查询字段
Select deptno,count(ename) from emp group by deptno; 可以用分组函数
Select d.dname,avg(e.sal) from emp e right join dept d using(deptno) group by d.dname;
子查询:在查询结果当成一张表,再在这张表的基础上查询
例:要求显示出平均工资大于2000的部门编号和平均工资
注意:分组条件不能出现在where条件中,只能用having
select deptno,avg(sal) from emp group by deptno having avg(sal)>2000;
where条件必须放在group by前
select job,sum(sal) from emp where job <> ‘saleman’
group by job
having sum(sal) > 5000
order by sum(sal) desc;
组函数嵌套时,即便是分组条件也不能作为查询字段,不能查询任何字段
分页:
Sqlserver用’top’
Mysql用‘limit’
Oracle 用伪例(rownum,rowid)
“id”:惟一标识
Rownum一定要从1开始。
select * from (select rownum r,ename from emp where rownum<=10) where r>=5;
查询emp表中第5至第10条记录。
分页必要的条件:
(1) 每一页的起始位置 firstIndex
(2) 每一页显示几条记录 maxResult
创建表:
create table myemp as select * from emp; 表的复制
desc emp;查询表结构
create table myemp as select * from emp where 1=2; 复制表结构
插入数据:
Insert into<表名> [(字段1,字段2,…)] values(<值1>,<值2>…)
更新数据:
Update <表名> set <更新字段的值> where <更新条件>
常用数据类型:
Char:表示字符类型,长度限制255字节,效率高,长度固定。 中文占3个字节
varchar2 :表示字符类型,长度限制255字节,节约空间,长度可变。
Clob:大文本类型,可以存放在4G, mysql :text
number: number(n)表示整数,长度为N,可以使用INTEGER
number(m,n)表示一个小数,小数长度为n,整数长度为m-n,可以使用float
date:表示日期类型,需要按照标准的日期格式。
blob :表示二进制类型,4G。
修改表结构:
Alter table t-user modify(username,varchar(12));只能修改成更大的
截断表:
Truncate 用来删除表中的数据,不能回退,delete 可以回退。
数据库的完整性 = 惟一性+正确性
主键约束:primary key
(1)…(2)…(3)alter table t_user add constraint PK-USER-ID primary key(id);
惟一约束 :unique
区别:主键约束不允许插入案值,而惟一性约束允许插入空值上。
Oracle允许插入无数个空值。
Alter table t_user add constraint UQ_USER_USERNAME unique(username);
非空约束:not null
检查性约束:(1)列后+check(age>0 and age<120)
(2) alter table t_user add constraint CK_USER_SEX check(email like ‘%@%’);
三大范式:
(1) 确保每一个字段都具有原子性,不能再分割的。
(2) 确保表的每一个字段都依赖于主键(每张表只描述一个实体)
(3) 确保表中的每一个字段都不传递依赖于主键
关系型数据库(主外键关系)
一对一:1、在一对多的基础上外键加惟一性约束
2、一张表的主键既是主键又是另外一张表的外键
3.在多对多的基础上外键全部加惟一性约束(不会用)
一对多:
多对一:在多的一端加外键
多对多: 一定要有中间表,并且大部分情况下使用联合主键。 Primary key(cid,tid)
先创建主表再创建从表。
先插入主表的数据再插入从表的数据。
先删除从表的数据,再删除主表的数据。
外键约束:
(1) create table t_student (id integer primary key,name varchar2(12),cid integer,foreign key(cid) references t_class(id))
(2) alter table t_student add constraint FK_STUDENT_CID foreign key(cid) reference t_class(id)
主键生成策略:
SQL SERVER : identify(自增长)
Mysql : increment uuid(三十二位的字符串)
Oracle : sequence(序列) 当成一张虚拟的表
Create sequence
(需要有create sequencea或create any sequence权限)
[increment by n]—每次加N
[start with n] ----从n开始计数
[NOMAXVALUE]----不设置最大值
[NOCYCLE]----一直累加,不循环
[maxvalue 999999999] ----最大值
[minvalue 1]----最小值
[cycle]-----循环
[cache]-----缓存
Create table t_user(id integer primary key,username varchar2(12));
Create sequence t_user;
Insert into t_user values(sq.nextVal,’admin’);
视图:一张虚拟的表,用来查询(oracle中做成一张直实的表)
Create view v_score as select ....
Sqlserver 的视图只能查不能改
Oracle 的视图默认允许修改,原始表数据跟着修改。
Oracle数据库创建用户
1用超级管理员登入
2 create user 用户名 identified by 密码
改密码 alter user用户名 identified by 密码
权限管理:
Grant 权限 to 用户名
类 用户
权限
角色:权限的集合
两个通常用的角色:connect,resource
加锁与解锁:
Alter user 用户名 account lock/unlock;
Oracle备份文件的导出与导入:
在CMD中进入一个文件夹,输入exp
导入数据;imp
Exp wangke/8888@orcl file=d:/abc/beifen.dmp fully=y(所有文件)/tables=(t_user);
Mysql区别:
端口号:3306
通过不同的database来管理表
text 大文本数据类型
分页用limit: limit 0,3;
索引 几条记录 索引从0开始