Mysql关系代数的使用

关系代数与SQL语句
    (关系代数可递归调用,结果的查询是基于操作符的顺序,关系数据库正是使用代数表达式来表示查询执行的计划。)
     1)选择λ    

        从表中选出符合条件的行, 用于选择条件的比较操作符有:>,>=,<,<=,=,!=。逻辑运算符有AND,OR,NOT,对应WHERE。
     instance:
      SELECT * FROM student WHERE stuClass = '计0001' AND stuName = '张三'

'Mysql关系代数的使用_第1张图片   

                 表students

Mysql关系代数的使用_第2张图片

                  查询结果

    2)投影π       

从表中抽出所需的一列和多列,重复元组会保留,对应SELECT.

instance:

 SELECT stuName FROM student WHERE stuClass = '计0004'

Mysql关系代数的使用_第3张图片

  查询结果

Mysql关系代数的使用_第4张图片

3)集合操作

     1> UNION(并):元组出现在A中或者出现在B中

     使用要求 :两个表的结构要完全一致,重复的元组只保留一组。

    instance:

SELECT * FROM student
UNION
SELECT * FROM student1

Mysql关系代数的使用_第5张图片

                       表student1

Mysql关系代数的使用_第6张图片

                     表student

查询结果

Mysql关系代数的使用_第7张图片

Mysql关系代数的使用_第8张图片

 

     2> INTERSECTION(交):元组即出现在A中又出现在B中

MySQL不支持INTERSECTION关键字,但是可以用INNER JOIN或IN实现同样的效果。

instance:

SELECT * FROM student1
WHERE student1.stuNumber  IN (SELECT student.stuNumber FROM student)

表student1

Mysql关系代数的使用_第9张图片

表student

Mysql关系代数的使用_第10张图片

查询结果

Mysql关系代数的使用_第11张图片

     3> DIFFERENCE(差):A-B 元组只出现在A中不出现在B中

MySQL不支持EXCEPT关键字,可以用NOT IN 来实现同样的效果

instance:

SELECT * FROM student1 

WHERE student1.stuNumber NOT IN (SELECT student.stuNumber FROM student)

不支持:

SELECT * FROM student
EXCEPT
SELECT * FROM student1

查询结果

Mysql关系代数的使用_第12张图片

     4> CROSS PRODUCT(笛卡尔积)    对应FROM.

把A(m),B(n)两张表中的column全部提取出来构成一个查询集合,类似于矩阵相乘,A中的每一个元组都要和B中的元组连接一遍,结果是A*B(m*n)。

instance:

SELECT * FROM student1,class

表student1

Mysql关系代数的使用_第13张图片

表class

Mysql关系代数的使用_第14张图片

查询结果

Mysql关系代数的使用_第15张图片

Mysql关系代数的使用_第16张图片

4)联结操作

          联结操作可以定义为A*B之后再做选择操作,但是查询结果比笛卡尔积小,所以使用广泛。

      1>条件连接

         即A,B两表做笛卡尔积后在根据连接条件缩小数据范围。

instance:

SELECT * FROM student1,class
WHERE claName = '计算机01班' 

SELECT * FROM student1 CROSS JOIN class
WHERE claName = '计算机01班' 
 

查询结果(根据上一节CROSS PRODUCT(笛卡尔积)的查询结果在加上班级名的限制条件)
Mysql关系代数的使用_第17张图片

      2>等连接(也叫做 inner join)

是条件连接的特例,只是条件表达式中只能有“=”,不能包含<,<=,>,>=,或!=这些比较符。

instance:

SELECT stuNumber, stuName, claName FROM student,class   (SQL-92的写法)
WHERE claNumber = stuClass
或者

(使用 inner join 的写法时连接条件要通过ON引出)

SELECT stuNumber, stuName, claName                                    (T-SQL的写法)
FROM student INNER JOIN class ON stuClass = claNumber

查询结果

Mysql关系代数的使用_第18张图片

Mysql关系代数的使用_第19张图片

    

      3>自然连接

是等连接的特例,条件表达式所涉及的字段也必须相同,查询从表的时候同时查主表对应的元组。使用natural join 关键字可以不显示的写明连接条件,会自动隐含两表相同字段的相等条件。

instance:

SELECT * FROM student NATURAL JOIN student1    等同 SELECT * FROM student,student1 
                                                                                                WHERE student.stuName = student1.stuName
                                                                                                 AND student.stuClass = student1.stuClass
                                                                                                 AND student.stuNumber = student1.stuNumber
 

查询结果

      4>外连接

与外联接对应,前面三种都属于内连接(inner join),外连接又分左外连接(left join)(也可以写作left outer join),右外连接(right join/right outer join)和全外连接(full join/full outer join),连接条件要通过ON引出。

左外连接(left join/left outer join):A  left join B,以左边的 A表为准,在右边的B表中寻找与A中的行对应的行,如果没有则设置为NULL。也可以表示为返回除自然连接外左边A表中不符合条件的元组。

右外连接(right join/right outer join):A right join B,以右边的 B表为准,在右边的A表中寻找与B中的行对应的行,如果没有则设置为NULL。也可以表示为返回除自然连接外右边B表中不符合条件的元组。

全外连接(full join/full outer join):除自然连接外还返回左右两边不符合条件的所有元组,结果是左连接和右连接的并集去掉从复元组。

instance:

SELECT student.stuNumber,stuName,class.claName

FROM student RIGHT JOIN class
ON student.stuClass = class.claNumber

表class

Mysql关系代数的使用_第20张图片

表student1

Mysql关系代数的使用_第21张图片

查询结果

Mysql关系代数的使用_第22张图片

你可能感兴趣的:(MYSQL)