oracle从入门到精通第三篇(条件取值语句|约束|子查询|自查询|连表查询)

条件取值语句

条件取值语句(decode()):

decode(c1,c2,c3,c4,c5…Cx,Cx+1)
c1:拿来比较的值
从第二个参数开始,每两个参数看作是一组,拿每一组的第一个参数和c1进行比较,如果相同则返回该组的第二个参数
第一次判断:c2 == c1 ? c3 :
第二次判断:c4 == c1 ? c5 :
如果参数个数是奇数个,并且最终判断没有相同的值,则返回空
如果参数个数是偶数个,并且最终判断没有相同的值,则返回最后一个参数的值

例:
如果部门为10,那么给员工涨薪200
如果部门为20,那么给员工减薪200
– 其他部门涨薪500

select ename,deptno,sal,decode(deptno,10,sal+200,20,sal-200) a from emp order by deptno;
select ename,deptno,sal,decode(deptno,10,sal+200,20,sal-200,sal+500) a from emp order by deptno;

练习:
根据emp表中job字段,如果工种为CLERK则涨薪200
如果工种为SALESMAN则减薪200,其他工种涨薪500

条件取值语句(case when):

(case – 条件
when – 如果条件成立
then – 则返回
else – 默认值
end) – 结束

SELECT ename, deptno, sal,( CASE deptno WHEN 10 THEN sal + 200 WHEN 20 THEN sal - 200 END ) a 
FROM
	emp 
ORDER BY
	deptno;
SELECT ename, deptno, sal,( CASE deptno WHEN 10 THEN sal + 200 WHEN 20 THEN sal - 200 ELSE sal + 500 END ) a 
FROM
	emp 
ORDER BY
	deptno;

约束:限制

主键约束:primary key

主键列:在一个表中能够唯一定位一条数据的列,非空且唯一 一张表只能有一个主键
*:constraint 约束名 可以不写

CREATE TABLE test (
id number ( 5 ) CONSTRAINT zj PRIMARY KEY,
NAME varchar2 ( 20 ));

外键约束:foreign key *:references

外键:在子表中如果有一个列引用了母表中的主键列,那么这个列在子 表中就被称为外键列

分析oracle自带的表中的主外键

   表                      主键                        外键
	emp                   empno            			deptno  salno          		 子表
	dept              	  deptno                                            		 母表
	dept              	  deptno                    	salno                 		 子表       
	salgrade              salno                                               	 母表

非空约束:not null

唯一约束:unique

检查约束:check

小练习

teacher表

create table teacher(
id number(5) primary key,
name varchar2(20),
salary number(6) check(salary <= 20000));

insert into teacher values(1,'zhoulaoshi',12222);
insert into teacher values(2,'zhanglaoshi',13333);
insert into teacher values(3,'lulaoshi',14444);
insert into teacher values(4,'laoda',666);

班级表

create table class(
id number(5) primary key,
name varchar2(20),
tid number(5) references teacher(id));

insert into class values(1,'ET1912',2);
insert into class values(2,'ET1911',1);
insert into class values(3,'ET1910',3);
insert into class values(4,'ET1909',4);

学校表

create table school(
id number(5) primary key,
name varchar2(20) not null unique,
phone varchar2(20) check(length(phone) = 11));

insert into school values(1,'山大','13356785678');
insert into school values(2,'山科','13378907890');
insert into school values(3,'临大','15567896789');
insert into school values(4,'北大','15523456789');

学生表

create table student(
id number(5) primary key,
name varchar2(20) unique,
salary number(5) check(salary between 5000 and 10000),
email varchar2(50) unique,
birthday date,
sid number(5) references school(id),
cid number(5) references class(id));

insert into student values(1,'葫芦娃',5000,'hlw@163.com',sysdate,2,3);
insert into student values(2,'蜘蛛侠',6000,'zzx@126.com',to_date('19951213121212','yyyy-mm-dd hh24:mi:ss'),1,2);
insert into student values(3,'哪咤',7000,'nz@ali.com',to_date('19961213121212','yyyy-mm-dd hh24:mi:ss'),2,1);
insert into student values(4,'白龙',8000,'bl@yahoo.com',to_date('19981213121212','yyyy-mm-dd hh24:mi:ss'),4,4);

查看当前用户下有哪些约束:

select constraint_name,constraint_type from user_constraints;

建表以后,如何添加约束

alter table test add constraint pk_zj primary key (id);

查看当前用户下有哪些约束:

select constraint_name,constraint_type from user_constraints;

如何删除约束:

alter table test drop constraint pk_zj;

数据库中约束越多,表越健壮,效率越低 通常用到的约束:主键约束,外键约束

子查询 = 嵌套查询 = 某些条件是通过查询得到的

select 子查询 from 子查询 where 子查询;

谁和葫芦娃一个学校的?
1)葫芦娃是哪学校的?

select sid from student where name = '葫芦娃';

2)谁还是葫芦娃这个学校的?

select name,sid from student where sid = 2;
SELECT NAME
	,
	sid 
FROM
	student 
WHERE
	sid = ( SELECT sid FROM student WHERE NAME = '葫芦娃' ) 
	AND NAME != '葫芦娃';

学生表的学生都上哪些学校?

SELECT NAME,( SELECT NAME FROM school WHERE school.id = student.sid ) schoolname 
FROM
	student;

练习
查询所有工种为CLERK的员工的工号、员工名和部门名。

SELECT empno, ename,( SELECT dname FROM dept WHERE dept.deptno = emp.deptno ) dname 
FROM
	emp 
WHERE
	job = 'CLERK';

自查询

SELECT
	empno,
	ename,
	dname 
FROM
	emp,
	dept,
	salno 
WHERE
	emp.deptno = dept.deptno 
	AND job = 'CLERK';

连表查询

内连接 inner join on = join on

通过关联关系能够得到的部分数据

select student.name,school.name from student
join school on student.sid = school.id;

练习
-查询所有工种为CLERK的员工的工号、员工名和部门名。

外连接 outer join on

不仅包含有关联关系的数据,还包含没有关联关系的数据

左外连接 left join on

from 左表 left join 右表 on 关联关系 以左表为主,左表的所有数据都展示,关联不上的右表的数据以空展示

*:左表关联上右表的数据 + 关联不上的左表的数据

SELECT
	school.NAME,
	student.NAME 
FROM
	school
	LEFT JOIN student ON student.sid = school.id;

练习
-查询所有部门及其员工信息,包括那些没有员工的部门

右外连接 right join on

语法

from 左表 right join 右表 on 关联关系 以右表为主,右表的所有数据都展示,关联不上的左表的数据以空展示

*:左表关联上右表的数据 + 关联不上的右表的数据

SELECT
	student.NAME,
	school.NAME 
FROM
	student
	RIGHT JOIN school ON student.sid = school.id;
SELECT
	student.NAME,
	school.NAME,
	class.NAME 
FROM
	student
	RIGHT JOIN school ON student.sid = school.id
	LEFT JOIN class ON class.id = student.cid;

练习:
展示学校名,学生名,老师名,班级名
表名 主键 外键

school        id        
student       id         sid(school.id)   cid(class.id)
teacher       id
class         id         tid(teacher.id)
SELECT
	school.NAME,
	student.NAME,
	teacher.NAME,
	class.NAME 
FROM
	student
	LEFT JOIN class ON student.cid = class.id
	LEFT JOIN school ON student.sid = school.id
	LEFT JOIN teacher ON class.tid = teacher.id;

全外连接 full join on

交叉连接 cross join

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Oracle 11g从入门到精通第三版PDF》一书是一本详细介绍Oracle数据库管理系统的入门指南。它主要解释了如何使用Oracle 11g来创建、管理和优化数据库。 首先,在书的前几章,作者简要概述了Oracle数据库的背景和特点,介绍了数据库管理的基本原则以及安装和配置Oracle 11g的步骤。读者可以了解到Oracle数据库的基本概念和架构。 接下来,书中详细介绍了如何使用SQL语言进行数据查询和操作。读者将学习到如何使用SQL语句创建表、插入数据、更新和删除数据。此外,书中还涵盖了Oracle数据库的高级SQL技巧,如使用聚合函数、连接多个表以及使用子查询。 在数据库管理方面,书中介绍了如何创建和管理用户、角色和权限。读者将了解到如何控制用户对数据库对象的访问以及如何使用Oracle安全功能来保护数据。 此外,该书还讲解了索引的概念和使用方法,以及如何利用索引来提高查询性能。读者还将学习到如何执行数据库备份和恢复操作,以及如何优化和调整数据库的性能。 最后,书中还介绍了一些高级主题,如Oracle数据仓库、分区表和并行查询等。读者可以了解到如何使用这些高级功能来满足不同场景下的需求。 总体来说,《Oracle 11g从入门到精通第三版PDF》是一本全面而深入的Oracle数据库学习资料。无论是初学者还是有经验的数据库开发人员,都可以通过这本书掌握Oracle 11g的基本概念和技术,提升自己的数据库管理能力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值