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
m=(currentPage-1)*lineSize+1
n=currentPage*lineSize
分页查询是Oracle的实现方式(行号ROWNUM+FROM 子查询),在mysql中直接使用一个关键字 LIMIT m,n
SqlServer使用top关键字去实现的。
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
⑤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)
INSERT INTO 数据表(字段1,字段2,字段3,...字段n)VALUES(值1,值2,值3,...值n)
每个字段都需要插入数据,可以省略插入的字段(注意,省略了字段,插入的值一个都不能少,否则报错)。
INSERT INTO 数据表 VALUES(值1,值2,值3,...值n)
更新数据
UPDATE 表名称 SET 字段1=新的值,字段2=新的值。。。字段n=新的值 WHERE 过滤条件
UPDATE 表名称 SET 字段1=新的值,字段2=新的值。。。字段n=新的值 WHERE 过滤条件
删除数据
DELETE FROM 数据表 WHERE 过滤条件
DELETE FROM 数据表 WHERE 过滤条件
序列的使用(保证主键数据不能重复)
在每张数据表中都会有一个字段作为数据的唯一区分标志,而且该字段的数据不能重复,这个字段叫做数据表的主键。
基本语法:
删除序列:DROP SEQUENCE 序列名称;
创建序列:CREATE SEQUENCE 序列名称;
使用序列:INSERT INTO myemp(empno,ename,job) VALUES(序列名.nextval,'张三-1','职员');
删除序列: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(1001,'ZHANGSAN-1','职员');
主键的自增长
INSERT INTO myemp(empno,ename,job) VALUES(序列名.nextval,'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 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','职员');
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 字段类型,。。。);
CREATE TABLE 表名称(字段1 字段类型,字段2 字段类型,。。。);
注意:创建数据表之前必须要先删除数据表,避免同名的数据表出现,例如
DROP TABLE teacher PURGE; --删除数据表teacher
CREATE TABLE teacher(tno NUMBER(4) --编号,。。。); ---创建数据表teacher
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);
INSERT INTO teacher VALUES(1001,...);
INSERT INTO teacher(tname,tage,tdate) VALUES ('z老师',100,SYSDATE);
创建数据表时,可以对表内的字段添加约束条件,例如
tno NUMBER(4) NOT NULL, --表示该字段不能为空(非空约束)
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也不会重复,是非空和唯一约束的叠加。
1、数据表创建的基本语法要记住,先删除后创建,创建表时可对字段添加约束条件,然后再插入数据。
2、非空约束,使用NOT NULL 实现,保证了指定字段插入的值不能为null
3、唯一约束,使用UNIQUE 实现,保证指定字段的数据不能重复
4、主键约束,使用 PRIMARY KEY 实现,保证了指定字段不能为null也不会重复,是非空和唯一约束的叠加。
约束的名称
自定义约束的名称,要使用CONSTRAINT来创建
自定义约束的名称,要使用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)); --创建检查约束
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、如果要指定约束的名称,那么需要使用CONSTRAINT引导创建
2、检查约束我们只是作为语法提出,在开发中不会去使用,因为很耗费性能,如果有这样的需求是交给程序去实现。
外键约束
使用外键约束保证了不合逻辑的数据不能插入数据表中。
使用外键约束保证了不合逻辑的数据不能插入数据表中。
总结:
1、外键约束指的是数据表中的某个字段的数据来源依赖于其他数据表中的某个字段的数据,也就是说当前的数据表中插入的数据必须在其他数据表中有记录
2、使用了外键约束之后,表之间就存在一定的依赖关系,依赖的数据表(引用其他表中数据的表)叫做子表或者从表,被依赖的数据表叫做父表或者主表
3、外键约束的语法
CONSTRAINT fk_sno FOREIGN KEY(sno) REFERENCE student(sno);
4、删除数据表的时候要先删除子表再删除父表
5、创建数据表的时候先创建父表再创建子表
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数据库有)。
把数据操作和查询语句组织在pl/sql代码的过程性单元中,通过逻辑判断、循环等操作实现复杂的功能或者计算。(pl/sql只有oracle数据库有)。
BEING --表示开始过程
NULL; --过程代码
END; --过程结束
/ --结尾加斜杠
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;
/
CREATE OR REPLACE PROCEDURE hello_say
AS
BEGIN
DBMS_OUTPUT.put_line('Hello world');
END;
/
--调用过程
BEGIN
hello_say();
END;
/
--直接使用命令执行存储过程
EXEC hello_say();
EXEC hello_say();
如果过程的参数是IN修饰则表示该参数需要在调用的时候传递进来
如果是OUT修饰的参数则表示可以被返回,如果不写默认就是IN。
例如:a IN NUMBER:=10, --是一个输入参数 表示调用过程的时候输入
c OUT NUMBER --是一个输出参数,该参数可以被过程返回
如果是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表示要被删除的数据。
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 OR DELETE --在增加或者删除数据的时候触发
ON 数据表 (例如:emp) --表示触发器建立在emp数据表上
--创建触发器(行级触发器)
CREATE OR REPLACE TRIGGER 触发器名(例如:emp_trigger)
BEFORE INSERT
ON 数据表 (例如:emp)
FOR EACH ROW --表示行级触发器
CREATE OR REPLACE TRIGGER 触发器名(例如:emp_trigger)
BEFORE INSERT
ON 数据表 (例如:emp)
FOR EACH ROW --表示行级触发器
在什么情况下使用呢?
1、如果需要对每一行数据做处理,使用行级触发器
2、语句执行完成后,做该语句的后续业务处理,用语句级触发器
1、如果需要对每一行数据做处理,使用行级触发器
2、语句执行完成后,做该语句的后续业务处理,用语句级触发器