zoukankan      html  css  js  c++  java
  • oracle基础

    数据库 DataBase

    关系数据库管理系统 RDBMS

    数据库的功能: 存储和管理数据。

    数据库较文本文件

    文本文件存储数据的缺点:没有数据类型,只能存储字符串;查询数据不方便;不适合存储大数据量;不安全

    数据库的优点:它克服了文本文件的以上缺点之外,还可以供多用户同时访问。

    数据库的工作模式:使用SQL语言进行通信:Structed Query Language(结构化查询)

    连接oracle步骤:

    1. 登陆,利用telnet命令

    2. 键入sqlplus username/password

    3. 执行sql命令对数据进行CURD操作

    4. 退出exit (断开连接,退出客户端程序)

    对数据库的基本操作:

    因为数据库中存储数据的单位是表(table),所以我首先讲的是对表的基本操作。

    1.建表sql

    语法:create table( columnname type constrain);

    2.删表sql

    语法:drop table tablename;

    3.对表的增删改查。具体细节,后面将作详细介绍。

    将成批的sql语句放在.sql文件中,可用命令start/@ 路径/文件名 的方式批量执行

    其它常用操作:

    1.查看当前用户下有哪些表:select table_name from user_tables;

    2.获得表的结构:desc 表名 desc是describe的简写

    3.查询表中数据 可用 select 列名,列名,... from 表名

    sqlplus命令与sql命令的区别:

    1. 执行的客户端不一样。

    2. sqlplus命令可以不以;作为结束,sql命令必须以;结束。

    sqlplus命令:exit,desc 表名,start (@)文件名

    col 列名 format 格式(控制查询结果显示):

    col empno format 9999

    col sal format 9999.99

    col job format a10

    set pagesize 200

    / 执行最近一次sql命令

    list 显示最近一次sql命令

    c/旧值/新值 修改最近一次sql命令

    conn 用户名/密码 切换用户

    help index 显示帮助

    CURD操作

    select查询

    常规查询:select 列1,列2,.... from 表名 where 条件;

    注意其中列名如果是表的全部列,则可用*代替,不过它比直接写列名在执行效率上要慢。

    在sql语句中如果要用到字符串,则需使用''括起来,并且字符串的比较是区分大小写的。

    在条件子句中如果用逻辑运算符,记住它们是有优先级别的:优先级not> and > or,所以可用()来改变优先级

    模糊查询:like 字符串,e.g:

    查询姓名中第二个字母是A的员工:select * from emp where ename like '_A%';

    在模糊查询中有两种通配符:% 表示匹配0到多个任意字符;_表示匹配1个任意字符

    查询语句中可用的函数

    一般函数sql:

    1.select 100 + 200 (as) result from dual; //dual为系统表,它只有一行一列。result为列的一个别名,as可以省略不写

    2.select abs(-4738) from dual;//abs()函数是求绝对值的

    3.select mod(10, 3) from dual;//mod()函数是求模(余数)的

    4.select dbms_random.random() from dual;//dbms_random.random()用来生成随机数

    例:随机生成一个1000以内的正整数:

    select mod(abs(dbms_random.random()),1000 ) from dual;

    字符串函数

    1.连接字符串

    select 'abc' || 'def' from dual;

    select concat('abc','def') from dual;

    select empno || '/' || ename || '/' || job from emp;

    2.大小写转换:lower(),upper()

    select upper('fdjk') from dual;

    3.select instr('abcdefg', 'c') from dual;ans:3

    //instr 求子串在字符串中的初始位置(注意它是从1开始的)

    4.select substr('abcdefg', 4) from dual;ans:defg

    //substr用来截取字符串,注意它也是从1开始的

    5.select length('abcdefg') from dual;//length()是用来求字符串长度的

    日期函数

    1.select sysdate from dual;//sysdate表示的是当前日期,它的类型在oracle里为date类型

    2.to_char(日期, '格式') 将日期转换为字符串

    select to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss') from dual;

    select to_char(sysdate, 'q') from dual;//季度

    select to_char(sysdate, 'd') from dual;//一个星期的第几天(注意:以周日为1开始计算)

    select to_char(sysdate, 'day') from dual;//星期几

    select to_char(sysdate, 'am') from dual;//上下午

    select to_char(sysdate, 'mon') from dual;//月份

    日期的默认格式为:dd-mon-yy;

    3.trunc (截断日期) 返回值还是日期

    select trunc(sysdate, 'year') from dual;//今年的1月1号0时0分0秒

    select trunc(sysdate, 'month') from dual;

    select trunc(sysdate, 'day') from dual;

    4.对时间的加减

    select sysdate - 5 from dual;//日期+ -时,它以天为单位的

    select to_char(sysdate + 1/24,'hh24:mi:ss') from dual;//将当前间加1小时

    select add_months(sysdate, -1) from dual;//对月进行减一

    其它函数

    1.对某列进是否为null的条件选择,可用is null,is not null e.g:

    select * from emp where comm is not null;

    2.对有可能取值为null的列进行运算时,需用到nvl()函数

    e.g: select (sal+nvl(comm,0))*12 asal from emp;

    //nvl(检查值,替代值) 如果某列的值等于检查值时,用替代值替代,此例是将null值替换成0,在Oracle中null是指无穷大

    组函数:

    max() 求某列的最大值;min(),求某列的最小值; avg() 求某列的平均值; sum() 求某列值的和; count() 求某一列取值不为null的个数

    select distinct job from emp;//distinct 去除重复取值

    select count(distinct job) from emp;//去除重复记录后,求个数

    order by:对查询结果进行排序

    select * from emp order by comm desc/asc;

    中文排序

    order by nlssort(列, '格式');

    拼音 'NLS_SORT=SCHINESE_PINYIN_M'

    笔画 'NLS_SORT=SCHINESE_STROKE_M'

    部首 'NLS_SORT=SCHINESE_RADICAL_M'

    e.g: select * from product order by nlssort(productname, 'NLS_SORT=SCHINESE_PINYIN_M' );

    group by: 分组

    语法:group by 列1, 列2-->根据group by 之后的列,取值归为一组,配合组函数求每组的最大值,最小值...

    e.g: select max(sal) from emp group by deptno;

    注意:如果使用了group by分组,则在select子句中出现的列必须是在group by子句中有的,如果不是,则必须配合组合函数一起使用

    按多列分组:select count(*), deptno, job from emp group by deptno, job;

    group by...having... 分组之后再进行条件选择

    e.g:select max(sal) ,deptno from emp group by deptno having (max(sal) > 3000); //求每个部门最高工资大于3000的最高工资和部门编号

    注意:where子句也能达到条件选择的效果,如果where和having都能达到要求,从效率角度出发,应优先选择where; 如果只能在分组之后才可以进行条件选择的话,则使用having。

    伪列 (rowid, rownum) 不真正存在于表中的列

    select empno,ename,rowid from emp;

    rowid 特点:

    每张表中的rowid取值没有重复

    每个rowid对应一条记录,可以看做是此记录的唯一标识

    通过rowid 能够最快速地查找到记录

    rownum 为每条查询结果产生一个编号

    e.g: select empno,ename,rownum from emp;

    查询前5条记录

    select empno,ename,rownum from emp where rownum <=5;

    select empno,ename,rownum from emp where rownum > 5;(错)

    select empno,ename,rownum from emp where rownum = 5;(错)

    注意:rownum用作比较条件时只能使用<或者<=比较;特例=1, >=1可以

    select empno,ename,rownum from emp where rownum <=5;

    语法顺序

    select ... from ... where 条件 group by ... having 条件 order by ...

    执行顺序

    where > group by > having> select >order by

    子查询

    在很多时候单一的查询不能完成实际的要求,而子查询可以完对单表的复杂查询

    1.将子查询结果作为主查询的条件,e.g:

    select * from emp where sal = (select max(sal) from emp);//查询具有最高工资的员工信息

    select * from emp where sal > (select avg(sal) from emp);//查询所有工资高于平均工资

    select * from emp where sal in (select max(sal) from emp group by deptno);//查询每个部门工资最高的员工信息

    2.将子查询结果作为一张临时表,作进一步的查询

    e.g: select e.*,rownum from (select * from emp order by sal desc) e where rownum <=5;//查询工资最高的前五名员工

    select * from (select empno,ename,sal,rownum r from (select * from emp order by sal desc) where rownum <=10) where r > 5;//查询工资最高的6-10名员工

    连接查询 (实际开发):从两张或更多张表中查询到数据

    1. 内连接

    e.g: select empno, ename ,d.deptno, dname from dept d inner join emp e on (e.deptno = d.deptno);

    2.(左)外连接

    e.g: select empno, ename , d.deptno, dname from dept d left outer join emp e on (e.deptno = d.deptno);

    3.(右)外连接

    e.g: select empno, ename , d.deptno, dname from dept d right outer join emp e on (e.deptno = d.deptno);

    4.自连接

    e.g: select e1.ename, e2.ename from emp e1 left join emp e2 on e1.mgr = e2.empno;

    5. 多表连接:就是利用以上连接将多个表连接起来

    建表

    create table 表名(

    列名1 数据类型 约束,

    列名2 数据类型 约束,

    列名3 数据类型 约束,

    ....

    列名n 数据类型 约束

    );

    在建表时可设定列的默认值,语法如下: 列 数据类型 default 默认值 约束

    建表示例:

    create table users_jone(

    username varchar2(20) primary key,

    password varchar2(20) not null check ( length(password) >=4 ),

    birthday date,

    married number(1) check (married in(0,1)),

    age number(3) check (age >0 and age<150),

    salary number(7,2) check (salary >0.0)

    );

    Oracle中数据类型有如下几种:

    1.字符串类型: varchar2(字符个数); clob 字符型大对象 (需补充对这两种类型的分析)

    2.日期类型: date 年月日,时分秒,毫秒; timestamp 可以到纳秒

    3.布尔类型:可将数据类型设定为number(1)或者是char(1),在Oracle里是0和1来表示false和truth的 ,之后可设检查约束为:check(列名 in(0,1))

    4. 数字

    整数 integer(整数位数) e.g:age integer(3)

    小数 number(最大有效数字长度,小数点后位数) e.g:salary number(7,2)//99999.99

    Oracle中的约束

    作用:保证数据的有效性和完整性

    种类:not null 非空约束;unique 唯一约束;primary key 主键约束(唯一并且非空,在一张表里只能有一个主键);check(条件) 检查约束

    添加(插入)数据

    语法1:insert into 表名(列名1,列名2...) values(值1,值2 ...);

    语法2:insert into 表名 values(值1,值2 ...);//在插入给出的所有列的数值时使用,注意值的顺序必须与列名顺序一致

    语法3:插入部分列的值 语法:insert into 表名(列名1,列名2...) values(值1,值2 ...);//注意:此时不能省略列名

    对事务的操作:

    commit; //在对表进行增删改操作后,需执行commit之后才能让所作操作对其他用户可见。

    rollback;//若想取消对表的增删改操作,可以执行此语句。

    update 更新

    语法:update 表 set 列=值, 列=值,... where 条件;

    e.g: update emp set sal=800,comm=500 where empno=7369;

    delete 删除

    语法:delete from 表 where 条件;

    e.g: delete from emp where empno = 1234;

    delete from 表; -- 删除表中所有记录

    truncate table 表名; -- 删除表中所有记录 注意:无法使用rollback 撤销,但运行效率高

    注意:如果两张表存在着关联关系,则先删从表记录,再删主表记录。创建这样的有着关联关系的表时,则要先建主表,再建从表。

    e.g:create table users_jone; (主) create table orders_jone; (从)

    drop table orders_jone; (从) drop table users_jone; (主)

    drop table users_jone cascade constraint;//cascade constraint的作用是先删除相关的外键约束再删除表

    根据旧表创建新表

    做法1:先创建与旧表一样的表结构,然后执行:insert into 新表名 select * from 旧表名;commit;

    做法2: 语法:create table 新表名 as select * from 旧表; commit;

    注意:此法创建的表结构与旧表几乎一致,只是约束只能复制not null约束。

    e.g:create table emp_jone as select * from emp;

    create table emp_jone as select * from emp where 1=2;//仅仅复制了表结构,没有复制表数据

    约束:

    1.行级约束

    primary key, references,unique, check, not null

    2.表级约束

    primary key, references,unique, check

    表级约束的写法,e.g:

    create table orders_jone(

    orderId number(6) ,

    orderDate date not null,

    state number(1) not null ,

    totalPrice number(10,2) not null,

    username varchar2(20) not null,

    primary key (orderId),

    check (state in(1,0)),

    foreign key (username)

    references users_jone(username)

    );

    create table score(

    stuName varchar2(20),

    courseName varchar2(20),

    score number(3) not null,

    primary key(stuName, courseName)//联合主键

    );

    约束命名

    命名规则: 表名_列名_约束类型简写(PK 主键,NN 非空,CK 检查,UK 唯一,FK 外键)

    如果没有给约束起名,oracle会自动为约束命名

    e.g:create table orders_jone (

    orderId number(6)

    constraint orders_jone_orderId_pk primary key,

    orderDate date

    constraint orders_jone_orderDate_nn not null,

    state number(1) not null

    check (state in(1,0)),

    totalPrice number(10,2) not null,

    username varchar2(20) not null

    constraint orders_jone_username_fk

    references users_jone(username)

    );

    外键约束:限制某一列不能是任意的,必须来源于另外一个主键列

    语法:列 数据类型 references 表名(引用列)

    系统表(数据字典):存储的都是与定义(表的,约束的)有关信息

    user_tables 存储当前用户创建的表相关信息

    TABLE_NAME -> 表名

    e.g:select table_name from user_tables;

    user_constraints 存储了当前用户的所有约束信息

    OWNER -> 拥有(创建)者

    CONSTRAINT_NAME -> 约束名

    CONSTRAINT_TYPE -> 约束类型

    TABLE_NAME -> 约束所在表

    user_cons_columns 存储了当前用户的所有约束信息

    COLUMN_NAME -> 约束所在列

    select owner,constraint_name,constraint_type from user_constraints where table_name='ORDERS_jone';

    select column_name from user_cons_columns where CONSTRAINT_NAME ='SYS_C0032843';

    序列(sequence ): oracle提供的产生唯一值的一种机制

    创建语法:create sequence 序列名 选项; e.g: create sequence orders_jone_seq;

    select orders_jone_seq.nextval from dual;//取得序列的下个一值

    选项:start with 初始值 ; increment by 递增值 ; cache 缓存值

    e.g: create sequence orders_jone_seq start with 300001 increment by 2 cache 10;

    user_sequences(保存用户的序列信息):

    SEQUENCE_NAME -> 序列名,INCREMENT_BY -> 递增值,CACHE_SIZE -> 缓存值

    e.g:select * from user_sequences where sequence_name ='ORDERS_jone_SEQ';

    应用:可以利用序列生成唯一的ID值

    e.g:insert into orders_jone values(orders_jone_seq.nextval,sysdate,0, 1000.00, 'liucy');

    注意点:

    1.例如:create sequence orders_jone_seq start with 30000;

    select orders_jone_seq.currval,orders_jone_seq.nextval,orders_jone_seq.nextval from dual;//30000,30000,30000

    结论:如果一条查询语句中多次出现nextval,则实际取值时只从序列中取了一次值

    2.序列第一次使用时不能使用currval

    序列刚创建后,运行select orders_jone_seq.currval from emp;

    会报错误: 序列 ORDERS_JONE_SEQ.CURRVAL 尚未在此会话中定义

    sql语句的分类

    DQL (数据查询语言data query) select

    DML (数据操控) insert, update, delete

    TCL (事务控制语言transaction control) commit, rollback

    DDL (数据定义data defination) create, drop, alter, truncate

    DCL(数据控制) grant, revoke

    alter

    添加列 例:alter table users_jone add address varchar2(20) default '北苑家园' not null;

    删除列 例:alter table users_jone drop column address;

    重命名 例:alter table users_jone rename column address to addr;

    修改列 例:alter table users_jone modify username varchar2(30);

    删除约束 例:alter table orders_jone drop constraint orders_jone_orderId_pk;

    修改约束 例:alter table employees modify manager_id integer;

    添加约束 例:

    alter table orders_jone add constraint orders_jone_orderId_pk primary key(orderId);

    事务 (transaction)

    事务代表一组原子(不可再分)操作,它当中的一到多条增删改语句必须作为一个不可分割的整体若,要么都成功(commit),若其中一条失败,应当撤销所有操作(rollback)。

    事务的边界(开始和结束)

    执行update, insert , delete 时事务开始

    执行commit/rollback (事务结束)

    rollback只会撤销本次事务所做的所有操作,不会影响已经结束的事务

    select 不会受事务影响

    锁 synchronize:作用:用来保护并发操作下的数据完整性。(需补充)

    事务的4特性:ACID

    A - 原子性

    C - 一致性

    事务开始前和结束后的数据状态应当一致

    I - isolation 隔离性

    D - 持久性

    指事务结束后,数据的状态应当永久保存下来

    oracle 数据库对象

    表 (table)

    序列 (sequence)

    约束 (constraint)

    视图 (view)

    索引 (index)

    函数 (function)

    (存储)过程(procedure)

    对视图,索引,过程等数据库对象方面的使用有待补充。

  • 相关阅读:
    mac下面xcode+ndk7配置cocos2dx & box2d的跨ios和android平台的游戏教程
    如何在macox下面配置集成ios和android游戏教程
    Cocos2d-x win7 + vs2010 配置图文详解(亲测)
    cocos2d-x学习资源汇总(持续更新。。。)
    我常用的iphone开发学习网站[原创]
    「C」关键字、标识符、注释、内存分析、数据、常量、变量
    「Foundation」集合
    「Foundation」字符串
    「Foundation」结构体
    「OC」block 和 protocol
  • 原文地址:https://www.cnblogs.com/dongxiaoguang/p/2924589.html
Copyright © 2011-2022 走看看