SQL基本语句
定义基本表(创建基本表的语法)
CREATE TABLE <基本表名>
(<列名><数据类型> [列级完整性约束条件]
[,<列名><数据类型> [列级完整性约束条件]]
……
[,表级完整性约束条件]);
假设完整性约束条件涉及到该表的多个属性列时。必须在表级定义该约束条件。否则既能够定义在列级,也能够定义在表级。
例1:建立职工关系模式
emp(eno,ename,dno,sex,birthday)
CREATE TABLE emp
( eno number(10),
ename varchar2(10),
dno varchar(6),
sex varchar(2),
birthday date);
(3)约束条件
主键约束(PRIMARY KEY):体现了实体完整性。要求某一列的值既不能为空,也不能反复。
外键约束(FOREIGN KEY):体现參照完整性。外键的取值或者为空或者參考父表的主键。
属性约束:体现了用户定义的完整性。
属性约束主要限制某一属性的取值范围。
分为下面几类:
列级约束:
CREATE TABLE emp
( enonumber(6) primary key,
enamevarchar2(10) unique,
sex varchar2(3) not null,
dnovarchar2(10)referencesdept(dno),
salnumber(6) check(sal>1000 and
sal<=10000));
表级约束:
CREATE TABLE emp
( enonumber(6),
enamevarchar2(10),
sex varchar2(3)not null,
dnovarchar2(10),
salnumber(6),
primary key(eno),
unique(ename),
foreign key(dno)references dept(dno),
check(salbetween 1000 and 10000));
基本表的完整性约束可定义为两级:列级约束和表级约束。
上述五种约束条件均可作为列级完整性约束条件。但非空约束不能够作为表级完整性约束条件,而其它四种也能够作为表级完整性约束条件。
例1:建立一个学生表Student。全部约束条件均为列级完整性约束。
CREATE TABLE Student
(Sno CHAR(8) PRIMARY KEY, /*主键约束*/
Sname CHAR(10) UNIQUE, /*唯一约束*/
Sex CHAR(3) NOTNULL, /*非空约束*/
Age INT CHECK(Age>16), /*检查约束*/
Dept VARCHAR(15)
);
例2:建立一个课程表Course,全部约束条件均为列级完整性约束。
CREATETABLE Course
(Cno CHAR(8) PRIMARY KEY, /*主键约束*/
CnameVARCHAR(10) NOT NULL, /*非空约束*/
Tname VARCHAR(10),
Cpno CHAR(8) REFERENCES Course(Cno),
/*外键约束*/
CreditNUMBER);
例3:建立一个学生选课表SC,全部约束条件均为表级完整性约束。
CREATETABLE SC
( SnoCHAR(8),
CnoCHAR(8),
GradeNUMBER,
PRIMARY KEY(Sno,Cno), /*主键约束*/
FOREIGN KEY(Sno)REFERENCES Student(Sno),
/*外键约束*/
FOREIGNKEY (Cno) REFERENCES Course(Cno)
/*外键约束*/
);
2.改动基本表结构
改动基本表的结构包含添加、删除和改动表的属性列,默认值和约束条件。
语法:
ALTER TABLE<基本表名>
[ADD<新列名> <数据类型>[列级完整性约束]]
[DROPCOLUMN<列名>]
[MODIFY<列名> <新的数据类型>]
[ADDCONSTRAINT<完整性约束>]
[DROPCONSTRAINT<完整性约束>];
例:向Student表中添加一个身高“Height”属性列,数据类型为INT。
ALTER TABLE Student ADDHeight INT;
例:将Student表中的“Height”属性列的数据类型改为real。
ALTER TABLE Student MODIFYHeight real;
例:删除Student表中新添加的“Height”属性列。
ALTER TABLE Student DROP
COLUMNHeight;
添加完整性约束
例:给Student表中“Height”属性列添加一个CHECK约束,要求学生的身高要超过140厘米才行。
ALTER TABLE Student ADDCONSTRAINTChk1CHECK(Height>140);
★Chk1是Height属性列上新添加的CHECK约束的名字。
例:删除“Height”属性列上的Chk1约束。
ALTER TABLEStudent DROP
CONSTRAINTChk1;
3.基本表的删除
语法:
DROP TABLE <表名> [CASCADECONSTRAINTS];
例:DROPTABLE
emp。
DROPTABLE dept。
★表一旦被删除。则无法恢复。假设表中有数据。则表结构连同数据,约束一起删除。
仅仅有表的创建者或者拥有DROPTABLE权限的用户才干删除表。
假设两张表有主外键约束的话。先删从表(外键表)。再删主表。
二、索引的定义和删除
1.创建索引
在SQL语言中。建立索引使用CREATEINDEX语句,其一般格式为:
CREATE[UNIQUE][CLUSTER]INDEX <索引名>
ON<基本表名>(<列名>[<次序>]。[,<列名>[<次序>]]…);
①UNIQUE:规定此索引为唯一性索引。每个索引值仅仅相应于表中唯一的记录。
②CLUSTER:规定此索引为聚簇索引。省略CLUSTER则表示创建的索引为非聚簇索引。
③<次序>:建立索引时指定列名的索引表是ASC(升序)或DESC(降序)。若不指定,默觉得升序。
例:为Student,Course,SC三张表建立索引。当中Student表按学号Sno升序建唯一索引, Course表按课程号Cno降序建唯一索引,SC表按学号Sno升序和课程号Cno降序建唯一索引。
ON Student(Sno ASC);
ON Course(Cno DESC);
ON SC(SnoASC,Cno DESC);
2.删除索引
删除索引的格式为:
DROP INDEX<索引名>;
例:删除Course表的Index_Cou索引。
DROP INDEXIndex_Cou;
1.插入单个元组
向基本表中插入数据的语法格式例如以下:
INSERTINTO <基本表名> [(<列名1>,<列名2>,…,<列名n>)]VALUES(<列值1>。<列值2>。…,<列值n>)
【例4-64】向学生表中指定的属性列插入数据
INSERT INTOStudent1(Sno,Sname,Sex)
VALUES('05880112','王晓五','女');
2.插入多个元组
向基本表中插入数据的语法格式例如以下:
INSERT INTO<基本表名>[(<列名1>,<列名2>。 …。<列名n>)] 子查询;
【例4-65】假设已经创建了课程平均成绩记录表course_avg(cno,ave),当中ave表示每门课程的平均成绩,向course_avg表中插入每门课程的平均成绩。
INSERTINTOCourse_avg(Cno,Ave)
SELECTCno,AVG(Grade)
FROMSC
GROUPBY Cno;
4.4.2改动数据
假设表中的数据出现错误,能够利用UPDATE命令进行改动。
UPDATE语句用以改动满足指定条件的元组信息。
UPDATE语句一般语法格式为:
UPDATE<基本表名>
SET<列名1>= <表达式>[。<列名2> = <表达式>]…
[WHERE<条件>] ;
★其中,UPDATEkeyword用于定位改动哪一张表。SETkeyword用于定位改动这张表中的哪些属性列,WHERE<条件>用于定位改动这些属性列其中的哪些行。
【例4-66】将java课程的学分改为5学分。
UPDATECourse
SET Credit=5
WHERECname='java';
2.改动多个元组的值
【例4-67】将全部男同学的年龄添加2岁。
UPDATEStudent
SETAge=Age+2
WHERESex='男';
【例4-68】 将全部课程的学分减1。
UPDATECourse
SETCredit=Credit-1;
3.带子查询的更新
【例4-69】将全部选修java课程的学生成绩改为0分。
UPDATE SC
SET Grade=0
WHERE'java'= (SELECT Cname
FROM Course
WHERE Course.Cno=SC.Cno);
4.4.3删除数据DELETE语句的一般语法格式为:
DELETE FROM<表名>[WHERE<条件>] ;
1.删除某一个元组的值
【例4-70】删除学号为“05880110”的学生记录。
DELETE FROM Student
WHERESno='05880110';
2.删除多个元组的值
【例4-71】删除学号为“05880102”学生的选课记录。
DELETE FROM SC
WHERESno='05880102';
每个学生可能选修多门课程。所以DELETE语句会删除这个学生的多条选课记录。
【例4-72】删除全部学生的选课记录。
DELETE FROM SC;
3.带子查询的删除
【例4-73】删除张三同学的选课记录。
DELETEFROMSC
WHERE'张三'= ( SELECT Sname
FROM Student
WHERE Student.Sno=SC.Sno);
▲SELECT 语句完整的句法:
其基本格式为:
SELECT[ALL|DISTINCT] <目标列表达式>[。<目标列表达式>]…
FROM<表名或视图名>[,<表名或视图名>]…
[WHERE<条件表达式>]
[GROUPBY<列名1> [ HAVING <组条件表达式>]]
[ORDER BY<列名2> [ ASC|DESC]];
当中:
①SELECT子句说明要查询的数据。ALL表示筛选出数据库表中满足条件的全部记录,普通情况下省略不写。
DISTINCT表示输出结果中无反复记录。
②FROM子句说明要查询的数据来源。
。
③WHERE子句指定查询条件。
④GROUPBY子句表示在查询时。能够依照某个或某些字段分组汇总。HAVING子句必须尾随GROUPBY一起使用,表示在分组汇总时,能够依据组条件表达式筛选出满足条件的组记录。
⑤ORDERBY子句表示在显示结果时,依照指定字段进行排序。ASC表示升序,DESC表示降序,省略不写默认情况下是ASC。
(2)查询所有列
【例】查询所有课程的具体记录。
SELECT *
FROM Course;
(4)指定别名来改变查询结果的列标题
方法就是:在列名的后面加上一个空格或者是“as”,然后写上它的别名。在查询结果显示时就用别名取代列名了。
【例】查询全体学生的姓名、性别及其出生年份。
SELECT Sname,Sex,2011-age 出生年份
FROM Student;
2.选择表中若干行
选择表中若干行,这就是选择运算。
(1)消除取值反复的行
【例】查询全部选修了课程的学生学号。
SELECTSno
FROM SC;
因为存在一名同学选修多门课程的情况,所以查
询的结果中包括了很多反复的行。
假设想去掉反复的
行。必须指定DISTINCTkeyword。
SELECTDISTINCTSno
FROMSC;
2.选择表中若干行
选择表中若干行,这就是选择运算。
(1)消除取值反复的行
【例】查询全部选修了课程的学生学号。
SELECTSno
FROM SC;
因为存在一名同学选修多门课程的情况,所以查
询的结果中包括了很多反复的行。假设想去掉反复的
行,必须指定DISTINCTkeyword。
SELECTDISTINCTSno
FROMSC;
查询满足条件的元组是通过WHERE子句实现。
在WHERE子句中经常使用的查询条件如表所看到的。
①比較大小
【例】查询数学系全体学生的姓名。
SELECTSname
FROM Student
WHERE Dept ='数学系';
【例】查询年龄超过20岁的学生姓名及其年龄。
SELECTSname,Age
FROM Student
WHERE Age>20;
【例】查询考试成绩有不及格的学生的学号。
SELECTDISTINCTSno
FROM SC
WHERE Grade<60;
语句中使用了DISTINCTkeyword。目的是当某一个
学生有多门课程不及格时,他的学号仅仅显示一次。
②确定范围(谓词BETWEEN AND)
【例】查询年龄在16至20岁(包含16岁和20岁)之间的学生姓名和年龄。
SELECTSname,Age
FROM Student
WHEREAge BETWEEN 16 AND 20;
③确定集合(谓词IN)
【例】查询计算机系、日语系和管理系的学生姓名和性别。
SELECTSname,Sex
FROMStudent
WHEREDept IN('计算机系', '日语系', '管理系');
④字符匹配(谓词LIKE)
谓词LIKE能够用来进行字符串的匹配。
% (百分号)代表随意长度(长度能够为0)的字符串。
__(下横线)代表随意单个字符。
【例】查询全部姓张的学生姓名、年龄和系别名称。
SELECTSname,Age,Dept
FROMStudent
WHERESnameLIKE '张%';
假设换成NOT LIKE。表示不姓张的同学。
【例】查询姓名中,第二个汉字是“七”的学生姓名和年龄。
SELECTSname,Age
FROM Student
WHERESnameLIKE '_七% ';
假设用户查询的匹配字符串本身就含有%或_,这时就要使用ESCAPE’<换码字符>’短语对通配符进行转义。
【例】查询以“jsp_”开头,且倒数第2个字符为g的课程的具体信息
SELECT *
FROM Course
WHERE Cname LIKE 'jsp\_%g_' ESCAPE '\';
⑤涉及空值的查询
【例】查询选修了课程,但没有成绩的学生学号和对应的课程号。
SELECTSno,Cno
FROM SC
WHEREGrade IS NULL;
注意:这里“IS”不能用等号 “=” 取代。
【例】查询选修了课程,而且有成绩的学生学号和对应的课程号。
SELECTSno,Cno
FROM SC
WHERE Grade IS NOT NULL;
⑥多重条件查询
逻辑运算符AND和OR可用来联结多个查询条件。
AND的优先级高于OR。但用户能够通过括号来改变优先级。
【例】查询日语系女同学的姓名和年龄。
SELECTSname,Age
FROM Student
WHEREDept='日语系' AND Sex='女';
COUNT([DISTINCT|ALL] *):统计全部行数(元组个数)
COUNT([DISTINCT|ALL] <列名>):统计某一列中值的行数
SUM([DISTINCT|ALL] <列名>)
AVG([DISTINCT|ALL]<列名>)
MAX([DISTINCT|ALL]<列名>)
MIN([DISTINCT|ALL]<列名>)
例:查询学生表中的总人数
法一:select count(*)
from student;
法二:select count(sno)
from student;
例:查询选修了课程的学生总人数
select count( distinct sno)
from sc;
例:查询选修c3课程的平均成绩、最高成绩和最低成绩
select avg(grade),max(grade),min(grade)
from sc
where cno='c3';
例:查询学号为05880101学生选修课程的成绩 总和
select sum(grade)
fromsc
where sno='05880101';
例:查询选修3门及其以上课程的学生学号
SELECTSno
FROM SC
GROUP BY Sno
HAVING COUNT(Cno)>=3;
使用group by 和having子句需注意
HAVING子句与WHERE子句的差别是:
① WHERE子句的作用是在分组之前过滤数据。
WHERE条件中不能包括聚组函数。
使用WHERE条件选择满足条件的行。
② HAVING子句的作用是在分组之后过滤数据。
HAVING条件中常常包括聚组函数。
使用HAVING条件选择满足条件的组。
使用HAVING子句时必须首先使用GROUP BY进行
分组。
select sno,avg(grade)
from sc
group by sno;
selectsno,avg(grade)
from sc
group by sno
having avg(grade)>80;
5.对查询结果进行排序
ORDERBY子句可指定依照一个或多个属性列的升序(ASC)或者降序(DESC)又一次排列查询结果。
省略不写,默觉得升序排列。
注意:order by 子句仅仅能用于终于的查 询结果。
例:查询选修c3课程的学生学号及成绩,查询结果依照成绩的降序排列
SELECTSno,Grade
FROM SC
WHERECno='c3'
ORDER BY Grade DESC;
查询男生的人数大于50人的系别名称以及男生人数,要求结果依照系别名称进行升序排列.
Select dept, count(sno)
From student
Where sex='男'
Group bydept
Having count(sno)>50
Order by deptasc;
4.3.3 连接查询
连接查询是指通过两个或两个以上的关系表或视图的连接操作来实现的查询。连接查询是关系数据库中最基本的查询。包含等值连接、非等值连接、自然连接、自身连接、外连接和复合条件连接等。
1.等值连接
例:查询每一个同学基本信息及其选修课程的情况。
SELECT Student.*, SC.*
FROM Student, SC
WHERE
Student.Sno=SC.Sno;
2.自然连接
假设是依照两个表中的同样属性进行等值连接,而且在结果中去掉了反复的属性列。我们称之为自然连接。
例:用自然连接来完毕查询每一个同学基本信息及其选修课程的情况。
SELECT Student.Sno,Sname,Sex,Age,Dept,Cno,Grade
FROM Student, SC
WHERE Student.Sno=SC.Sno;
3.复合条件连接
连接条件用于多个表之间的连接,限制条件用于限制所选取的记录要满足什么条件,这样的连接称为复合条件连接。
例:查询选修课程号为c1,而且成绩不及格的学生学号、姓名和系别名称
SELECTStudent.Sno,Sname,Dept
FROM Student,SC
WHERE Student.Sno=SC.Sno /*连接条件*/
and Cno='c1' /*限制条件*/
and Grade<60; /*限制条件*/
4.自身连接
例:在SC表中查询至少选修课程号为c1和c2的学生学号
select x.sno
from sc x,sc y
where x.sno=y.sno
andx.cno='c1'
and y.cno='c2' ;
5. 外连接
例:查询每一个学生及其选修课程的情况(若某一个学生没有选课,仅仅输出学生的基本情况信息,其选课信息为空值。
)
SELECT Student.Sno,Sname, Sex , age , dept, Cno, Grade
FROM Student ,SC
WHERE Student.Sno=SC.Sno(+);
外连接的操作符是(+)。
(+)号放在连接条件中信息不全然的
那一边(即没有匹配行的那一边)。
嵌套查询(多表查询)
一个SELECT-FROM-WHERE语句称为一个查询块,将一个查询块嵌套在还有一个查询块的WHERE子句或HAVING子句的条件中的查询称为嵌套查询。
Select sname
fromstudent
wheresnoin
(selectsno
fromsc
wherecno='c2');
1、不相关子查询子查询的查询条件不依赖于父查询,这类子查询称为不相关子查询。
不相关子查询的运行过程:先运行子查询。将子查询的结果作为父查询的条件,然后运行父查询。
不相关子查询的特点
Select sname
from student
wheresnoin
(select sno
from sc
where cno='c2');
<1> 子查询可以独立运行,不依赖于外层父查询
<2> 子查询仅仅运行一次。
<3> 先运行子查询,后运行父查询
(1)带有IN谓词的子查询
例:查询选修课程号为c2的学生姓名。
方法一:採用多表连接查询实现
SELECTSname
FROM Student,SC
WHEREStudent.Sno=SC.Snoand Cno='c2';
例:查询选修课程号为c2的学生姓名。
方法二:採用不相关子查询实现
SELECTSname
FROM Student
WHERESnoIN
( SELECTSno
FROM SC
WHERECno='c2');
运行过程:先运行子查询。得到选修c2课程的学生学号的集合,然后将该集合作为外层父查询的条件,运行父查询,从而得到集合中学号相应的学生姓名。
(2)带有比較运算符的子查询
能够用>、<、=、>=、<=、!=或<>等比較运算符。
例:查询与学号“05880101”学生在同一系别的学生学号和姓名。
SELECT Sno,Sname
FROM Student
WHEREDept= ( SELECTDept
FROM Student
WHERESno='05880101');
也能够用前面学习的IN谓词取代=来实现。
注意:当子查询的结果是单个值时,谓词in和“=”的作用是等价的。当子查询的结果是多个值时。仅仅能用谓词in。
(3)带有ANY谓词或ALL谓词的子查询
注意:使用any或all谓词前必须同一时候使用比較运算符
例:查询选修课程号为c2的学生姓名。
(IN与=ANY等价)
SELECTSname
FROM Student
WHERESno=ANY
( SELECTSno
FROM SC
WHERE Cno='c2');
例:查询比全部男同学年龄都大的女同学的学号、姓名和年龄。
SELECTSno,Sname,Age
FROM Student
WHERE Sex='女' and Age>all
(SELECTAge
FROM Student
WHERESex='男');
用聚组函数实现子查询通常比直接用ANY或ALL查询效率高。ANY与ALL与聚组函数的相应关系如表所看到的。
(1)带有比較运算符的相关子查询
例:查询全部课程成绩均及格的学生学号和姓名。
SELECTSno,Sname
FROM Student
WHERE 60<=( SELECT MIN(Grade)
FROM SC
WHEREStudent.Sno=SC.Sno);
(2)有EXISTS谓词的子查询1. EXISTS谓词
2. NOT EXISTS谓词
exists的子查询仅仅返回真值或假值,给出列名无实际的意义。
例:查询选修c2课程的学生姓名。
select sname
from student
where exists
( select *
from sc
where student.sno=sc.sno
and cno='c2');
例:如果全体同学都选修了对应的课程且有成绩,那么查询全部课程成绩均大于80分的学生学号和姓名。
SELECTSno,Sname
FROM Student
WHERE NOTEXISTS
( SELECT *
FROM SC
WHERE Student.Sno=SC.Sno
and Grade<=80);
4.5 视图
的表,它与基本表不同,是一个虚表。
询、被删除,我们也能够在一个视图之上再定
义新的视图。但对视图的更新(添加、删除、修
改)操作则有一定的限制。
视图的特点
1.视图是从现有的一个或多个表中提取出来的,能够屏蔽表中的某些信息。
2.视图是一个虚表。对视图的操作实际上是对基本表的操作。
3.数据库中仅仅存放视图的定义。不存放视图相应的数据。
这些数据仍存放在原来的基本表中,所以基本表中的数据发生变化。从视图中查询的数据也就随之改变了。
4.视图能够简化用户查询操作。隐蔽表之间的连接。
1.创建视图
CREATEVIEW<视图名>
[(<列名1>,<列名2>,…)]
AS SELECT 查询语句
[WITHCHECK OPTION]
[WITH READ ONLY];
★ WITH CHECK OPTION表示对视图进行UPDATE、INSERT、DELETE操作时。系统需检查该操作的数据是否满足子查询中WHERE子句里限定的条件,若不满足。则系统拒绝运行。。
★WITH READ ONLY选项保证在视图上不能进行不论什么DML操作。
例:建立计算机系学生的视图,包含学号、姓名、性别和年龄。并要求进行插入和改动操作时仍要保证此视图中仅仅有计算机系的学生。
CREATEVIEWCS_Student
AS
SELECTSno,Sname,Sex,Age
FROMStudent
WHEREDept='计算机系'
WITH CHECK OPTION;
例:建立计算机系学生的仅仅读视图,包含学号、姓名、性别和年龄。
CREATEVIEWCS_Student_Only
AS
SELECTSno,Sname,Sex,Age
FROM student
WHEREDept='计算机系'
WITH READ ONLY;
视图CS_Student_Only一旦建立。
就不同意在视图上进行不论什么DML操作。
例:建立一个记录每一个系别学生人数的视图,包含系别名称和学生人数。
CREATEVIEWDept_Count(Dept,Num)
AS
SELECTDept,Count(Sno)
FROM Student
GROUP BYDept;
注意:因为AS子句中select语句的目标列学生人数是通过使用聚组函数得到的。所以create view中必须明白定义组成dept_count视图的各个属性列名,必须使用列别名来命名表达式count(sno)。
2.删除视图
语法:DROPVIEW<视图名>
视图删除后从数据字典中删除该视图的定义。但由该视图导出的其它视图仍然存在,只是无效了。
例:DROP VIEWCs_Student;
4.5.2查询视图
例:在计算机系学生的视图中查找男同学的信息。
SELECT *
FROM CS_Student
WHERESex='男';
视图消解转换后的查询语句为:
CREATEVIEWCS_Student
AS
SELECTSno,Sname,Sex,Age
FROMStudent
WHEREDept='计算机系'
WITH CHECK OPTION;
SELECTSno,Sname,Sex,Age
FROM Student
WHEREDept='计算机系'and Sex='男';
4.5.3操纵视图
操纵视图是指通过视图来插入(INSERT)、删除(DELETE)和改动 (UPDATE)数据。
同查询视图一样,因为视图是不实际存储数据的虚表,因此对视图的操纵,终于要转换为对基本表的操纵。
例:建立数学系学生的视图,包含学号、姓名、性别和系别名称。
CREATE VIEWMath_Student
AS
SELECTSno,Sname,Sex,dept
FROM Student
WHEREDept='数学系';
1.对视图的数据插入
例:向数学系学生的视图中插入一个新的学生记录。当中学号为“05880118”,姓名为“张新”。性别为“女”,系别为“数学系”。
INSERT INTOMath_Student
VALUES('05880118','张新','女','数学系');
上述语句在运行时,将转换成对学生表student的数据插入:
INSERTINTOStudent
VALUES('05880118','张新', '女',NULL, '数学系');
例:将数学系学生的视图中。学号为“05880118”的学生姓名改为“张心”。
UPDATEMath_Student
SET Sname= '张心'
WHERESno= '05880118';
上述语句在运行时,将转换成对学生表Student的数据改动:
UPDATEStudent
SET Sname= '张心'
WHERE Sno= '05880118' and Dept='数学系';
例:从数学系学生的视图中,删除学号为“05880118”
的学生记录。
DELETE FROMMath_Student
WHERESno= '05880118';
上述语句在运行时,将转换成对学生表student的数据删除:
DELETE FROMStudent
WHERESno= '05880118' and Dept='数学系';
posted on 2017-04-16 08:32 cynchanpin 阅读(657) 评论(0) 编辑 收藏 举报