zoukankan      html  css  js  c++  java
  • DQL基本语法2

    下面的查询基于的表有:

    •  "Websites" 表:

    •  access_log表:

    • students表:

    1、多表查询

    1.1、基本查询(笛卡尔积)

    SELECT查询不但可以从一张表查询数据,还可以从多张表同时查询数据。

    查询多张表的语法:

    select * from 表1, 表2;
    
    # 示例:
    SELECT * FROM websites, access_log;

    查询结果类似:

    上面查询出来的将是 access_log 和 websites 表的笛卡尔积,也就是 access_log 表的每个记录分别跟 websites 表的所有记录的组合。 结果集的列数是 access_log 表和 websites 表的列数之和,行数是 access_log 表和 websites 表行数之积。

    在多表查询时,不同表之间可能有相同的列名称,此时我们应该通过 “表名.列名” 的方式来区别不同表之间的列,或者也可以直接给表起别名,通过 “表别名.列名” 的方式来区分:

    SELECT
        w.id,
        w.NAME,
        a.aid,
        a.site_id 
    FROM
        websites w,
        access_log a;

    查询结果类似:

    JOIN的含义就如英文单词“join”一样,连接两张表,大致分为内连接,外连接,右连接,左连接,自然连接。

    1.2、内连接(交集、INNER JOIN)

    内连接INNER JOIN是最常用的连接操作,从数学的角度讲就是求两个表的交集。

    select 字段列表 from 表1 [inner] join 表2 on 条件   -- inner可省略不写

    示例:

    SELECT a.id, a.name, b.aid, b.date
    FROM websites a
    INNER JOIN access_log b ON a.id = b.site_id;
    
    -- 内连接语法可以用where替代,等价于上面语句,可以称为隐式内连接
    SELECT a.id, a.name, b.aid, b.date
    FROM websites a, access_log b 
    WHERE a.id = b.site_id;

    查询结果:

    1.3、左连接(LEFT JOIN)

    左连接LEFT JOIN的含义就是求两个表的交集外加左表剩下的数据。从笛卡尔积的角度讲,就是先从笛卡尔积中挑出ON子句条件成立的记录,然后加上左表中剩余的记录。

    select 字段列表 
    from 左表 left join 右表 
    on 条件;

    示例,下面以 access_log 为左表,websites 为右表:

    SELECT * 
    FROM access_log LEFT JOIN websites 
    ON access_log.aid=websites.id;

    查询结果:

    1.4、右连接(RIGHT JOIN)

    同理,右连接RIGHT JOIN就是求两个表的交集外加右表剩下的数据。从笛卡尔积的角度描述,右连接就是从笛卡尔积中挑出ON子句条件成立的记录,然后加上右表中剩余的记录。

    select 字段列表
    from 左表 right join 右表
    on 条件

    示例,下面以 websites 为左表,access_log 为右表:

    SELECT * 
    FROM websites 
    RIGHT JOIN access_log 
    ON access_log.aid=websites.id;

    查询结果:

    2、子查询

    子查询允许把一个查询嵌套在另一个查询当中。

    2.1、where型子查询 

    where 型子查询把内层查询结果当作外层查询的比较条件。

    如果内层查询返回一个标量值(就一个值),那么外部查询就可以使用比较符,比如:=、>、<、>=、<=和<>符号进行比较判断。

    比如下面查询 count 值最大的相关信息:

    SELECT * 
    FROM access_log
    WHERE count = (SELECT MAX(access_log.count) FROM access_log);

    查询结果:

    如果子查询返回的不是一个标量值,而是一个N行单列的结果集,但外部查询使用了比较符和子查询的结果集进行比较,此时会抛出异常。

    如果子查询返回的不是一个标量值,而是一个N行单列的结果集,此时可以使用 IN、ANY、SOME 和 ALL 操作符,不能直接使用 = > < >= <= <> 这些比较标量结果的操作符。

    SELECT * 
    FROM websites 
    WHERE id IN (SELECT id from websites WHERE country = 'CN');

    2.2、from型子查询

    from 型子查询把内层的查询结果当成临时表,供外层sql再次查询。当子查询返回的结果是多行多列时,子查询的结果集可以当成表看待,一般要给这个临时表起一个别名,否则临时表没有名称则无法访问临时表中的字段。

    SELECT * 
    FROM (SELECT id,`name`,alexa FROM websites WHERE country = 'CN') temp
    WHERE temp.alexa > 15;
  • 相关阅读:
    【MM系列】SAP库龄报表逻辑理解
    【MM系列】SAP技巧之更改布局
    【MM系列】SAP里批量设置采购信息记录删除标记
    《跃迁-从技术到管理的硅谷路径》读书笔记
    Java安全编码标准
    web安全/渗透测试--1--web安全原则
    使用spring validation完成数据后端校验
    9 个Java 异常处理的规则
    程序员必看:给你一份详细的Spring Boot知识清单
    Java架构技术知识点梳理
  • 原文地址:https://www.cnblogs.com/wenxuehai/p/15032938.html
Copyright © 2011-2022 走看看