SQL中的数据处理语言.ppt
实用数据库技术,第4章 SQL中的数据处理语言,学习内容,创建、更改及删除数据 事务 检索数据Where子句聚集查询结果子查询表连接,概述,本章我们将学习了SQL中的数据处理语句,语句,也叫数据处理语言(DML)。包括:创建数据的INSERT语句、更改数据的UPDATE语句、删除数据的DELETE语句及检索数据的SELECT。,INSERT语句,语法 INSERT INTO table_dame(column_list)VALUES(value_list)table_name是表名称,记录将要添加到该表中。,INSERT语句 示例1,Studios表的INSERT语句,INSERT INTO StudiosVALUES(1,Giant,LosAngeles,CA),INSERT语句 示例2,Studios表中的列分别是:studio_id、name、city和state。因为这些值都按照上述顺序包括在VALUES子句中,所以INSERT语句可以正常工作。,INSERT INTO Studios(city,state,name,studio_id)VALUES(Burbank,CA,MPM,2),INSERT语句 小结,在多数数据库中,表中的列都按照它们创建的顺序出现。当使用CREATE TABLE创建新的表时,列的顺序将保持为它们在原始语句中指定的顺序。,UPDATE语句,UPDATE语句用来对表中现有的行作改动。UPDATE语句的结构如下:UPDATE table SET column=value,.WHERE condition,UPDATE语句,UPDATE语句用来对表中现有的行作改动。UPDATE语句的结构如下:UPDATE table SET column=value,.WHERE condition,UPDATE语句,UPDATE语句有3个部分。第一,必须指定要更新哪一个表。该语句的第二部分是SET子句,应当指定其中要更新的列和要插入的值。最后,WHERE子句可以用来指定表中哪些行将要更新。,UPDATE语句 示例1,更改某工作室的城市和州的UPDATE语句,UPDATE Studios SET city=New York,state=NY WHERE studio_id=1 1 row updated.,UPDATE语句 示例1,可以看到,在SET子句中,将city和state字段都进行了更改。WHERE子句表明只有studioID为1的行才能被更新。在编写只对表中某一行产生影响的UPDATE语句时,在WHERE子句中使用主关键字来确保只有一行受到改变的影响往往是一个好办法。如果忽略UPDATE语句中的WHERE子句,那么在更新表中的所有行都将受到该语句的影响。,UPDATE语句 示例2,用UPDATE来更改表中所有行的语句,UPDATE StudiosSET state=AK2 rows updated.,SELECT*FROM StudiosSTUDIO_ID NAME CITY STATE1 Giant New York AK2 MPM Burbank AK,DELETE语句,DELETE语句也可以用来将记录从表中删除。DEILETE语句的结构非常简单:DELETE FROM tableWHERE condition,DELETE语句,可选的WHERE子句可用来限制DELETE语句删除的行数。如果忽略WHERE子句,表中所有的行都会被删除。通过使用WHERE子句,可以指定要想删除每行所必须满足的条件。,DELETE语句 示例,删除Studios 表中所有的行,DELETE FROM StudiosWHERE state=AK2 rows deleted.,检索数据SELECT语句,SELECT语句由大量子句组成,其中的一些是可选项。本节我们讨论SELECT语句的基本子句。下面是简单的SELECT语句的句法:SELECT select_listFROM tableWHERE condition,指定要检索的列,SELECT语句包括了一个WHERE子句,这是一个可选元素,它限制了查询返回的那些行。检索DEPT表中所有行的SELECT语句。,指定要检索的列 示例1,检索DEPT表中所有行的SELECT语句,SELECT deptno,dname FROM DEPT DEPTNO DNAME-10 ACCOUNTING 20 RESEARCH 30 SALES 40 OPERATIONS,指定要检索的列 示例2,检索DEPT表中所有行的SELECT语句,SELECT dname,deptno FROM DEPTDNAME DEPTNO-ACCOUNTING 10RESEARCH 20SALES 30OPERATIONS 40,使用*来选定所有的列,因此不必像下面这样输入:SELECT deptno,dname,loc FROM DEPT只需要这样输入:SELECT*FROM DEPT,使用*来选定所有的列 总结,使用SELECT*的查询结果按照列最初输入CREATE TABLE语句中的顺序来列出所有的列。,在选定的数据上完成计算,利用SQL可以轻松地在数据库中的数据上完成计算并将计算结果包括在查询输出中。要实现上述操作,只需要用包含数字、列名称或二者的数学表达式来代替希望选定的列的清单中的标准输入即可。,将表达式包括在SELECT语句中,数字、数学表达式和字符串全都可以包括在SELECT语句中。,SELECT Hello World!,2+5,ename FROM EMPHELLOWORLD!2+5 ENAME-Hello World!7 SMITHHello World!7 ALLENHello World!7 WARDHello World!7 JONES,包含了数学表达式的查询,在表达式中使用列名称,可以将列名称作为所使用的表达式的组成部分包括在SELECT语句中。,SELECT ename,sal,sal*1.5 FROM EMP ENAME SAL SAL*1.5-SMITH 800 1200ALLEN 1600 2400WARD 1250 1875JONES 2975 4462.5,包括用某列中的数据所进行的计算的查询,SQL支持的算术运算符,SQL中可用的各种算术运算符号。,SQL支持的算术运算符 小结,在SQL中,括号的优先权最高,其次是乘除,再其次是加减。乘除具有相同的优先权,加减具有相同的优先权。因此,乘除或加减都可以用在同一表达式中,具有相同优先权的运算符按从左到右的顺序来计算。,对Name列和表达式使用AS,可以使用AS关键字来为查询中的列和表达式分配名称。这些名称既可以用来改善查询输出的外观,也可以用来为一般情况下名称所不能引用的表达式分配名称。,列和表达式使用AS 分配别名,SELECT expr AS alias,expr2 AS alias,FROM table WHERE condition,AS对表达式重新命名 示例,使用AS对表达式重新命名,SELECT ename,sal AS SALARY,sal*2 AS DOUBLE SALARY FROM EMP ENAME SALARY DOUBLE SALARY-SMITH 800 1600ALLEN 1600 3200WARD 1250 2500JONES 2975 5950,AS对表达式重新命名 小结,别名如果是单个单词(字母中间没有空格)命名,可以加双引号也可以不加,例如:SALARY和SALARY是相同的。但是,如果是由多个单词组成的(单词之间有空格)必须加双引号,例如:DOUBLE SALARY。,对查询结果排序,关系数据库的一个特性是:表中列与行的顺序不重要。行与列都不需要访问,数据库也不按顺序来处理它们。这是一个使它们区别于平面文件和电子表的特性。这就意味着随便按照哪种顺序从数据库中检索记录都很简单。,对查询结果排序,使用ORDERBY子句的SELECT语句的句法遵循下面这种格式:SELECT select_list FROM table WHERE conditmon ORDER BY column|alias|position ASC|DESC),对查询结果排序 示例1,使用ORDER BY子句按照sal列升序排列,SELECT ename,sal AS SALARY FROM EMP WHERE sal 3000 ORDER BY sal ASCENAME SALARY-SMITH 800JAMES 950ADAMS 1100,对查询结果排序 示例2,使用ORDER BY子句按照sal列升序排列,SELECT ename,sal AS SALARY FROM EMP WHERE sal 3000 ORDER BY sal DESCENAME SALARY-JONES 2975BLAKE 2850CLARK 2450,Where子句 概述,WHERE子句用来决定哪些行应当包括在查询结果中。WHERE子句可以作为筛选程序,将那些不合标准的行删除,保留那些合乎标准的行。当然,重要的一点是要记住:WHERE子句不仅仅和SELECT语句一起使用,它还可以用来选择UPDATE和DELETE语句影响的行。不管使用上述3条语句中的哪一条,WHERE子句的用法都是相同的。,比较的运算符,SQl标准支持的比较运算符:,比较的运算符 总结,需要注意的一件事,不仅对于“=”,而且对于所有运算符来说都应注意的是:在检验数字数据时,不必使用单引号标记来包围被比较的数据。,比较的运算符 示例1,不加单引号标记检索,SELECT ename,sal FROM EMP where sal=950ENAME SAL-JAMES 950,比较的运算符 示例2,加单引号标记检索,SELECT ename,sal FROM EMP where sal=950ENAME SAL-JAMES 950,逻辑运算符,SQL提供3种逻辑运算符,允许将多个表达式包括在WHERE子句中。实际上,其中的两个专门用来将多个表达式包括在WHERE子句中,另外一个用来对表达式(或表达式的集合)的结果求反。这3个运算符是:ANDORNOT,逻辑运算符,逻辑运算符 示例1,AND运算符:,SELECT empno,ename,sal,job FROM emp WHERE job=SALESMAN AND sal 3000 EMPNO ENAME SAL JOB-7499 ALLEN 1600 SALESMAN 7521 WARD 1250 SALESMAN 7654 MARTIN 1250 SALESMAN 7844 TURNER 1500 SALESMAN,逻辑运算符 示例2,OR运算符:,SELECT empno,ename,sal,job FROM emp WHERE job=SALESMAN OR sal 3000 EMPNO ENAME SAL JOB-7369 SMITH 800 CLERK 7499 ALLEN 1600 SALESMAN 7521 WARD 1250 SALESMAN 7566 JONES 2975 MANAGER 7934 MILLER 1300 CLERK,逻辑运算符 示例1,NOT运算符:,SELECT empno,ename,sal,job FROM emp WHERE NOT job=SALESMAN AND sal 3000 EMPNO ENAME SAL JOB-7369 SMITH 800 CLERK 7566 JONES 2975 MANAGER 7698 BLAKE 2850 MANAGER 7782 CLARK 2450 MANAGER 7876 ADAMS 1100 CLERK,运算符先后顺序,SQL支持的布尔运算符和数学运算符,按照从高到低的运算顺序排列:,IN子句,SQL语言中还有另外一些子句可以用来简化查询(否则查询将使用多个布尔运算符)。这些子句的一个例子是IN子句,它取代了多个OR运算符,用来检查一组值中是否有一个出现在具体的某列中,IN运算符可以决定被检验的值是否等于某组值中的一个。,IN子句,IN子句的结构:SELECT select_list FROM tableWHERE column NOT IN(value_list),IN子句 总结,经过检验可以看出,有的值与所提供的清单中的某个值相匹配,IN可以选定这些值所在的所有行。有的值与清单中任何一个值都不匹配,而NOT IN则可以选定这些值所在的所有行。,IN子句 示例1,使用IN 子句的查询,SELECT empno,ename,sal,job FROM emp WHERE job IN(CLERK,MANAGER,SALESMAN)EMPNO ENAME SAL JOB-7369 SMITH 800 CLERK 7499 ALLEN 1600 SALESMAN 7521 WARD 1250 SALESMAN 7566 JONES 2975 MANAGER,IN子句 示例2,使用NOT IN 子句的查询,SELECT empno,ename,sal,job FROM emp WHERE job NOT IN(CLERK,MANAGER,SALESMAN)EMPNO ENAME SAL JOB-7788 SCOTT 3000 ANALYST 7839 KING 5000 PRESIDENT 7902 FORD 3000 ANALYST,BETWEEN子句,BETWEEN子句和它的对立面(NOTBETWEEN)可以用来查看一个值是否在某个具体的值域中。下面是一个范例,表明怎样来编写BETWEEN子句:SELECT select_list FROM table WHERE column NOT BETWEEN lower_value AND upper_value,BETWEEN子句 小结,BETWEEN子句被包括在内了,用来指定检验范围的上下限也包括在值域中。NOT BETWEEN用来决定一个值是否超出指定的值域之外。NOT BETWEEN与BETWEEN正相反。它把值域上下限看做包括在值域之内,如果被检验的值等于置于上下线值中的一个的话,表达式就不能判定为“真”。,BETWEEN子句 示例1,使用BETWEEN子句的查询,SELECT empno,ename,sal,job FROM emp WHERE sal BETWEEN 2000 AND 3000 EMPNO ENAME SAL JOB-7566 JONES 2975 MANAGER 7698 BLAKE 2850 MANAGER 7782 CLARK 2450 MANAGER 7788 SCOTT 3000 ANALYST,BETWEEN子句 示例2,使用BETWEEN子句的查询,SELECT empno,ename,sal,job FROM emp WHERE sal NOT BETWEEN 2000 AND 3000 EMPNO ENAME SAL JOB-7369 SMITH 800 CLERK 7499 ALLEN 1600 SALESMAN 7521 WARD 1250 SALESMAN 7654 MARTIN 1250 SALESMAN,使用LIKE来匹配字符串各部分,LIKE子句可用来创建与字符串模式相匹配的简单表达式。在需要查找具有某些相同内容的字符串或者已知字符串的某一部分、但不知道整个字符串时,可以用它来解决问题。LIKE子句也可以用NOT运算符来求反。,使用LIKE来匹配字符串各部分,LIKE运算符可以这样使用:FROM tableWHERE column NOT LIKE pattern,使用LIKE 小结,SQL标准对于模式匹配表达式提供了两种通配符:%(它与任意的字符集合都匹配,包括不包含字符的字符集合)和_(它与任意单个字符相匹配)。程序清单4.22中的查询将会返回所有以“M”开头的人名的数据。,使用LIKE 示例1,使用LIKE子句的查询,SELECT empno,ename,sal,job FROM emp WHERE ename LIKE M%EMPNO ENAME SAL JOB-7654 MARTIN 1250 SALESMAN 7934 MILLER 1300 CLERK,DISTINCT选择惟一值,雇员表emp中包含了相同工种(job),如果需要一个关于数据库中所有工种的简单的清单,那么类似于程序下面的查询将不起作用。程序清单4.25:,SELECT job FROM empJOB-CLERKSALESMANSALESMANMANAGER,DISTINCT选择惟一值,可以看到,所有的工种都列在清单中,但有的工种多次重复出现。SQL提供了DISTINCT运算符,可以将程序清单中的重复值去除。一般来说,DISTINCT运算符的使用方法如下:SELECT DISTINCT select_list FROM table WHER expression ORDER BY expression,DISTINCT选择惟一值,使用DISTINCT运算符,删除了的重复值。只返回工种每一个值的一次出现。程序清单4.26:,SELECT DISTINCT job FROM emp JOB-ANALYSTCLERKMANAGERPRESIDENTSALESMAN,DISTINCT 示例,如果程序清单中提供了多列,这些列中值的每一种单独的组合都将被选定。程序清单4.25中包含了数据库中所有的工资和工种数据。程序清单4.26中包含了使用DISTINCT删除的重复的工作工资和工种的清单。,DISTINCT 示例,检索数据库中所有的工资和工种,SELECT sal,job FROM emp SAL JOB-1250 SALESMAN 1250 SALESMAN 1500 SALESMAN 1100 CLERK 1100 CLERK,DISTINCT 示例,检索数据库中所有的工资和工种,SELECT DISTINCT sal,job FROM emp SAL JOB-1100 CLERK 1250 SALESMAN 1500 SALESMAN,聚集函数,有许多的聚集函数可以在SQL中使用。它们不是要在数据库中的单个字段内容上操作,而是在查询返回的一组值上操作。举例来说,它们允许计算表中与具体标准相匹配的行的数目,也允许你计算表某一列的值的平均数。,聚集函数,这些函数可以处理表中所有的行、用WHERE语句选择的一个表中行的子集或用GROUP BY子句组织的一组所选数据。聚集函数的使用方法如下:SELECT function(column)FROM table WHERE condition,聚集函数,在使用这些函数时,通常选择清单只由单独的一列(将要计算其中的集合值)和所返回的单独的一“行”数据组成。下面我们介绍COUNT(*)、SUM、AVG、MIN和MAX函数。,COUNT(*)函数,COUNT(*)计算查询返回的行的数目,程序清单4.27计算员工人数。,SELECT COUNT(*)FROM emp COUNT(*)-14,SUM函数和AVG函数,SUM函数仅仅用来叠加行中所有的值并返回结果。AVG()函数用来计算值的平均数(在统计数据中即算术平均值)。SUM()函数和AVG()只能处理包含数字数据的列。,SUM函数和AVG函数 示例1,使用SUM()叠加一列中的值,SELECT SUM(sal)FROM emp SUM(SAL)-28825,SUM函数和AVG函数 示例2,使用AVG()叠加一列中的值,SELECT AVG(sal)FROM emp AVG(SAL)-2058.92857,SUM函数和AVG函数 小结,在用SUM()函数或AVG()函数计算含有空值的列时,空值是被忽略的。使用AVG()函数时,空值不包括在总数或值的数目(值的总数将除以这个数目)中。,MIN()和MAX()函数,MIN()函数用来确定一组值中最小值,MAX()函数用来确定一组值中最大值。这两个函数可以用在任何数据类型中。在某一列中可以得到其他值时,MIN()函数和MAX()函数将不返回空值。空值作为未知对待,因而不能认为它大于或小于其他任何值。,MIN()和MAX()函数 示例1,MIN()函数使用范例,它将要查找员工表(emp)中工资最低的员工工资。,SELECT MIN(sal)FROM emp MIN(SAL)-800,MIN()和MAX()函数 示例2,MAX()函数使用范例,它将要查找员工表(emp)中工资最高的员工工资。,SELECT MAX(sal)FROM emp MAX(SAL)-5000,GROUP BY子句,GROUP BY子句根据数据库中每一列的内容对查询结果分类。从这方面来说,它与DISTINCT有一些相似,因为它为你打算用来对数据进行分组的列中的独一无二的值都返回一行。然而与DISTINCT不同的是,如果在表中其他列里使用聚集函数,GROUP BY将根据分组后的列的值对各行的组合使用这个功能。,GROUP BY子句,使用GROUP BY子句的句法如下:SELECT select_listFROM tableWHERE conditionGROUP BY group_by_listORDER BY order_by_list,GROUP BY子句 示例1,用来计算emp表中的 所有工资的SUM()函数:,SELECT SUM(sal)FROM emp SUM(SAL)-28825,GROUP BY子句 示例2,用来计算emp表中的每一个部门的工资合计的SUM()函数:,SELECT deptno,SUM(sal)FROM emp GROUP BY deptno DEPTNO SUM(SAL)-10 8550 20 10875 30 9400,GROUP BY子句 小结,GROUP BY子句可以和任意的聚集函数一起使用,COUNT()、SUM()、AVG()、MIN()和MAX()都能产生预期的效果。,使用HAVING筛选查询结果,当使用GROUP BY语句时,SQL提供了另外一种筛选查询结果的方法。与WHERE子句在查询结果分组之前筛选查询结果不同的是,HAVING子句在对查询结果分组之后对结果进行筛选。,HAVING 示例,假设你希望查找所有的部门工资合计总不到10000部门。程序清单4.34所示。,SELECT deptno,SUM(sal)FROM emp GROUP BY deptno HAVING SUM(sal)10000 DEPTNO SUM(SAL)-10 8550 30 9400,HAVING 示例1,假设你希望查找所有的部门工资合计总不到10000部门。程序清单4.34所示。,SELECT deptno,SUM(sal)FROM emp GROUP BY deptno HAVING SUM(sal)10000 DEPTNO SUM(SAL)-10 8550 30 9400,HAVING 示例2,使用HAVING、GROUPBY和ORDERBY子句的语句:,SELECT deptno,SUM(sal)FROM emp GROUP BY deptno HAVING SUM(sal)10000 ORDER BY deptno DESC DEPTNO SUM(SAL)-30 9400 10 8550,HAVING 小结,可以看到,选择清单和HAVING子句中都使用了程序清单4.34中的聚集函数。一个常见的错误是在HAVING子句中单独使用列名,但是这样将会产生错误。选择清单和HAVING子句中表达式必须一致。没有在HAVING子句中出现的列名根本不能在选择清单中使用。HAVING子句出现在ORDER BY子句之前,但是在GROUP BY子句之后。,子查询概念,有时,在SQL查询中实现具体目标的最简单方法就是在另一条查询中使用某条查询的输出。这种嵌套式查询作为子查询来引用,它们可以用在WHERE子句中帮助筛选数据。当数据存储在需要用在另一条查询某个位置处的具体表中时,可以使用子查询,它们基本上与嵌套相似。正如可以在另一个函数调用中嵌套函数调用一样,也可以在其他查询内部嵌套查询。,子查询概念,从最简单的意义来看,子查询(subquery)是嵌套在另一个SQL语句中并提供嵌套它的语句所使用的数据的SELECT语句。,子查询概念,IN表达式中的子查询,SELECT empno,ename FROM emp WHERE deptno IN(SELECT deptno FROM dept WHERE dname=SALES)EMPNO ENAME-7499 ALLEN 7521 WARD 7654 MARTIN 7698 BLAKE 7844 TURNER 7900 JAMES,外查询,子查询,子查询概念 小结,子查询有两种类型:相关和无关。相关子查询要求在执行以前由外部查询返回的数据。子查询随后使用从外部查询接收到的数据来执行,由子查询返回的数据反向插入外部查询中进行比较。无关子查询在外部查询之前进行判定,由子查询返回的数据被外部查询使用。无关子查询比相关子查询简单。相关子查询本书不做介绍。,返回值的清单的子查询,子查询可以用在两个不同的上下文中,即需要单个值的上下文和需要值的清单的上下文。在需要值的清单时,子查询可以返回任意数量的值(包括0),而且在查询中运行正常。返回值的清单的子查询,通常使用关键字IN、NOT IN、EXISTS、NOT EXISTS、ANY和ALL来进行子查询。,返回值的清单的子查询 示例,NOT IN表达式中的子查询:,SELECT empno,ename FROM emp WHERE deptno NOT IN(SELECT deptno FROM dept WHERE dname=SALES)EMPNO ENAME-7369 SMITH 7566 JONES 7782 CLARK 7788 SCOTT,小结,用在WHERE子句中的子查询必须始终从单列中返回值。在于查询的选择清单中指定多列通常会产生错误。下面的写法错误的。,SELECT empno,ename FROM emp WHERE deptno IN(SELECT deptno,dname FROM dept WHERE dname=SALES),返回单个值的子查询,使用聚集函数的子查询总是返回单个值(只要不使用GROUP BY子句)。因此,通过使用聚集函数,可以使用伴随子查询的标准的比较运算符。,返回单个值的子查询 示例,查询使用AVG()聚集函数来查找所有工资超过平均工资的员工。,SELECT empno,ename FROM emp WHERE sal(SELECT AVG(sal)FROM emp);EMPNO ENAME-7566 JONES 7698 BLAKE 7782 CLARK,嵌套子查询,子查询提供了无尽的嵌套。正如子查询可以嵌套在标准查询中一样,它也可以嵌套在另一个子查询中。对于所提供的嵌套来说,惟一的限制就是性能。随着对子查询一层接一层地嵌套,查询的性能也会不断下降。,嵌套子查询 示例,查出超出了平均工资的员工所在的部门,程序清单4.39使用了一个嵌套在另一个子查询中的子查询来解决这个问题。,嵌套子查询 示例,SELECT dname FROM dept WHERE deptno IN(SELECT deptno FROM emp WHERE sal(SELECT AVG(sal)FROM emp)DNAME-ACCOUNTINGRESEARCHSALES,嵌套子查询,表连接,连接(join)就是将多个表中的数据结合在一起的查询。连接的分类:内连接(natural join)外连接(outer join)左外连接右外连接全外连接,内连接,内连接(natural join)也称自然连接,内连接有以下两种语法格式:,第一种格式:SELECT column_listFROM table1,tableWHERE condition第二种格式:SELECT column_listFROM table1 INNER JOIN table2 ON table1.column1=table2.column1,内连接实例,员工表(emp)数据 部门表(dept)数据,内连接实例,代码清单:,SELECT dept.deptno,dept.dname,emp.empno,emp.ename FROM dept,empWHERE dept.deptno=emp.deptno或者SELECT dept.deptno,dept.dname,emp.empno,emp.ename FROM dept JOIN emp ON dept.deptno=emp.deptno,内连接实例,外连接,左外连接,左外连接就是将左表的所有记录分别与右表的每一条记录进行连接组合,结果集中除返回内部连接的记录以外,还在查询结果中显示出左表中不符合条件的记录并在右表的相应列中填上NULL值。(由于bit类型不允许为NULL,就以0值填充)。,左外连接的语法格式为:,SELECT column_listFROM table1 LEFT OUTER JOIN table2 ON table1.column1=table2.column1,左外连接 实例,程序清单,SELECT dept.deptno,dept.dname,emp.empno,emp.ename FROM dept LEFT JOIN emp ON dept.deptno=emp.deptno,左外连接 实例,右外连接,右外连接就是将左表的所有记录分别与右表的每一条记录进行连接组合,结果集中除返回内部连接的记录以外,还在查询结果中显示出右表中不符合条件的记录并在左表的相应列中填上NULL值。,右外连接的语法格式为:,SELECT column_listFROM table1 RIGHT OUTER JOIN table2 ON table1.column1=table2.column1,右外连接 实例,程序清单,SELECT dept.deptno,dept.dname,emp.empno,emp.ename FROM dept RIGHT JOIN emp ON dept.deptno=emp.deptno,右外连接 实例,表连接总结,有实际意义的表连接,要有连接条件的,而且连接条件之间是可以兼容的。程序清单4.44有连接条件,查出的数据为14条记录。字段“deptno”在Dept表中是主键,在Emp表中是外键。换句话说,表中的数据之所以有意义是因为它只包含两张表中相互有关系的记录,而纯粹由笛卡尔积组成的表包含了许多额外的、无意义的记录如程序清单4.4 所示。,程序清单4.44 EMP表和DEPT表有连接条件SELECT Dept.deptno,Dept.dname,Emp.empno,Emp.ename FROM Dept,EmpWHERE Dept.deptno=Emp.deptno DEPTNO DNAME EMPNO ENAME-20 RESEARCH 7369 SMITH。10 ACCOUNTING 7934 MILLER已选择14行。,程序清单4.45 EMP表和DEPT表无连接条件SELECT Dept.deptno,Dept.dname,Emp.empno,Emp.ename FROM Dept,Emp DEPTNO DNAME EMPNO ENAME-10 ACCOUNTING 7369 SMITH 20 RESEARCH 7369 SMITH。30 SALES 7934 MILLER已选择56行。,