SQL的特点
- 数据定义、操纵、 控制等功能一体化
- 两种使用方式, 统一的语法结构
- 高度非过程化
- 语言简洁,易学 易用
| 功能 | 动词 |
| —- | —- |
| 数据库查询 | SELECT |
| 数据定义 | CREATE
DROP
ALTER | | 数据操纵 | INSERT
UPDATE
DELETE | | 数据控制 | GRANT
REVOKE |
关于过程性与非过程性语言
- 过程性语言——以关系代数为基础设计出 的数据库语言。即用户不但要说明需要什么 数据,而且还要说明获得这些数据的过程。
- 非过程性语言——用户只要说明需要的数 据,而如何获得这些数据则不必由用户说明, 而由系统来实现。
SQL的定义功能
定义
数据类型
- 定长和变长字符串CHAR(n) VARCHAR(n)
- 定长和变长 位串 BIT(n) BITVARING(n)
- 整型数 INT(32位字长) SMALLINT (16位字长)
- 定点数 DECIMAL(p,d)
- 浮点数 FLOAT DOUBLE
- 日期型 DATE “MM-DD-YYYY ”
-
基本表的定义
CREATE TABLE <表名>
(<列名1> <类型1> [列级完整性约束条件]
[, <列名2> <类型2> [列级完整性约束条件] ]
…
[,<表级完整性约束条件>]);
- 外部关键字
- 如果外部关键字只有一个属性,可以在它 的属性名和类型后面直接用“REFERENCES” 说明它参照了某个表的某些属性,其格式为: REFERENCES <表名>(<属性>)
- 在CREATE TABLE语句的属性列表后面增加 一个或几个外部关键字说明,其格式为: FOREIGN KEY (<属性>) REFERENCES <表名> (<属性>)
数据查询
基本格式
SELECT <属性列表>
FROM <基本表>(或视图)
[WHERE <条件表达式>];
单表查询
- 选择表中的若干列(投影)
- 选择表中的若干元组(选择)
- 对查询分组
- 使用集函数
- 对查询结果排序
常用查询条件
| 条件 | 谓词 |
|---|---|
| 比较 | =,>,<,>=,<=,<> |
| 确定范围 | BETWEEN AND, NOT BETWEEN AND |
| 确定集合 | IN , NOT IN |
| 字符匹配 | LIKE,NOT LIKE |
| 空值 | IS NULL IS NOT NULL |
| 多重条件 | AND,OR |
例
- 在学生表中找出全体学生的学号 和姓名。
- SELECT Sno,Sname FROM Student;
- 在学生表中找出全体学生的所有 信息。
- SELECT * FROM Student;
- 在学生表中找出全体学生的姓名 和出生年份。
- SELECT Sname,2021-Sage FROM Student;
- 查找有不及格门次的学生学号
- SELECT DISTINCT Sno
- FROM SC
- WHERE Grade< 60
- 查询年龄在20-22岁(包括20岁和22岁) 之间的学生的姓名、年龄和院系。
- SELECT Sname,Sage,Sdept
- FROM Student
- WHERE Sage BETWEEN 20 AND 22;
- 查询年龄不在20-22岁之间的学生的姓 名、年龄和院系。
- SELECT Sname,Sage,Sdept
- FROM Student
- WHERE Sage NOT BETWEEN 20 AND 22
- 在表学生中找出计算机学院或机电学 院的学生信息。
- SELECT Sname,Sage,Sdept
- FROM Student
- WHERE Sdept IN (‘计算机’ , ‘机电’)
- 查询所有姓李的学生的所有情况。
- SELECT *
- FROM Student
- WHERE Sname like ‘李*’
- 查询学生总人数。
- SELECT COUNT(*)
- FROM Student
- 查询1号课程的平均成绩。
- SELECT AVG(Grade)
- FROM SC
- WHERE Cno=’1’
- 查询各门课程的选课人数。
- SELECT Cno,COUNT(SNO)
- FROM SC
- GROUP BY Cno
- 查询选修了2门以上课程的学生学号。
- SELECT Sno
- FROM SC
- GROUP BY Sno
- HAVING COUNT(Cno)>1
- 查询选修了2号课程的学生学号和成绩, 查询结果按成绩从大到小排列。
- SELECT sno,grade
- FROM sc
- WHERE cno=’2’
- ORDER BY grade DESC
- 求选修了2号学生选修的课程的学生学号
- SELECT DISTINCT A.Sno
- FROM SC A, SC B
- WHERE A.Cno=B.Cno
- And B.Sno=’2’
- and A.Sno<>’2’
求所有学生的选课的课程号和相应成绩
带有IN谓词的子查询
- 带有比较运算符的子查询
- 带有ANY或ALL谓词的子查询(使用ANY和 ALL时必须同时使用比较运算符)
- 带有EXISTS谓词的子查询(查询结果不返回 任何数据,只产生逻辑“真”或“假”)
例
- 查询与刘晨在同一个学院学习的学生
```sql
SELECT Student.Sno, Sname
FROM Student
WHERE Sdept IN(
);SELECT SdeptFROM StudentWHERE Sname=‘刘晨’
- 查询选修了数据库课程的学生学号和姓名```sqlSELECT Sno, SnameFROM StudentWHERE Sno IN(SELECT SnoFROM SCWHERE Cno IN (SELECT CnoFROM CourseWHERE Cname=‘数据库’));
- 查询同时选修了1号和2号课程的学生学号
```sql
select Sno
from SC
where Cno=’1’
and Sno in(
)select Snofrom SCwhere Cno='2'
- 查询选修了1号课程而没有选修2号课程的学生 学号、```sqlselect Snofrom SCwhere Cno='1'and Sno NOT IN (select Snofrom SCwhere Cno='2')
找出每个学生超过他选修课程平均成绩的课程号
SELECT Sno,CnoFROM SC xWHERE Grade >=(SELECT AVG(Grade)FROM SC yWHERE y.Sno=x.Sno)
查询比计算机学院的学生年龄都小的 学生姓名和年龄 ```sql SELECT Sname, Sage FROM Student WHERE Sage < ALL(
SELECT SageFROM StudentWHERE Sdept=‘计算机’
)
- 查询比计算机学院的学生年龄都小的 学生姓名和年龄```sqlSELECT Sname, SageFROM StudentWHERE Sage< (SELECT MIN(Sage)FROM StudentWHERE Sdept='计算机')
- 查询选修了数据库原理课程的学生学号和姓名
```sql
SELECT Sno, Sname
FROM Student
WHERE Sno IN(
);SELECT SnoFROM SCWHERE Cno IN (SELECT CnoFROM CourseWHERE Cname=‘数据库’)
SELECT Sname,Student.Sno FROM Student,SC WHERE Student.Sno=SC.Sno AND Exists (SELECT * FROM Course WHERE Cno = SC.Cno AND Cname=’数据库’);
- 查询没有选修2号课程的学生姓名和学号```sqlSELECT Sname,SnoFROM StudentWHERE NOT EXISTS (SELECT *FROM SCWHERE Sno=Student.SnoAND Cno=‘2’);
- 查询至少选修了1号学生所选全部课程的学生编号








