Java学习日报—SQL基础—2021/11/29

今天效率很低,就看了以下内容。。。

目录

1.1关键词DISTINCT

1.2 连表查询

1.2.1 内连接

1.2.2 外连接

1.3 查询执行顺序


1.1关键词DISTINCT

DISTINCT 语法介绍,可能很多电影都是同一年Year发布的,如果想要按年份排重,一年只能出现一部电影到结果中, 你可以用 DISTINCT 关键字来指定某个或某些属性列唯一返回。写作:DISTINCT Year

选取出唯一的结果的语法

SELECT DISTINCT column, another_column, …

FROM mytable WHERE condition(s);

因为 DISTINCT 语法会直接删除重复的行, 还可以使用 GROUP BY 语句, GROUP BY 也会返回唯一的行,不过可以对具有相同的 属性值的行做一些统计计算,比如:求和。

1.2 连表查询

  • left join:左连接,返回左表中所有的记录以及右表中连接字段相等的记录。
  • right join:右连接,返回右表中所有的记录以及左表中连接字段相等的记录。
  • inner join:内连接,又叫等值连接,只返回两个表中连接字段相等的行。
  • full join:外连接,返回两个表中的行:left join + right join。
  • cross join:结果是笛卡尔积,就是第一个表的行数乘以第二个表的行数。
SELECT * FROM movies JOIN boxoffice ON movies.id = boxoffice.movie_id;

SELECT * FROM movies,boxoffice WHERE movies.id=boxoffice.movie_id;

上述两句SQL的结果是一样的,两者的区别如下:

① on条件是在生成临时表时使用的条件

② where条件是在临时表生成好后,再对临时表进行过滤的条件

1.2.1 内连接

INNER JOIN 先将两个表数据连接到一起。两个表中如果通过ID互相找不到的数据将会舍弃。此时,你可以将连表后的数据看作两个表的合并,SQL中的其他语句会在这个合并基础上继续执行。

还有一个理解INNER JOIN的方式,就是把 INNER JOIN 想成两个集合的交集(只会保留两个表都存在的数据)。

内连接INNER JOIN 可以简写做 JOIN。

1.2.2 外连接

INNER JOIN 只会保留两个表都存在的数据(交集),这看起来意味着一些数据的丢失,在某些场景下会有问题。

真实世界中两个表存在差异很正常,所以需要更多的连表方式,也就是要介绍的左连接LEFT JOIN,右连接RIGHT JOIN 和 全连接FULL JOIN。这几个连接方式都会保留不能匹配的行。

用LEFT/RIGHT/FULL JOINs 做多表查询,和INNER JOIN 语法几乎是一样的。

SELECT column, another_column, …

FROM mytable

INNER/LEFT/RIGHT/FULL JOIN another_table

    ON mytable.id = another_table.matching_id

WHERE condition(s)

ORDER BY column, … ASC/DESC

LIMIT num_limit OFFSET num_offset;

这些Join也可以写作 LEFT OUTER JOIN, RIGHT OUTER JOIN, 或 FULL OUTER JOIN, 和 LEFT JOIN, RIGHT JOIN, and FULL JOIN 等价。在表A 连接 B,LEFT JOIN保留A的所有行,不管有没有能匹配上B;反过来,RIGHT JOIN则保留所有B里的行;最后FULL JOIN 不管有没有匹配上,同时保留A和B里的所有行

1.3 查询执行顺序

1. FROM JOIN

FROM 或 JOIN会第一个执行,确定一个整体的数据范围. 如果要JOIN不同表,可能会生成一个临时Table来用于 下面的过程。总之第一步可以简单理解为确定一个数据源表(含临时表)

2. WHERE

我们确定了数据来源 WHERE 语句就将在这个数据源中按要求进行数据筛选,并丢弃不符合要求的数据行,所有的筛选col属性 只能来自FROM圈定的表. AS别名还不能在这个阶段使用,因为可能别名是一个还没执行的表达式

3. GROUP BY

如果你用了 GROUP BY 分组,那GROUP BY 将对之前的数据进行分组,统计等,并将是结果集缩小为分组数.这意味着 其他的数据在分组后丢弃.

4. HAVING

如果你用了 GROUP BY 分组, HAVING 会在分组完成后对结果集再次筛选。AS别名也不能在这个阶段使用.

5. SELECT

确定结果之后,SELECT用来对结果col简单筛选或计算,决定输出什么数据.

6. DISTINCT

如果数据行有重复DISTINCT 将负责排重.

7. ORDER BY

在结果集确定的情况下,ORDER BY 对结果做排序。因为SELECT中的表达式已经执行完了。此时可以用AS别名.

8. LIMIT / OFFSET

最后 LIMIT 和 OFFSET 从排序的结果中截取部分数据.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值