2018-07-11 08:26:00
1 有某个学生运动会比赛信息的数据库,保存了如下的表:
2 运动员sporter表:(运动员编号sporterid,运动员姓名name,运动员性别sex,所属系department)
3 项目item表(项目编号itemid,项目itemname,loc地区)
4 成绩grade表(运动员编号sporterid,项目编号itemid,积分mark)
5
6 1.求出总积分最高的系名及总积分
7 SELECT department,sum(mark)
8 FROM sporter s,grade g
9 WHERE s.sporterid=g.sporterid
10 GROUP BY department
11 HAVING sum(mark)=(SELECT max(sum(mark))
12 FROM sporter s,grade g
13 WHERE s.sporterid=g.sporterid
14 GROUP BY department);
15
16 2.查询在一操场进行比赛的项目名称及其冠军的姓名
17 SELECT itemname,NAME
18 FROM sporter s,item i,grade g
19 WHERE s.sporterid=g.sporterid and i.itemid=g.itemid and loc='一操场' and mark=6;
20
21 3.找出参加了王玥所参加过的项目的其他同学的姓名
22 SELECT NAME
23 FROM sporter s,grade g
24 WHERE s.sporterid=g.sporterid
25 AND itemid IN(SELECT itemid
26 FROM sporter s,grade g
27 where s.sporterid=g.sporterid and name='王玥') and name!='王玥';
28
29 4.经查,王玥因为使用了违禁药品,其成绩都记为0分,请在数据库中做出相应修改
30 update grade set mark=0 where sporterid=(select sporterid from sporter where name='王玥');
31
32 5.经组委会协商,需要删除女子跳高比赛项目
33
34 一、约束
35 1、not NULL:非空约束,不允许为null值
36 建表时创建:
37 CREATE TABLE 表名(
38 列名 数据类型 DEFAULT 默认值 NOT NULL,
39 ...
40 );
41
42 修改表时创建非空约束:
43 ALTER TABLE 表名 MODIFY(列名 NOT NULL);
44
45 由not NULL 修改为null
46 ALTER TABLE 表名 MODIFY(列名 NULL);
47
48 CREATE TABLE A(
49 ID NUMBER(4) DEFAULT 1 NOT NULL,
50 NAME VARCHAR2(20) NOT NULL
51 );
52
53 INSERT INTO A(NAME) VALUES('aaa');
54 INSERT INTO A(ID) VALUES(5);
55
56 2、主键:又称为唯一索引键 不允许主键列的值为Null且不允许重复
57 PRIMARY KEY.
58 建表时创建:
59 CREATE TABLE 表名(
60 列名 数据类型 DEFAULT 默认值 primary key,
61 ...
62 );
63
64 CREATE TABLE 表名(
65 列名 数据类型 DEFAULT 默认值,
66 ...
67 列名 数据类型 DEFAULT 默认值,
68 constraint 约束名 primary key(约束内容)
69 );
70
71 修改表时创建:
72 ALTER TABLE 表名 ADD CONSTRAINT 约束名 PRIMARY KEY(约束内容);
73
74 删除主键约束:
75 ALTER TABLE 表名 DROP CONSTRAINT 约束名;
76
77 DROP TABLE A;
78 CREATE TABLE A(
79 ID NUMBER(4) PRIMARY KEY,
80 NAME VARCHAR2(20)
81 );
82
83 INSERT INTO A(NAME) VALUES('aaa');
84 INSERT INTO A(ID,NAME) VALUES(1,'aaa');
85
86 DESC A;
87 ALTER TABLE A MODIFY(ID NULL); ---不能将主键约束的not null修改为null
88
89 ALTER TABLE A DROP CONSTRAINT SYS_C009789;
90
91 3、唯一约束 : 不允许重复值
92 建表时创建:
93 CREATE TABLE 表名(
94 列名 数据类型 DEFAULT 默认值 unique,
95 ...
96 );
97
98 CREATE TABLE 表名(
99 列名 数据类型 DEFAULT 默认值,
100 ...
101 列名 数据类型 DEFAULT 默认值,
102 constraint 约束名 unique(约束内容)
103 );
104
105 修改表时创建:
106 ALTER TABLE 表名 ADD CONSTRAINT 约束名 unique(约束内容);
107
108 删除主键约束:
109 ALTER TABLE 表名 DROP CONSTRAINT 约束名;
110
111 DROP TABLE A;
112 CREATE TABLE A(
113 ID NUMBER(3) PRIMARY KEY,
114 NAME VARCHAR2(20) UNIQUE
115 );
116
117 INSERT INTO A(ID) VALUES(3);
118 SELECT * FROM A;
119
120 4、检查约束 :check
121 建表时创建:
122 CREATE TABLE 表名(
123 列名 数据类型 DEFAULT 默认值 check(条件),
124 ...
125 );
126
127 CREATE TABLE 表名(
128 列名 数据类型 DEFAULT 默认值,
129 ...
130 列名 数据类型 DEFAULT 默认值,
131 constraint 约束名 check(条件)
132 );
133
134 修改表时创建:
135 ALTER TABLE 表名 ADD CONSTRAINT 约束名 check(条件);
136
137 删除检查键约束:
138 ALTER TABLE 表名 DROP CONSTRAINT 约束名;
139
140 DROP TABLE A;
141
142 CREATE TABLE A(
143 ID NUMBER(3) CHECK(ID BETWEEN 1 AND 100)
144 );
145
146 INSERT INTO A VALUES(0);
147
148 5、外键:子表的外键的值必须在父表的主键中存在
149 父表:主键
150 子表:外键
151 FOREIGN KEY
152
153 建表时创建:
154 CREATE TABLE 表名(
155 列名 数据类型 DEFAULT 默认值 references 父表(主键) on delete cascade,
156 ...
157 );
158
159 CREATE TABLE 表名(
160 列名 数据类型 DEFAULT 默认值,
161 ...
162 列名 数据类型 DEFAULT 默认值,
163 constraint 约束名 foreign key(外键) references 父表(主键) on delete cascade
164 );
165
166 修改表时创建:
167 ALTER TABLE 表名 ADD CONSTRAINT 约束名 foreign key(外键) references 父表(主键) on delete cascade;
168
169 删除检查键约束:
170 ALTER TABLE 表名 DROP CONSTRAINT 约束名;
171
172 ON DELETE CASCADE:级联删除 当删除父表的主键记录时子表的相关记录会一并删除
173
174 DROP TABLE A;
175 CREATE TABLE A(
176 ID NUMBER(3) PRIMARY KEY,
177 NAME VARCHAR2(20) UNIQUE
178 );
179
180 CREATE TABLE b(
181 bid NUMBER(3) REFERENCES A(ID) ON DELETE CASCADE,
182 NAME VARCHAR2(20)
183 );
184
185 INSERT INTO A VALUES(1,'aaa');
186
187 INSERT INTO b VALUES(1,'aaa');
188
189 SELECT * FROM A;
190 SELECT * FROM b;
191 DELETE FROM A;
192
193 ALTER TABLE b ADD CONSTRAINT scott_b_name_fk FOREIGN KEY(NAME) REFERENCES A(NAME);
194
195 drop table b;
196
197 CREATE TABLE b(
198 bid NUMBER(3) REFERENCES A(ID),
199 NAME VARCHAR2(20)
200 );
201
202
203 二、视图:
204 CREATE [or replace] VIEW 视图名 AS 子查询[ WITH READ ONLY | WITH CHECK OPTION];
205 不占用空间
206 减少查询的难度
207
208 1、创建视图表:
209 ---创建查询emp20部门员工信息的视图表
210 CREATE or replace VIEW v_emp20 AS SELECT * FROM emp WHERE deptno=40;
211
212 SELECT * FROM v_emp20;
213 INSERT INTO v_emp20(empno,ename,mgr,sal,deptno) VALUES(1111,'lisi',7566,3000,20);
214 INSERT INTO v_emp20(empno,ename,mgr,sal,deptno) VALUES(1112,'zhangsan',7566,3000,10);
215
216 update v_emp20 set deptno=40;
217
218 delete from v_emp20;
219
220 SELECT * FROM emp;
221
222 2、with READ ONLY:只读视图
223 CREATE OR REPLACE VIEW v_emp30 AS SELECT * FROM emp WHERE deptno=30 WITH READ ONLY;
224 SELECT * FROM v_emp30;
225
226 DELETE FROM v_emp30;
227 INSERT INTO v_emp30(empno,ename,mgr,sal,deptno) VALUES(1113,'zhangsan',7566,3000,10);
228
229 3、with CHECK OPTION:条件检查
230 CREATE OR REPLACE VIEW v_emp30 AS SELECT * FROM emp WHERE deptno=30 WITH CHECK OPTION;
231 SELECT * FROM v_emp30;
232 INSERT INTO v_emp30(empno,ename,mgr,sal,deptno) VALUES(1113,'zhangsan',7566,3000,10); ----错误
233
234 INSERT INTO v_emp30(empno,ename,mgr,sal,deptno) VALUES(1113,'zhangsan',7566,3000,30);
235
236 DELETE FROM v_emp30;
237
238 4、复杂视图:
239 (01)视图的子查询中包含distinct,不允许对视图表增删改操作,只能查询
240 CREATE OR REPLACE VIEW v_emp AS SELECT DISTINCT deptno,JOB FROM emp;
241
242 SELECT * FROM v_emp;
243 DELETE FROM v_emp;
244 INSERT INTO v_emp VALUES(20,'clerk');
245 UPDATE v_emp SET deptno=20;
246
247 (02)视图的子查询中包含rownum,不允许对视图表增删改操作,只能查询
248 CREATE OR REPLACE VIEW v_emp AS SELECT rownum r,empno,ename,sal FROM emp;
249
250 SELECT * FROM v_emp;
251 DELETE FROM v_emp;
252 INSERT INTO v_emp VALUES(20,8888,'aaa',2000);
253 UPDATE v_emp SET sal=20;
254
255 (03)视图的子查询中包含分组函数,不允许对视图表增删改操作,只能查询
256 CREATE OR REPLACE VIEW v_emp AS SELECT count(empno) c,sum(sal) s FROM emp;
257
258 SELECT * FROM v_emp;
259 DELETE FROM v_emp;
260 INSERT INTO v_emp VALUES(18,20000);
261 update v_emp set c=20;
262
263 (04) 视图的子查询中包含了group BY 子句,不允许对视图表进行删除和修改的操作,允许新增和查询
264 CREATE OR REPLACE VIEW v_emp AS SELECT empno,ename FROM emp group by empno,ename;
265 SELECT * FROM v_emp;
266 DELETE FROM v_emp;
267 INSERT INTO v_emp VALUES(8888,'wangwu');
268 update v_emp set empno=20;
269
270 (05)视图的子查询中包含了表达式, 不允许对视图表的表达式列进行增加和修改的操作,允许对非表达式的列进行增删改查
271 CREATE OR REPLACE VIEW v_emp AS SELECT empno,sal*12 salary FROM emp;
272
273 SELECT * FROM v_emp;
274 DELETE FROM v_emp;
275 ROLLBACK;
276 INSERT INTO v_emp VALUES(8888,30000);
277 INSERT INTO v_emp(empno) VALUES(9999);
278
279 update v_emp set empno=20 where rownum=1;
280
281 (06)视图的子查询中不包含源表中的非空约束列,不允许对表进行新增,允许修改,删除 和查询
282 DESC emp;
283 CREATE OR REPLACE VIEW v_emp AS SELECT ename,sal FROM emp;
284
285 INSERT INTO v_emp VALUES('aaa',5000);
286
287 UPDATE v_emp SET sal=3000;
288 DELETE FROM v_emp;
289 rollback;
290
291 5、删除视图
292 DROP VIEW 视图名;
293
294 DROP VIEW v_emp;
295
296 三、序列
297 1、创建序列
298 CREATE SEQUENCE 序列名
299 [INCREMENT BY n] ----步长
300 [START WITH n] ---序列的起始值 序列创建后第一次使用的第一个值
301 [MINVALUE n] ---序列的最小值 序列从第二次循环取值时的最小值
302 [MAXVALUE n] ---序列的最大值
303 [CYCLE] ---序列设置循环取值的标志
304 [CACHE n] ---序列缓存的个数
305
306 ---所有属性都为默认值的序列
307 CREATE SEQUENCE myseq;
308
309 ---设置属性为指定值的序列
310 CREATE SEQUENCE seq1
311 INCREMENT BY 5
312 START WITH 10
313 MINVALUE 5
314 MAXVALUE 50
315 CYCLE
316 CACHE 5;
317
318 两个属性:
319 currval:取序列当前值
320 nextval:序列的下一个值
321 语法:序列名.属性名
322
323 注意:当一个序列创建成功之后,必须先用nextval生成第一个序列值才可以使用该序列
324
325 SELECT myseq.nextval FROM dual;
326
327 SELECT myseq.currval FROM dual;
328
329 SELECT seq1.nextval,seq1.currval FROM dual;
330
331 DROP TABLE A CASCADE CONSTRAINTS;
332 CREATE TABLE A(
333 ID NUMBER(5) PRIMARY KEY
334 );
335
336 insert into a values(myseq.nextval);
337
338 select * from a;
339
340 2、修改序列
341 alter SEQUENCE 序列名
342 [INCREMENT BY n] ----步长
343 [MINVALUE n] ---序列的最小值 序列从第二次循环取值时的最小值
344 [MAXVALUE n] ---序列的最大值
345 [CYCLE] ---序列设置循环取值的标志
346 [CACHE n] ---序列缓存的个数
347
348 3、删除序列
349 DROP SEQUENCE 序列名;
350
351 四、索引
352 1、创建索引
353 手动创建:
354 CREATE INDEX 索引名 ON 表名(列名[,列名...]);
355
356 CREATE TABLE employee1(
357 pno NUMBER(7),
358 pname VARCHAR2(20)
359 );
360
361 CREATE INDEX inx_scott_pno ON employee1(pno);
362 INSERT INTO employee1 SELECT empno,ename FROM emp;
363 COMMIT;
364
365
366 select * from employee1;
367
368 INSERT INTO employee1 SELECT * FROM employee1;
369
370 UPDATE employee1 SET pno=ROWNUM;
371
372
373 SELECT *
374 FROM employee1
375 where pno=99999;
376
377 SELECT *
378 FROM employee1
379 where UPPER(ENAME)='SCOTT';
380
381 函数索引:
382 CREATE INDEX inx_scott_pname ON employee1(upper(pname));
383
384 CREATE INDEX inx_scott_pno_pname ON employee1(pno,pname);
385
386 自动创建索引:当创建主键或唯一键时,也会自动创建对应列的索引
387
388 2\删除索引:
389 DROP INDEX 索引名;
390
391 DROP INDEX inx_scott_pname;
392
393 select * from user_indexes;
394
395 1.使用子查询的方式,创建test表。
396 create table test99 as select empno,ename,sal,deptno from emp;
397 2.快速复制test表中的数据,复制到100w条左右
398 INSERT INTO TEST SELECT * FROM TEST;
399 DESC test99;
400 alter table test99 modify(empno number(12));
401
402 五.用户管理
403 1\创建用户: 管理员有权限创建修改删除用户
404 CREATE USER 用户名 IDENTIFIED BY 密码;
405
406 CREATE USER lwy IDENTIFIED BY lwy;
407
408 注意:在oracle里,新建的用户对数据库没有任意操作权限
409
410 2.赋权限:
411 赋系统权限: GRANT sys_privs.... TO 用户名| PUBLIC| 角色名 [WITH ADMIN OPTION];
412 常用的系统权限:
413 CREATE SESSION:
414 CREATE TABLE:
415 CREATE SEQUENCE:
416 UNLIMITED TABLESPACE;
417
418 GRANT CREATE SESSION,CREATE TABLE,CREATE SEQUENCE,UNLIMITED TABLESPACE TO lwy WITH ADMIN OPTION;
419
420 ---用户系统权限的数据字典表
421 select * from user_sys_privs;
422
423 加收系统权限:revoke sys_privs.... FROM 用户名;
424 revoke create table from lwy;
425
426 赋对象权限:GRANT obj_privs.... | all ON 对象名 TO 用户名|PUBLIC|角色名 [WITH GRANT OPTION];
427 grant select on scott.emp to lwy;
428
429 grant all on scott.dept to lwy;
430
431 ---用户对象权限的数据字典表:
432 select * from user_tab_privs;
433
434 加收对象权限:revoke obj_privs.... ON 对象名 FROM 用户名;
435 REVOKE SELECT ON scott.emp FROM lwy;
436
437 3.角色:
438 DBA:所有权限
439 RESOURCE:对实体进行操作,不能对结构操作
440 CONNECT:只能连接
441
442 --使用角色来给用户赋权限
443 GRANT 角色名 TO 用户名; ---将角色所拥有权限赋给用户
444
445 ---给一个用户赋所有权限
446 grant dba to 用户名;
447
448 自定义角色:
449 create role 角色名 not identified;
450
451 4.修改用户:
452 ---修改密码:
453 alter user 用户名 identified by 新密码;
454
455 ---给用户解锁:
456 ALTER USER 用户名 ACCOUNT UNLOCK;
457
458 ---锁定用户
459 ALTER USER 用户名 ACCOUNT LOCK;
460
461 5.删除用户
462 drop user 用户名 cascade;
463
464 DROP USER lwy CASCADE;
465
466
467 六、匿名块
468 1、定义匿名块:
469 DECLARE
470 定义部分; ---可选部分
471 BEGIN
472 执行部分; ---必选部分
473 EXCEPTION
474 异常处理部分; ---可选部分
475 end;
476
477
478 ---往控制台输出hello world
479 BEGIN
480 dbms_output.put_line('hello world');
481 end;
482
483 ---打开控制台输出开关
484 set serveroutput on;
485
486 --定义变量,赋值给变量,输出变量值
487 DECLARE
488 v_id NUMBER(3);
489 BEGIN
490 v_id:=1;
491 dbms_output.put_line(v_id);
492 END;
493
494 ---查询数据库表中使用into的数据输出到控制台
495 DECLARE
496 v_name VARCHAR2(20);
497 v_sal NUMBER(7,2);
498 BEGIN
499 SELECT ename,sal INTO v_name,v_sal FROM emp WHERE empno=7788;
500 dbms_output.put_line(v_name || ',' || v_sal);
501 end;
502
503 &:调出输入框接收输入数据。
504 ---查询指定员工的薪水
505 SELECT * FROM emp WHERE empno=&no;
506
507 select * from emp where upper(ename)=upper('&name');
508
509
510 DECLARE
511 v_name VARCHAR2(20);
512 v_sal NUMBER(7,2);
513 BEGIN
514 SELECT ename,sal INTO v_name,v_sal FROM emp WHERE empno=&no;
515 dbms_output.put_line(v_name || ',' || v_sal);
516 END;
517
518 DECLARE
519 v_name VARCHAR2(20);
520 v_sal NUMBER(7,2);
521 BEGIN
522 SELECT ename,sal INTO v_name,v_sal FROM emp WHERE empno=&no;
523 dbms_output.put_line(v_name || ',' || v_sal);
524 exception
525 WHEN no_data_found THEN
526 dbms_output.put_line('对不起,你输入的用户不存在');
527 END;
528
529 %TYPE:使用数据库中某一列的数据类型做为变量的数据类型
530 语法:表名.列名%type;
531
532 DECLARE
533 v_name emp.ename%TYPE;
534 v_sal emp.sal%type;
535 BEGIN
536 SELECT ename,sal INTO v_name,v_sal FROM emp WHERE empno=&no;
537 dbms_output.put_line(v_name || ',' || v_sal);
538 exception
539 WHEN no_data_found THEN
540 dbms_output.put_line('对不起,你输入的用户不存在');
541 END;
542
543 %rowtype:行类型,使用数据库中某一个表的一行为数据类型
544 语法:表名%rowtype;
545
546 DECLARE
547 v_emp emp%rowtype;
548 BEGIN
549 SELECT * INTO v_emp FROM emp WHERE empno=&no;
550 dbms_output.put_line(v_emp.empno || ',' || v_emp.ename || ',' || v_emp.sal);
551 end;