「这是我参与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