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;
原文地址:https://www.cnblogs.com/wenxuehai/p/15032938.html