`
jy02362711
  • 浏览: 3241 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论
阅读更多
CMD宽度17寸普通为120就行
千万级,WIN百万级


物理文件:c;\oracle\oradata\myoracle目录下
1.数据文件.DBF 
2.日志文件.LOG
3.控制文件.CTL


PL/SQL,是可以集合SQL的.因为SQL每次只能发一条.
SQL *Plus是Oracle公司提供的一个工具程序.,用于运行SQL和PL/SQL块,可以命令行也可以WINDOWS运行.WEB页面运行--iSQL*Plus
SQL语言分类.
1.数据查询语言SELECT语句.
2.数据操纵语言DML:改变数据INSERT插入,UPDATE更新,DELETE删除
3.事务控制语言DCL:维护数据一致性.COMMIT确认已经进行的数据库改变.ROLLBACK(rollback to ...)
  回滚进行的数据库改变.SAVEPOINT设置保存点(上面不能回滚).
4.数据定义语言DDL:数据库对象操作,会自动提交事务.如CREATE TABLE建表,ALTER TABLE修改表结构,DROP TABLE删除表.
5.数据控制语言,会自动提交事务.GRANT用于给用户授予权限,REVOKE收回用户权限.

SQL规则:
关键字,对象名,列名不区分大小写.
字符值和日期值区分大小写.
命令可以多行写,SQL*Pluse中以分号结束


sqlplus boolean
登录:telnet 192.168.0.100
用户密码  super  boolean 建一个自己目录用来测试,再进SQL
         再转到   sqlplus boolean/boolean 登录后!命令,来运行SHELL命令如!ls exit退出
数据库例子:s_emp s_dept my_emp my_dept
查询表结构desc s_emp;


命令
spool fileName 用来记录屏幕显示一切 spool off停止,生成一个文件,可以查看!cat on.lst
l列出历史命令,用数字设置为当前. clear buff清除操作缓存 ed直接修改命令
c/s_emp/abc; //把当前行的s_emp改为abc
a追回 del删除当前行
/执行当前行.
save 文件名 //把历史命令保存到文件,后缀为sql  save aa replace可以覆盖aa
get 文件名 //查看历史命令文件
edit 文件名 //编辑历史命令文件或ed
start filename  //或者@ filename,用来执行文件
col first_name for a10; //改变显示列宽 first_name为列 col first_name;显示出来 col first_name clear;清空
col salary for a10; //有时定义number(30)等太长了
默认80  show linesize set linesize 150;
set pause on;分屏显示开,回车显示下一屏.off关



第一二章.语句 字符和日期要加上' ',别名是" "
1.查询select
select id,first_name,salary*12 from s_emp; //测试.,一年工资
select salary*12 "Annual Salary",salary "Month Salary" from s_emp; //别名显示
select last_name||salary from s_emp; //把多列并在列显示||
select last_name||' salary is'||salary from s_emp;  //显示中间加上一些注释 '''is'表示'is

2.条件where
select * from t_emp where age>28; //年龄大于28的
=,!= <>,>=,<=,>,<  and,or,not,between..and.在两者之间(包含这二个)  in like is null是空
where hiredate>to_date('2007-03-10','yyyy-mm-dd'),日期匹配,用前面的函数也行
aaa like 's%',aaa列首字符为s的.  where emp_name like '%a%';包含a字符的  //   %表示多个字符,_表示单个
like 'd\_%' escape '\',表示找d_,escape代表把字符当转义字符.@
aaa in (800,1250)  aaa为800和1250的  select * from my_emp where age not in(11,20);  not in

3.排序order by(放在最后)
select emp_name,salary from t_emp order by salary; 从小到大,by salary desc;从大到小.by 5,按第5列.可以有两个参数,先按第一个
order by .....desc,....desc;二个以上降序.空值在排序中代表最大.

第三章 单行函数
第四章
连接查询-查多个表或视图..,在from语句后加上多个表名.如果列名不同,列名前可以不加表名.
员工表t_emp  部门表t_dept //表也可以用别名,但别处一定要用别名处理.
1,相等连接,where要加上表间的关连.如表.id=另表的.id,可以加and语句再判断条件.
SQL> select emp_name "username",salary,t_dept.dept_name "dept name"
  2  from t_emp,t_dept
  3  where t_emp.dept_id=t_dept.dept_id; //两表查询,第一4条,第二4条,没有这句就重复4次显示
//where t_emp.dept_id(+)=t_dept.dept_id;表示没有关连的dept_id,即表示可显示emp表中的没有关系到的
SQL> l
  1  select emp_name "username",salary,t_dept.dept_name "dept name"
  2  from t_emp,t_dept
  3* where t_emp.emp_id=6 and t_emp.dept_id=t_dept.dept_id
2,不等连接.除=以外.
3.自连接,在同一张表之间的连接查询,主要用在显示上下级关系或者层次关系上.
empno ename mgr
7839 king
4566 jones 7839
7698 blake 7839
7782 clark 7839
显示blake的领导即king
找开发者管理员
select manager.ename from emp manager,emp worker
where manager.empno=worker.mgr
and worker.ename='blake';
SQL> select * from adam_emp;

    EMP_ID EMP_NAME     MANAGER_ID JOB
---------- ------------ ---------- ------------------------
         1 a                     3 developer
         2 b                     3 developer
         3 c                     3 developer
         4 d                     5 sales
         5 e                     5 sales

SQL> select a.emp_id,a.emp_name,a.job from adam_emp a,adam_emp b
  2  where a.emp_id=b.manager_id
  3  and a.emp_id=b.emp_id and b.job like 'd%';

    EMP_ID EMP_NAME     JOB
---------- ------------ ------------------------
         3 c            developer

4.内连接和外(左,右,全)连接.用于没有关连的也要列出.


左连接或右连接.
测试+号,只能用一个+
my_emp表
EMP_ID EMP_NAME     GENDER              AGE     SALARY    DEPT_ID HIREDATE
---------- ------------ ------------ ---------- ---------- ---------- ---------
         1 winny        male                 22      16688          3 23-APR-07
         2 yao          male                 27      10000          2 22-APR-07
         5 nash         female               28       6000          1 24-MAR-07
         6 hei          male                 30       5000          1 22-FEB-07
         7 d_a          male                 11       9999          2 13-APR-07
         8 d_b          female               20       2000          5 20-APR-07
my_dept表
DEPT_ID DEPT_NAME  EMP_COUNTS
---------- ---------- ----------
         1 hr                  2
         2 it                 10
         3 sales               3
         4 cleak               6

SQL> select e.emp_name,e.salary,e.dept_id,nvl(d.dept_name,'is null')
  2  from my_emp e,my_dept d
  3  where d.dept_id(+)=e.dept_id; //可以显示e.dept_id齐


EMP_NAME         SALARY    DEPT_ID NVL(D.DEPT_NAM
------------ ---------- ---------- --------------
nash               6000          1 hr
hei                5000          1 hr
yao               10000          2 it
d_a                9999          2 it
winny             16688          3 sales
d_b                2000          5 is null
+号不通用.一般用

select nvl(e.emp_name,'emp not exist') "emp name",
nvl(d.dept_name,'dept not exist') "dept name",
nvl(d.emp_counts,0) "emp counts"
from my_emp e left outer join my_dept d
//left显示左边的   right跟后面  on顺序没关系 full全连接
on e.dept_id=d.dept_id; //from 表 full outer join 另表 on等于where

emp name                   dept name                    emp counts
-------------------------- ---------------------------- ----------
hei                        hr                                    2
nash                       hr                                    2
d_a                        it                                   10
yao                        it                                   10
winny                      sales                                 3
d_b                        dept not exist                        0


第五章 数据分组-统计,平均等.
最多只能嵌套二层.
1,分组函数  group by aa  当aa也参与了运算
select sum(salary),max(salary),min(salary),avg(salary) from my_emp; //总数,最大值,最小值,平均值 count(*)总行数
select avg(salary),dept_id from my_emp; //不知哪个ID.  加上group by dept_id;
select count(*) from t_emp where sex='man';找有多少个男的,如果*包含重复和空,带列则不为空.
当使用分组函数时,分组函数只有出现在选择列表,ORDER BY和HAVING子句中.而不能出现在WHERE和GROUP BY子句中.
除了COUNT(*)外,其他都会忽略NULL行.
SELECT,如果同时包含列,表达式和分组函数,那么这些列和表达式必须出现在GROUP BY子句中.
可以指定ALL选项默认,DISTINCT选项.ALL统计所有行包括重复行,DISTINCT只会统计不同行值.;后加上distinct 列
限制条件于group by ...  having avg(sal)<2000.平均值大于2000的组
SQL> select avg(salary),dept_id
  2  from my_emp
  3  group by dept_id //group by可以多个
  4  having avg(salary)>6000;
在统计下再统计.group by rollup横向统计   group by cube 在rollup纵横都有
第六章 子查询
子查询是嵌套查询.先执行.可以放在WHERE或FROM,having等
1,返回单个可以用=>等比较.
2.返回多个,可以in(取任一个),all,any(任一个值,all,any不能单独用,要与=><>等一起用.)
===================================================================================================
SQL> @my_emp

    EMP_ID EMP_NAME     GENDER              AGE     SALARY    DEPT_ID HIREDATE
---------- ------------ ------------ ---------- ---------- ---------- ---------
         1 winny        male                 22      16688          3 23-APR-07
         2 winny        male                 27      10000          2 22-APR-07
         5              female               28       6000          1 24-MAR-07
         6 hei          male                 30       5000          1 22-FEB-07
         7 d_a          male                 11          0          2 13-APR-07
         8 d_b          female               20       2000          5 20-APR-07

6 rows selected.

SQL> @my_dept

   DEPT_ID DEPT_NAME  EMP_COUNTS
---------- ---------- ----------
         1 hr                  2
         2 it                 10
         3 sales               3
         4 cleak               6
找出部门是IT的员工信息
select e.emp_name,d.dept_name
from my_emp e,my_dept d
where e.dept_id=(select dd.dept_id from my_dept dd where dd.dept_name='it') and e.dept_id=d.dept_id; //=后面返回只能单一
===================================================================================================
部门员工工资>平均工资的部门
select e.emp_name "emp name",e.dept_id "dept id",e.salary "salary"
from my_emp e,(select dept_id,avg(salary) avgsalary from my_emp group by dept_id) d
where e.dept_id=d.dept_id and e.salary>d.avgsalary;
===================================================================================================
平均工资比最小的平均工资要大的部门
select dept_id,avg(salary)
from my_emp
group by dept_id
having avg(salary)>(select min(avg(salary))
from my_emp group by dept_id);
===================================================================================================
SQL> desc t_emp;
名称                                      是否为空? 类型
----------------------------------------- -------- ---------------------
ID                                                 NUMBER(2)
SEX                                                VARCHAR2(6)
AGE                                                NUMBER(2)
DEPT                                               NUMBER(3)
SALARY                                             NUMBER(6)

SQL> desc t_dept;
名称                                      是否为空? 类型
----------------------------------------- -------- ---------------------
ID                                                 NUMBER(2)
DEPT_NAME                                          VARCHAR2(5)
PHONE                                              NUMBER(6)
题目:统计每个部门部同性别的人数
select dept "部门",decode(e.sex,'male',count(sex))
"男性人数",decode(e.sex,'female',count(sex)) "女性人数" from t_emp
e,t_dept d where e.dept=d.id group by sex,dept;
==========================================================================================
有一张表t_score,结构如下:
姓名   科目    分数
张三   语文    90
张三   数学    85
张三   英语    80
李四   语文    88
李四   数学    80
李四   英语    93
怎样用select语句把上表显示成如下结构:
姓名   语文  数学  英语 
张三   90    85    80
李四   88    80    93
解答例如这样
select distinct a.name,(select distinct score from t_score where course='java' and name=a.name) Java,(select distinct score from t_score where course='c++' and name=a.name) Oracle,(select distinct score from t_score where course='oralce' and name=a.name) Oracle from t_score a;
第7章 运行时指定变量
set verify on show verify
SQL> select * from my_emp where age>&age;  //Enter value for age: //&可以出现在任何地方,后面加的是提示,输入值不用;结束
     select &column from my_emp where age>20; //'&jskj',输入是字符或日期,就不用''了
//定义变量(只能是字符)define gender=male; ='&gender'直接用变量     查询已定义变量define gender  undefine解除
//改提示accept gender prompt 'Please Input Yours Gender:'hide  //hide为隐藏,可以不要

第八章 数据模型和数据库设计的概观
#* id    唯一非空
* last name 非空
o first name可选
范式的表就是描述多个表和关系,多个表存在这个表中.
二范表是消除部分依赖.



外联接。外联接可以是左向外联接、右向外联接或完整外部联接。
在 FROM 子句中指定外联接时,可以由下列几组关键字中的一组指定:
LEFT JOIN 或 LEFT OUTER JOIN。
左向外联接的结果集包括 LEFT OUTER 子句中指定的左表的所有行,而不仅仅是联接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值。

RIGHT JOIN 或 RIGHT OUTER JOIN。
右向外联接是左向外联接的反向联接。将返回右表的所有行。如果右表的某行在左表中没有匹配行,则将为左表返回空值。

FULL JOIN 或 FULL OUTER JOIN。
完整外部联接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值。

仅当至少有一个同属于两表的行符合联接条件时,内联接才返回行。内联接消除与另一个表中的任何行不匹配的行。而外联接会返回 FROM 子句中提到的至少一个表或视图的所有行,只要这些行符合任何 WHERE 或 HAVING 搜索条件。将检索通过左向外联接引用的左表的所有行,以及通过右向外联接引用的右表的所有行。完整外部联接中两个表的所有行都将返回。







表操作
例 1 对于表的教学管理数据库中的表 STUDENTS ,可以定义如下:
Create TABLE STUDENTS
(SNO NUMERIC (6, 0) NOT NULL
SNAME CHAR (8) NOT NULL
AGE NUMERIC(3,0)
SEX CHAR(2)
BPLACE CHAR(20)
PRIMARY KEY(SNO))
例 2 对于表的教学管理数据库中的表 ENROLLS ,可以定义如下:
Create TABLE ENROLLS
(SNO NUMERIC(6,0) NOT NULL
CNO CHAR(4) NOT NULL
GRADE INT
PRIMARY KEY(SNO,CNO)
FOREIGN KEY(SNO) REFERENCES STUDENTS(SNO)
FOREIGN KEY(CNO) REFERENCES COURSES(CNO)
CHECK ((GRADE IS NULL) or (GRADE BETWEEN 0 AND 100)))
例 3 根据表的 STUDENTS 表,建立一个只包含学号、姓名、年龄的女学生表。
Create TABLE GIRL
AS Select SNO, SNAME, AGE
FROM STUDENTS
Where SEX=' 女 ';
例 4 删除教师表 TEACHER 。
Drop TABLE TEACHER
例 5 在教师表中增加住址列。
Alter TABLE TEACHERS
ADD (ADDR CHAR(50))
例 6 把 STUDENTS 表中的 BPLACE 列删除,并且把引用 BPLACE 列的所有视图和约束也一起删除。
Alter TABLE STUDENTS
Drop BPLACE CASCADE
例 7 补充定义 ENROLLS 表的主关键字。
Alter TABLE ENROLLS
ADD PRIMARY KEY (SNO,CNO) ;

视图操作(虚表)

例 9 建立一个只包括教师号、姓名和年龄的视图 FACULTY 。 ( 在视图定义中不能包含 orDER BY 子句 )
Create VIEW FACULTY
AS Select TNO, TNAME, AGE
FROM TEACHERS
例 10 从学生表、课程表和选课表中产生一个视图 GRADE_TABLE , 它包括学生姓名、课程名和成绩。
Create VIEW GRADE_TABLE
AS Select SNAME,CNAME,GRADE
FROM STUDENTS,COURSES,ENROLLS
Where STUDENTS.SNO = ENROLLS.SNO AND
COURSES.CNO=ENROLLS.CNO
例 11 删除视图 GRADE_TABLE
Drop VIEW GRADE_TABLE RESTRICT

索引操作

例 12 在学生表中按学号建立索引。
Create UNIQUE INDEX ST
ON STUDENTS (SNO,ASC)
例 13 删除按学号所建立的索引。
Drop INDEX ST

数据库模式操作

例 14 创建一个简易教学数据库的数据库模式 TEACHING_DB ,属主为 ZHANG 。
Create SCHEMA TEACHING_DB AUTHRIZATION ZHANG
例 15 删除简易教学数据库模式 TEACHING_DB 。
(( 1 )选用 CASCADE ,即当删除数据库模式时,则本数据库模式和其下属的基本表、视图、索引等全部被删除。
( 2 )选用 RESTRICT ,即本数据库模式下属的基本表、视图、索引等事先已清除,才能删除本数据库模式,否则拒绝删除。)
Drop SCHEMA TEACHING_DB CASCADE

单表操作

例 16 找出 3 个学分的课程号和课程名。
Select CNO, CNAME
FROM   COURSES
Where   CREDIT = 3
例 17 查询年龄大于 22 岁的学生情况。
Select *
FROM STUDENTS
Where AGE > 22
例 18 找出籍贯为河北的男生的姓名和年龄。
Select SNAME, AGE
FROM   STUDENTS
Where   BPLACE = ' 河北 ' AND SEX = ' 男 '
例 19 找出年龄在 20 ~ 23 岁之间的学生的学号、姓名和年龄,并按年龄升序排序。
(ASC (升序)或 DESC (降序)声明排序的方式,缺省为升序。 )
Select SNO, SNAME, AGE
FROM STUDENTS
Where AGE BETWEEN 20 AND 23
orDER BY AGE
例 20 找出年龄小于 23 岁、籍贯是湖南或湖北的学生的姓名和性别。
(条件比较运算符=、< 和逻辑运算符 AND (与),此外还可以使用的运算符有:>(大于)、>=(大于等于)、<=(小于等于)、<>(不等于)、 NOT (非)、 or (或)等。
谓词 LIKE 只能与字符串联用,常常是 “ <列名> LIKE pattern” 的格式。特殊字符 “_” 和 “%” 作为通配符。
谓词 IN 表示指定的属性应与后面的集合(括号中的值集或某个查询子句的结果)中的某个值相匹配,实际上是一系列的 or (或)的缩写。谓词 NOT IN 表示指定的属性不与后面的集合中的某个值相匹配。
谓词 BETWEEN 是 “ 包含于 … 之中 ” 的意思。)
Select SNAME, SEX
FROM STUDENTS
Where AGE < 23 AND BPLACE LIKE' 湖% '

Select SNAME, SEX
FROM STUDENTS
Where AGE < 23 AND BPLACE IN ( ' 湖南 ' , ' 湖北 ' )
例 22 找出学生表中籍贯是空值的学生的姓名和性别。
(在 SQL 中不能使用条件:<列名>= NULL 。在 SQL 中只有一个特殊的查询条件允许查询 NULL 值:)
Select SNAME, SEX
FROM STUDENTS
Where BPLACE IS NULL

多表操作

例 23 找出成绩为 95 分的学生的姓名。(子查询)
Select SNAME
FROM   STUDENTS
Where   SNO =
(Select SNO
FROM ENROLLS
Where GRADE = 95)
例 24 找出成绩在 90 分以上的学生的姓名。
Select SNAME
FROM STUDENTS
Where SNO IN
(Select SNO
FROM ENROLLS
Where GRADE > 90)

Select SNAME
FROM STUDENTS
Where SNO = ANY
(Select SNO
FROM ENROLLS
Where GRADE > 90)
例 25 查询全部学生的学生名和所学课程号及成绩。(连接查询)
Select SNAME, CNO, GRADE
FROM STUDENTS, ENROLLS
Where STUDENTS.SNO = ENROLLS.SNO
例 26 找出籍贯为山西或河北,成绩为 90 分以上的学生的姓名、籍贯和成绩。(当构造多表连接查询命令时,必须遵循两条规则。第一,连接条件数正好比表数少 1 (若有三个表,就有两个连接条件 ) ;第二,若一个表中的主关键字是由多个列组成,则对此主关键字中的每一个列都要有一个连接条件(也有少数例外情况))
Select SNAME, BPLACE, GRADE
FROM STUDENTS, ENROLLS
Where BPLACE IN (‘ 山西 ’ , ‘ 河北 ’) AND GRADE >= 90 AND   STUDENTS.SNO=ENROLLS.SNO
例 28 查出课程成绩在 80 分以上的女学生的姓名、课程名和成绩。( FROM 子句中的子查询)
Select SNAME,CNAME, GRADE
FROM (Select SNAME, CNAME , GRADE
FROM STUDENTS, ENROLLS,COURSES
Where SEX = ' 女 ')
AS TEMP (SNAME, CNAME,GRADE)
Where GRADE > 80


表达式与函数的使用

例 29 查询各课程的学时数。(算术表达式由算术运算符+、-、 * 、/与列名或数值常量所组成。)
Select CNAME,COURSE_TIME = CREDIT*16
FROM COURSES
例 30 找出教师的最小年龄。(内部函数: SQL 标准中只使用 COUNT 、 SUM 、 AVG 、 MAX 、 MIN 函数,称之为聚集函数( Set Function )。 COUNT 函数的结果是该列统计值的总数目, SUM 函数求该列统计值之和, AVG 函数求该列统计值之平均值, MAX 函数求该列最大值, MIN 函数求该列最小值。)
Select MIN(AGE)
FROM TEACHERS
例 31 统计年龄小于等于 22 岁的学生人数。(统计)
Select COUNT(*)
FROM STUDENTS
Where AGE < = 22
例 32 找出学生的平均成绩和所学课程门数。
Select SNO, AVG(GRADE), COURSES = COUNT(*)
FROM ENROLLS
GROUP BY SNO

例 34 找出年龄超过平均年龄的学生姓名。
Select SNAME
FROM STUDENTS
Where AGE >
(Select AVG(AGE)
FROM STUDENTS)
例 35 找出各课程的平均成绩,按课程号分组,且只选择学生超过 3 人的课程的成绩。( GROUP BY 与 HAVING
GROUP BY 子句把一个表按某一指定列(或一些列)上的值相等的原则分组,然后再对每组数据进行规定的操作。
GROUP BY 子句总是跟在 Where 子句后面,当 Where 子句缺省时,它跟在 FROM 子句后面。
HAVING 子句常用于在计算出聚集之后对行的查询进行控制。)
Select CNO, AVG(GRADE), STUDENTS = COUNT(*)
FROM ENROLLS
GROUP BY CNO
HAVING COUNT(*) >= 3

相关子查询

例 37 查询没有选任何课程的学生的学号和姓名。(当一个子查询涉及到一个来自外部查询的列时,称为相关子查询( Correlated Subquery) 。相关子查询要用到存在测试谓词 EXISTS 和 NOT EXISTS ,以及 ALL 、 ANY ( SOME )等。)
Select SNO, SNAME
FROM STUDENTS
Where NOT EXISTS
(Select *
FROM ENROLLS
Where ENROLLS.SNO=STUDENTS.SNO)
例 38 查询哪些课程只有男生选读。
Select DISTINCT CNAME
FROM COURSES C
Where ' 男 ' = ALL
(Select SEX
FROM ENROLLS , STUDENTS
Where ENROLLS.SNO=STUDENTS.SNO AND
ENROLLS.CNO=C.CNO)
例 39 要求给出一张学生、籍贯列表,该表中的学生的籍贯省份,也是其他一些学生的籍贯省份。
Select SNAME, BPLACE
FROM STUDENTS A
Where EXISTS
(Select *
FROM STUDENTS B
Where A.BPLACE=B.BPLACE AND
A.SNO < > B.SNO)

例 40 找出选修了全部课程的学生的姓名。
本查询可以改为:查询这样一些学生,没有一门课程是他不选修的。
Select SNAME
FROM STUDENTS
Where NOT EXISTS
(Select *
FROM COURSES
Where NOT EXISTS
(Select *
FROM ENROLLS
Where ENROLLS.SNO = STUDENTS.SNO
AND ENROLLS.CNO = COURSES.CNO))
关系代数运算

例 41 设有某商场工作人员的两张表:营业员表 SP_SUBORD 和营销经理表 SP_MGR ,其关系数据模式如下:
SP_SUBORD (SALPERS_ID, SALPERS_NAME, MANAGER_ID, OFFICE)
SP_MGR (SALPERS_ID, SALPERS_NAME, MANAGER_ID, OFFICE)
其中,属性 SALPERS_ID 为工作人员的编号 , SALPERS_NAME 为工作人员的姓名 , MANAGER_ID 为所在部门经理的编号 , OFFICE 为工作地点。
若查询全部商场工作人员,可以用下面的 SQL 语句:
(Select * FROM SP_SUBORD)
UNION
(Select * FROM SP_MGR)
或等价地用下面的 SQL 语句:
Select *
FROM (TABLE SP_SUBORD UNION TABLE SP_MGR)
( 2 ) INTERSECT
(Select * FROM SP_SUBORD)
INTERSECT
(Select * FROM SP_MGR)
或等价地用下面的 SQL 语句:
Select *
FROM (TABLE SP_SUBORD INTERSECT TABLE SP_MGR)
或用带 ALL 的 SQL 语句:
(Select * FROM SP_SUBORD)
INTERSECT ALL
(Select * FROM SP_MGR)

Select *
FROM (TABLE SP_SUBORD INTERSECT ALL TABLE SP_MGR)
( 3 ) EXCEPT
(Select * FROM SP_MGR)
EXCEPT
(Select * FROM SP_SUBORD)
或等价地用下面的 SQL 语句:
Select *
FROM (TABLE SP_MGR EXCEPT TABLE SP_ SUBORD)
或用带 ALL 的 SQL 语句:
(Select * FROM SP_MGR)
EXCEPT ALL
(Select * FROM SP_SUBORD)
例 42 查询籍贯为四川、课程成绩在 80 分以上的学生信息及其成绩。(自然连接)
(Select * FROM STUDENTS
Where BPLACE=‘ 四川 ’)
NATURAL JOIN
(Select * FROM ENROLLS
Where GRADE >=80)
例3.43 列出全部教师的姓名及其任课的课程号、班级。
(外连接与外部并外连接允许在结果表中保留非匹配元组,空缺部分填以 NULL 。外连接的作用是在做连接操作时避免丢失信息。
外连接有 3 类:
( 1 )左外连接( Left Outer Join )。连接运算谓词为 LEFT [OUTER] JOIN ,其结果表中保留左关系的所有元组。
( 2 )右外连接( Right Outer Join )。连接运算谓词为 RIGHT [OUTER] JOIN ,其结果表中保留右关系的所有元组。
( 3 )全外连接( Full Outer Join )。连接运算谓词为 FULL [OUTER] JOIN ,其结果表中保留左右两关系的所有元组。)
Select TNAME, CNO, CLASS
FROM TEACHERS LEFT OUTER JOIN TEACHING USING (TNO)

SQL 的数据操纵

例 44 把教师李映雪的记录加入到教师表 TEACHERS 中。(插入)
Insert INTO TEACHERS
VALUES(1476 , ' 李映雪 ' , 44 , ' 副教授 ')
例 45 成绩优秀的学生将留下当教师。
Insert INTO TEACHERS (TNO , TNAME)
Select DISTINCT SNO , SNAME
FROM STUDENTS , ENROLLS
Where STUDENTS.SNO = ENROLLS.SNO AND GRADE >= 90
例 47 把所有学生的年龄增加一岁。(修改)
Update STUDENTS
SET AGE = AGE+1
例 48 学生张春明在数据库课考试中作比,该课成绩应作零分计。
Update ENROLLS
SET GRADE = 0
Where CNO = 'C1' AND
' 张春明 ' =
(Select SNAME
FROM STUDENTS
Where STUDENTS.SNO=ENROLLS.SNO)
例 49 从教师表中删除年龄已到 60 岁的退休教师的数据。(删除)
Delete FROM TEACHERS
Where AGE >= 60

SQL 的数据控制

例 50 授予 LILI 有对表 STUDENTS 的查询权。(表/视图特权的授予)
一个 SQL 特权允许一个被授权者在给定的数据库对象上进行特定的操作。授权操作的数据库对象包括:表 / 视图、列、域等。授权的操作包括: Insert 、 Update 、 Delete 、 Select 、 REFERENCES 、 TRIGGER 、 UNDER 、 USAGE 、 EXECUTE 等。其中 Insert 、 Update 、 Delete 、 Select 、 REFERENCES 、 TRIGGER 有对表做相应操作的权限,故称为表特权。)
GRANT Select ON STUDENTS
TO LILI
WITH GRANT OPTION


  • 大小: 87.9 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics