· 246·
while循环只是在循环开始就指定了循环条件,我们可以利用while(cu_student_id_name%found)循环处理所有游标记录。
SQL> declare cursor cu_student_id_name is 2 select student_id, student_name 3 from students; 4
5 student_id students.student_id%type;
6 student_name students.student_name%type; 7 begin
8 open cu_student_id_name;
9 fetch cu_student_id_name into student_id, student_name; 10
11 while(cu_student_id_name%found) loop
12 dbms_output.put_line(student_id || ':' || student_name); 13 fetch cu_student_id_name into student_id, student_name; 14 end loop; 15
16 close cu_student_id_name; 17 end; 18 19 / 1:金瑞 2:钟君 3:王山 4:刘迪 5:钟会 6:张玉 7:柳青 8:胡东 9:商乾 11:王蒙
4.利用for循环计算1~100之间所有奇数的和。
可以利用for i in 1..100 loop来循环处理1至100的所有整数;利用mod(i, 2)=1来判断一个整数是否为奇数。
SQL> declare summary number; 2 begin
3 summary := 0; 4 for i in 1..100 loop 5 if mod(i,2) = 1 then
6 summary := summary + i; 7 end if; 8 end loop;
9 dbms_output.put_line('summary = ' || summary); 10 end; 11 /
summary = 2500
精品文档
·247·
第16章 SQL查询
1.在表students中,利用group by 字句,获得同名学生的信息:student_name——学生姓名, student_age——学生年龄, student——同名学生数。
要获得同名学生信息,首先要对表students的记录,按照student_name分组,然后利用having子句进一步筛选各个分组。
SQL> select student_name, count(1) 2 from students
3 group by student_name 4 having count(1) > 1;
2.利用左联接从表students与表student_course中获得学生与所选课程的信息(student_name, course)。
1)首先创建测试表studet_course,并插入测试数据
SQL> create table student_course(student_id number, course varchar2(20));
Table created.
SQL> insert into student_course values(1, '英语'); SQL> insert into student_course values(2, '数学'); SQL> insert into student_course values(2, '语文'); SQL> insert into student_course values(3, '数学'); SQL> commit;
2)因为学生并不一定有选定的课程,所以学生表要作为左联接的基表,SQL语句及执行结果如下所示
SQL> select s.student_name, c.course 2 from students s, student_course c 3 where s.student_id = c.student_id(+) 4 /
STUDENT_NAME COURSE ------------------------ -------------------- 金瑞英语 钟君数学 钟君语文 王山数学 钟会 胡东 王蒙 张玉 柳青 刘迪 商乾
3.利用connect by从表market中获得中国市场及以下的所有子市场信息。
欲获得中国市场下的所有子市场,那么start with market_name应该从“中国”开始;获得下一条记
精品文档
· 248·
录的方式为,新记录的parent_market_id等于旧记录的market_id。
SQL> select * from market
2 start with market_name = '中国'
3 connect by prior market_id = parent_market_id 4 /
MARKET_ID MARKET_NAME PARENT_MARKET_ID ------------------ -------------------- ---------------------------------- 5 中国 2 14 北京 5 15 天津 5 16 上海 5
第17章 SQL更新数据
1.创建表owner_table(table_owner varcchar2(50), table_name varchar2(50)),并搜寻数据库中所有表名含有字母“T”的表,将其所有者owner与表名talbe_name信息插入到表owner_table中。 1)利用create table命令创建数据表时,可以直接利用select语句获得的结果集。create table命令与select语句之间利用as关键字关联即可:
SQL> create table owner_table as
2 select owner, table_name from dba_tables 3 where table_name like '%T%' 4 /
Table created.
insert into tmp_students
select (student_seq.nextval, student_name, student_status, student_age);
2)成功创建之后,可以利用desc命令查看新表owner_table的结构
SQL> desc owner_table;
Name Null? Type
----------------------------------------- ---------------- ------------------------- OWNER NOT NULL VARCHAR2(30) TABLE_NAME NOT NULL VARCHAR2(30)
新表owner_table的结构来源于数据源列的名称和数据类型。 3)此时表owner_table中已经成功插入了数据
SQL> select count(*) from owner_table;
COUNT(*) ---------- 1145
2.在PL/SQL Developer中,利用两条update语句更新表test_people的stauts列的内容。两条update语句分别带有和不带where子句,查看PL/SQL Developer所给出的提示有何不同。
1)首先在PL/SQL Developer中利用如下语句更新表test_people的status列
精品文档
update test_people set status = 'CXL'
·249·
PL/SQL Developer将给出如下提示
2)尝试添加where子句,重新更新表test_people的status列
update test_people set status = 'CXL' where id = 1;
此时,PL/SQL Developer将直接更新表的内容,而不进行任何提示。
3)PL/SQL Developer认为,不添加任何where子句,而更新表的所有记录是带有一定风险的操作,因此将给出提示。这也是我们在平时书写update语句与delete语句时尤其需要注意的。
3.首先利用delete语句删除表test_people中的所有数据,接着执行回滚,查看此时表的内容。然后利用truncate语句删除表test_people中的数据,接着执行回滚,查看此时表的内容。比较两次操作的不同。
1)在SQL Plus中删除表test_people中的数据
SQL> delete from test_people;
1 row deleted.
2)执行回滚
SQL> rollback;
Rollback complete.
3)查询此时表中数据 SQL> select * from test_people;
ID NAME STATUS ---------- ---------------- ------------- 1 张三 ACT
4)利用truncate命令删除表中数据
SQL> truncate table test_people;
Table truncated.
5)执行回滚
SQL> rollback;
Rollback complete.
6)查看此时表中数据
SQL> select * from test_people;
no rows selected
7)truncate命令是一个DDL命令,将一次性将表中数据清空。回滚操作对其无效。
第18章 数据库速度优化与数据完整性
精品文档
· 250·
1.利用create index命令在表students的列student_name上创建索引。
SQL> create index idx_student on students(student_name);
Index created.
2.利用create index命令在表students的列student_name和列student_age上创建联合索引。(1)实体完整性
SQL> create index idx_name_age on students(student_name, student_age);
Index created.
3.利用not null关键字为表students的列student_name添加非空约束。 1)将列student_name指定为not null,从而保证其非空
SQL> alter table students modify student_name not null;
Table altered.
2)尝试指定student_name为空
SQL> insert into students(student_id, student_name, student_age) values (100, '', 10); insert into students(student_id, student_name, student_age) values (100, '', 10) * ERROR at line 1:
ORA-01400: cannot insert NULL into (\
由于student_name的非空约束,因此,导致了新增数据操作失败。 4.利用default关键字为表students的列student_age指定默认值0。 1)为列student_age指定默认值0
SQL> alter table students modify student_age default 0;
Table altered..
2)不指定student_age的情况下,向表中插入新的数据
SQL> insert into students(student_id, student_name) values (100, '张三');
1 row created.
3)查看新增数据
SQL> select * from students where student_id = 100;
STUDENT_ID STUDENT_NAMESTUDENT_AGE ----------------- ------------------------ ------------------------- 100 张三 0
第19章 数据一致性与事务管理
1.利用update语句更新表employees中的列salary,为所有员工的工资数目增加100。然后利用rollback回滚,查看此时的工资状况,并体会事务的概念。
1)查看员工目前工资状况
精品文档