重点与难点
- SQL-DDL基本语句:CREATE DATABASE、CREATE TABLE
- SQL-DML基本语句:INSERT、DELETE、UPDATE、SELECT
- SQL-SELECT语句的训练:正确表达各种查询需求
一. SQL语言概述
1. 提出与发展
Boyce 和 Chamber 提出
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语言建立数据库
1. 建立数据库
$$ 0建立数据库$$
- DDL 通常由 DBA 来使用,也有经 DBA 授权后由应用程序员来使用
- DML 通常由用户或应用程序员使用,访问经授权的数据库
2. Create Database
1 | Create database 数据库名 |
3. Create Table
1 | Create table 表名(列名 数据类型 [Primary key|Unique] [Not null] |
"[]"
括号内的内容可以省略,"|"
二取一;
Primary key:主键约束,每个表只能创建一个主键约束;
Unique:唯一性约束(即候选键),可以有多个唯一性约束;
数据类型:
- char(n):固定长度的字符串
- varchar(n):可变长字符串
- int:整数,有时不同系统也写作integer
- numeric(p, q):固定精度数字,小数点左边p位,右边p-q位
- real:浮点精度数字,有时不同系统也写作float(n),小数点后保留n位
- date:日期
- time:时间
1 | Create Table Student(Sid char(8) not null, Sname char(10), Ssex char(2), Sage integer, Did char(2), Sclass char(6)); |
4. INSERT INTO
1 | Insert Into Student (Sid, Sname, Ssex, Sage, Did, Sclass) |
三. 利用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 | Select Sid From SC Where Cid = ‘002’ and Score > 80 |
5. 模糊查询
1 | Where 列名 [not] like “字符串” |
%
:匹配零个或多个字符_
:匹配任意单个字符(注意中文一个字占两个字符)\
:转义字符,\%
匹配字符%
,\_
匹配字符_
例:检索名字不姓张的所有同学姓名
1 | Select Sname From Student |
例:检索名字为张某某的所有同学姓名
1 | Select Sname From Student |
四. 利用SQL语言进行多表联合查询
1. 多表联合查询
1 | Select 列名 [[, 列名]...] |
2. 多表联合查询之连接条件
多表连接时,如两个表的属性名相同,则需采用 表名. 属性名
方式来限定该属性是属于哪一个表.
例: 按”数据库“课成绩由高到低顺序显示所有同学姓名(三表连接)
1 | Select Sname From Student, SC, Course |
3. 表更名与表别名
1 | Select 列名 as 列别名 [[, 列名 as 列别名]...] |
上述定义中的 as 可以省略
4. 不等值连接
例: 求年龄有差异的任意两位同学的姓名
1 | Select S1.Sname as Stud1, S2.Sname as Stud2 |
例: 求“001”号课程有成绩差的任意两名同学
1 | Select S1.Sname as Stud1, S2.Sname as Stud2 |
5. 多表联合查询
例:求“001”号课成绩比“002”号课成绩高的所有学生的学号
1 | Select S1.Sid From SC S1, SC S2 |
例: 列出没学过李明老师讲授课程的所有同学的姓名
后面的示例讲解
五. 利用SQL语言进行增/删/改
1. INSERT
- 单一元组新增命令形式
1 | insert into 表名 [(列名[, 列名]...)] |
- 批数据新增命令形式
1 | insert into 表名 [(列名[, 列名]...)] |
新增元组时,DBMS 会检查用户定义的完整性约束条件等,如不符合完整性约束条件,则将不会执行新增动作。
例:
1 | Insert Into Teacher |
2. DELETE
1 | Delete From 表名 [Where 条件表达式]; |
表示删除满足指定条件的元组,如果 Where 条件省略,则删除所有的元组。
删除元组时,DBMS 会检查用户定义的完整性约束条件等,如不符合完整性约束条件,则将不会执行删除动作。
例:删除98030101号同学所选的所有课程
1 | Delete From SC Where Sid = '98030101'; |
例:删除自动控制系的所有同学
1 | Delete From Student Where Did in |
例:删除有四门不及格课程的所有同学
1 | Delete From Student Where Sid in |
3. UPDATE
用指定要求的值更新指定表中满足指定条件的元组的指定列的值:
1 | Update 表名 |
例:将所有计算机系的教师工资上调10%
1 | Update Teacher |
例: 当某同学001号课的成绩低于该课程平均成绩时,将该同学该门 课成绩提高5%
1 | Update SC |
六. 利用SQL语言修正与撤销数据库
1. DDL之撤销与修改
- 修正(Alter)
修正数据库:修正数据库的定义,主要是修正表的定义
1 | alter table tablename |
- 撤销(drop)
1 | drop table 表名; 撤销基本表 |
注意:SQL-delete语句只是删除表中的元组, 而撤消基本表drop table的操作是撤消包含表格式、表中所有元组、由该表导出的视图等相关的所有内容,所以使用要特别注意。
2. DDL之数据库指定与关闭命令
有些DBMS提供操作多个数据库的能力,在进行数据库操作时需要指定待操作数据库与关闭数据库的功能。
1 | use 数据库名; 指定当前数据库 |
七. 典型DBMS交互环境简介—SQL Server
略