• mysql连接查询


    连接查询  join 

    SQL中将连接查询分成四类内连接,外连接,自然连接和交叉连接

    交叉连接: cross join

       从一张表中循环取出每一条记录, 每条记录都去另外一张表进行匹配: 匹配一定保留(没有条件匹配), 而连接本身字段就会增加(保留),最终形成的结果叫做: 笛卡尔积。(不常用)

    基本语法: 左表 cross join 右表 或 from 左表,右表;

    selec *from t1 cross t2;                 select *from t1,t2;

    内连接:  [inner] join

    从左表中取出每一条记录,去右表中与所有的记录进行匹配: 匹配必须是某个条件在左表中与右表中相同最终才会保留结果,否则不保留.

    基本语法左表 [inner] join 右表 on 左表.字段 = 右表.字段; on表示连接条件: 条件字段就是代表相同的业务含义(如my_student.c_id和my_class.id)  

    而表名太长, 通常可以使用别名.没有on之后的内容,这个时候系统会保留所有结果(笛卡尔积)

     

    外连接: left/right join

    以某张表为主,取出里面的所有记录, 然后每条与另外一张表进行连接: 不管能不能匹配上条件,最终都会保留: 能匹配,正确保留; 不能匹配,其他表的字段都置空NULL.

    外连接分为两种: 是以某张表为主: 有主表

    left join: 左外连接(左连接), 以左表为主表

    right join: 右外连接(右连接), 以右表为主表

    基本语法: 左表 left/right join 右表 on 左表.字段 = 右表.字段;

     

    三者区别:

    交叉 结果全保留(无论是否匹配得上)

    内连接(匹配不上的舍去)

    外链接有主表(主表匹配不上的置空)

    联合查询

    联合查询的意义:

    1. 查询同一张表,但是需求不同: 如查询学生信息, 男生身高升序, 女生身高降序.

    2. 多表查询: 多张表的结构是完全一样的,保存的数据(结构)也是一样的.

     

    基本语法:多条select语句构成: 每一条select语句获取的字段数必须严格一致(但是字段类型无关)

    Select 语句1

    Union [union选项]

    Select语句2...

     

    Union选项: 与select选项一样有两个

    All: 保留所有(不管重复)

    Distinct: 去重(整个重复): 默认的

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

    order by使用

    正序 order  by    降序  desc    asc升序(不写默认asc)

    排序子句语法:order by 列名 asc/desc

    limit

    LIMIT m,n : 表示从第m+1条开始,取n条数据;

    LIMIT n : 表示从第0条开始,取n条数据,是limit(0,n)的缩写。

    本题limit 2,1 表示从第(2+1)条数据开始,取一条数据,即入职员工时间排名倒数第三的员工

    在联合查询中: order by不能直接使用,需要对查询语句使用括号才行;另外,要orderby生效: 必须搭配limit: limit使用限定的最大数即可.

     

    --(select *from t3 where gender='男' order by age limit 999999)
    
    union
    
    (select *from t3 where gender='' order by age desc limit 999999)

    子查询

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

    子查询结果当做二维表来使用

    子查询分类:2

     按位置分类;  和按结果分类

    l  按位置分类: 子查询(select语句)在外部查询(select语句)中出现的位置

    1. From子查询: 子查询跟在from之后
    2. Where子查询: 子查询出现where条件中
    3. Exists子查询: 子查询出现在exists里面

    l  按结果分类: 根据子查询得到的数据进行分类(理论上讲任何一个查询得到的结果都可以理解为二维表)

    1. 标量子查询: 子查询得到的结果是一行一列
    2. 列子查询: 子查询得到的结果是一列多行
    3. 行子查询: 子查询得到的结果是多列一行(多行多列) (1,2,3出现的位置都是在where之后)
    4. 表子查询: 子查询得到的结果是多行多列(出现的位置是在from之后)

    例子:

    标量子查询  (一行一列)

    需求: 找到分类为科技的所有文章标题

    列子查询(一列)

    一个表,让我找出语文和数学都及格人的名字。表是这样的:

    行子查询(一行)

    需求:找出年龄最大且身高最高的人

    表子查询(一个小表) 

    需求:找出每个人最好的成绩

     

    Exists子查询

    Exists: 是否存在的意思, exists子查询就是用来判断某些条件是否满足(跨表), exists是接在where之后:(后面有完整的一条语句) exists返回的结果只有0和1.

    需求:如果存在的话身高大于2米的人,列出表中所有数据

     

    一些补充

    过滤条件放在on和where的先后顺序

    这两种写法的区别在于,过滤条件放在ON的后面是在联合之前就进行过滤,放在WHERE后面是在联合之后的结果集上进行过滤。

  • 相关阅读:
    对于delphi 三层的理解
    XE6调用android标准功能
    修复 XE7 Frame 内 PopupMenu 快捷键失效问题 by 龟山阿卍
    最大熵模型 二
    最大熵模型
    算法复习-平面内极大值点
    算法复习-生成全排列
    算法复习-归并排序
    算法复习-快速排序
    连续特征的离散化
  • 原文地址:https://www.cnblogs.com/pipiyan/p/10645073.html
Copyright © 2020-2023  润新知