//名词
Candidate key:若表中记录的某一字段或字段组合能够唯一标志记录,则称该字段或字段组合为候选关键字
Primary key:若一个表有多个候选关键字,则选定其中一个为主关键字,也称为主键
Foreignkey:若某字段或字段组合不是数据库中A表的关键字,但它是数据库中另外一个表B表的关键字,则称该字段或字段组合为A表的外关键字。
//语法,数据查询
SELECT 子旬指出查询结果中显示的字段名,以及字段名和函数组成的表达式等。
WHERE 子句定义了查询条件。WHERE子句必须紧跟FROM子句之后,其基本格式为。
OGROUPBY 子旬和ORDERBY子分别对查询结果分组和排序。
//举例
下面用示例说明使用SOL语句对Student数据库进行的各种查询。
(1)查询Student数据库。查询students表中各个同学的姓名和总学分。
USE Student SELECT name,totalscore FROM students
(2)查询表中所有记录。查询students表中各个同学的所有信息。
SELECT *FROM students
(3)条件查询。查询students表中总学分大于等于120的同学的情况。
SELECT *FROM students WHERE totalscore>120
(4)多重条件查询。查询students表中所在系为“计算机”且总学分大于等于120的同学的情况。
SELECT *FROM students WHERE department='计算机'AND totalscore >= 120
(5)使用LIKE谓词进行模式匹配。查询students 表中姓“王”且单名的学生
情况。
SELECT *FROM students WHERE name LIKE '王_'
(6)用BETWEEN…AND指定查询范围。查询students表中不在1997年出生的学生情况。
SELECT *FROM students
WHERE birthday NOT BETWEEN 1997-1-1'and 1997-12-31
(7)空值比较。查询总学分尚不确定的学生情况。
SELECT *FROM students
WHERE totalscore IS NUL
(8)自然连接查询。查找计算机系学生姓名及其“C程序设计”课程的考试分数情况。
SLELCT name,grade
FROM students,courses,gradesWHERE department=计算机'ANDcoursename=C程设计'ANDstudents.studentid=grades.studentid ANDcourses.courseid=grades.coursesid
(9)IN子查询。查找选修了课程号为101的学生情况。
SELECT *FROM students
WHERE studentid IN
(SELECT studentid FROM courses WHERE courseid=101')
在执行包含子查询的SELECT语句时,系统首先执行子查询,产生一个结果表再执行外查询。本例中,首先执行子查询:
SELECT studentid FROM courses,students,grades WHERE courseid='101
AND students.studentid= qrades.studentid AND
courses.courseid=grades.coursesid
得到一个只含有studentid列的结果表,courses中courseid列值为101的行在该结果表中都有一行。再执行外查询,若students表中某行的stuentid 列值等于子查询结果表中的任意一个值,则该行就被选择到最终结果表中。
(10)比较子查询。这种子查询可以认为是IN子查询的扩展,它是表达式的值与子查询的结果进行比较运算。查找课程号206的成绩不低于课程号101的最低成绩的学生学号。
SELECT studentid FROM grades
WHERE courseid=206'AND grade!<ANY
(SELECT grade FROM grades WHERE courseid=101)
(11)EXISTS子查询。EXISTS谓词用于测试子查询的结果是否为空表,若子查询的结果集不为空,则EXISTS返回TRUE,否则返回FALSE。EXISTS还可与NOT结合使用,即NOTEXISTS,其返回值与EXISTS刚好相反。查找选修206号课程的学生姓名。
SELECT name FROM students
WHERE EXISTS
(SELECT *FROM gradesWHERE studentid=students.studentid AND courseid ='206')
(12)查找选修了全部课程的同学姓名(即查找没有一门功课不选修的学生)。
SELECT name FROM students
WHERE NOT EXISTS
(SELECT *FROMouses WHERE NOT EXISTS
(SELECT *FROM grades WHERE studentid=students.studentid AND
courseid=courses.courseid)
)
(13)查询结果分组。将各课程成绩按学号分组。
SELECT studentid,grade FROM grades GROUP BY studentid
(14)查询结果排序。将计算机系的学生按出生时间先后排序。
SELECT *FROM students WHERE department=计算机'ORDER BY birthday
//常用聚合函数
本例对Students数据库表执行查询,使用常用的聚合函数。
(1)求选修101课程学生的平均成绩。
SELECT AVG(grade) AS '课程101平均成绩'
FROM grades
WHERE courseid=101
(2)求选修101课程学生的最高分和最低分
SELECT MAX(grade) AS '课程101最高分',MIN(grade) AS '课程101最低分'
FROM grades
WHERE courseid=101
(3)求学生的总人数。
SELECTCOUNT(*) AS '学生总数'
FROM students
// 数据操作
1.插入数据语句 INSERT
INSERT可添加一条或多条记录至一个表中。
INSERT有两种语法形式。
语法1:
INSERT INTO target IN externaldatabase{DEFAULT VALUES | VALUES(DEFAULTl expression_list)}
语法 2:
INSERT INTO target [IN externaldatabase]fields_list{SELECT…IEXECUTE…)
其中,
●target:欲追加记录的表(Table)或视图(View)的名称。
●externaldatabase:外部数据库的路径和名称。
●expression_list:需要插入的字段值表达式列表,其个数应与记录的字段个数一致,若指定要插入值的字段felds list,则应与fields list的字段个数相一致。
使用第1种形式将一个记录或记录的部分字段插入到表或视图中。第2种形式的INSERT语句插入来自SELECT语句或来自使用 EXECUTE语句执行的存储过程的结果集。
例如,用以下语句向students表添加一条记录:
INSERT INTO students
VALUES(‘130206"罗亮’,01/30/1994’,1,150)
2.删除数据语句 DELETE
DELETE用于从一个或多个表中删除记录。
DELETE语句的语法格式如下:
DELETE FROM table names
[WHERE...]
例如,用以下语句从students表中删除姓名为“罗亮”的记录:
DELETE FROM students
WHERE name=罗亮
3.更新数据语句 UPDATE
UPDATE语用于更新表中的记录。
UPDATE语的语法格式如下:
UPDATE table name
SET Field_1=expression_l[,Field_2=expression_2...]
[FROM tablel_name|viewl_name[,table2_name|view2_name..] ]
[WHERE...]
其中,
●Field:需要更新的字段。
●expression:表示要更新字段的新值表达式。例如,以下语句将计算机系学生的总分增加10:
UPDATE students
SET totalscore=totalscore +10
WHERE department=计算机'