关系型数据库
1.数据库
1.Oracle
1.Oracle安装
1.安装版本:Oracle11g
2.用户:sys (超级管理员) ,密码:1234;
system (普通管理员),密码:1234;
Scott (普通的用户),密码:1234;
3.oracle各种服务的作用及哪些需要开启的:http://blog.csdn.net/u01 3047660/article/details/20660215
2.Oracle数据管理
1.用户管理
1.用户解锁与加锁:alter user 用户名 account lock/unlock;
2.查询其它用户的表:select *from 用户.表名;
3.连接数据库:conn sys/123@orcl as sysdba;
4.查看当前是哪个用户登录的:show user;
5.使用system用户为scott增加权限:grant create view,create table to scott;
6.创建用户:create user username identified by password
7.连接权限:grant create session to用户名;
8.将scott用户的emp表所有权限授予John,则使用下列命令:
grant all on scott.emp to 用户名;
9.如果要收回授予用户John的scott用户表emp的所有权限,使用下列SQL 语句:
revoke all on scott.emp from John;
10. 查看自己权限
select * from user_sys_privs;
2.关系型数据库
1.特点:表格形式,强调数据之间的关系;
2.代表:Oracle、MySQL、db2、sqlserver;
3.数据管理
1.set pagesize:设置一页显示多少条数据;
2.set linesize: 设置一行有多少个字符;
4.sql、命令窗口区别
(1) sql窗口只能执行sql语句。
(2) 而命令窗口可执行命令。如:desc emp;(查看表结构)
2.SQL语言(sql: structured query language)
1.定义
结构化查询语言
2.分类
1、数据操纵语言(DML:data manipulation language):
insert update delete
2、数据定义语言(DDL:data defination language):
create alter drop rename truncate
3、数据控制语言(DCL:data control language):
grant revoke
4、数据查询语言(DQL:data query language):
select
3.sql语句用法
1.实验用数据表
①Select * from tab; 查询当前用户下的所有表,tab为系统表名。
②select *from user_tables;详细地查询当前用户下的所有表, user_tables为表名。
③desc 表名;查看表结构
- 添加注释
(1) 为表添加注释:comment on table emp is ’雇员表’;
(2) 为列添加注释:comment on column emp.Empno is ‘雇员工号’;
- Select
1.Select-from-where句型
2.别名:表名 别名
3.检索单个列
Select col from tablename;
4.检索多个列
Select col1,col2,col3 from tablename;
5.检索所有列
Select * from tablename;
6.给检索出的列起个别名
Select col “lie” from tablename;
- Distinct
distinct必须放在开头:去除重复数据
Select distinct e.deptno from emp e;
- Where
条件比较:①=、!=、<>,<,>,<=,>=,any,some,all等;
②is null,is not null 筛选出为空值或不会空的值;
判断为空值,不能用‘=’,因为null与自己都不相等
③between x and y 筛选出x到y之间的值
④in(list或者subquery),not in(list或者subquery) 筛选出是否在某个集合或子查询里面的值
List、subquery不能过大,这样性能可能变差
⑤exists(子查询) 子查询有数据则exists表达式返回true
例:select e.* from emp e where exists(select d1.deptno from dept d1 where (d1.deptno=10 or d1.deptno=20)and d1.deptno=e.deptno);
⑥like _, 模糊查询 %表示任意字符出现任意次数,_表示任意字符出现一次(非必要不使用)
找出名字中带有M的 M前有一个下划线就是在查找名字中 包含M并且M前有一个字符:
select e.ename from emp e where e.ename like '__M%';
查找名字中包含M的,不管M的位置:
select e.ename from emp e where e.ename like '%M%';
查找名字中包含%的:
select e.ename from emp e where e.ename like ' '
逻辑复合条件
①not ,and ,or 优先级not>and>or
②SQL优化问题:
And:把检索结果较少的条件放在后面
Or: 把检索结果较多的条件放在后面
- order by
1.按照单个列排序
order by col
2.降序、升序
order by col desc (asc)
3.按多个列排序
order by col1 desc (asc),col2 desc (asc)
- 拼接字段(||,+)
拼接字段首选||(在mysql中由于||表示or,一般用concat())
例:select ename||’is a’||job from emp; 得到一个拼接字段查询结果。
- 通用函数nvl
Sql中允许列值为空,空值用保留字NULL表示。NULL不同与0或者空格,它就是代表了一个不确定的内容。任何含有null值的数学表达式最后的结果都为空值
解决办法:通过nvl函数将null转换成为一个不为空的值。
例:select e.ename,(e.sal+ nvl(e.comm, 0))*12 from emp e
- 并集,全集,交集,差集
①union all 全集 不会去除重复数据
例:select * from emp e where e.deptno =10
union all
Select * from emp e where e.sal>2000
②union 并集 去除重复数据
③intersect 交集 返回查询结果中相同的部分
④minus 差集 返回在第一个查询结果中与第二个查询结果不同的部分
4.sql函数(单行函数:处理单行数据;组函数:处理多行数据)
1.字符函数
①concat(string1,string2)拼接两个字符串
②initcap (string) string的每个单词首字母大写
③Lower(string) 以小写形式返回string
④lpad(string1,index,string2) 在string1左边填充string2到第index位置
⑤rpad(string1,index,string2) 在string1右边填充string2到第index位置
⑥ltrim/rtrim/(string1,string2) 删除左边或者右边出现的string2字符串
trim (A from B)从B的左边和右边删除A字符串
⑦substr(string,1,2) 提取字符串的一部分
⑧upper(string) 以大写形式返回string
⑨instr(string,’a’) 查找某个字符串在字符串string出现的位置
⑩length()字符串的长度
2.数字函数
①round(numble,n) 返回小数点后n 位四舍五入后的值
②trunc(numble,n)) 截取小数点后n位numble的值
③mod(x,y)返回x除以y的余数
④ceil(numble) 向上取整
⑤floor(numble)向下取整
3.日期和时间函数
①Sysdate 返回当前日期
select sysdate from dual; 最近日期
select round(sysdate) from dual;最近零点日期
select round(sysdate,’day’) from dual;最近星期日
select round(sysdate,‘month’) from dual;最近月初
select round(sysdate,‘q’) from dual;最近季初
Select round(sysdate,’year’) from dual;最近年初
Select trunc(sysdate) from dual;今天日期
Select trunc(sysdate,’day’) from dual;本周星期日
Select trunc(sysdate,’month’) from dual;本月初
Select trunc(sysdate,’q’) from dual;本季初日期
Select trunc(sysdate,’year’) from dual;本年初日期
②add_months(d,x) 返回加上x月后的日期d的值
select sysdate,add_months(sysdate,3) hz from dual;
③last_day(d) 返回的所在月份的最后一天。d为日期
④moths_between(date1,date2)返回date1和date2之间月的数目
从日期中加或减一个数值,以得到一个日期结果值
select sysdate+2 from dual;
两个日期相减以便得到他们相差多少天
select ename,round((sysdate-hiredate)/7) weeks from emp where deptno=10
4.转换函数
1.隐式转换(可用于:字符和数字的相互转换 &字符和日期的相互转换)
①to_char
例:将日期转化为字符串
Select to_char(sysdate, 'dd-mon-yy hh24:mi:ss') "Rigth Now" from dual;
例:将数字转化为字符串
select to_char(sal, '$99,999.9999') salary from emp where ename = 'ALLEN';
②to_number
例:将字符串转化为数字
select to_number('11.231','999.999') from dual;
③to_date
例:将字符串转化为日期
select to_date('2004-09-19','yyyy-mm-dd') from dual;
5.其它函数
1.nvl(值,如果值为null则替换的值)
2.nvl2(值,为空取值,不为空取值)
3.Decode (值,等于条件1, 值1, 等于条件2,值2,default)
4.case when 条件取值
Case when 条件判断 then 结果 when 条件判断 then 结果
Else default end
6.组函数
组函数仅在选择列表和Having子句中有效
1.avg() 返回某列的平均值-->在数字类型数据中使用,不处理空值
2.min() 返回某列的最小值-->适用于任何数据类型,不处理空值
3.max() 返回某列的最大值-->适用于任何数据类型,不处理空值
4.sum() 返回某列值的和-->在数字类型数据中使用,不处理空值
5.count() 返回某列的行数-->会处理空值
6.数据分组:
按以下顺序排列:
SELECT(column, group_function) 要返回的列或表达式
FROM table 从中检索数据的表
[WHERE condition] 行级过滤(不能在 WHERE 子句中限制组. 使用Having 对分组进行限制)
[GROUP BY group_by_expression] 分组说明(必须出现在where子句之后,order by 子句之前。)
[having condition] 组级过滤
[ORDER BY column] 输出排序顺序(如没有,则默认隐式按降序排列)
7.用group by 子句进行分组,group by 子句可以包含任意数目的列
8.由于组函数基本上不能处理空值,如需处理空值,一般会配合nvl函数使用。如果分组列中具有null值,则null将作为一个分组返回。如果列中有多行null值,他们将分为一组。
例:
select avg(sal) from emp group by deptno having avg(sal) > 1000;
9.实际执行顺序:
from --> where--> group by--> having--> select -->distinct -->order by
5.多表查询
1.92语法
①语法规则:
SELECT table1.column, table2.column
FROM table1, table2
WHERE table1.column1 = table2.column2;
在where子句中写入连接条件
当多个表中有重名列是,必须在列的名字前加上表名作为前缀
②连接的类型:
- 等值连接 --> =
取关系列相同的记录
- 非等值连接
取关系列不同的记录
!=, < ,>, >=, <=, between and
3.外连接
左外连接:以左边的表为标准,没有的列则补空;
加号在哪边,哪边为补充的数据。
例:
select * from emp e ,dept d where e.deptno = d.deptno(+);
4.自连接
本表中的一条数据适用本表中的另外一条数据。
③笛卡尔积
Select * from table1,table2,table3
2.99语法
①语法
Table (cross,nautral,inner,left,right) join table on condition
适用 on 将连接条件与其它的查询条件分开书写
②连接的类型
1.笛卡尔积(交叉连接)
Cross join
例:
Select * from table cross join table2
相当于-->Select * from table, table2
2.自然连接
Natural join 基于两个表中列名完全相同的列产生连接
适用:
--两个表有相同名字的列
--数据类型相同
结果:返回从两个表中选出连接列的值相等的所有行
例:
select *from emp natural join dept Where deptno = 10;
3.等值连接
Inner join 相当于92的等值连接
例:Select * from table1 inner join table2 on table1.col = table2.col
4.左/右外连接
Left join/right join 以左边/右边表的数据为参考,右边/左边数据不够补null
例:Select * from table1 left/right join table2 on table1.col = table2.col
5.using连接
Using 就是制定某一列来做自然连接
select e.ename,e.ename,e.sal,deptno,d.loc from emp e join dept d using(deptno) where deptno=20
6.子查询
1.概念
SQL允许多层嵌套。子查询,即嵌套在其他查询中的查询。
2.子查询的两种情况
1,查询结果放在where后面作为筛选条件使用
一 ,查询结果如果只有一条数据 单行子查询 在where后面可以用 = != > < ;-->单行子查询
例:
select ename,empno, sal, sal+nvl(comm,0) from emp
where sal+nvl(comm,0)>(select avg(sal+nvl(comm,0)) from emp);
二,查询结果有多条数据 在where后面可以用 in ,some, all
-->多行子查询
例:
select empno, ename from emp
where empno in (select distinct mgr from emp);
2,查询结果放在 from 后面 作为一张表 继续查询
例:
select * from salgrade s, (select deptno,avg(sal) avg_sal from emp group by deptno) t
where t.avg_sal between s.losal and s.hisal;
7.分页 rownum
rownum是系统的一个关键字,表示行号,是系统自动分配的,第一条符合要求的数据行号就是1,第二条符合要求的数据行号就是2.
Rownum 不能直接使用
例:取前多少条数据:
select * from emp e where rownum <= 5
取中间的一些数据:
select * from (select e.*, rownum rn from emp e) t01
where t01.rn >= 6 and t01.rn <= 10
不能直接select * from emp e where rownum >= 6 and rownum<=10; 这样是错误的!
取出 薪资最高的 6~10名员工:
select * from (select e.* from emp e order by e.sal desc) t01
where t01.rn >= 6 and t01.rn <= 10
在mysql中使用:
Select * from tablename limit startrow(0是第一行),pagesize
例:Select * from t_address_province limit 0,5;
8.视图
1.概念
视图,也称虚表,不占用物理空间,把一条sql存起来,在使用的时候再去调用执行。
优点:在查询复杂的时候可以简化sql 语句
缺点:提高维护难度
2.创建视图
①Create or replace view v$_table_table2 as (subquery)
例:
Create or replace view v$_emp as select * from emp
②如果只允许视图进行查询 则加 ready only
例:create or replace view v_test01 as (
select * from emp with read only)
③视图可以对数据进行 增 删 改-->改的数据都是基表的数据
9.序列sequence
1.概念
序列是oracle专有的对象,它用来产生一个自动递增的数列
2.创建序列的语法
create sequence seq_name increment by n start with n
3.序列的使用
序列.nextval --> 取序列的下一个值
查看序列的状态:select seq_empcopy_id.currval from dual
序列.currval 即取序列的当前值
删除序列:drop sequence seq_empcopy_id;
10.插入(Insert) 语句
1.可以只插入部分列
例:insert into emp(empno,ename) values (3333,'xiaozhang')
2.插入的元组中列的个数、顺序与emp的结构完全一致,表名之后的列名可以省略不写
例:insert into emp values(2222,'gaohs','clerk',7902,sysdate,10000,3000,40)
要求省略的列必须满足下面的条件:
1.该列定义为允许Null值。
2.在表定义中给出默认值,这表示如果不给出值,将使用默认值。
如果不符合上面两个条件,将会报错。不能成功插入。
3.可以用insert语句把一个select语句的查询结果插入到一个基本表中
基本语法为:Insert into tablename(column,..) select * from tablename2
11.删除(delete)语句
SQL的删除操作是指从基本表中删除元组
1.语法
DELETE [FROM] table [WHERE condition];
其语义是从基本表中删除满足条件表达式的元组
Delete from table 表示从表中删除一切元组
如果想从表中删除所有的行,不要使用delete,可使用truncate table 语句,完成相同的工作,但是速度更快(没有事务)。
12.更新(update)语句
Update语句用于修改基本表中元组的某些列
1.语法
UPDATE table SET column = value [, column = value] …[WHERE condition];
其语义是:修改基本表中满足条件表达式的那些元组的列值,需修改的列值在set子句中指出。
例:update emp02 e set e.sal = 4000 where e.ename = 'laifu';
13.事务处理
1.N多条dml 语句 要么一起全部执行成功,要么全部失败
2.事物的特点 ACID
①A原子性 事物不能分割,要么全部执行成功要么全部失败
②C 一致性 (数据结果的一致状态)
③隔离性 事物和实物之间是没有干扰 完全独立
④持久性, 数据已经存储到磁盘里了
3.提交事物的方式
①Commit 或者roolback (savepoint sname,rollback sname)
②Ddl语句 (create alert drop) 自动提交事物
③会话自动退出 会自动提交事物
④服务器断电,系统崩溃 事物会自动回滚
14.oracle常用数据类型
varchar2(n):变长字符串,存储空间等与实际空间的数据大小,最大为4K,长度 以字节为单位指定(注意中文字符)
char(n):定长字符串,存储空间大小固定
number(p,s):整数或小数 ,p是精度(所有数字位的个数,最大38),s是刻 度范围(小数点右边的数字位个数,最大127)
Date /timestamp(精确到毫秒):年、月、日、时、分、秒 Date 精确到秒
timestamp(精确到毫秒)
15.数据库的对象
1.表:基本的数据存储对象,以行和列的形式存在,列也就是字段,行也就是记录
2.约束:执行数据校验,保证了数据完整性的
3.视图:一个或者多个表数据的逻辑显示
4.索引:用于提高查询的性能
5.Sequence:自增序列
16.数据库的命名规则
1.必须以字母开头
2.可包括数字和三个特殊字符(# _ $)
3.不要使用oracle的保留字
4.同一用户下的对象不能同名
17.表的创建(create)
1.语法
标准语法:CREATE TABLE 表名 (列名 数据类型()列属性,…);
例:create table stu
(
id number(6),
name varchar2(20) not null unique,
sex number(1) not null,
age number(3),
sdate date,
grade number(2) default 1,
class number(4),
email varchar2(50)
使用子查询创建 CREATE TABLE 表名 as subquery;
例:create table emp2 as select * from emp;
18.表的修改(alter drop)
1.增加新的列:alter table … add …
例:
alter table emp add address varchar(20);
2.删除原有的列:
alter table … drop…
例:
alter table emp drop column address
3.修改字段:alter table...modify...
alter table emp modify(job varchar(50))
4.删除表:drop table ...
drop table emp;
5.重命名表 RENAME old_name TO new_name
RENAME <table_name> to <new table_name>;
19.约束 constraint
1.约束类型:
1.NOT NULL 非空
2.UNIQUE Key 唯一键
3.PRIMARY KEY 主键
主键从功能上看相当于非空且唯一
一个表中只允许一个主键
主键是表中能够唯一确定一个行数据的字段
主键字段可以是单字段或者是多字段的组合
Oracle为主键创建对应的唯一性索引
4.FOREIGN KEY 外键
5.CHECK 自定义检查约束
2.创建约束的时机:
1.建表时添加
2.建表后创建
3.按作用分:
1.表级约束:可以约束表中的任意一列或多列。可以定义除了Not Null以外的任何约束。
2.列级约束:只能约束其所在的某一列。可以定义任何约束。
4.删除存在外键的表的三种方式:(更多的时候,用于行数据删除而不是整表)
1.restrict方式:当依赖表中没有外键值与要删除的主表中的主键值对应时,才能删除。
2.cascade方式:级联删除。将依赖表中所有与主表中要删除的主键值对应的记录一同删除。
3.set null方式:将依赖表中所有与主表中被删除的主键值对应的外键值设为null。
20.关系数据库的三类完整性
1.实体完整性:主键不能为空
2.参照完整性:不能引用非法的实体。即外键值要满足相关要求,不能用非法数据。
3.用户自定义完整性:满足具体的语义要求。
21.索引
用于加快对数据的搜索。通过快速路径访问的方法快速定位数据,减少磁盘i/o。
SQL中的索引是非显示索引,在用户查询时自动调用。
优劣:
(1、索引能改善操作的性能, 但会降低数据修改的性能,执行这些操作时,DBMS需要动态的更新索引。
(2、索引可能要占用大量存储空间。
(3、唯一性不好的数据并不适用于索引。
(4、索引用于数据过滤、数据排序。
创建索引:
方法一:自动为表上定义为主键、unique约束的列创建。
方法二:手动创建。
create index $name on table(column....);
drop index $name;
22.rowid
1、rowid 是oracle实际存在的值,是唯一的值
2.应用:
如何只显示重复数据,或不显示重复数据
显示重复:select * from tablename group by id having count(*)>1
不显示重复:select * from tablename group by id having count(*)=1
删除重复数据原型:
delete from temp where rowid not in (
select min(rowid) from emp group by ename having count(*) >= 1)
3.数据库设计三范式
1.第一范式(确保每列保持原子性)
第一范式是最基本的范式。如果数据库表中的所有字段值都是不可分解的原子值,就说明该数据库表满足了第一范式。-->列不可分
2.第二范式(确保表中的每列都和主键相关)
第二范式在第一范式的基础之上更进一层。第二范式需要确保数据库表中的每一列都和主键相关,而不能只与主键的某一部分相关(主要针对联合主键而言)。也就是说在一个数据库表中,一个表中只能保存一种数据,不可以把多种数据保存在同一张数据库表中。-->不能部分依赖
3. 第三范式(确保每列都和主键列直接相关,而不是间接相关)
第三范式需要确保数据表中的每一列数据都和主键直接相关,而不能间接相关。
-->不能存在传递依赖