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

  • 相关阅读:
    C++——文件的读写
    我以我血荐轩辕——记徐家福教授的演讲
    文件命名
    面向对象
    关于函数
    php跨域发送请求原理以及同步异步问题
    关于iframe
    关于url
    cookie
    call和apply
  • 原文地址:https://www.cnblogs.com/NCL--/p/7363094.html
Copyright © 2020-2023  润新知