文章目录

  • 1. 表的加减法
    • 1.1 什么是表集合运算
    • 1.2 表的加法——UNION
    • 1.3 MYSQL 8.0 不支持交运算INTERSECT
    • 1.4 差集,补集与表的减法
    • 1.5 对称差
  • 2. 连结(JOIN)
    • 2.1.内连结(INNER JOIN)
  • 总结

1. 表的加减法

1.1 什么是表集合运算

集合在数学领域表示“各种各样的事物的总和”, 在数据库领域表示记录的集合. 具体来说,表、视图和查询的执行结果都是记录的集合, 其中的元素为表或者查询结果中的每一行。

在标准 SQL 中, 分别对检索结果使用 UNION, INTERSECT, EXCEPT 来将检索结果进行并,交和差运算, 像UNION,INTERSECT, EXCEPT这种用来进行集合运算的运算符称为集合运算符。

以下的文氏图展示了几种集合的基本运算:

在数据库中,所有的表——以及查询结果都可以视为集合,因此也可以把表视为集合进行上述集合运算,在很多时候,这种抽象非常有助于对复杂查询问题给出一个可行的思路。

1.2 表的加法——UNION

1.2.1 UNION

示例:UNION的具体用法以及查询结果:

SELECT product_id, product_nameFROM productUNION
SELECT product_id, product_nameFROM product2;

执行SQL语句后结果如下图所示:

上述结果包含了两张表中的全部商品,这就是集合中的并集运算,通过文氏图会看得更清晰:

练习:
假设连锁店想要增加毛利率超过 50%或者售价低于 800 的货物的存货量, 请使用 UNION 对分别满足上述两个条件的商品的查询结果求并集.

代码如下:

select product_id, product_name, product_type, sale_price, purchase_priceFROM product
WHERE sale_price < 800UNIONSELECT product_id, product_name, product_type, sale_price, purchase_priceFROM productWHERE sale_price > 1.5 * purchase_price;

运行结果如图:

1.2.2 UNION 与 OR 谓词

练习:
分别使用UNION 或者 OR 谓词,找出毛利率不足 30% 或毛利率未知的商品。

-- 使用 OR 谓词
SELECT * FROM product
WHERE sale_price / purchase_price <1.3OR sale_price / purchase_price IS NULL;
-- 使用 UNION
SELECT * FROM product
WHERE sale_price / purchase_price < 1.3UNION
SELECT *FROM product
WHERE sale_price / purchase_price IS NULL;

1.2.3 包含重复行的集合运算 UNION ALL

SQL 语句的 UNION 会对两个查询的结果集进行合并和去重, 这种去重不仅会去掉两个结果集相互重复的, 还会去掉一个结果集中的重复行. 但在实践中有时候需要需要不去重的并集, 在 UNION 的结果中保留重复行的语法其实非常简单,只需要在 UNION 后面添加 ALL 关键字就可以了。

例如,想要知道 product 和 product2 中所包含的商品种类及每种商品的数量,第一步,就需要将两个表的商品种类字段选出来,然后使用 UNION ALL 进行不去重地合并。接下来再对两个表的结果按 product_type 字段分组计数。

代码如下:

-- 保留重复行
SELECT product_id, product_nameFROM productUNION ALL
SELECT product_id, product_nameFROM product2;

查询结果如下:

练习:
商店决定对product表中利润低于50%和售价低于1000的商品提价, 请使用UNION ALL 语句将分别满足上述两个条件的结果取并集. 查询结果类似下表:

代码如下:

SELECT *FROM productWHERE sale_price < 100UNION ALL
SELECT *FROM productWHERE sale_price > 1.5 * purchase_price

1.2.4 【扩展阅读】bag 模式与set 模式

在高中数学课上我们就学过, 集合的一个显著的特征就是集合中的元素都是互异的. 当我们把数据库中的表看作是集合的时候, 实际上存在一些问题的: 不论是有意的设计或无意的过失, 很多数据库中的表包含了重复的行.

Bag 是和 set 类似的一种数学结构, 不一样的地方在于: bag 里面允许存在重复元素, 如果同一个元素被加入多次, 则袋子里就有多个该元素.

通过上述 bag 与 set 定义之间的差别我们就发现, 使用 bag 模型来描述数据库中的表在很多时候更加合适.

是否允许元素重复导致了 set 和 bag 的并交差等运算都存在一些区别. 以 bag 的交为例, 由于 bag 允许元素重复出现, 对于两个 bag, 他们的并运算会按照:

  1. 该元素是否至少在一个 bag 里出现过;
  2. 该元素在两个 bag 中的最大出现次数 这两个方面来进行计算. 因此对于 A = {1,1,1,2,3,5,7}, B = {1,1,2,2,4,6,8} 两个 bag, 它们的并就等于 {1,1,1,2,2,3,4,5,6,7,8}.

1.2.5 隐式类型转换

通常来说,我们会把类型完全一致,并且代表相同属性的列使用 UNION 合并在一起显示,但有时候,即使数据类型不完全相同,也会通过隐式类型转换将两个类型不同的列放在一起里显示,例如字符串和数值类型:

SELECT product_id, product_name, '1'FROM productUNION
SELECT product_id, product_name, sale_priceFROM product2;

执行上述查询能够正确执行,得到如下结果:

练习:
使用 SYSDATE()函数可以返回当前日期时间,是一个日期时间类型的数据,试测试该数据类型和数值,字符串等类型的兼容性。

例如,以下代码可以正确执行,说没时间日期类型和字符串,数值以及缺失值均能兼容。

SELECT SYSDATE(), SYSDATE(), SYSDATE()UNION
SELECT 'chars', 123, null

上诉代码的查询结果:

1.3 MYSQL 8.0 不支持交运算INTERSECT

集合的交, 就是两个集合的公共部分, 由于集合元素的互异性, 集合的交只需通过文氏图就可以很直观地看到它的意义.

虽然集合的交运算在SQL标准中已经出现多年了, 然而很遗憾的是, 截止到 MySQL 8.0 版本, MySQL 仍然不支持 INTERSECT 操作.

1.3.1 【扩展阅读】bag 的交运算

对于两个 bag, 他们的交运算会按照:

  1. 该元素是否同时属于两个 bag;
  2. 该元素在两个 bag 中的最小出现次数

这两个方面来进行计算. 因此对于 A = {1,1,1,2,3,5,7}, B = {1,1,2,2,4,6,8} 两个 bag, 它们的交运算结果就等于 {1,1,2}.

1.4 差集,补集与表的减法

求集合差集的减法运算和实数的减法运算有些不同, 当使用一个集合A减去另一个集合B的时候,对于只存在于集合B而不存在于集合A的元素, 采取直接忽略的策略,因此集合A和B做减法只是将集合A中也同时属于集合B的元素减掉.

1.4.1 MySQL 8.0 还不支持 EXCEPT 运算

MySQL 8.0 还不支持 表的减法运算符 EXCEPT。不过,可以借助学过的NOT IN 谓词实现表的减法。

练习:
找出只存在于product 表但不存在与product2 表的商品。

-- 使用 IN 子句的实现方法
SELECT *FROM product WHERE product_id NOT IN (SELECT product_idFROM product2)

运行结果如图:

1.4.2 EXCEPT 与 NOT 谓词

通过上述练习的MySQL解法,使用 NOT IN 谓词,基本上可以实现和SQL 标志语法中的EXCEPT 运算相同的效果。

练习:
使用 NOT 谓词进行集合的减法运算,求出product表中,售价高于2000,但利润低于30%的商品,结果应该如下表所示。

代码如下:

SELECT * FROM productWHERE sale_price > 2000 AND product_id NOT IN (SELECT product_id FROM product
WHERE sale_price<1.3*purchase_price)

运行结果如图:

1.4.3 EXCEPT ALL 与bag 的差

类似于UNION ALL,EXCEPT ALL 也是按出现次数进行减法,也是使用bag模型进行运算。

对于两个 bag, 他们的差运算会按照:

  1. 该元素是否属于作为被减数的 bag;
  2. 该元素在两个 bag 中的出现次数

这两个方面来进行计算. 只有属于被减数的bag的元素才参与EXCEP ALL运算, 并且差bag中的次数,等于该元素在两个bag的出现次数之差(差为零或负数则不出现). 因此对于 A = {1,1,1,2,3,5,7}, B = {1,1,2,2,4,6,8} 两个 bag, 它们的差就等于 {1,3,5,7}。

1.4.4 INTESECT 与 AND 谓词

对于同一个表的两个查询结果而言,他们的交 INTERSECT 实际上可以等价地将两个查询的检索条件用 AND 谓词连接来实现。

练习:
使用AND谓词查找product 表中利润率高于 50%,并且售价低于1500的商品,查询结果如下所示。

代码如下:

SELECT *FROM product
WHERE sale_price > 1.5 * purchase_priceAND sale_price < 1500

1.5 对称差

两个集合A,B的对称差是指那些仅属于A或仅属于B的元素构成的集合. 对称差也是个非常基础的运算, 例如, 两个集合的交就可以看作是两个集合的并去掉两个集合的对称差.上述方法在其他数据库里也可以用来简单地实现表或查询结果的对称差运算: 首先使用UNION求两个表的并集, 然后使用INTERSECT求两个表的交集, 然后用并集减去交集, 就得到了对称差.

但由于在MySQL 8.0 里, 由于两个表交查询结果的并不能直接求出来, 因此并不适合使用上述思路来求对称差. 好在还有差集运算可以使用. 从直观上就能看出来, 两个集合的对称差等于 A-B并上B-A, 因此实践中可以用这个思路来求对称差.

练习:
使用product 表和product2 表的对称差来查询哪些2商品只在其中一张表,结果类似于:

代码如下:

-- 使用 NOT IN 实现两个表的差集
SELECT *FROM productWHERE product_id NOT IN (SELECT product_id FROM product2)
UNION
SELECT *FROM product2WHERE product_id NOT IN (SELECT product_id FROM product)

运行结果如下图:

1.5.1 借助并集和差集迂回实现交集运算 INTERSECT

通过观察集合运算的文氏图, 我们发现, 两个集合的交可以看作是两个集合的并去掉两个集合的对称差.

2. 连结(JOIN)

前一节我们学习了 UNION和INTERSECT 等集合运算, 这些集合运算的特征就是以行方向为单位进行操作. 通俗地说, 就是进行这些集合运算时, 会导致记录行数的增减. 使用 UNION 会增加记录行数,而使用 INTERSECT 或者 EXCEPT 会减少记录行数.

但这些运算不能改变列的变化, 虽然使用函数或者 CASE表达式等列运算, 可以增加列的数量, 但仍然只能从一张表中提供的基础信息列中获得一些"引申列", 本质上并不能提供更多的信息. 如果想要从多个表获取信息, 例如, 如果我们想要找出某个商店里的衣服类商品的名称,数量及价格等信息, 则必须分别从 shopproduct 表和 product 表获取信息.

注意:
连结(JOIN)就是使用某种关联条件(一般是使用相等判断谓词"="), 将其他表中的列添加过来, 进行“添加列”的集合运算. 可以说,连结是 SQL 查询的核心操作, 掌握了连结, 能够从两张甚至多张表中获取列, 能够将过去使用关联子查询等过于复杂的查询简化为更加易读的形式, 以及进行一些更加复杂的查询.

2.1.内连结(INNER JOIN)

内连结的语法格式是:

-- 内连结
FROM <tb_1> INNER JOIN <tb_2> ON <condition(s)>

其中 INNER 关键字表示使用了内连结,至于内连结的涵义,目前暂时可以不必细究。

2.1.1 使用内连结从两个表获取信息

先来分别观察所涉及的表, product 表保存了商品编号,商品名称,商品种类等信息,这个表可以提供关于衣服种类的衣服的详细信息, 但是不能提供商店信息。


接下来观察shopproduct 表, 这个表里有商店编号名称,商店的商品编号及数量. 但要想获取商品的种类及名称售价等信息,则必须借助于product 表。


所以问题的关键是, 找出一个类似于"轴"或者"桥梁"的公共列, 将两张表用这个列连结起来. 这就是连结运算所要作的事情。

我们来对比一下上述两张表, 可以发现, 商品编号列是一个公共列, 因此很自然的事情就是用这个商品编号列来作为连接的“桥梁”,将product 和shop_product 这两张表连接起来。

将上诉问题进行分解:
首先, 找出每个商店的商店编号, 商店名称, 商品编号, 商品名称, 商品类别, 商品售价,商品数量信息.

按照内连结的语法, 在 FROM 子句中使用 INNER JOIN 将两张表连接起来, 并为 ON 子句指定连结条件为 shop_product.product_id=product.product_id, 就得到了如下的查询语句:

代码如下:

select SP.shop_id,SP.shop_name,SP.product_id,P.product_name,P.product_type,P.sale_price,SP.quantityFROM shop_product AS SPINNER JOIN PRODUCT AS PON SP.product_id = P.product_id;

在上述查询中, 我们分别为两张表指定了简单的别名, 这种操作在使用连结时是非常常见的, 通过别名会让我们在编写查询时少打很多字, 并且更重要的是, 会让查询语句看起来更加简洁.

上述查询将会得到如下的结果:

关于内连结:需要注意下三点

  1. 进行连结时需要在 FROM 子句中使用多张表.
  2. 必须使用 ON 子句来指定连结条件.
  3. SELECT 子句中的列最好按照 表名.列名 的格式来使用.

2.1.2 结合 WHERE 子句使用内连结

如果需要在使用内连结的时候同时使用 WHERE 子句对检索结果进行筛选, 则需要把 WHERE 子句写在 ON 子句的后边.

例如, 对于上述查询问题, 我们可以在前一步查询的基础上, 增加 WHERE 条件.

增加 WHERE 子句的方式有好几种,我们先从最简单的说起.

第一种增加 WEHRE 子句的方式, 就是把上述查询作为子查询, 用括号封装起来, 然后在外层查询增加筛选条件.

SELECT *FROM (-- 第一步查询的结果SELECT SP.shop_id,SP.shop_name,SP.product_name,P.product_name,P.product_type,P.sale_price,SP.quantityFROM shopproduct AS SPINNER JOIN product AS PON SP.product_id = P.product_id) AS STEP1
WHERE shop_name = '东京'AND product_type = '衣服';

执行语句后结果如下图:

子查询的结果其实也是一张表,只不过是一张虚拟的表, 它并不真实存在于数据库中, 只是数据库中其他表经过筛选,聚合等查询操作后得到的一个"视图".
这种写法能很清晰地分辨出每一个操作步骤, 在我们还不十分熟悉 SQL 查询每一个子句的执行顺序的时候可以帮到我们.

但实际上, 如果我们熟知 WHERE 子句将在 FROM 子句之后执行, 也就是说, 在做完 INNER JOIN … ON 得到一个新表后, 才会执行 WHERE 子句, 那么就得到标准的写法:

SELECT SP.shop_id,SP.shop_name,SP.product_id,P.product_name,P.product_type,P.sale_price,SP.quantityFROM shopproduct AS SPINNER JOIN product AS PON SP.product_id = P.product_idWHERE SP.shop_name = '东京'AND P。product_type = '衣服';

首先给出上述查询的执行顺序:
FROM子句->WHERE 子句->SELECT 子句

也就是说,两张表是按照连结列进行了连结,得到了一张新表,然后 WHERE 子句对这张新表的行按照两个条件进行了筛选,最后,SELECT 子句选出了那些我们需要的列。

此外,一种不很常见的做法是,还可以将WHERE 子句中的条件直接添加在 ON 子句中,这时候 ON 子句后最好用括号将连结条件和筛选条件括起来。

SELECT SP.shop_id,SP.shop_name,SP.product_id,P.product_name,P.product_type,P.sale_price,SP.quantityFROM shop_product AS SPINNER JOIN product AS PON (SP.product_id = P.product_idAND SP.shop_name = '东京'AND P.product_type = '衣服');

但上述这种把筛选条件和连结条件都放在 ON 子句的写法, 不是太容易阅读, 不建议大家使用.
另外, 先连结再筛选的标准写法的执行顺序是, 两张完整的表做了连结之后再做筛选,如果要连结多张表, 或者需要做的筛选比较复杂时, 在写 SQL 查询时会感觉比较吃力. 在结合 WHERE 子句使用内连结的时候, 我们也可以更改任务顺序, 并采用任务分解的方法,先分别在两个表使用 WHERE 进行筛选,然后把上述两个子查询连结起来.

SELECT SP.shop_id,SP.shop_name,SP.product_id,P.product_name,P.product_type,P.sale_price,SP.quantityFROM (-- 子查询 1:从 shopproduct 表筛选出东京商店的信息SELECT *FROM shopproductWHERE shop_name = '东京' ) AS SPINNER JOIN -- 子查询 2:从 product 表筛选出衣服类商品的信息(SELECT *FROM productWHERE product_type = '衣服') AS PON SP.product_id = P.product_id;

先分别在两张表里做筛选, 把复杂的筛选条件按表分拆, 然后把筛选结果(作为表)连接起来, 避免了写复杂的筛选条件, 因此这种看似复杂的写法, 实际上整体的逻辑反而非常清晰. 在写查询的过程中, 首先要按照最便于自己理解的方式来写, 先把问题解决了, 再思考优化的问题.

练习:
找出每个商店里的衣服类商品的名称及价格等信息. 希望得到如下结果:

写法一:

SELECT  SP.shop_id,SP.shop_name,SP.product_id ,P.product_name, P.product_type, P.purchase_priceFROM shopproduct  AS SP INNER JOIN product AS P ON SP.product_id = P.product_idWHERE P.product_type = '衣服';

写法二:

SELECT  SP.shop_id, SP.shop_name, SP.product_id,P.product_name, P.product_type, P.purchase_priceFROM shopproduct AS SP
INNER JOIN --从 product 表找出衣服类商品的信息(SELECT product_id, product_name, product_type, purchase_priceFROM product    WHERE product_type = '衣服')AS P ON SP.product_id = P.product_id;

练习:
分别使用连结两个子查询和不使用子查询的方式, 找出东京商店里, 售价低于 2000 的商品信息,希望得到如下结果.

SELECT SP.*, P.*FROM shopproduct AS SP INNER JOIN product AS P ON SP.product_id = P.product_idWHERE shop_id = '000A'AND sale_price < 2000;

运行结果如图:

2.1.3 结合 GROUP BY 子句使用内连结

结合 GROUP BY 子句使用内连结, 需要根据分组列位于哪个表区别对待.

最简单的情形, 是在内连结之前就使用 GROUP BY 子句.

但是如果分组列和被聚合的列不在同一张表, 且二者都未被用于连结两张表, 则只能先连结, 再聚合.

练习:
Q:每个商店中, 售价最高的商品的售价分别是多少?
代码如下:

SELECT SP.shop_id,SP.shop_name,MAX(P.sale_price) AS max_priceFROM shop_product AS SPINNER JOIN product AS PON SP.product_id = P.product_idGROUP BY SP.shop_id,SP.shop_name

运行结果如图:

2.1.4 自连结(SELF JOIN)

之前的内连结, 连结的都是不一样的两个表. 但实际上一张表也可以与自身作连结, 这种连接称之为自连结. 需要注意, 自连结并不是区分于内连结和外连结的第三种连结, 自连结可以是外连结也可以是内连结, 它是不同于内连结外连结的另一个连结的分类方法.

2.1.5 内连结与关联子查询

Q:回忆一下关联子查询中的问题:找出每个商品种类当中售价高于该类商品的平均售价的商品。当时我们是使用关联子查询来实现的。
代码如下(示例):

SELECT product_type, product_name, sale_priceFROM product AS P1WHERE sale_price > (SELECT AVG(sale_price)FROM product AS P2WHERE P1.product_type = P2.product_typeGROUP BY product_type);

使用内连结同样可以解决这个问题:
首先, 使用 GROUP BY 按商品类别分类计算每类商品的平均价格.

SELECT  product_type,AVG(sale_price) AS avg_price FROM product GROUP BY product_type;

接下来, 将上述查询与表 product 按照 product_type (商品种类)进行内连结.

SELECT  P1.product_id,P1.product_name,P1.product_type,P1.sale_price,P2.avg_priceFROM product AS P1 INNER JOIN (SELECT product_type,AVG(sale_price) AS avg_price FROM product GROUP BY product_type) AS P2 ON P1.product_type = P2.product_type;

最后, 增加 WHERE 子句, 找出那些售价高于该类商品平均价格的商品.完整的代码如下:

SELECT  P1.product_id,P1.product_name,P1.product_type,P1.sale_price,P2.avg_priceFROM product AS P1INNER JOIN (SELECT product_type,AVG(sale_price) AS avg_price FROM product GROUP BY product_type) AS P2 ON P1.product_type = P2.product_typeWHERE P1.sale_price > P2.avg_price;

仅仅从代码量上来看, 上述方法似乎比关联子查询更加复杂, 但这并不意味着这些代码更难理解. 通过上述分析, 很容易发现上述代码的逻辑实际上更符合我们的思路, 因此尽管看起来复杂, 但思路实际上更加清晰.
作为对比, 试分析如下代码:

SELECT  P1.product_id,P1.product_name,P1.product_type,P1.sale_price,AVG(P2.sale_price) AS avg_priceFROM product AS P1INNER JOIN product AS P2ON P1.product_type=P2.product_typeWHERE P1.sale_price > P2.sale_priceGROUP BY P1.product_id,P1.product_name,P1.product_type,P1.sale_price,P2.product_type

虽然去掉了子查询,查询语句的层次更少, 而且代码行数似乎更少, 但实际上这个方法可能更加难以写出来. 在实践中, 一定要按照易于让自己理解的思路去分层次写代码, 而不要花费很长世间写出一个效率可能更高但自己和他人理解起来难度更高的代码.

2.1.6 自然连结(NATURAL JOIN)

自然连结并不是区别于内连结和外连结的第三种连结, 它其实是内连结的一种特例–当两个表进行自然连结时, 会按照两个表中都包含的列名来进行等值内连结, 此时无需使用 ON 来指定连接条件.

SELECT *  FROM shopproduct NATURAL JOIN product

上述查询得到的结果, 会把两个表的公共列(这里是 product_id, 可以有多个公共列)放在第一列, 然后按照两个表的顺序和表中列的顺序, 将两个表中的其他列都罗列出来。


练习:
试写出与上述自然连结等价的内连结.
代码如下:

SELECT  SP.product_id,SP.shop_id,SP.shop_name,SP.quantity,P.product_name,P.product_type,P.sale_price,P.purchase_price,P.regist_date  FROM shop_product AS SP INNER JOIN product AS P ON SP.product_id = P.product_id

使用自然连结还可以求出两张表或子查询的公共部分, 求表 product 和表 product2 中的公共部分, 也可以用自然连结来实现:
代码如下:

SELECT * FROM product NATURAL JOIN product2

运行结果如图:

这个结果和书上给的结果并不一致, 少了运动 T 恤, 这是由于运动 T 恤的 regist_date 字段为空, 在进行自然连结时, 来自于 product 和 product2 的运动 T 恤这一行数据在进行比较时, 实际上是在逐字段进行等值连结, 回忆我们在 6.2ISNULL,IS NOT NULL 这一节学到的缺失值的比较方法就可得知, 两个缺失值用等号进行比较, 结果不为真. 而连结只会返回对连结条件返回为真的那些行.

如果我们将查询语句进行修改:

SELECT * FROM (SELECT product_id, product_nameFROM product ) AS A
NATURAL JOIN (SELECT product_id, product_name FROM product2) AS B;

运行结果如图:


就可以得到正确结果了。

2.1.7 使用连结求交集

练习:
使用内连结求 product 表和 product2 表的交集.
代码如下:

SELECT P1.*FROM product AS P1INNER JOIN product2 AS P2ON (P1.product_id  = P2.product_idAND P1.product_name = P2.product_nameAND P1.product_type = P2.product_typeAND P1.sale_price   = P2.sale_priceAND P1.regist_date  = P2.regist_date)

运行结果如下图:

如果我们仅仅用 product_id 来进行连结:

SELECT P1.*FROM product AS P1INNER JOIN product2 AS P2ON P1.product_id = P2.product_id

运行结果如下图:

这次就不一致了。


总结

总的来说:
内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行。
例如,检索 students和courses表中学生标识号相同的所有行。

SQL学习笔记——task4:集合运算与内连结相关推荐

  1. mysql 交并差_mysql学习笔记:集合运算并交差,其他

    总结一下今天数据库课堂上的所学2333 1. 在SQL语言实践中,集合运算的实现方法,推荐顺序如下: 并运算:union 交运算:in, exists, intersect(很多DBMS基本上不支持i ...

  2. 本笔记为阿里云天池龙珠计划SQL训练营的学习内容,链接为:https://tianchi.aliyun.com/specials/promotion/aicampsql;Task4:集合运算-JOIN

    一. 连结(JOIN) 前一节我们学习了 UNION和INTERSECT 等集合运算, 这些集合运算的特征就是以行方向为单位进行操作. 通俗地说, 就是进行这些集合运算时, 会导致记录行数的增减. 使 ...

  3. SQL学习笔记_Aliyun4

    SQL学习笔记_Aliyun4 本笔记为阿里云天池龙珠计划SQL训练营的学习内容,链接为:https://tianchi.aliyun.com/specials/promotion/aicampsql ...

  4. 探针一号的SQL学习笔记

    SQL学习笔记 文章目录 SQL学习笔记 1.问题 2.SQL基本语句 3.SQL基本数据查询 4.SQL复杂点的数据查询 5.DML操作 6.数据表操作 1.问题 什么是数据库? 是一个仓库,可以按 ...

  5. 判断题:oracle自带的sql语言环境是pl/sql,Oracle之PL/SQL学习笔记之数据类型(三)

    Oracle之PL/SQL学习笔记之数据类型(三) 所有的编程语言中变量是使用最频繁的.PL/SQL作为一个面向过程的数据库编程语言同样少不了变量,利用变量可以把PL/SQL块需要的参数传递进来,做到 ...

  6. Python学习笔记:集合(set)

    Python学习笔记:集合(set) 1.集合概念 集合是互异元素的无序集合.类似于只有键没有值的字典. 2.创建集合 有两种方法创建集合:一个是利用set函数,一个是利用花括号创建集合字面量. 3. ...

  7. Oracle之PL/SQL学习笔记之有名块练习

    2019独角兽企业重金招聘Python工程师标准>>> Oracle之PL/SQL学习笔记之有名块练习 存储过程案例: 案例1: 根据雇员姓名跟新雇员工资,如果雇员不存在输出没有该雇 ...

  8. SQL学习笔记 | 02 SQL语句结构

    SQL学习笔记 | 02 SQL语句结构 一.表的导入 1.表的命名 2.导入步骤 3.导入需注意 二.标准SQL语法 1.语句结构 2.数据表的其他关键词 3.SQL语句的分类 一.表的导入 1.表 ...

  9. NetLogo学习笔记3 —— 集合操作与生命游戏

    NetLogo学习笔记3 -- 集合操作与生命游戏 (这篇新知识点略多) 上一篇文章我们了解NetLogo模型的基本要素,学习了函数定义与ask语法.并编写了我们的第一个程序! 这一次,我们来编写一个 ...

最新文章

  1. Cocos2d-x Eclipse下程序运行产生错误Effect initCheck() returned -1
  2. 论文速递:智能作为信息处理系统
  3. 一文解开java中字符串编码的小秘密
  4. [No000014]听说不背单词,考英语会是这种下场-我们为什么必须背单词?
  5. python input 与raw_input函数的区别
  6. 如何用Baas快速在腾讯云上开发小程序-系列3 :实现腾讯云COS API调用
  7. Php怎么挑出不含4的数,关于 64 位 PHP 使用 PHP_INT_SIZE 输出得到 4 的问题
  8. 缺少.lib文件导致的Link2019 解决方案汇总
  9. python能做什么excel-使用 Python 可以做什么?
  10. 漫谈程序员系列:程序员到底是什么角色
  11. python爬虫文献_Python文献爬虫①
  12. 编写c语言程序实现如下功能 创建父子进程,青岛理工大学操作系统实验指导及实验报告.doc...
  13. 计算机桌面任务栏怎样显示输入法,电脑的任务栏上找不到输入法图标怎么办
  14. 什么是4G工业智能网关?与DTU有什么区别
  15. 解这道考研题要用克莱默法则的公式吗?
  16. python数据分析
  17. django - celery
  18. 云原生架构总览,发展定义架构及趋势
  19. 安装的python没有菜单栏_新手求助 为什么mac安装python后打开idle没有工具栏?
  20. 真的0数学基础0Shader基础,如何通过<Shader入门精要>入门?一些阅读建议。

热门文章

  1. 人体神经系统分布图图片,神经系统分布图片高清
  2. JAVA计算机毕业设计智能停车场管理系统Mybatis+源码+数据库+lw文档+系统+调试部署
  3. 用python实现bt下载_Python边学边用--BT客户端实现之(一)BitTorrent文件解析
  4. svn服务器现存的库文件导入,svn导入版本库及相关知识
  5. 二建《机电》案例 100 问
  6. 道周中学2012年高三地理寒假作业答案
  7. 微习惯--简单到四个
  8. html 用户列表,用户列表.html
  9. 在cmd中使用start运行exe文件闪退问题
  10. 稳压二极管、肖特基二极管、静电保护二极管、TVS管