重点与难点

  • SQL-DDL基本语句:CREATE DATABASE、CREATE TABLE
  • SQL-DML基本语句:INSERT、DELETE、UPDATE、SELECT
  • SQL-SELECT语句的训练:正确表达各种查询需求

一. SQL语言概述

1. 提出与发展

Boyce 和 Chamber 提出 IBM 实现(Sequel SQL) SQL 标准 SQL-86 SQL-89 SQL-92/SQL2 SQL-99/SQL3(面向对象数据库、对象关系数据库) SQL2003, 2006, 2008(数据库应用程序)。

SQL标准 SQL X/Open:厂商产品可移植性,只包含各个厂商广泛认可的操作。

2. SQL语言的功能概述

SQL语言是集DDL、DML、DCL于一体的数据库语言。

SQL语言主要由9个单词引导的操作语句来构成:

  • DDL语句引导句:Create(建立)、Alter(修改)、Drop(撤销)
  • DML语句引导词:Insert、Delete、Update、Select
  • DCL语句引导词:Grant、Revoke

交互式SQL 嵌入式SQL 动态SQL等

二. 利用SQL语言建立数据库

1. 建立数据库

$$ 0建立数据库

$$

  • DDL 通常由 DBA 来使用,也有经 DBA 授权后由应用程序员来使用
  • DML 通常由用户或应用程序员使用,访问经授权的数据库

2. Create Database

1
Create database 数据库名

3. Create Table

1
2
Create table 表名(列名 数据类型 [Primary key|Unique] [Not null] 
[, 列名 数据类型 [Not null], ...]);

"[]"括号内的内容可以省略,"|"二取一;

Primary key:主键约束,每个表只能创建一个主键约束

Unique:唯一性约束(即候选键),可以有多个唯一性约束;

数据类型:

  • char(n):固定长度的字符串
  • varchar(n):可变长字符串
  • int:整数,有时不同系统也写作integer
  • numeric(p, q):固定精度数字,小数点左边p位,右边p-q位
  • real:浮点精度数字,有时不同系统也写作float(n),小数点后保留n位
  • date:日期
  • time:时间
1
2
3
Create Table Student(Sid	char(8) not null, Sname char(10), Ssex char(2), Sage integer, Did char(2), Sclass char(6));

Create Table Course(Cid char(3), Cname char(12), Chours Credit float(1), Tid char(3));

4. INSERT INTO

1
2
3
4
5
6
7
8
Insert Into Student (Sid, Sname, Ssex, Sage, Did, Sclass)
Values (‘98030102’, ‘张四’, ‘女’, 20, ’03’, ‘980301’);

Insert Into Student
Values (‘98030101’, ‘张三’, ‘男’, 20, ’03’, ‘980301’);

insert into 表名[(列名[, 列名 ]...]
values (值[, 值],...);

三. 利用SQL语言进行简单查询

1. 单表查询 SELECT-FROM-WHERE

1
Select 列名 [[,列名]...] From 表名 [Where 检索条件];

与选择运算 的条件 书写一样,只是其逻辑运算符用 and , or, not 来表示

2. 检索条件

例:检索教师表中所有工资少于1500元或者工资大于2000元并且是03系的教师姓名

1
Select Tname From Teacher Where (Salary < 1500 or Salary > 2000) and Did =03’;

3. 检索结果去重复记录

在 Table 中要求无重复元组是通过定义 Primary key 或 Unique 来保证的;而在检索结果中要求无重复元组, 是通过 DISTINCT 保留字的使用来实现的。

1
Select DISTINCT	Sid From SC Where Score > 80;

4. 结果排序

1
order by 列名	[asc|desc]

默认SAC(升序排列)

例:检索002号课大于80分的所有同学学号并按成绩由高到低顺序显示

1
2
Select Sid From SC Where Cid =002and Score > 80
Order By Score DESC;

5. 模糊查询

1
Where 列名 [not] like “字符串”
  • % :匹配零个或多个字符
  • _ :匹配任意单个字符(注意中文一个字占两个字符)
  • \ :转义字符,\% 匹配字符 %\_ 匹配字符 _

例:检索名字不姓张的所有同学姓名

1
2
Select Sname From Student
Where Sname Not Like ‘张%’;

例:检索名字为张某某的所有同学姓名

1
2
Select Sname From Student
Where Sname Like ‘张_ _’;

四. 利用SQL语言进行多表联合查询

1. 多表联合查询

1
2
3
Select 列名 [[, 列名]...]
From 表名1, 表名2, ...
Where 检索条件;

2. 多表联合查询之连接条件

多表连接时,如两个表的属性名相同,则需采用 表名. 属性名 方式来限定该属性是属于哪一个表.

例: 按”数据库“课成绩由高到低顺序显示所有同学姓名(三表连接)

1
2
3
Select Sname From Student, SC, Course
Where Student.Sid = SC.Sid and SC.Cid = Course.Cid and Cname = ‘数据库’
Order By Score DESC;

3. 表更名与表别名

1
2
3
Select 列名 as 列别名 [[, 列名 as 列别名]...]
From 表名1 as 表别名1, 表名2 as 表别名2, ...
Where 检索条件;

上述定义中的 as 可以省略

4. 不等值连接

例: 求年龄有差异的任意两位同学的姓名

1
2
3
Select S1.Sname as Stud1, S2.Sname as Stud2
From Student S1, Student S2
Where S1.Sage > S2.Sage;

例: 求“001”号课程有成绩差的任意两名同学

1
2
3
Select S1.Sname as Stud1, S2.Sname as Stud2
From Student S1, Student S2, SC SC1, SC SC2
Where S1.Sid = SC1.Sid and S2.Sid = SC2.Sid and SC1.Cid = '001' and SC2.Cid = '001' and SC1.Score > SC2.Score;

5. 多表联合查询

例:求“001”号课成绩比“002”号课成绩高的所有学生的学号

1
2
Select S1.Sid From SC S1, SC S2
Where S1.Sid = S2.Sid and S1.Cid=001and S2.Cid=002and S1.Score > S2.Score;

例: 列出没学过李明老师讲授课程的所有同学的姓名

后面的示例讲解

五. 利用SQL语言进行增/删/改

1. INSERT

  • 单一元组新增命令形式
1
2
insert into 表名 [(列名[, 列名]...)]
values (值 [, 值]…);
  • 批数据新增命令形式
1
2
insert into 表名 [(列名[, 列名]...)]
子查询;

新增元组时,DBMS 会检查用户定义的完整性约束条件等,如不符合完整性约束条件,则将不会执行新增动作。

例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Insert Into	Teacher
Values (“006”, “李小虎”, “03”, “950”);

Insert Into St (Sid, Sname)
Select Sid, Sname From Student Order By Sname;

Insert Into St (Sid, Sname)
Select Sid, Sname From Student
Where Sname like '%伟' ;

Insert Into St (Sid, Sname, avgScore)
Select Sid, Sname, Avg(Score) From Student, SC
Where Student.Sid = SC.Sid
Group by Student.Sid ;

2. DELETE

1
Delete From 表名 [Where 条件表达式];

表示删除满足指定条件的元组,如果 Where 条件省略,则删除所有的元组

删除元组时,DBMS 会检查用户定义的完整性约束条件等,如不符合完整性约束条件,则将不会执行删除动作。

例:删除98030101号同学所选的所有课程

1
Delete From	SC Where Sid = '98030101';

例:删除自动控制系的所有同学

1
2
Delete From Student	Where Did in
(Select Did From Dept Where Dname = ‘自动控制’);

例:删除有四门不及格课程的所有同学

1
2
3
Delete From	Student	Where Sid in
(Select Sid From SC Where Score < 60
Group by Sid Having Count(*) >= 4);

3. UPDATE

用指定要求的值更新指定表中满足指定条件的元组的指定列的值

1
2
3
4
Update 表名
Set 列名 = 表达式 | (子查询)
[[, 列名 = 表达式 |(子查询)]...]
[Where 条件表达式];

例:将所有计算机系的教师工资上调10%

1
2
3
4
Update Teacher
Set Salary = Salary * 1.1
Where Did in
(Select Did From Dept Where Dname = '计算机');

例: 当某同学001号课的成绩低于该课程平均成绩时,将该同学该门 课成绩提高5%

1
2
3
4
5
Update SC
Set Score = Score * 1.05
Where Cid =001and Score < some
(Select AVG(Score) From SC
Where Cid =001’ ) ;

六. 利用SQL语言修正与撤销数据库

1. DDL之撤销与修改

  • 修正(Alter)

修正数据库:修正数据库的定义,主要是修正表的定义

1
2
3
4
alter table tablename
[add {colname datatype, ...}] 新增新列
[drop {完整性约束名}] 删除完整性约束
[modify {colname datatype, ...}] 修改列定义
  • 撤销(drop)
1
2
drop table 表名;					撤销基本表
drop database 数据库名; 撤销数据库

注意:SQL-delete语句只是删除表中的元组, 而撤消基本表drop table的操作是撤消包含表格式、表中所有元组、由该表导出的视图等相关的所有内容,所以使用要特别注意。

2. DDL之数据库指定与关闭命令

有些DBMS提供操作多个数据库的能力,在进行数据库操作时需要指定待操作数据库与关闭数据库的功能。

1
2
use 数据库名;					指定当前数据库
close 数据库名; 关闭当前数据库

七. 典型DBMS交互环境简介—SQL Server