是指一个从多个表中的数据进行的查询。连接一般使用表的主键和外键。 连接类型: 等连接、不等连接、外连接、自连接 二、Cartesian product : 指的是当JOIN条件被省略或无效时,所有表的行(交叉)都被SELECT出来的现象。 Cartesian product可以产生大量的记录,除非是你有意如此,否则应该加上某种条件限制。 SQL> SELECT name, last_name 2 FROM s_dept, s_emp; 300 rows selected. 其中一个表12行,一个表25行。
三、简单连接查询: SELECT table.column, table.column... FROM table1, table2 WHERE table1.column1 = table2.column2;
如:SQL> SELECT s_emp.last_name, s_emp.dept_id, 2 s_dept.name 3 FROM s_emp, s_dept 4 WHERE s_emp.dept_id = s_dept.id; 注意:表前缀的重要性: SQL> SELECT s_dept.id ”Department ID”, 2 s_region.id ”Region ID”, 3 s_region.name ”Region Name” 4 FROM s_dept, s_region 5 WHERE s_dept.region_id = s_region.id; 在WHERE 段中,如果没有前缀,两个表中都有ID字段,就显得的模棱两可,AMBIGUOUS。 这在实际中应该尽量避免。 WHERE 字段中,还可以有其他的连接条件,如在上例中,加上: INITCAP(s_dept.last_name) = ’Menchu’; 再如:WHERE s_emp.dept_id = s_dept.id AND s_dept.region_id = s_region.id AND s_emp.commission_pct > 0;
四、表别名ALIAS: 1、使用别名进行多表查询 。 2、仅在这个查询中生效,一旦用了表别名,就不能再用表的原有的名字进行连接。 实例: SQL> SELECT c.name ”Customer Name”, 2 c.region_id ”Region ID”, 3 r.name ”Region Name” 4 FROM s_customer c, s_region r 5 WHERE c.region_id = r.id; 别名最多可以30个字符,但当然越少越好。最好也能容易识别。 五、非等连接 非等连接一般用在没有明确的等量关系的两个表; 最简单的说:非等连接就是在连接中没有“=”出现的连接。 SQL> SELECT e.ename, e.job, e.sal, s.grade 2 FROM emp e, salgrade s 3 WHERE e.sal BETWEEN s.losal AND s.hisal; 说明:Create a non-equijoin to evaluate an employee’s salary grade. The salary 必须在另一个表中最高和最低之间。 其他操作符<= >= 也可以实现,但是BETWEEN是非常简单实用的。 BETWEEN ....AND是指闭区间的,这点要注意 ,请大家测试。 六、外连接 语法结构:SELECT table.column, table.column FROM table1, table2 WHERE table1.column = table2.column(+); 实例: SQL> SELECT e.last_name, e.id, c.name 2 FROM s_emp e, s_customer c 3 WHERE e.id (+) = c.sales_rep_id 4 ORDER BY e.id; 显示.....,即使有的客户没有销售代表。 * 可以理解为有+号的一边出现了NULL,也可以做为合法的条件。 外连接的限制: 1、外连接符只能出现在信息缺少的那边。 2、在条件中,不能用 IN 或者 OR做连接符。 七、自连接 同一个表中使用连接符进行查询; FROM 的后面用同一个表的两个别名。 实例: SQL> SELECT worker.last_name||’ works for ’|| 2 manager.last_name 3 FROM s_emp worker, s_emp manager 4 WHERE worker.manager_id = manager.id; 意味着:一个员工的经理ID匹配了经理的员工号,但这个像绕口令的连接方式并不常用。 以后我们会见到一种 子查询: select last_name from s_emp where salary=(select max(salary) from s_emp) 也可以看作是一种变向的自连接,但通常我们将其
课程 四 组函数
本课重点: 1、了解可用的组函数 2、说明每个组函数的使用方法 3、使用GROUP BY 4、通过HAVING来限制返回组 注意:以下实例中标点均为英文半角 一、概念: 组函数是指按每组返回结果的函数。 组函数可以出现在SELECT和HAVING 字段中。 GROUP BY把SELECT 的结果集分成几个小组。 HAVING 来限制返回组,对RESULT SET而言。 二、组函数:(#号的函数不做重点) 1、AVG 2、COUNT 3、MAX 4、MIN 5、STDDEV # 6、SUM 7、VARIANCE # 语法: SELECT column, group_function FROM table [WHERE condition] [GROUP BY group_by_expression] [HAVING group_condition] [ORDER BY column]; 实例1:一个混合实例,说明所有问题: SQL> SELECT AVG(salary), MAX(salary), MIN(salary), 2 SUM(salary) 3 FROM s_emp 4 WHERE UPPER(title) LIKE ’SALES%’; AVG(SALARY) MAX(SALARY) MIN(SALARY) SUM(SALARY) ----------- ----------- ----------- ----------- 1476 1525 1400 7380 说明:很多函数,我们在讲函数的已经向大家介绍过,但在此为何叫分组函数呢,主要是因为它们可以与GROUP BY来形成对不同组的计算,相当于在很多值中进行挑选。 * MIN MAX函数可以接任何数据类型。 如果是MIN(last_name), MAX(last_name),返回的是什么呢? 千万记住,不是指LAST_NAME的长度,而是指在FIRST字母的前后顺序,第一个相同,然后比较第二个,如:xdopt > cssingkdkdk > adopt > acccc 实例2: SQL> SELECT COUNT(commission_pct) 2 FROM s_emp 3 WHERE dept_id = 31; 返回所有非空行个数 三、GROUP BY的应用: 先看一个简单实例: SQL> SELECT credit_rating, COUNT(*) ”# Cust” 2 FROM s_customer 3 GROUP BY credit_rating; 注意这里别名的应用,复习一下从前的课程,加了引号后,就可以用特殊字符,但也仅有三个:#$_,什么对象的名字都如此。当然空格也是可以的。 复杂实例: SQL> SELECT title, SUM(salary) PAYROLL 2 FROM s_emp 3 WHERE title NOT LIKE ’VP%’ 4 GROUP BY title 5 ORDER BY SUM(salary); 这里要注意一下几个CLAUSE的先后次序。 WHERE在这里主要是做参与分组的记录的限制。 **另外,如果要选取出来一个不加组函数的列,如上面的TITLE,就要把这个列GROUP BY !否则要出错的!信息为:ERROR at line 1: ORA-00937: not a single-group group function 理论很简单,如果不GROUP BY TITLE,显示哪一个呢?这个在试题中经常出现。 结论:不加分组函数修饰的列必定要出现在GROUP BY 里。 错误实例: SQL> SELECT dept_id, AVG(salary) 2 FROM s_emp 3 WHERE AVG(salary) > 2000 4 GROUP BY dept_id; WHERE AVG(salary) > 2000 * ERROR at line 3: ORA-00934: group function is not allowed here 应在GROUP BY 后面加上HAVING AVG(salary) > 2000; 因为是用来限制组的返回。 多级分组实例: SQL> SELECT dept_id, title, COUNT(*) 2 FROM s_emp 3 GROUP BY dept_id, title; 就是先按照DEPT_ID分组,当DEPT_ID相同的时候,再按TITLE分组,而COUNT(*)以合成的组计数。 顺序对结果有决定性的影响。 总结:本课我们主要学习了分组函数的使用及如何进行分组查询,我们可以想像一下,SQL SERVER中有COMPUTE BY,来进行分组总数的计算,但在ORACLE中是没有的。大家可以建立一个有多个列,多个重复值的表,然后进行各种分组的演示,用得多了,自然明了。
课程 五 子查询
本课重点: 1、在条件未知的情况下采用嵌套子查询 2、用子查询做数据处理 3、子查询排序 注意:以下实例中标点均为英文半角 一、概述: 子查询是一种SELECT句式中的高级特性,就是一个SELECT语句作为另一个语句的一个段。我们可以利用子查询来在WHERE字段中引用另一个查询来攻取值以补充其无法事先预知的子结果。 子查询可以用在WHERE子句,HAING子句,SELECT或DELETE语句中的FROM 子句。 注意:1、子查询必须在一对圆括号里。 2、比较符号:>, =, 或者 IN. 3、子查询必须出现在操作符的右边 4、子查询不能出现在ORDER BY里 (试题中有时出现找哪行出错) 二、子查询的执行过程: NESTED QUERY MAIN QUERY SQL> SELECT dept_id SQL> SELECT last_name, title 2 FROM s_emp 2 FROM s_emp 3 WHERE UPPER(last_name)=’BIRI’; 3 WHERE dept_id = 这里 ,每个查询只运行一次。当然,子查询要首先被执行,大家设想一下,如果子查询中有一个以上的人的LASTNAME为BIRI,会如何?-----会出错,因为不能用=来连接。 ORA-1427: single-row subquery returns more than one row 以上的查询也被称之为 单行子查询。 DELECT子查询实例: delete from new_table where cata_time > to_date(''''19990901'''',''''yyyymmdd'''') and pro_name=( select pro_name from new_product where pro_addr in (''''bj'''',''''sh'''')) 三、子查询中的GROUP 函数的应用 实例 1: SQL>
上一页 [1] [2] [3] [4] [5] [6] [7] [8] 下一页 [学习帮助]为什么学习那么的令人害怕呢.? [精彩网文]直面高三 [精彩网文]学习成功=100%的学习意愿+100%的切实行动 [办公软件]学习PowerPoint心得体会 [网络安全]菜鸟学习—认识无线网络安全技术规范 [Web开发]如何学习Asp.net九步曲—菜鸟导读 [Web开发]最简单的AJAX 无刷新学习例子(示例,包含代码和完… [Web开发]推荐学习的与NET相关的⑩项技术 [平面设计]Flash动画学习心得体会 [平面设计]学习Flash动画制作技巧、帧的理论知识尤为重要
|