练习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 1 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) > 40
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、会写一个触发器 

时间: 2024-10-13 02:20:26

练习2 及pl/sql的相关文章

PL/SQL developer 连接oracle数据库报错“initialization error could not load oci.dll”

声明:PL/SQL 版本:PL/SQL Developer 9.0.6 (http://files.allroundautomations.com/plsqldev906.exe) 报错提示如图: 原因:PL/SQL只对32位OS进行支持,解决方法是额外加载一个oci.dll文件 解决办法:1.下载OCI.DLL相关库文件.地址: (需注册Oracle账号) http://www.oracle.com/technetwork/topics/winsoft-085727.html ----->  

使用PL/SQL连接oracle数据库,并将数据进行导出备份和导入恢复

这种操作百度一搜一大片,今天整理以前做的项目时自己备份了一下数据库,试着将数据进行导出备份和导入恢复了一下:下面是操作过程: 1 开启服务 2 配置监听 找到下面文件: 记事本打开 在导航器的下拉菜单中选择:将数据库添加到树, 然后点击确定 然后使用PL/SQL就可以登录了: 3 建立新表空间和新用户 使用system用户登录:执行如下sql语句建立表空间和新用户,以及给用户授权 建立表空间 Create tablespace myyyjc datafile 'D:\app\Administra

解决pl\sql乱码问题

查看数据库服务器的字符集 select * from nls_database_parameters where parameter='NLS_CHARACTERSET'; PARAMETER                     VALUE NLS_CHARACTERSET              ZHS16GBK select sys_context('USERENV', 'LANGUAGE'); 客户端字符集 select * from nls_instance_parameters

PL/SQL Developer使用技巧、快捷键

1.类SQL PLUS窗口:File->New->Command Window,这个类似于oracle的客户端工具sql plus,但比它好用多了. 2.设置关键字自动大写:Tools->Preferences->Editor,将Keyword case选择Uppercase.这样在窗口中输入sql语句时,关键字会自动大写,而其它都是小写.这样阅读代码比较容易,且保持良好得编码风格,同理,在Tools->Preferences->Code Assistant(助手)里可

PL/SQL在win7/win8 x64位下使用客户端连接oracle

新做了win8 x64位的系统.需要使用plsql连接oracle数据库.之前的机器装有64位的oracle11g,plsql可以直接找到oracle_home连接到数据库. 这次不想在本地安装数据库,因此只装了一个32位的数据库客户端.配置环境变量时遇到一些小问题,在此记录下来. 1.下载oracle客户端,然后解压到任意目录下 2.安装好plsql,然后配置plsql的oracle_home和oci库的地址 plsql的preference设置 ORACLE_HOME:F:\oracle\p

Oracle之PL/SQL编程_流程控制语句

选择语句 1. if...then 语句 语法: if < condition_expression > then plsql_sentence end if; condition_expression:表示一个条件表达式,其值为 true 时,程序会执行 if 下面的 PL/SQL 语句: 如果其值为 false,则程序会跳过if 下面的语句而 直接执行 end if 后边的语句. plsql_sentence:condition_expression 为 true 时,要执行的语句. 2.

PL/SQL 编程(二)游标、存储过程、函数

游标--数据的缓存区 游标:类似集合,可以让用户像操作数组一样操作查询出来的数据集,实质上,它提供了一种从集合性质的结果中提取单条记录的手段. 可以将游标形象的看成一个变动的光标,他实质上是一个指针,在一段Oracle存放数据查询结果集或者数据操作结果集的内存中,这个指针可以指向结果集任何一条记录. 游标分静态游标和REF游标两类,静态游标包含显式游标和隐式游标. 显式游标: 在使用之前必须有明确的游标声明和定义,这样的游标定义会关联数据查询语句,通常会返回一行或多行.打开游标后,用户可以利用游

(十六)PL/SQL日期及时间

PL/SQL提供两个日期和时间相关的数据类型: 1.日期时间(Datetime)数据类型 DATE TIMESTAMP TIMESTAMP WITH TIME ZONE TIMESTAMP WITH LOCAL TIME ZONE 2.间隔数据类型 INTERVAL YEAR TO MONTH INTERVAL DAY TO SECOND   一.日期时间字段值和间隔数据类型这两个日期时间和间隔数据类型包括字段.这些字段的值确定的数据类型的值.下表列出了时间和间隔的字段及其可能的值. 字段名称

(十)PL/SQL记录

PL/SQL记录就是可以容纳不同类型的数据项的数据结构.记录由不同字段,类似于数据库表的行.例如,要保留跟踪图书馆中的书籍.可能要跟踪有关每本书下面的属性类似:标题,作者,主题,图书ID.包含一个字段为每个这些项目记录允许进行处理书籍作为一个逻辑单元信息. PL/SQL可以处理记录的以下几种类型:   基于表的记录   基于游标的记录   用户自定义记录      附:  Select * from customers;+----+----------+-----+-----------+---

(五)PL/SQL运算符及优先级 | 条件控制 | 循环控制

一.运算符 PL/SQL语言有丰富的内置运算符,运算符提供的以下几种类型:  .算术运算符  .关系运算符  .比较运算符  .逻辑运算符  .字符串运算符 二.运算符优先级 算数运算符 运算符 操作符 ** 指数运算 +, - 加法,取反 *, / 乘法,除法 +, -, || 加,减,并置    关系运算符    比较运算符 =, <, >, <=, >=, <>, !=, ~=, ^=,  IS NULL, LIKE, BETWEEN, IN 比较    逻辑运算