练习2 及pl/sql
Rownum 如果不是对主键排序是不会变得
-查询没有学分的学生信息
--SELECT * FROM z_student zs WHERE zs.code NOT IN (SELECT DISTINCT zsc.stu_code FROM z_stu_cour zsc)
SELECT * FROM z_student zs WHERE NOT EXISTS (SELECT FROM z_stu_cour zsc WHERE zsc.stu_code=zs.code)
exsits 效率极高 如果存在你查询的返回true,显示存在的记录
里面带有空值的时候,not in的使用
not in 相当于不等于所有(!=all)
in 相当于=any任意一个
--查询各课的课程名,课程号,每门课所有学生的平均成绩
SELECT ZC.COUR_NAME, ZC.COUR_CODE,AVG(ZSC.AGREE)
FROM Z_STU_COUR ZSC
JOIN Z_COURSE ZC
ON ZSC.COUR_CODE = ZC.COUR_CODE
GROUP BY ZC.COUR_NAME, ZC.COUR_CODE
--查询平均分大于40分的国际新闻专业的每个学生姓名,学号和各课的平均分 SELECT (SELECT ZS.NAME FROM Z_STUDENT ZS WHERE ZS.CODE = ZSC.STU_CODE),
ZSC.STU_CODE,
AVG(ZSC.AGREE)
FROM Z_STU_COUR ZSC
WHERE ZSC.COUR_CODE IN
(SELECT ZC1.COUR_CODE
FROM Z_COURSE ZC, Z_COURSE ZC1
WHERE ZC.COUR_NAME = '国际新闻专业'
AND ZC1.P_COUR_CODE = ZC.COUR_CODE) HAVING
AVG(ZSC.AGREE) >
GROUP BY ZSC.STU_CODE
SELECT * FROM z_course zc;
SELECT * FROM z_student zs;
SELECT * FROM z_stu_cour zsc;
--(一)简单查询
--查询学生表中的所有内容
SELECT * FROM z_student zs
--查询学生表中的姓名,专业
SELECT zs.name,zs.major FROM z_student zs
--查询学生表中各种专业
SELECT DISTINCT zs.major FROM z_student zs
--查询表中前五个同学的姓名,专业
SELECT zs.name,zs.major,Rownum FROM z_student zs WHERE ROWNUM<6
--查询各学生的学号和姓名以及截止到现在各学生的年龄
SELECT ZS.CODE,
ZS.NAME,
(TO_CHAR(SYSDATE, 'yyyy') - TO_CHAR(ZS.BIRTHDAY, 'yyyy')) 年龄
FROM Z_STUDENT ZS
--查询专业为国际新闻的学生的所有信息
SELECT *
FROM Z_STUDENT ZS
JOIN Z_COURSE ZC
ON ZS.MAJOR = ZC.COUR_CODE
WHERE ZS.MAJOR = (SELECT ZC.COUR_CODE
FROM Z_COURSE ZC
WHERE ZC.COUR_NAME LIKE ('%国际新闻%'))
--查询1991年出生的学生姓名和专业
SELECT ZS.NAME, ZS.MAJOR,zs.birthday FROM Z_STUDENT ZS WHERE TO_char(zs.birthday, 'yyyy')=1991
--查询历史, 广告, 国际新闻专业的所有学生信息
SELECT *
FROM Z_STUDENT ZS
JOIN Z_COURSE ZC
ON ZS.MAJOR = ZC.COUR_CODE
WHERE ZS.MAJOR IN (SELECT ZC.COUR_CODE
FROM Z_COURSE ZC
WHERE ZC.COUR_NAME LIKE ('%国际新闻%')
OR ZC.COUR_NAME LIKE ('%历史%')
OR ZC.COUR_NAME LIKE ('%广告%'))
--查询姓名是两个字的姓王, 姓陈, 姓李的所有学生信息
SELECT zs.name FROM z_student zs WHERE zs.name LIKE ('王_') OR zs.name LIKE ('李_') OR zs.name LIKE ('陈_')
--查询没有学分的学生信息
SELECT * FROM z_student zs WHERE zs.code NOT IN (SELECT DISTINCT zsc.stu_code FROM z_stu_cour zsc)
SELECT * FROM z_student zs WHERE NOT EXISTS (SELECT 1 FROM z_stu_cour zsc WHERE zsc.stu_code=zs.code)
--查询计算机专业的没有记录生日的学生信息
SELECT *
FROM Z_STUDENT ZS
WHERE ZS.MAJOR LIKE ('%计算机%')
AND ZS.BIRTHDAY IS NULL
--查询按照专业降序,学号升序排列所有学生信息
SELECT * FROM z_student zs ORDER BY zs.major DESC , zs.code ASC
--查询表中前三个的学生的姓名,专业,到现在的年龄并按照年龄降序排列
SELECT ZS.NAME,
ZS.MAJOR,
(TO_CHAR(SYSDATE, 'yyyy') - TO_CHAR(ZS.BIRTHDAY, 'yyyy')) 年龄
FROM Z_STUDENT ZS
ORDER BY (TO_CHAR(SYSDATE, 'yyyy') - TO_CHAR(ZS.BIRTHDAY, 'yyyy')) DESC
--(二)数据汇总
--查询所有的课程代码和每个课程的平均成绩并按照课程号排序,再剔除课程代码不是C-ADV-240的课程
SELECT DISTINCT ZSC.COUR_CODE, AVG(ZSC.AGREE)
FROM Z_STU_COUR ZSC
GROUP BY ZSC.COUR_CODE
HAVING ZSC.COUR_CODE <> 'C-ADV-240'
ORDER BY ZSC.COUR_CODE
--查询出每个课程代码的最高分和最低分
SELECT zsc.cour_code, MAX(zsc.agree),MIN(zsc.agree) FROM z_stu_cour zsc GROUP BY zsc.cour_code
--查询学号为stu-1023的学生的各课成绩
SELECT zsc.cour_code,zsc.agree FROM z_stu_cour zsc WHERE zsc.stu_code='stu-1023'
--查询出历史学专业有多少人
SELECT ZS.MAJOR, COUNT(ZS.CODE)
FROM Z_STUDENT ZS
WHERE ZS.MAJOR = (SELECT ZC.COUR_CODE
FROM Z_COURSE ZC
WHERE ZC.COUR_NAME LIKE ('%历史%'))
GROUP BY ZS.MAJOR
--查询各专业各有多少人
SELECT zs.major,COUNT(ZS.CODE) FROM Z_STUDENT ZS GROUP BY zs.major
--查询出各专业里男女生各有多少人
SELECT zs.major,DECODE (zs.sex,1,'男','女'),COUNT(*) FROM Z_STUDENT ZS GROUP BY zs.major,zs.sex
--查询出学生所有课程的平均分在50分以上的学生学号
SELECT ZSC.STU_CODE
FROM Z_STU_COUR ZSC
WHERE ZSC.COUR_CODE IN (SELECT ZSC.COUR_CODE
FROM Z_STU_COUR ZSC
HAVING AVG(ZSC.AGREE) > 50
GROUP BY ZSC.COUR_CODE)
--查询每个学生有几门课成绩高于80分
SELECT zsc.stu_code,COUNT(*) FROM z_stu_cour zsc WHERE zsc.agree > 80 GROUP BY zsc.stu_code
--(三)连接查询
--查询所有学生的学号,姓名,专业课程号,成绩
SELECT zs.name,zs.code,zsc.cour_code,zsc.agree FROM z_student zs JOIN z_stu_cour zsc ON zs.code=zsc.stu_code
--查询课程号为C-HIS-336的学生的姓名和成绩
SELECT zs.name,zsc.agree FROM z_student zs JOIN z_stu_cour zsc ON zs.code=zsc.stu_code WHERE zsc.cour_code='C-HIS-336'
--查询选修广告学专业的基础美术这门课程的学生学号,姓名,成绩
SELECT ZS.CODE, ZS.NAME, ZSC.AGREE
FROM Z_STUDENT ZS
JOIN Z_STU_COUR ZSC
ON ZS.CODE = ZSC.STU_CODE
JOIN Z_COURSE ZC
ON ZSC.COUR_CODE = ZC.COUR_CODE
WHERE ZC.COUR_NAME = '基础美术'
--查询选修课程号为C-NEWS-101这门课的所有学生信息和成绩
SELECT * FROM z_student zs JOIN z_stu_cour zsc ON zs.code=zsc.stu_code WHERE zsc.cour_code='C-NEWS-101'
--查询生日是同一天的学生信息
SELECT *
FROM Z_STUDENT ZS
WHERE ZS.BIRTHDAY IN (SELECT ZS1.BIRTHDAY
FROM Z_STUDENT ZS1
GROUP BY ZS1.BIRTHDAY
HAVING COUNT(ZS1.BIRTHDAY) > 1)
--查询各课的课程名,课程号,每门课所有学生的平均成绩
SELECT ZC.COUR_NAME, ZC.COUR_CODE,AVG(ZSC.AGREE)
FROM Z_STU_COUR ZSC
JOIN Z_COURSE ZC
ON ZSC.COUR_CODE = ZC.COUR_CODE
GROUP BY ZC.COUR_NAME, ZC.COUR_CODE
--查询所有学生的平均成绩
SELECT AVG(zsc.agree) FROM z_stu_cour zsc
--查询每个专业的每个课程的平均分是多少
SELECT AVG(zsc.agree) FROM z_stu_cour zsc GROUP BY zsc.cour_code
--查询平均分大于40分的国际新闻专业的每个学生姓名,学号和各课的平均分
--(四)子查询的使用
--查询平均分大于等于课程号为C-ADV-239的课程号和平均分
SELECT ZSC.COUR_CODE, AVG(ZSC.AGREE)
FROM Z_STU_COUR ZSC
GROUP BY ZSC.COUR_CODE
HAVING AVG(ZSC.AGREE) >= (SELECT AVG(ZSC1.AGREE)
FROM Z_STU_COUR ZSC1
WHERE ZSC1.COUR_CODE = 'C-ADV-239'
GROUP BY ZSC1.COUR_CODE)
--查询历史学专业下的课程的及格率(课程得分在50以上的人数除以总人数)
SELECT ZSC.COUR_CODE,
SUM(CASE
WHEN ZSC.AGREE > 50 THEN
1
ELSE
0
END) / COUNT(*)
FROM Z_STU_COUR ZSC
WHERE ZSC.COUR_CODE IN
(SELECT ZC.COUR_CODE
FROM Z_COURSE ZC
CONNECT BY ZC.P_COUR_CODE = PRIOR ZC.COUR_CODE
START WITH ZC.COUR_NAME = '历史学专业')
GROUP BY ZSC.COUR_CODE
--查询没有选修C-NEWS-101这门课程的学生信息和课程信息
SELECT ZS.*, ZC.*
FROM Z_COURSE ZC
JOIN Z_STU_COUR ZSC
ON ZC.COUR_CODE = ZSC.COUR_CODE
JOIN Z_STUDENT ZS
ON ZSC.STU_CODE = ZS.CODE
WHERE ZC.COUR_CODE <> 'C-NEWS-101'
--查询没有课程成绩的学生信息
SELECT ZS.CODE
FROM Z_STUDENT ZS
JOIN Z_STU_COUR ZSC
ON ZS.CODE = ZSC.STU_CODE
WHERE ZSC.AGREE NOT IN (SELECT ZSC.AGREE FROM Z_STU_COUR ZSC)
循环:
DECLARE
m NUMBER(5);
sname VARCHAR2(20);
BEGIN
m:=50;
/* lOOP
EXIT WHEN m<0;
dbms_output.put_line(m);
m:=m-1;
END LOOP;*/
/* WHILE m>0
LOOP
dbms_output.put_line(m);
m:=m-1;
END LOOP;*/
/*FOR n IN 1..5 LOOP
dbms_output.put_line(n);
END LOOP;*/
SELECT zs.name INTO sname FROM z_student zs WHERE zs.id=m;
dbms_output.put_line('查询结果:'||sname);
EXCEPTION
WHEN no_data_FOUND THEN
dbms_output.put_line('无查询结果');
END;
1、pl/sql基本的语法格式
2、记录类型 type...is record(,,,);
3、流程控制:
3.1条件判断(两种)
方式一:if...then elsif then...else...end if;
方式二:case...when...then..end;
3.2循环结构(三种)
方式一:loop...exit when ..end loop;
方式二:while...loop...end loop;
方式三:for n in...loop...end loop;
3.3goto 、exit
4、游标的使用(类似用iterator)
5、异常处理(三种)
6、会写一个存储函数(有返回值),存储过程(无返回值)
7、会写一个触发器
练习2 及pl/sql的更多相关文章
- Oracle PL/SQL随堂笔记总结
1.pl/sql编程 2.存储过程 3.函数 4.触发器 5.包 6.pl/sql基础 -定义并使用变量 7.pl/sql的进阶 8.oracle的视图 1.pl/sql编程 1.理解oracle的p ...
- Oracle学习笔记十 使用PL/SQL
PL/SQL 简介 PL/SQL 是过程语言(Procedural Language)与结构化查询语言(SQL)结合而成的编程语言,是对 SQL 的扩展,它支持多种数据类型,如大对象和集合类型,可使用 ...
- PL/SQL连接错误:ora-12705:cannot access NLS data files or invalid environment specified
适合自己的解决方法: 排查问题: 1. 你没有安装Oracle Client软件.这是使用PL/SQL Developer的必须条件.安装Oracle Client后再重试.2. 你安装了多个Orac ...
- PL/SQL循环
1.if循环做判断 SET SERVEROUTPUT ON accept num prompt 'qinshuu'; DECLARE pnum NUMBER :=& num ; BEGIN T ...
- PL/SQL存储过程编程
PL/SQL存储过程编程 /**author huangchaobiao *Email:huangchaobiao111@163.com */ PL/SQL存储过程编程(上) 1. Oracle应用编 ...
- PL/SQL连接Oracle数据库,中文乱码,显示问号
问题描述: 登陆PL/SQL,执行SQL语句后,输出的中文标题显示成问号????:条件包含中文,则无数据. 如果不是中文,需要修改注册表值,方法如下: 进入注册表:Win+r,输入re ...
- PL/SQL客户端中执行insert语句,插入中文乱码
问题描述:在PL/SQL客户端中执行insert语句,插入中文乱码 解决方案: 1.执行脚本 select userenv('language') from dual; 结果为AMERICAN_ ...
- PL/SQL Developer如何连接64位的Oracle图解
在64位Win7系统上安装64位的Oracle数据库,但是没有对应的64位PL/SQL Developer,此时就不能使用PL/SQL Developer来进行直接连接的,所以要想实现连接还得需要其他 ...
- 每周一书《Oracle 12 c PL(SQL)程序设计终极指南》
本周为大家送出的书是<Oracle 12 c PL(SQL)程序设计终极指南>,此书由机械工业出版社出版, 孙风栋,王澜,郭晓惠 著. 内容简介: <Oracle 12c PL/SQ ...
- pl/sql里的exists和in的差别
项目中有个需要需要如下pl/sql(数据库是MariaDB) ) AS small FROM cmp_ent_main a WHERE createTime<'2016-9-21' ,,) ) ...
随机推荐
- (转) Hibernate框架基础——操纵持久化对象的方法(Session中)
http://blog.csdn.net/yerenyuan_pku/article/details/52761021 上一篇文章中我们学习了Hibernate中java对象的状态以及对象的状态之间如 ...
- (转)postgis常用函数介绍(一)
http://blog.csdn.net/gisshixisheng/article/details/47701237 概述: 在进行地理信息系统开发的过程中,常用的空间数据库有esri的sde,po ...
- 用 ilasm 反编译、修改.net dll文件
有些.net dll我们没有源码,如果要修改某些东西,可以用ilasm.exe反编译为il代码,修改后再编译回dll ilasm通常放在以下路径 C:\Windows\Microsoft.NET\Fr ...
- Unity中确定时间是否在一定范围内
NowTime = DateTime.Now.ToLocalTime(); Timeyear = DateTime.Now.ToLocalTime().ToString("yyyy-MM-d ...
- 安装RHEL7红帽操作系统
1.单击“开启此虚拟机”启动RHEL 7系统安装. 开启虚拟机 2.通过键盘方向键选择Install Red Hat Enterprise Linux 7.0选项,然后回车,开始安装RHEL7操作系统 ...
- [LeetCode] 887. Super Egg Drop 超级鸡蛋掉落
You are given K eggs, and you have access to a building with N floors from 1 to N. Each egg is iden ...
- 【POJ 1981】Circle and Points(已知圆上两点求圆心坐标)
[题目链接]:http://poj.org/problem?id=1981 [题意] 给你n个点(n<=300); 然后给你一个半径R: 让你在平面上找一个半径为R的圆; 这里R=1 使得这个圆 ...
- Maven学习总结(28)——Maven+Nexus+Myeclipse集成
Maven简介 Maven 是一个基于项目对象模型(POM)的,提倡约定优于配置(ConventionOver Configuration)的,跨平台的项目管理和构建自动化工具. 首先它是一个优秀的构 ...
- 2、ceph-deploy之配置使用RBD
说明 部署完ceph集群(active+clean状态)之后, 我们来实践下ceph block device(即RBD或RADOS block device). 我们需要在一台新的client节点上 ...
- linux服务器中不支持soap及bcmul函数的结局方法
新的程序里用了webserice接口,部到服务器,先是提示:bcmul() 函数不可用,网上搜索一番,得知这是php的高精度函数,需要在编译php的时候加入此模块,于是在编译脚本里增添 “–enabl ...