错误提示,直接了当 (5)SQL强调结果 PLSQL是什么 是专用于Oracle服务器,在SQL基础之上,添加了一些过程化控制语句,叫PLSQL 过程化包括有:类型定义,判断,循环,游标,异常或例外处理...dbms_output.put_line('hello 你好'); end; / 注意: dbms_output是oracle中的一个输出对象 put_line是上述对象的一个方法,用于输出一个字符串自动换行...中的语法已经知道,有一个exception,这个在Oracle中称为例外,我们也可以简单看成就是Java中的异常。。。...-- 遍历每一行记录 [FOR EACH ROW] PLSQL 块【declare…begin…end;/】 ?...这里写图片描述 ---- 星期一到星期五,且9-20点能向数据库emp表插入数据,否则使用函数抛出异常, 语法:raise_application_error('-20000','例外原因') CREATE
可以将游标形象的看成一个变动的光标,他实质上是一个指针,在一段Oracle存放数据查询结果集或者数据操作结果集的内存中,这个指针可以指向结果集任何一条记录。...PL/SQL 程序不能用OPEN 语句重复打开一个游标。 l 提取游标数据:就是检索结果集合中的数据行,放入指定的输出变量中。 ...l 对该记录进行处理; l 继续处理,直到活动集合中没有记录; l 关闭游标:当提取和处理完游标结果集合数据后,应及时关闭游标,以释放该游标所占用的系统资源,并使该游标的工作区变成无效,不能再使用FETCH...--删除EMPLOYEES表中某部门的所有员工,如果该部门中已没有员工,则在DEPARTMENT表中删除该部门。...简单来时是存储在数据库服务器中的封装了一段或多段sql语句的plsql代码块。存储过程可以在编程语言中调用,如Java等。 存储过程的优点: 简化复杂的操作,封装。
左外连接(LEFT OUTER JOIN),返回左表中所有的数据行;对于右表中的数据,如果没有匹配的值,返回空值。...右外连接(RIGHT OUTER JOIN),返回右表中所有的数据行;对于左表中的数据,如果没有匹配的值,返回空值。...显示员工信息时,增加一列,用于显示该员工所在部门的人数。如何编写 SQL 查询?...针对外部查询中的每条记录,如果子查询存在结果(部门中存在女性 员工),外部查询即返回结果。NOT EXISTS 执行相反的操作。 53....,如果在目标表中存在满足条件的记录,执行 UPDATE 操作更新目标表中对应的记录;如果不 存在匹配的记录,执行 INSERT 在目标表中插入一条新记录。
; end; /* 错误信息开发中的异常 数据库中叫做 例外 异常的分类 1.系统异常 系统定义好的异常 2.自定义的异常 new...:使用游标查询部门下的员工信息 如果部门下没有员工 报错提示 需要自定义异常 变量名 exception --声明自定义异常 */ declare...emp_cursor into emp_row; if emp_cursor%notfound then --没有员工 抛出错误异常 raise no_dept_emp;...,可以调用函数 90%情况下 函数和过程通用 过程可以调用函数,函数同样可以调用过程 */ /* 触发器 是一个监视器,监视对表中数据的操作 如果对数据的操作满足触发器的执行条件...原始的记录 原始的记录 */ --创建触发器监视表,如果表中有数据插入,输出一个欢迎语句 create or replace trigger insert_trigger after
when c1%notfound 注意:上面的pjob必须与emp表中的job列类型一致 定义: pjob emp. empjob%type; 范例1:使用游标方式输出emp表中的员工编号和姓名...distinct job from emp order by job; 如果遇到异常我们要抛出 raise no_data; 范例2:查询部门编号是50的员工 declare no_emp_found...每当一个特定的数据操作语句( insert, update, delete)在指定的表上发出时, Oracle自动地执行触发器中定义的语句序列。...PLSQL块 end 触发器名 范例:插入员工后打印一句话“一个新员工插入成功” create or replace trigger testTrigger after insert on person...在触发器中触发语句与伪记录变量的值 ?
(id) -- 外键,关联部门表(部门表的主键) ); INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('孙悟空','男',...* 例子: -- 查询所有员工信息,如果员工有部门,则查询部门名称,没有部门,则不显示部门名称 SELECT t1.*,t2....事务的隔离级别(了解) * 概念:多个事务之间隔离的,相互独立的。但是如果多个事务操作同一批数据,则会引发一些问题,设置不同的隔离级别就可以解决这些问题。 * 存在问题: 1....脏读:一个事务,读取到另一个事务中没有提交的数据 2. 不可重复读(虚读):在同一个事务中,两次读取到的数据不一样。 3....幻读:一个事务操作(DML)数据表中所有记录,另一个事务添加了一条数据,则第一个事务查询不到自己的修改。
外连接(Mysql支持:左外连接 、右外连接) 外连接分类 左外连接 左表中所有的记录都出现在结果中,并上右表与之对应的部分, 如果右表没有匹配的记录,使用NULL填充 右外连接 右表中所有的记录都出现在结果中...,并上左表与之对应的部分, 如果左表没有对应的记录,使用NULL填充 语法 -- 左外连接 select 列名 from 左表 left join 右表 on 从表.外键=主表.主键 -- 右外连接...select 列名 from 左表 right join 右表 on 从表.外键=主表.主键 应用 左外连接 需求:查询所有的部门,以及该部门下面的员工 -- 添加一个销售部,暂时还没有员工 insert...使用左外连接查询: 可以看到能够查询出 【销售部】 -- 左表中所有的记录都出现在结果中,并上右表与之对应的部分, 如果右表没有匹配的记录,使用NULL填充 mysql> select * from...使用右外连接查询: 基于右连接查询,不管 emp 的数据有没有关联 dept_id, 也可以查询出右表中的所有数据 mysql> select * from dept d right join emp
1.概述 概念:约束是作用于表中字段上的规则,用于限制存储在表中的数据。 目的:保证数据库中数据的正确、有效性和完整性。...分类: 注意:约束是作用于表中字段上的,可以在创建表/修改表的时候添加约束。 2. 约束演示 案例需求: 根据需求,完成表结构的创建。...我们来看一个例子: 左侧的 emp 表是员工表,里面存储员工的基本信息,包含员工的 ID、姓名、年龄、职位、薪资、入职日 期、上级主管 ID、部门 ID,在员工的信息中存储的是部门的 ID dept_id...,而这个部门的 ID 是关联的 部门表 dept 的主键 id,那 emp 表的 dept_id 就是外键,关联的是另一张表的主键。...id 为 1 的部门,而在 emp 表中还有很多的员 工,关联的为 id 为 1 的部门,此时就出现了数据的不完整性。
修改数据: update 表名 set 列名1 = 值1, 列名2 = 值2,... [where 条件]; 注意: 如果不加任何条件,则会将表中所有记录全部修改。...含义:非空且唯一 一张表只能有一个字段为主键 主键就是表中记录的唯一标识 1....例子: -- 查询所有员工信息,如果员工有部门,则查询部门名称,没有部门,则不显示部门名称 SELECT t1. , t2....但是如果多个事务操作同一批数据,则会引发一些问题,设置不同的隔离级别就可以解决这些问题。 存在问题: 脏读:一个事务,读取到另一个事务中没有提交的数据。...不可重复读(虚读):在同一个事务中,两次读取到的数据不一样。 幻读:一个事务操作(DML)数据表中所有记录,另一个事务添加了一条数据,则第一个事务查询不到自己的修改。
要完成相对简单的应用功能,可能只需要编写一个pl/sql块;但是如果想要实现复杂的功能,可能需要在一个pl/sql块中嵌套其他的pl/sql块。...---- 第一个PL/SQL程序 PLSQL中的命令窗口 SQL> set serveroutput on ;--打开输出 SQL> declare --定义部分 ,如果没有定义,declare...---- 游标 游标的概念 游标(游标):一个结果集 不能把一个集合赋值给一个基本型变量,否则会抛出 too many rows的异常。 可带参数 ,可不带参数。 ---- 游标的语法 ?...'); --删除指定雇员;如果部门中没有雇员,则删除部门 DELETE FROM employees WHERE department_id=v_deptno; IF...; begin open c_emp; --获取一条记录 fetch c_emp into p_ename; --如果没有查到则抛出自定义例外 if c_emp%notfound
约束 1.概述 概念:约束是作用于表中字段上的规则,用于限制存储在表中的数据。 目的:保证数据库中数据的正确、有效性和完整性。...我们来看一个例子: 左侧的 emp 表是员工表,里面存储员工的基本信息,包含员工的 ID 、姓名、年龄、职位、薪资、入职日期、上级主管 ID 、部门 ID ,在员工的信息中存储的是部门的 ID...dept_id ,而这个部门的 ID 是关联的 部门表 dept 的主键 id ,那 emp 表的 dept_id 就是外键 , 关联的是另一张表的主键。...修改父表 id 为 1 的记录,将 id 修改为6 我们发现,原来在子表中dept_id值为1的记录,现在也变为6了,这就是cascade级联的效果。...我们发现父表的记录是可以正常的删除的,父表的数据删除之后,再打开子表 emp ,我们发现子表 emp的 dept_id 字段,原来 dept_id 为 1 的数据,现在都被置为 NULL 了。
删除所有员工 delete from employee; 注意事项: • DELETE 语句的条件可以有,也可以没有,如果没有条件,则会删除整张表的所有数据。...约束 **4.1 概述 ** 概念:约束是作用于表中字段上的规则,用于限制存储在表中的数据。 目的:保证数据库中数据的正确、有效性和完整性。...我们来看一个例子: 左侧的emp表是员工表,里面存储员工的基本信息,包含员工的ID、姓名、年龄、职位、薪资、入职日期、上级主管ID、部门ID,在员工的信息中存储的是部门的ID dept_id,而这个部门的...: 此时,我们看到查询结果中包含了大量的结果集,总共102条记录,而这其实就是员工表emp所有的记录(17) 与 部门表dept所有记录(6) 的所有组合情况,这种现象称之为笛卡尔积。...查询所有年龄大于40岁的员工, 及其归属的部门名称; 如果员工没有分配部门, 也需要展示出 来(外连接) 表: emp , dept 连接条件: emp.dept_id = dept.id select
Exception是一种PL/SQL标识符,当运行的PL/SQL块出现错误或警告,则会触发异常处理。...为了提高程序的健壮性,可以在PL/SQL块中引 入异常处理部分,进行捕捉异常,并根据异常出现的情况进行相应的处理。 一、异常的类型 ORACLE异常分为两种类型:系统异常、自定义异常。...时,没有找到数据 DUL_VAL_ON_INDEX 试图在一个有惟一性约束的列上存储重复值 CURSOR_ALREADY_OPEN 试图打开一个已经打开的游标 TOO_MANY_ROWS SELECT...--下面的例子中,如果插入的工资少于,就抛出异常 DECLARE v_sal emp.sal%TYPE; v_id emp.empno%TYPE; e_sal EXCEPTION; --定义异常...该函数用于在PL/SQL中定义错误消息,且只能在数据库端的子程序中使用(存储过程、函数、包、触发器),不能在匿名块和客户端的 子程序中使用 使用方法 RAISE_APPLICATION_ERROR
(多对一) 多对多 一对一 1.1 一对多 案例: 部门 与 员工的关系 关系: 一个部门对应多个员工,一个员工对应一个部门 实现: 在多的一方建立外键,指向一的一方的主键 1.2 多对多...关系: 一对一关系,多用于单表拆分,将一张表的基础字段放在一张表中,其他详情字段放在另一张表中,以提升操作效率 实现: 在任意一方加入外键,关联另外一方的主键,并且设置外键为唯一的(UNIQUE)...: 此时,我们看到查询结果中包含了大量的结果集,总共102条记录,而这其实就是员工表emp所有的记录 (17) 与 部门表dept所有记录(6) 的所有组合情况,这种现象称之为笛卡尔积。...select * from emp , dept where emp.dept_id = dept.id; 而由于id为17的员工,没有dept_id字段值,所以在多表查询时,根据连接查询的条件并没有查询到...emp , 如果员工没有领导, 也需要查询出来 表结构: emp a , emp b select a.name '员工', b.name '领导' from emp a left join emp
如果不加任何条件,则会将表中所有记录全部修改。 DQL:查询表中的记录 * select * from 表名; 1....一张表只能有一个字段为主键 3. 主键就是表中记录的唯一标识 2....码:如果在一张表中,一个属性或属性组,被其他所有属性所完全依赖,则称这个属性(属性组)为该表的码 例如:该表中码为:(学号,课程名称) * 主属性:码属性组中的所有属性 *...* 例子: -- 查询所有员工信息,如果员工有部门,则查询部门名称,没有部门,则不显示部门名称 SELECT t1.*,t2....脏读:一个事务,读取到另一个事务中没有提交的数据 2. 不可重复读(虚读):在同一个事务中,两次读取到的数据不一样。 3.
select * from emp; – 查询emp表中的所有员工的姓名、薪资、奖金 select name,sal,bonus from emp; – 查询emp表中的所有部门, 剔除重复的记录,...; 上面的查询(inner join…on…)方式也叫做内连接查询 外连接查询 1.左外连接查询 显示左侧表中的所有记录,如果在右侧表中没有对应的记录,则显示为null 语法: select ....emp e on d.id=e.dept_id; 以上结果会显示(左侧表)所有部门,如果某部门下没有员工,(右侧表)则显示为null 2....右外连接查询 显示右侧表中的所有记录,如果在左侧表中没有对应的记录,则显示为null 语法: select ... from a right join b on(a.id=b.xid) – 查询部门和所有员工...,如果员工没有所属部门,显示null select * from dept d right join emp e on d.id=e.dept_id; 以上结果会显示(右侧表)所有员工,如果员工没有所属部门
在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。...比如: 有一个部门表,有一个员工表,我想查询某部门中的所有员工的信息。这时我们要先找出部门ID,通过部门ID查询出对应的员工信息。 这样我们在查询我们需要的信息的时候就应用了多表。...join…on,outer 可以省略 格式: select */字段列表 from 左表 left [outer] join 右表 on 条件表达式; 用左边表的记录去匹配右边表的记录,如果符合条件的则显示...;否则,显示 NULL 案例: 在部门表中增加一个部门 mysql> insert into dept(name) values('执行部'); Query OK, 1 rows affected (0.08...join…on,outer 可以省略 格式: select */字段列表 from 左表 right [outer] join 右表 on 条件表达式; 用右边表的记录去匹配左边表的记录,如果符合条件的则显示
) rt ); 再次执行SQL重复数据删除成功 select * from results_temp order by stu_no desc; 3、如果一张表,没有id自增主键,实现自定义一个序号...foreign key (dept_id) references departments_temp1_2(dept_id) on update cascade -- 更新部门表中的数据,自动将所有关联表中的外键数据...-- 当设置外键属性为级联置空时,更新部门表中的数据,自动将所有关联表中的外键数据,一并置空 update departments_temp2_2 set dept_id = 111 where dept_id...,department_id,hire_date from employees_temp12; -- 别名处理 -- 如果第一个SQL语句的结果集使用了别名处理,自动作用到连接的后面结果集,但要单独写在后面就没有效果...INERT语句的列上加上字段名,在数据库导入另一个数据库已有表时非常有用 # -d 或 --no-data :忽略,不创建每个表的插入数据语句 # --where : 只转储给定的WHERE条件选择的记录
每当一个特定的数据操作语句(insert update delete)在指定的表上发出时,Oracle自动执行触发器中定义的语句序列。...,它是单独的名字空间,因而触发器名可以和表或过程有相同的名字,但在一个模式中触发器名不能相同。...; end if; end; raise_application_error(error_number,message[,[truefalse]]); 用于在plsql使用程序中自定义错误消息...其中 error_number用于定义错误码,必须在-20000到-20999之间的负整数; message用于指定错误消息,并且该消息的长度无法超过2048字节; 该异常只好在数据库端的子程序(流程...其他 建立一个触发器, 当职工表 emp 表被删除一条记录时,把被删除记录写到职工表删除日志表中去 CREATE TABLE emp_delinfo AS SELECT * FROM EMP WHERE
:最常见的关系:学生对班级 , 员工对部门多对多关系:学生与课程 , 用户与角色一对一关系:使用较少,因为一对一关系可以合成为一张表一对一 一个学生对应一个身份证号码 一对多一个部门可以有多名员工,但一个员工只能归于一个部门...返回的数据类型单行单列:返回的是一个具体列的内容,可以理解为一个单值数据;单行多列:返回一行数据中多个列的内容;多行单列:返回多行记录之中同一列的内容,相当于给出了一个操作范围;多行多列:查询返回的结果是一张临时表...ALL表示指定列中的值必须要大于子查询集的每一个值,即必须要大于子查询集的最大值;如果是小于号即小于子查询集的最小值。同理可以推出其它的比较运算符的情况。...or c > result2 or c > result3...ININ关键字,用于判断某个记录的值,是否在指定的集合中在IN关键字前边加上not可以将条件反过来select …from …where...有数据结果”(至少返回一行数据), 则该EXISTS() 的结果为“true”,外层查询执行该子查询如果“没有数据结果”(没有任何数据返回),则该EXISTS()的结果为“false”,外层查询不执行EXISTS
领取专属 10元无门槛券
手把手带您无忧上云