第五章----关系数据库语言---SQL
一、SQL概述
SQL,即结构化查询语言
SQL的发展:
1974年由Boyce和Chamberlin提出SQL。
1975年~1979年IBM在System R上实现了SQL语言。
第一个SQL标准是1986年10月由美国国家标准局
( American National Standard Institute, 简称ANSI)公
布,称SQL 86。
1987年国际标准化组织( International Standards
Organization,即ISO) 也通过了这标准。
1989年,ANSI发布SQL-89。
1992年,ANSI公布SQL-92。
二、SQL特点
1.综合统一
2.高度非过程化
3.面向集合的操作方法
4.多种使用方式:语言既是自含式语言,又是嵌入式语言
5.语言简洁,语法简单,易学易用。
三、SQL语言使用的三种表
SQL语言使用三种表:基本表、查询表、视图表
1、基本表:实际存在的表。即,基本表是实表。
DBMS保存并维护基本表的数据和元数据。在一个基本表上,可以创建并维护若干个索引表。
2、查询表:用于存放查询的中间结果,以及查询结果的表。查询表是临时表。查询表的数据和
元数据都是“临时”的。
3、视图表:简称:视图。
它是由基本表或其它视图表“导出”的表。视图表是“虚”表。视图本身没有独立存在的数据。
四、SQL语句概述
1、数据定义:创建(删除//修改)表、视图、索引
CREATE / DROP /(ALTER) (数据类型)
2、查询语句
SELECT..
FROM..
WHERE..
GROUP BY..
HAVING..
ORDER BY..
(1)单表查询
(2)多表查询(连接查询)、连接表达式、自身连接
(3)嵌套查询、使用IN谓词、使用ANY或ALL谓词、使用EXISTS谓词(相关查询)
目标列表达式;*;DISTINCT;字符串;条件表达式;“空”值;聚焦函数(SUM、AVG等)
(4)集合查询
(5)视图查询
3、数据更新:INSERT/DELETE/UPDATE
二、数据定义
(一)、创建、删除与修改基本表
1、创建基本表
2、SQL数据类型
3、修改基本表---修改表结构
4、删除基本表
语句格式:DROP TABLE<表名>
如:DROP TABLE Student
(二)、创建和删除索引
1、关于数据库索引
能够加快给定属性值的查询响应; 增加数据更新操作的系统开销
2、创建数据库索引
CREATE UNIQUE INDEX IndSname
ON Student(Sname)
3、删除索引
DROP INDEX<索引名>
DROP INDEX IndSname
三、查询
(一)、查询语句格式
接下来的例子经常涉及以下三个表:
1.Student(Sno,Sname,Ssex,Sage,Sdept)
2.Course(Cno,Cname,Cdate,Cpno,Ccredie)
其中,Cdate是开课日期(DATETIME)类型;Cpno是先修课号;Ccredit是学分。
3.SC(Sno,Cno,Grade)
(二)、单表查询
查所有学生的所有属性值:
SELECT * FROM Student
查找学生姓名,出生年份,所在系。---使用查询结果表达式
SELECT Sname,‘Year of Birth’ AS Y-Birth,Sage AS Year,Sdept
FROM Student
查找所有选过课的学生(只出现一次,不重复)
SELECT DISTINCT Sno
FROM SC
查找计算机系、年龄不大于19岁的学生学号,姓名,年龄。
SELECT Sno,Sname, Sage
FROM Student
WHERE(Sage<=19)AND (Sdept=‘CS’)
找出年龄介于19和22的学生学号,姓名,出生年份
SELECT Sno,Sname,Sage
FROM Student
WHERE Sage BETWEEN 19 AND 22
(字符串匹配)找计算机学院2003级所有同学的学号,姓名
SELECT Sno,Sname
FROM Student
WHERE Sno LIKE '2003%'
找出姓名的第二个字是“庆”的学生学号,姓名
SELECT Sno,Sname
FROM Student
WHERE Sname LIKE '_庆%'
(空值查询)查找选了课,但至今没有考试成绩的学生学号、课号
SELECT Sno,Cno
FROM SC
WHERE Grade IS NULL
找出2004年8月31日以后开课的课程号(使用日期型数据类型)
SELECT Cno
FROM Course
WHERE Cdate > '08/31/2004'
(使用聚焦函数)查0305050同学的考试总分
SELECT SUM(Grade)
FROM SC
WHERE Sno='0305050'
查询并统计选过课的学生人数(Sno不要重复)
SELECT COUNT(DISTINCT Sno)
FROM SC
关于按照分组排序的例子
查询选修了3门以上课程的学生学号(使用HAVING子句)
SELECT Sno
FROM SC
GROUP BY Sno HAVING COUNT(*) > 3
(1)首先,要按照GROUP子句的要求,对查询中间结果进行“分组”。
(2)对(1)中的分组结果,按照HAVING短语指定的“条件表达式”,进行“筛选”,得到查询结果。