EXISTS子查询

特征:将主查询中的数据带到子查询中进行验证,如果验证成功则子查询返回true,当主查询接收到true的时候被验证的数据就显示,
如果在子查询中验证失败则返回false,当主查询接收到false的时候被验证的数据就不显示。

使用NOT EXISTS的时候也是将主查询中的数据带入子查询进行验证,如果验证成功返回false,主查询接收到false则不显示数据,反之则显示数据。
 

ROWNUM伪列

查询过程中动态的生成一个列(类似于一个字段,但不属于数据表),该列必须从1开始。

 

分页查询

currentPage:表示当前页(cp)
lineSize:表示每页显示的数据量(ls)

总结:知道当前页(cp)和每页显示的数据量(ls)可以计算出要从数据库中第m条查询到第n条数据:
m=(currentPage-1)*lineSize+1
n=currentPage*lineSize
 
分页查询是Oracle的实现方式(行号ROWNUM+FROM 子查询),在mysql中直接使用一个关键字 LIMIT  m,n 
SqlServer使用top关键字去实现的。
 
mysql中实现分页查询
⑤SELECT *
①FROM 数据来源
②WHERE 过滤条件
③GROUP BY 分组字段
④HAVING 对统计函数进行过滤
⑥ORDER BY 排序字段   排序的方式
⑦LIMIT  m,n  从m开始向后取n个数据  
m的含义表示从数据库的第m条开始查询(mysql中的第一条数据m==0)
n的还以是从第m条数据开始往后查询n条数据
m=(cp-1)*ls
n=ls
 

常用的sql语句

数据的增加
INSERT INTO 数据表(字段1,字段2,字段3,...字段n)VALUES(值1,值2,值3,...值n)
每个字段都需要插入数据,可以省略插入的字段(注意,省略了字段,插入的值一个都不能少,否则报错)。
INSERT INTO  数据表  VALUES(值1,值2,值3,...值n)
更新数据
UPDATE  表名称  SET  字段1=新的值,字段2=新的值。。。字段n=新的值    WHERE  过滤条件
删除数据
DELETE FROM  数据表  WHERE  过滤条件

序列的使用保证主键数据不能重复

在每张数据表中都会有一个字段作为数据的唯一区分标志,而且该字段的数据不能重复,这个字段叫做数据表的主键。
 
基本语法:
删除序列:DROP SEQUENCE 序列名称;
创建序列:CREATE SEQUENCE 序列名称;
使用序列:INSERT INTO myemp(empno,ename,job) VALUES(序列名.nextval,'张三-1','职员');
 
手工指定出主键
INSERT INTO myemp(empno,ename,job) VALUES(1001,'ZHANGSAN-1','职员');
 
主键的自增长
INSERT INTO myemp(empno,ename,job) VALUES(序列名.nextval,'zhangsan-1','职员');
 
指定数字开始增长
DROP SEQUENCE empno_sequence;
CREATE SEQUENCE empno_sequence START WITH 1001;
INSERT INTO myemp(empno,ename,job) VALUES(empno_sequence.nextval,'张三-1','职员');
 
指定每条数据增长的步长
DROP SEQUENCE empno_sequence;
CREATE SEQUENCE empno_sequence INCREMENT BY 10 START WITH 1001; --从1001开始,每次增加10
INSERT INTO myemp(empno,ename,job) VALUES(empno_sequence.nextval,'张三-1','职员');
 
创建数据表
CREATE TABLE  表名称(字段1  字段类型,字段2  字段类型,。。。);
注意:创建数据表之前必须要先删除数据表,避免同名的数据表出现,例如
 DROP TABLE teacher PURGE;   --删除数据表teacher
 CREATE TABLE teacher(tno NUMBER(4) --编号,。。。); ---创建数据表teacher
插入数据
INSERT INTO teacher VALUES(1001,...);
INSERT INTO teacher(tname,tage,tdate) VALUES ('z老师',100,SYSDATE);
 
创建数据表时,可以对表内的字段添加约束条件,例如
tno NUMBER(4) NOT NULL,    --表示该字段不能为空(非空约束)
tno NUMBER(4) UNIQUE,     ---唯一约束
tno NUMBER(4) PRIMARY KEY,       ---主键约束(表示该字段不能为空并且唯一的)等同于非空+唯一约束
 
总结:
1、数据表创建的基本语法要记住,先删除后创建,创建表时可对字段添加约束条件,然后再插入数据。
2、非空约束,使用NOT NULL 实现,保证了指定字段插入的值不能为null
3、唯一约束,使用UNIQUE 实现,保证指定字段的数据不能重复
4、主键约束,使用 PRIMARY KEY 实现,保证了指定字段不能为null也不会重复,是非空和唯一约束的叠加。
 
约束的名称
自定义约束的名称,要使用CONSTRAINT来创建
DROP TABLE teacher PURGE;
CREATE TABLE teacher(tno NUMBER(4),
   tname VARCHAR2(10),
   tage NUMBER(3),
   tdate DATE,
 CONSTRAINT pk_tno PRIMARY KEY(tno), --创建主键约束
 CONSTRAINT uk_tname UNIQUE(tname),  --创建唯一约束
 CONSTRAINT ck_tage CHECK(tage BETWEEN 0 AND 250)); --创建检查约束
总结:
1、如果要指定约束的名称,那么需要使用CONSTRAINT引导创建
2、检查约束我们只是作为语法提出,在开发中不会去使用,因为很耗费性能,如果有这样的需求是交给程序去实现。
 
 
外键约束
使用外键约束保证了不合逻辑的数据不能插入数据表中。
总结:
1、外键约束指的是数据表中的某个字段的数据来源依赖于其他数据表中的某个字段的数据,也就是说当前的数据表中插入的数据必须在其他数据表中有记录
2、使用了外键约束之后,表之间就存在一定的依赖关系,依赖的数据表(引用其他表中数据的表)叫做子表或者从表,被依赖的数据表叫做父表或者主表
3、外键约束的语法
 CONSTRAINT fk_sno  FOREIGN  KEY(sno)  REFERENCE student(sno);
4、删除数据表的时候要先删除子表再删除父表
5、创建数据表的时候先创建父表再创建子表
 
 
约束级联操作
级联操作是存在于主表和从表关系之中,当操作了主表中的数据则要求子表中的数据也随之更新或者删除。
级联操作分为:级联删除、更新、查新(使用程序去实现)
级联删除:在删除主表数据的时候同时删除子表中引用的数据,但是在创建外键的时候要指定使用级联删除的操作。
基本语法:CONSTRAINT fk_con FOREIGN KEY(字段) REFERENCES  主表(字段)ON DELETE CASCADE     --创建“字段”的外键约束和需要使用级联删除操作
级联更新:更新了主表数据之后,对应在子表的数据也要随之更新,使用关键字 ON UPDATE CASCADE创建级联更新。
基本语法:CONSTRAINT  fk_cno  FOREIGN  KEY  (字段)  REFERENCES  主表(字段) ON UPDATE CASCADE   --创建“字段”的外键约束和需要使用级联更新操作

注意:Oracle不支持级联更新,但mysql支持,在Oracle中使用级联更新需要使用触发器实现。
 
 
 
pl/sql的基本概念
把数据操作和查询语句组织在pl/sql代码的过程性单元中,通过逻辑判断、循环等操作实现复杂的功能或者计算。(pl/sql只有oracle数据库有)。
BEING --表示开始过程
      NULL;  --过程代码
END; --过程结束
/ --结尾加斜杠
 
SET SERVEROUTPUT ON; 开启打印功能
DBMS_OUTPUT.put_line('Hello world'); --打印Hello world
字符串的连接使用的不是“+”而是“||” 例如:DBMS_OUTPUT.put_line('变量的值是:'||v_num);
全局变量的声明放在DECLARE关键字之后 例如:DECLARE  v_num  NUMBER;  --定义了变量
如果声明了变量但是没有赋值则默认为空
为变量赋值使用的不是“=”而是“:=”
存储过程
--创建过程
CREATE OR REPLACE PROCEDURE hello_say
AS
BEGIN
    DBMS_OUTPUT.put_line('Hello world');
END;
/
--调用过程
BEGIN
   hello_say();
END;
/
--直接使用命令执行存储过程
EXEC hello_say();
 
如果过程的参数是IN修饰则表示该参数需要在调用的时候传递进来
如果是OUT修饰的参数则表示可以被返回,如果不写默认就是IN。
例如:a IN NUMBER:=10, --是一个输入参数 表示调用过程的时候输入
          c OUT NUMBER --是一个输出参数,该参数可以被过程返回
触发器
触发器在数据库里以独立的对象存储,它与存储过程和函数不同的是,存储过程与函数需要用户显示调用才执行,而触发器是由一个事件来启动运行。
触发器分为语句级触发器(又叫表级触发器)和行级触发器。
语句级触发器对每个DML语句执行一次,它是按照语句进行触发的,而不管这条语句实际操作了多少行数据。
行级出发器对DML语句影响的每个行执行一次,它是按照语句实际操作了多少行数据决定触发的次数。
当DML语句没有更新实际的行时,语句触发器也会被触发,而行级触发器不会触发。
 :NEW和:OLD使用方法和意义
  new只出现在insert和update时,old只出现在update和delete时。
  在insert时new表示新插入的行数据,在update时new表示要替换的新数据、old表示被更改的原来的数据,
  在delete时old表示要被删除的数据。
--创建触发器(语句级触发器)
CREATE OR REPLACE TRIGGER  触发器名(例如:emp_trigger)
   BEFORE INSERT OR DELETE --在增加或者删除数据的时候触发
ON 数据表 (例如:emp) --表示触发器建立在emp数据表上
 
--创建触发器(行级触发器)
CREATE OR REPLACE TRIGGER 触发器名(例如:emp_trigger)
  BEFORE INSERT
ON 数据表 (例如:emp)
FOR EACH ROW  --表示行级触发器
 
在什么情况下使用呢?
1、如果需要对每一行数据做处理,使用行级触发器
2、语句执行完成后,做该语句的后续业务处理,用语句级触发器
 

Oracle数据库02的更多相关文章

  1. Oracle数据库该如何着手优化一个SQL

    这是个终极问题,因为优化本身的复杂性实在是难以总结的,很多时候优化的方法并不是用到了什么高深莫测的技术,而只是一个思想意识层面的差异,而这些都很可能连带导致性能表现上的巨大差异. 所以有时候我们应该先 ...

  2. Oracle数据库基础知识

    oracle数据库plsql developer   目录(?)[-] 一     SQL基础知识 创建删除数据库 创建删除修改表 添加修改删除列 oracle cascade用法 添加删除约束主键外 ...

  3. Oracle Recovery 02 - 常规恢复之不完全恢复

    背景:这里提到的常规恢复指的是数据库有完备可用的RMAN物理备份. 实验环境:RHEL6.4 + Oracle 11.2.0.4 单实例. 二.常规恢复之不完全恢复:部分数据丢失 2.1 重做日志文件 ...

  4. Oracle数据库全球化

    一.自定义数据库和各个会话的语言相关行为 1.1 全球化功能 1.2 使用全球化支持功能 二.使用数据库和NLS字符集 2.1 语言排序与选择 2.2 Locale Builder 2.3 使用时区 ...

  5. Linux环境下Oracle数据库启动停止命令

    切换root至oracle数据库账号 su – oracle 查看数据库服务状态: ps -ef |grep oracle netstat –an|grep 1521 查看数据库监听状态: [orac ...

  6. Oracle数据库的启动与停止

    oracle linux下开启与关闭 .启动ORACLE监听 首先要登录用户oracle:su - oracle oracle@localhost bin]$ lsnrctl --启动oracle监听 ...

  7. 600万用户数据导入MYSQL、MSSQL、Oracle数据库方法【转】

      1.导入MySql数据库 参考文献:http://zhuaxia.org/blog/post/145 1.1.LOAD DATA INFILE语法 因为获得的数据库文件是一个文本文件www.csd ...

  8. 修改oracle数据库密码

    1.用Xshell远程连接安装数据库的服务器,切换到安装oracle数据库的用户下,(我的oracle数据库就安装在oracle用户下) 命令: su - oracle; 2.进入oracle控制台 ...

  9. 【绝密外泄】风哥Oracle数据库DBA高级工程师培训视频教程与内部资料v0.1

    [绝密外泄]风哥Oracle数据库DBA高级工程师培训视频教程与内部资料v0.1 由于是[绝密外泄]资料,防止被查,需要的小伙伴赶紧下载附件中的课件文档.由于视频太大了,已放在百度网盘了,已经在附中说 ...

随机推荐

  1. bootstrap的datetimepicker.js的结束时间大于开始时间,当前日期之前的代码

    感觉不错的代码,贴出来,以后接着用 <link href="__ROOT__static/css/bootstrap-datetimepicker.min.css " rel ...

  2. 725. Split Linked List in Parts

    ▶ 将一个单链表拆分为长度尽量接近的 k 段 ● 自己的代码,12 ms ■ 记链表长度为 count,目标段数为 k,quo = count / k,mod = count % k,part = m ...

  3. angularjs中的$http详解

    语法: 要将区别先弄清$http服务,它是对原生XMLHttpRequest对象的简单封装,是只能接受一个参数的方法, 这个方法会返回一个promise对象,具有sccess和error两个方法.当然 ...

  4. role是一个HTML5的属性

    <form role="form"> role是一个HTML5的属性,role="form"告诉辅助设备(如屏幕阅读器)这个元素所扮演的角色是个表单 ...

  5. 归纳整理Linux下C语言常用的库函数----时间日期数学及算法

    在没有IDE的时候,记住一些常用的库函数的函数名.参数.基本用法及注意事项是很有必要的. 参照Linux_C_HS.chm的目录,我大致将常用的函数分为一下几类: 1. 内存及字符串控制及操作 2. ...

  6. go_封装

    go语言中首字母大写表示public go语言中首字母小写表示private 结构定义的方法必须放在同一个包内 一个目录只能放一个包 如何扩充系统的类型或别人的类型: 1.定义别名 2.使用组合 使用 ...

  7. cookie的长度和限制数量

    一.浏览器允许每个域名所包含的 cookie 数 Microsoft 指出 Internet Explorer 8 增加 cookie 限制为每个域名 50 个,但 IE7 似乎也允许每个域名 50 ...

  8. PropertySheet

    ---------------------------------include----------------------------------- E:\OpenSourceGraph\OSG_i ...

  9. __slots__(面向对象进阶)

    1.__slots__是什么:是一个类变量,变量值可以是列表,元祖,或者可迭代对象,也可以是一个字符串(意味着所有实例只有一个数据属性) 2.引子:使用点来访问属性本质就是在访问类或者对象的__dic ...

  10. java内存模型—先行发生原则

    Java语言中有一个“先行发生”(happens-before)的原则.这个原则非常重要,它是判断数据是否存在竞争,线程是否安全的主要依据,依赖这个原则,我们可以通过几条规则一揽子解决并发环境下两个操 ...