(加入日期:2005-12-12 点击数:1735)
电信机房P4 服务器·6999/年·送产权蓝芒系统
【对此文发表评论】【编程爱好者论坛】 【保存文章至硬盘】 【打印文章】
1. 执行一个SQL 脚本文件
SQL>start file_name
SQL>@ file_name
我们可以将多条sql 语句保存在一个文本文件中,这样当要执行这个文件中的所有的sql 语句时,用
上面的任一命令即可,这类似于dos 中的批处理。
2. 对当前的输入进行编辑
SQL>edit
3. 重新运行上一次运行的sql 语句
SQL>/
4. 将显示的内容输出到指定文件
SQL> SPOOL file_name
在屏幕上的所有内容都包含在该文件中,包括你输入的sql 语句。
5. 关闭spool 输出
SQL> SPOOL OFF
只有关闭spool 输出,才会在输出文件中看到输出的内容。
6.显示一个表的结构
SQL> desc table_name
7. COL 命令:
主要格式化列的显示形式。
该命令有许多选项,具体如下:
COL[UMN] [{ column|expr} [ option ...]]
Option 选项可以是如下的子句:
ALI[AS] alias
CLE[AR]
FOLD_A[FTER]
FOLD_B[EFORE]
FOR[MAT] format
HEA[DING] text
JUS[TIFY] {L[EFT]|C[ENTER]|C[ENTRE]|R[IGHT]}
LIKE { expr|alias}
NEWL[INE]
NEW_V[ALUE] variable
NOPRI[NT]|PRI[NT]
NUL[L] text
OLD_V[ALUE] variable
ON|OFF
WRA[PPED]|WOR[D_WRAPPED]|TRU[NCATED]
1). 改变缺省的列标题
COLUMN column_name HEADING column_heading
For example:
Sql>select * from dept;
DEPTNO DNAMELOC
---------- ---------------------------- ---------
10 ACCOUNTINGNEW YORK
sql>colLOC heading location
sql>select * from dept;
DEPTNO DNAMElocation
--------- ---------------------------- -----------
10 ACCOUNTINGNEW YORK
2). 将列名ENAME 改为新列名EMPLOYEE NAME 并将新列名放在两行上:
Sql>select * from emp
DepartmentnameSalary
---------- ---------- ----------
10 aaa11
SQL> COLUMN ENAME HEADING ’Employee|Name’
Sql>select * from emp
Employee
DepartmentnameSalary
---------- ---------- ----------
10 aaa11
note: the col heading turn into two lines from one line.
3). 改变列的显示长度:
FOR[MAT] format
Sql>select empno,ename,job from emp;
EMPNO ENAMEJOB
---------- -------------------
7369 SMITHCLERK
7499 ALLENSALESMAN
7521 WARDSALESMAN
Sql> col ename format a40
EMPNO ENAMEJOB
-----------------------------------------------------------
7499 ALLENSALESMAN
7521 WARDSALESMAN
4). 设置列标题的对齐方式
JUS[TIFY] {L[EFT]|C[ENTER]|C[ENTRE]|R[IGHT]}
SQL> col ename justify center
SQL> /
EMPNOENAMEJOB
-----------------------------------------------------------
7369 SMITHCLERK
7499 ALLENSALESMAN
7521 WARDSALESMAN
对于NUMBER 型的列,列标题缺省在右边,其它类型的列标题缺省在左边
5). 不让一个列显示在屏幕上
NOPRI[NT]|PRI[NT]
SQL> col job noprint
SQL> /
EMPNOENAME
--------------------------------------------------
7369 SMITH
7499 ALLEN
7521 WARD
6). 格式化NUMBER 类型列的显示:
SQL> COLUMN SAL FORMAT $99,990
SQL> /
Employee
Department NameSalaryCommission
---------- ---------- --------- ----------
30ALLEN$1,600300
7). 显示列值时,如果列值为NULL 值,用text 值代替NULL 值
COMM NUL[L] text
SQL>COL COMM NUL[L] text
8). 设置一个列的回绕方式
WRA[PPED]|WOR[D_WRAPPED]|TRU[NCATED]
COL1
--------------------
HOW ARE YOU?
SQL>COL COL1 FORMAT A5
SQL>COL COL1 WRAPPED
COL1
-----
HOW A
RE YO
U?
SQL> COL COL1 WORD_WRAPPED
COL1
-----
HOW
ARE
YOU?
SQL> COL COL1 WORD_WRAPPED
COL1
-----
HOW A
9). 显示列的当前的显示属性值
SQL> COLUMN column_name
10). 将所有列的显示属性设为缺省值
SQL> CLEAR COLUMNS
8. 屏蔽掉一个列中显示的相同的值
BREAK ON break_column
SQL> BREAK ON DEPTNO
SQL> SELECT DEPTNO, ENAME, SAL
FROM EMP
WHERE SAL < 2500
ORDER BY DEPTNO;
DEPTNOENAMESAL
---------- ----------- ---------
10CLARK2450
MILLER1300
20SMITH800
ADAMS1100
9. 在上面屏蔽掉一个列中显示的相同的值的显示中,每当列值变化时在值变化之前插入n 个空行。
BREAK ON break_column SKIP n
SQL> BREAK ON DEPTNO SKIP 1
SQL> /
---------- ----------- ---------
10 CLARK 2450
MILLER 1300
20 SMITH 800
ADAMS 1100
10. 显示对BREAK 的设置
SQL> BREAK
11. 删除6、7 的设置
SQL> CLEAR BREAKS
12. Set 命令:
该命令包含许多子命令:
SET system_variable value
system_variable value 可以是如下的子句之一:
APPI[NFO]{ON|OFF|text}
ARRAY[SIZE] {15|n}
AUTO[COMMIT]{ON|OFF|IMM[EDIATE]|n}
AUTOP[RINT] {ON|OFF}
AUTORECOVERY [ON|OFF]
AUTOT[RACE] {ON|OFF|TRACE[ONLY]} [EXP[LAIN]] [STAT[ISTICS]]
BLO[CKTERMINATOR] {.|c}
CMDS[EP] {;|c|ON|OFF}
COLSEP {_|text}
COM[PATIBILITY]{V7|V8|NATIVE}
CON[CAT] {.|c|ON|OFF}
COPYC[OMMIT] {0|n}
COPYTYPECHECK {ON|OFF}
DEF[INE] {&|c|ON|OFF}
DESCRIBE [DEPTH {1|n|ALL}][LINENUM {ON|OFF}][INDENT {ON|OFF}]
ECHO {ON|OFF}
EDITF[ILE] file_name[.ext]
EMB[EDDED] {ON|OFF}
ESC[APE] {|c|ON|OFF}
FEED[BACK] {6|n|ON|OFF}
FLAGGER {OFF|ENTRY |INTERMED[IATE]|FULL}
FLU[SH] {ON|OFF}
HEA[DING] {ON|OFF}
HEADS[EP] {||c|ON|OFF}
INSTANCE [instance_path|LOCAL]
LIN[ESIZE] {80|n}
LOBOF[FSET] {n|1}
LOGSOURCE [pathname]
LONG {80|n}
LONGC[HUNKSIZE] {80|n}
MARK[UP] HTML [ON|OFF] [HEAD text] [BODY text] [ENTMAP {ON|OFF}] [SPOOL
{ON|OFF}] [PRE[FORMAT] {ON|OFF}]
NEWP[AGE] {1|n|NONE}
NULL text
NUMF[ORMAT] format
NUM[WIDTH] {10|n}
PAGES[IZE] {24|n}
PAU[SE] {ON|OFF|text}
RECSEP {WR[APPED]|EA[CH]|OFF}
RECSEPCHAR {_|c}
SERVEROUT[PUT] {ON|OFF} [SIZE n] [FOR[MAT] {WRA[PPED]|WOR[D_
WRAPPED]|TRU[NCATED]}]
SHIFT[INOUT] {VIS[IBLE]|INV[ISIBLE]}
SHOW[MODE] {ON|OFF}
SQLBL[ANKLINES] {ON|OFF}
SQLC[ASE] {MIX[ED]|LO[WER]|UP[PER]}
SQLCO[NTINUE] {> |text}
SQLN[UMBER] {ON|OFF}
SQLPRE[FIX] {#|c}
SQLP[ROMPT] {SQL>|text}
SQLT[ERMINATOR] {;|c|ON|OFF}
SUF[FIX] {SQL|text}
TAB {ON|OFF}
TERM[OUT] {ON|OFF}
TI[ME] {ON|OFF}
TIMI[NG] {ON|OFF}
TRIM[OUT] {ON|OFF}
TRIMS[POOL] {ON|OFF}
UND[ERLINE] {-|c|ON|OFF}
VER[IFY] {ON|OFF}
WRA[P] {ON|OFF}
1). 设置当前session 是否对修改的数据进行自动提交
SQL>SET AUTO[COMMIT] {ON|OFF|IMM[EDIATE]| n}
2).在用start 命令执行一个sql 脚本时,是否显示脚本中正在执行的SQL 语句
SQL> SET ECHO {ON|OFF}
3).是否显示当前sql 语句查询或修改的行数
SQL> SET FEED[BACK] {6|n|ON|OFF}
当为off 时,一律不显示查询的行数
4).是否显示列标题
SQL> SET HEA[DING] {ON|OFF}
当set heading off 时,在每页的上面不显示列标题,而是以空白行代替
5).设置一行可以容纳的字符数
SQL> SET LIN[ESIZE] {80|n}
如果一行的输出内容大于设置的一行可容纳的字符数,则折行显示。
6).设置页与页之间的分隔
SQL> SET NEWP[AGE] {1|n|NONE}
当set newpage 0 时,会在每页的开头有一个小的黑方框。
当set newpage n 时,会在页和页之间隔着n 个空行。
当set newpage none 时,会在页和页之间没有任何间隔。
7).显示时,用text 值代替NULL 值
SQL> SET NULL text
8).设置一页有多少行数
SQL> SET PAGES[IZE] {24|n}
如果设为0,则所有的输出内容为一页并且不显示列标题
9).是否显示用DBMS_OUTPUT.PUT_LINE 包进行输出的信息。
SQL> SET SERVEROUT[PUT] {ON|OFF}
在编写存储过程时,我们有时会用dbms_output.put_line 将必要的信息输出,以便对存储过程进行
调试,只有将serveroutput 变量设为on 后,信息才能显示在屏幕上。
10).当SQL 语句的长度大于LINESIZE 时,是否在显示时截取SQL 语句。
SQL> SET WRA[P] {ON|OFF}
当输出的行的长度大于设置的行的长度时(用set linesize n 命令设置),当set wrap on 时,输
出行的多于的字符会另起一行显示,否则,会将输出行的多于字符切除,不予显示。
11).是否在屏幕上显示输出的内容,主要用与SPOOL 结合使用。
SQL> SET TERM[OUT] {ON|OFF}
在用spool 命令将一个大表中的内容输出到一个文件中时,将内容输出在屏幕上会耗费大量的时间,
设置set termspool off 后,则输出的内容只会保存在输出文件中,不会显示在屏幕上,极大的提高
了spool 的速度。
12).将SPOOL 输出中每行后面多余的空格去掉
SQL> SET TRIMS[OUT] {ON|OFF}
13)显示每个sql 语句花费的执行时间
set TIMING{ON|OFF}
14.修改sql buffer 中的当前行中,第一个出现的字符串
C[HANGE] /old_value/new_value
SQL> l
1* select * from dept
SQL> c/dept/emp
1* select * from emp
15.编辑sql buffer 中的sql 语句
EDI[T]
16.显示sql buffer 中的sql 语句,list n 显示sql buffer 中的第n 行,并使第n 行成为当前行
L[IST] [n]
17.在sql buffer 的当前行下面加一行或多行
I[NPUT]
18.将指定的文本加到sql buffer 的当前行后面
A[PPEND]
SQL> select deptno,
2dname
3from dept;
DEPTNO DNAME
---------- --------------
10 ACCOUNTING
20 RESEARCH
30 SALES
40 OPERATIONS
SQL> L 2
2* dname
SQL> a ,loc
2* dname,loc
SQL> L
1select deptno,
2dname,loc
3* from dept
SQL> /
DEPTNO DNAMELOC
---------- -------------- -------------
10 ACCOUNTINGNEW YORK
20 RESEARCHDALLAS
40 OPERATIONSBOSTON
19.将sql buffer 中的sql 语句保存到一个文件中
SAVE file_name
20.将一个文件中的sql 语句导入到sql buffer 中
GET file_name
21.再次执行刚才已经执行的sql 语句
RUN
or
/
22.执行一个存储过程
EXECUTE procedure_name
23.在sql*plus 中连接到指定的数据库
CONNECT user_name/passwd@db_alias
24.设置每个报表的顶部标题
TTITLE
25.设置每个报表的尾部标题
BTITLE
26.写一个注释
REMARK [text]
27.将指定的信息或一个空行输出到屏幕上
PROMPT [text]
28.将执行的过程暂停,等待用户响应后继续执行
PAUSE [text]
Sql>PAUSE Adjust paper and press RETURN to continue.
29.将一个数据库中的一些数据拷贝到另外一个数据库(如将一个表的数据拷贝到另一个数据库)
COPY {FROM database | TO database | FROM database TO database}
{APPEND|CREATE|INSERT|REPLACE} destination_table
[(column, column, column, ...)] USING query
sql>COPY FROM SCOTT/TIGER@HQ TO JOHN/CHROME@WEST
create emp_temp
USING SELECT * FROM EMP
30.不退出sql*plus,在sql*plus 中执行一个操作系统命令:
HOST
Sql> host hostname
该命令在windows 下可能被支持。
31.在sql*plus 中,切换到操作系统命令提示符下,运行操作系统命令后,可以再次切换回sql*pl
us:
!
sql>!
$hostname
$exit
sql>
该命令在windows 下不被支持。
32.显示sql*plus 命令的帮助
HELP
如何安装帮助文件:
Sql>@ ?sqlplusadminhelphlpbld.sql ?sqlplusadminhelphelpus.sql
Sql>help index
33.显示sql*plus 系统变量的值或sql*plus 环境变量的值
Syntax
SHO[W] option
where option represents one of the following terms or clauses:
system_variable
ALL
BTI[TLE]
ERR[ORS] [{FUNCTION|PROCEDURE|PACKAGE|PACKAGE BODY|
TRIGGER|VIEW|TYPE|TYPE BODY} [schema.]name]
LNO
PARAMETERS [parameter_name]
PNO
REL[EASE]
REPF[OOTER]
REPH[EADER]
SGA
SPOO[L]
SQLCODE
TTI[TLE]
1) . 显示当前环境变量的值:
Show all
2) . 显示当前在创建函数、存储过程、触发器、包等对象的错误信息
Show error
当创建一个函数、存储过程等出错时,变可以用该命令查看在那个地方出错及相应的出错信息,进行
修改后再次进行编译。
3) . 显示初始化参数的值:
show PARAMETERS [parameter_name]
4) . 显示数据库的版本:
show REL[EASE]
5) . 显示SGA 的大小
show SGA
6). 显示当前的用户名
show user
1 Select DISTINCT *|列名 别名 FROM 表名 {where 条件表达式} {order by 字段名1,字段名2 ASC|DESC}
2 ||
3 四则运算+ -* /
‘雇员名:’||ename||‘,雇员号:‘||empno||’,工作:‘||job
4 is null
Is not null
5 and or not
6 字段名between 小值 and 大值
7 注意大小写
8字段名IN (值1。值2)
可数据,也可是字符串
9 LIKE模糊查询
% :任意匹配
_ 匹配其中一个
找出名字中第二个字母是M的雇员的信息
字段名 LIKE ‘_M%’
找出名字中含有M的雇员的信息
匹配数字
Select * from emp where hiredate like ‘%81’;
10 >= <= <> !=
11 order by
显示部门号为30的雇员的信息,要求按照工资进行升序,如果工资相等则按照姓名来排序
Select * from emp where deptno=30 order by sal asc,ename;
12 单行函数
字符函数:upper lower initcap concat substr length replace
数值函数:round() trunc() mod()
日期函数
转换函数
通用函数
Upper():把字符串转换为大写
hello转换为大写
initcap() 第一个字符转换为大写
concat()字符串连接CONCAT(‘HELLO’,‘WORLD’);
substr(字符串,从每几位开始,取几个字符):取当前字符串的子字符串
substr(‘hello’,1,2)
substr(‘hello’,-3,2);
要求截取雇员名中的最后三个字符
Length();求字符串的长度
Replace(字符串,源字符,替换后的字符);
Replace(‘hello’,’l’,’x’);
round(数据,精度):四舍五入
round(3.1415926,2);
trunc():直接截取
mod(被除数,除数):取余数
mod(10,3);
左右连接:(+)
例:显示雇员名以及部门名
Select e.ename,d.dname,d.deptno,e.empno from emp e,dept d where e.deptno(+)=d.deptno;
左连接:以右的那个字段为基准
每个人的上级领导:
Select e.ename,d.empno,e.empno
From emp e,emp d
Where e.empno(+)=d.mgr;
分组以及分组函数:
分组函数:
1. count(列名);统计记录数
统计雇员的人数
Select count(ename) from emp;
2. max(列名)取某一列的最大值
select max(sal) from emp;
3 min(列名)取某一列的最小值
select min(sal) from emp;
4 avg(列名):取记录的平均值
select avg(sal) from emp;
5 sum(列名)求某一列的和
分组的SELECT语句
Select DISTINCT *|列名 别名 FROM 表名 {where 条件表达式} {group by 分组条件}{order by 字段名1,字段名2 ASC|DESC}
例:求出每个部门的人数
相似性:部门编号
Select deptno,count(empno) from emp group by deptno;
显示雇员名以及统计每个部门的人数;
Select ename,count(empno) from emp group by empno;
注意:在使用分组函数时:
当你使用了group by 给出分组条件时。这个条件是可以及一块显示出来的
分组函数和分组条件上的之外的一些字段是不可以一起显示出来的
Select empno,count(empno) from emp group by empno;
Select d.dname,avg(e.sal) from emp e,dept d where e.deptno=d.deptno group by d.deptno;
Select deptno, avg(sal) from emp group by deptno;
例:部门的名称以及部门的员工数
Select d.dname,count(e.empno) from emp e,dept d where e.deptno=d.deptno group by d.dname;
例:显示平均工资大于2000的部门的编号和平均工资
Select deptno,avg(sal) A
From emp
Group by deptno having A>2000;
分组函数不能出现在where语句中
Select DISTINCT *|列名 别名 FROM 表名 {where 条件表达式} {group by 分组条件
{having 条件}}{order by 字段名1,字段名2 ASC|DESC}
Select deptno,avg(sal) 平均工资
From emp
Group by deptno having,avg(sal)>2000;
例:显示非销售人员的工作名称以及从事同一工作雇员月工资的总和,并且要满足从事同一工作的雇员的月工资合计大于5000,输出结果按照月工资总和排序按降序。
显示非销售人员的工作名称:select job from emp where job<>’SALEMAN’;
从事同一工作雇员月工资的总和: select job,sum(sal) from emp where job<>’SALEMAN’ group by job;
月工资合计大于5000sum(sal)>5000
select job,sum(sal) from emp where job<>’SALEMAN’ group by job having sum(sal)>5000;
输出结果按照月工资总和排序按降序。
select job,sum(sal) from emp where job<>’SALESMAN’ group by job having sum(sal)>5000 order by sum(sal) desc;
分组使用的时候注意:
Select max(sum(sal)),deptno from emp group by deptno;
嵌套分组函数使用的时候,group by 当中的条件是不能被显示出来
求上级领导名:
Select e.ename 雇员,d.ename 领导
From emp e,emp d
Where e.mgr = d.empno(+);
子查询:在一个查询的内部包含另外一个查询
Select DISTINCT *|列名 别名 FROM 表名
{Select DISTINCT *|列名 别名 FROM 表名 {where 条件表达式} {group by 分组条件}{order by 字段名1,字段名2 ASC|DESC}}
{where 条件表达式} {group by 分组条件}{order by 字段名1,字段名2 ASC|DESC}
例:查询比7844工资高的全部的职员的信息
分析:1 找到7844的工资
Select sal from emp where empno=7844;
2查询比7844工资高的全部的职员的信息
Select * from emp where sal>( Select sal from emp where empno=7844);
工资比7654高,同时与7788从事相同工作的那些职员的信息
分析:1 找出工资比7654高
Select sal from emp where empno=7654
2 同时与7788从事相同工作
Select job from emp where empno=7788;
3 工资比7654高,同时与7788从事相同工作
Sal>(Select sal from emp where empno=7654) and job=(Select job from emp where empno=7788)
4 select * from emp where Sal>(Select sal from emp where empno=7654) and job=(Select job from emp where empno=7788);
例:查询出工资最低的雇员的姓名工资
分析:首先查询出最低工资出来:select min(sal) from emp;
查询出姓名和工资出来:select ename,sal from emp where sal=( select min(sal) from emp);
例:查询出部门名称、部门的员工数、部门的平均工资、以及部门的最低收入雇员的姓名
select count(empno),avg(sal),min(sal),deptno from emp group by deptno;
select d.dname,ed.c,ed.a,e.ename
from emp e,dept d, (select count(empno) c,avg(sal) a,min(sal) m,deptno from emp group by deptno) ed
where e.sal=ed.m and e.deptno=d.deptno;
第二天的内容复习:
1 日期函数 转换函数 通用函数
2 group by 以及分组函数
3 多表查询 自连接
4 左右连接
5 子查询
第三天内容
子查询中可以使用的操作符: in
Any
All
In 例:求出每个部门的最低工资的雇员的信息
Select * from emp where sal in (select min(sal) from emp group by deptno);
Any : =any Select * from emp where sal=any(select min(sal) from emp group by deptno);
>any 大于最小的那个 Select * from emp where sal>any(select min(sal) from emp group by deptno);
<any 小于最大的那个 Select * from emp where sal<any(select min(sal) from emp group by deptno);
All : >all 大于最大的那个Select * from emp where sal>all(select min(sal) from emp group by deptno);
<all 小于最小的那个Select * from emp where sal<all(select min(sal) from emp group by deptno);
数据库操作:
查询操作:SELECT
更新: insert update delete
复制一个表格:
Create table temp as select * from emp;
Create table femp as select * from emp where 1=2;
(1)插入数据:
语法格式:insert into 表名 (字段1,字段2,字段N)
Values(值1,值2,值n)
向TEMP这个表格当中添加一行数据
Insert into emp (empno,ename,job,mgr,hiredate,sal,comm,deptno)
Values(7369,’OWEN’,’sporter’,7839, ‘19-4月 -87’,10000,20000,40);
Insert into temp
Values(8889,’OW’,’sporter’,7839, ‘19-4月 -87’,10000,20000,40);
插入一个无资金无工资
Insert into temp (empno,ename,job,mgr,hiredate, deptno)
Values(8887,’hujintao’,’sporter’,7839, ‘19-4月 -87’, 40);
Insert into temp (empno,ename,job,mgr,hiredate,sal,comm,deptno)
Values(8886,’WENJIABAO’,’sporter’,7839, ‘19-4月 -87’,null, null,40);
1981-6-28
Insert into temp (empno,ename,job,mgr,hiredate,sal,comm,deptno)
Values(8886,’WENJIABAO’,’sporter’,7839, to_date(‘1981-6-28’,’yyyy-mm-dd’),null, null,40);
(2) 删除数据
语法:delete from 表名:删除表格里的所有数据
Delete from 表名 where 条件:根据指定的条件进行删除
Delete from femp;
Delete from temp where ename=’SMITH’;
(3) 更新数据
语法:update 表名set 字段名=值 where 条件;
Update temp set comm=1000 where ename=’SMITH’;
事务处理:
创建一个只包含部门10的临时表
Create table dept10 as select * from emp where deptno=10;
Delete from dept10 where empno=7589;
提交与回滚:提交:commit;
回滚:rollback;
支持死锁:
数据库的创建,删除和变更
数据类型:number(5)
Number(5,2)
Varchar(9)
Date;
Clob;大对象,文本的数据,可以存的容量4GB
Blob;大对象,二进制的数据,可以存的容量也是4GB
1 数据库的创建
语法:create table 表名
(字段名1 数据类型 default 默认值,
字段名2 数据类型 default, 默认值,
字段名 3 数据类型 default 默认值);
创建一个人的表格
Pid pname age sex birthday
Create table person ( pid number(18),
Pname varchar(8),
Age number(3) 60,
Sex varchar(2) ,
Birthday date);
2 删除表格
Drop table 表名;
3 更新表格
更新字段:添加字段 alter table 表名 add(字段名 数据类型 default);
Alter table person add (address varchar(20));
修改字段: alter table 表名 modify (字段名 数据类型 default);
注意:更改数据长度的时候,如果原来表格当中有数据的长度大于你想修改的这个长度,这时就不能修改,
为表格改名:格式:rename 旧表名 to 新表名
Rename dept10 to dept20;
练习:创建一个国家表,里面有中国、巴西、意大利、德国
生成 中国 美国
中国 巴西
中国 意大利 、
美国 巴西
Create table national(nname varchar(10));
Insert into national(nname) values(‘德国’);
自连接:
Select e.nname,d.nname
From national e,national d
Where e.nname(+)!=d.nname;
约束:保证表格的完整性
约束的分类:
1 主键:唯一性,不能为空
2 非空约束:如果希望表格当中的某一列的数据不能为空
3 唯一性约束:保证数据的唯一
4 检查约束:检查字段的值在一个范围以内
5 主-外键约束:存在于两个表之间
主键约束:primary key,用在表格的ID中
给主键约束更名:constraint 约束名 约束类型(约束字段)on delete cascade;
Constraint person_pid_pk primary key(pid);
约束名:表名_字段名_约束类型的缩写
非空约束:not null;
Constraint person_pname_nk not null(pname);此语句是错误的
唯一性约束:unique
检查约束:check
语法:check(字段名 条件)
Check(age between 0 and 150);
Check(sex in(‘男’,’女’,’中’));
主外键约束:存在于两个表之间
举例:一个人有一本书,一本书属于一个人
做一个书的表格
Bid bname price bdate pid
Create table book (bid number(2),
更新约束:表格创建完成之后来增加约束
Bname varchar(10),
Price number(7,2),
Bdate date,
Pid number(18));
声明主外键约束的方法:应该在子表当中加入下列语句
Constraint 主外键约束名 foreign key(字段名) references 主表名(主表字段)
Constraint book_pid_fk foreign key(pid) references person(pid);
删除表格:drop table 表名 cascade constraint;
drop table person cascade constraint;
1 创建主外键的时候,是不主表一定要有primary key;
2 null ‘’
3on delete cascade
更新约束:表格创建完成之后来增加约束
添加约束语法:alter table 表名 add constraint 约束名 约束类型(约束字段)
删除约束语法:alter table 表名 drop constraint 约束名
Alter table book drop constraint book_bid_pk;
Rownum:伪列表示行号
Select rownum,empno,ename from emp;
select rownum,empnu,ename from emp where rownum<=10;
select * from (select rownum r,empno,ename from emp where rownum<=10) temp
where temp.r>5;
同义词:
定义同义词语法:
Create synonym 同义词名 for 用户名.表名
Create synonym emp for scott.emp;
视图:封装一些查询
语法:create view 视图名 as 子查询语句
例:建立视图这视图包括了部门10的全部雇员的信息
Create or replace view dept10 as select * from emp where deptno=10 with check option;
删除视图:drop view 视图名
Drop view dept10;
替代视图语法:create or replace view 视图名 as 子查询
Create or replace view dept10 as select * from emp where deptno=20;
With check option;
Update dept10 set deptno=40 where empno=7799;
With read only;只读
Create or replace view dept10 as select * from emp where deptno=20 with read only;
update dept10 set job='work' where empno=7782;
===============================================================================
一、ORACLE的启动和关闭
1、在单机环境下
要想启动或关闭ORACLE系统必须首先切换到ORACLE用户,如下
su - oracle
a、启动ORACLE系统
oracle>svrmgrl
SVRMGR>connect internal
SVRMGR>startup
SVRMGR>quit
b、关闭ORACLE系统
oracle>svrmgrl
SVRMGR>connect internal
SVRMGR>shutdown
SVRMGR>quit
启动oracle9i数据库命令:
$ sqlplus /nolog
SQL*Plus: Release 9.2.0.1.0 - Production on Fri Oct 31 13:53:53 2003
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
SQL> connect / as sysdba
Connected to an idle instance.
SQL> startup^C
SQL> startup
ORACLE instance started.
2、在双机环境下
要想启动或关闭ORACLE系统必须首先切换到root用户,如下
su - root
a、启动ORACLE系统
hareg -y oracle
b、关闭ORACLE系统
hareg -n oracle
Oracle数据库有哪几种启动方式
说明:
有以下几种启动方式:
1、startup nomount
非安装启动,这种方式启动下可执行:重建控制文件、重建数据库
读取init.ora文件,启动instance,即启动SGA和后台进程,这种启动只需要init.ora文件。
2、startup mount dbname
安装启动,这种方式启动下可执行:
数据库日志归档、
数据库介质恢复、
使数据文件联机或脱机,
重新定位数据文件、重做日志文件。
执行“nomount”,然后打开控制文件,确认数据文件和联机日志文件的位置,
但此时不对数据文件和日志文件进行校验检查。
3、startup open dbname
先执行“nomount”,然后执行“mount”,再打开包括Redo log文件在内的所有数据库文件,
这种方式下可访问数据库中的数据。
4、startup,等于以下三个命令
startup nomount
alter database mount
alter database open
5、startup restrict
约束方式启动
这种方式能够启动数据库,但只允许具有一定特权的用户访问
非特权用户访问时,会出现以下提示:
ERROR:
ORA-01035: ORACLE 只允许具有 RESTRICTED SESSION 权限的用户使用
6、startup force
强制启动方式
当不能关闭数据库时,可以用startup force来完成数据库的关闭
先关闭数据库,再执行正常启动数据库命令
7、startup pfile=参数文件名
带初始化参数文件的启动方式
先读取参数文件,再按参数文件中的设置启动数据库
例:startup pfile=E:Oracleadminoradbpfileinit.ora
8、startup EXCLUSIVE
二、用户如何有效地利用数据字典
ORACLE的数据字典是数据库的重要组成部分之一,它随着数据库的产生而产生, 随着数据库的变化而变化,
体现为sys用户下的一些表和视图。数据字典名称是大写的英文字符。
数据字典里存有用户信息、用户的权限信息、所有数据对象信息、表的约束条件、统计分析数据库的视图等。
我们不能手工修改数据字典里的信息。
很多时候,一般的ORACLE用户不知道如何有效地利用它。
dictionary 全部数据字典表的名称和解释,它有一个同义词dict
dict_column 全部数据字典表里字段名称和解释
如果我们想查询跟索引有关的数据字典时,可以用下面这条SQL语句:
SQL>select * from dictionary where instr(comments,'index')>0;
如果我们想知道user_indexes表各字段名称的详细含义,可以用下面这条SQL语句:
SQL>select column_name,comments from dict_columns where table_name='USER_INDEXES';
依此类推,就可以轻松知道数据字典的详细名称和解释,不用查看ORACLE的其它文档资料了。
下面按类别列出一些ORACLE用户常用数据字典的查询使用方法。
1、用户
查看当前用户的缺省表空间
SQL>select username,default_tablespace from user_users;
查看当前用户的角色
SQL>select * from user_role_privs;
查看当前用户的系统权限和表级权限
SQL>select * from user_sys_privs;
SQL>select * from user_tab_privs;
2、表
查看用户下所有的表
SQL>select * from user_tables;
查看名称包含log字符的表
SQL>select object_name,object_id from user_objects
where instr(object_name,'LOG')>0;
查看某表的创建时间
SQL>select object_name,created from user_objects where object_name=upper('&table_name');
查看某表的大小
SQL>select sum(bytes)/(1024*1024) as "size(M)" from user_segments
where segment_name=upper('&table_name');
查看放在ORACLE的内存区里的表
SQL>select table_name,cache from user_tables where instr(cache,'Y')>0;
3、索引
查看索引个数和类别
SQL>select index_name,index_type,table_name from user_indexes order by table_name;
查看索引被索引的字段
SQL>select * from user_ind_columns where index_name=upper('&index_name');
查看索引的大小
SQL>select sum(bytes)/(1024*1024) as "size(M)" from user_segments
where segment_name=upper('&index_name');
4、序列号
查看序列号,last_number是当前值
SQL>select * from user_sequences;
5、视图
查看视图的名称
SQL>select view_name from user_views;
查看创建视图的select语句
SQL>set view_name,text_length from user_views;
SQL>set long 2000; 说明:可以根据视图的text_length值设定set long 的大小
SQL>select text from user_views where view_name=upper('&view_name');
6、同义词
查看同义词的名称
SQL>select * from user_synonyms;
7、约束条件
查看某表的约束条件
SQL>select constraint_name, constraint_type,search_condition, r_constraint_name
from user_constraints where table_name = upper('&table_name');
SQL>select c.constraint_name,c.constraint_type,cc.column_name
from user_constraints c,user_cons_columns cc
where c.owner = upper('&table_owner') and c.table_name = upper('&table_name')
and c.owner = cc.owner and c.constraint_name = cc.constraint_name
order by cc.position;
8、存储函数和过程
查看函数和过程的状态
SQL>select object_name,status from user_objects where object_type='FUNCTION';
SQL>select object_name,status from user_objects where object_type='PROCEDURE';
查看函数和过程的源代码
SQL>select text from all_source where owner=user and name=upper('&plsql_name');
三、查看数据库的SQL
1、查看表空间的名称及大小
select t.tablespace_name, round(sum(bytes/(1024*1024)),0) ts_size
from dba_tablespaces t, dba_data_files d
where t.tablespace_name = d.tablespace_name
group by t.tablespace_name;
2、查看表空间物理文件的名称及大小
select tablespace_name, file_id, file_name,
round(bytes/(1024*1024),0) total_space
from dba_data_files
order by tablespace_name;
3、查看回滚段名称及大小
select segment_name, tablespace_name, r.status,
(initial_extent/1024) InitialExtent,(next_extent/1024) NextExtent,
max_extents, v.curext CurExtent
From dba_rollback_segs r, v$rollstat v
Where r.segment_id = v.usn(+)
order by segment_name ;
4、查看控制文件
select name from v$controlfile;
5、查看日志文件
select member from v$logfile;
6、查看表空间的使用情况
select sum(bytes)/(1024*1024) as free_space,tablespace_name
from dba_free_space
group by tablespace_name;
SELECT A.TABLESPACE_NAME,A.BYTES TOTAL,B.BYTES USED, C.BYTES FREE,
(B.BYTES*100)/A.BYTES "% USED",(C.BYTES*100)/A.BYTES "% FREE"
FROM SYS.SM$TS_AVAIL A,SYS.SM$TS_USED B,SYS.SM$TS_FREE C
WHERE A.TABLESPACE_NAME=B.TABLESPACE_NAME AND A.TABLESPACE_NAME=C.TABLESPACE_NAME;
7、查看数据库库对象
select owner, object_type, status, count(*) count# from all_objects group by owner, object_type, status;
8、查看数据库的版本
Select version FROM Product_component_version
Where SUBSTR(PRODUCT,1,6)='Oracle';
9、查看数据库的创建日期和归档方式
Select Created, Log_Mode, Log_Mode From V$Database;
Oracle数据库sqlplus常用命令
加入收藏 【大 中 小】 [ 2010-5-6 ]
-
1、得到数据库名和创建日期
SELECT name, created, log_mode, open_mode FROM v$database;
2、ORACLE数据库的计算机的主机名,ORACLE数据库的实例名及ORACLE数据库管理系统的版本信息
SELECT host_name, instance_name, version FROMv$instance;
3、为了知道oracle数据库版本的一些特殊信息
select * from v$version;
4、获取控制文件名字
select * from v$controlfile;
5、得到Oracle数据库的重做日志配置信息
SELECT group#, members, bytes, status, archived FROM v$log;
select GROUP#,MEMBER from v$logfile;
6、获取oracle的每个重做日志(成员)文件所存放的具体位置
select * from v$logfile;
7、知道ORACLE数据库的备份和恢复策略和归档文件的具体位置
archive log list
8、知道ORACLE数据库中到底有多少表空间以及每个表空间的状态
select tablespace_name, block_size, status, contents, logging from dba_tablespaces;
select tablespace_name, status from dba_tablespaces;
9、知道每个表空间存在哪个磁盘上以及文件的名字等信息
SELECT file_id, file_name, tablespace_name, status, bytes from dba_data_files;
select file_name, tablespace_name from dba_data_files;
10、知道Oracle数据库系统上到底有多少用户和都是什么时候创建的
select username,created from dba_users;
select username, DEFAULT_TABLESPACE from dba_users;
11、从控制文件中取出信息涉及到以下一些相关的命令
select * from v$archived
select * from v$archived_log
select * from v$backup
select * from v$database
select * from v$datafile
select * from v$log
select * from v$logfile
select * from v$loghist
select * from v$tablespace
select * from v$tempfile
12、控制文件由两大部份组成:可重用的部份和不可重用的部分。可重用的部分的大小可用CONTROL_FILE_RECORD_KEEP_TIME参数来控制,该参数的默认值为7天,即可重用的部份的内容保留7天,一周之后这部份的内容可能被覆盖。可重用的部份是供恢复管理器来使用的,这部份的内容可以自动扩展。Oracle数据库管理员可以使用CREAT DATABASE或CREAT CONTROLFILE语句中的下列关键字(参数)来间接影响不可重用的部份的大小:
MAXDATAFILES
MAXINSTANCES
MAXLOGFILES
MAXLOGHISTORY
MAXLOGMEMBERS
13、查看控制文件的配置
SELECT type, record_size, records_total, records_used FROM v$controlfile_record_section;
14、如果您的显示被分成了两部分,您需要使用类似于set pagesize 100的SQL*Plus命令先格式化输出。有关的格式化输出命令有以下这些:
record_size: 为每个记录的字节数。
records_total:为该段所分配的记录个数。
records_used:为该段所使用的记录个数。
15、知道控制文件中的所有数据文件(DATAFILE),表空间(TABLESPACE),和重做日志(REDO LOG)所使用的记录情况
SELECT type, record_size, records_total, records_used
FROM v$controlfile_record_section
WHERE type IN ( 'DATAFILE', 'TABLESPACE', 'REDO LOG');
16、获取控制文件名字
select value from v$parameter where name ='control_files';
或者:select * from v$controlfile
17、如何在一个已经安装的Oracle数据库中添加或移动控制文件呢?
以下是在一个已经安装的Oracle数据库中添加或移动控制文件的具体步骤:
a、利用数据字典v$controlfile来获取现有控制文件名字。
b、正常关闭Oracle数据库。
c、将新的控制文件名添加到参数文件的CONTROL_FILES参数中。
d、使用操作系统的复制命令将现有控制文件复制到指定位置。
e、重新启动Oracle数据库。
f、利用数据字典v$controlfile来验证新的控制文件名字是否正确。
g、如果有误重做上述操作,如果无误删除无用的旧控制文件。
注:如果您使用了服务器初始化参数文件(SPFILE),您不能关闭Oracle数据库而且应该在第3步使用alter system set control_files的Oracle命令来改变控制文件的位置。
SQL> alter system set control_files =
'D:\Disk3\CONTROL01.CTL',
'D:\Disk6\CONTROL02.CTL',
'D:\Disk9\CONTROL03.CTL' SCOPE=SPFILE;
18、由于控制文件是一个极其种要的文件,除了以上所说的将控制文件的多个副本存在不同的硬盘上的保护措施外,在数据库的结构变化之后,您应立即对控制文件进行备份。可以用Oracle命令来对控制文件进行备份:
alter database backup controlfile to 'D:\backup\control.bak';
19、您也可将备份到一个追踪文件中。该追踪文件包含有重建控制文件所需的SQL语句。可使用以下SQL语句来产生这一追踪文件:
alter database backup controlfile to trace;
20、正常关闭oracle命令
shutdown immeditae
(a)ppend 添加文本到缓冲区当前行尾a order by tname 结果:select * from tab order by tname;
(注:a后面跟2个空格)
(c)hange/old/new 在当前行用新的文本替换旧的文本 c/*/tname 结果:select tname from tab;
(c)hange/text从当前行删除文本(c/tab 结果:select tname from ;
del 删除当前行
del n删除第n行
(i)nput 文本 在当前行之后添加一行
(l)ist 显示缓冲区中所有行
(l)ist n 显示缓冲区中第 n 行
(l)ist m n 显示缓冲区中 m 到 n 行
run 执行当前缓冲区的命令
/执行当前缓冲区的命令
r执行当前缓冲区的命令
@文件名 运行调入内存的sql文件,如:
SQL>; edit s<回车>;
假如当前目录下不存在s.sql文件,则系统自动生成s.sql文件,
在其中输入“select * from tab;”,存盘退出。
SQL>; @s<回车>;
@
系统会自动查询当前用户下的所有表、视图、同义词。
@@文件名 在.sql文件中调用令一个.sql文件时使用
save 文件名 将缓冲区的命令以文件方式存盘,缺省文件扩展名为.sql
get 文件名 调入存盘的sql文件
start 文件名 运行调入内存的sql文件
spool 文件名 把这之后的各种操作及执行结果“假脱机”即存盘到磁盘文件上,默认文件扩展名为.lst
spool显示当前的“假脱机”状态
spool off停止输出
例:
SQL>; spool a
SQL>; spool
正假脱机到 A.LST
SQL>; spool off
SQL>; spool
当前无假脱机
exit 退出SQL*PLUS
desc 表名显示表的结构
show user显示当前连接用户
show error 显示错误
show all 显示所有68个系统变量值
edit 打开默认编辑器,Windows系统中默认是notepad.exe,把缓冲区中最后一条SQL语句调入afiedt.buf文件中进行编辑
edit 文件名 把当前目录中指定的.sql文件调入编辑器进行编辑
clear screen 清空当前屏幕显示
=======================================================================================
练习题
CREATE TABLE STUDENTS
(
NO VARCHAR2(3) primary key,
NAME VARCHAR2(4) NOT NULL,
SEX VARCHAR2(2) default '男' check(sex in('男','女','中')),
BIRTHDAY DATE unique,
CLASS VARCHAR2(5)
);
CREATE TABLE COURSES
(
NO VARCHAR2(5) primary key,
NAME VARCHAR2(10) NOT NULL,
TEACHER_NO VARCHAR2(10),
constraint courses_teacher_no_fk foreign key(teacher_no) references teachers(no)
);
CREATE TABLE SCORES
(
STUDENT_NO VARCHAR2(3),
COURSE_NO VARCHAR2(5),
DEGREE NUMBER(10, 1) NOT NULL
);
CREATE TABLE TEACHERS
(
NO VARCHAR2(3) primary key,
NAME VARCHAR2(4) NOT NULL,
SEX VARCHAR2(2) default '男' check(sex in('男','女','中')),
BIRTHDAY DATE unique,
PROF VARCHAR2(6),
DEPART VARCHAR2(10) NOT NULL
);
CREATE TABLE GRADES
(
RANK CHAR(1) primary key,
LOW NUMBER(3,0) NOT NULL,
UPP NUMBER(3,0) NOT NULL
);
INSERT INTO STUDENTS VALUES ('108', '曾华', '男' ,to_date('1977-09-01', 'yyyy-mm-dd'), '95033');
INSERT INTO STUDENTS VALUES ('105', '匡明', '男' ,to_date('1975-10-02', 'yyyy-mm-dd'), '95031');
INSERT INTO STUDENTS VALUES ('107', '王丽', '女' ,to_date('1976-01-23', 'yyyy-mm-dd'), '95033');
INSERT INTO STUDENTS VALUES ('101', '李军', '男' ,to_date('1976-02-20', 'yyyy-mm-dd'), '95033');
INSERT INTO STUDENTS VALUES ('109', '王芳', '女' ,to_date('1975-02-10', 'yyyy-mm-dd'), '95031');
INSERT INTO STUDENTS VALUES ('103', '陆君', '男' ,to_date('1974-06-03', 'yyyy-mm-dd'), '95031');
INSERT INTO COURSES VALUES ('3-105', '计算机导论', '825');
INSERT INTO COURSES VALUES ('3-245', '操作系统', '804');
INSERT INTO COURSES VALUES ('6-166', '数据电路', '856');
INSERT INTO COURSES VALUES ('9-888', '高等数学', '831');
INSERT INTO SCORES VALUES ('103', '3-245', 86);
INSERT INTO SCORES VALUES ('105', '3-245', 75);
INSERT INTO SCORES VALUES ('109', '3-245', 68);
INSERT INTO SCORES VALUES ('103', '3-105', 92);
INSERT INTO SCORES VALUES ('105', '3-105', 88);
INSERT INTO SCORES VALUES ('109', '3-105', 76);
INSERT INTO SCORES VALUES ('101', '3-105', 64);
INSERT INTO SCORES VALUES ('107', '3-105', 91);
INSERT INTO SCORES VALUES ('108', '3-105', 78);
INSERT INTO SCORES VALUES ('101', '6-166', 85);
INSERT INTO SCORES VALUES ('107', '6-106', 79);
INSERT INTO SCORES VALUES ('108', '6-166', 81);
INSERT INTO TEACHERS VALUES ('804', '李诚', '男', to_date('1958-12-02', 'yyyy-mm-dd'), '副教授', '计算机系');
INSERT INTO TEACHERS VALUES ('856', '张旭', '男', to_date('1969-03-12', 'yyyy-mm-dd'), '讲师', '电子工程系');
INSERT INTO TEACHERS VALUES ('825', '王萍', '女', to_date('1972-05-05', 'yyyy-mm-dd'), '助教', '计算机系');
INSERT INTO TEACHERS VALUES ('831', '刘冰', '女', to_date('1977-08-14', 'yyyy-mm-dd'), '助教', '电子工程系');
INSERT INTO GRADES VALUES('A', 90, 100);
INSERT INTO GRADES VALUES('B', 80, 89);
INSERT INTO GRADES VALUES('C', 70, 79);
INSERT INTO GRADES VALUES('D', 60, 69);
INSERT INTO GRADES VALUES('E', 0, 59);
练习题目:
首先画出表的关系图
1、 查询STUDENTS表中的所有记录的NAME、SEX和CLASS列。
select name,sex,class from students;
2、 查询教师所有的单位即不重复的DEPART列。
select distinct depart from teachers;
3、 查询STUDENTS表的所有记录。
select * from students;
4、 查询SCORES表中成绩在60到80之间的所有记录。
select * from scores where degree between 60 and 80;
5、 查询SCORES表中成绩为85,86或88的记录。
select * from scores where degree in(85,86,88) ;
6、 查询STUDENTS表中“95031”班或性别为“女”的同学记录。
select * from students where class=95031 or sex='女';
7、 以CLASS降序查询STUDENTS表的所有记录。
select * from students order by class desc;
8、 以NO升序、DEGREE降序查询SCORES表的所有记录。
select * from scores order by no,degree desc;
9、 查询“95031”班的学生人数。
select count(no) from students where class=95031;
10、查询SCORES表中的最高分的学生学号和课程号。
select student_no,course_no from scores where degree=(select max(degree) from scores);
11、查询‘3-105’号课程的平均分。
select avg(degree) from scores where course_no='3-105';
12、查询SCORES表中至少有5名学生选修的并以3开头的课程的平均分数。
select avg(degree) from scores where course_no like '3%' group by course_no having count(*)>5;
13、查询最低分大于70,最高分小于90的NO列。
select course_no from scores group by course_no having min(degree)>70 and max(degree)<90;
14、查询所有学生的NAME、NO和DEGREE列。
select st.name,st.no,sc.degree from students st,scores sc where st.no=sc.student_no;
15、查询所有学生的NO、NAME和DEGREE列。
16、查询所有学生的NAME、NAME和DEGREE列。学生名,课程名
17、查询“95033”班所选课程的平均分。
select sc.course_no,avg(sc.degree) from scores sc,students st where st.no=sc.student_no and st.class=95033 group by sc.course_no;
18、查询所有同学的NO、NO和RANK列。课程号,学号
select st.no,sc.course_no,gr.rank from students st,scores sc,grades gr where st.no=sc.student_no and sc.degree between gr.low and gr.upp;
19、查询选修“3-105”课程的成绩高于“109”号同学成绩的所有同学的记录。
select * from students st,scores sc where st.no=sc.student_no and sc.course_no='3-105' and sc.degree>(select degree from scores where student_no=109 and course_no='3-105');
20、查询SCORE中选学一门以上课程的同学中分数为非最高分成绩的记录。
select * from scores sc,(select course_no,max(degree) 最高分 from scores group by course_no) m,(select student_no,count(course_no) 课程数 from scores group by student_no) p where sc.course_no=m.course_no and p.student_no=sc.student_no and p.课程数>1 and sc.degree<>m.最高分;
21、查询成绩高于学号为“109”、课程号为“3-105”的成绩的所有记录。
select * from scores where degree>(select degree from scores where student_no=109 and course_no='3-105');
22、查询和学号为108的同学同年出生的所有学生的NO、NAME和BIRTHDAY列。
select no,name,birthday from students where to_char(birthday,'yyyy') =to_char((select birthday from students where no=108),'yyyy');
23、查询“张旭“教师任课的学生成绩。
select * from scores s,teachers t,courses c where t.no=c.teacher_no and c.no=s.course_no and t.name='张旭';
24、查询选修某课程的同学人数多于5人的教师姓名。
select distinct t.name from teachers t,scores s,courses c,(select course_no,count(student_no) 人数 from scores group by course_no) p where t.no=c.teacher_no and c.no=s.course_no and p.course_no=s.course_no and p.人数>5;
select name from teachers where no=(select courses.teacher_no from courses,scores where courses.no=scores.course_no group by scores.course_no having count(scores.student_no)>5);
25、查询95033班和95031班全体学生的记录。
select * from students where class=95033 or class=95031;
26、查询存在有85分以上成绩的课程NO.
select distinct course_no from scores where degree>85;
27、查询出“计算机系“教师所教课程的成绩表。
select * from scores where no in(select x.no from courses x,teachers y where y.no=x.no and y.depart='计算机系');
28、查询“计算机系”与“电子工程系“不同职称的教师的NAME和PROF。
select distinct e.name,e.prof from teachers e,teachers f where e.depart<>f.depart and e.prof<>f.prof;
29、查询选修编号为“3-105“课程且成绩至少高于选修编号为“3-245”的同学的STUDENT_NO、COURSE_NO和DEGREE,并按DEGREE从高到低次序排序。
select student_no,course_no,degree from scores where course_no='3-105' and degree>any(select degree from scores where course_no='3-245');
30、查询选修编号为“3-105”且成绩高于选修编号为“3-245”课程的同学的STUDENT_NO、STUDENT_NO和DEGREE.
select student_no,course_no,degree from scores where course_no='3-105' and degree>all(select degree from scores where course_no='3-245');
31、查询所有教师和同学的NAME、SEX和BIRTHDAY.
select s.name,s.sex,s.birthday,t.name,t.sex,t.birthday from students s,teachers t,courses c,scores r where c.no=r.course_no and c.teacher_no=t.no and s.no=r.student_no;
32、查询所有“女”教师和“女”同学的NAME、SEX和BIRTHDAY.
select s.name,s.sex,s.birthday,t.name,t.sex,t.birthday from students s,teachers t,courses c,scores r where c.no=r.course_no and c.teacher_no=t.no and s.no=r.student_no and t.sex='女' and s.sex='女';
33、查询成绩比该课程平均成绩低的同学的成绩表。
select * from scores s,(select course_no,avg(degree) 平均成绩 from scores group by course_no) avg where avg.course_no=s.course_no and degree<平均成绩;
34、查询所有任课教师的NAME和DEPART.
select distinct t.name,t.depart from teachers t,courses c,scores s where t.no=c.teacher_no and c.no=s.course_no and c.no in(select distinct course_no from scores);
35 查询所有未讲课的教师的NAME和DEPART.
select distinct t.name,t.depart from teachers t,courses c,scores s where t.no=c.teacher_no and c.no=s.course_no and s.course_no in(select distinct course_no from scores);
36、查询至少有2名男生的班号。
select class from students where sex='男' group by class having count(*)>2;
37、查询STUDENTS表中不姓“王”的同学记录。
select * from students where name not like '王%';
38、查询STUDENTS表中每个学生的姓名和年龄。
select name,to_char(sysdate,'yyyy')-to_char(birthday,'yyyy') 年龄 from students;
39、查询STUDENTS表中最大和最小的BIRTHDAY日期值。
select min(to_char(birthday,'dd')),max(to_char(birthday,'dd')) from students;
40、以班号和年龄从大到小的顺序查询STUDENTS表中的全部记录。
select * from students order by class desc,birthday;
41、查询“男”教师及其所上的课程。
select t.name,c.name from teachers t,courses c where t.sex='男' and t.no=c.teacher_no;
42、查询最高分同学的STUDENT_NO、COURSE_NO和DEGREE列。
select s.student_no,s.course_no,s.degree from scores s,(select max(degree) 最高分 from scores group by course_no) p where s.degree=p.最高分;
43、查询和“李军”同性别的所有同学的NAME.
select name from students where sex=(select sex from students where name='李军');
44、查询和“李军”同性别并同班的同学NAME.
select name from students where sex=(select sex from students where name='李军') and (select class from students where name='李军');
45、查询所有选修“计算机导论”课程的“男”同学的成绩表
select * from scores where student_no in(select no from students where sex='男') and course_no=(select no from courses where name='计算机导论');