MySQL复习day02:DQL数据查询语言续

排序查询

语法:
select 查询列表 from 表 【where 筛选条件】 order by 排序列表 【asc|desc】

1. asc代表升序,默认为升序, desc为降序。
2. order by 字句中可以支持单个字段,多个字段,表达式,函数,别名
3. order by一般放在查询语句的最后面,limit字句除外

常见函数

调用:
select 函数名(实参列表) [from 表];
分类

  1. 单行函数,如 concat ,length ,ifnull等
  2. 分组函数(统计函数,组函数,聚合函数) --功能:做统计使用

(一) 字符函数

  1. length()----获得参数值的字节数
  2. concat() —拼接字符串
  3. upper()----将字符串变为大写 ; lower()—将字符串变为小写
  4. substr(str, pos)—(记住索引从1开始); substr(str, pos, len)—从pos处开始,截取len个长度的字符串
SELECT concat(upper(substr(name,1,1)),'_',upper(substr(name,2,1)),lower(substr(name,3)))  
as output ,name from family.zhutong  ;

结果输出

outputname
C_Onscienceconscience
I_Nstructinstruct
  1. instr(str, substr)–返回substr在str中第一次出现的索引,未找到返回0。
  2. trim()—去除前后的空格;select trim('a' from 'aabadbaa');----去掉'aabadbaa'中前后的a,得到badb
  3. lpad(str,len,substr) —指定substr字符在指定len长度的情况下进行左填充。
    rpad(str,len,substr) —指定substr字符在指定len长度的情况下进行右填充。
select lpad('cw',10,'*') as output;#输出为:********cw
select lpad('cwww',2,'*') as output;#输出为:cw

  1. replace(str,substr1,substr2)—将str中的substr1替换为substr2

(二) 数学函数

  1. round—四舍五入
    round(num, len)----num保留len位小数
select round(-5.76);#结果为:-6
  1. ceil—向上取整
select ceil(-5.76);#结果为:-5
  1. floor —向下取整
select floor(-5.76);#结果为:-6
  1. truncate—截断, 不进行四舍五入
select truncate(-5.76,1); #结果为:-5.7
  1. mod(num1, num2)—等价于:num1%num2 ,底层实现公式:num1- (num1/num2) * num2
  2. rand() —取0-1之间的随机数

(三) 日期函数

  1. now() —返回当前系统的日期+时间、
  2. curdate() —返回当前日期,不包含时间
  3. curtime() —返回当前时间,不包含日期
  4. datediff(日期字符串1,日期字符串2)----求两个日期相差多少天
 select now();
 select curdate();
 select curtime();
 select year(now()); #获取年份,相应的还有month,second,minute,hour
 select monthname(now()); #获取月份,以英文的形式
  1. str_to_date 通过指定的格式转为日期
select str_to_date('3-2 1998','%c-%d %Y') as my_date; #输出为:1998-03-02
  1. date_format----将日期转换为字符
date_format('1998-3-2','%c月/%d日 %Y年') as my_date;  #输出结果为:3/021998

(四)其他函数

  1. select version();
  2. select database(); #查看当前库
  3. select user() ;# 查看当前用户
  4. md5(str) —返回该字符的md5加密形式

(五)流程控制参数

  1. if函数 —三目运算的效果
select if(10>5,'yes','no'); #相当于c语言的三目运算符,输出为:yes
  1. case函数 —switch case的效果
    语法一:
    case 要判断的字段或表达式
    when 常量1 then 要显示的值1或语句1
    when 常量2 then 要显示的值2或语句2

    else 要显示的值n或语句n
    end;
select budget as 预算 , case (budget/10)
when 1 then round(budget*1.1)
when 5 then round(budget*1.2)
else budget
end as 新预算 from family.zhutong;

输出结果

预算新预算
20002000
10001000
200200
1011.0
5060.0
1011.0
5656

语法二:
case
when 条件1 then 要显示的值1或语句1
when 条件2 then 要显示的值1或语句2

else 条件2 then 要显示的值1或语句2
end;

select budget as 预算 , 
case 
when budget<20 then 'A'
when budget<300 then 'B'
else 'C'
end as 等级评定 from family.zhutong;

输出结果

预算等级评定
2000C
1000C
200B
10A
50B
10A
56B

分组函数

  • sum 求和, avg 平均值, max 最大值, min 最小值, count 计算个数
    notes
    1.max和min可以用来统计字符串和日期;
    2.count可以统计非空项的个数;
    3.sum和avg一般用来处理数值型
    4.这几个分组函数都忽略null值
    5.可以和distinct搭配使用:表示先去重再进行相关操作
    和分组函数一同的字段要求是group by后的字段
    count函数
    count(或常量)----统计个数,但是count()和count(1)的效率差不多,但是比count(字段)的效率高

  • 分组查询
    select 查询字段 from 表名
    [where 判断条件]
    [group by 表达式或函数]
    [order by 条件];

  • 分组后的筛选
    select 查询字段 from 表名
    [where 判断条件]
    [group by 表达式或函数]
    [having 判断条件]
    [order by 条件];

select count(*),variety 
from family.zhutong 
group by variety
having count(variety)>2 ;  #注意having位于group by 之后

notes

  1. 分组查询中的筛选条件分为两类
数据源位置关键字
分组前筛选原始表group by 子句的前面where
分组后筛选分组后的结果集group by 子句的后面having
  1. 分组函数作为条件肯定放在having子句中,能用分组前筛选的尽量使用分组前筛选。
  2. group by 支持多个字段分组,之间用逗号隔开。

连接查询

又称多表查询,当查询的字段来自多个表时,就会用到连接查询
select 字段1, 字段2 form 表1 , 表2
笛卡尔乘积现象:表一 有 m 行,表二有 n 行,结果=m*n 行
原因:没有有效的连接条件
连接分类
sql92标准:仅仅支持内连接
sql99标准:支持内连接,外连接(mysql支持左外和右外)和交叉连接

连接
内连接
等值连接
非等值连接
自连接
外连接
左外连接
右外连接
交叉连接
全外连接

(一)为表取别名
① 提高语句的简洁度
② 区分多个重名的字段
注意:如果为表取了别名,则查询的字段就不能使用原来的表名去限定。

内连接

内连接相当于表的交集。
(二)内连接的筛选
在where语句后增加 and 子句
select 查询列表
from 表1, 表2
where 表1.key = 表2.key
【and 筛选条件】
【group by 分组字段】
【order by 排序字段】

SELECT name,boyname ,bonus
FROM family.zhutong as e,family.boys as c
where e.match_id = c.id
and e.bonus is not null;

等值多表连接
① 多表的等值连接的结果的交集部分
② n表连接,至少需要n-1个连接条件
③ 多表连接的顺序没有要求

非等值连接
select 查询列表
from 表1 ,表2
where 非等值连接条件
【and 筛选条件】
【group by 分组字段】
【order by 排序字段】

SELECT z.budget as 预算,b.rank as 等级
FROM family.zhutong as z,family.boys as b
where z.budget between b.low and b.high #非等值
and b.rank='a';

自连接
select 查询列表
from 表 as 别名1 ,表 as 别名2
where 连接条件
【and 筛选条件】
【group by 分组字段】
【order by 排序字段】

select z.id,m.id,m.name #注意z表示假想的前一张表,m表示假想的后一张表
from family.zhutong as z, family.zhutong as m
where m.id = z.match_id
order by z.id;

MySQL学习列表

MySQL复习day01:数据库简介和 DQL数据查询语言
MySQL复习day02:DQL数据查询语言续
MySQL复习day03:DQL数据查询语言完结
MySQL复习day04:DML数据操作语言和DDL数据定义语言
MySQL复习day05:TCL事务控制语言和视图
MySQL复习day06:变量,存储过程
MySQL复习day07:函数
MySQL复习day08:流程控制结构
MySQL复习day09:逻辑架构和引擎,索引详解(explain)

致谢

感谢诸君观看,如果感觉有用的话,点个赞吧!🎉



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值