数据库操作(七)

回顾:
1、sql的执行顺序
select ⑤
from ①
where ②
group by ③
having ④
order by ⑥

2、关联查询
多表联合查询,杜绝笛卡尔积现象。
要求N张表联合,必须至少有N-1个连接条件。
内连接:查询出所有满足连接条件的数据。

外连接:查询出数据,满足+不满足条件的数据
左外连接
左表驱动表(所有数据)+ 右表匹配表(匹配)
右外连接
左表匹配表(匹配)+ 右表驱动表(所有数据)
全外连接
左表驱动表(所有数据)+ 右表驱动表(所有数据)
自连接
特殊连接查询
驱动、匹配表都来自于同一张表。

正课:
1、子查询
你是sql大牛,能否写一条select sql就能查询出想要的数据。
如:查询30部门最大工资的员工信息。
--错

    select *,max(sal) from emp 
        where deptno = 30;
select * from emp where deptno = 30
        and sal = (
            --30部门最高工资
            select max(sal) from emp 
            where deptno = 30
        );

如上所述:
当无法使用一条select sql完成一个功能时,
可以考虑使用sql嵌套的方式来完成。

sql嵌套:
一条SQL语句中嵌套着另一条SQL查询语句。
又被称为---子查询。

被嵌套在SQL语句中的查询SQL,称为子查询,
子查询所在的那条SQL语句,称为父查询。

注意:子查询可以使用在DDL、DML、DQL中,
通常一般使用在DQL中为多。

1)、子查询使用在DDL中

    create table emp_copy
        as (select empno,ename,job,sal,deptno 
            from emp
            );

结论:子查询使用在建表语句中,
实为表结构、表数据的复制。

2)、子查询使用在DML中

    insert into emp_copy 
        --values 注意:连values都没有
        (
            select empno,ename,job,sal,deptno 
            from emp
        );

3)、子查询使用在DQL中
DQL结构
select
from
where
group by 不使用子查询
having
order by 不使用子查询r

子查询的分类
   根据子查询的结果,可将子查询分为:

①、单行单列子查询。
select max(sal) from emp
where deptno = 30;--查询30部门的最高工资(1个)
②、多行单列子查询。
select empno from emp
where deptno = 30;--查询30部门的员工编号(多个)
③、多行多列子查询。
select empno,ename,sal,deptno
from emp
where deptno = 30;--查询30部门的员工信息(编号,姓名,工资,部门编号)(多条)

3-1)、子查询使用在where子句中
--查询与JONES员工相同部门的其他员工信息。
--step1:查询JONES员工所在部门
select deptno from emp where ename='JONES';
--step2:部门等于JONES部门的员工(其他员工)
select * from emp where deptno = (step1的结果)
and ename <> 'JONES';
--step3:sql拼接。

       select * from emp 
        where deptno = (
            --单行单列子查询
            select deptno from emp where ename='JONES'
        )
        and ename <> 'JONES';

--查询与SMITH、ALLEN不在同一个部门的员工信息。
--step1:查询出SMITH、ALLEN所在部门
select deptno from emp
where ename = 'SMITH' or ename = 'ALLEN';--in ('SMITH'、'ALLEN')

--step2:查询不在SMITH、ALLEN部门的员工
select * from emp
where deptno not in (step1的结果);
--step3:sql拼接
select * from emp
where deptno not in (
--多行单列子查询
select deptno from emp
where ename = 'SMITH' or ename = 'ALLEN'
);
注意:where子句中,可以出现单行单列、多行单列子查询。
单行单列子查询,一般使用 =、!=、<...
多行单列子查询,一般使用 in、any、all。

    ***补充:
       在子查询中,需要引入主查询的某些字段数据。
        可以使用exists关键字。
    
       --查询有员工的部门信息
       方式一:内连接方式
        select d.* from emp e,dept d
        where e.deptno = d.deptno;

       方式二:使用exists关键字
        select * from dept d
        where exists --存在以下关系
        (
            --只需要存在这种关系即可
            --能有返回值,说明关系存在
            --所以无需关系确切的返回数据内容
            select 1 from emp e
            where e.deptno = d.deptno
        );

3-2)、子查询使用在having子句中
--查收出最低薪水 高于 30部门最低薪水
的部门信息(部门编号、最低薪水)。
--step1:查询出30部门的最低薪水
select min(sal) from emp where deptno=30;

--step2:查询出各部门的最低薪水
select deptno,min(sal)
from emp
group by deptno;

--step3:最低薪水对比
select deptno,min(sal)
from emp
--where 后面无法使用聚合函数
--where min(sal) > (step1的结果)
group by deptno
--但是having可以使用聚合函数
having min(sal) > (step1的结果);

--step4:sql拼接

       select deptno,min(sal) 
        from emp 
        --where 后面无法使用聚合函数
        --where min(sal) > (step1的结果)
        group by deptno
        --但是having可以使用聚合函数
        having min(sal) > (
            select min(sal) from emp 
            where deptno=30
        );

3-3)、子查询使用from子句中
from 后面跟 表(多行多列结构)
所以一般多行多列子查询会充当临时表(虚表、匿名视图)
的功能,使用在from后面。

多行多列子查询作为临时表,该表并不存在,
查询到的数据,也只能在当前sql中有效。

--查询与30部门员工职位、工资都相同的
其他部门员工信息。
--step1:先查出30部门的职位及工资
select job,sal from emp
where deptno=30;
--step2:查询其他部门中员工信息
select * from emp
where deptno <> 30;
--step3:职位与工资匹配
select o.*
from (step2结果) o --其他部门人员,
(step1结果) th --30部门职位及工资
where o.job = th.job
and o.sal = th.sal;
--step4:sql

        select o.* 
        from (select * from emp 
            where deptno <> 30) o, --其他部门人员,
             (select job,sal from emp
            where deptno=30) th --30部门职位及工资
        where o.job = th.job
        and o.sal = th.sal;

3-4)、子查询使用在select语句中
把子查询放在select子句中,在一定程度上
可以充当外连接效果。

    --查询所有部门部门信息
    select distinct d.*,
    (select deptno from dept 
            where deptno not in(
            select distinct deptno from emp 
            where deptno is not null)) noEmpDept  
    from dept d,emp e
    where d.deptno = e.deptno;

    或给一个确切的值
    select distinct d.*,40 as noEmpDept  
    from dept d,emp e
    where d.deptno = e.deptno;

4、总结:
1)、子查询根据查询结果可分为:
单行单列子查询 (1个值)
多行单列子查询 (多个值)
多行多列子查询 (多条数据)

2)、子查询可以使用在DDL、DML、DQL中。
其中使用在DQL中居多。

3)、一条完整的DQL查询语句,如下:
select
from
where
group by
having
order by
一般 group by、order by后面跟查询表的字段名。
不能乱使用子查询的结果。

     select、from、where、having中可以使用子查询。
    a、其中where、having后面可以跟上
        单行单列子查询 一般使用 =、!=、>、<等关系运算符。
        多行单列子查询 一般使用 in、not in、any、all

    b、from后面可以跟上
        多行多列子查询 充当临时表。

    c、select后面只能跟上
        单行单列子查询(一般不建议这么用)

补充:
1、删除数据
truncate table emp_copy;--删除数据,保留表结构
delete from emp_copy;--全表删除数据
--truncate、delete的区别:
truncate不需要TCL支持
delete必须TCL支持

2、任何一个大功能sql都是由一个个小功能sql拼起来的。
一定要将功能进行分解,分出一个个小功能。
将小功能先完成,最后做拼接。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,377评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,390评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,967评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,344评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,441评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,492评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,497评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,274评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,732评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,008评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,184评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,837评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,520评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,156评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,407评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,056评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,074评论 2 352

推荐阅读更多精彩内容

  • 1.简介 数据存储有哪些方式?电子表格,纸质文件,数据库。 那么究竟什么是关系型数据库? 目前对数据库的分类主要是...
    乔震阅读 1,712评论 0 2
  • 5.多表查询 多表查询 目的:从多张表获取数据 前提:进行连接的多张表中有共同的列 等连接 通过两个表具有相同意义...
    乔震阅读 1,220评论 0 0
  • 查询是数据的一个重要操作。用户发送查询请求,经编译软件变异成二进制文件供服务器查询,后返回查询结果集给用户,查询会...
    产品小正阅读 1,381评论 0 2
  • 1. select * from emp; 2. select empno, ename, job from em...
    海纳百川_4d26阅读 1,900评论 0 4
  • mysql数据库中 :database : 文件夹table : 数据表(数据文件) 进入mysqlmysql -...
    赋闲阅读 561评论 0 0