《sql语句练习1》

Oracle系列《一》:简单SQL与单行函数

使用scott/tiger用户下的emp表和dept表完成下列练习,表的结构说明如下

emp员工表(empno员工号/ename员工姓名/job工作/mgr上级编号/hiredate受雇日期/sal薪金/comm佣金/deptno部门编号)

dept部门表(deptno部门编号/dname部门名称/loc地点)

工资 = 薪金 + 佣金

登录Oracle数据库

1、sqlplus scott/tiger

2、sqlplus /nolog

SQL>conn scott/tiger
若是使用SYS的账号进行登录的话,则使用以下语句

SQL>conn / as sysdba

【1】EMP表内容查询

SQL> SELECT * FROM emp;

出错,原因是没有找到该表,因为该表时SCOTT用户的表,所以查询时应该加上scott.emp就可以了

【2】显示当前用户

SQL> show user

【3】查看当前用户的所有表

SQL> SELECT * FROM tab;

【4】若想重复执行上一条SQL语句,则在sqlplus命令行下输入"/"即可

【5】查询一张表的结构,例如dept表

SQL> desc dept

【6】在雇员表中查询雇员的编号、姓名、工作

SQL> SELECT empno,ename,job FROM emp;

【7】可以为列名取别名,在Linux下Oracle如果英文别名不加上双引号则会变成大写

SQL> SELECT empno 编号,ename 姓名,job 工作 FROM emp;

【8】查询所有的工作

SQL> SELECT DISTINCT job FROM emp;

工作可能会重复,加上DISTINCT关键字   去重复值

【9】若要求按照以下的格式进行结果输出,如 NO:7469,Name:SMITH,Job:CLERK

SQL> SELECT ‘NO:‘||empno||‘,Name:‘||ename||‘,Job:‘||job FROM emp;

【10】要求列出每个雇员的姓名及年薪

SQL> SELECT ename,sal*12 income FROM emp;

这里年薪最好用别名进行标识,可以一眼就能明白

【11】查看每月可以得到奖金的雇员信息

SQL> SELECT * FROM emp WHERE comm is NOT NULL;

【12】要求基本工资大于1500,同时可以领取奖金的雇员信息

SQL> SELECT * FROM emp WHERE sal>1500 AND comm is NOT NULL;

如果是或的是关系,则使用 OR

【13】查询基本工资不大于1500,同时不可以领取奖金的雇员信息

SQL> SELECT * FROM emp WHERE NOT(sal>1500 AND comm is NOT NULL);

【14】查询在1981年雇佣的全部雇员信息,BETWEEN .. AND 包含等于的情况

SQL> SELECT * FROM emp

WHERE hiredate BETWEEN ‘01-JAN-81‘ AND ‘31-DEC-81‘;

【15】Oracle对大小敏感,所以查询时名字要区分大小写

【16】要求查询出雇员编号不是 7369、7499的雇员信息

SQL> SELECT * FROM emp

WHERE empno NOT IN(7369,7499);

【17】SQL中LIKE语句要注意通配符 % 和 _

SQL> SELECT * FROM emp

WHERE hiredate LIKE ‘%81%‘;

【18】查看雇员编号不是7369的雇员信息,使用<>或!=

SQL> SELECT * FROM emp

WHERE empno<>7369;

【19】要求对雇员的工资由低到高进行排序,升序为默认(ASC),降序(DESC)

SQL> SELECT * FROM emp

GROUP BY sal desc;

【20】查看出部门号为10的雇员信息,查询的信息按照工资从高到低,若工资相等则按雇用日期从早到晚排列

SQL> SELECT * FROM emp

WHERE deptno=10

ORDER BY sal DESC,hiredate ASC;

数据库系统中,每个数据库之间区别最大的就是在函数的支持上,单行函数是最简单的函数,单行函数分为

1、字符函数:接受字符输入并且返回字符或数值

2、数值函数:接受数值输入并返回数值

3、日期函数:对日期型数据进行操作

4、转换函数:将一种数据类型转换为另一种数据类型

5、通用函数:NVL、DECODE 函数

字符函数:

【1】大小写转换 UPPER 和 LOWER

SQL> SELECT UPPER(‘smith‘) FROM dual;

【2】将雇员姓名变为开头字母大写,INITCAP

SQL> SELECT INITCAP(ename) FROM emp;

字符函数中有连接函数CONCAT,但不如 || 好用,还有字符串处理的一些函数

字符串截取:substr()

字符串长度:length()

内容替换:replace()

SQL> SELECT substr(‘hello‘,1,3),length(‘hello‘),replace(‘hello‘,‘l‘,‘x‘) FROM dual;

这里注意的是Oracle中字符串截取从0和从1开始都是一样的,谨防面试提问

【3】要求显示所有雇员的姓名及姓名的后3个字符

SQL> SELECT ename,SUBSTR(ename,LENGTH(ename)-2) FROM emp;

以上操作显得较为麻烦,substr()函数是可以倒着截取

SQL> SELECT ename,SUBSTR(ename,-3,3) FROM emp;

数值函数:

1、四舍五入:ROUND()

2、截断小数位:TRUNC()

3、取余(取模):MOD

SQL> SELECT ROUND(789.536) FROM dual;

【1】保留2位小数,(如果是-2则对整数进行四舍五入,变为800了)

SQL> SELECT ROUND(783.56,2) FROM dual;

【2】使用MOD()函数进行取余操作

SQL> SELECT MOD(10,3) FROM dual;

日期函数:

1、日期 - 数字 = 日期

2、日期 + 数字 = 日期

3、日期 - 日期 = 数字(天数)

【1】求出当前日期

SQL> SELECT SYSDATE FROM dual;

Oracle提供【2】求出从雇用日期到今天所有雇员的雇员编号、姓名和月数

SQL> SELECT 了以下的日期函数支持:

MONTHS_BETWEEN():求出给定日期范围的月数

ADD_MONTHS():在指定日期上加上指定的月数,求出之后的日期

NEXT_DAY():下一个的今天的日期

LAST_DAY():求出给定日期的最后一天日期

empno,ename,ROUND(MONTHS_BETWEEN(SYSDATE,hiredate)) FROM emp;

【3】验证 ADD_MONTHS()、NEXT_DAY()、LAST_DAY()

SQL> SELECT ADD_MONTHS(SYSDATE,4) FROM DUAL;

SQL> SELECT NEXT_DAY(SYSDATE,‘MON‘) FROM DUAL;

SQL> SELECT LAST_DAY(SYSDATE) FROM DUAL;

转换函数:

1、TO_CHAR():  将日期或数值转换成字符串

2、TO_NUMBER():将字符串转换成数字

3、TO_DATE():  将字符串转换成日期

【1】将年月日进行分开,要指定拆分的通配符,yyyy-mm-dd

SQL> SELECT empno,ename,TO_CHAR(hiredate,‘yyyy‘) datetime FROM emp;

【2】将薪水的数字进行格式化,‘$99,999‘表示美元,‘L99,999‘表示当地货币

SQL> SELECT empno,ename,TO_CHAR(sal,‘99,999) salary FROM emp;

【3】TO_NUMBER()验证

SQL> SELECT TO_NUMBER(‘123‘)+TO_NUMBER(‘123‘) FROM DUAL;

【4】TO_DATE()验证,如下例子执行后显示为 11-JUL-11

SQL> SELECT TO_DATE(‘2011-7-11‘,‘yyyy-mm-dd‘) FROM DUAL;

通用函数:

【1】求出每个雇员的年薪(应算上奖金)

SQL> SELECT empno,ename,(sal+comm)*12 FROM emp;

由于comm中有NULL,NULL值计算后还是NULL,正确如下:

SQL> SELECT empno,ename,NVL(comm,0),(sal+NVL(comm,0))*12 income FROM emp;

NVL可以理解为将NULL值转换为具体的内容,这里是0

【2】DECODE()函数,该函数类似于 IF ... ELSEIF...ELSE

语法如下:

DECODE(col/expression,选择1,结果1[,选择2,结果2,...,默认])

验证DECODE()函数

SQL> SELECT empno,ename,hiredate,

DECODE(job,‘CLERK‘,‘业务员‘,‘SALESMAN‘,‘销售人员‘,’MANAGER‘,‘经理‘,‘ANALYST‘,‘分析员‘,‘PRESIDENT‘,‘总裁‘) 职位

FROM emp;

SQL简单语句练习:

【1】找出佣金高于薪金的60%的员工

SQL> SELECT * FROM emp WHERE comm>sal*0.6

【2】找出部门10中所有经理(MANAGER)和部门20中所有办事员(CLERK)的详细资料

SQL> SELECT * FROM emp

WHERE (deptno=20 AND job=‘MANAGER‘)

OR (deptno=10 AND job=‘CLERK‘);

【3】找出既不是经理又不是办事员但其薪金大于或等于2000的所有员工的资料

SQL> SELECT * FROM emp

WHERE job NOT IN(‘MANAGER‘,‘CLERK‘) AND sal >= 2000;

【4】找出有奖金的员工的不同国祚

SQL> SELECT DISTINCT job FROM emp

WHERE comm IS NOT NULL;

【5】找出各月倒数第3天受雇的所有员工

SQL> SELECT * FROM emp

WHERE LAST_DAY(hiredate)-2=hiredate;

【6】找出早于12年前受雇的员工

SQL> SELECT * FROM emp

WHERE MONTHS_BETWEEN(sysdate,hiredate)/12 > 12;

【7】显示刚好为5个字符的员工的姓名

SQL> SELECT ename FROM emp

WHERE length(ename)=5;

【8】显示不带有"R"的员工的姓名

SQL> SELECT ename FROM emp

WHERE ename NOT LIKE ‘%R%‘;

【9】显示员工的姓名和受雇日期,将最老的员工排在最前

SQL> SELECT * FROM emp

Order BY hiredate;

【10】显示所有员工的姓名,加入公司的年份和月份,按受雇日期所在月排序,若月份相同则按年份排序

SQL> SELECT ename,TO_CHAR(hiredate,‘yyyy‘) year,TO_CHAR(hiredate,‘mm‘) month FROM emp

ORDER BY month,year;

【11】找出在2月受聘的员工

SQL> SELECT * FROM emp

WHERE TO_CHAR(hiredate,‘mm‘)=2;

【12】以年月日方式显示所有员工服务年限

SQL> SELECT ename,TRUNC(MONTHS_BETWEEN(sysdate,hiredate)/12) year,

TRUNC(MOD(MONTHS_BETWEEN(sysdate,hiredate),12)) month,

TRUNC(MOD(sysdate-hiredate,30)) day

FROM emp;

Oracle系列《二》:多表复杂查询和事务处理

多表查询应该注意去除笛卡尔积,一般多个表时会为表起个别名

【1】要求查询雇员的编号、姓名、部门编号、部门名称及部门位置

SQL> SELECT e.empno,e.ename,d.deptno,d.dname,d.loc

FROM emp e,dept d

WHERE e.deptno = d.deptno;

【2】要求查询每个雇员的姓名、工作、雇员的直接上级领导的姓名(表自关联)

SQL> SELECT e.ename,e.job,m.ename

FROM emp e,emp m

WHERE e.mgr = m.empno;

【3】对【2】进行扩充,将雇员所在部门名称同时列出

SQL> SELECT e.ename,e.job,m.ename,d.dname

FROM emp e,emp m,dept d

WHERE e.mgr = m.empno AND e.deptno=d.deptno;

【4】查询每个雇员的姓名、工资、部门名称,工资在公司的等级(salgrade),及其领导的姓名所在公司的等级

<1>先确定工资等级表的内容

SQL> SELECT * FROM salgrade;

<2>查询每个雇员的姓名、工资、部门名称和工资在公司的等级

SQL> SELECT e.ename,e.sal,d.dname,s.grade

FROM emp e,dept d,salgrade s

WHERE e.deptno=d.deptno AND e.sal BETWEEN s.losal AND s.hisal;

<3>查询其领导姓名及工资所在公司的等级

SQL> SELECT e.ename,e.sal,d.dname,s.grade,m.ename,m.sal,ms.grade

FROM emp e,dept d,salgrade s,emp m,salgrade ms

WHERE e.deptno = d.deptno AND e.sal BETWEEN s.losal AND s.hisal

AND e.mgr = m.empno AND m.sal BETWEEN ms.losal AND ms.hisal;

【5】左连接与右连接的概念,"+"在等号左边表示右连接,反之,左连接

查询雇员的编号、姓名及其领导的编号、姓名

SQL> SELECT e.empno,e.ename,m.empno,m.ename

FROM emp e,emp m

WHERE e.mgr = m.empno(+);

就发现将KING的那条记录也连过来了

SQL1999语法中有如下几种连接(了解)

1、交叉连接CROSS JOIN,产生笛卡尔积

SQL> SELECT * FROM emp CROSS JOIN dept;

2、自然连接NATURAL JOIN,自动进行关联字段的匹配

SQL> SELECT * FROM emp NATURAL JOIN dept;

3、使用USING子句,直接关联操作列

SQL> SELECT * FROM emp JOIN dept USING(deptno)

WHERE deptno=30;

4、使用ON子句,用户自己编写的条件

SQL> SELECT * FORM emp JOIN dept ON(emp.deptno = dept.deptno)

WHERE deptno=30;

5、左连接(左外连接、LEFT (OUTER) JOIN)、右连接(右外连接、RIGHT (OUTER) JOIN)

组函数及分组统计

1、COUNT():求出全部记录数

2、MAX():求出一组中最大值

3、MIN():求出最小值

4、AVG():求出平均值

5、SUM():求和

【1】求出每个部门的雇员数量

SQL> SELECT deptno,count(empno)

FROM emp

GROUP BY deptno;

【2】按部门分组,并显示部门的名称,及每个部门的员工数

SQL> SELECT d.dname,COUNT(e.empno)

FROM emp e,dept d

WHERE e.deptno=d.deptno

GROUP BY d.dname;

【3】要求显示平均工资大于2000的部门编号和平均工资

SQL> SELECT deptno,AVG(sal)

FROM emp

WHERE AVG(sal)>2000

GROUP BY deptno;

出错,WHERE子句中不能出现分组函数的条件,要使用HAVING子句

上述语句应该改为如下

SQL> SELECT deptno,AVG(sal)

FROM emp

GROUP BY deptno

HAVING AVG(sal)>2000

【4】显示非销售人员工作名称以及从事同一工作雇员的月工资总和,并且要求从事同一工作的雇员月工资合计大于$5000,

输出结果按月工资的合计升序排序

<1>按工作分组,求出非销售人员的月工资总和

SQL> SELECT job,SUM(sal)

FROM emp

WHERE job<>‘SALESMAN‘

GROUP BY job;

<2>对分组条件进行限制,然后进行排序,HAVING子句不能使用别名

SQL> SELECT job,SUM(sal) totalSal

FROM emp

WHERE job<>‘SALESMAN‘

GROUP BY job

HAVING SUM(sal) > 5000

ORDER BY totalSal;

【3】分组函数可以嵌套使用,但是在SELECT列中就不能再出现该分组条件的列名了

SQL> SELECT deptno,MAX(AVG(sal))

FROM emp

GROUP BY deptno;

出错!修改如下

SQL> SELECT MAX(AVG(sal))

FROM emp

GROUP BY deptno;

【4】查询出比7654工资要高的全部雇员的信息

<1>首先要查询雇员编号7654的工资

SQL> SELECT sal FROM emp WHERE empno=7654;

<2>以上述条件的结果最后后续查询的依据

SQL> SELECT * FROM emp

WHERE sal>(SELECT sal FROM emp WHERE empno=7654);

子查询在操作中分为以下三类:

1、单列子查询:返回的结果是一列的内容

2、单行子查询:返回多个列,也可能是一条记录

3、多行子查询:返回多个记录

【1】要求查询工资比7654高,同时与7788从事相同工作的全部雇员

SQL> SELECT * FROM emp

WHERE sal>(SELECT sal FROM emp WHERE empno=7654)

AND job=(SELECT job FROM emp WHERE empno=7788);

【2】要求查询 部门名称、部门员工数、部门平均工资,部门的最低收入雇员的姓名

<1>查询部门员工数、部门平均工资

SQL> SELECT deptno,COUNT(empno),AVG(sal)

FROM emp

GROUP BY deptno;

<2>查询部门的名称,及最低收入雇员姓名,要进行表关联(子查询)

SQL> SELECT d.dname,ed.c,ed.a,e.ename

FROM dept d,(

SELECT deptno,COUNT(empno) c,AVG(sal) a,MIN(sal) min

FROM emp

GROUP BY deptno) ed, emp e

WHERE d.deptno=ed.deptno AND e.sal = ed.min;

若上述存在两个最低工资的情况,则会出错,在子查询中存在以下3种查询的操作符号

IN:指定一个查询范围,例如查询每个部门的最低工资(返回值有多个)

SQL> SELECT * FROM emp

WHERE sal IN(SELECT MIN(sal) FROM emp GROUP BY deptno);

ANY:=ANY(与IN操作一样)、>ANY(比最小大)、<ANY(比最大小)

SQL> SELECT * FROM emp

WHERE sal <ANY(SELECT MIN(sal) FROM emp GROUP BY deptno);

ALL: >ALL(比最大要大)、<ALL(比最小的小),SQL语句类似上面

SQL多列子查询示例如下

SQL> SELECT * FROM emp

WHERE (sal,NVL(comm,-1)) IN

(SELECT sal,NVL(comm,-1) FROM emp WHERE deptno=20);

数据库更新操作INSERT、UPDATE、DELETE

【1】复制一张表,例如复制EMP表为MYEMP

SQL> CREATE TABLE MYTEMP AS SELECT * FROM emp;

【2】将编号为7899的雇员的领导取消

SQL> UPDATE myemp SET mgr=null WHERE empno=7899;

【3】更新时,一定要注意不能批量更新(加上WHERE子句),多列更新例子如下

SQL> UPDATE myemp SET mgr=null,comm=null WHERE empno IN(7369,8899);

【4】删除掉全部领取奖金的雇员

SQL> DELECT FROM emp WHERE comm is NOT NULL;

事务处理 ACID

A:Atomicity   原子性:事务中的操作或者都完成,或者都取消

C:Consistency 一致性:事务中的操作保证数据库中的数据不会出现逻辑上不一致的情况

I:Isolation   隔离性:当前的事务与其他未完成的事务是隔离的

D:Durability  持久性:在COMMIT之后,数据永久保存在数据库中,在此之前,事务的操作都可以回滚

验证事务过程:

<1>创建一张临时表,只包含部门10

SQL> CREATE TABLE emp10 AS SELECT * FROM emp WHERE empno=10;

<2>删除emp10中的7782雇员

SQL> DELETE FROM emp10 WHERE empno=7782;

再打开另一个窗口,发现数据还存在,此时如果可以使用以下的两种命令进行事务处理

COMMIT 和 ROLLBACK 提交事务和回滚事务

SQL查询练习

【1】列出至少一个员工的所有部门

SQL> SELECT d.*,ed.cou FROM dept d,(

SELECT deptno,COUNT(empno) cou FROM emp

GROUP BY deptno

HAVING COUNT(empno) > 1) ed

WHERE d.deptno=ed.deptno;

【2】列出部门名称和这些部门的员工信息,同时列出那些没有员工的部门

SQL> SELECT d.deptno,d.dname,e.empno,e.ename

FROM dept d,emp e

WHERE d.deptno = e.deptno(+);

【3】列出所有"CLERK"(办事员)的姓名及其部门名称,部门的人数

<1>关联dept表

SQL> SELECT e.ename,d.dname

FROM emp e,dept d

WHERE e.deptno=d.deptno and e.job=‘CLERK‘;

<2>使用GROUP BY 完成部门分组人数

SQL> SELECT e.ename,d.dname,ed.cou FROM emp e,dept d,(

SELECT deptno,COUNT(empno) cou FROM emp

GROUP BY deptno) ed

WHERE job=‘CLERK‘ AND e.deptno=d.deptno AND ed.deptno=e.deptno;

时间: 2024-11-07 14:22:03

《sql语句练习1》的相关文章

CI框架源码阅读笔记3 全局函数Common.php

从本篇开始,将深入CI框架的内部,一步步去探索这个框架的实现.结构和设计. Common.php文件定义了一系列的全局函数(一般来说,全局函数具有最高的加载优先权,因此大多数的框架中BootStrap引导文件都会最先引入全局函数,以便于之后的处理工作). 打开Common.php中,第一行代码就非常诡异: if ( ! defined('BASEPATH')) exit('No direct script access allowed'); 上一篇(CI框架源码阅读笔记2 一切的入口 index

IOS测试框架之:athrun的InstrumentDriver源码阅读笔记

athrun的InstrumentDriver源码阅读笔记 作者:唯一 athrun是淘宝的开源测试项目,InstrumentDriver是ios端的实现,之前在公司项目中用过这个框架,没有深入了解,现在回来记录下. 官方介绍:http://code.taobao.org/p/athrun/wiki/instrumentDriver/ 优点:这个框架是对UIAutomation的java实现,在代码提示.用例维护方面比UIAutomation强多了,借junit4的光,我们可以通过junit4的

Yii源码阅读笔记 - 日志组件

?使用 Yii框架为开发者提供两个静态方法进行日志记录: Yii::log($message, $level, $category);Yii::trace($message, $category); 两者的区别在于后者依赖于应用开启调试模式,即定义常量YII_DEBUG: defined('YII_DEBUG') or define('YII_DEBUG', true); Yii::log方法的调用需要指定message的level和category.category是格式为“xxx.yyy.z

源码阅读笔记 - 1 MSVC2015中的std::sort

大约寒假开始的时候我就已经把std::sort的源码阅读完毕并理解其中的做法了,到了寒假结尾,姑且把它写出来 这是我的第一篇源码阅读笔记,以后会发更多的,包括算法和库实现,源码会按照我自己的代码风格格式化,去掉或者展开用于条件编译或者debug检查的宏,依重要程度重新排序函数,但是不会改变命名方式(虽然MSVC的STL命名实在是我不能接受的那种),对于代码块的解释会在代码块前(上面)用注释标明. template<class _RanIt, class _Diff, class _Pr> in

CI框架源码阅读笔记5 基准测试 BenchMark.php

上一篇博客(CI框架源码阅读笔记4 引导文件CodeIgniter.php)中,我们已经看到:CI中核心流程的核心功能都是由不同的组件来完成的.这些组件类似于一个一个单独的模块,不同的模块完成不同的功能,各模块之间可以相互调用,共同构成了CI的核心骨架. 从本篇开始,将进一步去分析各组件的实现细节,深入CI核心的黑盒内部(研究之后,其实就应该是白盒了,仅仅对于应用来说,它应该算是黑盒),从而更好的去认识.把握这个框架. 按照惯例,在开始之前,我们贴上CI中不完全的核心组件图: 由于BenchMa

CI框架源码阅读笔记2 一切的入口 index.php

上一节(CI框架源码阅读笔记1 - 环境准备.基本术语和框架流程)中,我们提到了CI框架的基本流程,这里这次贴出流程图,以备参考: 作为CI框架的入口文件,源码阅读,自然由此开始.在源码阅读的过程中,我们并不会逐行进行解释,而只解释核心的功能和实现. 1.       设置应用程序环境 define('ENVIRONMENT', 'development'); 这里的development可以是任何你喜欢的环境名称(比如dev,再如test),相对应的,你要在下面的switch case代码块中

Apache Storm源码阅读笔记

欢迎转载,转载请注明出处. 楔子 自从建了Spark交流的QQ群之后,热情加入的同学不少,大家不仅对Spark很热衷对于Storm也是充满好奇.大家都提到一个问题就是有关storm内部实现机理的资料比较少,理解起来非常费劲. 尽管自己也陆续对storm的源码走读发表了一些博文,当时写的时候比较匆忙,有时候衔接的不是太好,此番做了一些整理,主要是针对TridentTopology部分,修改过的内容采用pdf格式发布,方便打印. 文章中有些内容的理解得益于徐明明和fxjwind两位的指点,非常感谢.

CI框架源码阅读笔记4 引导文件CodeIgniter.php

到了这里,终于进入CI框架的核心了.既然是"引导"文件,那么就是对用户的请求.参数等做相应的导向,让用户请求和数据流按照正确的线路各就各位.例如,用户的请求url: http://you.host.com/usr/reg 经过引导文件,实际上会交给Application中的UsrController控制器的reg方法去处理. 这之中,CodeIgniter.php做了哪些工作?我们一步步来看. 1.    导入预定义常量.框架环境初始化 之前的一篇博客(CI框架源码阅读笔记2 一切的入

jdk源码阅读笔记之java集合框架(二)(ArrayList)

关于ArrayList的分析,会从且仅从其添加(add)与删除(remove)方法入手. ArrayList类定义: p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Monaco } span.s1 { color: #931a68 } public class ArrayList<E> extends AbstractList<E> implements List<E> ArrayList基本属性: /** *

dubbo源码阅读笔记--服务调用时序

上接dubbo源码阅读笔记--暴露服务时序,继续梳理服务调用时序,下图右面红线流程. 整理了调用时序图 分为3步,connect,decode,invoke. 连接 AllChannelHandler.connected(Channel) line: 38 HeartbeatHandler.connected(Channel) line: 47 MultiMessageHandler(AbstractChannelHandlerDelegate).connected(Channel) line: