多表查询

多表查询

首先把准备工作都做好~~

 

 

 

1、交叉连接

   交叉连接返回的结果是被连接的两个表中所有数据行的笛卡尔积,也就是返回第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数

  例子:例如department表中有4个部门,employee表中有4个员工,则交叉连接的结果就有4*4=16条数据)

    格式:SELECT * from 1 CROSS JOIN 2

    注:CROSS JOIN用于连接两个要查询的表,通过该语句可以查询两个表中所有的数据组合。

先创建两张表,并插入数据

 

 

 

 

 

(修改一下,人事部的id5,后面的操作中也是)

 

查看

从表中可以看出数据很混乱,这就是交叉连接的弊端,交叉连接的数据可能不是我们想要的数据,甚至会出现错误要想得到我们想要的数据,要使用内连接

2、内连接

  内连接(INNER JOIN)又称简单连接或自然连接,是一种常见的连接查询。

  内连接使用比较运算符对两个表中的数据进行比较,并列出与连接条件匹配的数据行,组合成新的记录,也就是说在内连接查询中,只有满足条件的记录才能出现的查询结果中。

 格式:SELECT 查询字段 FROM 表1 [INNER] JOIN 表2 ON 表1.关系字段 = 表2.关系字段

 注:INNER JOIN用于连接两个表,ON来指定连接条件,其中INNER可以省略

①(在department表和employee表之间使用内连接查询)

(在department表和employee表之间使用WHERE

如上两图,两种不同方式查找出来的数据是一样的

 

③(在department表和employee表之间使用自连接查询)

 

翻译:王红所在的是网络部

 

如图2,p1、p2是两张表的简称,可以省略

3、外连接

  外连接分为左连接和右连接

   格式:SELECT 所查字段 FROM 表1 LEFT|RIGHT [OUTER] JOIN 表2

              ON 表1.关系字段 = 表2.关系字段 WHERE 条件

   注:a、外连接的语法格式和内连接类似,只不过使用的是LEFT JOIN、RIGHT JOIN关键字,其中关键字左边的表被称为左表,关键字右边的表被称为右表。

             b、在使用左连接和右连接查询时,查询结果是不一致的

    ①LEFT JOIN(左连接)

      注:返回包括左表中的所有记录和右表中符合连接条件的记录。

     左连接的结果包括LEFT JOIN子句中指定的左表的所有记录,和所有满足连接条件的记录(on后面的数据)。如果左表的某条记录在右表中不存在,则在右表中显示为空。

 

      department表和employee表之间使用左连接查询:

 

如图所示,显示了5条记录,并且人事部没有did等于5的员工,所以是空值

    ②RIGHT JOIN(右连接)

      注:返回包括右表中的所有记录和左表中符合连接条件的记录。

      右连接与左连接正好相反,返回右表中所有指定的记录和所有满足连接条件的记录。如果右表的某条记录在左表中没有匹配,则左表将返回空值。

      

       department表和employee表之间使用右连接查询:

        

     如图所示,显示了4条记录,并且name值为郝娟的员工并没有被分配部门,所以是空值

4、复合条件连接查询

  复合条件连接查询就是在连接查询的过程中,通过添加过滤条件来限制查询结果,使查询结果更加精确。

①在department表和employee表之间使用内连接查询并将查询结果按照年龄的升序排序:

 

②带IN关键字的子查询

注:使用IN关键字进行子查询时,内层查询语句仅仅返回一个数据列,这个数据列中的值将供外层查询语句进行比较操作。

  (查询存在年龄为20岁的员工的部门)

  A

图一,age=20的工牌号          图2,工牌号所属员工的所在部门

 B、

注意:B中的公式(是A中的1+2),A和B的结果是一样的

 

(查询不存在年龄为20岁的员工的部门)

 

直接在IN前添加一个NOT即可。

③带EXISTS关键字的子查询

注:EXISTS关键字后面的参数可以是任意一个子查询,这个子查询的作用相当于测试,它不产生任何数据,

      只返回TRUEFALSE,当返回值为TRUE时,外层查询才会执行。

翻译:查询employee表中是否存在年龄大于21岁的员工,如果存在,则查询department表中的所有记录

注:需要注意的是,EXISTS关键字比IN关键字的运行效率高,所以在实际开发中,特别是大数据量时,推荐使用EXISTS关键字。

④带ANY关键字的子查询

  注:ANY关键字表示满足其中任意一个条件,它允许创建一个表达式对子查询的返回值列表进行比较,

       只要满足内层子查询中的任意一个比较条件,就返回一个结果作为外层查询条件。

department编号:1235employee编号:1234 2>14>35>4,只要其中一个did大于某个d_id;

⑤带ALL关键字的子查询

 注:ALL关键字与ANY有点类似,只不过带ALL关键字的子查询返回的结果需同时满足所有内层查询条件。

 

 

 

⑥带比较运算符的子查询

  注:子查询中可以使用比较运算符,如>”、“<”、“>=”、“=”、“!=”等。

  操作:查询赵四是哪个部门的员工

 

 

 

 

 

 

 

 emmmmmm

有关外键的内容以后再补充吧.....................

posted @ 2019-12-13 14:23  CcCYR  阅读(458)  评论(0编辑  收藏  举报