SlideShare ist ein Scribd-Unternehmen logo
1 von 136
第 6 章  数据查询
SQL 的基本概念 ,[object Object],[object Object],[object Object],[object Object],[object Object]
数据定义 ,[object Object],[object Object],[object Object],[object Object],[object Object]
[object Object],[object Object],[object Object],[object Object],查  询
查询 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
SELECT 语句可以实现 : 选择 投影 Table 1 Table 2 Table 1 Table 1 连接
示例表 sno   sname  ssex  sage  sdept 06001  张三  男  20  IS 07012  李四  男  18  CS 06023  郭一  女  20  IS 05044  刘六  男  21  MA 07001  田七  女  18  MA 07020  丁五  男  19  CS Student 表
示例表 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],course 表 sno   cno   score 06001  1  93 06001  2  85 06001  3  77 06023  2  80 06023  3  91 06023  6  79 07012  4  92 07020  4  68 sc 表
1. 单表查询 ,[object Object],[object Object],SELECT [DISTINCT] {*,  目标列表达式   [ 别名 ],...} FROM 表名 ; 基本的 SELECT  语句 :
选择全部列 sno  sname  ssex  sage  sdept --------- -------------- -----------  06001  张三  男  18  IS 07012  李四  男  18  CS …  …  …  …  … 07020  丁五  男  19  CS SELECT *   FROM  student;
选择指定的列 sno   sname --------- ------------- 06001  张三  07012  李四  …  …  07020  丁五  SELECT sno, sname FROM  student
例 : EMP 表
使用函数 SELECT sname, datediff(year,birthday,getdate()) FROM student; sname  无列名 ---------- --------- --------- 张三  29 李四  27 郭一  27 刘六  28 田七  27 丁五  29 ...
使用函数 SELECT sname, datediff(year,birthday,getdate()) AS sage FROM student; sname  sage ---------- --------- --------- 张三  29 李四  27 郭一  27 刘六  28 田七  27 丁五  29 ...
使用算术运算符 SELECT sno, cno, score,score+5 FROM sc; sno   cno   score  无列名 ---------- --------- --------- 06001  1  93  98 06001  2  85  90 06001  3  77  82 06023  2  80  85 06023  3  91  96 06023  6  79  84 ...
定义列的别名 SELECT ename AS name, sal salary FROM  emp; NAME  SALARY ------------- --------- ... SELECT ename "Name", sal*12 "Annual Salary" FROM  emp; Name  Annual Salary ------------- ------------- ...
使用字符连接运算符 SELECT  sno + sname AS “ 学生” FROM  student; 学生 ------------------- 06001  张三 07012  李四 06023  郭一 05044  刘六 07001  田七 07020  丁五 ... SQL Server2000 使用‘ +’ 进行字符连接运算 ORACLE 使用‘ ||’ 进行字符连接运算
使用字符连接运算符 SELECT  rtrim( sno )  + sname AS “ 学生” FROM  student; 学生 ------------------- 06001 张三 07012 李四 06023 郭一 05044 刘六 07001 田七 07020 丁五 ... SQL Server2000 使用‘ +’ 进行字符连接运算 ORACLE 使用‘ ||’ 进行字符连接运算
使用字符连接运算符 Employee Details ------------------------- KING is a PRESIDENT BLAKE is a MANAGER CLARK is a MANAGER JONES is a MANAGER MARTIN is a SALESMAN ... 14 rows selected. SELECT ename +‘  ‘+ ‘ is a ’ +’ ‘+job    AS "Employee Details" FROM  emp;
消除重复行 ,[object Object],SELECT sdept FROM  student WHERE sdept=‘CS’; sdept --------- CS CS ...
消除重复行 ,[object Object],SELECT DISTINCT sdept FROM  student WHERE sdept=‘CS’; sdept --------- CS ...
练习 : ,[object Object],[object Object],[object Object],Select  *  from orders Select orderid,orderdate  from orders
练习 : ,[object Object],Select orderid,orderdate,orderdate+30  from orders Select orderid,orderdate,’ 预计的发货日期’ ,  orderdate+30 from orders Select orderid,orderdate+30 as  预计的发货日期    from orders
选择表中的若干元组 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
用于查询的条件表达式使用的运算符 NOT, AND, OR 逻辑运算符 IS NULL, IS NOT NULL 空值判断 LIKE, NOT LIKE 字符匹配 IN , NOT IN  确定集合 [NOT] BETWEEN…AND… 确定范围 = 、 > 、 < 、 >= 、 <= 、 <> 、 != 、 !> 、 !< 比较运算符
使用 SELECT 语句实现选择操作 “… 选取出 DEPTNO 为 10 的所有雇员 &quot; EMP EMPNO  ENAME  JOB  ...  DEPTNO  7839 KING PRESIDENT   10 7698 BLAKE MANAGER   30 7782 CLARK MANAGER   10 7566 JONES MANAGER   20 ... EMP EMPNO  ENAME  JOB  ...  DEPTNO  7839 KING PRESIDENT   10 7782 CLARK MANAGER   10 7934 MILLER CLERK   10
使用 WHERE 子句来选取元组 SELECT [DISTINCT] {*,  目标列表达式 [ 别名 ], ...} FROM  表名 [WHERE 条件表达式 ]; WHERE 短句跟在 FROM 短句的后面 WHERE 短句中可以使用运算符,包括:关系运算符、逻辑运算符及一些特殊的运算符。
使用 WHERE 子句来选取元组 SELECT ename, job, deptno FROM  emp WHERE  job='CLERK'; ENAME  JOB  DEPTNO ---------- --------- --------- JAMES  CLERK  30 SMITH  CLERK  20 ADAMS  CLERK  20 MILLER  CLERK  10
使用 where 子句示例 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],丁五 李四 sname 19 丁五 18 田七 18 李四 sage sname sno
使用比较运算符 SELECT ename, sal, comm FROM  emp WHERE  sal<=comm; ENAME  SAL  COMM ---------- --------- --------- MARTIN  1250  1400
使用  BETWEEN  运算符 ENAME  SAL ---------- --------- MARTIN  1250 TURNER  1500 WARD  1250 ADAMS  1100 MILLER  1300 SELECT ename, sal FROM  emp WHERE sal BETWEEN 1000 AND 1500; Lower limit Higher limit
使用  IN  运算符 SELECT empno, ename, sal, mgr FROM  emp WHERE mgr IN (7902, 7566, 7788); EMPNO ENAME  SAL  MGR --------- ---------- --------- --------- 7902 FORD  3000  7566 7369 SMITH  800  7902 7788 SCOTT  3000  7566 7876 ADAMS  1100  7788
使用  IN  运算符 ,[object Object],[object Object],[object Object],[object Object],… … 男 张三 男 丁五 女 田七 男 李四 ssex sname ssex sname
使用  LIKE  运算符 ,[object Object],[object Object],[object Object],[object Object],[object Object],SELECT ename FROM  emp WHERE ename LIKE 'S%';
使用  LIKE  运算符 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
使用  LIKE  运算符 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
使用  LIKE  运算符 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
[object Object],使用  LIKE  运算符 SELECT ename FROM emp WHERE ename LIKE '_A%'; ENAME ----------  JAMES  WARD SELECT ename FROM emp WHERE ename LIKE 'A%' escape ‘;
使用  IS NULL  运算符 ,[object Object],SELECT  ename, mgr FROM  emp WHERE  mgr IS NULL; ENAME  MGR ---------- --------- KING
使用  IS NULL  运算符 ,[object Object],[object Object],[object Object],[object Object]
使用  AND  运算符 SELECT empno, ename, job, sal FROM  emp WHERE  sal>=1100 AND  job='CLERK'; EMPNO ENAME  JOB  SAL --------- ---------- --------- --------- 7876 ADAMS  CLERK  1100 7934 MILLER  CLERK  1300
使用  OR  运算符 SELECT empno, ename, job, sal FROM  emp WHERE  sal>=1100 OR  job='CLERK'; EMPNO ENAME  JOB  SAL --------- ---------- --------- --------- 7839 KING  PRESIDENT  5000 7698 BLAKE  MANAGER  2850 7782 CLARK  MANAGER  2450 7566 JONES  MANAGER  2975 7654 MARTIN  SALESMAN  1250 ...
SELECT ename, job FROM  emp WHERE  job NOT IN ('CLERK','MANAGER','ANALYST'); ENAME  JOB ---------- --------- KING  PRESIDENT MARTIN  SALESMAN ALLEN  SALESMAN TURNER  SALESMAN WARD  SALESMAN 使用  NOT  运算符
优先顺序:比较运算符最优先,逻辑运算符中 NOT 优先级第一, AND 其次, OR 最后。 ENAME  JOB  SAL ---------- --------- --------- KING  PRESIDENT  5000 MARTIN  SALESMAN  1250 ALLEN  SALESMAN  1600 TURNER  SALESMAN  1500 WARD  SALESMAN  1250 SQL> SELECT ename, job, sal FROM  emp WHERE  job='SALESMAN' OR  job='PRESIDENT' AND  sal>1500;
可以使用括号来定义优先顺序。 ENAME  JOB  SAL ---------- --------- --------- KING  PRESIDENT  5000 ALLEN  SALESMAN  1600 SQL> SELECT  ename, job, sal FROM  emp WHERE  (job='SALESMAN' OR  job='PRESIDENT') AND  sal>1500;
IN  和  OR  的关系 ,[object Object],[object Object],[object Object]
练习: ,[object Object],[object Object],[object Object],Select  * from orders   where shippeddate<date() Select * from customers   where country=‘UK’
练习: ,[object Object],[object Object],Select productname,unitprice from products  where unitprice between 20 and 25 Select productname,unitprice  from products  where categoryid in (1,2,3)
练习: ,[object Object],[object Object],Select * from customers  where customerid like ‘A%’ Select * from customers where customerid like ‘_ _A%’ and country=‘UK’
ORDER BY  短语 ,[object Object],[object Object],[object Object],注意: 如果元组中有空值存在,则在升序时,空值排在结果的最后;在降序时,空值排在结果的最前。
ORDER BY  短语 ,[object Object],[object Object],[object Object],92 07012 68 07020 score sno 68 07012 92 07020 score sno
ORDER BY  短语 ,[object Object],[object Object],[object Object],SELECT   ename, job, deptno, hiredate FROM   emp ORDER BY hiredate; ENAME  JOB  DEPTNO HIREDATE ---------- --------- --------- --------- SMITH  CLERK  20 17-DEC-80 ALLEN  SALESMAN  30 20-FEB-81 ...
按降序排列结果 SELECT   ename, job, deptno, hiredate FROM   emp ORDER BY hiredate DESC; ENAME  JOB  DEPTNO HIREDATE ---------- --------- --------- --------- ADAMS  CLERK  20 12-JAN-83 SCOTT  ANALYST  20 09-DEC-82 MILLER  CLERK  10 23-JAN-82 JAMES  CLERK  30 03-DEC-81 FORD  ANALYST  20 03-DEC-81 KING  PRESIDENT  10 17-NOV-81 MARTIN  SALESMAN  30 28-SEP-81 ...
按结果列的别名排序 SELECT  empno, ename, sal*12 annsal FROM  emp ORDER BY annsal; EMPNO ENAME  ANNSAL --------- ---------- --------- 7369 SMITH  9600 7900 JAMES  11400 7876 ADAMS  13200 7654 MARTIN  15000 7521 WARD  15000 7934 MILLER  15600 7844 TURNER  18000 ...
按多列排序 例、显示所有学生的信息,按系排序,同系中按年龄从大到小排序 Select * from student order by sdept,sage desc 在排序时可以指定多列,系统降按照指定列的顺序依次列示结果
按多列排序 SELECT  ename, deptno, sal FROM   emp ORDER BY  deptno, sal DESC; ENAME  DEPTNO  SAL ---------- --------- --------- KING  10  5000 CLARK  10  2450 MILLER  10  1300 FORD  20  3000 ...
使用集函数 ,[object Object],计算一列值的最小值 MIN([DISTINCT| ALL ] < 列名 >) 计算一列值的最大值 MAX([DISTINCT| ALL ] < 列名 >) 计算一列值的平均值 AVG([DISTINCT| ALL ] < 列名 >) 计算一列值的总和 SUM([DISTINCT| ALL ] < 列名 >) 统计一列中值的个数 COUNT([DISTINCT| ALL ] < 列名 >) 统计元组个数 COUNT([DISTINCT| ALL ] *)
使用集函数 ,[object Object],EMP “ maximum  salary in  the EMP table” DEPTNO  SAL --------- --------- 10  2450 10  5000 10  1300 20  800 20  1100 20  3000 20  3000 20  2975 30  1600 30  2850 30  1250 30  950 30  1500 30  1250 MAX(SAL) --------- 5000
使用集函数 SELECT 目标列表达式 ,  集函数 ( 列名 ) FROM 表名 [WHERE 条件表达式 ] [ORDER BY 列名 ]; ,[object Object],[object Object]
AVG  和  SUM 适用于数值型数据  AVG(SAL)  MAX(SAL)  MIN(SAL)  SUM(SAL) -------- --------- --------- --------- 1400  1600  1250  5600 SELECT AVG(sal), MAX(sal), MIN(sal), SUM(sal) FROM emp WHERE job LIKE 'SALES%';
MIN  和  MAX  适用于不同类型的数据 SELECT MIN(hiredate), MAX(hiredate) FROM emp ; MIN(HIRED MAX(HIRED --------- --------- 17-DEC-80 12-JAN-83
COUNT  函数用于计数 COUNT(*) --------- 6 SELECT COUNT(*) FROM emp WHERE deptno = 30; SELECT COUNT(comm) FROM emp WHERE deptno = 30; COUNT(COMM) ----------- 4 忽略 NULL 值
示例 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],6 COUNT(*) 4 COUNT(DISTINCT sno) 80 AVG(score) 92 MAX(score)
创建数据分组 ,[object Object]
创建数据分组  EMP “ EMP 表中每一部门的平均工资” DEPTNO  SAL --------- --------- 10  2450 10  5000 10  1300 20  800 20  1100 20  3000 20  3000 20  2975 30  1600 30  2850 30  1250 30  950 30  1500 30  1250 DEPTNO  AVG(SAL) ------- --------- 10 2916.6667 20  2175 30 1566.6667 2916.6667 2175 1566.6667
GROUP BY  短语 SELECT 目标列表达式 ,  集函数 ( 列名 ) FROM 表名 [WHERE 条件表达式 ] [GROUP BY 分组条件表达式 ] [ORDER BY 列名 ]; ,[object Object]
使用  GROUP BY  短语  ,[object Object],SELECT  AVG(sal) FROM  emp GROUP BY deptno; AVG(SAL) ---------  2916.6667 2175 1566.6667
使用  GROUP BY  短语 ,[object Object],SELECT  deptno, AVG(sal) FROM  emp GROUP BY deptno; DEPTNO  AVG(SAL) --------- --------- 10 2916.6667 20  2175 30 1566.6667
SELECT  deptno, job, sum(sal) FROM  emp GROUP BY deptno, job; DEPTNO JOB  SUM(SAL) --------- --------- --------- 10 CLERK  1300 10 MANAGER  2450 10 PRESIDENT  5000 20 ANALYST  6000 20 CLERK  1900 ... 9 rows selected. 按多列分组
按多列分组 EMP “ EMP 表中不同部门不同职位的工资总和” DEPTNO JOB  SAL --------- --------- --------- 10 MANAGER  2450 10 PRESIDENT  5000 10 CLERK  1300 20 CLERK  800 20 CLERK  1100 20 ANALYST  3000 20 ANALYST  3000 20 MANAGER  2975 30 SALESMAN  1600 30 MANAGER  2850 30 SALESMAN  1250 30 CLERK  950 30 SALESMAN  1500 30 SALESMAN  1250 JOB  SUM(SAL) --------- --------- CLERK  1300 MANAGER  2450 PRESIDENT  5000 ANALYST  6000 CLERK  1900 MANAGER  2975 CLERK  950 MANAGER  2850 SALESMAN  5600 DEPTNO -------- 10 10 10 20 20 20 30 30 30
示例 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],2 2 2 3 2 4 1 1 1 6 COUNT(sno) cno cno
对分组的结果进行筛选 “ 每一部门最高工资大于 $2900” EMP DEPTNO  SAL --------- --------- 10  2450 10  5000 10  1300 20  800 20  1100 20  3000 20  3000 20  2975 30  1600 30  2850 30  1250 30  950 30  1500 30  1250 DEPTNO  MAX(SAL) --------- --------- 10  5000 20  3000 5000 3000 2850
HAVING  短语 ,[object Object],[object Object],[object Object],SELECT 目标列表达式 ,  集函数 FROM 表名 [WHERE 条件表达式 ] [GROUP BY 分组条件表达式 ] [HAVING 条件表达式 ] [ORDER BY 列名 ];
使用 HAVING  短语 SELECT  deptno, max(sal) FROM  emp GROUP BY deptno HAVING  max(sal)>2900; DEPTNO  MAX(SAL) --------- --------- 10  5000 20  3000
使用 HAVING  短语 SELECT  job, SUM(sal) PAYROLL FROM  emp WHERE   job NOT LIKE 'SALES%' GROUP BY  job HAVING  SUM(sal)>5000 ORDER BY  SUM(sal); JOB  PAYROLL --------- --------- ANALYST  6000 MANAGER  8275
嵌套的集函数 SELECT  max(avg(sal)) 2  FROM  emp 3  GROUP BY deptno; MAX(AVG(SAL)) ------------- 2916.6667
练习: ,[object Object],[object Object],Select * from orders  where customerid like ‘A%’ and  year(orderdate)=1996  order by orderid Select supplierid,avg(unitprice)  from products group by supllierid
WHERE 和  HAVING ,[object Object],[object Object],[object Object]
2. 嵌套查询 ,[object Object],[object Object],[object Object]
嵌套查询 ,[object Object],[object Object],[object Object],[object Object],[object Object]
嵌套分类 ,[object Object],[object Object],[object Object],[object Object]
带有 IN 谓词的子查询 ,[object Object],[object Object],[object Object],[object Object],[object Object]
多层嵌套 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
带有比较运算符的子查询 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
使用嵌套解决问题 ,[object Object],“ 哪一个雇员的工资比  Jones  高 ?” 主查询 ? “ Jones  的工资是多少 ?” ? 子查询
嵌套查询的实现 SELECT ename FROM  emp WHERE  sal >    (SELECT sal FROM  emp WHERE  empno=7566); ENAME ---------- KING FORD SCOTT 2975
嵌套查询的实现 ENAME  JOB ---------- --------- MILLER  CLERK SELECT  ename, job   FROM  emp WHERE  job =  (SELECT  job     FROM  emp     WHERE  empno = 7369) AND  sal >  (SELECT  sal FROM emp WHERE empno = 7876);  CLERK 1100
HAVING  短语中使用嵌套查询 SELECT deptno, MIN(sal) FROM emp GROUP BY deptno HAVING MIN(sal) > (SELECT MIN(sal) FROM emp WHERE deptno = 20); DEPTNO  MIN(SAL) ---------- ---------- 10  1300 30  950 800
以下两个查询结果一样吗 ? SELECT ename, deptno, sal, comm FROM emp WHERE  (sal, comm) IN (SELECT sal, comm   FROM  emp   WHERE  deptno = 30); SELECT  ename, deptno, sal, comm FROM  emp WHERE  sal IN  (SELECT sal FROM  emp WHERE  deptno = 30) AND comm IN  (SELECT comm FROM  emp WHERE  deptno = 30);
带有 ANY 或 ALL 的子查询 ,[object Object],大于等于 ( 小于等于 ) 子查询中的所有值 >=(<=)ALL 等于 ( 不等于 ) 子查询中的所有值 =(!=)ALL 大于 ( 小于 ) 子查询中的所有值 >(<)ALL 等于 ( 不等于 ) 子查询中某个值 =(!=)ANY 大于等于 ( 小于等于 ) 子查询中某个值 >=(<=)ANY 大于 ( 小于 ) 子查询中某个值 >(<)ANY
示例 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
示例 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
示例 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
示例 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
[object Object],<all 小于子查询结果中的所有值 <any  小于子查询结果中的某个值 >= MAX >MAX <= MIN <MIN NOT IN ALL >= MIN >MIN <= MAX <MAX IN ANY >= > <= < <> =
使用 ANY 运算符 EMPNO ENAME  JOB --------- ---------- --------- 7654 MARTIN  SALESMAN  7521 WARD  SALESMAN  SELECT  empno, ename, job FROM  emp WHERE  sal < ANY  (SELECT sal FROM emp WHERE job = 'CLERK') AND   job <> 'CLERK'; 950 800 1100 1300
使用 ALL 运算符 EMPNO ENAME  JOB --------- ---------- --------- 7839 KING  PRESIDENT 7566 JONES  MANAGER 7902 FORD  ANALYST 7788 SCOTT  ANALYST SQL> SELECT  empno, ename, job FROM  emp WHERE  sal > ALL    (SELECT avg(sal) FROM emp GROUP BY deptno); 2916.6667 2175 1566.6667
练习 : ,[object Object],select productid,quantity  from &quot;order details&quot;  where productid in (Select productid  from products  where unitprice<10)
练习 : ,[object Object],select  productid,quantity  from &quot;order details&quot;  where  unitprice <all  (Select unitprice from products  where categoryid=2)
带有 EXISTS 谓词的子查询 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
[object Object],[object Object]
EXISTS  短语 ,[object Object],[object Object],[object Object],[object Object],[object Object],注: 带 exists 的子查询不返回任何数据,只产生逻辑真或逻辑假。
EXISTS  短语 ,[object Object],select productid,quantity  from &quot;order details“ where exists (Select productid from products  where  productid=&quot;order details&quot;.productid  and unitprice<10)
4.  集合查询 ,[object Object],[object Object],[object Object],[object Object]
集合查询 (2) ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
3. 多表查询 ,[object Object],[object Object],[object Object],[object Object],[object Object]
连接查询 ( 涉及多个表的查询 ) EMPNO  DEPTNO  LOC ----- ------- --------  7839  10 NEW YORK 7698    30 CHICAGO 7782  10 NEW YORK 7566  20 DALLAS 7654    30 CHICAGO 7499  30 CHICAGO ... 14 rows selected. EMP  DEPT  EMPNO ENAME ... DEPTNO ------ ----- ... ------   7839 KING ...   10 7698 BLAKE ...   30 ... 7934 MILLER ...   10 DEPTNO DNAME  LOC  ------ ---------- -------- 10 ACCOUNTING NEW YORK 20 RESEARCH DALLAS 30 SALES CHICAGO 40 OPERATIONS BOSTON
用 SELECT 语句实现连接操作 ,[object Object],[object Object],[object Object],SELECT 表名 1. 目标列  ,  表名 2. 目标列 FROM 表名 1,  表名 2 WHERE 表名 1. 列  < 比较运算符 >  表名 2.  列 ; WHERE 表名 1. 列  <BETWEEN>  表名 2.  列  AND 表名 3.  列   ;
等值连接 ,[object Object],[object Object],[object Object]
等值连接 EMP  DEPT  EMPNO ENAME  DEPTNO ------ ------- ------- 7839 KING  10 7698 BLAKE  30 7782 CLARK  10 7566 JONES  20 7654 MARTIN  30 7499 ALLEN  30 7844 TURNER  30 7900 JAMES  30 7521 WARD  30 7902 FORD  20 7369 SMITH  20 ... 14 rows selected. DEPTNO DNAME  LOC  ------- ---------- -------- 10 ACCOUNTING NEW YORK 30 SALES   CHICAGO 10 ACCOUNTING NEW YORK  20 RESEARCH DALLAS 30 SALES   CHICAGO 30 SALES   CHICAGO 30 SALES   CHICAGO 30 SALES   CHICAGO 30 SALES   CHICAGO 20 RESEARCH DALLAS 20 RESEARCH DALLAS ... 14 rows selected. Foreign key Primary key
等值连接的实现 SELECT  emp.empno, emp.ename, emp.deptno,   dept.deptno, dept.loc FROM  emp, dept WHERE  emp.deptno=dept.deptno; EMPNO ENAME  DEPTNO DEPTNO LOC ----- ------ ------ ------ --------- 7839 KING   10  10 NEW YORK 7698 BLAKE    30  30 CHICAGO 7782 CLARK   10  10 NEW YORK 7566 JONES  20  20 DALLAS ... 14 rows selected.
使用表的别名简化工作 SELECT emp.empno, emp.ename, emp.deptno,    dept.deptno, dept.loc FROM  emp, dept WHERE  emp.deptno=dept.deptno; SELECT e.empno, e.ename, e.deptno,  d.deptno, d.loc FROM  emp e, dept d WHERE  e.deptno=d.deptno;
非等值连接 EMP SALGRADE EMPNO ENAME  SAL ------ ------- ------ 7839 KING  5000 7698 BLAKE  2850 7782 CLARK  2450 7566 JONES  2975 7654 MARTIN  1250 7499 ALLEN  1600 7844 TURNER  1500 7900 JAMES  950 ... 14 rows selected. GRADE  LOSAL  HISAL ----- ----- ------ 1  700 1200 2  1201 1400 3  1401 2000 4 2001 3000 5  3001 9999 “ EMP 表中的工资数额在 SALGRADE 表的 LOSAL 和 HISAL 之间”
非等值连接的实现 ENAME  SAL  GRADE ---------- --------- --------- JAMES  950  1 SMITH  800  1 ADAMS  1100  1 ... 14 rows selected. SELECT  e.ename, e.sal, s.grade FROM emp e, salgrade s WHERE  e.sal BETWEEN  s.losal AND s.hisal;
笛卡尔积: ENAME  DNAME ------  ---------- KING ACCOUNTING BLAKE   ACCOUNTING  ... KING RESEARCH BLAKE   RESEARCH ... 56 rows selected. EMP (14 rows)  EMPNO ENAME ... DEPTNO ------ ----- ... ------   7839 KING ...   10 7698 BLAKE ...   30 ... 7934 MILLER ...   10 WHERE  短句省略或无效时,表与表进行笛卡尔积运算。 DEPT (4 rows)  DEPTNO DNAME  LOC  ------ ---------- -------- 10 ACCOUNTING NEW YORK 20 RESEARCH DALLAS 30 SALES CHICAGO 40 OPERATIONS BOSTON “ Cartesian product:  14*4=56 rows”
自身连接 ,[object Object],[object Object],[object Object],[object Object],[object Object],5 3 5 2 6 2 1 second.cpno first.cno
自身连接 EMP (WORKER) EMP (MANAGER) EMPNO ENAME  MGR ----- ------ ----  7839 KING 7698 BLAKE 7839 7782 CLARK 7839 7566 JONES 7839 7654 MARTIN 7698 7499 ALLEN 7698 EMPNO ENAME ----- -------- 7839 KING 7839 KING 7839 KING 7698 BLAKE 7698 BLAKE “ 表中的雇员之间存在上下级关系 &quot;
自身连接的实现 WORKER.ENAME||'WORKSFOR'||MANAG ------------------------------- BLAKE works for KING CLARK works for KING JONES works for KING MARTIN works for BLAKE ... 13 rows selected. SELECT worker.ename+' works for ‘+manager.ename FROM  emp worker, emp manager WHERE  worker.mgr = manager.empno;
两个以上的表的连接 NAME CUSTID ----------- ------ JOCKSPORTS   100 TKB SPORT SHOP   101 VOLLYRITE   102 JUST TENNIS   103 K+T SPORTS   105 SHAPE UP   106 WOMENS SPORTS  107 ... ... 9 rows selected. CUSTOMER  CUSTID  ORDID ------- ------- 101  610 102  611 104  612 106  601 102  602 106  604 106  605 ...  21 rows selected. ORD  ORDID  ITEMID ------ ------- 610  3 611  1 612  1 601  1 602  1 ... 64 rows selected.  ITEM
外连接 ,[object Object],[object Object]
外连接 EMP  DEPT  ENAME DEPTNO ----- ------ KING 10 BLAKE 30 CLARK 10 JONES 20 ... DEPTNO DNAME ------ ---------- 10  ACCOUNTING 30  SALES 10  ACCOUNTING 20 RESEARCH ... 40 OPERATIONS 没有雇员在 OPERATIONS 部门
SQL Server 中的外连接 ,[object Object],[object Object],[object Object],[object Object],SELECT 表名 1. 目标列  ,  表名 2. 目标列 FROM 表 1 <left outer join /right outer join /full outer join> 表 2 ON 表名 1.  列  =  表名 2.  列 ;
示例 关系 Loan: 关系 Borrow: Perryridge Redwood Downtown Bname 1700 4000 3000 amount L-230 Smith L-230 L-155 Mary L-260 L-170 Jones L-170 Loanno custna Loanno
示例 Loan inner join Borrow on Loan.Loanno=Borrow.Loanno Redwood Downtown Bname 4000 3000 amount L-230 Smith L-230 L-170 Jones L-170 Loanno custna Loanno
示例 Loan natural inner join Borrow on Loan.Loanno=Borrow.Loanno Redwood Downtown Bname 4000 3000 amount Smith L-230 Jones L-170 custna Loanno
示例 Loan left outer join Borrow on Loan.Loanno=Borrow.Loanno NULL NULL 1700 Perryridge L-260 L-230 Smith 4000 Redwood L-230 Downtown Bname 3000 amount L-170 Jones L-170 Loanno custna Loanno
示例 Loan natural right outer join Borrow  on Loan.Loanno=Borrow.Loanno Mary NULL NULL L-155 Smith 4000 Redwood L-230 Downtown Bname 3000 amount Jones L-170 custna Loanno
示例 Loan full outer join Borrow  on Loan.Loanno=Borrow.Loanno NULL 1700 Perryridge L-260 Mary NULL NULL L-155 Smith 4000 Redwood L-230 Downtown Bname 3000 amount Jones L-170 custna Loanno
复合条件连接 ,[object Object],[object Object],[object Object],[object Object],[object Object]
复合条件连接 ,[object Object],[object Object],[object Object],[object Object]
练习: ,[object Object],Select  categories.*,products.* from  categories,products  where  categories.categoryid=products.categoryid
练习: ,[object Object],Select orders.customerid, companyname,orderid,orderdate  from  customers,orders  where  customers.customerid=orders.customerid  and orders.customerid like “A%”
练习: ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
练习: ,[object Object],select  orders.orderid,customers.companyname from  orders,customers  where orders.customerid=customers.customerid 或: select orders.orderid,customers.companyname from orders inner join customers   on  orders.customerid=customers.customerid
连接查询 (8) ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
实训: ,[object Object]

Weitere ähnliche Inhalte

Andere mochten auch

Resiliency in the cloud myths versus facts
Resiliency in the cloud myths versus factsResiliency in the cloud myths versus facts
Resiliency in the cloud myths versus factsjorge navas
 
Infografia justificacion comercial_de_la_resiliencia
Infografia justificacion comercial_de_la_resilienciaInfografia justificacion comercial_de_la_resiliencia
Infografia justificacion comercial_de_la_resilienciajorge navas
 
Infografia smart energy managemet services 2.3
Infografia smart energy managemet services 2.3Infografia smart energy managemet services 2.3
Infografia smart energy managemet services 2.3jorge navas
 
第7章 索引和视图
第7章 索引和视图第7章 索引和视图
第7章 索引和视图hanmo1988
 
Resiliency in the cloud myths versus facts
Resiliency in the cloud myths versus factsResiliency in the cloud myths versus facts
Resiliency in the cloud myths versus factsjorge navas
 
第5章 sql server表的管理
第5章 sql server表的管理第5章 sql server表的管理
第5章 sql server表的管理hanmo1988
 
A beginners guide
A beginners guideA beginners guide
A beginners guideASAFI
 
第1章 数据库系统概论
第1章   数据库系统概论第1章   数据库系统概论
第1章 数据库系统概论hanmo1988
 
第10章 (续)事务
第10章 (续)事务 第10章 (续)事务
第10章 (续)事务 hanmo1988
 
Operacje minimalnie logowane
Operacje minimalnie logowaneOperacje minimalnie logowane
Operacje minimalnie logowaneBartosz Ratajczyk
 
Jak szybko przetwarzasz hurtowe ilości XML?
Jak szybko przetwarzasz hurtowe ilości XML?Jak szybko przetwarzasz hurtowe ilości XML?
Jak szybko przetwarzasz hurtowe ilości XML?Bartosz Ratajczyk
 
第2章 关系数据库基本原理
第2章  关系数据库基本原理第2章  关系数据库基本原理
第2章 关系数据库基本原理hanmo1988
 
第9章 t sql程序设计
第9章 t sql程序设计第9章 t sql程序设计
第9章 t sql程序设计hanmo1988
 

Andere mochten auch (16)

Resiliency in the cloud myths versus facts
Resiliency in the cloud myths versus factsResiliency in the cloud myths versus facts
Resiliency in the cloud myths versus facts
 
Infografia justificacion comercial_de_la_resiliencia
Infografia justificacion comercial_de_la_resilienciaInfografia justificacion comercial_de_la_resiliencia
Infografia justificacion comercial_de_la_resiliencia
 
Infografia smart energy managemet services 2.3
Infografia smart energy managemet services 2.3Infografia smart energy managemet services 2.3
Infografia smart energy managemet services 2.3
 
第7章 索引和视图
第7章 索引和视图第7章 索引和视图
第7章 索引和视图
 
Resiliency in the cloud myths versus facts
Resiliency in the cloud myths versus factsResiliency in the cloud myths versus facts
Resiliency in the cloud myths versus facts
 
第5章 sql server表的管理
第5章 sql server表的管理第5章 sql server表的管理
第5章 sql server表的管理
 
A beginners guide
A beginners guideA beginners guide
A beginners guide
 
第11章
第11章 第11章
第11章
 
第1章 数据库系统概论
第1章   数据库系统概论第1章   数据库系统概论
第1章 数据库系统概论
 
第10章 (续)事务
第10章 (续)事务 第10章 (续)事务
第10章 (续)事务
 
Operacje minimalnie logowane
Operacje minimalnie logowaneOperacje minimalnie logowane
Operacje minimalnie logowane
 
Jak szybko przetwarzasz hurtowe ilości XML?
Jak szybko przetwarzasz hurtowe ilości XML?Jak szybko przetwarzasz hurtowe ilości XML?
Jak szybko przetwarzasz hurtowe ilości XML?
 
XML w SQL Server w praktyce
XML w SQL Server w praktyceXML w SQL Server w praktyce
XML w SQL Server w praktyce
 
第2章 关系数据库基本原理
第2章  关系数据库基本原理第2章  关系数据库基本原理
第2章 关系数据库基本原理
 
第9章 t sql程序设计
第9章 t sql程序设计第9章 t sql程序设计
第9章 t sql程序设计
 
Podstawy ETL z SSIS
Podstawy ETL z SSISPodstawy ETL z SSIS
Podstawy ETL z SSIS
 

Ähnlich wie 第6章 数据查询

真正读懂oracle sql执行计划execution plan v20131025
真正读懂oracle sql执行计划execution plan v20131025真正读懂oracle sql执行计划execution plan v20131025
真正读懂oracle sql执行计划execution plan v20131025maclean liu
 
11g新特性streams同步捕获
11g新特性streams同步捕获11g新特性streams同步捕获
11g新特性streams同步捕获maclean liu
 
Sql指令
Sql指令Sql指令
Sql指令you_ren
 
Mysql开发与优化
Mysql开发与优化Mysql开发与优化
Mysql开发与优化isnull
 
企业常用Sql
企业常用Sql企业常用Sql
企业常用Sqljade_side
 
Something about oracle joins
Something about oracle joinsSomething about oracle joins
Something about oracle joinsmysqlops
 
Sql培训 (1)
Sql培训 (1)Sql培训 (1)
Sql培训 (1)jhao niu
 
第六章 函數與巨集
第六章 函數與巨集第六章 函數與巨集
第六章 函數與巨集shademoon
 
Oracle中比对2张表之间数据是否一致的几种方法
Oracle中比对2张表之间数据是否一致的几种方法Oracle中比对2张表之间数据是否一致的几种方法
Oracle中比对2张表之间数据是否一致的几种方法maclean liu
 
Avm2虚拟机浅析与as3性能优化(陈士凯)
Avm2虚拟机浅析与as3性能优化(陈士凯)Avm2虚拟机浅析与as3性能优化(陈士凯)
Avm2虚拟机浅析与as3性能优化(陈士凯)FLASH开发者交流会
 
[Flash开发者交流][2010.05.30]avm2虚拟机浅析与as3性能优化(陈士凯)
[Flash开发者交流][2010.05.30]avm2虚拟机浅析与as3性能优化(陈士凯)[Flash开发者交流][2010.05.30]avm2虚拟机浅析与as3性能优化(陈士凯)
[Flash开发者交流][2010.05.30]avm2虚拟机浅析与as3性能优化(陈士凯)Shanda innovation institute
 
SEM與LISREL基礎班講義20130112-三星統計張偉豪顧問
SEM與LISREL基礎班講義20130112-三星統計張偉豪顧問SEM與LISREL基礎班講義20130112-三星統計張偉豪顧問
SEM與LISREL基礎班講義20130112-三星統計張偉豪顧問Beckett Hsieh
 
Oracle数据库分析函数详解
Oracle数据库分析函数详解Oracle数据库分析函数详解
Oracle数据库分析函数详解mysqlops
 
Avm2虚拟机浅析与as3性能优化
Avm2虚拟机浅析与as3性能优化Avm2虚拟机浅析与as3性能优化
Avm2虚拟机浅析与as3性能优化Harvey Zhang
 
配置Oracle 10g 双向流复制
配置Oracle 10g 双向流复制配置Oracle 10g 双向流复制
配置Oracle 10g 双向流复制maclean liu
 
2017 9-14 Keras example
2017 9-14 Keras example2017 9-14 Keras example
2017 9-14 Keras example煒勛 賴
 
Mongodb
MongodbMongodb
Mongodbbj
 

Ähnlich wie 第6章 数据查询 (20)

真正读懂oracle sql执行计划execution plan v20131025
真正读懂oracle sql执行计划execution plan v20131025真正读懂oracle sql执行计划execution plan v20131025
真正读懂oracle sql执行计划execution plan v20131025
 
11g新特性streams同步捕获
11g新特性streams同步捕获11g新特性streams同步捕获
11g新特性streams同步捕获
 
Sql指令
Sql指令Sql指令
Sql指令
 
11
1111
11
 
Mysql开发与优化
Mysql开发与优化Mysql开发与优化
Mysql开发与优化
 
企业常用Sql
企业常用Sql企业常用Sql
企业常用Sql
 
Something about oracle joins
Something about oracle joinsSomething about oracle joins
Something about oracle joins
 
Sql培训 (1)
Sql培训 (1)Sql培训 (1)
Sql培训 (1)
 
第六章 函數與巨集
第六章 函數與巨集第六章 函數與巨集
第六章 函數與巨集
 
Optimzing mysql
Optimzing mysqlOptimzing mysql
Optimzing mysql
 
Oracle中比对2张表之间数据是否一致的几种方法
Oracle中比对2张表之间数据是否一致的几种方法Oracle中比对2张表之间数据是否一致的几种方法
Oracle中比对2张表之间数据是否一致的几种方法
 
Avm2虚拟机浅析与as3性能优化(陈士凯)
Avm2虚拟机浅析与as3性能优化(陈士凯)Avm2虚拟机浅析与as3性能优化(陈士凯)
Avm2虚拟机浅析与as3性能优化(陈士凯)
 
[Flash开发者交流][2010.05.30]avm2虚拟机浅析与as3性能优化(陈士凯)
[Flash开发者交流][2010.05.30]avm2虚拟机浅析与as3性能优化(陈士凯)[Flash开发者交流][2010.05.30]avm2虚拟机浅析与as3性能优化(陈士凯)
[Flash开发者交流][2010.05.30]avm2虚拟机浅析与as3性能优化(陈士凯)
 
SEM與LISREL基礎班講義20130112-三星統計張偉豪顧問
SEM與LISREL基礎班講義20130112-三星統計張偉豪顧問SEM與LISREL基礎班講義20130112-三星統計張偉豪顧問
SEM與LISREL基礎班講義20130112-三星統計張偉豪顧問
 
12
1212
12
 
Oracle数据库分析函数详解
Oracle数据库分析函数详解Oracle数据库分析函数详解
Oracle数据库分析函数详解
 
Avm2虚拟机浅析与as3性能优化
Avm2虚拟机浅析与as3性能优化Avm2虚拟机浅析与as3性能优化
Avm2虚拟机浅析与as3性能优化
 
配置Oracle 10g 双向流复制
配置Oracle 10g 双向流复制配置Oracle 10g 双向流复制
配置Oracle 10g 双向流复制
 
2017 9-14 Keras example
2017 9-14 Keras example2017 9-14 Keras example
2017 9-14 Keras example
 
Mongodb
MongodbMongodb
Mongodb
 

第6章 数据查询

  • 1. 第 6 章 数据查询
  • 2.
  • 3.
  • 4.
  • 5.
  • 6. SELECT 语句可以实现 : 选择 投影 Table 1 Table 2 Table 1 Table 1 连接
  • 7. 示例表 sno sname ssex sage sdept 06001 张三 男 20 IS 07012 李四 男 18 CS 06023 郭一 女 20 IS 05044 刘六 男 21 MA 07001 田七 女 18 MA 07020 丁五 男 19 CS Student 表
  • 8.
  • 9.
  • 10. 选择全部列 sno sname ssex sage sdept --------- -------------- ----------- 06001 张三 男 18 IS 07012 李四 男 18 CS … … … … … 07020 丁五 男 19 CS SELECT * FROM student;
  • 11. 选择指定的列 sno sname --------- ------------- 06001 张三 07012 李四 … … 07020 丁五 SELECT sno, sname FROM student
  • 12. 例 : EMP
  • 13. 使用函数 SELECT sname, datediff(year,birthday,getdate()) FROM student; sname 无列名 ---------- --------- --------- 张三 29 李四 27 郭一 27 刘六 28 田七 27 丁五 29 ...
  • 14. 使用函数 SELECT sname, datediff(year,birthday,getdate()) AS sage FROM student; sname sage ---------- --------- --------- 张三 29 李四 27 郭一 27 刘六 28 田七 27 丁五 29 ...
  • 15. 使用算术运算符 SELECT sno, cno, score,score+5 FROM sc; sno cno score 无列名 ---------- --------- --------- 06001 1 93 98 06001 2 85 90 06001 3 77 82 06023 2 80 85 06023 3 91 96 06023 6 79 84 ...
  • 16. 定义列的别名 SELECT ename AS name, sal salary FROM emp; NAME SALARY ------------- --------- ... SELECT ename &quot;Name&quot;, sal*12 &quot;Annual Salary&quot; FROM emp; Name Annual Salary ------------- ------------- ...
  • 17. 使用字符连接运算符 SELECT sno + sname AS “ 学生” FROM student; 学生 ------------------- 06001 张三 07012 李四 06023 郭一 05044 刘六 07001 田七 07020 丁五 ... SQL Server2000 使用‘ +’ 进行字符连接运算 ORACLE 使用‘ ||’ 进行字符连接运算
  • 18. 使用字符连接运算符 SELECT rtrim( sno ) + sname AS “ 学生” FROM student; 学生 ------------------- 06001 张三 07012 李四 06023 郭一 05044 刘六 07001 田七 07020 丁五 ... SQL Server2000 使用‘ +’ 进行字符连接运算 ORACLE 使用‘ ||’ 进行字符连接运算
  • 19. 使用字符连接运算符 Employee Details ------------------------- KING is a PRESIDENT BLAKE is a MANAGER CLARK is a MANAGER JONES is a MANAGER MARTIN is a SALESMAN ... 14 rows selected. SELECT ename +‘ ‘+ ‘ is a ’ +’ ‘+job AS &quot;Employee Details&quot; FROM emp;
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25. 用于查询的条件表达式使用的运算符 NOT, AND, OR 逻辑运算符 IS NULL, IS NOT NULL 空值判断 LIKE, NOT LIKE 字符匹配 IN , NOT IN 确定集合 [NOT] BETWEEN…AND… 确定范围 = 、 > 、 < 、 >= 、 <= 、 <> 、 != 、 !> 、 !< 比较运算符
  • 26. 使用 SELECT 语句实现选择操作 “… 选取出 DEPTNO 为 10 的所有雇员 &quot; EMP EMPNO ENAME JOB ... DEPTNO 7839 KING PRESIDENT 10 7698 BLAKE MANAGER 30 7782 CLARK MANAGER 10 7566 JONES MANAGER 20 ... EMP EMPNO ENAME JOB ... DEPTNO 7839 KING PRESIDENT 10 7782 CLARK MANAGER 10 7934 MILLER CLERK 10
  • 27. 使用 WHERE 子句来选取元组 SELECT [DISTINCT] {*, 目标列表达式 [ 别名 ], ...} FROM 表名 [WHERE 条件表达式 ]; WHERE 短句跟在 FROM 短句的后面 WHERE 短句中可以使用运算符,包括:关系运算符、逻辑运算符及一些特殊的运算符。
  • 28. 使用 WHERE 子句来选取元组 SELECT ename, job, deptno FROM emp WHERE job='CLERK'; ENAME JOB DEPTNO ---------- --------- --------- JAMES CLERK 30 SMITH CLERK 20 ADAMS CLERK 20 MILLER CLERK 10
  • 29.
  • 30. 使用比较运算符 SELECT ename, sal, comm FROM emp WHERE sal<=comm; ENAME SAL COMM ---------- --------- --------- MARTIN 1250 1400
  • 31. 使用 BETWEEN 运算符 ENAME SAL ---------- --------- MARTIN 1250 TURNER 1500 WARD 1250 ADAMS 1100 MILLER 1300 SELECT ename, sal FROM emp WHERE sal BETWEEN 1000 AND 1500; Lower limit Higher limit
  • 32. 使用 IN 运算符 SELECT empno, ename, sal, mgr FROM emp WHERE mgr IN (7902, 7566, 7788); EMPNO ENAME SAL MGR --------- ---------- --------- --------- 7902 FORD 3000 7566 7369 SMITH 800 7902 7788 SCOTT 3000 7566 7876 ADAMS 1100 7788
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41. 使用 AND 运算符 SELECT empno, ename, job, sal FROM emp WHERE sal>=1100 AND job='CLERK'; EMPNO ENAME JOB SAL --------- ---------- --------- --------- 7876 ADAMS CLERK 1100 7934 MILLER CLERK 1300
  • 42. 使用 OR 运算符 SELECT empno, ename, job, sal FROM emp WHERE sal>=1100 OR job='CLERK'; EMPNO ENAME JOB SAL --------- ---------- --------- --------- 7839 KING PRESIDENT 5000 7698 BLAKE MANAGER 2850 7782 CLARK MANAGER 2450 7566 JONES MANAGER 2975 7654 MARTIN SALESMAN 1250 ...
  • 43. SELECT ename, job FROM emp WHERE job NOT IN ('CLERK','MANAGER','ANALYST'); ENAME JOB ---------- --------- KING PRESIDENT MARTIN SALESMAN ALLEN SALESMAN TURNER SALESMAN WARD SALESMAN 使用 NOT 运算符
  • 44. 优先顺序:比较运算符最优先,逻辑运算符中 NOT 优先级第一, AND 其次, OR 最后。 ENAME JOB SAL ---------- --------- --------- KING PRESIDENT 5000 MARTIN SALESMAN 1250 ALLEN SALESMAN 1600 TURNER SALESMAN 1500 WARD SALESMAN 1250 SQL> SELECT ename, job, sal FROM emp WHERE job='SALESMAN' OR job='PRESIDENT' AND sal>1500;
  • 45. 可以使用括号来定义优先顺序。 ENAME JOB SAL ---------- --------- --------- KING PRESIDENT 5000 ALLEN SALESMAN 1600 SQL> SELECT ename, job, sal FROM emp WHERE (job='SALESMAN' OR job='PRESIDENT') AND sal>1500;
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53. 按降序排列结果 SELECT ename, job, deptno, hiredate FROM emp ORDER BY hiredate DESC; ENAME JOB DEPTNO HIREDATE ---------- --------- --------- --------- ADAMS CLERK 20 12-JAN-83 SCOTT ANALYST 20 09-DEC-82 MILLER CLERK 10 23-JAN-82 JAMES CLERK 30 03-DEC-81 FORD ANALYST 20 03-DEC-81 KING PRESIDENT 10 17-NOV-81 MARTIN SALESMAN 30 28-SEP-81 ...
  • 54. 按结果列的别名排序 SELECT empno, ename, sal*12 annsal FROM emp ORDER BY annsal; EMPNO ENAME ANNSAL --------- ---------- --------- 7369 SMITH 9600 7900 JAMES 11400 7876 ADAMS 13200 7654 MARTIN 15000 7521 WARD 15000 7934 MILLER 15600 7844 TURNER 18000 ...
  • 55. 按多列排序 例、显示所有学生的信息,按系排序,同系中按年龄从大到小排序 Select * from student order by sdept,sage desc 在排序时可以指定多列,系统降按照指定列的顺序依次列示结果
  • 56. 按多列排序 SELECT ename, deptno, sal FROM emp ORDER BY deptno, sal DESC; ENAME DEPTNO SAL ---------- --------- --------- KING 10 5000 CLARK 10 2450 MILLER 10 1300 FORD 20 3000 ...
  • 57.
  • 58.
  • 59.
  • 60. AVG 和 SUM 适用于数值型数据 AVG(SAL) MAX(SAL) MIN(SAL) SUM(SAL) -------- --------- --------- --------- 1400 1600 1250 5600 SELECT AVG(sal), MAX(sal), MIN(sal), SUM(sal) FROM emp WHERE job LIKE 'SALES%';
  • 61. MIN 和 MAX 适用于不同类型的数据 SELECT MIN(hiredate), MAX(hiredate) FROM emp ; MIN(HIRED MAX(HIRED --------- --------- 17-DEC-80 12-JAN-83
  • 62. COUNT 函数用于计数 COUNT(*) --------- 6 SELECT COUNT(*) FROM emp WHERE deptno = 30; SELECT COUNT(comm) FROM emp WHERE deptno = 30; COUNT(COMM) ----------- 4 忽略 NULL 值
  • 63.
  • 64.
  • 65. 创建数据分组 EMP “ EMP 表中每一部门的平均工资” DEPTNO SAL --------- --------- 10 2450 10 5000 10 1300 20 800 20 1100 20 3000 20 3000 20 2975 30 1600 30 2850 30 1250 30 950 30 1500 30 1250 DEPTNO AVG(SAL) ------- --------- 10 2916.6667 20 2175 30 1566.6667 2916.6667 2175 1566.6667
  • 66.
  • 67.
  • 68.
  • 69. SELECT deptno, job, sum(sal) FROM emp GROUP BY deptno, job; DEPTNO JOB SUM(SAL) --------- --------- --------- 10 CLERK 1300 10 MANAGER 2450 10 PRESIDENT 5000 20 ANALYST 6000 20 CLERK 1900 ... 9 rows selected. 按多列分组
  • 70. 按多列分组 EMP “ EMP 表中不同部门不同职位的工资总和” DEPTNO JOB SAL --------- --------- --------- 10 MANAGER 2450 10 PRESIDENT 5000 10 CLERK 1300 20 CLERK 800 20 CLERK 1100 20 ANALYST 3000 20 ANALYST 3000 20 MANAGER 2975 30 SALESMAN 1600 30 MANAGER 2850 30 SALESMAN 1250 30 CLERK 950 30 SALESMAN 1500 30 SALESMAN 1250 JOB SUM(SAL) --------- --------- CLERK 1300 MANAGER 2450 PRESIDENT 5000 ANALYST 6000 CLERK 1900 MANAGER 2975 CLERK 950 MANAGER 2850 SALESMAN 5600 DEPTNO -------- 10 10 10 20 20 20 30 30 30
  • 71.
  • 72. 对分组的结果进行筛选 “ 每一部门最高工资大于 $2900” EMP DEPTNO SAL --------- --------- 10 2450 10 5000 10 1300 20 800 20 1100 20 3000 20 3000 20 2975 30 1600 30 2850 30 1250 30 950 30 1500 30 1250 DEPTNO MAX(SAL) --------- --------- 10 5000 20 3000 5000 3000 2850
  • 73.
  • 74. 使用 HAVING 短语 SELECT deptno, max(sal) FROM emp GROUP BY deptno HAVING max(sal)>2900; DEPTNO MAX(SAL) --------- --------- 10 5000 20 3000
  • 75. 使用 HAVING 短语 SELECT job, SUM(sal) PAYROLL FROM emp WHERE job NOT LIKE 'SALES%' GROUP BY job HAVING SUM(sal)>5000 ORDER BY SUM(sal); JOB PAYROLL --------- --------- ANALYST 6000 MANAGER 8275
  • 76. 嵌套的集函数 SELECT max(avg(sal)) 2 FROM emp 3 GROUP BY deptno; MAX(AVG(SAL)) ------------- 2916.6667
  • 77.
  • 78.
  • 79.
  • 80.
  • 81.
  • 82.
  • 83.
  • 84.
  • 85.
  • 86. 嵌套查询的实现 SELECT ename FROM emp WHERE sal > (SELECT sal FROM emp WHERE empno=7566); ENAME ---------- KING FORD SCOTT 2975
  • 87. 嵌套查询的实现 ENAME JOB ---------- --------- MILLER CLERK SELECT ename, job FROM emp WHERE job = (SELECT job FROM emp WHERE empno = 7369) AND sal > (SELECT sal FROM emp WHERE empno = 7876); CLERK 1100
  • 88. HAVING 短语中使用嵌套查询 SELECT deptno, MIN(sal) FROM emp GROUP BY deptno HAVING MIN(sal) > (SELECT MIN(sal) FROM emp WHERE deptno = 20); DEPTNO MIN(SAL) ---------- ---------- 10 1300 30 950 800
  • 89. 以下两个查询结果一样吗 ? SELECT ename, deptno, sal, comm FROM emp WHERE (sal, comm) IN (SELECT sal, comm FROM emp WHERE deptno = 30); SELECT ename, deptno, sal, comm FROM emp WHERE sal IN (SELECT sal FROM emp WHERE deptno = 30) AND comm IN (SELECT comm FROM emp WHERE deptno = 30);
  • 90.
  • 91.
  • 92.
  • 93.
  • 94.
  • 95.
  • 96. 使用 ANY 运算符 EMPNO ENAME JOB --------- ---------- --------- 7654 MARTIN SALESMAN 7521 WARD SALESMAN SELECT empno, ename, job FROM emp WHERE sal < ANY (SELECT sal FROM emp WHERE job = 'CLERK') AND job <> 'CLERK'; 950 800 1100 1300
  • 97. 使用 ALL 运算符 EMPNO ENAME JOB --------- ---------- --------- 7839 KING PRESIDENT 7566 JONES MANAGER 7902 FORD ANALYST 7788 SCOTT ANALYST SQL> SELECT empno, ename, job FROM emp WHERE sal > ALL (SELECT avg(sal) FROM emp GROUP BY deptno); 2916.6667 2175 1566.6667
  • 98.
  • 99.
  • 100.
  • 101.
  • 102.
  • 103.
  • 104.
  • 105.
  • 106.
  • 107. 连接查询 ( 涉及多个表的查询 ) EMPNO DEPTNO LOC ----- ------- -------- 7839 10 NEW YORK 7698 30 CHICAGO 7782 10 NEW YORK 7566 20 DALLAS 7654 30 CHICAGO 7499 30 CHICAGO ... 14 rows selected. EMP DEPT EMPNO ENAME ... DEPTNO ------ ----- ... ------ 7839 KING ... 10 7698 BLAKE ... 30 ... 7934 MILLER ... 10 DEPTNO DNAME LOC ------ ---------- -------- 10 ACCOUNTING NEW YORK 20 RESEARCH DALLAS 30 SALES CHICAGO 40 OPERATIONS BOSTON
  • 108.
  • 109.
  • 110. 等值连接 EMP DEPT EMPNO ENAME DEPTNO ------ ------- ------- 7839 KING 10 7698 BLAKE 30 7782 CLARK 10 7566 JONES 20 7654 MARTIN 30 7499 ALLEN 30 7844 TURNER 30 7900 JAMES 30 7521 WARD 30 7902 FORD 20 7369 SMITH 20 ... 14 rows selected. DEPTNO DNAME LOC ------- ---------- -------- 10 ACCOUNTING NEW YORK 30 SALES CHICAGO 10 ACCOUNTING NEW YORK 20 RESEARCH DALLAS 30 SALES CHICAGO 30 SALES CHICAGO 30 SALES CHICAGO 30 SALES CHICAGO 30 SALES CHICAGO 20 RESEARCH DALLAS 20 RESEARCH DALLAS ... 14 rows selected. Foreign key Primary key
  • 111. 等值连接的实现 SELECT emp.empno, emp.ename, emp.deptno, dept.deptno, dept.loc FROM emp, dept WHERE emp.deptno=dept.deptno; EMPNO ENAME DEPTNO DEPTNO LOC ----- ------ ------ ------ --------- 7839 KING 10 10 NEW YORK 7698 BLAKE 30 30 CHICAGO 7782 CLARK 10 10 NEW YORK 7566 JONES 20 20 DALLAS ... 14 rows selected.
  • 112. 使用表的别名简化工作 SELECT emp.empno, emp.ename, emp.deptno, dept.deptno, dept.loc FROM emp, dept WHERE emp.deptno=dept.deptno; SELECT e.empno, e.ename, e.deptno, d.deptno, d.loc FROM emp e, dept d WHERE e.deptno=d.deptno;
  • 113. 非等值连接 EMP SALGRADE EMPNO ENAME SAL ------ ------- ------ 7839 KING 5000 7698 BLAKE 2850 7782 CLARK 2450 7566 JONES 2975 7654 MARTIN 1250 7499 ALLEN 1600 7844 TURNER 1500 7900 JAMES 950 ... 14 rows selected. GRADE LOSAL HISAL ----- ----- ------ 1 700 1200 2 1201 1400 3 1401 2000 4 2001 3000 5 3001 9999 “ EMP 表中的工资数额在 SALGRADE 表的 LOSAL 和 HISAL 之间”
  • 114. 非等值连接的实现 ENAME SAL GRADE ---------- --------- --------- JAMES 950 1 SMITH 800 1 ADAMS 1100 1 ... 14 rows selected. SELECT e.ename, e.sal, s.grade FROM emp e, salgrade s WHERE e.sal BETWEEN s.losal AND s.hisal;
  • 115. 笛卡尔积: ENAME DNAME ------ ---------- KING ACCOUNTING BLAKE ACCOUNTING ... KING RESEARCH BLAKE RESEARCH ... 56 rows selected. EMP (14 rows) EMPNO ENAME ... DEPTNO ------ ----- ... ------ 7839 KING ... 10 7698 BLAKE ... 30 ... 7934 MILLER ... 10 WHERE 短句省略或无效时,表与表进行笛卡尔积运算。 DEPT (4 rows) DEPTNO DNAME LOC ------ ---------- -------- 10 ACCOUNTING NEW YORK 20 RESEARCH DALLAS 30 SALES CHICAGO 40 OPERATIONS BOSTON “ Cartesian product: 14*4=56 rows”
  • 116.
  • 117. 自身连接 EMP (WORKER) EMP (MANAGER) EMPNO ENAME MGR ----- ------ ---- 7839 KING 7698 BLAKE 7839 7782 CLARK 7839 7566 JONES 7839 7654 MARTIN 7698 7499 ALLEN 7698 EMPNO ENAME ----- -------- 7839 KING 7839 KING 7839 KING 7698 BLAKE 7698 BLAKE “ 表中的雇员之间存在上下级关系 &quot;
  • 118. 自身连接的实现 WORKER.ENAME||'WORKSFOR'||MANAG ------------------------------- BLAKE works for KING CLARK works for KING JONES works for KING MARTIN works for BLAKE ... 13 rows selected. SELECT worker.ename+' works for ‘+manager.ename FROM emp worker, emp manager WHERE worker.mgr = manager.empno;
  • 119. 两个以上的表的连接 NAME CUSTID ----------- ------ JOCKSPORTS 100 TKB SPORT SHOP 101 VOLLYRITE 102 JUST TENNIS 103 K+T SPORTS 105 SHAPE UP 106 WOMENS SPORTS 107 ... ... 9 rows selected. CUSTOMER CUSTID ORDID ------- ------- 101 610 102 611 104 612 106 601 102 602 106 604 106 605 ... 21 rows selected. ORD ORDID ITEMID ------ ------- 610 3 611 1 612 1 601 1 602 1 ... 64 rows selected. ITEM
  • 120.
  • 121. 外连接 EMP DEPT ENAME DEPTNO ----- ------ KING 10 BLAKE 30 CLARK 10 JONES 20 ... DEPTNO DNAME ------ ---------- 10 ACCOUNTING 30 SALES 10 ACCOUNTING 20 RESEARCH ... 40 OPERATIONS 没有雇员在 OPERATIONS 部门
  • 122.
  • 123. 示例 关系 Loan: 关系 Borrow: Perryridge Redwood Downtown Bname 1700 4000 3000 amount L-230 Smith L-230 L-155 Mary L-260 L-170 Jones L-170 Loanno custna Loanno
  • 124. 示例 Loan inner join Borrow on Loan.Loanno=Borrow.Loanno Redwood Downtown Bname 4000 3000 amount L-230 Smith L-230 L-170 Jones L-170 Loanno custna Loanno
  • 125. 示例 Loan natural inner join Borrow on Loan.Loanno=Borrow.Loanno Redwood Downtown Bname 4000 3000 amount Smith L-230 Jones L-170 custna Loanno
  • 126. 示例 Loan left outer join Borrow on Loan.Loanno=Borrow.Loanno NULL NULL 1700 Perryridge L-260 L-230 Smith 4000 Redwood L-230 Downtown Bname 3000 amount L-170 Jones L-170 Loanno custna Loanno
  • 127. 示例 Loan natural right outer join Borrow on Loan.Loanno=Borrow.Loanno Mary NULL NULL L-155 Smith 4000 Redwood L-230 Downtown Bname 3000 amount Jones L-170 custna Loanno
  • 128. 示例 Loan full outer join Borrow on Loan.Loanno=Borrow.Loanno NULL 1700 Perryridge L-260 Mary NULL NULL L-155 Smith 4000 Redwood L-230 Downtown Bname 3000 amount Jones L-170 custna Loanno
  • 129.
  • 130.
  • 131.
  • 132.
  • 133.
  • 134.
  • 135.
  • 136.