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

数据查询语言续

      • 排序查询
      • 常见函数
      • 分组函数
      • 连接查询
      • 内连接
    • MySQL学习列表
    • 致谢

排序查询

语法:
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  ;

结果输出

output name
C_Onscience vconscience
I_Nstruct instruct
  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;

输出结果

预算 新预算
2000 2000
1000 1000
200 200
10 11.0
50 60.0
10 11.0
56 56

语法二:
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;

输出结果

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

分组函数

  • 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)

致谢

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



你可能感兴趣的:(数据库,数据库,mysql)