数据库命令
count()空括号,代表查询表所有条数,即使为空,如果(*)值查询非空的总条数
avg()某个字段平均值
min()某个字段最小值
max()某个字段最大值
sum()某个字段数值总和
以上函数使用方法在select后面或配合以下聚合函数使用
group by 分组 使用在from和where条件后面,并且可以和having(过滤)配合使用,不可以单独使用
order by 排序 默认asc升序 desc降序 使用在where 后面
1.常用函数--聚合函数:
a:MAX,返回指定数据的最大值。
eg:查询借款逾期天数最多的用户
SELECT us.name 姓名,MAX(r.overdue) 逾期天数 from user_info us,repay r
WHERE us.user_id = r.user_id;
b:MIN,返回指定数据的最小值。
eg:查询借款逾期天数最少的用户
SELECT us.name 姓名,MIN(r.overdue) 逾期天数 from user_info us,repay r
WHERE us.user_id = r.user_id;
c:COUNT,返回指定组中项目的数量。
eg:select count(*) from user_info where current_quota >1500;
d:AVG,返回指定组中的平均值,空值被忽略。
eg:SELECT us.name 姓名,AVG(r.overdue) 逾期天数 from user_info us,repay r
WHERE us.user_id = r.user_id;
e:SUM,返回指定数据的和,只能用于数字列,空值被忽略。
eg:SELECT us.name 姓名,SUM(r.overdue) 逾期天数 from user_info us,repay r
WHERE us.user_id = r.user_id;
2.其他一些函数
a:截取字符串
LEFT/RIGHT函数返回field最左边/最右边的length个长度的字符串 SUBSTRING函数返回field从start开始共length个长度的字符串
eg:SELECT LEFT('miaoying.new@qq.com',3);
SELECT RIGHT('miaoying.new@qq.com',3);
SELECT substring('miaoying.new@qq.com',2,7);
b:日期函数–显示当前系统时间 格式:yyyy-MM-dd hh:mm:ss
eg:SELECT NOW();
c:显示当前日期 格式:yyyy-MM-dd
eg:SELECT CURDATE();
d:显示当前时间 格式:hh:mm:ss
eg:SELECT CURTIME();
e:WEEK(date,first) 返回date是一年的第几周(first默认值0,first取值1表示周一是周的开始,0从周日开始)
eg:select WEEK('2018-08-06');
select WEEK('2018-08-06',0);
select WEEK('2018-08-06',1);
f:DATE_FORMAT:根据format字符串格式化date值 (%Y:年,4位 %y:年,2位 %H:时, 24小时格式 %h:时, 12小时格式)
SELECT DATE_FORMAT(regist_time, '%Y/%m/%d/%h:%i') FROM `user` WHERE phone = 18632156680;
3.Case when的用法:
eg:select user_id ,CASE when current_quota >= 1100 then '高额' else '低额' end from user_info;
4.distinct用来去除重复数据
eg:select distinct user_id from loan_apply;
5.模糊查询:like
_代表匹配任意一个字符
%代表匹配任意0-n个字符
Like 与 rlike 的区别:
like是完全匹配。rlike和regexp是不完全匹配.like不是正则,而是通配符。这个通配符可以看一下SQL的标准,例如%代表任意多个字符。rlike是正则。
eg:SELECT * from user_info WHERE name like '王%志';
SELECT * from user_info WHERE name like '_志涛%';
SELECT * FROM user_info WHERE name rlike '[张王]志涛';
6.Where与having的区别(主要体现在查询速度上)
where是在查询前做条件限制,having是在查询后的结果集上做条件限制。
查询前做限制的话,返回的件数会少;而在查询后的结果集上做限制的话,之前的查询结果可能会很多,这样就会影响性能。
eg:select state,sum(amount) from loan_apply group by state having state = '10';
select state,sum(amount) from loan_apply WHERE state = '10' group by state;
7.limit 分页
这里M表示从(M+1)条记录开始,N表示返回的记录条数
eg:select * from user limit 4,5;
select * from user limit 10;
8.关系型运算符优先级高到低为:NOT>AND>OR
如果where 后面有OR条件的话,则OR自动会把左右的查询条件分开。
eg:SELECT * from `user` WHERE id =356879586 and info_state = 7 or info_state = 8; 等同于第二句(找出的是info_state为8 或者id为356879586并且info_state为7)
SELECT * from `user` WHERE (id =356879586 and info_state = 7 )or (info_state = 8;
SELECT * from `user` WHERE id =356879586 and (info_state = 7 or info_state = 8);(找出的是id为356879586的info_state为8或info_state为7)
9、联合查询分类
内连接(inner Join 或 Join):仅显示两个表中匹配行,即两表中都有才显示。
外连接(outer Join)
左外连接(left outer Join 或 left Join):以左表作为基准表,右表中无结果的字段为null。
右外连接(right outer Join 或 right Join):以右表作为基准表,左表中无结果的字段为null。
全外连接(full outer Join 或 full Join)::左表/右表,有一个有就显示。
交叉连接 (cross Join):A的每条记录都有和B中所有记录相对应的信息。
结果集链接 (union 和 union all):将多个select结果集进行合并。值得注意的是,UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。
eg:
select DISTINCT(u.id),la.amount from user u INNER JOIN loan_apply la on u.id = la.user_id;
select u.id,la.amount from user u LEFT JOIN loan_apply la on u.id = la.user_id;
select u.id,la.amount,la.user_id from user u RIGHT JOIN loan_apply la on u.id = la.user_id;
select * from `user` u1 UNION select * from `user` u2;
10、查询某一字段为空
is NULL 而不是 =NULL
eg:SELECT * from user_info WHERE idcard_address is NULL;等同于
SELECT * from user_info WHERE idcard_address ='';