关系型数据库

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. 添加注释

(1) 为表添加注释:comment on table emp is ’雇员表’;

(2) 为列添加注释:comment on column emp.Empno is ‘雇员工号’;

  1. 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;

  1. Distinct

distinct必须放在开头:去除重复数据

Select distinct e.deptno from emp e;

  1. 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: 把检索结果较多的条件放在后面

  1. order by

1.按照单个列排序

order by col

2.降序、升序

order by col desc (asc)

3.按多个列排序

order by col1 desc (asc),col2 desc (asc)

  1. 拼接字段(||,+)

拼接字段首选||(在mysql中由于||表示or,一般用concat())

例:select ename||’is a’||job from emp; 得到一个拼接字段查询结果。

  1. 通用函数nvl

Sql中允许列值为空,空值用保留字NULL表示。NULL不同与0或者空格,它就是代表了一个不确定的内容。任何含有null值的数学表达式最后的结果都为空值

解决办法:通过nvl函数将null转换成为一个不为空的值。

例:select e.ename,(e.sal+ nvl(e.comm, 0))*12  from emp e

  1. 并集,全集,交集,差集

①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子句中写入连接条件

当多个表中有重名列是,必须在列的名字前加上表名作为前缀

②连接的类型:

  1. 等值连接 --> =

取关系列相同的记录

  1. 非等值连接

取关系列不同的记录

!=, < ,>, >=, <=, 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.  第三范式(确保每列都和主键列直接相关,而不是间接相关)

第三范式需要确保数据表中的每一列数据都和主键直接相关,而不能间接相关。

-->不能存在传递依赖

原文地址:https://www.cnblogs.com/cn-boya/p/10786434.html