语法:
select 查询列表 from 表 【where 筛选条件】 order by 排序列表 【asc|desc】
1. asc代表升序,默认为升序, desc为降序。
2. order by 字句中可以支持单个字段,多个字段,表达式,函数,别名
3. order by一般放在查询语句的最后面,limit字句除外
调用:
select 函数名(实参列表) [from 表];
分类
(一) 字符函数
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 |
select trim('a' from 'aabadbaa');----去掉'aabadbaa'中前后的a,得到badb
select lpad('cw',10,'*') as output;#输出为:********cw
select lpad('cwww',2,'*') as output;#输出为:cw
(二) 数学函数
select round(-5.76);#结果为:-6
select ceil(-5.76);#结果为:-5
select floor(-5.76);#结果为:-6
select truncate(-5.76,1); #结果为:-5.7
(三) 日期函数
select now();
select curdate();
select curtime();
select year(now()); #获取年份,相应的还有month,second,minute,hour
select monthname(now()); #获取月份,以英文的形式
select str_to_date('3-2 1998','%c-%d %Y') as my_date; #输出为:1998-03-02
date_format('1998-3-2','%c月/%d日 %Y年') as my_date; #输出结果为:3月/02日 1998年
(四)其他函数
(五)流程控制参数
select if(10>5,'yes','no'); #相当于c语言的三目运算符,输出为:yes
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
数据源 | 位置 | 关键字 | |
---|---|---|---|
分组前筛选 | 原始表 | group by 子句的前面 | where |
分组后筛选 | 分组后的结果集 | group by 子句的后面 | having |
又称多表查询,当查询的字段来自多个表时,就会用到连接查询
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复习day01:数据库简介和 DQL数据查询语言
MySQL复习day02:DQL数据查询语言续
MySQL复习day03:DQL数据查询语言完结
MySQL复习day04:DML数据操作语言和DDL数据定义语言
MySQL复习day05:TCL事务控制语言和视图
MySQL复习day06:变量,存储过程
MySQL复习day07:函数
MySQL复习day08:流程控制结构
MySQL复习day09:逻辑架构和引擎,索引详解(explain)
感谢诸君观看,如果感觉有用的话,点个赞吧!