?以下数据都出自该表
单表查询语句
# SELECT 字段/字面量/聚合函数(分组函数)...
# FROM 表名
# WHERE 筛选条件(不允许出现分组函数)
# GROUP BY (分组)字段1,字段2...
# HAVING 筛选条件(只能出现聚合函数和分组字段)
# ORDER BY 排序字段1 [ASC]升序/DESC降序,字段2 [ASC]升序/DESC降序,... [ASC]升序/DESC降序;
# 语句执行顺序:
# 1、from
# 2、where
# 3、group by
# 4、having
# 5、select
# 6、order by
distinct 去重:对字段中的相同数据去重为一条数据,也可对多字段去重。
用法:SELECT DISTINCT 字段1,字段2... FROM 表名;
注意:distinct关键字前面不允许加字段或字面量.
#ORDER BY:排序 ORDER BY 字段名1,字段名2... [ASC]/DESC;
# 1、位于查询语句的最后一句,为了不破坏排序结果要等所有语句操作执行完才能执行排序。
# 2、ASC是升序(默认不写),DESC是降序。
# 3、多字段排序的时候,是以第一的字段为主导,第二或第一以后的全部字段是起辅导作用。也就是,先后顺序的意思。
# 4、排序还可以字段位置但考虑到查询的健壮性不建议使用。如:ORDER BY 数字1,数字2... [ASC]/DESC;
此处补充一下:limit 接在order by后面作为跳转查询,使用方法如 limit [起始位置,长度]。起始位置从下标0开始,所以查询某段想要的数据行。
SELECT * FROM emp ORDER BY dept_id ASC,sal DESC;
SELECT * FROM emp ORDER BY 4 DESC,5;
#查询的是第3+1行开始往后数4条数据,也就是排序后第4、5、6、7行的数据。
SELECT * FROM emp ORDER BY sal DESC LIMIT 3,4;
#数据处理函数又称为单行处理函数。常见:lower、upper、length、trim、concat、substr、round、rand、str_to_date、date_format、format、case..when..then..when..then..else..end。
#聚合函数(分组函数)又称为多行处理函数。常见:min、max、avg、sum、count。一般搭配group by分组使用,若未分组则默认为一组。
#单行处理函数的特点:一个输入对应一个输出(一行数据处理)
#多行处理函数的特点:多个输入对应一个输出(一个字段(列)的数据进行处理)
#单行处理函数
# 注意:SELECT 可以查询字段也可以查询字面量
# 1、查询字段就是根据列显示,将字段中的数据按列显示
# 2、查询字面量则是根据表中有多少行就显示多少条字面量。字面量显示行数据,是查询的数据。
# 3、字面量是可以用单引号'数据',也可以不用单引号' '表示,但是不能是双引号" "。
# 4、查询时SELECT后面放入数字字面量是表示查询第几列,一般是覆盖所有显示行。
# SELECT 字段(属性列)/字面量 FROM 表名;
# lower() 转小写:SELECT lower(字段/字面量) FROM 表名;
SELECT LOWER('sdaNDFdfsMI') FROM emp;
# upper() 转大写:SELECT upper(字段/字面量) FROM 表名;
SELECT UPPER('sdasdhfjHKDF') FROM emp;
# length() 长度:SELECT length(字段/字面量) FROM 表名; 注意:一个中文字符占3个字节
SELECT LENGTH(name) FROM emp;
SELECT name FROM emp WHERE LENGTH(name)=6; #查询两个汉字的名字。
# trim() 去除前后空格: SELECT 字段 FROM 表名 WHERE 字段=trim(前后空格数据);
SELECT TRIM(' 孙悟空 ') FROM emp; #去除空格
SELECT ' 孙悟空 ' FROM emp; #未去除空格
SELECT name FROM emp WHERE name=TRIM(' 孙悟空 '); #判断去除空格的数据
# substr() 截取字符串:SELECT substr(字段/字面量,字符位置,截取长度) FROM 表名;
# 注意:在此处是从1位开始,没有下标0这个说法。所以字符位置根据十进制实际位数来。
SELECT SUBSTR(name,1,1) FROM emp; #截取第一个字符
#给首字母大写
SELECT CONCAT(UPPER(SUBSTR('asdffs',1,1)),SUBSTR('asdffs',2,LENGTH('asdffs')-1));
# concat() 字符拼接:SELECT count(字段/字面量,字段/字面量...) FROM 表名
SELECT CONCAT(name,'HHHH',sal) FROM emp;
# round() 四舍五入:SELECT round(字段/字面量,位置) FROM 表名
SELECT ROUND(233.523); #不设置位置参数,默认对整数操作
SELECT ROUND(233.523,0); #设置0位置忽略小数位置
SELECT ROUND(233.523,1); #设置保留1位小数并四舍五入
SELECT ROUND(233.523,5); #保留5位小数,不足位置补0
SELECT ROUND(233.523,-1); #-1是对个位进行四舍五入,个位补0
SELECT ROUND(233.523,-2); #-2对十位四舍五入,十位个位补0
SELECT ROUND(233.523,-5); #-5对万位四舍五入,这里进位是不足的,补0就是0
SELECT ROUND('233.52a3',4); #碰到不是数字的就不返回后面内容。
# rand() 随机数:SELECT rand([字面量/字段]) FROM 表名;
# 注意:RAND(字面量/字段)括号中添加了字面量或者字段的话,那么就是相当于本次随机数值赋值给该字面量或者字段了,下次运行还是这个结果
# 要是没指定字面量/字段的话那么是没有’容量‘来存储随机值,也就每次运行的随机值结果不一致了。
SELECT RAND(sal) FROM emp;
SELECT ROUND(RAND()*100,2) R; #生成一个0~100之间的随机数并保留两位小数。
# case.. when..then..when..then..else..end;
# 判断语句:case 字面量/字段 when 条件1 then 满条件1执行 when 条件2 then 满足条件2执行 .... else 都不满足条件,执行! end;
# 注意:只能有一个条件执行。
SELECT
CASE 'hello'
WHEN substr('hello',1,1)='h' THEN 'H'
WHEN substr('hello',1,1)<>'h' THEN 'h'
ELSE 'hello'
END;
# IFNULL 判断为空 SELECT IFNULL(字段/字面量,如果为空就赋值) FROM emp;
SELECT IFNULL(sal,0) FROM emp; #如果sal字段的某条数据为空就给null=0;
# 多行处理函数
# 分组函数(聚合函数)
# 1、分组函数没使用分组查询group by的话那么默认是在一个组当中
# 2、分组查询是执行group by分组之后的,而select的执行顺序from->where->group by->having->select是处在group by之后所以可以进行聚合操作。
# 3、分组函数不能出现在where子句当中,因为where执行顺序在group by之前
# 4、分组函数是默认不计算null的,也就是忽略null值。想要加入null的数据的话就进行ifnull赋值
# min 最小值
SELECT MIN(sal) FROM emp;
# max 最大值
SELECT MAX(sal) FROM emp;
# avg 平均值
# 注意:求平均值的时候要是字段中存在null值,那么会忽略不计入平均值数据。那么我们需要对它进行ifnull空判断赋值才能达到全字段平均值效果。
# SELECT AVG(IFNULL(sal,0)) FROM emp;
#在求平均值之前进行null=0操作,有了值的数据就会算入平均之中。
SELECT AVG(sal) FROM emp;
# sum 求和:
SELECT SUM(sal) FROM emp;
# count 统计:
# 注意:统计表的行数,*是代表全部的字段,因为没有哪一行的数据会全部同时存在null值。
# SELECT COUNT(*) FROM emp;
# 因为分组函数不对null数据进行计算,所以我们就把所有的数据进行统计从而得到表中行数
SELECT COUNT(sal) FROM emp;
# group by 分组查询
# 1、对数据进行分组查询操作,并且对聚合函数进行改变。执行在聚合函数之前。
# 2、group by对字段进行分组。可以进行多字段分组
# 3、多字段分组,以第一个字段为主,其后字段为辅
# 4、需搭配聚合函数使用c
# 注意:SELECT sal FROM emp GROUP BY dept_id;
# 报错! 未对分组进行数据整合,所以我们需要加上聚合函数
SELECT MAX(sal) FROM emp GROUP BY dept_id;
# having 筛选(分组函数/分组字段)
# 1、having筛选的数据可以是字段和聚合函数。但是出于性能考虑一般是用来筛选聚合函数;
# 2、having与where两者都是筛选但最大区别是可以对聚合函数进行操作,where则不行。这就跟他们的执行顺序有关了where执行在group by之前,having在之后
# 3、但是where也有能比having的优势那就是where执行的越前那么对筛序的数据就越早,以此给其他函数和语句减轻不必要的数据量。
# 4、如果having之前没有group by也可以对分组函数进行筛选,因为查询表中没有group by默认分为一组,如果有group by则执行顺序依旧在group by之后。
select sal,name from emp having sal=1250; #没有聚合函数也可以筛选,对应着默认分一组。
select min(sal) from emp having min(sal)>700; #对聚合函数筛选
# 例题:查询所有部门里有哪几种工作,并对该工作高于1000工资进行求平均,筛选出平均结果大于2000的数据并对平均结果降序排序
SELECT dept_id,AVG(sal) avg_sal,job
FROM emp
WHERE sal>1000
GROUP BY dept_id,job
HAVING AVG(sal)>2000
ORDER BY dept_id ASC,avg_sal DESC;
End...
DQL多表关系查询见:https://blog.csdn.net/qq_48475590/article/details/126934276?spm=1001.2014.3001.5502
|