zoukankan      html  css  js  c++  java
  • 基本select 语句总结

    --------------基本select语句总结 8.6
    ------------------------------------------------------------------------------
    --SQL:结构化查询语句
    ---------------------------------一 、基 本 查 询 语 法-------------------------------------------
    一.基本查询语法
    select * from emp;
    select empno,ename from emp;
    --空值不参与运算
    select empno,sal as mysal from emp; --为列重命名
    select empno,sal,ename as "worker's name" from emp; --""表示特殊字符串引用
    select empno,sal,deptno "部门编号" from emp;        --as可以没有
    --使用||将多个列合并
    select '编号为'||empno||'的工资为'||sal||',10年的收入为'||(sal*13)*10 from emp;
    --""仅限于特殊引用,表示字符串用''


    ----------------------------------二 、过 滤 和 排 序--------------------------------------------
    二.过滤和排序
    select * from emp where deptno=20; --过滤出部门编号为20的员工信息
    Select distinct JOB From emp where JOB = 'CLERK'; --distinct过滤出不重复的数据
    Select * from emp where SAL != 800; --过滤
    --between and 可用于数字、字符、和日期类型数据. 包括800和2500
    Select * from emp where SAL Between 800 And 2500; 
    Select * from emp where empno In(7521,7900,7876); --In(某个集合)


    select * from emp where ENAME Like '%A%N%'; --模糊查询,名字中有A和N的,A在N之前
    select * from emp where ENAME Like '__M%'; --两跳,第三个字母是M的。


    Select * from emp where MGR is null; --过滤出没有上司的,这里用 IS 不是 =。


    Select * from emp where SAL > 2000 AND COMM Is null; --and
    Select * from emp where SAL>2500 OR COMM Is not null; --or


    --and,or连用,注意默认情况下and的优先级比or高
    Select * from emp where SAL>2000 AND MGR is null or job = 'ANALYST'; 


    --排序,默认ASC-升序,DESC降序
    Select * from emp  Order by sal asc,Hiredate desc; --按sal升序,sal相同按hiredate降序排列。
    Select ename name , sal salary from emp Order by salary asc; --按别名排序


    ---------------------------------------三 、单 行 函 数----------------------------------------------------
    三.单行函数:对每行输入数据进行计算得到对应的结果,单行函数可嵌套使用
    --分类:字符函数、数字函数、日期函数、转换函数、以及其它函数


    A.字符类:lower,upper,initcap,concat,substr,LPAD,RPAD,trim,replace
    select ename,lower(ename) from emp; --loewer
    select ename,lower(ename),upper(lower(ename)) from emp; --upper
    select ename,INITCAP(ename) from emp; --INITCAP 首字母大写,其余小写


    --字符处理类
    select CONCAT(empno,ename) from emp; --CONCAT:连接不同字段,只能连接两个字段。


    --SUBSTR 截取子串
    select ename,substr(ename,2) from emp; --从第二个位置截至末尾。(截掉第一个字符)
    select ename,substr(ename,2,3) from emp; --从第二个位置开始截取三个字符


    select ename,length(ename) from emp; --length:统计字符长度
    select ename,instr(ename,'A') from emp; --INSTR 求A在ename中的索引
    --LPAD,RPAD: 左右粘贴
    select empno,ename,sal,LPAD(sal,10,'$') from emp; --左粘贴 ,显示10位,不够左粘贴'$'.
    --trim两边滤空 LTRIM,RTRIM
    select TRIM('   a  b   c     ') from dual; --字符串中间的空格不管
    --replace:替换
    Select ename ,Replace(ename,'A','*') from emp;  --将A用*代替


    B.数字转换类型:ROUND,TRUNC,MOD
    Select ROUND(16.7777788888888,3) from dual; --保留三位小数,四舍五入
    Select ROUND(178.36934,-1) from dual; --整数位减少一位显示
    Select TRUNC(16.7777788888888,3) from dual; --直接截尾
    Select MOD(89,10) from dual; --MOD:取余


    C.日期类函数:MONTH_BETWEEN,ADD_MONTHS,NEXT_DAY,LAST_DAY,ROUND,TRUNC


    --MONTH_BETWEEN:两个日期的月份之差
    Select max(hiredate) from emp; --最晚工作的人
    Select min(hiredate) from emp; --最早工作的人
    select max(TO_CHAR(hiredate,'yyyy'))-min(TO_CHAR(hiredate,'yyyy')) from emp; --两者年份之差
    Select ename,hiredate,MONTHS_BETWEEN(sysdate,hiredate) from emp; --MONTHS_BETWEEN:hiredate和sysdate之间月份之差
    select max(MONTHS_BETWEEN(sysdate,hiredate)) from emp; --最早雇佣的人
    select * from emp where MONTHS_BETWEEN(sysdate,hiredate)=(select max(MONTHS_BETWEEN(sysdate,hiredate)) from emp);--最早工作人的全部信息
    --ADD_MONTHS
    select hiredate,ADD_MONTHS(hiredate,3) from emp;
    --NEXT_DAY:以当前时间为基准,下一个目标日的日期
    select NEXT_DAY(sysdate,'星期二') from dual;
    --LAST_DAY:计算当前日期的最后一天
    select LAST_DAY(sysdate) from dual;
    select LAST_DAY(hiredate)-hiredate from emp; 
    --ROUND:对日期进行四舍五入
    select ROUND(sysdate,'yyyy') from dual; --按年进行四舍五入
    select round(sysdate) from dual; --按日进行舍入
    --TRUNC:截取
    select trunc(sysdate,'D') from dual; --截取至本周第一天
    select trunc(sysdate,'MM') from dual; --截取至本月第一天
    select trunc(sysdate,'DD') from dual; --截取至本日0:00
    select trunc(sysdate,'yyyy') from dual; --截取至本年第一天
    Select TRUNC(sysdate-365) from dual; --sysdate-1:代表一天。TRUNC:截掉时分秒
    Select Sysdate-1/24/60 from dual; --一分钟之前的时间显示。




    D:转换类函数。类型转换只能发生在:数字与字符、日期与字符之间。to_char,to_date,to_number


    to_char:转换数字为字符,转换日期为字符 
    --tochar(date,'fmt')
    select TO_CHAR(sal,'$999,999.00') from emp; --按千分位保留两位小数显示,L 本地货币符号显示
    --数字类型格式控制符:9-代表一位数字,有显示,无不显示。0-强制显示该位,无以0显示
               --$,L:货币符号显示。,. :千分位、小数位显示


    select TO_CHAR(123.235,'L999.00') from dual; --需要显示的位数不能比原来少
    select TO_CHAR(sysdate,'"今天是"yyyy-mm-dd DAY MON HH24:MI:SS PM') from dual;--p41
    select TO_CHAR(sysdate,'"今天是"YYYY YEAR DAY ') from dual;
    --日期类格式控制符:year:年的拼写。MONTH:月的拼写。DAY:星期的拼写。MON:月的缩写。DY:星期的缩写。
    --其它时间格式控制符:AM:早上或下午。HH24:24小时制。SP:数字的拼写。TH:数字的序列词。"":特殊字符。


    TO_DATE:将字符串转换为日期格式,格式要匹配。
    select TO_DATE('01-5月-04') from dual; --隐式转换,因为字符串与默认日期格式完全匹配。默认日期格式:DD-MON-YY
    select TO_DATE('2008年-01-01','yyyy"年"-mm-dd') from dual; --转换格式要和原格式完全匹配。
    select TO_DATE('2008.8.4','yyyy.mm.dd') from dual; --格式匹配
    Select TO_DATE('2008-01-01 星期二 10:36:31 上午','YYYY-MM-DD DAY HH:MI:SS PM') From DUAL


    TO_NUMBER:将字符串转换为数字。
    注意:格式必须要匹配.
    Select TO_NUMBER('$1,600.01','$999,999.99') From DUAL


    E:其它函数
    --与空值相关的函数:NVL(exper1,exper2),NVL2(exper1,exper2,exper3),NULLIF(exper1,exper2),COALESCE(exper1,……,expern)
    select comm,NVL(comm,200) from emp; --每有的以200显示,NVL的两个参数类新需匹配,否则出错
    select SAL,comm,NVL2(comm,sal+comm,sal) from emp; --NVL2,comm不为空则显示sal+comm,否则显示sal。
    select ENAME,JOB,NULLIF(LENGTH(ename),5) from emp; --NULLIF,判断是否相等,相等返回null否则返回表达式1。
    select * from emp where NULLIF(LENGTH(ename),5) is NULL; --显示emp表中所有名字长为5的数据记录。
    --coalesce找到第一个不为空的表达式,返回
    select MGR,COMM,EMPNO,coalesce(MGR,COMM,empno,88) from emp; --coalesce:逐个判断,成立显示,否则向后


    --条件表达式:case+字段名,when……then……else……end,decode()
    select JOB,case job when'CLERK'then'店员'when'SALESMAN'then'销售'when'MANAGER'then'经理'else'其他'end from emp;
    select job,decode(job,'CLERK','店员','SALESMAN','销售','MANAGER','经理','其它')from emp;
    按工作种类调整工资
    select job,sal,decode(job,'CLERK',sal,'SALESMAN',sal*1.2,'MANAGER',sal*1.8,sal) from emp;




    -------------------------------- 四、分  组  函  数------------------------------------
    四.分组函数:是多行函数,对多行值进行计算,得到多行对应单个结果。
    对每个表数据进行分组,得到多组结果,对每组记录进行计算,每组分别返回一个结果,最终产生多个组对应的数据集合
    select job,max(sal),min(sal),avg(sal),sum(sal),count(distinct deptno) from emp group by job;
    注意:a.所有包含在select列表不再组函数中的字段都必须在GROUP BY中。
          b.group by可以和where搭配,where只能在group by前面,where子句中不能包含任何组函数。
    select job from emp where sal=(select max(sal) from emp) group by job; --此处where子句不能直接用组函数,只能使用子查询。
    select job from emp where sal>2000 group by job;


    使用HAVING子句对分组结果进行过滤
    select max(sal),min(sal),deptno,sal from emp group by deptno,sal HAVING sal>2000;
    组函数的嵌套最多嵌套两层,如果一个使用组函数查询没有group by子句,那么组函数不能嵌套。




    --------------------------------五 、子   查   询--------------------------------------------
    五.子查询
    语句内部的子句,
    Select * From EMP Where SAL>(Select SAL From EMP Where ENAME='ALLEN');


    a.注意:
    A.子查询总是先于主语句的运行
    B.必须有(),表示是一个整体
    C.习惯上,把子查询放在条件的右边
    D.单行操作符只能接受一个值
    单行:> < >= <=等


    b.子查询的分类:
    A.单行
    B.多行


    c.单行的语法
    select 字段 from 表 where 字段 >[单行] (子查询)


    d.多行
    in ,all,any
    in:表示在一个区间内
    select * from emp where ename in (
    select ename from emp where sal>2000
    )


    any:
    > any:从子查询中取一个最小的
    < any:从子查询中取一个最大的


    all
    >all :从子查询中取一个最大的
    <all:从子查询中取一个最小的


    ------------------------------- 六、多 表 连 接-------------------------------
    六.多表连接
    数据来源于多个表,通过表之间的关系取出对应的行数据。查询通常建立在存在相互关系的父子表上
    多表连接的分类:等值连接、非等值连接、外连接和自连接四种。从Orcale 9i开始增加了对新的SQL标准-SQL1999的支持。


    A.等值连接:通常建立在存在主外键约束条件的多表上,两个字段通过等号建立等值关系。
    select * from emp,dept; --产生笛卡尔集:两个表任意组合的结果。
    select * from emp e,dept d where e.deptno=d.deptno; 
    select ename,job,dname,sal,e.deptno,d.deptno from emp e,dept d where e.deptno=d.deptno and sal>2000;
    (1)列只出现一次不需要加前缀,明确定义可以提高效率,别名可以提高查找效率。
    (2)不同的连接条件可以使用and或or
    (3)当然,你可以为表定义一个别名,但是不能使用as(字段重命名可以使用)    


    B.不等值连接:一个表中的记录,在另一个表中能够找到匹配的记录即可
    Select e.*,g.grade From emp e,salgrade g Where e.sal Between g.losal And g.hisal; --查询员工的工资级别


    C.外连接:把不满足条件的数据显示出来
    Select * From EMP E,DEPT D Where E.DEPTNO=D.DEPTNO(+)
    外连接可以在左表,也可以在右表,但只能出现一次。
    左连接  将产生以表达式右边的字段为依据的查询效果,即右边所有数据和左边和右边匹配的数据。


    D.自连接:一个表被虚拟成两个表,查看两个相关字段的信息。
    select e.ename||' works for :'||e2.ename from emp e,emp e2 where e.mgr=e2.empno; --自查询,查询每个人老大的名称


    E.SQL99新标准下的多表连接
    (1)CROSS JOIN:交叉连接
      select * from emp cross join dept; --产生笛卡尔集
    (2)NATURAL JOIN:自然连接,默认将名称相同的列进行连接。
      select * from emp natural join dept; 
      select * from emp e,dept d where e.deptno=d.deptno; --和自然连接的效果一样
    (3)用 using 字句进行指定连接条件连接
      select * from emp Join dept using(deptno);
    (4)使用 on 来指定连接具体条件
      Select * From EMP Join DEPT On  emp.deptno=dept.deptno And EMP.DEPTNO=20
    (5)多个表连接查询
      Select  E.ENAME,E.SAL,D.DNAME,S.GRADE
     FROM EMP E Join DEPT D On E.DEPTNO=D.DEPTNO 
      Join SALGRADE S On E.SAL Between S.LOSAL And S.HISAL
    (6)外连接:
      与内连接的区别:
      内连接========查询条件相等的记录(能够匹配的)
      外连接========条件相等的+没匹配的
      select * from EMP E  Left Outer join DEPT D on E.DEPTNO=D.DEPTNO; --LEFT OUTER JION
      select * from EMP E  Right Outer join DEPT D on E.DEPTNO=D.DEPTNO; --LEFT OUTER JION
      select * from EMP E  Full Outer join DEPT D on E.DEPTNO=D.DEPTNO; --LEFT OUTER JION
      LEFT OUTER JOIN……ON:左外连接,返回左边所有的值及右边匹配的值。(和上面的外连接刚好相反) 




    ------------------------------------ 七、数 据 处 理-----------------------------------
    七、数据处理
    DML:DATA Market language
    insert
    update
    delete
    这三类的操作对数据会产生影响,牵涉到"事务"


    1.写入数据:
    语法: insert into 表(列1,列2) values(值1,值2)
    Insert Into EMP(EMPNO,ENAME,JOB,SAL) Values(1234,'ZHANGSHAN','MANAGER',8000)
    rollback
    注意:
    A.表后面()内表示的是字段名称
    Values()内表示是字段所对应的值


    B.值要与列所表示的数据类型对应
    C.值的个数要和列的个数对应
    D.注意顺序,对应
    E.没有指定值的列默认为null
    查询的时候,可以使用is null来提取
    F.写入的数据只在当前窗口内是有效的,打开一个新的SQL Window就无效


    如果需要持久性保存下来
    需要进行事务处理




    事务:所谓事务,就是一组操作单元,事务提交,再语句的结果全部生效,如果回滚,全部撤销


    事务操作
    A.提交commit
    B.rollback
    C.回滚到指定的点




    --insert的值可以是一个固定的取值,比如sysdate,序列等
    Insert Into EMP(EMPNO,ENAME,JOB,SAL,comm,hiredate) Values(1238,'ZHANGSHAN','MANAGER',8000,Null,Sysdate)
    Insert Into emp(empno,ename,hiredate) Values(2222,'zhangshan',to_date('2008-08-08','yyyy-mm-dd'))


    --使用Insert从其他表中拷贝数据
    Insert Into emp(empno,ename) select deptno,dname from dept;
    insert into temp_1(select * from emp where sal > 3000);


    2.使用变量是执行sql语句
    --在sql中,可以是"&变量名称"来定义表名,字段名,值等信息
    Insert Into emp(empno,&filedname,hiredate) Values(&请输入编号,'&人员姓名',to_date('2008-08-08','yyyy-mm-dd'))




    3.使用insert语句从其他表中拷贝数据
    Insert Into EMP(EMPNO,ENAME) Select DEPTNO,DNAME From DEPT


    注意:
    A.字段类型要对应
    B.字段个数要对应


    4.更新操作
    语法:update 表 set 字段=值 where 条件
    Update emp Set ename='zhangshan',job='manager' Where empno=7369


    注意:
    A.不同的字段用逗号隔开
    B.如果没有指定条件,默认更新所有的记录




    5.在更新语句中使用子查询
    Update emp Set sal=(
           Select sal From emp Where ename='SMITH'
    ),job=(
    Select job From emp Where ename='ALLEN'
    ) Where empno=7521


    6.关于更新时发生的数据关联问题
    如果一个字段的值的来源是另外一个表,比如emp表中的deptno,其值不能随意指定,因为deptno的值引用自dept表中的deptno字段


    Update emp Set deptno=55 Where empno=7499  ---error
    因为dept表中如果没有deptno为55的记录,会出现数据完整性约束问题


    Update emp Set deptno=10 Where empno=7499---ok


    7.删除记录
    delete [from] table where condition
    如:
    Delete From emp Where empno=1234


    条件可以为多个
    Delete From emp Where empno=7369 And ename='SMITH'


    8.使用子查询执行delete操作
    Delete EMP Where ENAME=(
    Select ENAME From EMP Where SAL=(Select Max(SAL) From EMP)
    )


    9.关于删除的完整性约束:
    如果一个字段被另外一个表的字段引用,那个这个值就不能删除


    delete from dept where deptno=40
    可以删除,因为在emp表中没有某个人在40部门下面


    delete from dept where deptno=30
    出现数据完整性约束条件错误,因为30号部门被引用


    10.事务管理
    事务:一组操作单元
    同进同出
    你可以设置一个保存点,必要的时候可以退到某个指定的位置
    Insert Into EMP(EMPNO,ENAME,JOB,SAL) Values(1236,'ZHANGSHAN','MANAGER',8000)
    Savepoint insert_done;
    Insert Into EMP(EMPNO,ENAME,JOB,SAL) Values(1235,'ZHANGSHAN','MANAGER',8000)
    Insert Into EMP(EMPNO,ENAME,JOB,SAL,comm,hiredate) Values(1238,'ZHANGSHAN','MANAGER',8000,Null,Sysdate)


    Rollback To insert_done
    有些场合下,事务是自动来提交的
    比如创建或修改表的时候






    --------------------------八 、创建和管理数据--------------------------
    数据库表主要分为几大类
    A.系统表  B.自定义表  C.数据字典表
    Select * From USER_TABLES
    Select * From USER_SEQUENCES


    1.命名规则
    A.表名长度必须在30位以内  B.表名要避开关键词  C.表名要有意义


    2.创建表
    语法规则类似于:
    Create Table MYTABLE(Id Number(4,2),Name Varchar2(20),AGE Number(3));
    你可以在创建表的同时,指定默认值
    create table DEMO2(dname varchar2(20),dage number(3) check (dage  between 10 and 150),hiredate date default sysdate);


    3.查看其他用户的表
    以sys身份可以看到scott用户下的表
    select * from scott.emp
    反之,scott不能看sys用户下的表的信息


    4.默认值的指定
    Create Table A1(
    Id Number(4),
    BIRTHDAY Date Default TO_DATE('2008-08-08','YYYY-MM-DD')
    )


    5.字段类型的定义
    char---定长字符串
    varchar2----变长字符串


    char(20)   abcd---------20
    varchar(20) abcd--------4


    NUMBER(N):表示整数位不能大于n个,小数位可以任意
    number(m,n):表示总长度为m位,其中小数位为n,整数为为m-n


    Date 类型:可以使用to_date把字符串类型转换为date类型
    BLOB:大的二进值对象,可以用来存储图片,视频文件等信息


    6.使用子查询来创建表
    create table 表名 as 子查询


    create table t3 as select * from emp where sal>2000;


    7.更新表的结构
    alter table
    A.追加列
    Alter Table userinfo Add (addr Varchar2(20) Default 'beijing')


    B.修改列
    Alter Table userinfo Modify (age Number(6))
    使用modify可以修改数据类型,长度,默认值
    请注意:对默认值的修改,只对后面的数据才有效


    C.删除列
    Alter Table userinfo Drop Column age


    8.删除表的定义
    drop table 表的名称
    drop table emp;


    9.对表进行重命名
    使用rename .... to
    比如:RENAME A TO B
    注意:这个表是你的,你是这个对象的所有者


    提示:
    在PLSQL中,添加记录的两种方式
    A.可以使用insert语句   B.直接在工具里面直接编辑
    前提:必须获得一个可更新的结果集
    B1:SELECT * FROM EMP FOR UPDATE
    B2:select t.*, t.rowid from userinfo t


    10.删除表的内容
    两种方式
    A.delete删除
    B.truncate清空表的内容


    区别:
    delete:从数据库的缓存区清除该数据
    truncate:把数据删除了,然后清空所占用的空间


    delete可以撤销
    truncate不能撤销
    truncate===delete+commit


    TRUNCATE 语法
    TRUNCATE TABLE EMP;


    TRUNCATE和drop 区别
    drop:删除表的定义,整个对象删掉,删除的是对象的本身,全部
    truncate:删除表的内容,只是删除数据,表的结果会保留


    11.注释
    分两种
    A.表   B.字段
    表的注释
    COMMENT ON TABLE EMP IS 'MY DEMO'


    列的注释
    COMMENT ON COLUMN EMP.ENAME IS '我的注释'


    12.从plsql工具中导出表的信息
    TOOLS---EXPORT TABLES---SQL INSERTS


    ---------------------------九 、约束----------------------------
    约束:主要是用来限定内容                 作用对象:表
    1.约束分类
    五大类
    A.非空
    B.唯一
    C.主键:非空+唯一
    D.外键:值是外来的
    E.检查:值是符合条件


    2.注意事项
    A.可以给约束起个名字,也可以是使用默认的名字
    B.创建的两种时机
       创建表的同时/修改表的定义的时候
    C.约束的定义位置
    表级/列级
    D.在字典表中可以查看到这些约束信息
    表的定义:user_tables
    约束的定义:user_constraints
    使用SELECT * FROM USER_CONSTRAINTS语句可以查看到所有的约束信息


    注意:以后如果出现:ORA-01400:无法将null写入用户.表.字段,表示该字段必须要赋一个值


    3.not null约束
    用来修饰字段的     表示该列的值不能为null


    定义位置:not null只能在列级
    列级:区别于表级
    表级:定义的时候,与字段用逗号分开,和字段是同一语句级别
    列级:定义的时候,紧跟在字段的后面
    CREATE TABLE employees(employee_id  NUMBER(6),first_name   VARCHAR2(20),
            ...
    job_id       VARCHAR2(10) NOT NULL,CONSTRAINT emp_emp_id_pk PRIMARY KEY (EMPLOYEE_ID));


    上面的例子中
    not null=======列级
    CONSTRAINT emp_emp_id_pk PRIMARY KEY (EMPLOYEE_ID)代表一个表级的定义


    4.unique唯一约束
    是用来修饰一个字段的,内容的unique要求字段内容不能有重复


    unique定义位置
    A.表级(自定义名称)   B.列级(使用系统默认名称)


    基本语法:
    列级:字段名 unique
    表级:,constraints uni_名称 unique(字段名)


    例子:
    CREATE TABLE T4(
    ID NUMBER(4) UNIQUE,--column
    NAME VARCHAR2(20),
    AGE NUMBER(3),
    CONSTRAINTS UNI_NAME UNIQUE(NAME)--table
    )


    5.主键约束
    也是用来约束字段的,要求其内容必须不能为null,也不能重复
    PRIMARY KEY:主键==not null+unique


    定义位置:
    A.表级   B.列级


    定义方式
    列级:字段名 primary key
    表级:constraints pk_id primary key(id)
    一般情况下,我们在创建表的同时,都会为表指定一个主键,用来唯一标识一条记录,以便在程序中实现修改,删除等业务逻辑操作时,根据该主键标识来准确定位到要操作的记录




    联合主键:
    把多个字段合起来作为一个主键,要求多个字段每一项都不能为null,并且合起来的值不能重复.


    6.外键约束
    外来的键值,如EMP表的deptno字段引用了dept表中的deptno字段
    我们认为:emp表中的deptno是一个外键,emp.deptno不能任意指定,只能从dept.deptno的值中任意选一个


    外键约束定义的位置:
    A.表级   B.列级


    语法定义格式:constraints 自定义名称 FOREIGN KEY (字段名) references 表名(字段名)


    使用外键约束的条件:如果A表引用B表中的字段id
    条件有两个:B表中的id必须有主键约束 或 唯一性约束


    删除表的方式:A.drop table   B.工具中drop


    列级外键定义:直接在列名的后面 references dept(deptno) 


    7.关于外键的删除级联设置
    联动的效果,我们可以在父项进行删除的时候,让子项联动


    两种方式
    A.on delete cascade:级联删除
    B.on delete set null(不引用)


    外键引用时的值的选择:A.要么为null  B.要么从父表中取一个值


    8.CHECK约束
    check:对某个字段的值的约束,要求该字段的每一行都必须满足的条件,它以一种很直观的方式,来限定你的行值


    CREATE TABLE STAFF(
    STAFFID NUMBER(5),
    NAME VARCHAR2(20) CHECK(NAME IN ('A','B','C'))
    )


    定义位置:
    可以表级也可以是列级


    9,约束的添加
    语法:alter table 表名 add primary key (字段名称)
    实例:ALTER TABLE STAFF ADD PRIMARY KEY (NAME)


    10.删除已存在的约束
    ALTER TABLE 表名 drop constraints 约束名
    比如:ALTER TABLE STAFF DROP CONSTRAINTS SYS_C003042


    11.级联删除约束
    在删除约束的同时,也删除跟该字段有关系的约束设置
    ALTER TABLE DEPT DROP CONSTRAINT PK_DEPT CASCADE
    该代码执行后:emp表中的外键引用就不存在了


    12.有效化和无效化约束
    使用disable和enable关键词
    ALTER TABLE EMP DISABLE CONSTRAINT PK_EMPNO
    ALTER TABLE EMP ENABLE CONSTRAINT PK_EMPNO


    13.从数据字典中查询
    select * from user_constraint:查询对应的表
    SELECT * FROM USER_CONS_COLUMNS:查询对应的列




    ------------------------十 、视图----------------------------
    10g:以DBA的身份登录(sys,Oracle),在Command Window中输入以下命令:grant create view to scott;


    视图:逻辑上的数据集合
    逻辑上:区别于物理上
    物理上:表示真实的,现实存在
    逻辑上:虚的数据,来源于真实的表


    比如,我们可以为emp创建一个视图:
    CREATE OR REPLACE VIEW EMP_VIEW AS SELECT EMPNO,ENAME,JOB,HIREDATE FROM EMP


    以后如果想要EMPNO,ENAME,JOB,HIREDATE这些数据,就可以不必访问emp了,直接从视图中来查找
    作用:a.控制数据访问 b.简化查询 c.数据独立性 d.避免重复访问相同的数据


    1.创建格式:
    create or replace view 视图名词 as 数据集合(通常是一个查询语句)


    2.在创建视图的时候,可以使用别名
    CREATE OR REPLACE VIEW EMP_VIEW AS 
    SELECT empno employee_number,ename employee_name,job type,hiredate birthday FROM EMP


    3.修改视图:
    create or replace view myview as select...


    4.视图创建的规则
    视图的内容可以是任意的集合
    CREATE OR REPLACE VIEW EMP_VIEW AS 
    SELECT JOB,MAX(SAL) AS MAXSAL,MIN(SAL) AS MINSAL,
    (MAX(SAL)-MIN(SAL)) AS SAL,COUNT(*) NUM,AVG(SAL) AVGSAL 
    FROM EMP GROUP BY JOB 
    HAVING JOB IS NOT NULL




    5.区别:
    A语句:CREATE OR REPLACE VIEW JOB_VIEW AS 
          SELECT DISTINCT(JOB) FROM EMP WHERE JOB IS NOT NULL
    B语句:CREATE TABLE JOB_TEMP AS SELECT DISTINCT(JOB) FROM EMP WHERE JOB IS NOT NULL


    主要区别:
    共同点:都做到了:数据被独立出来


    最大不同:JOB_TEMP是一个物理的表,是要占用很多的数据库空间的,
    相当于硬盘上的资料被拷贝了一份


    JOB_VIEW:数据还是同一份,不会多占空间,JOB_VIEW相当于是一个"快捷方式"


    视图数据的来源===基础表
    对基础表的数据的改变将会影响到视图,视图本身并不保存数据,只是对相关数据集合的一个引用而已
    简单视图操作的数据和基础表中的数据是"同一份"


    复杂视图不能使用DML:
    原因:数据已经被整合了,如果被改变,无法和基础表的数据对应了


    6.删除视图:
    drop view 视图名称,删除视图是对基础表不会产生任何的影响


    7.TOP-N分析:
    使用到一个关键的列名:rownum
    rownum:行编号
    伪列:虚拟的列,你并没有在表中人为的添加这个列,
    但是当你使用rownum关键词,oracle服务器能够解析


    使用的方式
    rownum<或<=
    因为它总是从第一行开始


    例外:
    ROWNUM=1不会为null


    分页查询的变通方式:查询第三行到第八行之间的数据
    SELECT * FROM (SELECT e.*,ROWNUM AS RN FROM EMP e) WHERE RN BETWEEN 3 AND 8;
    --方法二
    select * from emp where rownum <= 8
    minus
    select * from emp where rownum <3;


    --------------------十一 、其它数据库对象---------------------
    数据库主要对象:表、视图、序列、索引、同义词
    表:数据集合
    视图:逻辑上数据集
    序列:有规律数值(不为null且唯一的键值)
    索引:定位记录
    同义词:类似于别名


    1.序列:
    A.共享的   B.提供有规律的数值


    提取方式:序列名.nextval
    select seq.nextval from emp
    INSERT INTO EMP(EMPNO) VALUES(MYSEQ.NEXTVAL)


    2.查询已定义的序列
    SELECT * FROM USER_SEQUENCES


    3.使用序列的约束
    nextval 下一个值 , currval  表示当前值
    currval的值必须在nextval被指定后才有效


    4.删除序列
    drop sequence myseq


    5.索引:
    一种典型的数据库对象
    作用:提交数据的查询效率,尤其对一些数据量很大的表
    索引是用来为表服务的
    索引是oracle服务器自动来使用(索引区的查找是oracle自动的)和维护(当记录发生变化的时候,索引区会自动随之更改)


    6.定义
    定义的两种方式 
    A.自动创建:
    主键 或 唯一性约束


    B.手动创建
    CREATE INDEX ENAME_IDX ON emp(ename)


    7.索引的创建时机问题:
    两种情况下一般都要创建一个索引:
    列经常被用来做条件查询的时候
    表数据量很大的时候


    下列情况不要创建索引:
    表很小
    列不经常作为连接条件或出现在WHERE子句中
    查询的数据大于2%到4%
    表经常更新


    8.同义词
    为对象起一个同义的名称
    目的:为了缩短对名称长度的引用


    创建方式:
    synonym:CREATE SYNONYM  同义词名词 for 对象(scott.emp)


    CREATE SYNONYM SN_EMP FOR  SCOTT.EMP
    CREATE SYNONYM SN_DEPT FOR SCOTT.DEPT
    SELECT * FROM SN_EMP E,SN_DEPT D WHERE E.DEPTNO=D.DEPTNO


    9.集合操作符
    三大类
    合集:union/union all
    交集:intersect
    差集:minus


    合并集合:
    SELECT * FROM EMP WHERE SAL>2000
    UNION
    SELECT * FROM EMP WHERE JOB='MANAGER'


    注意:
    A.不同的表合并时,要注意字段个数要对象
    B.类型要对应
    C.显示的字段是第一个表的字段列名为新的集合的列名
    使用union all保留重复的记录
    intersect交集
    不保留重复的
    minus


    分页查询
    两种方式
    SELECT * FROM (
           SELECT ENAME,EMPNO,JOB,ROWNUM RN FROM EMP
    ) WHERE RN BETWEEN 3 AND 9
    A.使用rownum限定
    select * from emp where rownum <= 8
    minus
    select * from emp where rownum < 3
    B.minus集合操作符


    10.关于dual表的使用
    dual是一个虚表
    其表中只是返回一条记录
    作用:A.计算数值
         B.提取系统的某些值,比如user,sysdate
         C.转换


    DUAL和其他的表的区别
    SELECT UPPER('smITh') FROM DUAL   只返回一条
    SELECT UPPER('smITh') FROM EMP    返回N条

  • 相关阅读:
    POJ2823 Sliding Window【双端队列】
    初识Identity
    dSploitzANTI渗透教程之启动zANTI工具
    dSploitzANTI渗透教程之安装zANTI工具
    iOS Sprite Kit教程之滚动场景
    iOS Sprite Kit教程之场景的切换
    iOS Sprite Kit教程之场景的设置
    iOS Sprite Kit教程之真机测试以及场景的添加与展示
    iOS Sprite Kit教程之申请和下载证书
    iOS Sprite Kit教程之使用帮助文档以及调试程序
  • 原文地址:https://www.cnblogs.com/justdoitba/p/8359815.html
Copyright © 2011-2022 走看看