sql运算符与集合运算小结

104 阅读2分钟

「这是我参与2022首次更文挑战的第3天,活动详情查看:2022首次更文挑战

运算符

算数:+, -, *, /(取小数)

比较:=, <>, >=, <=, >, <

逻辑:not 否定, WHERE NOT sale_price >= 1000; and, or

and优先于or,可以用括号提高优先级。

由于存在null(不确定值),因此真值表为三值逻辑

注意:

4种结果为null的情况:

ture and null = null

false or null = null

null and null = null

null or null = null

2种与null操作有结果的情况:

ture or null = true/1

false and null = false/0

与null的比较:结果都为null

集合运算

并集:union,行合并,可以用or替代

合并会去重,如果要保留重复行,用union all 替代union

SELECT  product_id,product_name,product_type
       ,sale_price,purchase_price
  FROM PRODUCT 
 WHERE sale_price<800
  
 UNION
 
SELECT  product_id,product_name,product_type
       ,sale_price,purchase_price
  FROM PRODUCT 
 WHERE sale_price>1.5*purchase_price;

差集/交集:not in

对称差:并集-交集:

-- 使用 NOT IN 实现两个表的差集
SELECT * 
  FROM Product
 WHERE product_id NOT IN (SELECT product_id FROM Product2)
UNION
SELECT * 
  FROM Product2
 WHERE product_id NOT IN (SELECT product_id FROM Product)

连结:增加列,xx join

  • 多表信息获取,将结果显示在一个表
  • 连结一般会对两个表取别名,在on里用别名.列名的形式引用,同时在select里也可以用到别名。
  • 连结后的内容,根据select的顺序。
  • on是连结的条件。
  • 后面还可以增加where子句,进一步对连结后结果进行筛选。
  • 关于on和where,可以分开,也可以现在各自的子句里where筛选后再连结。
  • 亦可增加group by分组,在on之后。
  • 子连结可用子查询实现。
  • inner join换成natural join,则会根据两个表都包含的列名进行连结。
  • 可使用连结实现交集:在on里限定条件
  • 内连结:保留共同的,左/右连结:调换表顺序,实际一致。一定会输出主表全部。全外连结,输出两表所有。不能被关联的用null补足。
-- 内连结
FROM <tb_1> INNER JOIN <tb_2> ON <condition(s)>
-- 左连结     
FROM <tb_1> LEFT  OUTER JOIN <tb_2> ON <condition(s)>
-- 右连结     
FROM <tb_1> RIGHT OUTER JOIN <tb_2> ON <condition(s)>
-- 全外连结
FROM <tb_1> FULL  OUTER JOIN <tb_2> ON <condition(s)>

SELECT SP.shop_id
       ,SP.shop_name
       ,SP.product_id
       ,P.product_name
       ,P.product_type
       ,P.sale_price
       ,SP.quantity
  FROM ShopProduct AS SP
 INNER JOIN Product AS P
    ON SP.product_id = P.product_id;
    
 SELECT SP.shop_id
      ,SP.shop_name
      ,MAX(P.sale_price) AS max_price
  FROMshopproduct AS SP
 INNER JOINproduct AS P
    ON SP.product_id = P.product_id
 GROUP BY SP.shop_id,SP.shop_name