数据库语言SQL
1.SQL中的简单查询
1.1 select-from-where
- from:给出查询所引用的关系
- where:条件字句,类似于关系代数中的选择条件
- select:决定满足条件的元组的哪些属性应该在结果中列出
1.2 SQL查询具有过程
对from字句关系中的每个元组,使用where字句中指定的条件进行筛选,然后投影到select字句中的属性或表达式列表上(注:SQL大小写无关)
示例:
去掉重复元组:
SELECT DINTINCT Sno FROM SC;
起别名:
SELECT title as name, length as duration FROM movies where studioname=“Disney” AND year=“1990”
计算:
SELECT title AS name, length*0.0166 as lengthHours FROM movies where studioname=“Disney” AND year=“1990”;
加新列加常量:
SELECT title AS name, length*0.0166 as lengthHours, “hrs.” AS inHours FROM movies where studioname=“Disney” AND year=“1990”;
1.3 SQL的选择
关系代数中的选择操作符在SQL中是通过SQL的WHERE字句表示
运算符/关键
- 比较: =, >, <, >=, <=, <>, !>, !<
- 确定范围:[NOT] BETWEEN…AND…
- 确定集合:[NOT] IN
- 逻辑:AND NOT OR
- 字符匹配:[NOT] LIKE
- 空值:IS [NOT] NULL
- 串的拼接:||
范围示例:
SELECT Sname, Sdept, Sage FROM Students WHERE Sage BETWEEN 20 AND 30;
集合示例:
SELECT Sname, Sdept, Sage FROM Students WHERE Sdept IN (“计算机”,“信息”)
字符匹配:LIKE 匹配串
通配符:
(1)%:任意长度为n的字符串n>=0
(2)_:任意字符
(3)[ ]:指定范围内的任意单个字符
(4)[^]:不在指定范围内的任意单个字符
示例
LIKE ‘%been%’
LIKE ‘Ma%’
LIKE ‘[CK]%’ 第一个是C或K
LIKE ‘[^A-D]%’ 第一个不是A-D之间的字符
LIKE ‘%ea_’
LIKE ‘_en’
除此之外还有换码/转义字符
LIKE ‘X% % X%’ ESCAPE ‘X’
表示%…%(X可为任意字符)
1.4 SQL排序
格式 ORDER BY (list of attribute) [ASC | DESC]
ASC升序(默认),DESC降序
SELECT Sno, Grade FROM SC WHERE Cno=‘3’ ORDER BY Grade DESC
SELECT * FROM Students ORDER BY Sdept ASC, Sage DESC
2.多关系查询
- FROM 后面接多个关系,关系之间用“ ,”隔开表示关系之间进行笛卡尔积连接
SLECT Students.* , SC.Cno , SC.Grade FROM Students, SC WHERE Students.Sno=SC.Sno
// 自然连接 对两个关系进行笛卡尔积连接,经WHERE字句筛选得到的新关系正是自然连接后得到的关系
- 集合查询
2.1 集合操作:
- 并:UNION
- 交:INTERSECT
- 差:EXCEPT
这些查询结果提供的关系具有相同的属性和属性类型列表,默认情况下去掉重复元组
(SELECT name, address FROM MovieStars WHERE gender = ‘F’)
INTERSECT
(SELECT name, address FROM MovieExecs WHERE netWordth>=10000000)
3.子查询
3.1 当某个查询是另一个查询的一部分时,称之为子查询。可以根据需要拥有多级子查询。子查询又可分为独立子查询和相关子查询(关联子查询)
子查询的几种形式:
- 比较运算符(子查询)
- [NOT] IN(子查询)
- 比较运算符+[ANY | ALL](子查询)
- 测试存在的子查询
SELECT Sno, Sname, Sdept
FROM Students
WHERE Sdept IN //若是子查询得到的是单值,则可直接使用“=”
(SELECT Sdept FROM Students WHERE Sname=‘刘雪’)
3.2 比较运算符+ANY | ALL
ANY——某一个,有一个(存在),ALL——所有
ANY——比最大的小,比最小的大
ALL——比最大的大,比最小的小
示例
SELECT DINTINCT title FROM Movies as Old WHERE year<ANY (SELECT year FROM Movies WHERE title=Old.title)
查询其他系比经管系某一学生年龄小的学生姓名、年龄
SELECT Sname, Sage FROM Students WHERE Sage<ANY( SELECT Sage FROM Students WHERE Sdept=“经管系”) AND Sdept<>“经管系”
3.3 测试存在的子查询EXISTS
EXISTS(子查询)——子查询结果集行数>0时为真
NOT EXISTS(子查询)——子查询结果集行数>0时为假,行数=0时为真
3.5 关联子查询
子查询要计算多次,主要针对ANY/ALL
SELECT title FROM movie old WHERE year<ANY( SELECT year FROM movie WHERE title = old.title)
子查询可以在WHERE字句里作为条件的一部分
也可以在FROM字句里,作为新关系,如
SELECT name FROM MoviesExecs, (SELECT producerC# FROM Movies, StarsIn WHERE title=movieTitle AND year =movieYear AND starName=“Harrison Ford”) Prod
WHERE CERT#=Prod.prodercerC#
3.6 SQL的连接表达式
(1)笛卡尔积:“,”
(2)条件连接:关系1 JOIN 关系2 ON 条件
(3)自然连接:NATURAL JOIN
(4)外连接:NOTURAL FULL/LEFT/RIGHT OUTER JOIN(全、左外、右外连接)
4 全关系操作
关系执行顺序:
FROM—>WHERE—>GROUP BY—>HAVING—>SELECT—>ORDER BY
4.1 消除重复
方式一:DISTINCT
方式二(并、交、差中的重复):必须在UNION, INTERSECT, EXCEPT后加上ALL,如 >> R UNION ALL S
4.2 使用聚集函数
- AVG ([ALL | DINTINCT] 列名)
- COUNT([ALL | DINTINCT] 列名)
- COUNT(*)
- MAX()
- MIN()
- SUM([ALL | DINTINCT] 列名)
4.3 分组ORDER BY
分组是对关系进行分块,关系默认情况下是一块,而聚集函数是对块进行操作
SELECT name, SUM(length) FROM MovieExecs, Movies WHERE prodecerC#=cer# AND netWorth>10000000 GROUP BY name
HAVING字句:用于GROUP BY 字句后,选择满足条件的分组。尤其如果分组时需要考虑某些聚焦操作,就只能用HAVING字句,而不能用WHERE字句
查询经管系选修3门课程以上的学生姓名
SELECT Students.Sname FROM SC, Students WHERE SC.Sno = Students.Sno AND Students.Sdept = “经管系” GROUP BY Students.Sno HAVING COUNT(*)>3