关系数据库 第二瓣
多表连接查询
连接查询是关系数据库中最主要的查询,主要包括内连接、外连接和交叉连接等。
1.内连接
使用内连接时,如果两个表的相关字段满足连接条件,则从这两个表中提取数据并组合成新的记录。
在非ANSI标准的实现中,连接操作时在WHERE子句中执行的,在ANSI SQL-92中,连接是在JOIN子句中执行的。这些连接方式分别称为theta连接和ANSI连接。
内连接格式为:FROM 表1 [INNER] JOIN 表2 ON 连接条件
形如:
SELECT * FROM Student INNER JOIN SC ON Student.Sno = SC.Sno;
SELECT Student.Sno, Sname, Ssex, Sage, Sdept, Cno, Grade, FROM Student JOIN SC ON Student.Sno = SC.Sno;
SELECT Sname, Cname, Grade FROM Student S JOIN SC ON S.Sno = SC.Sno
注:当为表指定了别名后,在查询语句中的其他地方都要使用别名。
2.自连接
自连接是一种特殊的内连接,它是指相互连接的表在物理上为同一张表,但在逻辑上分为两张表。使用自连接时,必须为两张表取别名,使之在逻辑上成为两张表。
SELECT S2.Sname, S2.Sdept FROM Student S1 JOIN Student S2 ON S1.Sdept = S2.Sdept WHERE S1.Sname= '王智博' AND S2.Sname!='王智博'
3.外连接
内连接中只有满足连接条件的元组才能作为结果输出,但有时我们也希望输出那些不满足连接条件的元组的信息,这是就需使用外连接。
外连接只限制一张表中的数据必须满足连接条件,二另一张表中的数据可以不满足连接条件。
ANSI方式的外连接语法格式为:
FROM 表1 LEFT|RIGHT [OUTER] JOIN 表2 ON 连接条件
左外连接:限制表2中的数据必须满足连接条件,而不管表1中的数据是否满足连接条件,均输出表1中的内容。
右外连接:限制表1中的数据必须满足连接条件,而不管表2中的数据是否满足连接条件,均输出表2中的内容。
SELECT Student.Sno, Sname, Cno, Grade FROM Student LEFT OUTER JOIN SC ON Student.Sno = SC.Sno
4.子查询
在SQL语言中,一个SELECT-FROM-WHERE语句称为一个查询块。
1.使用子查询进行基于集合的测试
SELECT Sno,Sname,Sdept FROM Student WHERE Sdept IN (SELECT Sdept FROM Student WHERE Sname='王智博') AND Sname!='王智博'
2.使用子查询进行比较测试
SELECT Sno,Grade FROM SC WHERE Cno='C02' and Grade>(SELECT AVG(Grade) FROM SC WHERE Cno='C02')
3.使用子查询进行存在性测试
SELECT Sname FROM Student WHERE EXISTS (SELECT * FROM SC JOIN Student ON Sno = Student.Sno AND Cno='C01')
数据更改功能
1.插入数据
INSERT [INTO] 表名 [(列名列表)] VALUES (值列表)
例如:
INSERT INTO SC (Sno, Cno, XKLB) VALUES ('9521105', 'C01', '必修');
INSERT INTO SC VALUES ('9521105', 'C01', '必修'); --如果全部赋值,则不必写列名列表
2.更新数据
UPDATE 表名 SET 列名=表达式 [,…n] [WHERE 更新条件]
例如:
UPDATE Student SET Sage = Sage +1
UPDATE Student SET Sage = 21 WHERE Sno='950101'
UPDATE Student SET Sage = 21 WHERE Sno IN (SELECT Sno FROM Student WHERE Sdept = '计算机系')
UPDATE Student SET Grade =21 FROM SC JOIN Student ON SC.Sno = Student.Sno WHERE Sdept='计算机系'
3.删除数据
DELETE [FROM] 表名 [WHERE 删除条件]
DELETE FROM SC;
DELETE FROM SC FROM SC JOIN Student ON SC.Sno = Student.Sno WHERE Sdept='计算机系' AND Grade<60;