常用的SQL-看看、练练--源自技术

Memos:开源自托管笔记服务的技术深度解析 Memos是一款开源自托管笔记应用,采用Go和React技术栈构建,提供数据隐私保护与完全控制权。其架构分为前端、后端、数据及部署四层,支持Markdown、多用户协作及API集成。通过Docker容器化部署,默认使用SQLite数据库,同时兼容MySQL/PostgreSQL。项目采用MIT许可证,社区活跃,GitHub星标超5万。技术特点包括REST/gRPC API、JWT认证及插件扩展,适合替代商业云笔记服务。Memos体现了隐私优先理念和现代Web应用趋势,为用户提供安全可控的知识管理方案。 阅读详情
注:以下所有sql案例均取自"oracle查询优化改写技巧与案例"丛书。

EMP表的详细:


查询所有信息,
[sql]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. SQL> select * from emp;  

     EMPNO ENAME                JOB                       MGR HIREDATE       SAL        COMM       DEPTNO
---------- -------------------- ------------------ ---------- -------------- ---------- ---------- ----------


      1110 张三                 主管                     3322 12-3月 -14      5200                    20


      1111 李四                 销售                     3321 03-11月-15      3400        500         30


      1112 王五                 销售                     3321 25-4月 -12      4400        800         30


      1113 赵二                 后勤                     3320 30-5月 -11      3450                    40


      1114 李磊磊               会计                     3319 22-12月-15      2500                    50


      1115 张少丽               销售                     3321 11-3月 -16      3400       1400         30


      1116 林建国               主管                     3322 22-1月 -16      5700                    20


      1117 马富邦               后勤                     3320 22-7月 -13      2800                    40


      1118 沈倩                 会计                     3319 06-5月 -10      2100                    50
已选择9行。

DEPT表的详细:


查询所有信息
[sql]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. SQL> select * from dept t;  

DEPTNO    DNAME
--------  --------
3322       管理部门


3321       销售部门


3320       后勤部门


3319       金融部门

1.union all与空字符串
union all通常用于合并多个数据集

例子:
[sql]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. SQL>  select empno as 编码, ename as 名称, nvl(mgr,deptno) as 上级编码  
  2.           from emp  
  3.           union all  
  4.           select deptno as 编码,dname as 名称,NULL as 上级编码  
  5.           from dept;  

      编码  名称       上级编码
----------  -------   -----------
      1110  张三      3322


      1111  李四      3321


      1112  王五      3321


      1113  赵二      3320


      1114  李磊磊    3319


      1115  张少丽    3321


      1116  林建国    3322


      1117  马富邦    3320


      1118  沈倩      3319


      3322  管理部门


      3321  销售部门


      3320  后勤部门


      3319  金融部门


已选择13行。

可以看到,当一个数据集列不够时,可以用null来填充该列的值,而空字符串在oracle中常常相当于null:
[sql]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. SQL> select '' as cl from dual;  
C
-
null

空字符串不等价与null

2.union 与 or
执行下面的查询
[sql]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. SQL> select empno,ename from emp where empno = 1116 or ename = '林建国';  

     EMPNO ENAME
---------- --------------------
      1116 林建国


如果改写为union all,则结果就是错的
[sql]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. SQL> select empno,ename from emp where empno = 1116  
  2.      union all  
  3.      select empno,ename from emp where ename = '林建国';  

     EMPNO ENAME
---------- --------------------
      1116 林建国
      1116 林建国


因为原语句中用的条件是or,是两个结果的合集而非并集,所以一般改写时要改为union来去掉重复的数据。

[sql]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. SQL> select empno,ename from emp where empno = 1116  
  2.      union  
  3.      select empno,ename from emp where ename = '林建国';  

     EMPNO ENAME
---------- --------------------
      1116 林建国
注意:
(1)不仅两个数据集间重复的数据会被去重,而且单个数据集里重复的数据也会被去重。
(2)有重复数据的数据集用union后得到的数据与预期会不一样。


用union all来模拟union语句的过程:
[sql]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. SQL> select distinct deptno  
  2.      from (select deptno from emp where mgr = 3320  
  3.            union all  
  4.            select deptno from emp where job = '后勤')  
  5.      order by 1;  

    DEPTNO
----------
        40
其实就是合并->去重->排序这三步。


想要保留住单个数据集中重复的数据,在去重前加一个唯一标识各行的列即可。
例如,我们可以加入“empno”,再利用union,效果如下: 
[sql]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. SQL> select empno,deptno from emp where mgr = 3320  
  2.      union  
  3.      select empno,deptno from emp where job = '后勤';  

     EMPNO     DEPTNO
---------- ----------
      1113         40
      1117         40


除了用唯一列,主键列外,还可以使用rowid。
[sql]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. SQL> select deptno  
  2.           from  
  3.           (select ROWID,deptno from emp where mgr = 3320  
  4.                union  
  5.            select ROWID,deptno from emp where job = '后勤')  
  6.           order by 1;  

    DEPTNO
----------
        40
        40


3.组合相关的行

显示部门30的员工编码、姓名及所在部门名称
[plain]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. SQL> select e.empno,e.ename,d.dname  
  2.      from emp e  
  3.      inner join dept d on (e.mgr = d.deptno)  
  4.      where e.deptno = 30;  

 EMPNO     ENAME         DNAME
---------- ------------- -------------
      1115 张少丽        销售部门


      1112 王五          销售部门


      1111 李四          销售部门

另有写法如下
[sql]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. select e.empno,e.ename,d.dname  
  2.      from emp e,dept d  
  3.      where e.mgr = d.deptno  
  4.      and e.deptno = 30;  

其中,join的写法是SQL-92的标准,当有多个表关联时,join方式的写法能更清楚地看清各表之间的关系,因此,建议大家写查询语句的时候优先使用join写法。

4.in、exists和inner join
下面先创建一个表emp2。
[sql]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. SQL> create table emp2 as  
  2.   2  select ename,job,sal,comm from emp where job = '销售';  

表已创建。

要求返回与表emp2(empno,job,sal)中数据相匹配的emp(empno,ename,job,sal,deptno)信息。

有in、exists、inner join三种写法。
(1)in写法
[sql]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. SQL> select empno,ename,job,sal,deptno  
  2.      from emp  
  3.      where (ename,job,sal) in (select ename,job,sal from emp2);  

     EMPNO ENAME                JOB                       SAL     DEPTNO
---------- -------------------- ------------------ ---------- ----------
      1111 李四                 销售                     3400         30
      1112 王五                 销售                     4400         30
      1115 张少丽               销售                     3400         30

(2)exists写法
[sql]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. SQL> select empno,ename,job,sal,deptno  
  2.           from emp a  
  3.           where exists (select null  
  4.                       from emp2 b  
  5.                     where b.ename = a.ename  
  6.                     and b.job = a.job  
  7.                     and b.sal = a.sal);  
     EMPNO ENAME                JOB                       SAL     DEPTNO
---------- -------------------- ------------------ ---------- ----------
      1111 李四                 销售                     3400         30
      1112 王五                 销售                     4400         30
      1115 张少丽               销售                     3400         30


(3)inner join
因为子查询的join列(emp2.ename,emp2.job,mep2.sal)没有重复行,所以这个查询可以直接改为inner join。
[sql]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. SQL> select a.empno,a.ename,a.job,a.sal,a.deptno  
  2.      from emp a  
  3.      inner join emp2 b on (b.ename = a.ename and b.job = a.job and b.sal = a.sal);  

     EMPNO ENAME                JOB                       SAL     DEPTNO
---------- -------------------- ------------------ ---------- ----------
      1111 李四                 销售                     3400         30
      1112 王五                 销售                     4400         30
      1115 张少丽               销售                     3400         30


5.inner join、left join、right join和full join解析
很多人对这几种连接方式,特别是left join与right join分不清,下面通过案例来解析一下。

首先建立两个测试用表:
[sql]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. /*左表*/  
  2. create table L as  
  3. select 'left_1' as str,'1' as v from dual union all  
  4. select 'left_2','2' as v from dual union all  
  5. select 'left_3','3' as v from dual union all  
  6. select 'left_4','4' as v from dual;  
  7.   
  8.   
  9. /*右表*/  
  10. create table R as  
  11. select 'right_3' as str,'3' as v,1 as status from dual union all  
  12. select 'right_4' as str,'4' as v,0 as status from dual union all  
  13. select 'right_5' as str,'5' as v,0 as status from dual union all  
  14. select 'right_6' as str,'6' as v,0 as status from dual;  

建好的表
[sql]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. SQL> select * from L;  

STR          V
------------ --
left_1       1
left_2       2
left_3       3
left_4       4
[sql]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. SQL> select * from R;  

STR            V      STATUS
-------------- -- ----------
right_3        3           1
right_4        4           0
right_5        5           0
right_6        6           0

(1)inner join的特点
该方式返回两表相匹配的数据
join写法
[sql]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. SQL> select L.str as left_str,R.str as right_str  
  2.      from L  
  3.      inner join R on L.v = R.v  
  4.      order by 1,2;  

LEFT_STR     RIGHT_STR
------------ --------------
left_3       right_3
left_4       right_4

左表的“1、2”以及右表的“5、6”都没有显示。

加where条件后的写法
[sql]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. SQL> select L.str as left_str,R.str as right_str  
  2.      from L,R  
  3.      where L.v = R.v  
  4.      order by 1,2;  

LEFT_STR     RIGHT_STR
------------ --------------
left_3       right_3
left_4       right_4

(2)left join的特点
该方式的左表为主表,左表返回所有的数据,右表只返回与左表相匹配的数据。
join写法
[sql]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. SQL> select L.str as left_str,R.str as right_str  
  2.      from L  
  3.      left join R on L.v = R.v  
  4.      order by 1,2;  

LEFT_STR     RIGHT_STR
------------ --------------
left_1
left_2
left_3       right_3
left_4       right_4
“5、6”都没有显示。

加(+)后的写法
[plain]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. SQL> select L.str as left_str,R.str as right_str  
  2.      from L,R  
  3.      where L.v = R.v(+)  
  4.      order by 1,2;  

LEFT_STR     RIGHT_STR
------------ --------------
left_1
left_2
left_3       right_3
left_4       right_4

注:
SELECT *FROM TABLE1 A,TABLE2 B WHERE A.ID=B.ID(+);左链接=LEFT JOIN
 
SELECT *FROM TABLE1 A,TABLE2 B WHERE A.ID(+)=B.ID;右链接=RIGHT JOIN

(3)right join的特点
该方式的右表为主表,左表中只返回与右表匹配的数据“3、4”,而“1、2”都没有显示,右表返回所有的数据。
join写法
[sql]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. SQL> select L.str as left_str,R.str as right_str  
  2.      from L  
  3.      right join R on L.v = R.v  
  4.      order by 1,2;  

LEFT_STR     RIGHT_STR
------------ --------------
left_3       right_3
left_4       right_4
             right_5
             right_6

加(+)后的写法
[sql]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. SQL> select L.str as left_str,R.str as right_str  
  2.      from L,R  
  3.      where L.v(+) = R.v  
  4.      order by 1,2;  

LEFT_STR     RIGHT_STR
------------ --------------
left_3       right_3
left_4       right_4
             right_5
             right_6

(4)full join 的特点
该方式的左右表均返回所有的数据,但只有相匹配的数据显示在同一行,非匹配的行只显示一个表的数据。
join写法
[plain]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. SQL> select L.str as left_str,R.str as right_str  
  2.      from L  
  3.      full join R on L.v = R.v  
  4.      order by 1,2;  

LEFT_STR     RIGHT_STR
------------ --------------
left_1
left_2
left_3       right_3
left_4       right_4
             right_5
             right_6

注:full join无(+)的写法

6.自关联
创建表
[plain]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. create table emp3 as  
  2. select 7839 as empno,'tom' as ename,1 as mgr from dual union all  
  3. select 7566 as empno,'jean' as ename,7839 as mgr from dual union all  
  4. select 7788 as empno,'jack' as ename,7566 as mgr from dual union all  
  5. select 7902 as empno,'allen' as ename,7788 as mgr from dual union all  
  6. select 7369 as empno,'adams' as ename,7902 as mgr from dual union all  
  7. select 7698 as empno,'jeckson' as ename,7839 as mgr from dual;  

创建表成功。
看一下表内容:
[sql]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. SQL> select * from emp3;  

     EMPNO ENAME                 MGR
---------- -------------- ----------
      7839 tom                  1
      7566 jean                 7839
      7788 jack                 7566
      7902 allen                7788
      7369 adams                7902
      7698 jeckson              7839

表emp3中有一个字段mgr,其中是主管的编码(对应于emp.empno):
可以看到,jeckson的MGR是7839,对应tom的EMPNO值,所以tom是jeckson的主管。

如何根据这个信息返回主管的姓名呢?这里用到的就是“自关联”。也就是两次查询表emp3,分别取不同的别名,这样就可以当做是两个表,后面的任务就是将这两个表和join链接起来就可以。

为了便于理解,这里用汉字做别名,并把相关列一起返回。
[sql]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. SQL> select 员工.empno as 职工编码,  
  2.           员工.ename as 职工姓名,  
  3.           员工.mgr as 员工表_主管编码,  
  4.           主管.empno as 主管表_主管编码,  
  5.           主管.ename as 主管姓名  
  6.      from emp3 员工  
  7.      left join emp3 主管 on (员工.mgr = 主管.empno)  
  8.      order by 1;  


  职工编码 职工姓名       员工表_主管编码 主管表_主管编码 主管姓名
---------- -------------- --------------- --------------- --------------
      7369 adams                     7902            7902 allen
      7566 jean                      7839            7839 tom
      7698 jeckson                   7839            7839 tom
      7788 jack                      7566            7566 jean
      7839 tom                       7777
      7902 allen                     7788            7788 jack


已选择6行。
通过这张表我们可以大致推测出各个职工的上下级情况
tom>jeckson=jean>jack>allen>adams

7.not in、not exists和left join
查询在dept不存在于emp的mgr中的值。
[sql]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. SQL> select * from dept where deptno not in (select emp.mgr from emp where emp.m  
  2. gr is not null);  

未选定行

8.外连接中的条件不要乱放
对于5节中介绍的左联语句,见下面的数据
[sql]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. SQL> select L.str as left_str,R.str as right_str,R.status  
  2.      from L  
  3.      left join R on L.v = R.v  
  4.      order by 1,2;  

LEFT_STR     RIGHT_STR          STATUS
------------ -------------- ----------
left_1
left_2
left_3       right_3                 1
left_4       right_4                 0

对于其中的L表,四条数据都返回了。


下面对于R表,我们现在只要求显示其中的status=1,也就是R.v=4的部分。
结果应为:
LEFT_STR     RIGHT_STR          STATUS
------------ -------------- ----------
left_1
left_2
left_3       right_3                 1
left_4

对于这种需求,很多人会这么写
left join用法
[sql]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. select L.str as left_str,R.str as right_str,R.status  
  2.      from L  
  3.      left join R on L.v = R.v  
  4.      where R.status = 1  
  5.      order by 1,2;  

(+)用法
[sql]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. select L.str as left_str,R.str as right_str,R.status  
  2.      from L  
  3.      where L.v = R.v(+)  
  4.      and R.status = 1  
  5.      order by 1,2;  

这样查询的结果为:
LEFT_STR     RIGHT_STR          STATUS
------------ -------------- ----------
left_3       right_3                 1

很明显,与我们期望得到的结果不一样,这是很多人在写查询或更改查询时常遇到的一种错误。问题就在于所加条件的位置及写法,正确的写法分别如下:
left join用法
[sql]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. select L.str as left_str,R.str as right_str,R.status  
  2.      from L  
  3.      left join R on (L.v = R.v and r.status = 1)  
  4.      order by 1,2;  
(+)用法
[sql]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. select L.str as left_str,R.str as right_str,R.status  
  2.      from L,R  
  3.      where L.v = R.v(+)  
  4.      and status(+) = 1  
  5.      order by 1,2;  
语句也可以像下面这样写,先过滤,再用join,这样会更加清晰。
[sql]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. select L.str as left_str,R.str as right_str,R.status  
  2.      from L  
  3.      left join (select * from R where R.status = 1)R on (L.v = R.v)  
  4.      order by 1,2;  

9.检测两个表中的数据以及对应数据的条数是否相同
我们首先建立视图如下:
[sql]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. create or replace view v as  
  2.      select * from emp where deptno != 20  
  3.      union all  
  4.      select * from emp where ename = '李磊磊';  

要求用查询找出视图V与表emp中不同的数据。
注意:视图V中员工“李磊磊”有两行数据,而emp表中只有一条数据。
[sql]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. SQL> select rownum,empno,ename from v where ename = '李磊磊';  

    ROWNUM      EMPNO ENAME
---------- ---------- --------------------
         1       1114 李磊磊
         2       1114 李磊磊

[sql]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. SQL> select rownum,empno,ename from emp where ename = '李磊磊';  

    ROWNUM      EMPNO ENAME
---------- ---------- --------------------
         1       1114 李磊磊


比较两个数据集的不同时,通常用类似下面的full join语句
[sql]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. SQL> select v.empno,v.ename,b.empno,b.ename  
  2.      from v  
  3.      full join emp b on (b.empno = v.empno)  
  4.      where (v.empno is null or b.empno is null);  

     EMPNO ENAME                     EMPNO ENAME
---------- -------------------- ---------- --------------------
                                      1116 林建国
                                      1110 张三
我们发现这种语句在这个案例中查不到“李磊磊”的区别。
这时我们就要对数据进行处理,增加一列显示相同数据的条数,再进行比较。
[sql]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. SQL> select v.empno,v.ename,v.cnt,emp.empno,emp.ename,emp.cnt  
  2.      from (select empno,ename,COUNT(*) as cnt from v group by empno,ename) v  
  3.      full join (select empno,ename,COUNT(*) as cnt from emp group by empno,ename) emp  
  4.      on (emp.empno = v.empno and emp.cnt = v.cnt)  
  5.      where (v.empno is null or emp.empno is null);  

正确结果如下:

     EMPNO ENAME              CNT      EMPNO ENAME   CNT
---------- ----------- ---------- ---------- ----------- ----------
     1114  李磊磊               2


                                        1116  林建国       1


                                        1110  张三         1


                                        1114  李磊磊       1
也就是通过员工“李磊磊”的数量不同导致cnt不同从而发现的不同。

10.聚集与内连接
首先建立案例用表如下:
[sql]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. create table emp_bonus (empno INT,received DATE,type INT);  
  2. insert into emp_bonus values( 1111,date '2016-5-17',1);  
  3. insert into emp_bonus values( 1112,date '2016-2-15',2);  
  4. insert into emp_bonus values( 1115,date '2016-2-15',3);  

其中
[sql]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. SQL> select * from emp_bonus;  

     EMPNO RECEIVED             TYPE
---------- -------------- ----------
      1111 17-5月 -16              1
      1112 15-2月 -16              2
      1115 15-2月 -16              3

[sql]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. SQL> select e.empno,e.ename,e.sal   
  2.             from emp e   
  3.             where e.deptno = 30;  

     EMPNO ENAME                       SAL
---------- -------------------- ----------
      1111 李四                       3400
      1112 王五                       4400
      1115 张少丽                     3400

员工的奖金根据TYPE计算,TYPE=1的奖金为员工工资的10%,TYPE=2的奖金为员工工资的20%,TYPE=3的奖金为员工工资的30%。
现在要求返回上述员工(也就是部门30的所有员工)的工资及奖金。

我们首先想到的是使用join语句,先关联,然后对结果做聚集。
那么在做聚集之前,我们先先看一下关联后的结果。
[sql]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. SQL> select e.empno,  
  2.             e.ename,  
  3.             e.sal,  
  4.             (e.sal * case  
  5.                  when eb.type = 1 then 0.1  
  6.                  when eb.type = 2 then 0.2  
  7.                  when eb.type = 3 then 0.3  
  8.              end) as bonus  
  9.          from emp e  
  10.         inner join emp_bonus eb on (e.empno = eb.empno)  
  11.         where e.deptno = 30  
  12.         order by 1,2;  

     EMPNO ENAME                       SAL      BONUS
---------- -------------------- ---------- ----------
      1111 李四                       3400        340
      1112 王五                       4400        880
      1115 张少丽                     3400       1020
对这样的关联结果进行聚集后的数据如下:
[sql]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. SQL> select e.deptno,  
  2.                  SUM(e.sal) as total_sal,  
  3.                  SUM(e.sal * case  
  4.                       when eb.type = 1 then 0.1  
  5.                       when eb.type = 2 then 0.2  
  6.                       when eb.type = 3 then 0.3  
  7.                   end) as total_bonus  
  8.               from emp e  
  9.              inner join emp_bonus eb on (e.empno = eb.empno)  
  10.              where e.deptno = 30  
  11.              group by e.deptno;  

    DEPTNO  TOTAL_SAL TOTAL_BONUS
---------- ---------- -----------
        30      11200        2240
我们核对一下,工资总额和奖金总额都没有问题。

11.聚集与外连接
如果我们要分别返回所有部门的工资及奖金怎么办?因上述奖金数据只含部门30,那么改为left join就可以。
[sql]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. SQL> select e.deptno,  
  2.             SUM(e.sal) as total_sal,  
  3.             SUM(e.sal * eb2.rate) as total_bonus  
  4.         from emp e  
  5.         left join (select eb.empno,  
  6.                             SUM(case  
  7.                                  when eb.type = 1 then 0.1  
  8.                                  when eb.type = 2 then 0.2  
  9.                                  when eb.type = 3 then 0.3  
  10.                              end) as rate  
  11.                       from emp_bonus eb  
  12.                       group by eb.empno) eb2 on eb2.empno = e.empno  
  13.               group by e.deptno  
  14.               order by 1;  
    DEPTNO  TOTAL_SAL TOTAL_BONUS
---------- ---------- -----------
        20      10900
        30      11200        2240
        40       6250
        50       4600
5分钟搞懂基因组规模代谢网络(GSMM):从数据库选择到模型构建全流程 本文详细解析基因组规模代谢网络(GSMM)构建的全流程,从数据库选择到模型优化。重点介绍MetaCyc、BiGG等主流数据库的黄金三角评估法则,对比自上而下与自下而上两种建模方法,并提供模型修剪、仿真优化的实用技巧与避坑指南,帮助研究者高效构建精准代谢网络模型。 阅读详情

相关推荐

abaqus 6.13安装(ubuntu 16.04LTS)

1。从iso将文件拷贝出来 2。chmod 777 -R ./* 给文件权限 3。sudo /home/xx/A/setup 4。安装licenseserver 5。拷贝lic,log文件 6。打开license sudo ./lmgrd -c path 7. 27011@xx or 27011@localhost ...

a1099313374的博客 1950

sql基本操作之多表查询

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结 前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。 提示:以下是本篇文章正文内容,下面案例可供参考 一、pandas是什么? 示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。 二、使用步骤 1.引入库 代码

m0_51529857的博客 1094

Mathcad在LLC谐振变换器设计中的公式推导实战

本文通过Mathcad软件,详细演示了LLC谐振变换器设计的核心公式推导实战。文章阐述了如何利用Mathcad作为“会思考的草稿纸”,从定义基本参数、应用基波近似法(FHA)模型,到逐步推导电压增益公式及确定工作边界频率(fmin, fmax),并展示了如何通过动态参数扫描进行优化设计,帮助电源工程师高效、直观地完成理论计算,为后续仿真与实现奠定坚实基础。

q1w3e5r7t9y的博客 297

【SQL】多表查询

SELECT查询不但可以从一张表查询数据,还可以从多张表同时查询数据。查询多张表的语法是: SELECT * FROM <表1> <表2> 例如,同时从students表和classes表的“乘积”,即查询数据,可以这么写: -- FROM students, classes: SELECT * FROM students, classes; 这种一次查询两个表的数据,查询的结果也是一个二维表,它是students表和classes表的“乘积”,即students表.

是派大星吖的博客 3389

maya权重拷贝一对一,一对多

是不是有时候盔甲很多很碎头很大,用代理一个个拷贝很麻烦吧 用下面代码直接运行进行一对多或者一对一拷贝 第一个先选择参考物体,加选其他一堆有的没的有权重或没权重的物体执行一键拷贝,就可以啦 以下是源码送上,带走吧 ------------------------ #! -*- coding:utf -8 -*- #author:liubingdong #date:20...

weixin_30852367的博客 1534

Marin说PCB之LPDDR5的布线注意事项--01

以上就是本期所有内容了,有些是通用的LPDDR5的设计准则,有的是针对单板的设计规则,严格意义说是没有哪一种规则是完全适用的LPDDR5的 通用规则的,不同的单板可能板厚,板材,层数,SOC以及DDR的型号都是不同的,一般的做法就是严格按照SOC手册上的LPDDR5的要求加上仿真同事给的建议修改优化就好了,我们下期文章不见不散。我们知道想要做好一个LPDDR颗粒,需要考虑的是因素有很多例如,电源完整性,信号完整性,层叠的设计,布局的摆放,布线的合理规划,去耦电容的摆放等等。

weixin_45223454的博客 3164

SQL语句select查询表的数据的简单查询和条件查询的常用方法

干货,SQL语句select查询表的数据的简单查询和条件查询。

qq_46274901的博客 1万+

第4章--CANoe library开发 - 诊断功能

因为专栏要做的是汽车ECU自动化测试程序,测试的是ECU的诊断和刷新,因此就需要利用CANoe的接口,开发一些方便使用的诊断报文收发函数。

j187067046的博客 1401

mysql from关键字后面跟多个表的写法

在一个项目中,看到前辈的sql语句写法有点生疏,就好奇它这个写法是左连接、右连接还是内连接等写法呢?

weixin_47742051的博客 9545

电机控制的智慧之眼:全面解析FOC状态观测器

摘要:本文深入探讨磁场定向控制(FOC)中的状态观测器技术,重点分析其在无传感器电机控制中的关键作用。文章详细介绍了滑模观测器(SMO)、扩展卡尔曼滤波(EKF)、龙贝格观测器和高频注入法等主流观测器的工作原理、技术特点及适用场景,其中SMO因结构简单、鲁棒性强成为当前主流方案。同时阐述了观测器与锁相环(PLL)结合的工程实践方案,并针对不同应用场景提供了观测器选型建议。文章还探讨了启动问题处理、参数敏感性等工程挑战的解决方案,以及混合观测器、AI应用等未来发展趋势。这些观测器技术使电机系统在无机械传感器情

汽车软件开发 275

YOLO11,ultralytics-main源代码目录结构详解

本文详细介绍了YOLO11框架的ultralytics-main源代码目录结构,帮助用户更好地理解和使用YOLO模型。主要目录包括:docker文件夹,包含多种Docker镜像文件,适用于不同硬件环境;docs文件夹,存放YOLO的说明文档;examples文件夹,提供YOLO使用的示例代码;tests文件夹,包含单元测试模块;ultralytics文件夹,为核心代码所在,包含推理逻辑、配置、数据处理等模块。其中,engine文件夹负责训练和推理引擎,models文件夹存放模型架构,nn定义神经网络结构

qq_30279827的博客 1285

MySQL数据表查询

操作数与操作符组合的式⼦。操作数:可以是常量、变量、函数的返回值、另⼀个查询语句返回的值;操作符:就是运算符,包括算术运算符、赋值运算符、⽐较运算符、逻辑运算符、字符匹配运算等。内容....

是个非常热爱生活、乐观、奋斗、努力的逗比青年 5109

基于Qt的工业组态软件开发:图形绘制与TCP通讯实现

在数据接收时,通过 readyRead 信号触发解析函数,校验数据包完整性后提取有效数据,并更新对应图形元素的状态,例如根据温度值改变矩形的填充色,实现设备状态可视化。测试阶段,我们将软件部署到Windows工控机,连接PLC设备进行通讯测试,结果表明图形元素响应及时,TCP数据传输稳定,满足工业现场的基本需求。综上所述,基于Qt的组态软件开发,核心在于利用 QGraphicsView 框架实现图形元素的灵活绘制与管理,结合 QTcpSocket 完成工业数据的可靠交互。

谢谢大家的关注和点赞!这里只有纯纯的知识干货,没有一句废话。希望能实实在在帮到大家~要是觉得有用,别忘了给我点支持哟,你 273

JAVA JDBC--源自技术

简介:      JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口(Hibernate,Mybatis等ORM框架),使数据库开发人员能够编写数据库应用程序。   标准组

MyJava_Dx的博客 391

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

amoeba高可用mysql_分享MYSQL中的各种高可用技术(源自姜承尧大牛)

原文:分享MYSQL中的各种高可用技术(源自姜承尧大牛)分享MYSQL中的各种高可用技术(源自姜承尧大牛)图片和资料来源于MYSQL大牛姜承尧老师(MYSQL技术内幕作者)姜承尧:网易杭州研究院 技术经理 主导INNOSQL的开发mysql高可用各个技术的比较数据库的可靠指的是数据可靠数据库可用指的是数据库服务可用可靠的是数据:例如工商银行,数据不能丢失可用的是服务:服务器不能宕机灵活运用MYS...

weixin_39590566的博客 158

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

【MySQL】慢查询+SQL语句优化 (内容源自ChatGPT)

慢查询是指执行SQL查询语句所需要的时间较长,超过了一定阀值,从而导致服务器性能下降。通常情况下,当SQL查询语句执行时间超过1秒以上时就会被任务是慢查询。未使用索引:如果查询没有使用索引或者使用的索引不合理,那么MySQL就不得不全表扫描,这将降低查询速度和对系统资源的占用率。对于大型数据库的操作、尤其是 left join/ left outer join 操作,也可能使查询缓慢甚至崩溃。数据量太大:如果返回的结果集非常大,即时查询本身很快,也很占用大量系统资源,降低服务器性能。

小新的博客 1994

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

SQL注入 源自优快云论坛

注入操作: Declare @T Varchar(255),@C Varchar(255) Declare Table_Cursor Cursor For Select A.Name,B.Name From Sysobjects A,Syscolumns B Where A.Id=B.Id And A.Xtype=u And (B.Xtype=99 Or B.Xtype=35 Or B.X

小虫的专栏 539

SQL注入常用WAF绕过姿势

一、什么是WAF 1、简介 WAF部署在web应用程序前面,在用户请求到达web服务器前对用户请求进行扫描和过滤,分析并校验每个用户请求的网络包,确保每个用户请求有效且安全,对无效或有攻击行为的请求进行阻断或隔离。通过检查HTTP流量,可以防止源自web应用程序的安全漏洞(如SQL注入,跨站脚本攻击,文件包含和安全配置错误)的攻击。 2、工作原理 检测异常协议:拒绝不符合HTTP标准的请求 增强型的输入验证:代理和服务器端验证,而不仅仅是客户端验证 白名单和黑名单 基于规则和异常的保护:基..

oldbuger的博客 2595

web安全之SQL注入绕过技术(四)

学习掌握SQL注入绕过技术原理及使用方法,更好的用于日常的渗透测试中。

Longwaer 5111

MyBatis 总结一下--源自技术

框架简介:(来源百度百科) iBATIS一词来源于“internet”和“abatis”的组合,是一个由Clinton Begin在2002年发起的开放源代码项目。 于2010年6月16号被谷歌托管,改名为MyBatis。2013年11月迁移到Github。 资源下载 教程 http://mybatis.github.io/mybatis-3/zh/dynamic-s

MyJava_Dx的博客 1721

web安全之SQL注入绕过技术(五)

学习SQL注入绕过技术的原理及使用方式,更好的用于日常渗透测试中。

Longwaer 5186

JPA 注解--源自技术

/*   * 主键生成策略    *  不显示约定:主键值由程序控制。   * AUTO:JPA自动选择合适的策略,是默认选项;   * TABLE:通过表产生主键,框架借助由表模拟序列产生主键,使用该策略可以使应用更易于数据库移植;   *       不同的JPA实现商生成的表名是不同的,如OpenJPA生成openjpa_sequence_table表,   *    Hiber

MyJava_Dx的博客 445

奇迹MU常用SQL语句(非常实用)介绍

奇迹MU常用SQL语句(非常实用)介绍 去发现同类优质开源项目:https://gitcode.com/ 本文档收集并整理了一系列针对奇迹MU游戏服务器管理和维护的常用SQL语句。这些语句是从作者丰富的开服经验中提炼而来,尽管历经岁月,但依旧保持着其实用性。以下是本资源文件包含的主要内容: 服务器数据查询 角色与物品管理 数据库优化建议 常见问题解决语句 此资源适用于那些希望提升自己游戏服务器...

gitblog_06712的博客 381

web安全之SQL注入绕过技术(一)

学习掌握SQL注入绕过技术,从而更好的用于渗透测试中。

Longwaer 2293

SQLSERVER 表名数据库名作为变量 必须使用动态SQL(源自网络)

动态语句基本语法:1 :普通SQL语句可以用exec执行Select * from tableName exec('select * from tableName')exec sp_executesql N'select * from tableName' -- 请注意字符串前一定要加N2:字段名,表名,数据库名之类作为变量时,必须用动态SQL declare @fname varchar(20)

jane007123的专栏 1万+

分享MYSQL中的各种高可用技术(源自姜承尧大牛)

mysql高可用各个技术的比较 数据库的可靠指的是数据可靠 数据库可用指的是数据库服务可用 可靠的是数据:例如工商银行,数据不能丢失 可用的是服务:服务器不能宕机 灵活运用MYSQL的各种高可用技术来达到下面各种级别的高可用要求 要达到99.9%:使用MYSQL复制技术 要达到99.99%:使用MYSQL NDB 集群和虚拟化技术 要达到99.99...

185
上一篇: Spring3MVC 在JSP中使用@ModelAttribute--源自技术
下一篇: Sping+ActiveMQ整合--源自技术
MyJava_Dx
博客等级 码龄11年 1粉丝 32原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值