所使用的数据源

基础操作语句
SELECT FROM
语法:
SELECT 表中数据 FROM 数据表;
例子:
SELECT prod_name FROM milk_tea;
AS
取别名(基本上可以省略,但是为了可读性尽量不要省)
语法:
数据表名或列名 AS 别名
例子:
SELECT m.* FROM milk_tea AS m; --m.*表示显示表中全部数据
结果:
结果展示语句
CONCAT(拼接)
拼接不同列的内容
语法:
CONCAT(列名,列名,’a’)
例子:
SELECT m.*,CONCAT(prod_id, prod_name, '(', net_w, ')') AS 产品信息 FROM milk_tea AS m;
CONCAT_WS
使用关键字插在每个列之间,会自动跳过null
语法:
CONCAT_WS(‘关键字’,列名,字符)
例子:
SELECT CONCAT_WS('+',m.prod_id,m.pro_date,'kk') AS dj FROM milk_tea AS m;
DISTINCT(去重)
不展示重复的值,不修改数据,只展示
语法:
DISTINCT 列名
例子:
SELECT DISTINCT m.valid_month FROM milk_tea AS m;
排序语句
ORDER BY
注意不同的字符类型排序规则不同,是SELECT FROM语句的最后一部分
如汉字要按首字母顺序排序,则需要转换成gbk编码
语法:
ORDER BY 列名 DESC 列名 DESC(不加DESC代表升序,优先按第一个字段排序)
ORDER BY 位置(从SELECT中的第几列) DESC 位置 DESC (不大推荐,若表结构发生变化还得更改)
例子1:
SELECT m.* FROM milk_tea AS m ORDER BY CONVERT(prod_name USING gbk) ;
结果1:
例子2:**
SELECT m.prod_id, m.prod_name FROM milk_tea AS m ORDER BY m.valid_month DESC, m.sale_price;--排序可不展示
结果2:
例子3:
SELECT m.* FROM milk_tea AS m ORDER BY 5 DESC, 7;--5,7分别表示第五列和第七列,若SELECT只选择两列,则只有1,2可用
结果3:
数据过滤语句
WHERE
用来按某些条件来过滤数据,对null值的列直接忽略(使用IFNUL,见例子3)
语法:
WHERE 条件(主要是运算符和表达式,跟在SELECT FROM之后。sql中不等号是”<>”)
WHERE (条件1 AND 条件2) OR 条件3 (使用且或来限制条件,优先级:AND>OR)
例子1:
SELECT m.* FROM milk_tea AS m WHERE m.prod_id = '2';
结果1:
例子2:**
SELECT m.* FROM milk_tea AS m WHERE (m.sale_price - m.in_price) * 0.9 < 5;
结果2:
例子3:**
SELECT m.* FROM milk_tea AS m WHERE IFNULL(sale_price,0) <> 15;--IFNULL(sale_price,0)表示如果sale_price是NULL则将其赋值为0
WHERE扩展
数值过滤:BETWEEN..AND..
语法:
WHERE 列 BETWEEN [前端值] AND [后端值](两端均包含)
例子:
SELECT m.* FROM milk_tea AS m WHERE sale_price BETWEEN 5 and 15;
空值过滤:IS NULL、IS NOT NULL
语法:
WHERE 列 IS NULL
WHERE 列 IS NOT NULL
例子:
SELECT m.* FROM milk_tea AS m WHERE sale_price IS NULL;
模糊查询:LIKE
模糊查询适用于不知道具体字符的情况,有两种通配符可选择。
- 下划线’_’:代表单个任意字符,适用于知道字符数目和位置的情况。见例子1
- 百分号’%’:代表任意数目(包括0个),任何字符,适用于不知道字符数目,但知道字符位置的情况。见例子2
如果查询结果中包含%,可以适用反斜杠\%来表示。
若将通配符放在语句句首,因无法缩小查询范围,所以查询效率较差
语法:
WHERE 列 LIKE ‘…_…’
WHERE 列 LIKE ‘…%…’
例子1:
SELECT * FROM milk_tea WHERE prod_name LIKE '__面';
结果1:
例子2:**
SELECT * FROM milk_tea WHERE prod_name LIKE '%糖';
取值限制:IN
过滤明确而不连续的取值
语法:
WHERE 列 IN (值1,值2,….)
例子:
SELECT * FROM milk_tea WHERE prod_name IN ('奶茶','饼干','薯片');
否定条件:NOT
否定一个或多个过滤条件,不能单独使用,只否定紧跟着的条件
语法:
WHERE NOT 条件
例子:
SELECT * FROM milk_tea WHERE NOT prod_name IN ('奶茶','饼干','薯片');
数据处理-数据类型
数值型
INTEGER
定义:整型,只能存储整数
用法:INTEGER,INTEGER(10) 10表示只显示十位数字
DECIMAL
定义:定点型。储存固定位数的小数
用法:DECIMAL(4,2) —代表一共有4位,小数点后面有两位
- 一般用于精确计算,比如金额
- 多出位数四舍五入
-
FLOAT/DOUBLE/REAL
定义:浮点型。存储不固定位数的小数
用法:FLOAT/DOUBLE/REAL、FLOAT(5,3) -
文本型
区分大小写
- 长度单位为字符个数
- UTF-8中,一个中文字符占3个字节,一个数字或英文字符占1个字节
-
CHAR
定义:定长字符串
用法:CHAR(10) 若只写了四位字符,会自动补充成十位VARCHAR
定义:可变长字符串
用法:VARCHAR(100) 不会自动补位,不存在不足位日期型
DATE
会自动调整格式
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()或者(1) 用于确定表中的行的数目,或者满足特定条件的行的数目
COUNT(列名) 只作用于非NULL行(不可以同时计数多列)
COUNT(DISTINCT 列名) 对行去重计数
*例子1:
SELECT COUNT(*) FROM milk_tea AS m;
结果1:
显示有八行
例子2:
SELECT COUNT(m.pro_date) FROM milk_tea AS m; --pro_date有一个null值
结果2:
显示为7行,不计入null值
例子3:
SELECT COUNT(DISTINCT m.sale_price) FROM milk_tea AS m;
结果3:
有5个不重复的数值
求和函数-SUM
- 区别于直接四则运算(四则运算遇到null值会等于null,SUM则会忽视null)
- 只对数值型起作用
- 可以同时操作多个列
- 可以作用于计算表达式
语法:
SUN(列名)
例子1:
SELECT SUM(m.sale_price*0.9) FROM milk_tea AS m;
结果1:
例子2:
SELECT SUM(m.sale_price - m.in_price) FROM milk_tea AS m; --若其中一个有空值,则会被忽略,可以将m.sale_price改为IFNULL(m.sale_price)
均值函数-AVG
- 分母不对NULL计数
- 可以同时操作多个列
最值函数-MAX/MIN
- 适用于数值型,文本型,日期型
- 要求该列可以排序
- 忽略null
- DISTINCT无意义
语法:
MAX(列名) / MIN(列名)
分组数据
聚合数据-GROUP BY
将数据分组,再在各组中聚合。一定和聚合函数同时出现
语法:
SELECT 聚合键(需要聚合的列名) 聚合函数 FROM 表名 (可在这加WHERE语句) GROUP BY 聚合键
例子1:
SELECT net_w, SUM(net_w) FROM milk_tea GROUP BY net_w;
结果1:
例子2:
SELECT net_w, SUM(net_w) FROM milk_tea WHERE net_w IN ('100g','150g') GROUP BY net_w;
结果2:
分组过滤-HAVING
对聚合结果再次筛选,得到所需分组
有时候使用HAVING和WHERE可以达到相同的效果,但是优先使用WHERE,会提高查找效率
语法:
使用在GROUP BY之后,HAVING 分组筛选语句
例子:
SELECT net_w, SUM(net_w) FROM milk_tea GROUP BY net_w HAVING SUM(net_w) > 220;
执行顺序







