zoukankan      html  css  js  c++  java
  • 关系型数据库

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

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

    -->不能存在传递依赖

  • 相关阅读:
    32/64位平台printf uint64的方法
    [Linux 安装]centos安装vmware tools
    【Linux】fg bg ctrl + z jobs & 等命令
    让我们慢慢地彼此遗忘
    ctrl+c,ctrl+d,ctrl+z在linux中意义
    Windows 7 右键菜单 添加命令
    修改vs2010所有工程的include目录和lib目录
    Vmware虚拟机的linux与主机共享
    防止atoi函数内存越界
    JavaScriptSerializer使用条件
  • 原文地址:https://www.cnblogs.com/cn-boya/p/10786434.html
Copyright © 2011-2022 走看看