-
SQL
语句实例
表操作
例
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
=
AND
=
例
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
=
例
26
找出籍贯为山西或河北,成绩为
90
分以上的学生的姓名、籍贯和成绩。(当构造
多表连接查询命令
时,必须遵循两条规则。第一,连接条件数正好比表数少
1
(若有三个
表,就有两个连接条件
)
;第二,若一个表中的主关键字是由多个列组成,则对此主
关键
字中的每一个列都要有一个连接条件(也有少数例外情况))
SELECT
SNAME, BPLACE, GRADE
FROM
STUDENTS, ENROLLS
WHERE
BPLACE IN (?
山西
?
,
?
河北
?)
AND
GRADE
>=
90
AND
=
例
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 =)
例
38
查询哪些课程只有男生选读。
SELECT DISTINCT
CNAME
FROM
COURSES C
WHERE '
男
'
=
ALL
(SELECT SEX
FROM
ENROLLS
,
STUDENTS
WHERE = AND
=)
例
39
要求给出一张学生、籍贯列表,该表中的学生的籍贯省
份,也是其他一些学生的籍
贯省份。
SELECT
SNAME, BPLACE
FROM
STUDENTS A
WHERE
EXISTS
(SELECT *
FROM
STUDENTS B
WHERE = AND
< > )
例
40
找出选修了全部课程的学生的姓名。
本查询可以改为:查询这样一些学生,没有一
门课程是他不选修的。
SELECT
SNAME
FROM
STUDENTS
WHERE
NOT EXISTS
-
-
-
-
-
-
-
-
-
上一篇:(牛津深圳版)九年级英语单词汇总
下一篇:Java基础测试(二)