MySQL的基础操作
SELECT
商品种类,
AVG(金额) AS 总金额
FROM
订单表
GROUP BY
商品种类
HAVING
总金额 > 2000
ORDER BY
总金额 DESC;
针对以上查询结果还可以通过“LIMIT m,n”子句限制输出的条数,m代表偏移量,n代表输出的条数。例如针对以上结果跳过前2条输出后续的3条数据,SQL如下:
SELECT
商品种类,
AVG(金额) AS 总金额
FROM
订单表
GROUP BY
商品种类
HAVING
总金额 > 2000
ORDER BY
总金额 DESC
LIMIT 2,3;
LIMIT 语句后面也可以只跟一个数字,代表查询开始多少行数据,例如:
SELECT
商品种类,
AVG(金额) AS 总金额
FROM
订单表
GROUP BY
商品种类
HAVING
总金额 > 2000
ORDER BY
总金额 DESC
LIMIT 2;
CASE WHEN多分支语句
CASE
WHEN 条件1 THEN 结果1
WHEN 条件2 THEN 结果2
WHEN 条件3 THEN 结果3
ELSE 结果4
END AS 别名
SELECT
订单号,日期,客户名称,商品种类,金额,
CASEWHEN 金额 <= 500 THEN '小订单'
WHEN 金额 <= 1500 THEN '中订单'
ELSE '大订单'
END AS '订单类型'
FROM 订单表;
MySQL中编写SQL语句是有一定顺序的,书写顺序如下:
SELECT 列名
FROM 表名
WHERE 条件
GROUP BY 分组
HAVING 过滤条件
ORDER BY 排序列(ASC|DESC)
LIMIT 起始行,查询行数
而真正的SQL底层执行顺序如下:
a.FROM:指定数据来源表
b.WHERE:对查询数据第一次过滤
c.GROUP BY: 分组
d.HAVING: 对分组后的数据第二次过滤
e.SELECT: 查询各个字段的值
f.ORDER BY: 排序
g.LIMIT: 限定查询结果
JOIN关联:
在MySQL中JOIN分为INNER JOIN 、LEFT JOIN 、RIGHT JOIN 、FULL OUT JOIN
INNER JOIN:
INNER JOIN 也叫内连接,可以简写为JOIN,MySQL中可以通过JOIN 取两张表的交集,使用JOIN的时候需要通过ON指定两张表的关联字段,一般是两张表中数据相同的字段。JOIN使用方式如下:
SELECT tbl1.col1,tbl1.col2....,tbl2.col1,tbl2.col2....
FROM tbl1
JOIN tbl2 ON tbl1.id = tbl2.id
注意:在一条SQL中可以编写多个JOIN关联更多的表,但每个JOIN一定要指定对应的ON关联字段,否则会出现笛卡尔积,即:tbl1表中的每条数据都会与tbl2中的每条数据进行关联,会导致大量的数据结果
# 关联 用户表 和 分数表,获取用户的年龄和分数信息
SELECT用户表.编号,用户表.姓名,用户表.年龄,分数表.编号,分数表.姓名,分数表.分数
FROM 用户表
INNER JOIN 分数表 ON 用户表.编号 =分数表.编号;
LEFT JOIN:
LEFT JOIN 是左连接,两张表通过LEFT JOIN 进行关联时,LEFT JOIN 左侧表中数据都会被查询出来,如果在右侧表没有查询到关联的数据会自动使用NULL值填补。LEFT JOIN SQL用法如下:
SELECT用户表.编号,用户表.姓名,用户表.年龄,分数表.编号,分数表.姓名,分数表.分数
FROM 用户表
LEFT JOIN 分数表 ON 用户表.编号 =分数表.编号;
RIGHT JOIN:
RIGHT JOIN 是右关联,同理,两张表通过RIGHT JOIN 进行关联时,RIGHT JOIN 右侧表中数据都会被查询出来,如果在左侧表没有查询到关联的数据会自动使用NULL值填补。RIGHT JOIN SQL用法如下:
SELECT用户表.编号,用户表.姓名,用户表.年龄,分数表.编号,分数表.姓名,分数表.分数
FROM 用户表
RIGHT JOIN 分数表 ON 用户表.编号 =分数表.编号;
UNION关联:
SELECT用户表.编号,用户表.姓名,用户表.年龄,分数表.编号,分数表.姓名,分数表.分数
FROM 用户表
LEFT JOIN 分数表 ON 用户表.编号 = 分数表.编号
UNION
SELECT用户表.编号,用户表.姓名,用户表.年龄,分数表.编号,分数表.姓名,分数表.分数
FROM 用户表
RIGHT JOIN 分数表 ON 用户表.编号 = 分数表.编号;
UNION关联:
SELECT用户表.编号,用户表.姓名,用户表.年龄,分数表.编号,分数表.姓名,分数表.分数
FROM 用户表
LEFT JOIN 分数表 ON 用户表.编号 = 分数表.编号
UNION ALL
SELECT用户表.编号,用户表.姓名,用户表.年龄,分数表.编号,分数表.姓名,分数表.分数
FROM 用户表
RIGHT JOIN 分数表 ON 用户表.编号 = 分数表.编号;
窗口函数
<窗口操作函数> OVER (PARTITION BY <分组的列> ORDER BY <排序的列> ) AS 别名
SELECT DISTINCT公司,部门,SUM(费用) OVER ( PARTITION BY 公司 ) AS 公司总支出,MAX(费用) OVER ( PARTITION BY 部门 ) AS 部门最大支出,MIN(费用) OVER ( PARTITION BY 部门 ) AS 部门最小支出
FROM企业支出费用表;