zoukankan      html  css  js  c++  java
  • 联合查询和子查询

    联合查询
    联合查询:将多次查询(多条select 语句),在记录上进行拼接(字段不会增加)

    基本语法
    多条select语句构成:每一条select语句获取的字段数必须严格一致(但是字段类型无关)
    select 语句1
    Union [union 选项]
    select 语句2
    Union 选项:与select 选项一样有两个
    All:保留所有(不管重复)
    Distinct:去重(整个重复):默认的

    联合查询只要求字段一样,跟数据类型 无关

    联合查询意义
    联合查询的意义分为两种:
    1.查询同一张表,但是需求不同:如查询学生信息,男生身高升序,女生身高降序。
    2.多表查询:多张表的结构是完全一样的,保存的数据(结构)也是一样的。

    order by 使用
    在联合查询中:order by 不能直接使用,需要对查询语句使用括号才行

    若要order by 生效:必须搭配limit:limit使用限定的最大数即可

     

    子查询

    子查询:sub query,查询是在某个查询结果之上进行的(一条select 语句内部包含了另外一条select语句)

    子查询分类
    子查询有两种分类方式:按位置分类;按结果分类
    按位置分类:子查询(select 语句) 在外部查询(select语句)中出现的位置
    from 子查询:子查询跟在from之后
    where子查询:子查询出现where条件中
    exists子查询:子查询出现在exists里面

    按结果分类:根据子查询得到的数据进行分类(理论上讲任何一个查询得到的结果都可以理解为二维表)
    标量子查询:子查询得到的结果是一行一列
    列子查询:子查询得到的结果是一列多行
    行子查询:子查询得到的结果是多列一行(多行多列)
    上面几个出现的位置都是在where之后
    表子查询:子查询得到的结果是多行多列(出现的位置是在from之后)

    标量子查询
    需求:知道班级名字为PHP0710,想获取该班的所有学生

    1.确定数据源:获取所有的学生
    select * from my_student where c_id=?;
    2.获取班级ID:可以通过班级名字确定
    select id from my_class where name='PHP0810'; -- id一定只有一个值(一行一列)
    标量子查询实现


    列子查询
    需求:查询所有在读班级的学生(班级中存在的班级)
    1. 确定数据源:学生
    select * from my_student where c_id in(?);
    2.确定有效班级的 ID:所有班级id
    select id from my_class;

    列子查询实现

    列子查询返回的结果会比较:一列多行,需要使用in 作为条件匹配:其实在mysql中还有几个类似的条件:all ,some ,any

    行子查询
    行子查询:返回的结果可以是多行多列(一行多列)
    需求:要求查询整个学生中,年龄最大且身高是最高的学生
    1.确定数据源
    select * from my_student where age=? and height =?;
    2.确定最大的年龄和最高的身高
    select max(age),max(height) from my_student;

    行子查询:需要构造行元素,

    表子查询

    表子查询:子查询返回的结果是多行多列的二维表:子查询返回的结果是当做二维表来使用
    需求:找出每个班最高的一个学生
    1.确定数据源,先将学生按照身高进行降序排序
    selelct * from my_student order by height desc;
    2.从每个班选出第一个学生
    selelct * from my_student group by c_id; -- 每个班选出第一个学生
    表子查询:from子查询:得到的结果作为from的数据源

    Exists 子查询
    Exists: 是否存在的意思,exists子查询就是用来判断某些条件是否满足(跨表),exists是接在where之后 exists返回的结果只有0和1
    需求:查询所有的学生:前提条件是班级存在
    1.确定数据源
    select * from my_student where ?;
    2.确定条件是否满足
    Exists(select * from my_class); -- 是否成立
    exists子查询

     

  • 相关阅读:
    ORA-28000 帐户已被锁定问题处理
    德邦总管 修改oracle数据库用户密码的方法
    测试面试题目
    python 把一文件包含中文的字符写到另外文件乱码 UnicodeDecodeError: 'gbk' codec can't decode byte 0xac in position
    python version 2.7 required,which was not found in the registry
    ImportError: No module named dateutil.parser
    解决python2.x用urllib2证书验证错误, _create_unverified_context
    python多版本兼容性问题:当同时安装Python2和Python3后,如何兼容并切换
    MAC OS git客户端安装及操作
    Pycharm连接gitlab
  • 原文地址:https://www.cnblogs.com/sunhao96/p/7992072.html
Copyright © 2011-2022 走看看