所使用的数据源

image.png

各个类别的数据类型:
image.png

基础操作语句

SELECT FROM

语法:
SELECT 表中数据 FROM 数据表;
例子:

  1. SELECT prod_name FROM milk_tea;

结果:
image.png

AS

取别名(基本上可以省略,但是为了可读性尽量不要省)

语法:
数据表名或列名 AS 别名
例子:

  1. SELECT m.* FROM milk_tea AS m; --m.*表示显示表中全部数据

结果:
image.png

结果展示语句

CONCAT(拼接)

拼接不同列的内容
语法:
CONCAT(列名,列名,’a’)
例子:

  1. SELECT m.*,CONCAT(prod_id, prod_name, '(', net_w, ')') AS 产品信息 FROM milk_tea AS m;

结果:
image.png

CONCAT_WS

使用关键字插在每个列之间,会自动跳过null

语法:
CONCAT_WS(‘关键字’,列名,字符)
例子:

  1. SELECT CONCAT_WS('+',m.prod_id,m.pro_date,'kk') AS dj FROM milk_tea AS m;

结果:
image.png
**

DISTINCT(去重)

不展示重复的值,不修改数据,只展示

语法:
DISTINCT 列名
例子:

  1. SELECT DISTINCT m.valid_month FROM milk_tea AS m;

结果:
image.png

排序语句

ORDER BY

注意不同的字符类型排序规则不同,是SELECT FROM语句的最后一部分
如汉字要按首字母顺序排序,则需要转换成gbk编码

语法:
ORDER BY 列名 DESC 列名 DESC(不加DESC代表升序,优先按第一个字段排序)
ORDER BY 位置(从SELECT中的第几列) DESC 位置 DESC (不大推荐,若表结构发生变化还得更改)
例子1:

  1. SELECT m.* FROM milk_tea AS m ORDER BY CONVERT(prod_name USING gbk) ;

结果1:
image.png

例子2:**

  1. SELECT m.prod_id, m.prod_name FROM milk_tea AS m ORDER BY m.valid_month DESC, m.sale_price;
  2. --排序可不展示

结果2:
image.png

例子3:

  1. SELECT m.* FROM milk_tea AS m ORDER BY 5 DESC, 7;
  2. --5,7分别表示第五列和第七列,若SELECT只选择两列,则只有1,2可用

结果3:
image.png

数据过滤语句

WHERE

用来按某些条件来过滤数据,对null值的列直接忽略(使用IFNUL,见例子3)

语法:
WHERE 条件(主要是运算符和表达式,跟在SELECT FROM之后。sql中不等号是”<>”)
WHERE (条件1 AND 条件2) OR 条件3 (使用且或来限制条件,优先级:AND>OR)
例子1:

  1. SELECT m.* FROM milk_tea AS m WHERE m.prod_id = '2';

结果1:
image.png

例子2:**

  1. SELECT m.* FROM milk_tea AS m WHERE (m.sale_price - m.in_price) * 0.9 < 5;

结果2:
image.png

例子3:**

  1. SELECT m.* FROM milk_tea AS m WHERE IFNULL(sale_price,0) <> 15;
  2. --IFNULL(sale_price,0)表示如果sale_priceNULL则将其赋值为0

结果3:
image.png

WHERE扩展

数值过滤:BETWEEN..AND..

语法:
WHERE 列 BETWEEN [前端值] AND [后端值](两端均包含)
例子:

  1. SELECT m.* FROM milk_tea AS m WHERE sale_price BETWEEN 5 and 15;

结果:
image.png

空值过滤:IS NULL、IS NOT NULL

语法:
WHERE 列 IS NULL
WHERE 列 IS NOT NULL
例子:

  1. SELECT m.* FROM milk_tea AS m WHERE sale_price IS NULL;

结果:
image.png

模糊查询:LIKE

模糊查询适用于不知道具体字符的情况,有两种通配符可选择。

  • 下划线’_’:代表单个任意字符,适用于知道字符数目和位置的情况。见例子1
  • 百分号’%’:代表任意数目(包括0个),任何字符,适用于不知道字符数目,但知道字符位置的情况。见例子2

如果查询结果中包含%,可以适用反斜杠\%来表示。

若将通配符放在语句句首,因无法缩小查询范围,所以查询效率较差

语法:
WHERE 列 LIKE ‘…_…’
WHERE 列 LIKE ‘…%…’
例子1:

  1. SELECT * FROM milk_tea WHERE prod_name LIKE '__面';

结果1:
image.png

例子2:**

  1. SELECT * FROM milk_tea WHERE prod_name LIKE '%糖';

结果2:
image.png
**

取值限制:IN

过滤明确而不连续的取值

语法:
WHERE 列 IN (值1,值2,….)
例子:

  1. SELECT * FROM milk_tea WHERE prod_name IN ('奶茶','饼干','薯片');

结果:
image.png
**

否定条件:NOT

否定一个或多个过滤条件,不能单独使用,只否定紧跟着的条件

语法:
WHERE NOT
条件
例子:

  1. SELECT * FROM milk_tea WHERE NOT prod_name IN ('奶茶','饼干','薯片');

结果:
image.png
**

数据处理-数据类型

数值型

整数、小数一般不填精度

INTEGER

定义:整型,只能存储整数
用法:INTEGER,INTEGER(10) 10表示只显示十位数字

DECIMAL

定义:定点型。储存固定位数的小数
用法:DECIMAL(4,2) —代表一共有4位,小数点后面有两位

  • 一般用于精确计算,比如金额
  • 多出位数四舍五入
  • 默认参数为DECIMAL(10,0)

    FLOAT/DOUBLE/REAL

    定义:浮点型。存储不固定位数的小数
    用法:FLOAT/DOUBLE/REAL、FLOAT(5,3)

  • 多出位数,五舍六入

    文本型

  • 区分大小写

  • 长度单位为字符个数
  • UTF-8中,一个中文字符占3个字节,一个数字或英文字符占1个字节
  • GBK中,一个中文字符占2个字节

    CHAR

    定义:定长字符串
    用法:CHAR(10) 若只写了四位字符,会自动补充成十位

    VARCHAR

    定义:可变长字符串
    用法:VARCHAR(100) 不会自动补位,不存在不足位

    日期型

    DATE

  • 会自动调整格式

定义:Y-M-D (年-月-日)
用法:DATE

TIME

定义:H:i:s (小时-分钟-秒)
用法:TIME

DATETIME

定义:Y-M-D H:i:s
用法:DATETIME

数据处理-函数使用

数值型

函数表达式 = 函数名 + (参数,一般是列名)

绝对值:ABS
平方根:SQRT
指数函数:EXP EXP(4)=e^4
四舍五入函数:ROUND ROUND(1.234,2)=1.23
圆周率函数:PI PI()=π

文本型

不同DBMS中会有不同,建议测试再使用
字符长度 CHAR_LENGTH CHAR_LENGTH(‘数据’)=2
字节数 LENGTH LENGTH(‘数据’)=6
去除右边空值 RTRIM RTRIM(’home ‘)=’home’
去除左边空值 LTRIM LTRIM(’ home’)=’home’
大写字母转换 UPPER UPPER(’home’)=’HOME’
小写字母转换 LOWER LOWER(’HOME’)=’home’

日期处理型

函数可嵌套,例如:YEAR(NOW());表示当前时间的年份
获取具体日期段 YEAR/M/D YEAR(‘2019-1-2’)=’2019’
获取具体时间段 HOUR/M/S HOUR(‘14:01:24’)=’14’
获取月份名称 MONTHNAME MONTHNAME(‘2019-1-2’)=’JAN’
获取当前日期时间 NOW NOW()=systime
获取当前日期 CURDATE CURDATE()=’20190501’
获取当前时间 CURTIME() CURTIME()=’15:10:39’
时间增加 DATE_ADD DATE_ADD(‘20190501’,INTERVAL 1 MONTH)
时间减少 DATE_SUB DATE_SUB(‘20190501’,INTERVAL 1 YEAR)

聚合函数

  • 输入列,输出一行
  • 不实际检索数据,而是汇总处理数据

    计数函数-COUNT

  • 唯一可以用*的聚合函数

语法:
COUNT()或者(1) 用于确定表中的行的数目,或者满足特定条件的行的数目
COUNT(列名) 只作用于非NULL行(不可以同时计数多列)
COUNT(DISTINCT 列名) 对行去重计数
*例子1:

  1. SELECT COUNT(*) FROM milk_tea AS m;

结果1:
显示有八行
image.png

例子2:

  1. SELECT COUNT(m.pro_date) FROM milk_tea AS m; --pro_date有一个null

结果2:
显示为7行,不计入null值
image.png

例子3:

  1. SELECT COUNT(DISTINCT m.sale_price) FROM milk_tea AS m;

结果3:
有5个不重复的数值
image.png

求和函数-SUM

  • 区别于直接四则运算(四则运算遇到null值会等于null,SUM则会忽视null)
  • 只对数值型起作用
  • 可以同时操作多个列
  • 可以作用于计算表达式

语法:
SUN(列名)
例子1:

  1. SELECT SUM(m.sale_price*0.9) FROM milk_tea AS m;

结果1:
image.png
例子2:

  1. SELECT SUM(m.sale_price - m.in_price) FROM milk_tea AS m; --若其中一个有空值,则会被忽略,
  2. 可以将m.sale_price改为IFNULL(m.sale_price)

结果2:
image.png

均值函数-AVG

  • 分母不对NULL计数
  • 可以同时操作多个列

语法:
AVG(列名)

最值函数-MAX/MIN

  • 适用于数值型,文本型,日期型
  • 要求该列可以排序
  • 忽略null
  • DISTINCT无意义

语法:
MAX(列名) / MIN(列名)

分组数据

聚合数据-GROUP BY

将数据分组,再在各组中聚合。一定和聚合函数同时出现

语法:
SELECT 聚合键(需要聚合的列名) 聚合函数 FROM 表名 (可在这加WHERE语句) GROUP BY 聚合键
例子1:

  1. SELECT net_w, SUM(net_w) FROM milk_tea GROUP BY net_w;

结果1:
image.png
例子2:

  1. SELECT net_w, SUM(net_w) FROM milk_tea WHERE net_w IN ('100g','150g') GROUP BY net_w;

结果2:
image.png

分组过滤-HAVING

对聚合结果再次筛选,得到所需分组
有时候使用HAVING和WHERE可以达到相同的效果,但是优先使用WHERE,会提高查找效率

语法:
使用在GROUP BY之后,HAVING 分组筛选语句
例子:

  1. SELECT net_w, SUM(net_w) FROM milk_tea GROUP BY net_w HAVING SUM(net_w) > 220;

结果:
image.png
**

执行顺序

image.png