关系数据库 第二瓣

多表连接查询

  连接查询是关系数据库中最主要的查询,主要包括内连接、外连接和交叉连接等。

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;

 

    

    

  

  

posted @ 2013-10-07 17:11  programmertata  阅读(263)  评论(0编辑  收藏  举报